ShareX/ShareX/Controls/BeforeUploadControl.cs

313 lines
13 KiB
C#

#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
Copyright (c) 2007-2024 ShareX Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
using ShareX.HelpersLib;
using ShareX.Properties;
using ShareX.UploadersLib;
using System;
using System.Linq;
using System.Windows.Forms;
namespace ShareX
{
public partial class BeforeUploadControl : UserControl
{
public delegate void EventHandler(string currentDestination);
public event EventHandler InitCompleted;
public BeforeUploadControl()
{
InitializeComponent();
}
public void Init(TaskInfo info)
{
switch (info.DataType)
{
case EDataType.Image:
InitCapture(info.TaskSettings, info.DataType);
break;
case EDataType.Text:
Helpers.GetEnums<TextDestination>().ForEach(x =>
{
if (x != TextDestination.FileUploader)
{
string overrideText = null;
if (x == TextDestination.CustomTextUploader)
{
overrideText = GetCustomUploaderName(Program.UploadersConfig.CustomTextUploaderSelected, info.TaskSettings);
}
AddDestination<TextDestination>((int)x, EDataType.Text, info.TaskSettings, overrideText, info.DataType);
}
});
Helpers.GetEnums<FileDestination>().ForEach(x =>
{
string overrideText = null;
if (x == FileDestination.CustomFileUploader)
{
overrideText = GetCustomUploaderName(Program.UploadersConfig.CustomFileUploaderSelected, info.TaskSettings);
}
AddDestination<FileDestination>((int)x, EDataType.Text, info.TaskSettings, overrideText, info.DataType);
});
flp.Controls.OfType<RadioButton>().ForEach(x =>
{
if (info.TaskSettings.TextDestination != TextDestination.FileUploader)
{
x.Checked = x.Tag is TextDestination textDestination && textDestination == info.TaskSettings.TextDestination;
}
else
{
x.Checked = x.Tag is FileDestination fileDestination && fileDestination == info.TaskSettings.TextFileDestination;
}
});
break;
case EDataType.File:
Helpers.GetEnums<FileDestination>().ForEach(x =>
{
string overrideText = null;
if (x == FileDestination.CustomFileUploader)
{
overrideText = GetCustomUploaderName(Program.UploadersConfig.CustomFileUploaderSelected, info.TaskSettings);
}
AddDestination<FileDestination>((int)x, EDataType.File, info.TaskSettings, overrideText, info.DataType);
});
flp.Controls.OfType<RadioButton>().ForEach(x =>
{
x.Checked = x.Tag is FileDestination fileDestination && fileDestination == info.TaskSettings.FileDestination;
});
break;
case EDataType.URL:
Helpers.GetEnums<UrlShortenerType>().ForEach(x =>
{
string overrideText = null;
if (x == UrlShortenerType.CustomURLShortener)
{
overrideText = GetCustomUploaderName(Program.UploadersConfig.CustomURLShortenerSelected, info.TaskSettings);
}
AddDestination<UrlShortenerType>((int)x, EDataType.URL, info.TaskSettings, overrideText, info.DataType);
});
flp.Controls.OfType<RadioButton>().ForEach(x =>
{
x.Checked = x.Tag is UrlShortenerType urlShortenerType && urlShortenerType == info.TaskSettings.URLShortenerDestination;
});
break;
}
OnInitCompleted();
}
public void InitCapture(TaskSettings taskSettings, EDataType trueDateType = EDataType.Default)
{
Helpers.GetEnums<ImageDestination>().ForEach(x =>
{
if (x != ImageDestination.FileUploader)
{
string overrideText = null;
if (x == ImageDestination.CustomImageUploader)
{
overrideText = GetCustomUploaderName(Program.UploadersConfig.CustomImageUploaderSelected, taskSettings);
}
AddDestination<ImageDestination>((int)x, EDataType.Image, taskSettings, overrideText, trueDateType);
}
});
Helpers.GetEnums<FileDestination>().ForEach(x =>
{
string overrideText = null;
if (x == FileDestination.CustomFileUploader)
{
overrideText = GetCustomUploaderName(Program.UploadersConfig.CustomFileUploaderSelected, taskSettings);
}
AddDestination<FileDestination>((int)x, EDataType.File, taskSettings, overrideText, trueDateType);
});
flp.Controls.OfType<RadioButton>().ForEach(x =>
{
if (taskSettings.ImageDestination != ImageDestination.FileUploader)
{
x.Checked = x.Tag is ImageDestination imageDestination && imageDestination == taskSettings.ImageDestination;
}
else
{
x.Checked = x.Tag is FileDestination fileDestination && fileDestination == taskSettings.ImageFileDestination;
}
});
}
private void OnInitCompleted()
{
if (InitCompleted != null)
{
RadioButton rbDestination = flp.Controls.OfType<RadioButton>().FirstOrDefault(x => x.Checked);
string currentDestination = "";
if (rbDestination != null)
{
currentDestination = rbDestination.Text;
}
InitCompleted(currentDestination);
}
}
private void AddDestination<T>(int index, EDataType dataType, TaskSettings taskSettings, string overrideText = null, EDataType trueDataType = EDataType.Default)
{
Enum destination = (Enum)Enum.ToObject(typeof(T), index);
if (destination.Equals(FileDestination.FTP))
{
RadioButton rb = new RadioButton() { AutoSize = true };
rb.Text = string.Format("FTP");
rb.Tag = destination;
ComboBox ftpComboBox = new ComboBox() { Size = new System.Drawing.Size(250, 100) };
Program.UploadersConfig.FTPAccountList.ForEach(ftpAcc => { ftpComboBox.Items.Add(ftpAcc.Name); });
ftpComboBox.SelectedIndexChanged += (sender, e) => SetFTPOverrideIndex(ftpComboBox.SelectedIndex, taskSettings);
switch (trueDataType)
{
case EDataType.Image:
ftpComboBox.SelectedIndex = Program.UploadersConfig.FTPSelectedImage;
break;
case EDataType.Text:
ftpComboBox.SelectedIndex = Program.UploadersConfig.FTPSelectedText;
break;
default:
case EDataType.File:
ftpComboBox.SelectedIndex = Program.UploadersConfig.FTPSelectedFile;
break;
}
rb.CheckedChanged += (sender, e) => SetFTPOverride(rb.Checked, ftpComboBox.SelectedIndex, taskSettings);
flp.Controls.Add(rb);
flp.Controls.Add(ftpComboBox);
} else {
if (UploadersConfigValidator.Validate<T>(index, Program.UploadersConfig))
{
RadioButton rb = new RadioButton() { AutoSize = true };
rb.Text = string.IsNullOrEmpty(overrideText) ? destination.GetLocalizedDescription() :
string.Format("{0} [{1}]", Resources.BeforeUploadControl_AddDestination_Custom, overrideText);
rb.Tag = destination;
rb.CheckedChanged += (sender, e) => SetDestinations(rb.Checked, dataType, rb.Tag, taskSettings);
flp.Controls.Add(rb);
}
}
}
private void SetFTPOverrideIndex(int ftpAccIndex, TaskSettings taskSettings)
{
DebugHelper.WriteLine(ftpAccIndex.ToString());
taskSettings.FTPIndex = ftpAccIndex;
}
private void SetFTPOverride(bool isActive, int ftpAccIndex, TaskSettings taskSettings)
{
if (!isActive) return;
DebugHelper.WriteLine(ftpAccIndex.ToString());
taskSettings.OverrideFTP = true;
taskSettings.FTPIndex = ftpAccIndex;
taskSettings.ImageDestination = ImageDestination.FileUploader;
taskSettings.TextDestination = TextDestination.FileUploader;
taskSettings.ImageFileDestination = taskSettings.TextFileDestination = taskSettings.FileDestination = FileDestination.FTP;
}
private void SetDestinations(bool isActive, EDataType dataType, object destination, TaskSettings taskSettings)
{
if (!isActive) return;
switch (dataType)
{
case EDataType.Image:
if (destination is ImageDestination imageDestination)
{
taskSettings.ImageDestination = imageDestination;
}
else if (destination is FileDestination imageFileDestination)
{
taskSettings.ImageDestination = ImageDestination.FileUploader;
taskSettings.ImageFileDestination = imageFileDestination;
}
break;
case EDataType.Text:
if (destination is TextDestination textDestination)
{
taskSettings.TextDestination = textDestination;
}
else if (destination is FileDestination textFileDestination)
{
taskSettings.TextDestination = TextDestination.FileUploader;
taskSettings.TextFileDestination = textFileDestination;
}
break;
case EDataType.File:
if (destination is FileDestination fileDestination)
{
taskSettings.ImageDestination = ImageDestination.FileUploader;
taskSettings.TextDestination = TextDestination.FileUploader;
taskSettings.ImageFileDestination = taskSettings.TextFileDestination = taskSettings.FileDestination = fileDestination;
}
break;
case EDataType.URL:
if (destination is UrlShortenerType urlShortenerDestination)
{
taskSettings.URLShortenerDestination = urlShortenerDestination;
}
break;
}
}
private string GetCustomUploaderName(int index, TaskSettings taskSettings)
{
if (taskSettings.OverrideCustomUploader)
{
index = taskSettings.CustomUploaderIndex.BetweenOrDefault(0, Program.UploadersConfig.CustomUploadersList.Count - 1);
}
CustomUploaderItem cui = Program.UploadersConfig.CustomUploadersList.ReturnIfValidIndex(index);
if (cui != null)
{
return cui.ToString();
}
return null;
}
}
}