Skip to content

Commit af7539a

Browse files
Merge branch 'dev' into dev
2 parents c8dfd56 + b80b3ed commit af7539a

File tree

14 files changed

+246
-54
lines changed

14 files changed

+246
-54
lines changed

Flow.Launcher.Infrastructure/Image/ImageLoader.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ private static BitmapImage LoadFullImage(string path)
252252
image.BeginInit();
253253
image.CacheOption = BitmapCacheOption.OnLoad;
254254
image.UriSource = new Uri(path);
255+
image.CreateOptions = BitmapCreateOptions.IgnoreColorProfile;
255256
image.EndInit();
256257
return image;
257258
}

Flow.Launcher.Infrastructure/UserSettings/Settings.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ public bool HideNotifyIcon
199199
}
200200
public bool LeaveCmdOpen { get; set; }
201201
public bool HideWhenDeactive { get; set; } = true;
202-
public bool RememberLastLaunchLocation { get; set; }
202+
public SearchWindowPositions SearchWindowPosition { get; set; } = SearchWindowPositions.MouseScreenCenter;
203203
public bool IgnoreHotkeysOnFullscreen { get; set; }
204204

205205
public HttpProxy Proxy { get; set; } = new HttpProxy();
@@ -225,4 +225,12 @@ public enum ColorSchemes
225225
Light,
226226
Dark
227227
}
228+
public enum SearchWindowPositions
229+
{
230+
RememberLastLaunchLocation,
231+
MouseScreenCenter,
232+
MouseScreenCenterTop,
233+
MouseScreenLeftTop,
234+
MouseScreenRightTop
235+
}
228236
}

Flow.Launcher.Test/Flow.Launcher.Test.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
<ItemGroup>
5151
<PackageReference Include="Moq" Version="4.16.1" />
5252
<PackageReference Include="nunit" Version="3.13.2" />
53-
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0">
53+
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1">
5454
<PrivateAssets>all</PrivateAssets>
5555
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5656
</PackageReference>

Flow.Launcher/Flow.Launcher.csproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
</ItemGroup>
8484

8585
<ItemGroup>
86+
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.0.0" />
8687
<PackageReference Include="Fody" Version="6.5.4">
8788
<PrivateAssets>all</PrivateAssets>
8889
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@@ -114,4 +115,14 @@
114115
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
115116
<Exec Command="taskkill /f /fi &quot;IMAGENAME eq Flow.Launcher.exe&quot;" />
116117
</Target>
118+
119+
<Target Name="RemoveDuplicateAnalyzers" BeforeTargets="CoreCompile">
120+
<!-- Work around https://github.com/dotnet/wpf/issues/6792 -->
121+
122+
<ItemGroup>
123+
<FilteredAnalyzer Include="@(Analyzer->Distinct())" />
124+
<Analyzer Remove="@(Analyzer)" />
125+
<Analyzer Include="@(FilteredAnalyzer)" />
126+
</ItemGroup>
127+
</Target>
117128
</Project>
-1.6 KB
Loading

Flow.Launcher/Languages/en.xaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
<system:String x:Key="textTitle">Text</system:String>
2424
<system:String x:Key="GameMode">Game Mode</system:String>
2525
<system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
26+
<system:String x:Key="PositionReset">Position Reset</system:String>
27+
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
2628

