Skip to content

Commit b124cc3

Browse files
authored
Merge branch 'dev' into AddTimeFormat
2 parents cf7d512 + 16cc489 commit b124cc3

File tree

3 files changed

+146
-152
lines changed

3 files changed

+146
-152
lines changed

Flow.Launcher/ViewModel/MainViewModel.cs

Lines changed: 130 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ public MainViewModel(Settings settings)
7878
_userSelectedRecord = _userSelectedRecordStorage.Load();
7979
_topMostRecord = _topMostRecordStorage.Load();
8080

81-
InitializeKeyCommands();
8281

8382
ContextMenu = new ResultsViewModel(Settings)
8483
{
@@ -168,160 +167,164 @@ private void RegisterResultsUpdatedEvent()
168167
}
169168
}
170169

170+
[RelayCommand]
171+
private async Task ReloadPluginDataAsync()
172+
{
173+
Hide();
171174

172-
173-
private void InitializeKeyCommands()
175+
await PluginManager.ReloadDataAsync().ConfigureAwait(false);
176+
Notification.Show(InternationalizationManager.Instance.GetTranslation("success"), InternationalizationManager.Instance.GetTranslation("completedSuccessfully"));
177+
}
178+
[RelayCommand]
179+
private void LoadHistory()
174180
{
175-
EscCommand = new RelayCommand(_ =>
181+
if (SelectedIsFromQueryResults())
176182
{
177-
if (!SelectedIsFromQueryResults())
178-
{
179-
SelectedResults = Results;
180-
}
181-
else
182-
{
183-
Hide();
184-
}
185-
});
186-
187-
ClearQueryCommand = new RelayCommand(_ =>
183+
SelectedResults = History;
184+
History.SelectedIndex = _history.Items.Count - 1;
185+
}
186+
else
188187
{
189-
if (!string.IsNullOrEmpty(QueryText))
190-
{
191-
ChangeQueryText(string.Empty);
192-
193-
// Push Event to UI SystemQuery has changed
194-
//OnPropertyChanged(nameof(SystemQueryText));
195-
}
196-
});
197-
198-
SelectNextItemCommand = new RelayCommand(_ => { SelectedResults.SelectNextResult(); });
199-
200-
SelectPrevItemCommand = new RelayCommand(_ => { SelectedResults.SelectPrevResult(); });
201-
202-
SelectNextPageCommand = new RelayCommand(_ => { SelectedResults.SelectNextPage(); });
188+
SelectedResults = Results;
189+
}
190+
}
191+
[RelayCommand]
192+
private void LoadContextMenu()
193+
{
194+
if (SelectedIsFromQueryResults())
195+
{
196+
// When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing
197+
// i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing
198+
if (SelectedResults.SelectedItem != null)
199+
SelectedResults = ContextMenu;
200+
}
201+
else
202+
{
203+
SelectedResults = Results;
204+
}
205+
}
206+
[RelayCommand]
207+
private void Backspace(object index)
208+
{
209+
var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins);
203210

204-
SelectPrevPageCommand = new RelayCommand(_ => { SelectedResults.SelectPrevPage(); });
211+
// GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string
212+
var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\'));
205213

206-
SelectFirstResultCommand = new RelayCommand(_ => SelectedResults.SelectFirstResult());
214+
var actionKeyword = string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : $"{query.ActionKeyword} ";
207215

208-
StartHelpCommand = new RelayCommand(_ =>
209-
{
210-
PluginManager.API.OpenUrl("https://github.com/Flow-Launcher/Flow.Launcher/wiki/Flow-Launcher/");
211-
});
212-
OpenSettingCommand = new RelayCommand(_ => { App.API.OpenSettingDialog(); });
213-
OpenResultCommand = new AsyncRelayCommand(async _ =>
216+
ChangeQueryText($"{actionKeyword}{path}");
217+
}
218+
[RelayCommand]
219+
private void AutocompleteQuery()
220+
{
221+
var result = SelectedResults.SelectedItem?.Result;
222+
if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty.
214223
{
215-
var results = SelectedResults;
224+
var autoCompleteText = result.Title;
216225

217-
var result = results.SelectedItem?.Result;
218-
if (result == null)
226+
if (!string.IsNullOrEmpty(result.AutoCompleteText))
219227
{
220-
return;
228+
autoCompleteText = result.AutoCompleteText;
221229
}
222-
var hideWindow = await result.ExecuteAsync(new ActionContext
223-
{
224-
SpecialKeyState = GlobalHotkey.CheckModifiers()
225-
}).ConfigureAwait(false);
226-
227-
if (hideWindow)
230+
else if (!string.IsNullOrEmpty(SelectedResults.SelectedItem?.QuerySuggestionText))
228231
{
229-
Hide();
232+
autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText;
230233
}
231234

232-
if (SelectedIsFromQueryResults())
235+
var specialKeyState = GlobalHotkey.CheckModifiers();
236+
if (specialKeyState.ShiftPressed)
233237
{
234-
_userSelectedRecord.Add(result);
235-
_history.Add(result.OriginQuery.RawQuery);
238+
autoCompleteText = result.SubTitle;
236239
}
237-
else
238-
{
239-
SelectedResults = Results;
240-
}
241-
});
242240

