diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..9d85ee6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ["https://berrnd.de/say-thanks"] diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..3b2f793 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,17 @@ +--- +name: Bug Report +about: If you've found something that does not work, please report it to help improve + Traything +title: 'Bug: ' +labels: bug +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..ac2e8b4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..0f10636 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,16 @@ +--- +name: Feature Request +about: Ideas for improvements or new things which you would find useful are always + welcome +title: 'Feature Request: ' +labels: enhancement +assignees: '' + +--- + + diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..fede601 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,8 @@ +--- +name: Question +about: If you just have a question or need help +title: 'Question: ' +labels: question +assignees: '' + +--- diff --git a/.github/publication_assets/actions.mp4 b/.github/publication_assets/actions.mp4 new file mode 100644 index 0000000..08720d8 Binary files /dev/null and b/.github/publication_assets/actions.mp4 differ diff --git a/.github/publication_assets/edit-item.png b/.github/publication_assets/edit-item.png new file mode 100644 index 0000000..5f69b1f Binary files /dev/null and b/.github/publication_assets/edit-item.png differ diff --git a/.github/publication_assets/main-window.png b/.github/publication_assets/main-window.png new file mode 100644 index 0000000..84c2ceb Binary files /dev/null and b/.github/publication_assets/main-window.png differ diff --git a/.github/publication_assets/tray-menu.png b/.github/publication_assets/tray-menu.png new file mode 100644 index 0000000..a029683 Binary files /dev/null and b/.github/publication_assets/tray-menu.png differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7fd285e --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.vs +[Bb]in/ +[Oo]bj/ +*.csproj.user +/.deploy diff --git a/ActionItem.cs b/ActionItem.cs new file mode 100644 index 0000000..0c5505c --- /dev/null +++ b/ActionItem.cs @@ -0,0 +1,84 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace Traything +{ + public class ActionItem + { + [Category("Common"), Display(Order = 10)] + [Description("The name of the menu item")] + public string Name { get; set; } + + [Category("Common"), Display(Order = 20)] + [Description("The type of this action")] + public ActionType Type { get; set; } + + [Category("Common"), Display(Order = 30)] + [Description("Whether this action will be shown on all or only this computer")] + public ActionScope Scope { get; set; } + + [Category("Common"), Display(Order = 40)] + [Description("When Scope = ThisComputer, one or multiple hostnames of the corresponding machine (case-insensitiv)")] + public BindingList Hostnames { get; private set; } = new BindingList(); + + [Category("Common"), Display(Order = 50)] + [Description("Don't show an error message when the action fails")] + public bool IgnoreErrors { get; set; } = false; + + [Category("StartApplication"), Display(Order = 100)] + [Description("When Type = StartApplication, the commandline to be executed")] + public string Commandline { get; set; } + + [Category("HttpRequest"), Display(Order = 200)] + [Description("When Type = HttpGetRequest or HttpPostRequest, the URL used for the web request")] + public string Url { get; set; } + + [Category("HttpRequest"), Display(Order = 210)] + [Description("When Type = HttpPostRequest, the POST data to be sent")] + public string PostData { get; set; } + + [Category("HttpRequest"), Display(Order = 230)] + [Description("When Type = HttpGetRequest or HttpPostRequest, headers to be used")] + public BindingList Headers { get; private set; } = new BindingList(); + + [Category("TrayWindows"), Display(Order = 210)] + [Description("When Type = ShowTrayBrowser or ShowTrayMediaPlayer, a local path or URL to be opened")] + public string PathOrUrl { get; set; } + + [Category("TrayWindows"), Display(Order = 310)] + [Description("When Type = ShowTrayBrowser or ShowTrayMediaPlayer, the width of the window")] + public int Width { get; set; } = 800; + + [Category("TrayWindows"), Display(Order = 320)] + [Description("When Type = ShowTrayBrowser or ShowTrayMediaPlayer, the height of the window")] + public int Height { get; set; } = 500; + + [Category("TrayWindows"), Display(Order = 330)] + [Description("When Type = ShowTrayBrowser or ShowTrayMediaPlayer, whether to keep the window open when it loses focus")] + public bool StayOpen { get; set; } = false; + + public override string ToString() + { + return $"{this.Name} [{this.Type.ToString()}] [{this.Scope.ToString()}]"; + } + } + + public enum ActionType + { + StartApplication, + HttpGetRequest, + HttpPostRequest, + ShowTrayBrowser, + ShowTrayMediaPlayer, + + CloseTraything, + Separator, + Headline + } + + public enum ActionScope + { + Global, + ThisComputer + } +} diff --git a/FrmAbout.Designer.cs b/FrmAbout.Designer.cs new file mode 100644 index 0000000..73458d3 --- /dev/null +++ b/FrmAbout.Designer.cs @@ -0,0 +1,118 @@ +namespace Traything +{ + partial class FrmAbout + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.LabelHeadline = new System.Windows.Forms.Label(); + this.LabelFooter = new System.Windows.Forms.Label(); + this.LabelVersion = new System.Windows.Forms.Label(); + this.LabelSayThanksQuestions = new System.Windows.Forms.Label(); + this.LinkLabelSayThanks = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // LabelHeadline + // + this.LabelHeadline.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LabelHeadline.Location = new System.Drawing.Point(12, 9); + this.LabelHeadline.Name = "LabelHeadline"; + this.LabelHeadline.Size = new System.Drawing.Size(242, 43); + this.LabelHeadline.TabIndex = 0; + this.LabelHeadline.Text = "Traything"; + this.LabelHeadline.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LabelFooter + // + this.LabelFooter.ForeColor = System.Drawing.SystemColors.GrayText; + this.LabelFooter.Location = new System.Drawing.Point(13, 141); + this.LabelFooter.Name = "LabelFooter"; + this.LabelFooter.Size = new System.Drawing.Size(241, 45); + this.LabelFooter.TabIndex = 1; + this.LabelFooter.Text = "Traything is project by Bernd Bestel\r\nCreated with passion since 2022"; + this.LabelFooter.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LabelVersion + // + this.LabelVersion.Location = new System.Drawing.Point(13, 52); + this.LabelVersion.Name = "LabelVersion"; + this.LabelVersion.Size = new System.Drawing.Size(241, 23); + this.LabelVersion.TabIndex = 4; + this.LabelVersion.Text = "Version xxxx"; + this.LabelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LabelSayThanksQuestions + // + this.LabelSayThanksQuestions.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LabelSayThanksQuestions.Location = new System.Drawing.Point(13, 85); + this.LabelSayThanksQuestions.Name = "LabelSayThanksQuestions"; + this.LabelSayThanksQuestions.Size = new System.Drawing.Size(241, 23); + this.LabelSayThanksQuestions.TabIndex = 5; + this.LabelSayThanksQuestions.Text = " Do you find Traything useful?"; + this.LabelSayThanksQuestions.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // LinkLabelSayThanks + // + this.LinkLabelSayThanks.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LinkLabelSayThanks.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.LinkLabelSayThanks.Location = new System.Drawing.Point(13, 108); + this.LinkLabelSayThanks.Name = "LinkLabelSayThanks"; + this.LinkLabelSayThanks.Size = new System.Drawing.Size(241, 20); + this.LinkLabelSayThanks.TabIndex = 6; + this.LinkLabelSayThanks.TabStop = true; + this.LinkLabelSayThanks.Text = "Say thanks ❤"; + this.LinkLabelSayThanks.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.LinkLabelSayThanks.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelSayThanks_LinkClicked); + // + // FrmAbout + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(266, 195); + this.Controls.Add(this.LinkLabelSayThanks); + this.Controls.Add(this.LabelSayThanksQuestions); + this.Controls.Add(this.LabelVersion); + this.Controls.Add(this.LabelFooter); + this.Controls.Add(this.LabelHeadline); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "FrmAbout"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About Traything"; + this.Load += new System.EventHandler(this.FrmAbout_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label LabelHeadline; + private System.Windows.Forms.Label LabelFooter; + private System.Windows.Forms.Label LabelVersion; + private System.Windows.Forms.Label LabelSayThanksQuestions; + private System.Windows.Forms.LinkLabel LinkLabelSayThanks; + } +} \ No newline at end of file diff --git a/FrmAbout.cs b/FrmAbout.cs new file mode 100644 index 0000000..dd797c4 --- /dev/null +++ b/FrmAbout.cs @@ -0,0 +1,23 @@ +using System.Diagnostics; +using System.Windows.Forms; + +namespace Traything +{ + public partial class FrmAbout : Form + { + public FrmAbout() + { + InitializeComponent(); + } + + private void FrmAbout_Load(object sender, System.EventArgs e) + { + this.LabelVersion.Text = this.LabelVersion.Text.Replace("xxxx", Program.RunningVersion); + } + + private void LinkLabelSayThanks_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("https://berrnd.de/say-thanks?project=Traything&version=" + Program.RunningVersion); + } + } +} diff --git a/FrmAbout.resx b/FrmAbout.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/FrmAbout.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FrmBrowser.Designer.cs b/FrmBrowser.Designer.cs new file mode 100644 index 0000000..e8fd238 --- /dev/null +++ b/FrmBrowser.Designer.cs @@ -0,0 +1,53 @@ +namespace Traything +{ + partial class FrmBrowser + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // FrmBrowser + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(784, 461); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "FrmBrowser"; + this.ShowInTaskbar = false; + this.Text = "FrmBrowser"; + this.TopMost = true; + this.Activated += new System.EventHandler(this.FrmBrowser_Activated); + this.Deactivate += new System.EventHandler(this.FrmBrowser_Deactivate); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmBrowser_FormClosing); + this.Shown += new System.EventHandler(this.FrmBrowser_Shown); + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/FrmBrowser.cs b/FrmBrowser.cs new file mode 100644 index 0000000..0b2499e --- /dev/null +++ b/FrmBrowser.cs @@ -0,0 +1,139 @@ +using CefSharp; +using CefSharp.WinForms; +using System; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Windows.Forms; + +namespace Traything +{ + public partial class FrmBrowser : Form + { + public FrmBrowser() + { + InitializeComponent(); + } + + private ChromiumWebBrowser Browser; + private ActionItem ActionItem; + + private void SetupCef() + { + if (!Cef.IsInitialized) + { + Cef.EnableHighDPISupport(); + + CefSettings cefSettings = new CefSettings(); + cefSettings.BrowserSubprocessPath = Path.Combine(Program.BaseExecutingPath, @"CefSharp.BrowserSubprocess.exe"); + cefSettings.CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Traything"); + cefSettings.UserDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Traything"); + cefSettings.LogSeverity = LogSeverity.Disable; + cefSettings.CefCommandLineArgs.Add("--enable-media-stream", ""); + cefSettings.CefCommandLineArgs.Add("--lang", CultureInfo.CurrentCulture.TwoLetterISOLanguageName); + + Cef.Initialize(cefSettings, performDependencyCheck: false, browserProcessHandler: null); + } + + this.Browser = new ChromiumWebBrowser("about:blank"); + this.Browser.Dock = DockStyle.Fill; + this.Controls.Add(this.Browser); + } + + private void SetLocation() + { + if (this.ActionItem != null) + { + this.Width = this.ActionItem.Width; + this.Height = this.ActionItem.Height; + } + + int x = 0, y = 0; + if (TaskbarHelper.Position == TaskbarPosition.Left) + { + x = Screen.PrimaryScreen.Bounds.Left; + y = Screen.PrimaryScreen.Bounds.Bottom; + + x += TaskbarHelper.DisplayBounds.Width; + y -= this.Height; + } + else if (TaskbarHelper.Position == TaskbarPosition.Right) + { + x = Screen.PrimaryScreen.Bounds.Right; + y = Screen.PrimaryScreen.Bounds.Bottom; + + x += TaskbarHelper.DisplayBounds.Width; + y -= this.Height; + } + else if (TaskbarHelper.Position == TaskbarPosition.Top) + { + x = Screen.PrimaryScreen.Bounds.Right; + y = Screen.PrimaryScreen.Bounds.Top; + + x -= this.Width; + y -= this.Height + TaskbarHelper.DisplayBounds.Height; + } + else // Bottom (Windows default) + { + x = Screen.PrimaryScreen.Bounds.Right; + y = Screen.PrimaryScreen.Bounds.Bottom; + + x -= this.Width; + y -= this.Height + TaskbarHelper.DisplayBounds.Height; + } + + this.Location = new Point(x, y); + } + + private void FrmBrowser_Activated(object sender, EventArgs e) + { + this.SetLocation(); + } + + private void FrmBrowser_Shown(object sender, EventArgs e) + { + this.Hide(); + this.SetupCef(); + } + + public void ShowTrayBrowser(ActionItem item) + { + this.ActionItem = item; + this.Text = item.Name; + + if (item.StayOpen) + { + this.FormBorderStyle = FormBorderStyle.FixedToolWindow; + } + else + { + this.FormBorderStyle = FormBorderStyle.None; + } + + this.Browser.Load(item.PathOrUrl); + this.Show(); + this.Activate(); + } + + private void FrmBrowser_FormClosing(object sender, FormClosingEventArgs e) + { + e.Cancel = true; + this.Hide(); + this.Browser.Load("about:blank"); + } + + private void FrmBrowser_Deactivate(object sender, EventArgs e) + { + if (this.ActionItem != null && !this.ActionItem.StayOpen) + { + this.Close(); + } + } + + public void ReallyClose() + { + this.FormClosing -= this.FrmBrowser_FormClosing; + this.Close(); + } + } +} diff --git a/FrmBrowser.resx b/FrmBrowser.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/FrmBrowser.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FrmEditActionItem.Designer.cs b/FrmEditActionItem.Designer.cs new file mode 100644 index 0000000..4108f29 --- /dev/null +++ b/FrmEditActionItem.Designer.cs @@ -0,0 +1,94 @@ +namespace Traything +{ + partial class FrmEditActionItem + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.PropertyGridActionItem = new System.Windows.Forms.PropertyGrid(); + this.ButtonCancel = new System.Windows.Forms.Button(); + this.ButtonOk = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // PropertyGridActionItem + // + this.PropertyGridActionItem.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.PropertyGridActionItem.Location = new System.Drawing.Point(12, 12); + this.PropertyGridActionItem.Name = "PropertyGridActionItem"; + this.PropertyGridActionItem.PropertySort = System.Windows.Forms.PropertySort.Categorized; + this.PropertyGridActionItem.Size = new System.Drawing.Size(814, 411); + this.PropertyGridActionItem.TabIndex = 0; + // + // ButtonCancel + // + this.ButtonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.ButtonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.ButtonCancel.Location = new System.Drawing.Point(670, 429); + this.ButtonCancel.Name = "ButtonCancel"; + this.ButtonCancel.Size = new System.Drawing.Size(75, 23); + this.ButtonCancel.TabIndex = 0; + this.ButtonCancel.Text = "Cancel"; + this.ButtonCancel.UseVisualStyleBackColor = true; + // + // ButtonOk + // + this.ButtonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.ButtonOk.DialogResult = System.Windows.Forms.DialogResult.OK; + this.ButtonOk.Location = new System.Drawing.Point(751, 429); + this.ButtonOk.Name = "ButtonOk"; + this.ButtonOk.Size = new System.Drawing.Size(75, 23); + this.ButtonOk.TabIndex = 0; + this.ButtonOk.Text = "OK"; + this.ButtonOk.UseVisualStyleBackColor = true; + // + // FrmEditActionItem + // + this.AcceptButton = this.ButtonOk; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.ButtonCancel; + this.ClientSize = new System.Drawing.Size(838, 464); + this.Controls.Add(this.ButtonOk); + this.Controls.Add(this.ButtonCancel); + this.Controls.Add(this.PropertyGridActionItem); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow; + this.Name = "FrmEditActionItem"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Edit item"; + this.Load += new System.EventHandler(this.FrmEditActionItem_Load); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PropertyGrid PropertyGridActionItem; + private System.Windows.Forms.Button ButtonCancel; + private System.Windows.Forms.Button ButtonOk; + } +} \ No newline at end of file diff --git a/FrmEditActionItem.cs b/FrmEditActionItem.cs new file mode 100644 index 0000000..6845e7a --- /dev/null +++ b/FrmEditActionItem.cs @@ -0,0 +1,22 @@ +using System; +using System.Windows.Forms; + +namespace Traything +{ + public partial class FrmEditActionItem : Form + { + public FrmEditActionItem(ActionItem item) + { + InitializeComponent(); + + this.EditItem = item; + } + + public ActionItem EditItem { get; private set; } + + private void FrmEditActionItem_Load(object sender, EventArgs e) + { + this.PropertyGridActionItem.SelectedObject = this.EditItem; + } + } +} diff --git a/FrmEditActionItem.resx b/FrmEditActionItem.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/FrmEditActionItem.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/FrmMain.Designer.cs b/FrmMain.Designer.cs new file mode 100644 index 0000000..85dda77 --- /dev/null +++ b/FrmMain.Designer.cs @@ -0,0 +1,176 @@ +namespace Traything +{ + partial class FrmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); + this.NotifyIconTray = new System.Windows.Forms.NotifyIcon(this.components); + this.ContextMenuStripTray = new System.Windows.Forms.ContextMenuStrip(this.components); + this.ButtonAdd = new System.Windows.Forms.Button(); + this.ButtonEdit = new System.Windows.Forms.Button(); + this.ButtonRemove = new System.Windows.Forms.Button(); + this.ButtonMoveDown = new System.Windows.Forms.Button(); + this.ButtonMoveUp = new System.Windows.Forms.Button(); + this.ListBoxActions = new System.Windows.Forms.ListBox(); + this.LinkLabelAbout = new System.Windows.Forms.LinkLabel(); + this.SuspendLayout(); + // + // NotifyIconTray + // + this.NotifyIconTray.ContextMenuStrip = this.ContextMenuStripTray; + this.NotifyIconTray.Icon = ((System.Drawing.Icon)(resources.GetObject("NotifyIconTray.Icon"))); + this.NotifyIconTray.Text = "Traything"; + this.NotifyIconTray.Visible = true; + this.NotifyIconTray.MouseClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIconTray_MouseClick); + // + // ContextMenuStripTray + // + this.ContextMenuStripTray.Name = "contextMenuStrip1"; + this.ContextMenuStripTray.ShowImageMargin = false; + this.ContextMenuStripTray.ShowItemToolTips = false; + this.ContextMenuStripTray.Size = new System.Drawing.Size(36, 4); + // + // ButtonAdd + // + this.ButtonAdd.Location = new System.Drawing.Point(12, 12); + this.ButtonAdd.Name = "ButtonAdd"; + this.ButtonAdd.Size = new System.Drawing.Size(75, 23); + this.ButtonAdd.TabIndex = 2; + this.ButtonAdd.Text = "Add"; + this.ButtonAdd.UseVisualStyleBackColor = true; + this.ButtonAdd.Click += new System.EventHandler(this.ButtonAdd_Click); + // + // ButtonEdit + // + this.ButtonEdit.Enabled = false; + this.ButtonEdit.Location = new System.Drawing.Point(93, 12); + this.ButtonEdit.Name = "ButtonEdit"; + this.ButtonEdit.Size = new System.Drawing.Size(75, 23); + this.ButtonEdit.TabIndex = 2; + this.ButtonEdit.Text = "Edit"; + this.ButtonEdit.UseVisualStyleBackColor = true; + this.ButtonEdit.Click += new System.EventHandler(this.ButtonEdit_Click); + // + // ButtonRemove + // + this.ButtonRemove.Enabled = false; + this.ButtonRemove.Location = new System.Drawing.Point(174, 12); + this.ButtonRemove.Name = "ButtonRemove"; + this.ButtonRemove.Size = new System.Drawing.Size(75, 23); + this.ButtonRemove.TabIndex = 2; + this.ButtonRemove.Text = "Remove"; + this.ButtonRemove.UseVisualStyleBackColor = true; + this.ButtonRemove.Click += new System.EventHandler(this.ButtonRemove_Click); + // + // ButtonMoveDown + // + this.ButtonMoveDown.Enabled = false; + this.ButtonMoveDown.Location = new System.Drawing.Point(336, 12); + this.ButtonMoveDown.Name = "ButtonMoveDown"; + this.ButtonMoveDown.Size = new System.Drawing.Size(75, 23); + this.ButtonMoveDown.TabIndex = 2; + this.ButtonMoveDown.Text = "Move Down"; + this.ButtonMoveDown.UseVisualStyleBackColor = true; + this.ButtonMoveDown.Click += new System.EventHandler(this.ButtonMoveDown_Click); + // + // ButtonMoveUp + // + this.ButtonMoveUp.Enabled = false; + this.ButtonMoveUp.Location = new System.Drawing.Point(255, 12); + this.ButtonMoveUp.Name = "ButtonMoveUp"; + this.ButtonMoveUp.Size = new System.Drawing.Size(75, 23); + this.ButtonMoveUp.TabIndex = 2; + this.ButtonMoveUp.Text = "Move Up"; + this.ButtonMoveUp.UseVisualStyleBackColor = true; + this.ButtonMoveUp.Click += new System.EventHandler(this.ButtonMoveUp_Click); + // + // ListBoxActions + // + this.ListBoxActions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ListBoxActions.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ListBoxActions.FormattingEnabled = true; + this.ListBoxActions.ItemHeight = 24; + this.ListBoxActions.Location = new System.Drawing.Point(12, 41); + this.ListBoxActions.Name = "ListBoxActions"; + this.ListBoxActions.Size = new System.Drawing.Size(814, 508); + this.ListBoxActions.TabIndex = 3; + this.ListBoxActions.SelectedIndexChanged += new System.EventHandler(this.ListBoxActions_SelectedIndexChanged); + this.ListBoxActions.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ListBoxActions_MouseDoubleClick); + // + // LinkLabelAbout + // + this.LinkLabelAbout.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.LinkLabelAbout.AutoSize = true; + this.LinkLabelAbout.Location = new System.Drawing.Point(791, 17); + this.LinkLabelAbout.Name = "LinkLabelAbout"; + this.LinkLabelAbout.Size = new System.Drawing.Size(35, 13); + this.LinkLabelAbout.TabIndex = 4; + this.LinkLabelAbout.TabStop = true; + this.LinkLabelAbout.Text = "About"; + this.LinkLabelAbout.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.LinkLabelAbout_LinkClicked); + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(838, 583); + this.Controls.Add(this.LinkLabelAbout); + this.Controls.Add(this.ListBoxActions); + this.Controls.Add(this.ButtonMoveDown); + this.Controls.Add(this.ButtonMoveUp); + this.Controls.Add(this.ButtonRemove); + this.Controls.Add(this.ButtonEdit); + this.Controls.Add(this.ButtonAdd); + this.Name = "FrmMain"; + this.ShowIcon = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Traything"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing); + this.Shown += new System.EventHandler(this.FrmMain_Shown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.NotifyIcon NotifyIconTray; + private System.Windows.Forms.ContextMenuStrip ContextMenuStripTray; + private System.Windows.Forms.Button ButtonAdd; + private System.Windows.Forms.Button ButtonEdit; + private System.Windows.Forms.Button ButtonRemove; + private System.Windows.Forms.Button ButtonMoveDown; + private System.Windows.Forms.Button ButtonMoveUp; + private System.Windows.Forms.ListBox ListBoxActions; + private System.Windows.Forms.LinkLabel LinkLabelAbout; + } +} + diff --git a/FrmMain.cs b/FrmMain.cs new file mode 100644 index 0000000..1476c83 --- /dev/null +++ b/FrmMain.cs @@ -0,0 +1,252 @@ +using System; +using System.Diagnostics; +using System.Linq; +using System.Net; +using System.Windows.Forms; + +namespace Traything +{ + public partial class FrmMain : Form + { + public FrmMain() + { + InitializeComponent(); + } + + private Settings Settings; + private FrmBrowser Browser; + private FrmVlcPlayer VlcPlayer; + + private void FrmMain_Shown(object sender, EventArgs e) + { + this.Hide(); + this.Reload(); + } + + private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) + { + e.Cancel = true; + this.Hide(); + } + + private void NotifyIconTray_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + this.Show(); + this.Activate(); + } + } + + private void ButtonEdit_Click(object sender, EventArgs e) + { + int selectedIndex = this.ListBoxActions.SelectedIndex; + + if (new FrmEditActionItem((ActionItem)this.ListBoxActions.SelectedItem).ShowDialog(this) == DialogResult.Cancel) + { + this.Reload(); + } + else + { + this.Settings.Save(); + } + + this.Reload(); + this.ListBoxActions.SelectedIndex = selectedIndex; + } + + private void Reload() + { + this.Settings = Settings.Load(); + + this.ListBoxActions.Items.Clear(); + this.ContextMenuStripTray.Items.Clear(); + foreach (ActionItem item in this.Settings.Actions) + { + this.ListBoxActions.Items.Add(item); + + if (item.Scope == ActionScope.Global || (item.Scope == ActionScope.ThisComputer && item.Hostnames.Any(x => x.Equals(Environment.MachineName, StringComparison.OrdinalIgnoreCase)))) + { + if (item.Type == ActionType.Separator) + { + this.ContextMenuStripTray.Items.Add(new ToolStripSeparator()); + } + else if (item.Type == ActionType.Headline) + { + this.ContextMenuStripTray.Items.Add(new ToolStripMenuItem() { Text = item.Name, Enabled = false } ); + } + else + { + ToolStripMenuItem menuItem = new ToolStripMenuItem(); + menuItem.Text = item.Name; + menuItem.Tag = item; + menuItem.Click += this.TrayMenuItem_Click; + this.ContextMenuStripTray.Items.Add(menuItem); + } + } + } + + if (this.Settings.Actions.Any(x => x.Type == ActionType.ShowTrayBrowser)) + { + // Preheat CefSharp + if (this.Browser == null) + { + this.Browser = new FrmBrowser(); + this.Browser.Show(); + } + } + else + { + // Shutdown CefSharp + if (this.Browser != null) + { + this.Browser.ReallyClose(); + this.Browser = null; + } + } + + if (this.Settings.Actions.Any(x => x.Type == ActionType.ShowTrayMediaPlayer)) + { + // Preheat VLC + if (this.VlcPlayer == null) + { + this.VlcPlayer = new FrmVlcPlayer(); + this.VlcPlayer.Show(); + } + } + else + { + // Shutdown VLC + if (this.VlcPlayer != null) + { + this.VlcPlayer.ReallyClose(); + this.VlcPlayer = null; + } + } + } + + private void TrayMenuItem_Click(object sender, EventArgs e) + { + ActionItem item = (ActionItem)((ToolStripMenuItem)sender).Tag; + + try + { + if (item.Type == ActionType.CloseTraything) + { + this.FormClosing -= this.FrmMain_FormClosing; + this.Close(); + } + else if (item.Type == ActionType.StartApplication) + { + ProcessStartInfo si = new ProcessStartInfo("cmd", " /c start \"\" " + item.Commandline); + si.CreateNoWindow = true; + si.UseShellExecute = true; + Process.Start(si); + } + else if (item.Type == ActionType.HttpGetRequest) + { + WebClient wc = new WebClient(); + foreach (string header in item.Headers) + { + wc.Headers.Add(header); + } + wc.DownloadString(item.Url); + } + else if (item.Type == ActionType.HttpPostRequest) + { + WebClient wc = new WebClient(); + foreach (string header in item.Headers) + { + wc.Headers.Add(header); + } + wc.UploadString(item.Url, item.PostData); + } + else if (item.Type == ActionType.ShowTrayBrowser) + { + this.Browser.ShowTrayBrowser(item); + } + else if (item.Type == ActionType.ShowTrayMediaPlayer) + { + this.VlcPlayer.ShowTrayPlayer(item); + } + } + catch (Exception ex) + { + if (!item.IgnoreErrors) + { + MessageBox.Show(ex.Message, "Error while executing action", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void LinkLabelAbout_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + new FrmAbout().ShowDialog(this); + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + FrmEditActionItem dlg = new FrmEditActionItem(new ActionItem()); + if (dlg.ShowDialog(this) == DialogResult.OK) + { + this.Settings.Actions.Add(dlg.EditItem); + this.Settings.Save(); + this.Reload(); + this.ListBoxActions.SelectedIndex = this.ListBoxActions.Items.Count - 1; + } + } + + private void ButtonRemove_Click(object sender, EventArgs e) + { + if (MessageBox.Show("Are you sure to remove \"" + this.ListBoxActions.SelectedItem.ToString() + "\"?", "Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + this.Settings.Actions.Remove((ActionItem)this.ListBoxActions.SelectedItem); + this.Settings.Save(); + this.Reload(); + + this.ButtonEdit.Enabled = false; + this.ButtonRemove.Enabled = false; + this.ButtonMoveUp.Enabled = false; + this.ButtonMoveDown.Enabled = false; + } + } + + private void ButtonMoveUp_Click(object sender, EventArgs e) + { + int newIndex = this.ListBoxActions.SelectedIndex - 1; + + this.Settings.Actions.RemoveAt(this.ListBoxActions.SelectedIndex); + this.Settings.Actions.Insert(newIndex, (ActionItem)this.ListBoxActions.SelectedItem); + this.Settings.Save(); + this.Reload(); + this.ListBoxActions.SelectedIndex = newIndex; + } + + private void ButtonMoveDown_Click(object sender, EventArgs e) + { + int newIndex = this.ListBoxActions.SelectedIndex + 1; + + this.Settings.Actions.RemoveAt(this.ListBoxActions.SelectedIndex); + this.Settings.Actions.Insert(newIndex, (ActionItem)this.ListBoxActions.SelectedItem); + this.Settings.Save(); + this.Reload(); + this.ListBoxActions.SelectedIndex = newIndex; + } + + private void ListBoxActions_SelectedIndexChanged(object sender, EventArgs e) + { + this.ButtonEdit.Enabled = true; + this.ButtonRemove.Enabled = true; + this.ButtonMoveUp.Enabled = this.ListBoxActions.SelectedIndex != 0; + this.ButtonMoveDown.Enabled = this.ListBoxActions.SelectedIndex != this.ListBoxActions.Items.Count - 1; + } + + private void ListBoxActions_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (this.ListBoxActions.SelectedItem != null) + { + this.ButtonEdit.PerformClick(); + } + } + } +} diff --git a/FrmMain.resx b/FrmMain.resx new file mode 100644 index 0000000..b09db4e --- /dev/null +++ b/FrmMain.resx @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 130, 17 + + + + + AAABAAEAQEAAAAEAIAAoQAAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAATJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAEyZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZTP9MmUz/TJlM/0yZ + TP9MmUz/ + + + \ No newline at end of file diff --git a/FrmVlcPlayer.Designer.cs b/FrmVlcPlayer.Designer.cs new file mode 100644 index 0000000..cb04558 --- /dev/null +++ b/FrmVlcPlayer.Designer.cs @@ -0,0 +1,125 @@ +namespace Traything +{ + partial class FrmVlcPlayer + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.TableLayoutPanelMain = new System.Windows.Forms.TableLayoutPanel(); + this.FlowLayoutPanelPlayerControls = new System.Windows.Forms.FlowLayoutPanel(); + this.ButtonPlay = new System.Windows.Forms.Button(); + this.ButtonPause = new System.Windows.Forms.Button(); + this.ButtonStop = new System.Windows.Forms.Button(); + this.TableLayoutPanelMain.SuspendLayout(); + this.FlowLayoutPanelPlayerControls.SuspendLayout(); + this.SuspendLayout(); + // + // TableLayoutPanelMain + // + this.TableLayoutPanelMain.ColumnCount = 1; + this.TableLayoutPanelMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.TableLayoutPanelMain.Controls.Add(this.FlowLayoutPanelPlayerControls, 0, 1); + this.TableLayoutPanelMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.TableLayoutPanelMain.Location = new System.Drawing.Point(0, 0); + this.TableLayoutPanelMain.Name = "TableLayoutPanelMain"; + this.TableLayoutPanelMain.RowCount = 2; + this.TableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.TableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 36F)); + this.TableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.TableLayoutPanelMain.Size = new System.Drawing.Size(784, 461); + this.TableLayoutPanelMain.TabIndex = 0; + // + // FlowLayoutPanelPlayerControls + // + this.FlowLayoutPanelPlayerControls.Controls.Add(this.ButtonPlay); + this.FlowLayoutPanelPlayerControls.Controls.Add(this.ButtonPause); + this.FlowLayoutPanelPlayerControls.Controls.Add(this.ButtonStop); + this.FlowLayoutPanelPlayerControls.Dock = System.Windows.Forms.DockStyle.Fill; + this.FlowLayoutPanelPlayerControls.Location = new System.Drawing.Point(3, 428); + this.FlowLayoutPanelPlayerControls.Name = "FlowLayoutPanelPlayerControls"; + this.FlowLayoutPanelPlayerControls.Size = new System.Drawing.Size(778, 30); + this.FlowLayoutPanelPlayerControls.TabIndex = 0; + // + // ButtonPlay + // + this.ButtonPlay.Location = new System.Drawing.Point(3, 3); + this.ButtonPlay.Name = "ButtonPlay"; + this.ButtonPlay.Size = new System.Drawing.Size(75, 23); + this.ButtonPlay.TabIndex = 0; + this.ButtonPlay.Text = "Play"; + this.ButtonPlay.UseVisualStyleBackColor = true; + this.ButtonPlay.Click += new System.EventHandler(this.ButtonPlay_Click); + // + // ButtonPause + // + this.ButtonPause.Location = new System.Drawing.Point(84, 3); + this.ButtonPause.Name = "ButtonPause"; + this.ButtonPause.Size = new System.Drawing.Size(75, 23); + this.ButtonPause.TabIndex = 1; + this.ButtonPause.Text = "Pause"; + this.ButtonPause.UseVisualStyleBackColor = true; + this.ButtonPause.Click += new System.EventHandler(this.ButtonPause_Click); + // + // ButtonStop + // + this.ButtonStop.Location = new System.Drawing.Point(165, 3); + this.ButtonStop.Name = "ButtonStop"; + this.ButtonStop.Size = new System.Drawing.Size(75, 23); + this.ButtonStop.TabIndex = 2; + this.ButtonStop.Text = "Stop"; + this.ButtonStop.UseVisualStyleBackColor = true; + this.ButtonStop.Click += new System.EventHandler(this.ButtonStop_Click); + // + // FrmVlcPlayer + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(784, 461); + this.Controls.Add(this.TableLayoutPanelMain); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "FrmVlcPlayer"; + this.ShowInTaskbar = false; + this.Text = "FrmVlcPlayer"; + this.TopMost = true; + this.Activated += new System.EventHandler(this.FrmVlcPlayer_Activated); + this.Deactivate += new System.EventHandler(this.FrmVlcPlayer_Deactivate); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmVlcPlayer_FormClosing); + this.Shown += new System.EventHandler(this.FrmVlcPlayer_Shown); + this.TableLayoutPanelMain.ResumeLayout(false); + this.FlowLayoutPanelPlayerControls.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel TableLayoutPanelMain; + private System.Windows.Forms.FlowLayoutPanel FlowLayoutPanelPlayerControls; + private System.Windows.Forms.Button ButtonPlay; + private System.Windows.Forms.Button ButtonPause; + private System.Windows.Forms.Button ButtonStop; + } +} \ No newline at end of file diff --git a/FrmVlcPlayer.cs b/FrmVlcPlayer.cs new file mode 100644 index 0000000..e71c1da --- /dev/null +++ b/FrmVlcPlayer.cs @@ -0,0 +1,142 @@ +using LibVLCSharp.Shared; +using LibVLCSharp.WinForms; +using System; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +namespace Traything +{ + public partial class FrmVlcPlayer : Form + { + public FrmVlcPlayer() + { + InitializeComponent(); + } + + private LibVLC VlcLib; + private VideoView VlcVideoView; + private ActionItem ActionItem; + + private void SetupVlc() + { + Core.Initialize(Path.Combine(Program.BaseExecutingPath, "libvlc\\win-x64")); + this.VlcLib = new LibVLC(); + this.VlcVideoView = new VideoView(); + this.VlcVideoView.MediaPlayer = new MediaPlayer(this.VlcLib); + + this.VlcVideoView.Dock = DockStyle.Fill; + this.TableLayoutPanelMain.Controls.Add(this.VlcVideoView, 0, 0); + } + private void SetLocation() + { + if (this.ActionItem != null) + { + this.Width = this.ActionItem.Width; + this.Height = this.ActionItem.Height; + } + + int x = 0, y = 0; + if (TaskbarHelper.Position == TaskbarPosition.Left) + { + x = Screen.PrimaryScreen.Bounds.Left; + y = Screen.PrimaryScreen.Bounds.Bottom; + + x += TaskbarHelper.DisplayBounds.Width; + y -= this.Height; + } + else if (TaskbarHelper.Position == TaskbarPosition.Right) + { + x = Screen.PrimaryScreen.Bounds.Right; + y = Screen.PrimaryScreen.Bounds.Bottom; + + x += TaskbarHelper.DisplayBounds.Width; + y -= this.Height; + } + else if (TaskbarHelper.Position == TaskbarPosition.Top) + { + x = Screen.PrimaryScreen.Bounds.Right; + y = Screen.PrimaryScreen.Bounds.Top; + + x -= this.Width; + y -= this.Height + TaskbarHelper.DisplayBounds.Height; + } + else // Bottom (Windows default) + { + x = Screen.PrimaryScreen.Bounds.Right; + y = Screen.PrimaryScreen.Bounds.Bottom; + + x -= this.Width; + y -= this.Height + TaskbarHelper.DisplayBounds.Height; + } + + this.Location = new Point(x, y); + } + + private void FrmVlcPlayer_Activated(object sender, EventArgs e) + { + this.SetLocation(); + } + + private void FrmVlcPlayer_Shown(object sender, EventArgs e) + { + this.Hide(); + this.SetupVlc(); + } + + public void ShowTrayPlayer(ActionItem item) + { + this.ActionItem = item; + this.Text = item.Name; + + if (item.StayOpen) + { + this.FormBorderStyle = FormBorderStyle.FixedToolWindow; + } + else + { + this.FormBorderStyle = FormBorderStyle.None; + } + + this.VlcVideoView.MediaPlayer.Play(new Media(this.VlcLib, new Uri(item.PathOrUrl))); + this.Show(); + this.Activate(); + } + + private void FrmVlcPlayer_FormClosing(object sender, FormClosingEventArgs e) + { + e.Cancel = true; + this.Hide(); + this.VlcVideoView.MediaPlayer.Stop(); + } + + private void FrmVlcPlayer_Deactivate(object sender, EventArgs e) + { + if (this.ActionItem != null && !this.ActionItem.StayOpen) + { + this.Close(); + } + } + + public void ReallyClose() + { + this.FormClosing -= this.FrmVlcPlayer_FormClosing; + this.Close(); + } + + private void ButtonPlay_Click(object sender, EventArgs e) + { + this.VlcVideoView.MediaPlayer.Play(); + } + + private void ButtonPause_Click(object sender, EventArgs e) + { + this.VlcVideoView.MediaPlayer.Pause(); + } + + private void ButtonStop_Click(object sender, EventArgs e) + { + this.VlcVideoView.MediaPlayer.Stop(); + } + } +} diff --git a/FrmVlcPlayer.resx b/FrmVlcPlayer.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/FrmVlcPlayer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..66809a8 --- /dev/null +++ b/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace Traything +{ + internal static class Program + { + internal static readonly string RunningVersion = Regex.Replace(Assembly.GetExecutingAssembly().GetName().Version.ToString(), @"^(.+?)(\.0+)$", "$1"); + internal static readonly string BaseExecutingPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.TrimEnd('\\')); + + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmMain()); + } + } +} diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..769ebf1 --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Traything")] +[assembly: AssemblyDescription("A simple but practical (Windows) tray helper tool")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Bernd Bestel")] +[assembly: AssemblyProduct("Traything")] +[assembly: AssemblyCopyright("Licensed under the MIT license (Bernd Bestel 2022)")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("055fdfdb-be94-4dd1-aa3c-7379ce310008")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..a5252c7 --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Traything.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Traything.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fd9722c --- /dev/null +++ b/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Traything.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Properties/Settings.settings b/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..eb08286 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +
+Logo +

Traything

+

A simple but practical (Windows) tray helper tool
Created by @berrnd

+
+ +----- + +## Features / Motivation + +I wanted to have a simple tool which stays in the tray and let you define custom menu items to + +- launch programs +- execute web requests (`GET` / `POST`) +- has a little web browser integrated (using [CefSharp](https://cefsharp.github.io)) +- has a little media player integrated (using [LibVLCSharp](https://github.com/videolan/libvlcsharp)) +- is a portable application, to have a kind of central configuration while also showing specific menu items only on certain machines + +to have some things at hand right from the tray - I haven't found that, so this is Traything. + +I personally use this to conveniently control my smart home and many more things. + +## Questions / Help / Bug Reports / Feature Requests + +Please use the [Issue Tracker](https://github.com/berrnd/Traything/issues/new/choose) for any requests. + +## How to install + +Traything is a portable application, just unpack the [latest release](https://github.com/berrnd/Traything/releases/latest) and launch `Traything.exe`. + +## How to update + +Just overwrite everything with the [latest release](https://github.com/berrnd/Traything/releases/latest) while keeping `Traything.xml` (in this file any configuration is stored). + +## Contributing / Say Thanks + +Any help is welcome, feel free to contribute anything which comes to your mind or see [https://berrnd.de/say-thanks](https://berrnd.de/say-thanks?project=Traything) if you just want to say thanks. + +## Roadmap + +There is none. The progress of a specific bug/enhancement is always tracked in the corresponding issue, at least by commit comment references. + +## Screenshots + +![tray-menu](https://github.com/berrnd/Traything/raw/master/.github/publication_assets/tray-menu.png "tray-menu") + +![main-window](https://github.com/berrnd/Traything/raw/master/.github/publication_assets/main-window.png "main-window") + +![edit-item](https://github.com/berrnd/Traything/raw/master/.github/publication_assets/edit-item.png "edit-item") + +![actions](https://github.com/berrnd/Traything/raw/master/.github/publication_assets/actions.mp4 "actions") + +## How to build + +You will need Visual Studio 2022. All dependencies are included, available via NuGet or will be downloaded at compile time. + +## License + +The MIT License (MIT) diff --git a/Settings.cs b/Settings.cs new file mode 100644 index 0000000..664a6fb --- /dev/null +++ b/Settings.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using System.IO; +using System.Xml.Serialization; + +namespace Traything +{ + public class Settings + { + private static string _Path = Path.Combine(Program.BaseExecutingPath, "Traything.xml"); + public List Actions = new List(); + + public static Settings Load() + { + Settings settings = new Settings(); + + if (File.Exists(Settings._Path)) + { + using (StreamReader reader = new StreamReader(Settings._Path)) + { + XmlSerializer serializer = new XmlSerializer(typeof(Settings)); + settings = (Settings)serializer.Deserialize(reader); + reader.Close(); + } + } + else + { + settings = Settings.Example(); + } + + return settings; + } + + public void Save() + { + XmlSerializer serializer = new XmlSerializer(typeof(Settings)); + using (TextWriter textWriter = new StreamWriter(Settings._Path)) + { + serializer.Serialize(textWriter, this); + textWriter.Close(); + } + } + + public static Settings Example() + { + Settings s = new Settings(); + s.Actions.Add(new ActionItem { Name = "Example/demo configuration", Type = ActionType.Headline }); + s.Actions.Add(new ActionItem { Name = "Notepad", Type = ActionType.StartApplication, Commandline = "notepad.exe" }); + s.Actions.Add(new ActionItem { Name = "Calculator", Type = ActionType.StartApplication, Commandline = "calc.exe" }); + s.Actions.Add(new ActionItem { Name = "----Separator1----", Type = ActionType.Separator }); + s.Actions.Add(new ActionItem { Name = "HTTP GET request", Type = ActionType.HttpGetRequest, Url = "https://demo.grocy.info/api/system/info" }); + ActionItem item = new ActionItem { Name = "HTTP POST request", Type = ActionType.HttpPostRequest, Url = "https://demo.grocy.info/api/objects/locations", PostData = "{ \"name\": \"Test1\" }" }; + item.Headers.Add("Content-Type: application/json"); + s.Actions.Add(item); + s.Actions.Add(new ActionItem { Name = "----Separator2----", Type = ActionType.Separator }); + s.Actions.Add(new ActionItem { Name = "Tray browser (stay open)", Type = ActionType.ShowTrayBrowser, PathOrUrl = "https://grocy.info", StayOpen = true }); + s.Actions.Add(new ActionItem { Name = "Tray browser (auto hide when focus lost)", Type = ActionType.ShowTrayBrowser, PathOrUrl = "https://grocy.info", StayOpen = false }); + s.Actions.Add(new ActionItem { Name = "----Separator3----", Type = ActionType.Separator }); + s.Actions.Add(new ActionItem { Name = "Tray stream player (stay open)", Type = ActionType.ShowTrayMediaPlayer, PathOrUrl = "https://mcdn.daserste.de/daserste/de/master.m3u8", StayOpen = true }); + s.Actions.Add(new ActionItem { Name = "Tray stream player (auto hide when focus lost)", Type = ActionType.ShowTrayMediaPlayer, PathOrUrl = "https://mcdn.daserste.de/daserste/de/master.m3u8", StayOpen = false }); + s.Actions.Add(new ActionItem { Name = "----Separator4----", Type = ActionType.Separator }); + s.Actions.Add(new ActionItem { Name = "Close", Type = ActionType.CloseTraything }); + return s; + } + } +} diff --git a/TaskbarHelper.cs b/TaskbarHelper.cs new file mode 100644 index 0000000..c0f5f17 --- /dev/null +++ b/TaskbarHelper.cs @@ -0,0 +1,193 @@ +// Borrowed from https://gist.github.com/franzalex/e747e6b318ab8f328aa02301f25ec534 + +using System.Drawing; +using System.Runtime.InteropServices; + +namespace System.Windows.Forms +{ + public enum TaskbarPosition + { + Unknown = -1, + Left, + Top, + Right, + Bottom, + } + + public static class TaskbarHelper + { + private enum ABS + { + AutoHide = 0x01, + AlwaysOnTop = 0x02, + } + + ////private enum ABE : uint + private enum AppBarEdge : uint + { + Left = 0, + Top = 1, + Right = 2, + Bottom = 3 + } + + ////private enum ABM : uint + private enum AppBarMessage : uint + { + New = 0x00000000, + Remove = 0x00000001, + QueryPos = 0x00000002, + SetPos = 0x00000003, + GetState = 0x00000004, + GetTaskbarPos = 0x00000005, + Activate = 0x00000006, + GetAutoHideBar = 0x00000007, + SetAutoHideBar = 0x00000008, + WindowPosChanged = 0x00000009, + SetState = 0x0000000A, + } + + private const string ClassName = "Shell_TrayWnd"; + private static APPBARDATA _appBarData; + + /// Static initializer of the class. + static TaskbarHelper() + { + _appBarData = new APPBARDATA + { + cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA)), + hWnd = FindWindow(TaskbarHelper.ClassName, null) + }; + } + + /// + /// Gets a value indicating whether the taskbar is always on top of other windows. + /// + /// true if the taskbar is always on top of other windows; otherwise, false. + /// This property always returns false on Windows 7 and newer. + public static bool AlwaysOnTop + { + get + { + int state = SHAppBarMessage(AppBarMessage.GetState, ref _appBarData).ToInt32(); + return ((ABS)state).HasFlag(ABS.AlwaysOnTop); + } + } + + /// + /// Gets a value indicating whether the taskbar is automatically hidden when inactive. + /// + /// true if the taskbar is set to auto-hide is enabled; otherwise, false. + public static bool AutoHide + { + get + { + int state = SHAppBarMessage(AppBarMessage.GetState, ref _appBarData).ToInt32(); + return ((ABS)state).HasFlag(ABS.AutoHide); + } + } + + /// Gets the current display bounds of the taskbar. + public static Rectangle CurrentBounds + { + get + { + var rect = new RECT(); + if (GetWindowRect(Handle, ref rect)) + return Rectangle.FromLTRB(rect.Left, rect.Top, rect.Right, rect.Bottom); + + return Rectangle.Empty; + } + } + + /// Gets the display bounds when the taskbar is fully visible. + public static Rectangle DisplayBounds + { + get + { + if (RefreshBoundsAndPosition()) + return Rectangle.FromLTRB(_appBarData.rect.Left, + _appBarData.rect.Top, + _appBarData.rect.Right, + _appBarData.rect.Bottom); + + return CurrentBounds; + } + } + + /// Gets the taskbar's window handle. + public static IntPtr Handle + { + get { return _appBarData.hWnd; } + } + + /// Gets the taskbar's position on the screen. + public static TaskbarPosition Position + { + get + { + if (RefreshBoundsAndPosition()) + return (TaskbarPosition)_appBarData.uEdge; + + return TaskbarPosition.Unknown; + } + } + + /// Hides the taskbar. + public static void Hide() + { + const int SW_HIDE = 0; + ShowWindow(Handle, SW_HIDE); + } + + /// Shows the taskbar. + public static void Show() + { + const int SW_SHOW = 1; + ShowWindow(Handle, SW_SHOW); + } + + private static bool RefreshBoundsAndPosition() + { + //! SHAppBarMessage returns IntPtr.Zero **if it fails** + return SHAppBarMessage(AppBarMessage.GetTaskbarPos, ref _appBarData) != IntPtr.Zero; + } + + #region DllImports + + [DllImport("user32.dll", SetLastError = true)] + private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect); + + [DllImport("shell32.dll", SetLastError = true)] + private static extern IntPtr SHAppBarMessage(AppBarMessage dwMessage, [In] ref APPBARDATA pData); + + [DllImport("user32.dll")] + private static extern int ShowWindow(IntPtr hwnd, int command); + + #endregion DllImports + + [StructLayout(LayoutKind.Sequential)] + private struct APPBARDATA + { + public uint cbSize; + public IntPtr hWnd; + public uint uCallbackMessage; + public AppBarEdge uEdge; + public RECT rect; + public int lParam; + } + + [StructLayout(LayoutKind.Sequential)] + private struct RECT + { + public int Left; + public int Top; + public int Right; + public int Bottom; + } + } +} diff --git a/Traything.csproj b/Traything.csproj new file mode 100644 index 0000000..cfe1784 --- /dev/null +++ b/Traything.csproj @@ -0,0 +1,200 @@ + + + + + true + Debug + AnyCPU + {055FDFDB-BE94-4DD1-AA3C-7379CE310008} + WinExe + Traything + Traything + v4.8 + 512 + true + true + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Traything.Program + + + icon.ico + + + true + bin\x64\Debug\ + DEBUG;TRACE + full + x64 + 7.3 + prompt + true + + + bin\x64\Release\ + TRACE + true + pdbonly + x64 + 7.3 + prompt + true + + + + + + + + + + + + + + + + + + + + Form + + + FrmAbout.cs + + + Form + + + FrmEditActionItem.cs + + + Form + + + FrmMain.cs + + + Form + + + FrmVlcPlayer.cs + + + + + + + Form + + + FrmBrowser.cs + + + FrmAbout.cs + + + FrmBrowser.cs + + + FrmEditActionItem.cs + + + FrmMain.cs + + + FrmVlcPlayer.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + 106.0.260 + + + 3.6.7 + + + 3.0.17.4 + + + + + + + + + + + + + if $(ConfigurationName)==Release ( + + if exist "$(SolutionDir).deploy" rd /S /Q "$(SolutionDir).deploy" + + timeout /T 2 + + mkdir "$(SolutionDir).deploy" + +) + + + + $(PostBuildEventDependsOn); + PostBuildMacros; + + if $(ConfigurationName)==Release ( + + PowerShell -ExecutionPolicy Unrestricted -Command "Expand-Archive '$(SolutionDir)vcredist.zip' -DestinationPath '$(TargetDir)'" + PowerShell -ExecutionPolicy Unrestricted -Command "Get-ChildItem '$(TargetDir)*.exe' | Compress-Archive -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" + PowerShell -ExecutionPolicy Unrestricted -Command "Get-ChildItem '$(TargetDir)*.dll' | Compress-Archive -Update -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" + PowerShell -ExecutionPolicy Unrestricted -Command "Get-ChildItem '$(TargetDir)*.bin' | Compress-Archive -Update -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" + PowerShell -ExecutionPolicy Unrestricted -Command "Get-ChildItem '$(TargetDir)*.pak' | Compress-Archive -Update -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" + PowerShell -ExecutionPolicy Unrestricted -Command "Get-ChildItem '$(TargetDir)*.dat' | Compress-Archive -Update -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" + PowerShell -ExecutionPolicy Unrestricted -Command Compress-Archive -Update -Path '$(TargetDir)locales' -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" + PowerShell -ExecutionPolicy Unrestricted -Command Compress-Archive -Update -Path '$(TargetDir)libvlc' -DestinationPath '$(SolutionDir).deploy\Traything_@(VersionNumber).zip'" +) + + \ No newline at end of file diff --git a/Traything.sln b/Traything.sln new file mode 100644 index 0000000..ca43d9d --- /dev/null +++ b/Traything.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32901.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Traything", "Traything.csproj", "{055FDFDB-BE94-4DD1-AA3C-7379CE310008}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {055FDFDB-BE94-4DD1-AA3C-7379CE310008}.Debug|x64.ActiveCfg = Debug|x64 + {055FDFDB-BE94-4DD1-AA3C-7379CE310008}.Debug|x64.Build.0 = Debug|x64 + {055FDFDB-BE94-4DD1-AA3C-7379CE310008}.Release|x64.ActiveCfg = Release|x64 + {055FDFDB-BE94-4DD1-AA3C-7379CE310008}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1046D94D-0D7F-4558-BE06-32E34E785279} + EndGlobalSection +EndGlobal diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000..4a15cb8 Binary files /dev/null and b/icon.ico differ diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..67015e1 --- /dev/null +++ b/icon.svg @@ -0,0 +1,16 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + + + diff --git a/logo.svg b/logo.svg new file mode 100644 index 0000000..4401b64 --- /dev/null +++ b/logo.svg @@ -0,0 +1,47 @@ + + + + +Created by potrace 1.16, written by Peter Selinger 2001-2019 + + + + + + + + + diff --git a/vcredist.zip b/vcredist.zip new file mode 100644 index 0000000..e877faa Binary files /dev/null and b/vcredist.zip differ