2729
<!-- Setting General -->
2830
<system:String x:Key="flowlauncher_settings">Flow Launcher Settings</system:String>
@@ -33,14 +35,21 @@
3335
<system:String x:Key="setAutoStartFailed">Error setting launch on startup</system:String>
3436
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</system:String>
3537
<system:String x:Key="dontPromptUpdateMsg">Do not show new version notifications</system:String>
38+
<system:String x:Key="SearchWindowPosition">Search Window Position</system:String>
3639
<system:String x:Key="rememberLastLocation">Remember last launch location</system:String>
40+
<system:String x:Key="SearchWindowPositionRememberLastLaunchLocation">Remember Last Location</system:String>
41+
<system:String x:Key="SearchWindowPositionMouseScreenCenter">Mouse Focused Screen - Center</system:String>
42+
<system:String x:Key="SearchWindowPositionMouseScreenCenterTop">Mouse Focused Screen - Center Top</system:String>
43+
<system:String x:Key="SearchWindowPositionMouseScreenLeftTop">Mouse Focused Screen - Left Top</system:String>
44+
<system:String x:Key="SearchWindowPositionMouseScreenRightTop">Mouse Focused Screen - Right Top</system:String>
3745
<system:String x:Key="language">Language</system:String>
3846
<system:String x:Key="lastQueryMode">Last Query Style</system:String>
3947
<system:String x:Key="lastQueryModeToolTip">Show/Hide previous results when Flow Launcher is reactivated.</system:String>
4048
<system:String x:Key="LastQueryPreserved">Preserve Last Query</system:String>
4149
<system:String x:Key="LastQuerySelected">Select last Query</system:String>
4250
<system:String x:Key="LastQueryEmpty">Empty last Query</system:String>
4351
<system:String x:Key="maxShowResults">Maximum results shown</system:String>
52+
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String>
4453
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignore hotkeys in fullscreen mode</system:String>
4554
<system:String x:Key="ignoreHotkeysOnFullscreenToolTip">Disable Flow Launcher activation when a full screen application is active (Recommended for games).</system:String>
4655
<system:String x:Key="defaultFileManager">Default File Manager</system:String>
@@ -131,6 +140,7 @@
131140
<system:String x:Key="queryWindowShadowEffect">Query window shadow effect</system:String>
132141
<system:String x:Key="shadowEffectCPUUsage">Shadow effect has a substantial usage of GPU. Not recommended if your computer performance is limited.</system:String>
133142
<system:String x:Key="windowWidthSize">Window Width Size</system:String>
143+
<system:String x:Key="windowWidthSizeToolTip">You can also quickly adjust this by using Ctrl+[ and Ctrl+].</system:String>
134144
<system:String x:Key="useGlyphUI">Use Segoe Fluent Icons</system:String>
135145
<system:String x:Key="useGlyphUIEffect">Use Segoe Fluent Icons for query results where supported</system:String>
136146

Flow.Launcher/MainWindow.xaml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@
8484
Modifiers="Ctrl" />
8585
<KeyBinding Key="Right" Command="{Binding LoadContextMenuCommand}" />
8686
<KeyBinding Key="Left" Command="{Binding EscCommand}" />
87+
<KeyBinding
88+
Key="OemCloseBrackets"
89+
Command="{Binding IncreaseWidthCommand}"
90+
Modifiers="Control" />
91+
<KeyBinding
92+
Key="OemOpenBrackets"
93+
Command="{Binding DecreaseWidthCommand}"
94+
Modifiers="Control" />
95+
<KeyBinding
96+
Key="OemPlus"
97+
Command="{Binding IncreaseMaxResultCommand}"
98+
Modifiers="Control" />
99+
<KeyBinding
100+
Key="OemMinus"
101+
Command="{Binding DecreaseMaxResultCommand}"
102+
Modifiers="Control" />
87103
<KeyBinding
88104
Key="H"
89105
Command="{Binding LoadHistoryCommand}"
@@ -177,9 +193,9 @@
177193
AllowDrop="True"
178194
Background="Transparent"
179195
PreviewDragOver="OnPreviewDragOver"
196+
PreviewKeyUp="QueryTextBox_KeyUp"
180197
Style="{DynamicResource QueryBoxStyle}"
181198
Text="{Binding QueryText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
182-
PreviewKeyUp="QueryTextBox_KeyUp"
183199
Visibility="Visible">
184200
<TextBox.CommandBindings>
185201
<CommandBinding Command="ApplicationCommands.Copy" Executed="OnCopy" />

Flow.Launcher/MainWindow.xaml.cs