243-
AutocompleteQueryCommand = new RelayCommand(_ =>
241+
ChangeQueryText(autoCompleteText);
242+
}
243+
}
244+
[RelayCommand]
245+
private async Task OpenResultAsync(string index)
246+
{
247+
var results = SelectedResults;
248+
if (index is not null)
249+
{
250+
results.SelectedIndex = int.Parse(index);
251+
}
252+
var result = results.SelectedItem?.Result;
253+
if (result == null)
244254
{
245-
var result = SelectedResults.SelectedItem?.Result;
246-
if (result != null && SelectedIsFromQueryResults()) // SelectedItem returns null if selection is empty.
255+
return;
256+
}
257+
var hideWindow = await result.ExecuteAsync(new ActionContext
247258
{
248-
var autoCompleteText = result.Title;
249-
250-
if (!string.IsNullOrEmpty(result.AutoCompleteText))
251-
{
252-
autoCompleteText = result.AutoCompleteText;
253-
}
254-
else if (!string.IsNullOrEmpty(SelectedResults.SelectedItem?.QuerySuggestionText))
255-
{
256-
autoCompleteText = SelectedResults.SelectedItem.QuerySuggestionText;
257-
}
258-
259-
var specialKeyState = GlobalHotkey.CheckModifiers();
260-
if (specialKeyState.ShiftPressed)
261-
{
262-
autoCompleteText = result.SubTitle;
263-
}
264-
265-
ChangeQueryText(autoCompleteText);
266-
}
267-
});
259+
SpecialKeyState = GlobalHotkey.CheckModifiers()
260+
})
261+
.ConfigureAwait(false);
268262

269-
BackspaceCommand = new RelayCommand(index =>
263+
if (hideWindow)
270264
{
271-
var query = QueryBuilder.Build(QueryText.Trim(), PluginManager.NonGlobalPlugins);
265+
Hide();
266+
}
272267

273-
// GetPreviousExistingDirectory does not require trailing '\', otherwise will return empty string
274-
var path = FilesFolders.GetPreviousExistingDirectory((_) => true, query.Search.TrimEnd('\\'));
268+
if (SelectedIsFromQueryResults())
269+
{
270+
_userSelectedRecord.Add(result);
271+
_history.Add(result.OriginQuery.RawQuery);
272+
}
273+
else
274+
{
275+
SelectedResults = Results;
276+
}
277+
}
278+
[RelayCommand]
279+
private void OpenSetting()
280+
{
281+
App.API.OpenSettingDialog();
282+
}
275283

276-
var actionKeyword = string.IsNullOrEmpty(query.ActionKeyword) ? string.Empty : $"{query.ActionKeyword} ";
284+
[RelayCommand]
285+
private void SelectHelp()
286+
{
287+
PluginManager.API.OpenUrl("https://www.flowlauncher.com/docs/#/usage-tips");
288+
}
277289

278-
ChangeQueryText($"{actionKeyword}{path}");
279-
});
290+
[RelayCommand]
291+
private void SelectFirstResult()
292+
{
293+
SelectedResults.SelectFirstResult();
294+
}
295+
[RelayCommand]
296+
private void SelectPrevPage()
297+
{
298+
SelectedResults.SelectPrevPage();
299+
}
280300

281-
LoadContextMenuCommand = new RelayCommand(_ =>
282-
{
283-
if (SelectedIsFromQueryResults())
284-
{
285-
// When switch to ContextMenu from QueryResults, but no item being chosen, should do nothing
286-
// i.e. Shift+Enter/Ctrl+O right after Alt + Space should do nothing
287-
if (SelectedResults.SelectedItem != null)
288-
SelectedResults = ContextMenu;
289-
}
290-
else
291-
{
292-
SelectedResults = Results;
293-
}
294-
});
301+
[RelayCommand]
302+
private void SelectNextPage()
303+
{
304+
SelectedResults.SelectNextPage();
305+
}
306+
[RelayCommand]
307+
private void SelectPrevItem()
308+
{
309+
SelectedResults.SelectPrevResult();
310+
}
311+
[RelayCommand]
312+
private void SelectNextItem()
313+
{
314+
SelectedResults.SelectNextResult();
315+
}
295316

