diff --git a/Flow.Launcher.Infrastructure/NativeMethods.txt b/Flow.Launcher.Infrastructure/NativeMethods.txt
index 0e50420b0..2591506c8 100644
--- a/Flow.Launcher.Infrastructure/NativeMethods.txt
+++ b/Flow.Launcher.Infrastructure/NativeMethods.txt
@@ -57,3 +57,7 @@ LOCALE_TRANSIENT_KEYBOARD1
LOCALE_TRANSIENT_KEYBOARD2
LOCALE_TRANSIENT_KEYBOARD3
LOCALE_TRANSIENT_KEYBOARD4
+
+SHParseDisplayName
+SHOpenFolderAndSelectItems
+CoTaskMemFree
diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
index 024e727ce..0b2b042d4 100644
--- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
+++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs
@@ -50,6 +50,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
public string SelectPrevPageHotkey { get; set; } = $"PageDown";
public string OpenContextMenuHotkey { get; set; } = $"Ctrl+O";
public string SettingWindowHotkey { get; set; } = $"Ctrl+I";
+ public string OpenHistoryHotkey { get; set; } = $"Ctrl+H";
public string CycleHistoryUpHotkey { get; set; } = $"{KeyConstant.Alt} + Up";
public string CycleHistoryDownHotkey { get; set; } = $"{KeyConstant.Alt} + Down";
@@ -173,7 +174,20 @@ namespace Flow.Launcher.Infrastructure.UserSettings
}
}
- public bool ShowHistoryResultsForHomePage { get; set; } = false;
+ private bool _showHistoryResultsForHomePage = false;
+ public bool ShowHistoryResultsForHomePage
+ {
+ get => _showHistoryResultsForHomePage;
+ set
+ {
+ if (_showHistoryResultsForHomePage != value)
+ {
+ _showHistoryResultsForHomePage = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
public int MaxHistoryResultsToShowForHomePage { get; set; } = 5;
public bool AutoRestartAfterChanging { get; set; } = false;
@@ -215,8 +229,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
new()
{
Name = "Files",
- Path = "Files",
- DirectoryArgument = "-select \"%d\"",
+ Path = "Files-Stable",
+ DirectoryArgument = "\"%d\"",
FileArgument = "-select \"%f\""
}
};
@@ -397,29 +411,31 @@ namespace Flow.Launcher.Infrastructure.UserSettings
var list = FixedHotkeys();
// Customizeable hotkeys
- if(!string.IsNullOrEmpty(Hotkey))
+ if (!string.IsNullOrEmpty(Hotkey))
list.Add(new(Hotkey, "flowlauncherHotkey", () => Hotkey = ""));
- if(!string.IsNullOrEmpty(PreviewHotkey))
+ if (!string.IsNullOrEmpty(PreviewHotkey))
list.Add(new(PreviewHotkey, "previewHotkey", () => PreviewHotkey = ""));
- if(!string.IsNullOrEmpty(AutoCompleteHotkey))
+ if (!string.IsNullOrEmpty(AutoCompleteHotkey))
list.Add(new(AutoCompleteHotkey, "autoCompleteHotkey", () => AutoCompleteHotkey = ""));
- if(!string.IsNullOrEmpty(AutoCompleteHotkey2))
+ if (!string.IsNullOrEmpty(AutoCompleteHotkey2))
list.Add(new(AutoCompleteHotkey2, "autoCompleteHotkey", () => AutoCompleteHotkey2 = ""));
- if(!string.IsNullOrEmpty(SelectNextItemHotkey))
+ if (!string.IsNullOrEmpty(SelectNextItemHotkey))
list.Add(new(SelectNextItemHotkey, "SelectNextItemHotkey", () => SelectNextItemHotkey = ""));
- if(!string.IsNullOrEmpty(SelectNextItemHotkey2))
+ if (!string.IsNullOrEmpty(SelectNextItemHotkey2))
list.Add(new(SelectNextItemHotkey2, "SelectNextItemHotkey", () => SelectNextItemHotkey2 = ""));
- if(!string.IsNullOrEmpty(SelectPrevItemHotkey))
+ if (!string.IsNullOrEmpty(SelectPrevItemHotkey))
list.Add(new(SelectPrevItemHotkey, "SelectPrevItemHotkey", () => SelectPrevItemHotkey = ""));
- if(!string.IsNullOrEmpty(SelectPrevItemHotkey2))
+ if (!string.IsNullOrEmpty(SelectPrevItemHotkey2))
list.Add(new(SelectPrevItemHotkey2, "SelectPrevItemHotkey", () => SelectPrevItemHotkey2 = ""));
- if(!string.IsNullOrEmpty(SettingWindowHotkey))
+ if (!string.IsNullOrEmpty(SettingWindowHotkey))
list.Add(new(SettingWindowHotkey, "SettingWindowHotkey", () => SettingWindowHotkey = ""));
- if(!string.IsNullOrEmpty(OpenContextMenuHotkey))
+ if (!string.IsNullOrEmpty(OpenHistoryHotkey))
+ list.Add(new(OpenHistoryHotkey, "OpenHistoryHotkey", () => OpenHistoryHotkey = ""));
+ if (!string.IsNullOrEmpty(OpenContextMenuHotkey))
list.Add(new(OpenContextMenuHotkey, "OpenContextMenuHotkey", () => OpenContextMenuHotkey = ""));
- if(!string.IsNullOrEmpty(SelectNextPageHotkey))
+ if (!string.IsNullOrEmpty(SelectNextPageHotkey))
list.Add(new(SelectNextPageHotkey, "SelectNextPageHotkey", () => SelectNextPageHotkey = ""));
- if(!string.IsNullOrEmpty(SelectPrevPageHotkey))
+ if (!string.IsNullOrEmpty(SelectPrevPageHotkey))
list.Add(new(SelectPrevPageHotkey, "SelectPrevPageHotkey", () => SelectPrevPageHotkey = ""));
if (!string.IsNullOrEmpty(CycleHistoryUpHotkey))
list.Add(new(CycleHistoryUpHotkey, "CycleHistoryUpHotkey", () => CycleHistoryUpHotkey = ""));
@@ -450,7 +466,6 @@ namespace Flow.Launcher.Infrastructure.UserSettings
new("Alt+Home", "HotkeySelectFirstResult"),
new("Alt+End", "HotkeySelectLastResult"),
new("Ctrl+R", "HotkeyRequery"),
- new("Ctrl+H", "ToggleHistoryHotkey"),
new("Ctrl+OemCloseBrackets", "QuickWidthHotkey"),
new("Ctrl+OemOpenBrackets", "QuickWidthHotkey"),
new("Ctrl+OemPlus", "QuickHeightHotkey"),
diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs
index 783ade14e..96d8e925b 100644
--- a/Flow.Launcher.Infrastructure/Win32Helper.cs
+++ b/Flow.Launcher.Infrastructure/Win32Helper.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
+using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
@@ -17,6 +18,7 @@ using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Dwm;
using Windows.Win32.UI.Input.KeyboardAndMouse;
+using Windows.Win32.UI.Shell.Common;
using Windows.Win32.UI.WindowsAndMessaging;
using Point = System.Windows.Point;
using SystemFonts = System.Windows.SystemFonts;
@@ -753,5 +755,36 @@ namespace Flow.Launcher.Infrastructure
}
#endregion
+
+ #region Explorer
+
+ // https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shopenfolderandselectitems
+
+ public static unsafe void OpenFolderAndSelectFile(string filePath)
+ {
+ ITEMIDLIST* pidlFolder = null;
+ ITEMIDLIST* pidlFile = null;
+
+ var folderPath = Path.GetDirectoryName(filePath);
+
+ try
+ {
+ var hrFolder = PInvoke.SHParseDisplayName(folderPath, null, out pidlFolder, 0, null);
+ if (hrFolder.Failed) throw new COMException("Failed to parse folder path", hrFolder);
+
+ var hrFile = PInvoke.SHParseDisplayName(filePath, null, out pidlFile, 0, null);
+ if (hrFile.Failed) throw new COMException("Failed to parse file path", hrFile);
+
+ var hrSelect = PInvoke.SHOpenFolderAndSelectItems(pidlFolder, 1, &pidlFile, 0);
+ if (hrSelect.Failed) throw new COMException("Failed to open folder and select item", hrSelect);
+ }
+ finally
+ {
+ if (pidlFile != null) PInvoke.CoTaskMemFree(pidlFile);
+ if (pidlFolder != null) PInvoke.CoTaskMemFree(pidlFolder);
+ }
+ }
+
+ #endregion
}
}
diff --git a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
index d4eb02a90..cb60251ed 100644
--- a/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
+++ b/Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
@@ -88,6 +88,11 @@ namespace Flow.Launcher.Plugin
/// Show the MainWindow when hiding
///
void ShowMainWindow();
+
+ ///
+ /// Focus the query text box in the main window
+ ///
+ void FocusQueryTextBox();
///
/// Hide MainWindow
diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs
index 942e94470..cedced181 100644
--- a/Flow.Launcher/App.xaml.cs
+++ b/Flow.Launcher/App.xaml.cs
@@ -32,7 +32,7 @@ namespace Flow.Launcher
#region Public Properties
public static IPublicAPI API { get; private set; }
- public static bool Exiting => _mainWindow.CanClose;
+ public static bool LoadingOrExiting => _mainWindow == null || _mainWindow.CanClose;
#endregion
@@ -98,6 +98,10 @@ namespace Flow.Launcher
.AddTransient()
.AddTransient()
.AddTransient()
+ // Use transient instance for dialog view models because
+ // settings will change and we need to recreate them
+ .AddTransient()
+ .AddTransient()
).Build();
Ioc.Default.ConfigureServices(host.Services);
}
diff --git a/Flow.Launcher/HotkeyControl.xaml.cs b/Flow.Launcher/HotkeyControl.xaml.cs
index 262727127..e8961058c 100644
--- a/Flow.Launcher/HotkeyControl.xaml.cs
+++ b/Flow.Launcher/HotkeyControl.xaml.cs
@@ -100,6 +100,7 @@ namespace Flow.Launcher
PreviewHotkey,
OpenContextMenuHotkey,
SettingWindowHotkey,
+ OpenHistoryHotkey,
CycleHistoryUpHotkey,
CycleHistoryDownHotkey,
SelectPrevPageHotkey,
@@ -130,6 +131,7 @@ namespace Flow.Launcher
HotkeyType.PreviewHotkey => _settings.PreviewHotkey,
HotkeyType.OpenContextMenuHotkey => _settings.OpenContextMenuHotkey,
HotkeyType.SettingWindowHotkey => _settings.SettingWindowHotkey,
+ HotkeyType.OpenHistoryHotkey => _settings.OpenHistoryHotkey,
HotkeyType.CycleHistoryUpHotkey => _settings.CycleHistoryUpHotkey,
HotkeyType.CycleHistoryDownHotkey => _settings.CycleHistoryDownHotkey,
HotkeyType.SelectPrevPageHotkey => _settings.SelectPrevPageHotkey,
@@ -166,6 +168,9 @@ namespace Flow.Launcher
case HotkeyType.SettingWindowHotkey:
_settings.SettingWindowHotkey = value;
break;
+ case HotkeyType.OpenHistoryHotkey:
+ _settings.OpenHistoryHotkey = value;
+ break;
case HotkeyType.CycleHistoryUpHotkey:
_settings.CycleHistoryUpHotkey = value;
break;
diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml
index b81c5c9b5..42cfdf3eb 100644
--- a/Flow.Launcher/Languages/ar.xaml
+++ b/Flow.Launcher/Languages/ar.xaml
@@ -371,6 +371,7 @@
اختر مدير الملفات
+ Learn moreيرجى تحديد موقع ملف مدير الملفات الذي تستخدمه وإضافة الحجج حسب الحاجة. يمثل "%d" مسار الدليل المفتوح، ويستخدمه الحقل "الحجة للمجلد" للأوامر التي تفتح أدلة محددة. يمثل "%f" مسار الملف المفتوح، ويستخدمه الحقل "الحجة للملف" للأوامر التي تفتح ملفات محددة.على سبيل المثال، إذا كان مدير الملفات يستخدم أمرًا مثل "totalcmd.exe /A c:\windows" لفتح دليل c:\windows، فإن مسار مدير الملفات سيكون totalcmd.exe، وحجة المجلد ستكون /A "%d". قد تحتاج بعض مديري الملفات مثل QTTabBar فقط إلى توفير مسار، في هذه الحالة استخدم "%d" كمسار مدير الملفات واترك باقي الحقول فارغة.مدير الملفات
@@ -378,6 +379,8 @@
مسار مدير الملفاتحجة للمجلدحجة للملف
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Errorمتصفح الويب الافتراضي
@@ -469,6 +472,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ خطأ
+ An error occurred while opening the folder. {0}
+
يرجى الانتظار...
diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml
index 71c9c8c6b..bfcd92360 100644
--- a/Flow.Launcher/Languages/cs.xaml
+++ b/Flow.Launcher/Languages/cs.xaml
@@ -371,6 +371,7 @@
Vybrat správce souborů
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Správce souborů
@@ -378,6 +379,8 @@
Cesta k správci souborůArgumenty pro složkuArgumenty pro Soubor
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorVýchozí prohlížeč
@@ -469,6 +472,14 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Chyba
+ An error occurred while opening the folder. {0}
+
Počkejte prosím...
diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml
index 37723dc9b..9a4cbc003 100644
--- a/Flow.Launcher/Languages/da.xaml
+++ b/Flow.Launcher/Languages/da.xaml
@@ -371,6 +371,7 @@
Select File Manager
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Filhåndtering
@@ -378,6 +379,8 @@
Sti til filhåndteringArg for mappeArg for fil
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDefault Web Browser
@@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Please wait...
diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml
index 895a2dab6..88c5b84d4 100644
--- a/Flow.Launcher/Languages/de.xaml
+++ b/Flow.Launcher/Languages/de.xaml
@@ -371,6 +371,7 @@
Dateimanager auswählen
+ Learn moreBitte geben Sie den Dateiort des von Ihnen verwendeten Dateimanagers an und fügen Sie bei Bedarf Argumente hinzu. Das „%d“ repräsentiert den dafür zu öffnenden Verzeichnispfad, der vom Feld Arg for Folder und für Befehle zum Öffnen bestimmter Verzeichnisse verwendet wird. Das „%f“ repräsentiert den dafür zu öffnenden Dateipfad, der vom Feld Arg for File und für Befehle zum Öffnen bestimmter Dateien verwendet wird.Zum Beispiel, wenn der Dateimanager einen Befehl wie „totalcmd.exe /A c:\windows“ verwendet, um das Verzeichnis c:\windows zu öffnen, lautet der Dateimanager-Pfad „totalcmd.exe“ und der Arg for Folder „/A %d“. Bestimmte Dateimanager wie QTTabBar kann nur die Angabe eines Pfades erfordern, in diesem Fall verwenden Sie „%d“ als den Dateimanager-Pfad und lassen den Rest der Felder blank.Dateimanager
@@ -378,6 +379,8 @@
Dateimanager-PfadArg For FolderArg For File
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorWebbrowser per Default
@@ -469,6 +472,14 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die
1. Logdatei hochladen: {0}2. Kopieren Sie die Ausnahmemeldung unterhalb
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Fehler
+ An error occurred while opening the folder. {0}
+
Bitte warten Sie ...
diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml
index 2166bdd8c..7f00926f1 100644
--- a/Flow.Launcher/Languages/en.xaml
+++ b/Flow.Launcher/Languages/en.xaml
@@ -384,6 +384,7 @@
Select File Manager
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.File Manager
@@ -391,6 +392,8 @@
File Manager PathArg For FolderArg For File
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDefault Web Browser
@@ -480,6 +483,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Please wait...
diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml
index 902811a56..b73a1ef12 100644
--- a/Flow.Launcher/Languages/es-419.xaml
+++ b/Flow.Launcher/Languages/es-419.xaml
@@ -371,6 +371,7 @@
Seleccionar Gestor de Archivos
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Gestor de Archivos
@@ -378,6 +379,8 @@
Ruta del Gestor de ArchivosArg para CarpetaArg para Archivo
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavegador Web Predeterminado
@@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Por favor espere...
diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml
index 0dc6833af..2b6074f06 100644
--- a/Flow.Launcher/Languages/es.xaml
+++ b/Flow.Launcher/Languages/es.xaml
@@ -371,6 +371,7 @@
Seleccionar administrador de archivos
+ Learn moreEspecifique la ubicación del archivo del administrador de archivos que está utilizando y añada los argumentos necesarios. El argumento "%d" representa la ruta del directorio a abrir, utilizada por el campo Argumentos de la carpeta y por comandos que abren directorios específicos. El "%f" representa la ruta del archivo a abrir, utilizada por el campo Argumentos del archivo y por comandos que abren archivos específicos.Por ejemplo, si el administrador de archivos utiliza un comando como "totalcmd.exe /A c:\windows" para abrir el directorio c:\windows, la ruta del administrador de archivos será totalcmd.exe, y los Argumentos de la carpeta serán /A "%d". Ciertos administradores de archivos como QTTabBar pueden requerir solo la ruta, en este caso utilice "%d" como la ruta del administrador de archivos y deje el resto de los campos en blanco.Administrador de archivos
@@ -378,6 +379,8 @@
Ruta del administrador de archivosArgumentos de la carpetaArgumentos del archivo
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavegador web predeterminado
@@ -469,6 +472,14 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci
1. Subir archivo de registro: {0}2. Copiar el siguiente mensaje de excepción
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Por favor espere...
diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml
index 41fdbaa51..cd6d8c01f 100644
--- a/Flow.Launcher/Languages/fr.xaml
+++ b/Flow.Launcher/Languages/fr.xaml
@@ -370,6 +370,7 @@
Sélectionner le gestionnaire de fichiers
+ Learn moreVeuillez spécifier l'emplacement du fichier de l'explorateur de fichiers que vous utilisez et ajouter des arguments si nécessaire. Le "%d" représente le chemin du répertoire à ouvrir, utilisé par le champ Arg for Folder et pour les commandes ouvrant des répertoires spécifiques. Le "%f" représente le chemin du fichier à ouvrir, utilisé par le champ Arg for File et pour les commandes ouvrant des fichiers spécifiques.Par exemple, si l'explorateur de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin de l'explorateur de fichiers sera totalcmd.exe et l'argument Arg For Folder sera /A "%d"". Certains explorateurs de fichiers comme QTTabBar peuvent simplement nécessiter qu'un chemin soit fourni, dans ce cas, utilisez "%d" comme chemin de l'explorateur de fichiers et laissez le reste des fichiers vides.Gestionnaire de fichiers
@@ -377,6 +378,8 @@
Chemin du gestionnaire de fichiersArguments pour le répertoireArguments pour le fichier
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavigateur web par défaut
@@ -468,6 +471,14 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu
1. Télécharger le fichier journal : {0}2. Copiez le message d’exception ci-dessous
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Erreur
+ An error occurred while opening the folder. {0}
+
Veuillez patienter...
diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml
index 52eaf5e9f..b98c2ec73 100644
--- a/Flow.Launcher/Languages/he.xaml
+++ b/Flow.Launcher/Languages/he.xaml
@@ -370,6 +370,7 @@
בחר מנהל קבצים
+ Learn moreאנא ציין את מיקום הקובץ של מנהל הקבצים שבו אתה משתמש והוסף ארגומנטים כנדרש. "%d" מייצג את נתיב התיקייה שיש לפתוח, ומשמש בשדה ארגומנט לתיקייה ובפקודות לפתיחת תיקיות מסוימות. "%f" מייצג את נתיב הקובץ שיש לפתוח, ומשמש בשדה ארגומנט לקובץ ובפקודות לפתיחת קבצים מסוימים.לדוגמה, אם מנהל הקבצים משתמש בפקודה כגון "totalcmd.exe /A c:\windows" כדי לפתוח את התיקייה c:\windows, נתיב מנהל הקבצים יהיה totalcmd.exe, והארגומנט לתיקייה יהיה /A "%d". מנהלי קבצים מסוימים, כגון QTTabBar, עשויים לדרוש רק ציון נתיב, במקרה כזה השתמש ב-"%d" כנתיב מנהל הקבצים והשאר את שאר השדות ריקים.מנהל קבצים
@@ -377,6 +378,8 @@
נתיב מנהל קבציםארגומנט לתיקייהארגומנט לקובץ
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Errorדפדפן ברירת מחדל
@@ -468,6 +471,14 @@
1. העלה קובץ יומן: {0}2. העתק את הודעת החריגה למטה
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ שגיאה
+ An error occurred while opening the folder. {0}
+
אנא המתן...
diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml
index 1a356ad65..7ea797fa9 100644
--- a/Flow.Launcher/Languages/it.xaml
+++ b/Flow.Launcher/Languages/it.xaml
@@ -371,6 +371,7 @@
Seleziona Gestore File
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Gestore File
@@ -378,6 +379,8 @@
Percorso Gestore FileArg Per CartellaArg Per Cartella
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorBrowser predefinito
@@ -469,6 +472,14 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Attendere prego...
diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml
index 949fe5c99..33673d60f 100644
--- a/Flow.Launcher/Languages/ja.xaml
+++ b/Flow.Launcher/Languages/ja.xaml
@@ -371,6 +371,7 @@
デフォルトのファイルマネージャー
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.File Manager
@@ -378,6 +379,8 @@
File Manager PathArg For FolderArg For File
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Errorデフォルトのウェブブラウザー
@@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Please wait...
diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml
index 9ae2e0195..9e8f9a73b 100644
--- a/Flow.Launcher/Languages/ko.xaml
+++ b/Flow.Launcher/Languages/ko.xaml
@@ -362,6 +362,7 @@
파일관리자 선택
+ Learn more사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다.예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요.파일관리자
@@ -369,6 +370,8 @@
파일관리자 경로폴더경로 인수파일경로 인수
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Error기본 웹 브라우저
@@ -460,6 +463,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
잠시 기다려주세요...
diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml
index 58571a1c4..8d5ac7a94 100644
--- a/Flow.Launcher/Languages/nb.xaml
+++ b/Flow.Launcher/Languages/nb.xaml
@@ -371,6 +371,7 @@
Velg filbehandler
+ Learn moreVennligst spesifiser filplasseringen til filbehandleren du bruker, og legg til argumenter etter behov. "%d" representerer katalogbanen som skal åpnes for, brukt av Arg for mappe-feltet og for kommandoer som åpner spesifikke kataloger. "%f" representerer filbanen som skal åpnes for, brukt av Arg for fil-feltet og for kommandoer som åpner spesifikke filer.For eksempel, hvis filbehandleren bruker en kommando som "totalcmd.exe /A c:windows" for å åpne c:windows-katalogen, vil filbehandlingsbanen bli totalcmd.exe, og Arg For Folder vil være /A "%d". Enkelte filbehandlere som QTTabBar kan bare kreve at en bane oppgis, i dette tilfellet bruker du "%d" som filbehandlingsbane og lar resten av feltene stå tomme.Filbehandler
@@ -378,6 +379,8 @@
Filbehandler stiArg for mappeArg for fil
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorStandard nettleser
@@ -469,6 +472,14 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Feil
+ An error occurred while opening the folder. {0}
+
Vennligst vent...
diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml
index 70a58e322..0f6ad436d 100644
--- a/Flow.Launcher/Languages/nl.xaml
+++ b/Flow.Launcher/Languages/nl.xaml
@@ -371,6 +371,7 @@
Bestandsbeheerder selecteren
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Bestandsbeheerder
@@ -378,6 +379,8 @@
Bestandsbeheerder padArg voor mapArg voor bestand
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorStandaard webbrowser
@@ -469,6 +472,14 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Please wait...
diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml
index 081c8e90e..1397afa25 100644
--- a/Flow.Launcher/Languages/pl.xaml
+++ b/Flow.Launcher/Languages/pl.xaml
@@ -371,6 +371,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Wybierz menedżer plików
+ Learn moreProszę określić lokalizację pliku menedżera plików, którego używasz i dodać argumenty według potrzeb. Symbol "%d" reprezentuje ścieżkę katalogu do otwarcia, używaną w polu Arg dla Folderu oraz dla poleceń otwierających konkretne katalogi. Symbol "%f" reprezentuje ścieżkę pliku do otwarcia, używaną w polu Arg dla Pliku oraz dla poleceń otwierających konkretne pliki.Na przykład, jeśli menedżer plików używa polecenia takiego jak „totalcmd.exe /A c:\windows" do otwarcia katalogu c:\windows, Ścieżka Menedżera Plików będzie totalcmd.exe, a Argument dla Folderu będzie /A "%d". Niektóre menedżery plików, takie jak QTTabBar, mogą wymagać jedynie podania ścieżki; w takim przypadku użyj "%d" jako Ścieżki Menedżera Plików, a pozostałe pola pozostaw puste.Menadżer plików
@@ -378,6 +379,8 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros
Ścieżka menedżera plikówArg dla folderuArg dla pliku
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDomyślna przeglądarka
@@ -469,6 +472,14 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d
1. Prześlij plik dziennika: {0}2. Skopiuj poniższą wiadomość wyjątku
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Błąd
+ An error occurred while opening the folder. {0}
+
Proszę czekać...
diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml
index bd74d1d5f..232134290 100644
--- a/Flow.Launcher/Languages/pt-br.xaml
+++ b/Flow.Launcher/Languages/pt-br.xaml
@@ -371,6 +371,7 @@
Selecione o Gerenciador de Arquivos
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Gerenciador de Arquivos
@@ -378,6 +379,8 @@
Caminho do Gerenciador de ArquivosArg para PastaArg para Arquivo
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorNavegador da Web Padrão
@@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Por favor, aguarde...
diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml
index cf7312956..f98fdf64b 100644
--- a/Flow.Launcher/Languages/pt-pt.xaml
+++ b/Flow.Launcher/Languages/pt-pt.xaml
@@ -369,6 +369,7 @@
Selecione o gestor de ficheiros
+ Saber maisPor favor, especifique a localização do executável do seu gestor de ficheiros e adicione os argumentos necessários. "%d" representa o caminho do diretório a abrir, usado pelo argumento do campo Pasta e para comandos que abrem diretórios específicos. "%f" representa o caminho do ficheiro a abrir, usado pelo argumento do campo Ficheiro e para comandos que abrem ficheiros específicos.Por exemplo, se o gestor de ficheiros utilizar o comando "totalcmd.exe /A c:\windows" para abrir o diretório c:\windows , o caminho para o gestor de ficheiros será totalcmd. exe e os argumentos para a Pasta serão /A "%d". Alguns gestores de ficheiros, como QTTabBar podem apenas exigir que especifique o caminho. Para estes, deve utilizar "%d" como caminho para o gestor de ficheiros e deixar o resto dos campos em branco.Gestor de ficheiros
@@ -376,6 +377,8 @@
Caminho do gestor de ficheirosArgumento para pastaArgumento para ficheiro
+ Não foi possível encontrar o gestor de ficheiros '{0}' em '{1}'. Deseja continuar?
+ Erro no caminho do gestor de ficheirosNavegador web padrão
@@ -467,6 +470,14 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua
1. Carregue o ficheiro de registos: {0}2. Copie a mensagem abaixo
+
+ Erro do gestor de ficheiros
+
+ Não foi possível encontrar o gestor de ficheiros. Verifique a definição 'Gestor de ficheiros personalizado' em Definições -> Geral.
+
+ Erro
+ Ocorreu um erro ao abrir a pasta: {0}
+
Por favor aguarde...
diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml
index 69069c5ec..2a9b5c26b 100644
--- a/Flow.Launcher/Languages/ru.xaml
+++ b/Flow.Launcher/Languages/ru.xaml
@@ -371,6 +371,7 @@
Выбор менеджера файлов
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Файловый менеджер
@@ -378,6 +379,8 @@
Путь к файловому менеджеруАргумент для папкиАргумент для файла
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorБраузер по умолчанию
@@ -469,6 +472,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Ошибка
+ An error occurred while opening the folder. {0}
+
Пожалуйста, подождите...
diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml
index 88ed1c9df..934b0747a 100644
--- a/Flow.Launcher/Languages/sk.xaml
+++ b/Flow.Launcher/Languages/sk.xaml
@@ -371,6 +371,7 @@
Vyberte správcu súborov
+ Viac informáciíZadajte umiestnenie súboru správcu súborov, ktorý používate, a podľa potreby pridajte argumenty. "%d" predstavuje cestu k priečinku, ktorý sa má otvoriť, používa sa v poli Arg pre priečinok a pri príkazoch na otvorenie konkrétnych priečinkov. "%f" predstavuje cestu k súboru, ktorá sa má otvoriť a používa sa v poli Arg pre súbor a pri príkazoch na otvorenie konkrétnych súborov.Napríklad, ak správca súborov používa príkaz ako "totalcmd.exe /A c:\windows" na otvorenie priečinka c:\windows, cesta správcu súborov bude totalcmd.exe a Arg pre priečinok bude /A "%d". Niektorí správcovia súborov, ako napríklad QTTabBar, môžu vyžadovať len zadanie cesty, v tomto prípade použite "%d" ako cestu správcu súborov a zvyšok súborov nechajte prázdny.Správca súborov
@@ -378,6 +379,8 @@
Cesta k správcovi súborovArg. pre priečinokArg. pre súbor
+ Správca súborov '{0}' sa nenachádza na '{1}'. Chcete pokračovať?
+ Chyba v ceste k správcovi súborovPredvolený webový prehliadač
@@ -445,7 +448,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s
ZrušiťResetovaťOdstrániť
- Aktualizovať
+ OKÁnoNiePozadie
@@ -469,6 +472,14 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s
1. Nahrajte súbor logu: {0}2. Skopírujte nižšie uvedenú správu o výnimke
+
+ Chyba správcu súborov
+
+ Zadaný správca súborov sa nenašiel. Skontrolujte nastavenie vlastného správcu súborov v Nastavenia > Všeobecné.
+
+ Chyba
+ Počas otvárania priečinka sa vyskytla chyba. {0}
+
Čakajte, prosím...
diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml
index 4b3e3bc0c..0d2c04513 100644
--- a/Flow.Launcher/Languages/sr.xaml
+++ b/Flow.Launcher/Languages/sr.xaml
@@ -371,6 +371,7 @@
Select File Manager
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.File Manager
@@ -378,6 +379,8 @@
File Manager PathArg For FolderArg For File
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorDefault Web Browser
@@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Please wait...
diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml
index 665694ace..ab9aa31e6 100644
--- a/Flow.Launcher/Languages/tr.xaml
+++ b/Flow.Launcher/Languages/tr.xaml
@@ -371,6 +371,7 @@
Dosya Yöneticisi Seçenekleri
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Dosya Yöneticisi
@@ -378,6 +379,8 @@
Dosya Yöneticisi YoluKlasör AçarkenDosya Açarken
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Errorİnternet Tarayıcı Seçenekleri
@@ -467,6 +470,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
Lütfen bekleyin...
diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml
index b3dc2cd16..f7cc7b0ed 100644
--- a/Flow.Launcher/Languages/uk-UA.xaml
+++ b/Flow.Launcher/Languages/uk-UA.xaml
@@ -371,6 +371,7 @@
Виберіть файловий менеджер
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Файловий менеджер
@@ -378,6 +379,8 @@
Шлях до файлового менеджераАргумент для папкиАргумент для файлу
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorВеб-браузер за замовчуванням
@@ -469,6 +472,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Помилка
+ An error occurred while opening the folder. {0}
+
Будь ласка, зачекайте...
diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml
index b7b56213b..95e43e297 100644
--- a/Flow.Launcher/Languages/vi.xaml
+++ b/Flow.Launcher/Languages/vi.xaml
@@ -373,6 +373,7 @@
Chọn trình quản lý tệp
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.Trình quản lý ngày tháng
@@ -380,6 +381,8 @@
Đường dẫn quản lý tệpĐối số cho thư mụcĐối số cho tệp
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path ErrorTrình duyệt web tiêu chuẩn
@@ -473,6 +476,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Lỗi
+ An error occurred while opening the folder. {0}
+
Cảnh báo nhỏ...
diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml
index bd3142992..f6576070f 100644
--- a/Flow.Launcher/Languages/zh-cn.xaml
+++ b/Flow.Launcher/Languages/zh-cn.xaml
@@ -371,6 +371,7 @@
默认文件管理器
+ Learn more请指定您使用的文件管理器的文件位置并根据需要添加参数。“%d”表示要打开的目录路径,由文件夹字段的参数和打开特定目录的命令使用。“%f”表示要打开的文件路径,由文件字段的参数和打开特定文件的命令使用。例如,如果文件管理器使用诸如“totalcmd.exe /A c:\windows”之类的命令来打开 c:\windows 目录,则文件管理器路径将为 totalcmd.exe,文件夹参数将为 /A "%d"。某些文件管理器(如 QTTabBar)可能只需要提供路径,在本例中,使用“%d”作为文件管理器路径,其余字段留空。文件管理器
@@ -378,6 +379,8 @@
文件管理器路径文件夹路径参数选中文件路径参数
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Error默认浏览器
@@ -469,6 +472,14 @@
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ 错误
+ An error occurred while opening the folder. {0}
+
请稍等...
diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml
index 1a71ae135..42810f590 100644
--- a/Flow.Launcher/Languages/zh-tw.xaml
+++ b/Flow.Launcher/Languages/zh-tw.xaml
@@ -371,6 +371,7 @@
選擇檔案管理器
+ Learn morePlease specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files.For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank.檔案管理器
@@ -378,6 +379,8 @@
檔案管理器路徑資料夾參數檔案參數
+ The file manager '{0}' could not be located at '{1}'. Would you like to continue?
+ File Manager Path Error預設瀏覽器
@@ -469,6 +472,14 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in
1. Upload log file: {0}2. Copy below exception message
+
+ File Manager Error
+
+ The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General.
+
+ Error
+ An error occurred while opening the folder. {0}
+
請稍後...
diff --git a/Flow.Launcher/MainWindow.xaml b/Flow.Launcher/MainWindow.xaml
index 31bc2ba50..9ff38a564 100644
--- a/Flow.Launcher/MainWindow.xaml
+++ b/Flow.Launcher/MainWindow.xaml
@@ -64,10 +64,6 @@
Key="R"
Command="{Binding ReQueryCommand}"
Modifiers="Ctrl" />
-
+
-
+
@@ -373,7 +373,7 @@
-
+
@@ -419,7 +419,7 @@
diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs
index 7c324e7cc..0048c8aa9 100644
--- a/Flow.Launcher/MainWindow.xaml.cs
+++ b/Flow.Launcher/MainWindow.xaml.cs
@@ -113,7 +113,7 @@ namespace Flow.Launcher
Win32Helper.DisableControlBox(this);
}
- private async void OnLoaded(object sender, RoutedEventArgs _)
+ private void OnLoaded(object sender, RoutedEventArgs _)
{
// Check first launch
if (_settings.FirstLaunch)
@@ -283,6 +283,7 @@ namespace Flow.Launcher
InitializeContextMenu();
break;
case nameof(Settings.ShowHomePage):
+ case nameof(Settings.ShowHistoryResultsForHomePage):
if (_viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText))
{
_viewModel.QueryResults();
@@ -294,14 +295,14 @@ namespace Flow.Launcher
// QueryTextBox.Text change detection (modified to only work when character count is 1 or higher)
QueryTextBox.TextChanged += (s, e) => UpdateClockPanelVisibility();
- // Detecting ContextMenu.Visibility changes
+ // Detecting ResultContextMenu.Visibility changes
DependencyPropertyDescriptor
- .FromProperty(VisibilityProperty, typeof(ContextMenu))
- .AddValueChanged(ContextMenu, (s, e) => UpdateClockPanelVisibility());
+ .FromProperty(VisibilityProperty, typeof(ResultListBox))
+ .AddValueChanged(ResultContextMenu, (s, e) => UpdateClockPanelVisibility());
// Detect History.Visibility changes
DependencyPropertyDescriptor
- .FromProperty(VisibilityProperty, typeof(StackPanel))
+ .FromProperty(VisibilityProperty, typeof(ResultListBox))
.AddValueChanged(History, (s, e) => UpdateClockPanelVisibility());
// Initialize query state
@@ -1015,7 +1016,7 @@ namespace Flow.Launcher
private void UpdateClockPanelVisibility()
{
- if (QueryTextBox == null || ContextMenu == null || History == null || ClockPanel == null)
+ if (QueryTextBox == null || ResultContextMenu == null || History == null || ClockPanel == null)
{
return;
}
@@ -1030,20 +1031,20 @@ namespace Flow.Launcher
};
var animationDuration = TimeSpan.FromMilliseconds(animationLength * 2 / 3);
- // ✅ Conditions for showing ClockPanel (No query input & ContextMenu, History are closed)
+ // ✅ Conditions for showing ClockPanel (No query input / ResultContextMenu & History are closed)
var shouldShowClock = QueryTextBox.Text.Length == 0 &&
- ContextMenu.Visibility != Visibility.Visible &&
+ ResultContextMenu.Visibility != Visibility.Visible &&
History.Visibility != Visibility.Visible;
- // ✅ 1. When ContextMenu opens, immediately set Visibility.Hidden (force hide without animation)
- if (ContextMenu.Visibility == Visibility.Visible)
+ // ✅ 1. When ResultContextMenu opens, immediately set Visibility.Hidden (force hide without animation)
+ if (ResultContextMenu.Visibility == Visibility.Visible)
{
_viewModel.ClockPanelVisibility = Visibility.Hidden;
_viewModel.ClockPanelOpacity = 0.0; // Set to 0 in case Opacity animation affects it
return;
}
- // ✅ 2. When ContextMenu is closed, keep it Hidden if there's text in the query (remember previous state)
+ // ✅ 2. When ResultContextMenu is closed, keep it Hidden if there's text in the query (remember previous state)
else if (QueryTextBox.Text.Length > 0)
{
_viewModel.ClockPanelVisibility = Visibility.Hidden;
diff --git a/Flow.Launcher/MessageBoxEx.xaml.cs b/Flow.Launcher/MessageBoxEx.xaml.cs
index a55aeb811..7296ff4ca 100644
--- a/Flow.Launcher/MessageBoxEx.xaml.cs
+++ b/Flow.Launcher/MessageBoxEx.xaml.cs
@@ -22,9 +22,6 @@ namespace Flow.Launcher
InitializeComponent();
}
- public static MessageBoxResult Show(string messageBoxText)
- => Show(messageBoxText, string.Empty, MessageBoxButton.OK, MessageBoxImage.None, MessageBoxResult.OK);
-
public static MessageBoxResult Show(
string messageBoxText,
string caption = "",
@@ -163,6 +160,7 @@ namespace Flow.Launcher
private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
{
if (_button == MessageBoxButton.YesNo)
+ // Follow System.Windows.MessageBox behavior
return;
else if (_button == MessageBoxButton.OK)
_result = MessageBoxResult.OK;
@@ -191,6 +189,7 @@ namespace Flow.Launcher
private void Button_Cancel(object sender, RoutedEventArgs e)
{
if (_button == MessageBoxButton.YesNo)
+ // Follow System.Windows.MessageBox behavior
return;
else if (_button == MessageBoxButton.OK)
_result = MessageBoxResult.OK;
diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs
index 796f65ae6..c06c56039 100644
--- a/Flow.Launcher/PublicAPIInstance.cs
+++ b/Flow.Launcher/PublicAPIInstance.cs
@@ -2,6 +2,7 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Specialized;
+using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -37,6 +38,8 @@ namespace Flow.Launcher
{
public class PublicAPIInstance : IPublicAPI, IRemovable
{
+ private static readonly string ClassName = nameof(PublicAPIInstance);
+
private readonly Settings _settings;
private readonly MainViewModel _mainVM;
@@ -90,6 +93,8 @@ namespace Flow.Launcher
public void ShowMainWindow() => _mainVM.Show();
+ public void FocusQueryTextBox() => _mainVM.FocusQueryTextBox();
+
public void HideMainWindow() => _mainVM.Hide();
public bool IsMainWindowVisible() => _mainVM.MainWindowVisibilityStatus;
@@ -313,45 +318,79 @@ namespace Flow.Launcher
((PluginJsonStorage)_pluginJsonStorages[type]).Save();
}
-
- public void OpenDirectory(string DirectoryPath, string FileNameOrFilePath = null)
+
+ public void OpenDirectory(string directoryPath, string fileNameOrFilePath = null)
{
- using var explorer = new Process();
- var explorerInfo = _settings.CustomExplorer;
- var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant();
- var targetPath = FileNameOrFilePath is null
- ? DirectoryPath
- : Path.IsPathRooted(FileNameOrFilePath)
- ? FileNameOrFilePath
- : Path.Combine(DirectoryPath, FileNameOrFilePath);
+ try
+ {
+ var explorerInfo = _settings.CustomExplorer;
+ var explorerPath = explorerInfo.Path.Trim().ToLowerInvariant();
+ var targetPath = fileNameOrFilePath is null
+ ? directoryPath
+ : Path.IsPathRooted(fileNameOrFilePath)
+ ? fileNameOrFilePath
+ : Path.Combine(directoryPath, fileNameOrFilePath);
- if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer")
- {
- // Windows File Manager
- // We should ignore and pass only the path to Shell to prevent zombie explorer.exe processes
- explorer.StartInfo = new ProcessStartInfo
+ if (Path.GetFileNameWithoutExtension(explorerPath) == "explorer")
{
- FileName = targetPath, // Not explorer, Only path.
- UseShellExecute = true // Must be true to open folder
- };
- }
- else
- {
- // Custom File Manager
- explorer.StartInfo = new ProcessStartInfo
+ // Windows File Manager
+ if (fileNameOrFilePath is null)
+ {
+ // Only Open the directory
+ using var explorer = new Process();
+ explorer.StartInfo = new ProcessStartInfo
+ {
+ FileName = directoryPath,
+ UseShellExecute = true
+ };
+ explorer.Start();
+ }
+ else
+ {
+ // Open the directory and select the file
+ Win32Helper.OpenFolderAndSelectFile(targetPath);
+ }
+ }
+ else
{
- FileName = explorerInfo.Path.Replace("%d", DirectoryPath),
- UseShellExecute = true,
- Arguments = FileNameOrFilePath is null
- ? explorerInfo.DirectoryArgument.Replace("%d", DirectoryPath)
- : explorerInfo.FileArgument
- .Replace("%d", DirectoryPath)
- .Replace("%f", targetPath)
- };
+ // Custom File Manager
+ using var explorer = new Process();
+ explorer.StartInfo = new ProcessStartInfo
+ {
+ FileName = explorerInfo.Path.Replace("%d", directoryPath),
+ UseShellExecute = true,
+ Arguments = fileNameOrFilePath is null
+ ? explorerInfo.DirectoryArgument.Replace("%d", directoryPath)
+ : explorerInfo.FileArgument
+ .Replace("%d", directoryPath)
+ .Replace("%f", targetPath)
+ };
+ explorer.Start();
+ }
+ }
+ catch (Win32Exception ex) when (ex.NativeErrorCode == 2)
+ {
+ LogError(ClassName, "File Manager not found");
+ ShowMsgBox(
+ string.Format(GetTranslation("fileManagerNotFound"), ex.Message),
+ GetTranslation("fileManagerNotFoundTitle"),
+ MessageBoxButton.OK,
+ MessageBoxImage.Error
+ );
+ }
+ catch (Exception ex)
+ {
+ LogException(ClassName, "Failed to open folder", ex);
+ ShowMsgBox(
+ string.Format(GetTranslation("folderOpenError"), ex.Message),
+ GetTranslation("errorTitle"),
+ MessageBoxButton.OK,
+ MessageBoxImage.Error
+ );
}
- explorer.Start();
}
+
private void OpenUri(Uri uri, bool? inPrivate = null)
{
if (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml b/Flow.Launcher/SelectBrowserWindow.xaml
index 4a0928dc2..d51d597b7 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml
+++ b/Flow.Launcher/SelectBrowserWindow.xaml
@@ -6,10 +6,11 @@
xmlns:local="clr-namespace:Flow.Launcher"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.modernwpf.com/2019"
+ xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
Title="{DynamicResource defaultBrowserTitle}"
Width="550"
+ d:DataContext="{d:DesignInstance vm:SelectBrowserViewModel}"
Background="{DynamicResource PopuBGColor}"
- DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
@@ -97,11 +98,11 @@
diff --git a/Flow.Launcher/SelectBrowserWindow.xaml.cs b/Flow.Launcher/SelectBrowserWindow.xaml.cs
index bea5b4352..565b4cbc3 100644
--- a/Flow.Launcher/SelectBrowserWindow.xaml.cs
+++ b/Flow.Launcher/SelectBrowserWindow.xaml.cs
@@ -1,36 +1,18 @@
-using System.Collections.ObjectModel;
-using System.Linq;
-using System.Windows;
+using System.Windows;
using System.Windows.Controls;
-using CommunityToolkit.Mvvm.ComponentModel;
-using Flow.Launcher.Infrastructure.UserSettings;
+using CommunityToolkit.Mvvm.DependencyInjection;
+using Flow.Launcher.ViewModel;
namespace Flow.Launcher
{
- [INotifyPropertyChanged]
public partial class SelectBrowserWindow : Window
{
- private readonly Settings _settings;
+ private readonly SelectBrowserViewModel _viewModel;
- private int selectedCustomBrowserIndex;
-
- public int SelectedCustomBrowserIndex
+ public SelectBrowserWindow()
{
- get => selectedCustomBrowserIndex;
- set
- {
- selectedCustomBrowserIndex = value;
- OnPropertyChanged(nameof(CustomBrowser));
- }
- }
- public ObservableCollection CustomBrowsers { get; set; }
-
- public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
- public SelectBrowserWindow(Settings settings)
- {
- _settings = settings;
- CustomBrowsers = new ObservableCollection(_settings.CustomBrowserList.Select(x => x.Copy()));
- SelectedCustomBrowserIndex = _settings.CustomBrowserIndex;
+ _viewModel = Ioc.Default.GetRequiredService();
+ DataContext = _viewModel;
InitializeComponent();
}
@@ -41,33 +23,20 @@ namespace Flow.Launcher
private void btnDone_Click(object sender, RoutedEventArgs e)
{
- _settings.CustomBrowserList = CustomBrowsers.ToList();
- _settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
- Close();
- }
-
- private void btnAdd_Click(object sender, RoutedEventArgs e)
- {
- CustomBrowsers.Add(new()
+ if (_viewModel.SaveSettings())
{
- Name = "New Profile"
- });
- SelectedCustomBrowserIndex = CustomBrowsers.Count - 1;
- }
-
- private void btnDelete_Click(object sender, RoutedEventArgs e)
- {
- CustomBrowsers.RemoveAt(SelectedCustomBrowserIndex--);
+ Close();
+ }
}
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
- Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
- var result = dlg.ShowDialog();
- if (result == true)
+ var selectedFilePath = _viewModel.SelectFile();
+
+ if (!string.IsNullOrEmpty(selectedFilePath))
{
- TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
- path.Text = dlg.FileName;
+ var path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
+ path.Text = selectedFilePath;
path.Focus();
((Button)sender).Focus();
}
diff --git a/Flow.Launcher/SelectFileManagerWindow.xaml b/Flow.Launcher/SelectFileManagerWindow.xaml
index 0287af9b0..b3b219d1c 100644
--- a/Flow.Launcher/SelectFileManagerWindow.xaml
+++ b/Flow.Launcher/SelectFileManagerWindow.xaml
@@ -6,10 +6,11 @@
xmlns:local="clr-namespace:Flow.Launcher"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ui="http://schemas.modernwpf.com/2019"
+ xmlns:vm="clr-namespace:Flow.Launcher.ViewModel"
Title="{DynamicResource fileManagerWindow}"
Width="600"
+ d:DataContext="{d:DesignInstance vm:SelectFileManagerViewModel}"
Background="{DynamicResource PopuBGColor}"
- DataContext="{Binding RelativeSource={RelativeSource Self}}"
Foreground="{DynamicResource PopupTextColor}"
ResizeMode="NoResize"
SizeToContent="Height"
@@ -73,9 +74,17 @@
+
+
+
+
+
-
-
+
+
@@ -111,7 +120,7 @@
+ Fill="{StaticResource SeparatorForeground}" />
selectedCustomExplorerIndex;
- set
- {
- selectedCustomExplorerIndex = value;
- OnPropertyChanged(nameof(CustomExplorer));
- }
- }
- public ObservableCollection CustomExplorers { get; set; }
-
- public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
- public SelectFileManagerWindow(Settings settings)
- {
- _settings = settings;
- CustomExplorers = new ObservableCollection(_settings.CustomExplorerList.Select(x => x.Copy()));
- SelectedCustomExplorerIndex = _settings.CustomExplorerIndex;
+ _viewModel = Ioc.Default.GetRequiredService();
+ DataContext = _viewModel;
InitializeComponent();
}
@@ -43,33 +24,26 @@ namespace Flow.Launcher
private void btnDone_Click(object sender, RoutedEventArgs e)
{
- _settings.CustomExplorerList = CustomExplorers.ToList();
- _settings.CustomExplorerIndex = SelectedCustomExplorerIndex;
- Close();
- }
-
- private void btnAdd_Click(object sender, RoutedEventArgs e)
- {
- CustomExplorers.Add(new()
+ if (_viewModel.SaveSettings())
{
- Name = "New Profile"
- });
- SelectedCustomExplorerIndex = CustomExplorers.Count - 1;
+ Close();
+ }
}
- private void btnDelete_Click(object sender, RoutedEventArgs e)
+ private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
- CustomExplorers.RemoveAt(SelectedCustomExplorerIndex--);
+ _viewModel.OpenUrl(e.Uri.AbsoluteUri);
+ e.Handled = true;
}
private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
- Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
- var result = dlg.ShowDialog();
- if (result == true)
+ var selectedFilePath = _viewModel.SelectFile();
+
+ if (!string.IsNullOrEmpty(selectedFilePath))
{
- TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
- path.Text = dlg.FileName;
+ var path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("PathTextBox");
+ path.Text = selectedFilePath;
path.Focus();
((Button)sender).Focus();
}
diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
index 840269b03..eac40099b 100644
--- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
+++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
@@ -335,14 +335,14 @@ public partial class SettingsPaneGeneralViewModel : BaseModel
[RelayCommand]
private void SelectFileManager()
{
- var fileManagerChangeWindow = new SelectFileManagerWindow(Settings);
+ var fileManagerChangeWindow = new SelectFileManagerWindow();
fileManagerChangeWindow.ShowDialog();
}
[RelayCommand]
private void SelectBrowser()
{
- var browserWindow = new SelectBrowserWindow(Settings);
+ var browserWindow = new SelectBrowserWindow();
browserWindow.ShowDialog();
}
}
diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
index b1d72ede5..3a8011313 100644
--- a/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
+++ b/Flow.Launcher/SettingPages/Views/SettingsPaneHotkey.xaml
@@ -89,7 +89,10 @@
Title="{DynamicResource ToggleHistoryHotkey}"
Icon=""
Type="Inside">
-
+
-
+
diff --git a/Flow.Launcher/SettingWindow.xaml.cs b/Flow.Launcher/SettingWindow.xaml.cs
index c53a4ea80..c1c0f96a7 100644
--- a/Flow.Launcher/SettingWindow.xaml.cs
+++ b/Flow.Launcher/SettingWindow.xaml.cs
@@ -82,7 +82,7 @@ public partial class SettingWindow
_viewModel.PropertyChanged -= ViewModel_PropertyChanged;
// If app is exiting, settings save is not needed because main window closing event will handle this
- if (App.Exiting) return;
+ if (App.LoadingOrExiting) return;
// Save settings when window is closed
_settings.Save();
App.API.SavePluginSettings();
diff --git a/Flow.Launcher/Themes/Base.xaml b/Flow.Launcher/Themes/Base.xaml
index 1844e25be..e531c17ad 100644
--- a/Flow.Launcher/Themes/Base.xaml
+++ b/Flow.Launcher/Themes/Base.xaml
@@ -479,7 +479,7 @@
+ -->
diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs
index 72a93574b..8c2aeacae 100644
--- a/Flow.Launcher/ViewModel/MainViewModel.cs
+++ b/Flow.Launcher/ViewModel/MainViewModel.cs
@@ -137,6 +137,9 @@ namespace Flow.Launcher.ViewModel
case nameof(Settings.SettingWindowHotkey):
OnPropertyChanged(nameof(SettingWindowHotkey));
break;
+ case nameof(Settings.OpenHistoryHotkey):
+ OnPropertyChanged(nameof(OpenHistoryHotkey));
+ break;
}
};
@@ -265,7 +268,7 @@ namespace Flow.Launcher.ViewModel
if (token.IsCancellationRequested) return;
- if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query,
+ if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(resultsCopy, pair.Metadata, e.Query,
token)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
@@ -791,7 +794,7 @@ namespace Flow.Launcher.ViewModel
public Visibility ProgressBarVisibility { get; set; }
public Visibility MainWindowVisibility { get; set; }
-
+
// This is to be used for determining the visibility status of the main window instead of MainWindowVisibility
// because it is more accurate and reliable representation than using Visibility as a condition check
public bool MainWindowVisibilityStatus { get; set; } = true;
@@ -886,6 +889,7 @@ namespace Flow.Launcher.ViewModel
public string SelectPrevPageHotkey => VerifyOrSetDefaultHotkey(Settings.SelectPrevPageHotkey, "");
public string OpenContextMenuHotkey => VerifyOrSetDefaultHotkey(Settings.OpenContextMenuHotkey, "Ctrl+O");
public string SettingWindowHotkey => VerifyOrSetDefaultHotkey(Settings.SettingWindowHotkey, "Ctrl+I");
+ public string OpenHistoryHotkey => VerifyOrSetDefaultHotkey(Settings.OpenHistoryHotkey, "Ctrl+H");
public string CycleHistoryUpHotkey => VerifyOrSetDefaultHotkey(Settings.CycleHistoryUpHotkey, "Alt+Up");
public string CycleHistoryDownHotkey => VerifyOrSetDefaultHotkey(Settings.CycleHistoryDownHotkey, "Alt+Down");
@@ -1068,7 +1072,7 @@ namespace Flow.Launcher.ViewModel
path = QueryResultsPreviewed() ? Results.SelectedItem?.Result?.Preview.FilePath : string.Empty;
return !string.IsNullOrEmpty(path);
}
-
+
private bool QueryResultsPreviewed()
{
var previewed = PreviewSelectedItem == Results.SelectedItem;
@@ -1278,8 +1282,6 @@ namespace Flow.Launcher.ViewModel
// Update the query's IsReQuery property to true if this is a re-query
query.IsReQuery = isReQuery;
-
-
ICollection plugins = Array.Empty();
if (currentIsHomeQuery)
{
@@ -1310,8 +1312,7 @@ namespace Flow.Launcher.ViewModel
}
}
- var validPluginNames = plugins.Select(x => $"<{x.Metadata.Name}>");
- App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", validPluginNames)}");
+ App.API.LogDebug(ClassName, $"Valid <{plugins.Count}> plugins: {string.Join(" ", plugins.Select(x => $"<{x.Metadata.Name}>"))}");
// Do not wait for performance improvement
/*if (string.IsNullOrEmpty(query.ActionKeyword))
@@ -1339,6 +1340,12 @@ namespace Flow.Launcher.ViewModel
Task[] tasks;
if (currentIsHomeQuery)
{
+ if (ShouldClearExistingResultsForNonQuery(plugins))
+ {
+ Results.Clear();
+ App.API.LogDebug(ClassName, $"Existing results are cleared for non-query");
+ }
+
tasks = plugins.Select(plugin => plugin.Metadata.HomeDisabled switch
{
false => QueryTaskAsync(plugin, currentCancellationToken),
@@ -1430,7 +1437,7 @@ namespace Flow.Launcher.ViewModel
App.API.LogDebug(ClassName, $"Update results for plugin <{plugin.Metadata.Name}>");
// Indicate if to clear existing results so to show only ones from plugins with action keywords
- var shouldClearExistingResults = ShouldClearExistingResults(query, currentIsHomeQuery);
+ var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery);
_lastQuery = query;
_previousIsHomeQuery = currentIsHomeQuery;
@@ -1452,8 +1459,13 @@ namespace Flow.Launcher.ViewModel
App.API.LogDebug(ClassName, $"Update results for history");
+ // Indicate if to clear existing results so to show only ones from plugins with action keywords
+ var shouldClearExistingResults = ShouldClearExistingResultsForQuery(query, currentIsHomeQuery);
+ _lastQuery = query;
+ _previousIsHomeQuery = currentIsHomeQuery;
+
if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, _historyMetadata, query,
- token)))
+ token, reSelect, shouldClearExistingResults)))
{
App.API.LogError(ClassName, "Unable to add item to Result Update Queue");
}
@@ -1539,7 +1551,9 @@ namespace Flow.Launcher.ViewModel
///
/// Determines whether the existing search results should be cleared based on the current query and the previous query type.
- /// This is needed because of the design that treats plugins with action keywords and global action keywords separately. Results are gathered
+ /// This is used to indicate to QueryTaskAsync or QueryHistoryTask whether to clear results. If both QueryTaskAsync and QueryHistoryTask
+ /// are not called then use ShouldClearExistingResultsForNonQuery instead.
+ /// This method needed because of the design that treats plugins with action keywords and global action keywords separately. Results are gathered
/// either from plugins with matching action keywords or global action keyword, but not both. So when the current results are from plugins
/// with a matching action keyword and a new result set comes from a new query with the global action keyword, the existing results need to be cleared,
/// and vice versa. The same applies to home page query results.
@@ -1550,19 +1564,39 @@ namespace Flow.Launcher.ViewModel
/// The current query.
/// A flag indicating if the current query is a home query.
/// True if the existing results should be cleared, false otherwise.
- private bool ShouldClearExistingResults(Query query, bool currentIsHomeQuery)
+ private bool ShouldClearExistingResultsForQuery(Query query, bool currentIsHomeQuery)
{
// If previous or current results are from home query, we need to clear them
if (_previousIsHomeQuery || currentIsHomeQuery)
{
- App.API.LogDebug(ClassName, $"Cleared old results");
+ App.API.LogDebug(ClassName, $"Existing results should be cleared for query");
return true;
}
// If the last and current query are not home query type, we need to check the action keyword
if (_lastQuery?.ActionKeyword != query?.ActionKeyword)
{
- App.API.LogDebug(ClassName, $"Cleared old results");
+ App.API.LogDebug(ClassName, $"Existing results should be cleared for query");
+ return true;
+ }
+
+ return false;
+ }
+
+ ///
+ /// Determines whether existing results should be cleared for non-query calls.
+ /// A non-query call is where QueryTaskAsync and QueryHistoryTask methods are both not called.
+ /// QueryTaskAsync and QueryHistoryTask both handle result updating (clearing if required) so directly calling
+ /// Results.Clear() is not required. However when both are not called, we need to directly clear results and this
+ /// method determines on the condition when clear results should happen.
+ ///
+ /// The collection of plugins to check.
+ /// True if existing results should be cleared, false otherwise.
+ private bool ShouldClearExistingResultsForNonQuery(ICollection plugins)
+ {
+ if (!Settings.ShowHistoryResultsForHomePage && (plugins.Count == 0 || plugins.All(x => x.Metadata.HomeDisabled == true)))
+ {
+ App.API.LogDebug(ClassName, $"Existing results should be cleared for non-query");
return true;
}
@@ -1699,7 +1733,7 @@ namespace Flow.Launcher.ViewModel
public void Show()
{
// When application is exiting, we should not show the main window
- if (App.Exiting) return;
+ if (App.LoadingOrExiting) return;
// When application is exiting, the Application.Current will be null
Application.Current?.Dispatcher.Invoke(() =>
@@ -1896,6 +1930,21 @@ namespace Flow.Launcher.ViewModel
Results.AddResults(resultsForUpdates, token, reSelect);
}
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "")]
+ public void FocusQueryTextBox()
+ {
+ // When application is exiting, the Application.Current will be null
+ Application.Current?.Dispatcher.Invoke(() =>
+ {
+ // When application is exiting, the Application.Current will be null
+ if (Application.Current?.MainWindow is MainWindow window)
+ {
+ window.QueryTextBox.Focus();
+ Keyboard.Focus(window.QueryTextBox);
+ }
+ });
+ }
+
#endregion
#region IDisposable
diff --git a/Flow.Launcher/ViewModel/ResultsViewModel.cs b/Flow.Launcher/ViewModel/ResultsViewModel.cs
index b100bba25..9cd36e5c4 100644
--- a/Flow.Launcher/ViewModel/ResultsViewModel.cs
+++ b/Flow.Launcher/ViewModel/ResultsViewModel.cs
@@ -245,7 +245,10 @@ namespace Flow.Launcher.ViewModel
var newResults = resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings));
if (resultsForUpdates.Any(x => x.shouldClearExistingResults))
+ {
+ App.API.LogDebug("NewResults", $"Existing results are cleared for query");
return newResults.OrderByDescending(rv => rv.Result.Score).ToList();
+ }
return Results.Where(r => r?.Result != null && resultsForUpdates.All(u => u.ID != r.Result.PluginID))
.Concat(newResults)
diff --git a/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
new file mode 100644
index 000000000..1eee6dba5
--- /dev/null
+++ b/Flow.Launcher/ViewModel/SelectBrowserViewModel.cs
@@ -0,0 +1,74 @@
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Windows;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.ViewModel;
+
+public partial class SelectBrowserViewModel : BaseModel
+{
+ private readonly Settings _settings;
+
+ private int selectedCustomBrowserIndex;
+
+ public int SelectedCustomBrowserIndex
+ {
+ get => selectedCustomBrowserIndex;
+ set
+ {
+ selectedCustomBrowserIndex = value;
+ OnPropertyChanged(nameof(CustomBrowser));
+ }
+ }
+
+ public ObservableCollection CustomBrowsers { get; }
+
+ public CustomBrowserViewModel CustomBrowser => CustomBrowsers[SelectedCustomBrowserIndex];
+
+ public SelectBrowserViewModel(Settings settings)
+ {
+ _settings = settings;
+ CustomBrowsers = new ObservableCollection(_settings.CustomBrowserList.Select(x => x.Copy()));
+ SelectedCustomBrowserIndex = _settings.CustomBrowserIndex;
+ }
+
+ public bool SaveSettings()
+ {
+ _settings.CustomBrowserList = CustomBrowsers.ToList();
+ _settings.CustomBrowserIndex = SelectedCustomBrowserIndex;
+ return true;
+ }
+
+ internal string SelectFile()
+ {
+ var dlg = new Microsoft.Win32.OpenFileDialog();
+ var result = dlg.ShowDialog();
+ if (result == true)
+ return dlg.FileName;
+
+ return string.Empty;
+ }
+
+ [RelayCommand]
+ private void Add()
+ {
+ CustomBrowsers.Add(new()
+ {
+ Name = "New Profile"
+ });
+ SelectedCustomBrowserIndex = CustomBrowsers.Count - 1;
+ }
+
+ [RelayCommand]
+ private void Delete()
+ {
+ var currentIndex = SelectedCustomBrowserIndex;
+ if (currentIndex >= 0 && currentIndex < CustomBrowsers.Count)
+ {
+ CustomBrowsers.RemoveAt(currentIndex);
+ SelectedCustomBrowserIndex = currentIndex > 0 ? currentIndex - 1 : 0;
+ }
+ }
+}
diff --git a/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
new file mode 100644
index 000000000..77f004980
--- /dev/null
+++ b/Flow.Launcher/ViewModel/SelectFileManagerViewModel.cs
@@ -0,0 +1,136 @@
+using System;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Windows;
+using CommunityToolkit.Mvvm.Input;
+using Flow.Launcher.Infrastructure.UserSettings;
+using Flow.Launcher.Plugin;
+
+namespace Flow.Launcher.ViewModel;
+
+public partial class SelectFileManagerViewModel : BaseModel
+{
+ private readonly Settings _settings;
+
+ private int selectedCustomExplorerIndex;
+
+ public int SelectedCustomExplorerIndex
+ {
+ get => selectedCustomExplorerIndex;
+ set
+ {
+ if (selectedCustomExplorerIndex != value)
+ {
+ selectedCustomExplorerIndex = value;
+ OnPropertyChanged(nameof(CustomExplorer));
+ }
+ }
+ }
+
+ public ObservableCollection CustomExplorers { get; }
+
+ public CustomExplorerViewModel CustomExplorer => CustomExplorers[SelectedCustomExplorerIndex];
+
+ public SelectFileManagerViewModel(Settings settings)
+ {
+ _settings = settings;
+ CustomExplorers = new ObservableCollection(_settings.CustomExplorerList.Select(x => x.Copy()));
+ SelectedCustomExplorerIndex = _settings.CustomExplorerIndex;
+ }
+
+ public bool SaveSettings()
+ {
+ // Check if the selected file manager path is valid
+ if (!IsFileManagerValid(CustomExplorer.Path))
+ {
+ var result = App.API.ShowMsgBox(
+ string.Format(App.API.GetTranslation("fileManagerPathNotFound"),
+ CustomExplorer.Name, CustomExplorer.Path),
+ App.API.GetTranslation("fileManagerPathError"),
+ MessageBoxButton.YesNo,
+ MessageBoxImage.Warning);
+
+ if (result == MessageBoxResult.No)
+ {
+ return false;
+ }
+ }
+
+ _settings.CustomExplorerList = CustomExplorers.ToList();
+ _settings.CustomExplorerIndex = SelectedCustomExplorerIndex;
+ return true;
+ }
+
+ private static bool IsFileManagerValid(string path)
+ {
+ if (string.Equals(path, "explorer", StringComparison.OrdinalIgnoreCase))
+ return true;
+
+ if (Path.IsPathRooted(path))
+ {
+ return File.Exists(path);
+ }
+
+ try
+ {
+ var process = new Process
+ {
+ StartInfo = new ProcessStartInfo
+ {
+ FileName = "where",
+ Arguments = path,
+ RedirectStandardOutput = true,
+ UseShellExecute = false,
+ CreateNoWindow = true
+ }
+ };
+ process.Start();
+ string output = process.StandardOutput.ReadToEnd();
+ process.WaitForExit();
+
+ return !string.IsNullOrEmpty(output);
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ internal void OpenUrl(string absoluteUri)
+ {
+ App.API.OpenUrl(absoluteUri);
+ }
+
+ internal string SelectFile()
+ {
+ var dlg = new Microsoft.Win32.OpenFileDialog();
+ var result = dlg.ShowDialog();
+ if (result == true)
+ return dlg.FileName;
+
+ return string.Empty;
+ }
+
+ [RelayCommand]
+ private void Add()
+ {
+ CustomExplorers.Add(new()
+ {
+ Name = "New Profile"
+ });
+ SelectedCustomExplorerIndex = CustomExplorers.Count - 1;
+ }
+
+ [RelayCommand]
+ private void Delete()
+ {
+ var currentIndex = SelectedCustomExplorerIndex;
+ if (currentIndex >= 0 && currentIndex < CustomExplorers.Count)
+ {
+ CustomExplorers.RemoveAt(currentIndex);
+ SelectedCustomExplorerIndex = currentIndex > 0 ? currentIndex - 1 : 0;
+ }
+ }
+}
diff --git a/Flow.Launcher/WelcomeWindow.xaml.cs b/Flow.Launcher/WelcomeWindow.xaml.cs
index ef0706765..fe8a63e52 100644
--- a/Flow.Launcher/WelcomeWindow.xaml.cs
+++ b/Flow.Launcher/WelcomeWindow.xaml.cs
@@ -96,7 +96,7 @@ namespace Flow.Launcher
private void Window_Closed(object sender, EventArgs e)
{
// If app is exiting, settings save is not needed because main window closing event will handle this
- if (App.Exiting) return;
+ if (App.LoadingOrExiting) return;
// Save settings when window is closed
_settings.Save();
}
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
index 519141f6c..30e34f62d 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/plugin.json
@@ -4,7 +4,7 @@
"Name": "Browser Bookmarks",
"Description": "Search your browser bookmarks",
"Author": "qianlifeng, Ioannis G.",
- "Version": "3.3.4",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.BrowserBookmark.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
index 99e185928..485babd26 100644
--- a/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Calculator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Calculator",
"Description": "Provide mathematical calculations.(Try 5*3-2 in Flow Launcher)",
"Author": "cxfksword",
- "Version": "3.1.5",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Calculator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
index eabd118fb..896fc9922 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ContextMenu.cs
@@ -199,10 +199,10 @@ namespace Flow.Launcher.Plugin.Explorer
{
if (Context.API.ShowMsgBox(
string.Format(Context.API.GetTranslation("plugin_explorer_delete_folder_link"), record.FullPath),
- string.Empty,
- MessageBoxButton.YesNo,
+ Context.API.GetTranslation("plugin_explorer_deletefilefolder"),
+ MessageBoxButton.OKCancel,
MessageBoxImage.Warning)
- == MessageBoxResult.No)
+ == MessageBoxResult.Cancel)
return false;
if (isFile)
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
index 79f8a5848..eefd6f4eb 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/en.xaml
@@ -33,6 +33,7 @@
SizeDate CreatedDate Modified
+ File AgeDisplay File InfoDate and time formatSort Option:
@@ -166,4 +167,12 @@
Display native context menu (experimental)Below you can specify items you want to include in the context menu, they can be partial (e.g. 'pen wit') or complete ('Open with').Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with').
+
+
+ Today
+ {0} days ago
+ 1 month ago
+ {0} months ago
+ 1 year ago
+ {0} years ago
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
index 3d30bcf29..4f83fc72e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Settings.cs
@@ -27,7 +27,6 @@ namespace Flow.Launcher.Plugin.Explorer
public string ExcludedFileTypes { get; set; } = "";
-
public bool UseLocationAsWorkingDir { get; set; } = false;
public bool ShowInlinedWindowsContextMenu { get; set; } = false;
@@ -66,6 +65,9 @@ namespace Flow.Launcher.Plugin.Explorer
public bool ShowCreatedDateInPreviewPanel { get; set; } = true;
public bool ShowModifiedDateInPreviewPanel { get; set; } = true;
+
+ public bool ShowFileAgeInPreviewPanel { get; set; } = false;
+
public string PreviewPanelDateFormat { get; set; } = "yyyy-MM-dd";
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
index cf9ebd33f..fb33dacab 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs
@@ -169,6 +169,18 @@ namespace Flow.Launcher.Plugin.Explorer.ViewModels
}
}
+ public bool ShowFileAgeInPreviewPanel
+ {
+ get => Settings.ShowFileAgeInPreviewPanel;
+ set
+ {
+ Settings.ShowFileAgeInPreviewPanel = value;
+ OnPropertyChanged();
+ OnPropertyChanged(nameof(ShowPreviewPanelDateTimeChoices));
+ OnPropertyChanged(nameof(PreviewPanelDateTimeChoicesVisibility));
+ }
+ }
+
public string PreviewPanelDateFormat
{
get => Settings.PreviewPanelDateFormat;
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
index e5999da41..4302e721a 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/ExplorerSettings.xaml
@@ -505,6 +505,11 @@
Margin="{StaticResource SettingPanelItemLeftTopBottomMargin}"
Content="{DynamicResource plugin_explorer_previewpanel_display_file_modification_checkbox}"
IsChecked="{Binding ShowModifiedDateInPreviewPanel}" />
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
index aaf1efdc1..e1a957199 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/PreviewPanel.xaml.cs
@@ -1,4 +1,5 @@
-using System.ComponentModel;
+using System;
+using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Runtime.CompilerServices;
@@ -65,22 +66,27 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
if (Settings.ShowCreatedDateInPreviewPanel)
{
- CreatedAt = File
- .GetCreationTime(filePath)
- .ToString(
- $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}",
- CultureInfo.CurrentCulture
- );
+ DateTime createdDate = File.GetCreationTime(filePath);
+ string formattedDate = createdDate.ToString(
+ $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}",
+ CultureInfo.CurrentCulture
+ );
+
+ string result = formattedDate;
+ if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetFileAge(createdDate)} - {formattedDate}";
+ CreatedAt = result;
}
if (Settings.ShowModifiedDateInPreviewPanel)
{
- LastModifiedAt = File
- .GetLastWriteTime(filePath)
- .ToString(
- $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}",
- CultureInfo.CurrentCulture
- );
+ DateTime lastModifiedDate = File.GetLastWriteTime(filePath);
+ string formattedDate = lastModifiedDate.ToString(
+ $"{Settings.PreviewPanelDateFormat} {Settings.PreviewPanelTimeFormat}",
+ CultureInfo.CurrentCulture
+ );
+ string result = formattedDate;
+ if (Settings.ShowFileAgeInPreviewPanel) result = $"{GetFileAge(lastModifiedDate)} - {formattedDate}";
+ LastModifiedAt = result;
}
_ = LoadImageAsync();
@@ -90,6 +96,30 @@ public partial class PreviewPanel : UserControl, INotifyPropertyChanged
{
PreviewImage = await Main.Context.API.LoadImageAsync(FilePath, true).ConfigureAwait(false);
}
+
+ private static string GetFileAge(DateTime fileDateTime)
+ {
+ var now = DateTime.Now;
+ var difference = now - fileDateTime;
+
+ if (difference.TotalDays < 1)
+ return Main.Context.API.GetTranslation("Today");
+ if (difference.TotalDays < 30)
+ return string.Format(Main.Context.API.GetTranslation("DaysAgo"), (int)difference.TotalDays);
+
+ var monthsDiff = (now.Year - fileDateTime.Year) * 12 + now.Month - fileDateTime.Month;
+ if (monthsDiff == 1)
+ return Main.Context.API.GetTranslation("OneMonthAgo");
+ if (monthsDiff < 12)
+ return string.Format(Main.Context.API.GetTranslation("MonthsAgo"), monthsDiff);
+
+ var yearsDiff = now.Year - fileDateTime.Year;
+ if (now.Month < fileDateTime.Month || (now.Month == fileDateTime.Month && now.Day < fileDateTime.Day))
+ yearsDiff--;
+
+ return yearsDiff == 1 ? Main.Context.API.GetTranslation("OneYearAgo") :
+ string.Format(Main.Context.API.GetTranslation("YearsAgo"), yearsDiff);
+ }
public event PropertyChangedEventHandler? PropertyChanged;
diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
index d2440ab61..5eea2646e 100644
--- a/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
@@ -11,7 +11,7 @@
"Name": "Explorer",
"Description": "Find and manage files and folders via Windows Search or Everything",
"Author": "Jeremy Wu",
- "Version": "3.2.4",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
index 2b4870792..7e6a2e613 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginIndicator/plugin.json
@@ -4,7 +4,7 @@
"Name": "Plugin Indicator",
"Description": "Provides plugin action keyword suggestions",
"Author": "qianlifeng",
- "Version": "3.0.7",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.PluginIndicator.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
index df5a2c784..327011ac3 100644
--- a/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/plugin.json
@@ -6,7 +6,7 @@
"Name": "Plugins Manager",
"Description": "Management of installing, uninstalling or updating Flow Launcher plugins",
"Author": "Jeremy Wu",
- "Version": "3.2.4",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.PluginsManager.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
index 956c4b4e1..0379194c4 100644
--- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/plugin.json
@@ -4,7 +4,7 @@
"Name":"Process Killer",
"Description":"Kill running processes from Flow",
"Author":"Flow-Launcher",
- "Version":"3.0.8",
+ "Version": "1.0.0",
"Language":"csharp",
"Website":"https://github.com/Flow-Launcher/Flow.Launcher.Plugin.ProcessKiller",
"IcoPath":"Images\\app.png",
diff --git a/Plugins/Flow.Launcher.Plugin.Program/plugin.json b/Plugins/Flow.Launcher.Plugin.Program/plugin.json
index 5a95e75f4..0316a2397 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Program/plugin.json
@@ -4,7 +4,7 @@
"Name": "Program",
"Description": "Search programs in Flow.Launcher",
"Author": "qianlifeng",
- "Version": "3.3.4",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Program.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
index 0d395c053..2613c770b 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
+++ b/Plugins/Flow.Launcher.Plugin.Shell/Main.cs
@@ -378,11 +378,17 @@ namespace Flow.Launcher.Plugin.Shell
private void OnWinRPressed()
{
+ Context.API.ShowMainWindow();
// show the main window and set focus to the query box
- _ = Task.Run(() =>
+ _ = Task.Run(async () =>
{
- Context.API.ShowMainWindow();
Context.API.ChangeQuery($"{Context.CurrentPluginMetadata.ActionKeywords[0]}{Plugin.Query.TermSeparator}");
+
+ // Win+R is a system-reserved shortcut, and though the plugin intercepts the keyboard event and
+ // shows the main window, Windows continues to process the Win key and briefly reclaims focus.
+ // So we need to wait until the keyboard event processing is completed and then set focus
+ await Task.Delay(50);
+ Context.API.FocusQueryTextBox();
});
}
diff --git a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
index 681e8f751..36f9b8e00 100644
--- a/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Shell/plugin.json
@@ -4,7 +4,7 @@
"Name": "Shell",
"Description": "Provide executing commands from Flow Launcher",
"Author": "qianlifeng",
- "Version": "3.2.5",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
index 90ca264cc..68ce6feb1 100644
--- a/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Sys/plugin.json
@@ -4,7 +4,7 @@
"Name": "System Commands",
"Description": "Provide System related commands. e.g. shutdown,lock, setting etc.",
"Author": "qianlifeng",
- "Version": "3.1.7",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Sys.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.Url/plugin.json b/Plugins/Flow.Launcher.Plugin.Url/plugin.json
index 73d9bff30..9f5576ba9 100644
--- a/Plugins/Flow.Launcher.Plugin.Url/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.Url/plugin.json
@@ -4,7 +4,7 @@
"Name": "URL",
"Description": "Open the typed URL from Flow Launcher",
"Author": "qianlifeng",
- "Version": "3.0.8",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Url.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
index c8b6310a7..b4153feb1 100644
--- a/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.WebSearch/plugin.json
@@ -27,7 +27,7 @@
"Name": "Web Searches",
"Description": "Provide the web search ability",
"Author": "qianlifeng",
- "Version": "3.1.4",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.WebSearch.dll",
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx
index 2e2de0681..91be8a392 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/Properties/Resources.ja-JP.resx
@@ -456,7 +456,7 @@
Area Personalization
-
+ The command to direct start a setting
@@ -1117,7 +1117,7 @@
Area Control Panel (legacy settings)
-
+ password.cpl
@@ -1572,7 +1572,7 @@
Area Control Panel (legacy settings)
-
+ Means The "Windows Version"
diff --git a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json
index 413a555d3..64743b3d8 100644
--- a/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json
+++ b/Plugins/Flow.Launcher.Plugin.WindowsSettings/plugin.json
@@ -4,7 +4,7 @@
"Description": "Search settings inside Control Panel and Settings App",
"Name": "Windows Settings",
"Author": "TobiasSekan",
- "Version": "4.0.12",
+ "Version": "1.0.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.WindowsSettings.dll",
diff --git a/appveyor.yml b/appveyor.yml
index af5aaefdc..fa0b5956b 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,4 +1,4 @@
-version: '1.19.5.{build}'
+version: '1.20.0.{build}'
init:
- ps: |
@@ -26,7 +26,16 @@ image: Visual Studio 2022
platform: Any CPU
configuration: Release
before_build:
-- ps: nuget restore
+- ps: |
+ nuget restore
+
+ $jsonFiles = Get-ChildItem -Path ".\Plugins\*\plugin.json"
+ foreach ($file in $jsonFiles) {
+ $plugin_old_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json
+ (Get-Content $file) -replace '"Version"\s*:\s*".*?"', "`"Version`": `"$env:flowVersion`"" | Set-Content $file
+ $plugin_new_ver = Get-Content $file.FullName -Raw | ConvertFrom-Json
+ Write-Host "Updated" $plugin_old_ver.Name "version from" $plugin_old_ver.Version "to" $plugin_new_ver.Version
+ }
build:
project: Flow.Launcher.sln
verbosity: minimal