Lines changed: 70 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ private void OnLoaded(object sender, RoutedEventArgs _)
9191
InitializeColorScheme();
9292
WindowsInteropHelper.DisableControlBox(this);
9393
InitProgressbarAnimation();
94+
InitializePosition();
9495
// since the default main window visibility is visible
9596
// so we need set focus during startup
9697
QueryTextBox.Focus();
@@ -108,7 +109,6 @@ private void OnLoaded(object sender, RoutedEventArgs _)
108109
animationSound.Position = TimeSpan.Zero;
109110
animationSound.Play();
110111
}
111-
112112
UpdatePosition();
113113
Activate();
114114
QueryTextBox.Focus();
@@ -161,6 +161,7 @@ private void OnLoaded(object sender, RoutedEventArgs _)
161161
_viewModel.QueryTextCursorMovedToEnd = false;
162162
}
163163
break;
164+
164165
}
165166
};
166167
_settings.PropertyChanged += (o, e) =>
@@ -176,21 +177,40 @@ private void OnLoaded(object sender, RoutedEventArgs _)
176177
case nameof(Settings.Hotkey):
177178
UpdateNotifyIconText();
178179
break;
180+
case nameof(Settings.WindowLeft):
181+
Left = _settings.WindowLeft;
182+
break;
183+
case nameof(Settings.WindowTop):
184+
Top = _settings.WindowTop;
185+
break;
179186
}
180187
};
181188
}
182189

183190
private void InitializePosition()
184191
{
185-
if (_settings.RememberLastLaunchLocation)
186-
{
187-
Top = _settings.WindowTop;
188-
Left = _settings.WindowLeft;
189-
}
190-
else
192+
switch (_settings.SearchWindowPosition)
191193
{
192-
Left = WindowLeft();
193-
Top = WindowTop();
194+
case SearchWindowPositions.RememberLastLaunchLocation:
195+
Top = _settings.WindowTop;
196+
Left = _settings.WindowLeft;
197+
break;
198+
case SearchWindowPositions.MouseScreenCenter:
199+
Left = HorizonCenter();
200+
Top = VerticalCenter();
201+
break;
202+
case SearchWindowPositions.MouseScreenCenterTop:
203+
Left = HorizonCenter();
204+
Top = 10;
205+
break;
206+
case SearchWindowPositions.MouseScreenLeftTop:
207+
Left = 10;
208+
Top = 10;
209+
break;
210+
case SearchWindowPositions.MouseScreenRightTop:
211+
Left = HorizonRight();
212+
Top = 10;
213+
break;
194214
}
195215
}
196216