296-
LoadHistoryCommand = new RelayCommand(_ =>
317+
[RelayCommand]
318+
private void Esc()
319+
{
320+
if (!SelectedIsFromQueryResults())
297321
{
298-
if (SelectedIsFromQueryResults())
299-
{
300-
SelectedResults = History;
301-
History.SelectedIndex = _history.Items.Count - 1;
302-
}
303-
else
304-
{
305-
SelectedResults = Results;
306-
}
307-
});
308-
309-
ReloadPluginDataCommand = new RelayCommand(_ =>
322+
SelectedResults = Results;
323+
}
324+
else
310325
{
311326
Hide();
312-
313-
_ = PluginManager
314-
.ReloadDataAsync()
315-
.ContinueWith(_ =>
316-
Application.Current.Dispatcher.Invoke(() =>
317-
{
318-
Notification.Show(
319-
InternationalizationManager.Instance.GetTranslation("success"),
320-
InternationalizationManager.Instance.GetTranslation("completedSuccessfully")
321-
);
322-
}), TaskScheduler.Default)
323-
.ConfigureAwait(false);
324-
});
327+
}
325328
}
326329

327330
#endregion
@@ -418,6 +421,7 @@ private void DecreaseMaxResult()
418421
/// but we don't want to move cursor to end when query is updated from TextBox
419422
/// </summary>
420423
/// <param name="queryText"></param>
424+
/// <param name="reQuery">Force query even when Query Text doesn't change</param>
421425
public void ChangeQueryText(string queryText, bool reQuery = false)
422426
{
423427
if (QueryText != queryText)
@@ -496,25 +500,6 @@ public double MainWindowWidth
496500

497501
public string PluginIconPath { get; set; } = null;
498502

499-
public ICommand EscCommand { get; set; }
500-
public ICommand BackspaceCommand { get; set; }
501-
public ICommand SelectNextItemCommand { get; set; }
502-
public ICommand SelectPrevItemCommand { get; set; }
503-
public ICommand SelectNextPageCommand { get; set; }
504-
public ICommand SelectPrevPageCommand { get; set; }
505-
public ICommand SelectFirstResultCommand { get; set; }
506-
public ICommand StartHelpCommand { get; set; }
507-
public ICommand LoadContextMenuCommand { get; set; }
508-
public ICommand LoadHistoryCommand { get; set; }
509-
public ICommand OpenResultCommand { get; set; }
510-
public ICommand OpenSettingCommand { get; set; }
511-
public ICommand ReloadPluginDataCommand { get; set; }
512-
public ICommand ClearQueryCommand { get; private set; }
513-
514-
public ICommand CopyToClipboard { get; set; }
515-
516-
public ICommand AutocompleteQueryCommand { get; set; }
517-
518503
public string OpenResultCommandModifiers { get; private set; }
519504

520505
public string Image => Constant.QueryTextBoxIconImagePath;

Plugins/Flow.Launcher.Plugin.Program/Programs/ShellLinkHelper.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ public class ShellLink
9797
}
9898

9999
// To initialize the app description
100-
public String description = String.Empty;
101-
100+
public string description = string.Empty;
101+
public string arguments = string.Empty;
102102

103103
// Retrieve the target path using Shell Link
104104
public string retrieveTargetPath(string path)
@@ -122,13 +122,16 @@ public string retrieveTargetPath(string path)
122122
buffer = new StringBuilder(MAX_PATH);
123123
((IShellLinkW)link).GetDescription(buffer, MAX_PATH);
124124
description = buffer.ToString();
125+
126+
buffer.Clear();
127+
((IShellLinkW)link).GetArguments(buffer, MAX_PATH);
128+
arguments = buffer.ToString();
125129
}
126130

127131
// To release unmanaged memory
128132
Marshal.ReleaseComObject(link);
129133

130134
return target;
131-
132135
}
133136
}
134-
}
137+
}

Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ public class Win32 : IProgram, IEquatable<Win32>
2626
public string UniqueIdentifier { get => _uid; set => _uid = value == null ? string.Empty : value.ToLowerInvariant(); } // For path comparison
2727
public string IcoPath { get; set; }
2828
/// <summary>
29-
/// Path of the file. It's the path of .lnk or .url for .lnk and .url.
29+
/// Path of the file. It's the path of .lnk and .url for .lnk and .url files.
3030
/// </summary>
3131
public string FullPath { get; set; }
3232
/// <summary>
33-
/// Path of the excutable for .lnk, or the URL for .url.
33+
/// Path of the excutable for .lnk, or the URL for .url. Arguments are included if any.
3434
/// </summary>
3535
public string LnkResolvedPath { get; set; }
3636
/// <summary>
@@ -185,7 +185,7 @@ public List<Result> ContextMenus(IPublicAPI api)
185185
{
186186
var info = new ProcessStartInfo
187187
{
188-
FileName = ExecutablePath,
188+
FileName = FullPath,
189189
WorkingDirectory = ParentDirectory,
190190
Verb = "runas",
191191
UseShellExecute = true
@@ -275,6 +275,12 @@ private static Win32 LnkProgram(string path)
275275
program.LnkResolvedPath = Path.GetFullPath(target);
276276
program.ExecutableName = Path.GetFileName(target);
277277

278+
var args = _helper.arguments;
279+
if(!string.IsNullOrEmpty(args))
280+
{
281+
program.LnkResolvedPath += " " + args;
282+
}
283+
278284
var description = _helper.description;
279285
if (!string.IsNullOrEmpty(description))
280286
{

0 commit comments

Comments
 (0)