mirror of
https://github.com/chylex/TweetDuck.git
synced 2025-05-23 20:34:07 +02:00
Rename 'Export/Import Settings' to Profile and add Plugin exporting
This commit is contained in:
parent
bf76398627
commit
9e45628e87
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
37
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
37
Core/Other/Settings/TabSettingsAdvanced.Designer.cs
generated
@ -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);
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user