@@ -199,8 +219,9 @@ private void UpdateNotifyIconText()
199219
var menu = contextMenu;
200220
((MenuItem)menu.Items[1]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayOpen") + " (" + _settings.Hotkey + ")";
201221
((MenuItem)menu.Items[2]).Header = InternationalizationManager.Instance.GetTranslation("GameMode");
202-
((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
203-
((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
222+
((MenuItem)menu.Items[3]).Header = InternationalizationManager.Instance.GetTranslation("PositionReset");
223+
((MenuItem)menu.Items[4]).Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings");
224+
((MenuItem)menu.Items[5]).Header = InternationalizationManager.Instance.GetTranslation("iconTrayExit");
204225
}
205226

206227
private void InitializeNotifyIcon()
@@ -226,6 +247,10 @@ private void InitializeNotifyIcon()
226247
{
227248
Header = InternationalizationManager.Instance.GetTranslation("GameMode")
228249
};
250+
var positionreset = new MenuItem
251+
{
252+
Header = InternationalizationManager.Instance.GetTranslation("PositionReset")
253+
};
229254
var settings = new MenuItem
230255
{
231256
Header = InternationalizationManager.Instance.GetTranslation("iconTraySettings")
@@ -237,12 +262,15 @@ private void InitializeNotifyIcon()
237262

238263
open.Click += (o, e) => _viewModel.ToggleFlowLauncher();
239264
gamemode.Click += (o, e) => ToggleGameMode();
265+
positionreset.Click += (o, e) => PositionReset();
240266
settings.Click += (o, e) => App.API.OpenSettingDialog();
241267
exit.Click += (o, e) => Close();
242268
contextMenu.Items.Add(header);
243269
contextMenu.Items.Add(open);
244270
gamemode.ToolTip = InternationalizationManager.Instance.GetTranslation("GameModeToolTip");
271+
positionreset.ToolTip = InternationalizationManager.Instance.GetTranslation("PositionResetToolTip");
245272
contextMenu.Items.Add(gamemode);
273+
contextMenu.Items.Add(positionreset);
246274
contextMenu.Items.Add(settings);
247275
contextMenu.Items.Add(exit);
248276

@@ -289,10 +317,17 @@ private void ToggleGameMode()
289317
_viewModel.GameModeStatus = true;
290318
}
291319
}
320+
private async void PositionReset()
321+
{
322+
_viewModel.Show();
323+
await Task.Delay(300); // If don't give a time, Positioning will be weird.
324+
Left = HorizonCenter();
325+
Top = VerticalCenter();
326+
}
292327
private void InitProgressbarAnimation()
293328
{
294329
var da = new DoubleAnimation(ProgressBar.X2, ActualWidth + 150,
295-
new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
330+
new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
296331
var da1 = new DoubleAnimation(ProgressBar.X1, ActualWidth + 50, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
297332
Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
298333
Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
@@ -396,6 +431,8 @@ private async void OnContextMenusForSettingsClick(object sender, RoutedEventArgs
396431

397432
private async void OnDeactivated(object sender, EventArgs e)
398433
{
434+
_settings.WindowLeft = Left;
435+
_settings.WindowTop = Top;
399436
//This condition stops extra hide call when animator is on,
400437
// which causes the toggling to occasional hide instead of show.
401438
if (_viewModel.MainWindowVisibilityStatus)
@@ -417,24 +454,14 @@ private void UpdatePosition()
417454
{
418455
if (_animating)
419456
return;
420-
421-
if (_settings.RememberLastLaunchLocation)
422-
{
423-
Left = _settings.WindowLeft;
424-
Top = _settings.WindowTop;
425-
}
426-
else
427-
{
428-
Left = WindowLeft();
429-
Top = WindowTop();
430-
}
457+
InitializePosition();
431458
}
432459

433460
private void OnLocationChanged(object sender, EventArgs e)
434461
{
435462
if (_animating)
436463
return;
437-
if (_settings.RememberLastLaunchLocation)
464+
if (_settings.SearchWindowPosition == SearchWindowPositions.RememberLastLaunchLocation)
438465
{
439466
_settings.WindowLeft = Left;
440467
_settings.WindowTop = Top;
@@ -453,8 +480,8 @@ public void HideStartup()
453480
_viewModel.Show();
454481
}
455482
}
456-
457-
public double WindowLeft()
483+
484+
public double HorizonCenter()
458485
{
459486
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
460487
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
@@ -463,7 +490,7 @@ public double WindowLeft()
463490
return left;
464491
}
465492

466-
public double WindowTop()
493+
public double VerticalCenter()
467494
{
468495
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
469496
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
@@ -472,12 +499,22 @@ public double WindowTop()
472499
return top;
473500
}
474501

502+
public double HorizonRight()
503+
{
504+
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
505+
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
506+
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
507+
var left = (dip2.X - ActualWidth) - 10;
508+
return left;
509+
}
510+
475511
/// <summary>
476512
/// Register up and down key
477513
/// todo: any way to put this in xaml ?
478514
/// </summary>
479515
private void OnKeyDown(object sender, KeyEventArgs e)
480516
{
517+
var specialKeyState = GlobalHotkey.CheckModifiers();
481518
switch (e.Key)
482519
{
483520
case Key.Down:
@@ -512,8 +549,13 @@ private void OnKeyDown(object sender, KeyEventArgs e)
512549
e.Handled = true;
513550
}
514551
break;
552+
case Key.F12:
553+
if (specialKeyState.CtrlPressed)
554+
{
555+
ToggleGameMode();
556+
}
557+
break;
515558
case Key.Back:
516-
var specialKeyState = GlobalHotkey.CheckModifiers();
517559
if (specialKeyState.CtrlPressed)
518560
{
519561
if (_viewModel.SelectedIsFromQueryResults()

0 commit comments

Comments
 (0)