diff --git a/Core/FormBrowser.cs b/Core/FormBrowser.cs index 7b3eb8d0..d9ba0871 100644 --- a/Core/FormBrowser.cs +++ b/Core/FormBrowser.cs @@ -231,7 +231,7 @@ public void OpenSettings(){ else{ bool prevEnableUpdateCheck = Config.EnableUpdateCheck; - currentFormSettings = new FormSettings(this, updates); + currentFormSettings = new FormSettings(this, plugins, updates); currentFormSettings.FormClosed += (sender, args) => { currentFormSettings = null; diff --git a/Core/Other/FormSettings.cs b/Core/Other/FormSettings.cs index 416384d4..4dcdd191 100644 --- a/Core/Other/FormSettings.cs +++ b/Core/Other/FormSettings.cs @@ -3,13 +3,14 @@ using System.Linq; using System.Windows.Forms; using TweetDck.Core.Other.Settings; +using TweetDck.Plugins; using TweetDck.Updates; namespace TweetDck.Core.Other{ sealed partial class FormSettings : Form{ private readonly Dictionary<Type, BaseTabSettings> tabs = new Dictionary<Type, BaseTabSettings>(4); - public FormSettings(FormBrowser browserForm, UpdateHandler updates){ + public FormSettings(FormBrowser browserForm, PluginManager plugins, UpdateHandler updates){ InitializeComponent(); Text = Program.BrandName+" Settings"; @@ -18,7 +19,7 @@ public FormSettings(FormBrowser browserForm, UpdateHandler updates){ this.tabPanel.AddButton("General", SelectTab<TabSettingsGeneral>); this.tabPanel.AddButton("Notifications", () => SelectTab(() => new TabSettingsNotifications(browserForm.CreateNotificationForm(false)))); this.tabPanel.AddButton("Updates", () => SelectTab(() => new TabSettingsUpdates(updates))); - this.tabPanel.AddButton("Advanced", () => SelectTab(() => new TabSettingsAdvanced(browserForm.ReloadBrowser))); + this.tabPanel.AddButton("Advanced", () => SelectTab(() => new TabSettingsAdvanced(browserForm.ReloadBrowser, plugins))); this.tabPanel.SelectTab(tabPanel.Buttons.First()); } diff --git a/Core/Other/Settings/Export/CombinedFileStream.cs b/Core/Other/Settings/Export/CombinedFileStream.cs index 2a1ee10a..8b54526f 100644 --- a/Core/Other/Settings/Export/CombinedFileStream.cs +++ b/Core/Other/Settings/Export/CombinedFileStream.cs @@ -4,6 +4,8 @@ namespace TweetDck.Core.Other.Settings.Export{ class CombinedFileStream : IDisposable{ + public const char KeySeparator = '/'; + private readonly Stream stream; public CombinedFileStream(Stream stream){ @@ -65,6 +67,13 @@ void IDisposable.Dispose(){ public class Entry{ public string Identifier { get; private set; } + public string KeyName{ + get{ + int index = Identifier.IndexOf(KeySeparator); + return index == -1 ? Identifier : Identifier.Substring(0, index); + } + } + private readonly byte[] contents; public Entry(string identifier, byte[] contents){ @@ -75,6 +84,12 @@ public Entry(string identifier, byte[] contents){ public void WriteToFile(string path){ File.WriteAllBytes(path, contents); } + + public void WriteToFile(string path, bool createDirectory){ + // ReSharper disable once AssignNullToNotNullAttribute + Directory.CreateDirectory(Path.GetDirectoryName(path)); + File.WriteAllBytes(path, contents); + } } } } diff --git a/Core/Other/Settings/Export/ExportManager.cs b/Core/Other/Settings/Export/ExportManager.cs index ab54b595..b9890f43 100644 --- a/Core/Other/Settings/Export/ExportManager.cs +++ b/Core/Other/Settings/Export/ExportManager.cs @@ -1,7 +1,10 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Windows.Forms; +using TweetDck.Plugins; namespace TweetDck.Core.Other.Settings.Export{ sealed class ExportManager{ @@ -11,9 +14,11 @@ sealed class ExportManager{ public Exception LastException { get; private set; } private readonly string file; + private readonly PluginManager plugins; - public ExportManager(string file){ + public ExportManager(string file, PluginManager plugins){ this.file = file; + this.plugins = plugins; } public bool Export(bool includeSession){ @@ -21,6 +26,27 @@ public bool Export(bool includeSession){ using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))){ stream.WriteFile("config", Program.ConfigFilePath); + foreach(PathInfo path in EnumerateFilesRelative(plugins.PathOfficialPlugins)){ + string[] split = path.Relative.Split(CombinedFileStream.KeySeparator); + + if (split.Length < 3){ + continue; + } + else if (split.Length == 3){ + if (split[2].Equals(".meta", StringComparison.InvariantCultureIgnoreCase) || + split[2].Equals("browser.js", StringComparison.InvariantCultureIgnoreCase) || + split[2].Equals("notification.js", StringComparison.InvariantCultureIgnoreCase)){ + continue; + } + } + + stream.WriteFile("plugin.off"+path.Relative, path.Full); + } + + foreach(PathInfo path in EnumerateFilesRelative(plugins.PathCustomPlugins)){ + stream.WriteFile("plugin.usr"+path.Relative, path.Full); + } + if (includeSession){ stream.WriteFile("cookies", CookiesPath); } @@ -37,16 +63,33 @@ public bool Export(bool includeSession){ public bool Import(){ try{ + bool updatedPlugins = false; + using(CombinedFileStream stream = new CombinedFileStream(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.None))){ CombinedFileStream.Entry entry; while((entry = stream.ReadFile()) != null){ - switch(entry.Identifier){ + switch(entry.KeyName){ case "config": entry.WriteToFile(Program.ConfigFilePath); Program.ReloadConfig(); break; + case "plugin.off": + string root = Path.Combine(plugins.PathOfficialPlugins, entry.Identifier.Split(CombinedFileStream.KeySeparator)[1]); + + if (Directory.Exists(root)){ + entry.WriteToFile(Path.Combine(plugins.PathOfficialPlugins, entry.Identifier.Substring(entry.KeyName.Length+1)), true); + updatedPlugins = true; + } + + break; + + case "plugin.usr": + entry.WriteToFile(Path.Combine(plugins.PathCustomPlugins, entry.Identifier.Substring(entry.KeyName.Length+1)), true); + updatedPlugins = true; + break; + case "cookies": if (MessageBox.Show("Do you want to import the login session? This will restart "+Program.BrandName+".", "Importing "+Program.BrandName+" Settings", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes){ entry.WriteToFile(Path.Combine(Program.StoragePath, TempCookiesPath)); @@ -61,11 +104,27 @@ public bool Import(){ } } + if (updatedPlugins){ + plugins.Reload(); + } + return true; }catch(Exception e){ LastException = e; return false; } } + + private static IEnumerable<PathInfo> EnumerateFilesRelative(string root){ + return Directory.EnumerateFiles(root, "*.*", SearchOption.AllDirectories).Select(fullPath => new PathInfo{ + Full = fullPath, + Relative = fullPath.Substring(root.Length).Replace(Path.DirectorySeparatorChar, CombinedFileStream.KeySeparator) // includes leading separator character + }); + } + + private class PathInfo{ + public string Full { get; set; } + public string Relative { get; set; } + } } } diff --git a/Core/Other/Settings/TabSettingsAdvanced.Designer.cs b/Core/Other/Settings/TabSettingsAdvanced.Designer.cs index 14e6b5f4..e3a9ab23 100644 --- a/Core/Other/Settings/TabSettingsAdvanced.Designer.cs +++ b/Core/Other/Settings/TabSettingsAdvanced.Designer.cs @@ -28,12 +28,12 @@ private void InitializeComponent() { this.checkHardwareAcceleration = new System.Windows.Forms.CheckBox(); this.toolTip = new System.Windows.Forms.ToolTip(this.components); this.btnEditCefArgs = new System.Windows.Forms.Button(); + this.btnEditCSS = new System.Windows.Forms.Button(); this.btnReset = new System.Windows.Forms.Button(); this.btnImport = new System.Windows.Forms.Button(); this.btnExport = new System.Windows.Forms.Button(); this.groupPerformance = new System.Windows.Forms.GroupBox(); this.groupConfiguration = new System.Windows.Forms.GroupBox(); - this.btnEditCSS = new System.Windows.Forms.Button(); this.groupPerformance.SuspendLayout(); this.groupConfiguration.SuspendLayout(); this.SuspendLayout(); @@ -75,11 +75,22 @@ private void InitializeComponent() { this.btnEditCefArgs.UseVisualStyleBackColor = true; this.btnEditCefArgs.Click += new System.EventHandler(this.btnEditCefArgs_Click); // + // btnEditCSS + // + this.btnEditCSS.Location = new System.Drawing.Point(6, 48); + this.btnEditCSS.Name = "btnEditCSS"; + this.btnEditCSS.Size = new System.Drawing.Size(171, 23); + this.btnEditCSS.TabIndex = 16; + this.btnEditCSS.Text = "Edit CSS"; + this.toolTip.SetToolTip(this.btnEditCSS, "Set custom CSS for browser and notification windows."); + this.btnEditCSS.UseVisualStyleBackColor = true; + this.btnEditCSS.Click += new System.EventHandler(this.btnEditCSS_Click); + // // btnReset // this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnReset.AutoSize = true; - this.btnReset.Location = new System.Drawing.Point(209, 250); + this.btnReset.Location = new System.Drawing.Point(190, 250); this.btnReset.Name = "btnReset"; this.btnReset.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0); this.btnReset.Size = new System.Drawing.Size(102, 23); @@ -92,12 +103,12 @@ private void InitializeComponent() { // this.btnImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnImport.AutoSize = true; - this.btnImport.Location = new System.Drawing.Point(109, 250); + this.btnImport.Location = new System.Drawing.Point(100, 250); this.btnImport.Name = "btnImport"; this.btnImport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0); - this.btnImport.Size = new System.Drawing.Size(94, 23); + this.btnImport.Size = new System.Drawing.Size(84, 23); this.btnImport.TabIndex = 16; - this.btnImport.Text = "Import Settings"; + this.btnImport.Text = "Import Profile"; this.btnImport.UseVisualStyleBackColor = true; this.btnImport.Click += new System.EventHandler(this.btnImport_Click); // @@ -105,12 +116,13 @@ private void InitializeComponent() { // this.btnExport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnExport.AutoSize = true; + this.btnExport.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.btnExport.Location = new System.Drawing.Point(9, 250); this.btnExport.Name = "btnExport"; this.btnExport.Padding = new System.Windows.Forms.Padding(3, 0, 3, 0); - this.btnExport.Size = new System.Drawing.Size(94, 23); + this.btnExport.Size = new System.Drawing.Size(85, 23); this.btnExport.TabIndex = 15; - this.btnExport.Text = "Export Settings"; + this.btnExport.Text = "Export Profile"; this.btnExport.UseVisualStyleBackColor = true; this.btnExport.Click += new System.EventHandler(this.btnExport_Click); // @@ -136,17 +148,6 @@ private void InitializeComponent() { this.groupConfiguration.TabStop = false; this.groupConfiguration.Text = "Configuration"; // - // btnEditCSS - // - this.btnEditCSS.Location = new System.Drawing.Point(6, 48); - this.btnEditCSS.Name = "btnEditCSS"; - this.btnEditCSS.Size = new System.Drawing.Size(171, 23); - this.btnEditCSS.TabIndex = 16; - this.btnEditCSS.Text = "Edit CSS"; - this.toolTip.SetToolTip(this.btnEditCSS, "Set custom CSS for browser and notification windows."); - this.btnEditCSS.UseVisualStyleBackColor = true; - this.btnEditCSS.Click += new System.EventHandler(this.btnEditCSS_Click); - // // TabSettingsAdvanced // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/Core/Other/Settings/TabSettingsAdvanced.cs b/Core/Other/Settings/TabSettingsAdvanced.cs index 38adb6a7..5edd056a 100644 --- a/Core/Other/Settings/TabSettingsAdvanced.cs +++ b/Core/Other/Settings/TabSettingsAdvanced.cs @@ -5,15 +5,18 @@ using TweetDck.Core.Other.Settings.Dialogs; using TweetDck.Core.Other.Settings.Export; using TweetDck.Core.Utils; +using TweetDck.Plugins; namespace TweetDck.Core.Other.Settings{ partial class TabSettingsAdvanced : BaseTabSettings{ private readonly Action browserReloadAction; + private readonly PluginManager plugins; - public TabSettingsAdvanced(Action browserReloadAction){ + public TabSettingsAdvanced(Action browserReloadAction, PluginManager plugins){ InitializeComponent(); this.browserReloadAction = browserReloadAction; + this.plugins = plugins; checkHardwareAcceleration.Checked = HardwareAcceleration.IsEnabled; @@ -109,7 +112,7 @@ private void btnExport_Click(object sender, EventArgs e){ if (file != null){ Program.UserConfig.Save(); - ExportManager manager = new ExportManager(file); + ExportManager manager = new ExportManager(file, plugins); if (!manager.Export(saveCredentials)){ Program.HandleException("An exception happened while exporting "+Program.BrandName+" settings.", manager.LastException); @@ -130,7 +133,7 @@ private void btnImport_Click(object sender, EventArgs e){ } if (file != null){ - ExportManager manager = new ExportManager(file); + ExportManager manager = new ExportManager(file, plugins); if (manager.Import()){ ((FormSettings)ParentForm).ReloadUI();