mirror of
https://github.com/chylex/TweetDuck.git
synced 2024-11-15 02:42:46 +01:00
251 lines
7.5 KiB
C#
251 lines
7.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
using TweetDuck.Configuration;
|
|
using TweetDuck.Management;
|
|
using TweetLib.Core;
|
|
using TweetLib.Core.Features.Plugins;
|
|
using TweetLib.Core.Systems.Configuration;
|
|
using TweetLib.Utils.Static;
|
|
|
|
namespace TweetDuck.Dialogs.Settings {
|
|
sealed partial class DialogSettingsManage : Form {
|
|
private enum State {
|
|
Deciding,
|
|
Reset,
|
|
Import,
|
|
Export
|
|
}
|
|
|
|
private ProfileManager.Items SelectedItems {
|
|
get => _selectedItems;
|
|
|
|
set {
|
|
// this will call events and SetFlag, which also updates the UI
|
|
foreach (KeyValuePair<CheckBox, ProfileManager.Items> kvp in checkBoxMap) {
|
|
kvp.Key.Checked = value.HasFlag(kvp.Value);
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool SelectedItemsForceRestart {
|
|
get => _selectedItems.HasFlag(ProfileManager.Items.Session);
|
|
}
|
|
|
|
public bool IsRestarting { get; private set; }
|
|
public bool ShouldReloadBrowser { get; private set; }
|
|
|
|
private readonly PluginManager plugins;
|
|
private readonly Dictionary<CheckBox, ProfileManager.Items> checkBoxMap = new Dictionary<CheckBox, ProfileManager.Items>(4);
|
|
private readonly bool openImportImmediately;
|
|
|
|
private State currentState;
|
|
private ProfileManager importManager;
|
|
private bool requestedRestartFromConfig;
|
|
|
|
private ProfileManager.Items _selectedItems = ProfileManager.Items.None;
|
|
|
|
public DialogSettingsManage(PluginManager plugins, bool openImportImmediately = false) {
|
|
InitializeComponent();
|
|
|
|
this.plugins = plugins;
|
|
this.currentState = State.Deciding;
|
|
|
|
this.checkBoxMap[cbProgramConfig] = ProfileManager.Items.UserConfig;
|
|
this.checkBoxMap[cbSystemConfig] = ProfileManager.Items.SystemConfig;
|
|
this.checkBoxMap[cbSession] = ProfileManager.Items.Session;
|
|
this.checkBoxMap[cbPluginData] = ProfileManager.Items.PluginData;
|
|
|
|
this.openImportImmediately = openImportImmediately;
|
|
|
|
if (openImportImmediately) {
|
|
radioImport.Checked = true;
|
|
btnContinue_Click(null, EventArgs.Empty);
|
|
}
|
|
}
|
|
|
|
private void radioDecision_CheckedChanged(object sender, EventArgs e) {
|
|
btnContinue.Enabled = true;
|
|
}
|
|
|
|
private void checkBoxSelection_CheckedChanged(object sender, EventArgs e) {
|
|
CheckBox cb = (CheckBox) sender;
|
|
SetFlag(checkBoxMap[cb], cb.Checked);
|
|
}
|
|
|
|
private void btnContinue_Click(object sender, EventArgs e) {
|
|
string file;
|
|
|
|
switch (currentState) {
|
|
case State.Deciding:
|
|
// Reset
|
|
if (radioReset.Checked) {
|
|
currentState = State.Reset;
|
|
|
|
Text = "Restore Defaults";
|
|
SelectedItems = ProfileManager.Items.UserConfig;
|
|
}
|
|
|
|
// Import
|
|
else if (radioImport.Checked) {
|
|
using (OpenFileDialog dialog = new OpenFileDialog {
|
|
AutoUpgradeEnabled = true,
|
|
DereferenceLinks = true,
|
|
Title = "Import TweetDuck Profile",
|
|
Filter = "TweetDuck Profile (*.tdsettings)|*.tdsettings"
|
|
}) {
|
|
if (dialog.ShowDialog() != DialogResult.OK) {
|
|
if (openImportImmediately) {
|
|
Close();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
file = dialog.FileName;
|
|
}
|
|
|
|
importManager = new ProfileManager(file, plugins);
|
|
currentState = State.Import;
|
|
|
|
Text = "Import Profile";
|
|
SelectedItems = importManager.FindImportItems();
|
|
|
|
foreach (CheckBox cb in checkBoxMap.Keys) {
|
|
cb.Enabled = cb.Checked;
|
|
}
|
|
}
|
|
|
|
// Export
|
|
else if (radioExport.Checked) {
|
|
currentState = State.Export;
|
|
|
|
Text = "Export Profile";
|
|
btnContinue.Text = "Export Profile";
|
|
SelectedItems = ProfileManager.Items.UserConfig | ProfileManager.Items.PluginData;
|
|
}
|
|
|
|
// Continue...
|
|
panelDecision.Visible = false;
|
|
panelSelection.Visible = true;
|
|
Height += panelSelection.Height - panelDecision.Height;
|
|
break;
|
|
|
|
case State.Reset:
|
|
if (FormMessage.Warning("Reset TweetDuck Options", "This will reset the selected items. Are you sure you want to proceed?", FormMessage.Yes, FormMessage.No)) {
|
|
App.ConfigManager.ProgramRestartRequested += Config_ProgramRestartRequested;
|
|
|
|
if (SelectedItems.HasFlag(ProfileManager.Items.UserConfig)) {
|
|
Program.Config.User.Reset();
|
|
}
|
|
|
|
if (SelectedItems.HasFlag(ProfileManager.Items.SystemConfig)) {
|
|
Program.Config.System.Reset();
|
|
}
|
|
|
|
App.ConfigManager.ProgramRestartRequested -= Config_ProgramRestartRequested;
|
|
|
|
if (SelectedItems.HasFlag(ProfileManager.Items.PluginData)) {
|
|
Program.Config.Plugins.Reset();
|
|
|
|
try {
|
|
Directory.Delete(plugins.PluginDataFolder, true);
|
|
} catch (Exception ex) {
|
|
App.ErrorHandler.HandleException("Profile Reset", "Could not delete plugin data.", true, ex);
|
|
}
|
|
}
|
|
|
|
if (SelectedItemsForceRestart) {
|
|
RestartProgram(SelectedItems.HasFlag(ProfileManager.Items.Session) ? new string[] { Arguments.ArgDeleteCookies } : StringUtils.EmptyArray);
|
|
}
|
|
else if (requestedRestartFromConfig) {
|
|
if (FormMessage.Information("Profile Reset", "The application must restart for some of the restored options to take place. Do you want to restart now?", FormMessage.Yes, FormMessage.No)) {
|
|
RestartProgram();
|
|
}
|
|
}
|
|
|
|
ShouldReloadBrowser = true;
|
|
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
}
|
|
|
|
break;
|
|
|
|
case State.Import:
|
|
if (importManager.Import(SelectedItems)) {
|
|
App.ConfigManager.ProgramRestartRequested += Config_ProgramRestartRequested;
|
|
App.ConfigManager.ReloadAll();
|
|
App.ConfigManager.SaveAll();
|
|
App.ConfigManager.ProgramRestartRequested -= Config_ProgramRestartRequested;
|
|
|
|
if (SelectedItemsForceRestart) {
|
|
RestartProgram(SelectedItems.HasFlag(ProfileManager.Items.Session) ? new string[] { Arguments.ArgImportCookies } : StringUtils.EmptyArray);
|
|
}
|
|
else if (requestedRestartFromConfig) {
|
|
if (FormMessage.Information("Profile Import", "The application must restart for some of the imported options to take place. Do you want to restart now?", FormMessage.Yes, FormMessage.No)) {
|
|
RestartProgram();
|
|
}
|
|
}
|
|
}
|
|
|
|
ShouldReloadBrowser = true;
|
|
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
break;
|
|
|
|
case State.Export:
|
|
using (SaveFileDialog dialog = new SaveFileDialog {
|
|
AddExtension = true,
|
|
AutoUpgradeEnabled = true,
|
|
OverwritePrompt = true,
|
|
DefaultExt = "tdsettings",
|
|
FileName = "TweetDuck.tdsettings",
|
|
Title = "Export TweetDuck Profile",
|
|
Filter = "TweetDuck Profile (*.tdsettings)|*.tdsettings"
|
|
}) {
|
|
if (dialog.ShowDialog() != DialogResult.OK) {
|
|
return;
|
|
}
|
|
|
|
file = dialog.FileName;
|
|
}
|
|
|
|
new ProfileManager(file, plugins).Export(SelectedItems);
|
|
|
|
DialogResult = DialogResult.OK;
|
|
Close();
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void btnCancel_Click(object sender, EventArgs e) {
|
|
DialogResult = DialogResult.Cancel;
|
|
Close();
|
|
}
|
|
|
|
private void Config_ProgramRestartRequested(object sender, EventArgs e) {
|
|
requestedRestartFromConfig = true;
|
|
}
|
|
|
|
private void SetFlag(ProfileManager.Items flag, bool enable) {
|
|
_selectedItems = enable ? _selectedItems | flag : _selectedItems & ~flag;
|
|
btnContinue.Enabled = _selectedItems != ProfileManager.Items.None;
|
|
|
|
if (currentState == State.Import) {
|
|
btnContinue.Text = SelectedItemsForceRestart ? "Import && Restart" : "Import Profile";
|
|
}
|
|
else if (currentState == State.Reset) {
|
|
btnContinue.Text = SelectedItemsForceRestart ? "Restore && Restart" : "Restore Defaults";
|
|
}
|
|
}
|
|
|
|
private void RestartProgram(params string[] extraArgs) {
|
|
IsRestarting = true;
|
|
Program.Restart(extraArgs);
|
|
}
|
|
}
|
|
}
|