mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Merge pull request #2177 from Flow-Launcher/refactor_copy
Refactor clipboard copying
This commit is contained in:
commit
144fdad5d2
10 changed files with 55 additions and 78 deletions
|
|
@ -38,12 +38,18 @@ namespace Flow.Launcher.Plugin
|
||||||
/// <exception cref="FileNotFoundException">Thrown when unable to find the file specified in the command </exception>
|
/// <exception cref="FileNotFoundException">Thrown when unable to find the file specified in the command </exception>
|
||||||
/// <exception cref="Win32Exception">Thrown when error occurs during the execution of the command </exception>
|
/// <exception cref="Win32Exception">Thrown when error occurs during the execution of the command </exception>
|
||||||
void ShellRun(string cmd, string filename = "cmd.exe");
|
void ShellRun(string cmd, string filename = "cmd.exe");
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Copy Text to clipboard
|
/// Copies the passed in text and shows a message indicating whether the operation was completed successfully.
|
||||||
|
/// When directCopy is set to true and passed in text is the path to a file or directory,
|
||||||
|
/// the actual file/directory will be copied to clipboard. Otherwise the text itself will still be copied to clipboard.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="text">Text to save on clipboard</param>
|
/// <param name="text">Text to save on clipboard</param>
|
||||||
public void CopyToClipboard(string text);
|
/// <param name="directCopy">When true it will directly copy the file/folder from the path specified in text</param>
|
||||||
|
/// <param name="showDefaultNotification">Whether to show the default notification from this method after copy is done.
|
||||||
|
/// It will show file/folder/text is copied successfully.
|
||||||
|
/// Turn this off to show your own notification after copy is done.</param>>
|
||||||
|
public void CopyToClipboard(string text, bool directCopy = false, bool showDefaultNotification = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save everything, all of Flow Launcher and plugins' data and settings
|
/// Save everything, all of Flow Launcher and plugins' data and settings
|
||||||
|
|
|
||||||
|
|
@ -63,12 +63,11 @@ namespace Flow.Launcher
|
||||||
if (QueryTextBox.SelectionLength == 0 && result != null)
|
if (QueryTextBox.SelectionLength == 0 && result != null)
|
||||||
{
|
{
|
||||||
string copyText = result.CopyText;
|
string copyText = result.CopyText;
|
||||||
_viewModel.ResultCopy(copyText);
|
App.API.CopyToClipboard(copyText, directCopy: true);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (!string.IsNullOrEmpty(QueryTextBox.Text))
|
else if (!string.IsNullOrEmpty(QueryTextBox.Text))
|
||||||
{
|
{
|
||||||
System.Windows.Clipboard.SetText(QueryTextBox.SelectedText);
|
App.API.CopyToClipboard(QueryTextBox.SelectedText, showDefaultNotification: false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ using Flow.Launcher.Infrastructure.Logger;
|
||||||
using Flow.Launcher.Infrastructure.Storage;
|
using Flow.Launcher.Infrastructure.Storage;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
|
||||||
namespace Flow.Launcher
|
namespace Flow.Launcher
|
||||||
{
|
{
|
||||||
|
|
@ -116,9 +117,35 @@ namespace Flow.Launcher
|
||||||
ShellCommand.Execute(startInfo);
|
ShellCommand.Execute(startInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CopyToClipboard(string text)
|
public void CopyToClipboard(string stringToCopy, bool directCopy = false, bool showDefaultNotification = true)
|
||||||
{
|
{
|
||||||
_mainVM.ResultCopy(text);
|
if (string.IsNullOrEmpty(stringToCopy))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var isFile = File.Exists(stringToCopy);
|
||||||
|
if (directCopy && (isFile || Directory.Exists(stringToCopy)))
|
||||||
|
{
|
||||||
|
var paths = new StringCollection
|
||||||
|
{
|
||||||
|
stringToCopy
|
||||||
|
};
|
||||||
|
|
||||||
|
Clipboard.SetFileDropList(paths);
|
||||||
|
|
||||||
|
if (showDefaultNotification)
|
||||||
|
ShowMsg(
|
||||||
|
$"{GetTranslation("copy")} {(isFile ? GetTranslation("fileTitle") : GetTranslation("folderTitle"))}",
|
||||||
|
GetTranslation("completedSuccessfully"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Clipboard.SetDataObject(stringToCopy);
|
||||||
|
|
||||||
|
if (showDefaultNotification)
|
||||||
|
ShowMsg(
|
||||||
|
$"{GetTranslation("copy")} {GetTranslation("textTitle")}",
|
||||||
|
GetTranslation("completedSuccessfully"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;
|
public void StartLoadingBar() => _mainVM.ProgressBarVisibility = Visibility.Visible;
|
||||||
|
|
|
||||||
|
|
@ -1103,42 +1103,6 @@ namespace Flow.Launcher.ViewModel
|
||||||
Results.AddResults(resultsForUpdates, token);
|
Results.AddResults(resultsForUpdates, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Copies the specified file or folder path to the clipboard, or the specified text if it is not a valid file or folder path.
|
|
||||||
/// Shows a message indicating whether the operation was completed successfully.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="stringToCopy">The file or folder path, or text to copy to the clipboard.</param>
|
|
||||||
/// <returns>Nothing.</returns>
|
|
||||||
public void ResultCopy(string stringToCopy)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(stringToCopy))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var isFile = File.Exists(stringToCopy);
|
|
||||||
var isFolder = Directory.Exists(stringToCopy);
|
|
||||||
if (isFile || isFolder)
|
|
||||||
{
|
|
||||||
var paths = new StringCollection
|
|
||||||
{
|
|
||||||
stringToCopy
|
|
||||||
};
|
|
||||||
|
|
||||||
Clipboard.SetFileDropList(paths);
|
|
||||||
App.API.ShowMsg(
|
|
||||||
$"{App.API.GetTranslation("copy")} {(isFile ? App.API.GetTranslation("fileTitle") : App.API.GetTranslation("folderTitle"))}",
|
|
||||||
App.API.GetTranslation("completedSuccessfully"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Clipboard.SetDataObject(stringToCopy);
|
|
||||||
App.API.ShowMsg(
|
|
||||||
$"{App.API.GetTranslation("copy")} {App.API.GetTranslation("textTitle")}",
|
|
||||||
App.API.GetTranslation("completedSuccessfully"));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ namespace Flow.Launcher.Plugin.BrowserBookmark
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Clipboard.SetDataObject(((BookmarkAttributes)selectedResult.ContextData).Url);
|
context.API.CopyToClipboard(((BookmarkAttributes)selectedResult.ContextData).Url);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ namespace Flow.Launcher.Plugin.Caculator
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Clipboard.SetDataObject(newResult);
|
Context.API.CopyToClipboard(newResult);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (ExternalException)
|
catch (ExternalException)
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,7 @@ namespace Flow.Launcher.Plugin.Explorer
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Clipboard.SetText(record.FullPath);
|
Context.API.CopyToClipboard(record.FullPath);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
@ -147,10 +147,7 @@ namespace Flow.Launcher.Plugin.Explorer
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Clipboard.SetFileDropList(new System.Collections.Specialized.StringCollection
|
Context.API.CopyToClipboard(record.FullPath, directCopy: true);
|
||||||
{
|
|
||||||
record.FullPath
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,7 @@ namespace Flow.Launcher.Plugin.Explorer
|
||||||
? action
|
? action
|
||||||
: _ =>
|
: _ =>
|
||||||
{
|
{
|
||||||
Clipboard.SetDataObject(e.ToString());
|
Context.API.CopyToClipboard(e.ToString());
|
||||||
return new ValueTask<bool>(true);
|
return new ValueTask<bool>(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,8 @@ namespace Flow.Launcher.Plugin.Shell
|
||||||
|
|
||||||
Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator));
|
Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator));
|
||||||
return true;
|
return true;
|
||||||
}
|
},
|
||||||
|
CopyText = m
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -123,7 +124,8 @@ namespace Flow.Launcher.Plugin.Shell
|
||||||
|
|
||||||
Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
|
Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
|
||||||
return true;
|
return true;
|
||||||
}
|
},
|
||||||
|
CopyText = m.Key
|
||||||
};
|
};
|
||||||
return ret;
|
return ret;
|
||||||
}).Where(o => o != null);
|
}).Where(o => o != null);
|
||||||
|
|
@ -152,7 +154,8 @@ namespace Flow.Launcher.Plugin.Shell
|
||||||
|
|
||||||
Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator));
|
Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator));
|
||||||
return true;
|
return true;
|
||||||
}
|
},
|
||||||
|
CopyText = cmd
|
||||||
};
|
};
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -176,7 +179,8 @@ namespace Flow.Launcher.Plugin.Shell
|
||||||
|
|
||||||
Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
|
Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
|
||||||
return true;
|
return true;
|
||||||
}
|
},
|
||||||
|
CopyText = m.Key
|
||||||
});
|
});
|
||||||
|
|
||||||
if (_settings.ShowOnlyMostUsedCMDs)
|
if (_settings.ShowOnlyMostUsedCMDs)
|
||||||
|
|
@ -406,7 +410,7 @@ namespace Flow.Launcher.Plugin.Shell
|
||||||
Title = context.API.GetTranslation("flowlauncher_plugin_cmd_copy"),
|
Title = context.API.GetTranslation("flowlauncher_plugin_cmd_copy"),
|
||||||
Action = c =>
|
Action = c =>
|
||||||
{
|
{
|
||||||
Clipboard.SetDataObject(selectedResult.Title);
|
context.API.CopyToClipboard(selectedResult.Title);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
IcoPath = "Images/copy.png",
|
IcoPath = "Images/copy.png",
|
||||||
|
|
|
||||||
|
|
@ -22,26 +22,6 @@ namespace Flow.Launcher.Plugin.WindowsSettings.Helper
|
||||||
internal static List<Result> GetContextMenu(in Result result, in string assemblyName)
|
internal static List<Result> GetContextMenu(in Result result, in string assemblyName)
|
||||||
{
|
{
|
||||||
return new List<Result>(0);
|
return new List<Result>(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Copy the given text to the clipboard
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="text">The text to copy to the clipboard</param>
|
|
||||||
/// <returns><see langword="true"/>The text successful copy to the clipboard, otherwise <see langword="false"/></returns>
|
|
||||||
private static bool TryToCopyToClipBoard(in string text)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Clipboard.Clear();
|
|
||||||
Clipboard.SetText(text);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
Log.Exception("Can't copy to clipboard", exception, typeof(Main));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue