mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
- Add Primary/Second/Custom Position in window position setting
- Adjust Strings - Rename WindowPosition Setting
This commit is contained in:
parent
6869aeea83
commit
55b247f540
5 changed files with 194 additions and 55 deletions
|
|
@ -195,6 +195,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
|||
|
||||
public double WindowLeft { get; set; }
|
||||
public double WindowTop { get; set; }
|
||||
public double CustomWindowLeft { get; set; } = 0;
|
||||
public double CustomWindowTop { get; set; } = 0;
|
||||
public int MaxResultsToShow { get; set; } = 5;
|
||||
public int ActivateTimes { get; set; }
|
||||
|
||||
|
|
@ -227,7 +229,9 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
|||
}
|
||||
public bool LeaveCmdOpen { get; set; }
|
||||
public bool HideWhenDeactivated { get; set; } = true;
|
||||
public SearchWindowPositions SearchWindowPosition { get; set; } = SearchWindowPositions.MouseScreenCenter;
|
||||
|
||||
public SearchWindowScreens SearchWindowScreen { get; set; } = SearchWindowScreens.RememberLastLaunchLocation;
|
||||
public SearchWindowAligns SearchWindowAlign { get; set; } = SearchWindowAligns.Center;
|
||||
public bool IgnoreHotkeysOnFullscreen { get; set; }
|
||||
|
||||
public HttpProxy Proxy { get; set; } = new HttpProxy();
|
||||
|
|
@ -253,12 +257,19 @@ namespace Flow.Launcher.Infrastructure.UserSettings
|
|||
Light,
|
||||
Dark
|
||||
}
|
||||
public enum SearchWindowPositions
|
||||
public enum SearchWindowScreens
|
||||
{
|
||||
RememberLastLaunchLocation,
|
||||
MouseScreenCenter,
|
||||
MouseScreenCenterTop,
|
||||
MouseScreenLeftTop,
|
||||
MouseScreenRightTop
|
||||
MouseScreen,
|
||||
PrimaryScreen,
|
||||
SecondaryScreen,
|
||||
CustomPosition
|
||||
}
|
||||
public enum SearchWindowAligns
|
||||
{
|
||||
Center,
|
||||
CenterTop,
|
||||
LeftTop,
|
||||
RightTop
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,11 +38,15 @@
|
|||
<system:String x:Key="hideFlowLauncherWhenLoseFocus">Hide Flow Launcher when focus is lost</system:String>
|
||||
<system:String x:Key="dontPromptUpdateMsg">Do not show new version notifications</system:String>
|
||||
<system:String x:Key="SearchWindowPosition">Search Window Position</system:String>
|
||||
<system:String x:Key="SearchWindowPositionRememberLastLaunchLocation">Remember Last Position</system:String>
|
||||
<system:String x:Key="SearchWindowPositionMouseScreenCenter">Mouse Focused Screen - Center</system:String>
|
||||
<system:String x:Key="SearchWindowPositionMouseScreenCenterTop">Mouse Focused Screen - Center Top</system:String>
|
||||
<system:String x:Key="SearchWindowPositionMouseScreenLeftTop">Mouse Focused Screen - Left Top</system:String>
|
||||
<system:String x:Key="SearchWindowPositionMouseScreenRightTop">Mouse Focused Screen - Right Top</system:String>
|
||||
<system:String x:Key="SearchWindowScreenRememberLastLaunchLocation">Remember Last Position</system:String>
|
||||
<system:String x:Key="SearchWindowScreenMouseScreen">Mouse Focused Monitor</system:String>
|
||||
<system:String x:Key="SearchWindowScreenPrimaryScreen">Primary Monitor</system:String>
|
||||
<system:String x:Key="SearchWindowScreenSecondaryScreen">Secondary Monitor</system:String>
|
||||
<system:String x:Key="SearchWindowScreenCustomPosition">Custom Position</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCenter">Center</system:String>
|
||||
<system:String x:Key="SearchWindowAlignCenterTop">Center Top</system:String>
|
||||
<system:String x:Key="SearchWindowAlignLeftTop">Left Top</system:String>
|
||||
<system:String x:Key="SearchWindowAlignRightTop">Right Top</system:String>
|
||||
<system:String x:Key="language">Language</system:String>
|
||||
<system:String x:Key="lastQueryMode">Last Query Style</system:String>
|
||||
<system:String x:Key="lastQueryModeToolTip">Show/Hide previous results when Flow Launcher is reactivated.</system:String>
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ using System.Windows.Threading;
|
|||
using System.Windows.Data;
|
||||
using ModernWpf.Controls;
|
||||
using Key = System.Windows.Input.Key;
|
||||
using System.Threading;
|
||||
|
||||
namespace Flow.Launcher
|
||||
{
|
||||
|
|
@ -201,29 +202,39 @@ namespace Flow.Launcher
|
|||
|
||||
private void InitializePosition()
|
||||
{
|
||||
switch (_settings.SearchWindowPosition)
|
||||
if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
|
||||
{
|
||||
case SearchWindowPositions.RememberLastLaunchLocation:
|
||||
Top = _settings.WindowTop;
|
||||
Left = _settings.WindowLeft;
|
||||
break;
|
||||
case SearchWindowPositions.MouseScreenCenter:
|
||||
Left = HorizonCenter();
|
||||
Top = VerticalCenter();
|
||||
break;
|
||||
case SearchWindowPositions.MouseScreenCenterTop:
|
||||
Left = HorizonCenter();
|
||||
Top = 10;
|
||||
break;
|
||||
case SearchWindowPositions.MouseScreenLeftTop:
|
||||
Left = 10;
|
||||
Top = 10;
|
||||
break;
|
||||
case SearchWindowPositions.MouseScreenRightTop:
|
||||
Left = HorizonRight();
|
||||
Top = 10;
|
||||
break;
|
||||
Top = _settings.WindowTop;
|
||||
Left = _settings.WindowLeft;
|
||||
}
|
||||
else if (_settings.SearchWindowScreen == SearchWindowScreens.CustomPosition)
|
||||
{
|
||||
Top = _settings.CustomWindowTop;
|
||||
Left = _settings.CustomWindowLeft;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (_settings.SearchWindowAlign)
|
||||
{
|
||||
case SearchWindowAligns.Center:
|
||||
Left = HorizonCenter();
|
||||
Top = VerticalCenter();
|
||||
break;
|
||||
case SearchWindowAligns.CenterTop:
|
||||
Left = HorizonCenter();
|
||||
Top = 10;
|
||||
break;
|
||||
case SearchWindowAligns.LeftTop:
|
||||
Left = HorizonLeft();
|
||||
Top = 10;
|
||||
break;
|
||||
case SearchWindowAligns.RightTop:
|
||||
Left = HorizonRight();
|
||||
Top = 10;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void UpdateNotifyIconText()
|
||||
|
|
@ -503,7 +514,7 @@ namespace Flow.Launcher
|
|||
{
|
||||
if (_animating)
|
||||
return;
|
||||
if (_settings.SearchWindowPosition == SearchWindowPositions.RememberLastLaunchLocation)
|
||||
if (_settings.SearchWindowScreen == SearchWindowScreens.RememberLastLaunchLocation)
|
||||
{
|
||||
_settings.WindowLeft = Left;
|
||||
_settings.WindowTop = Top;
|
||||
|
|
@ -523,9 +534,32 @@ namespace Flow.Launcher
|
|||
}
|
||||
}
|
||||
|
||||
public Screen SelectedScreen()
|
||||
{
|
||||
if (_settings.SearchWindowScreen == SearchWindowScreens.MouseScreen)
|
||||
{
|
||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||
return screen;
|
||||
}
|
||||
else if (_settings.SearchWindowScreen == SearchWindowScreens.PrimaryScreen)
|
||||
{
|
||||
var screen = Screen.PrimaryScreen;
|
||||
return screen;
|
||||
}
|
||||
else if (_settings.SearchWindowScreen == SearchWindowScreens.SecondaryScreen)
|
||||
{
|
||||
var screen = Screen.AllScreens[1];
|
||||
return screen;
|
||||
}
|
||||
else
|
||||
{
|
||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||
return screen;
|
||||
}
|
||||
}
|
||||
public double HorizonCenter()
|
||||
{
|
||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||
var screen = SelectedScreen();
|
||||
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
|
||||
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
|
||||
var left = (dip2.X - ActualWidth) / 2 + dip1.X;
|
||||
|
|
@ -534,7 +568,7 @@ namespace Flow.Launcher
|
|||
|
||||
public double VerticalCenter()
|
||||
{
|
||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||
var screen = SelectedScreen();
|
||||
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
|
||||
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
|
||||
var top = (dip2.Y - QueryTextBox.ActualHeight) / 4 + dip1.Y;
|
||||
|
|
@ -543,10 +577,19 @@ namespace Flow.Launcher
|
|||
|
||||
public double HorizonRight()
|
||||
{
|
||||
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
||||
var screen = SelectedScreen();
|
||||
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
|
||||
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
|
||||
var left = (dip2.X - ActualWidth) - 10;
|
||||
var left = (dip1.X + dip2.X - ActualWidth) - 10;
|
||||
return left;
|
||||
}
|
||||
|
||||
public double HorizonLeft()
|
||||
{
|
||||
var screen = SelectedScreen();
|
||||
var dip1 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
|
||||
var dip2 = WindowsInteropHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
|
||||
var left = dip1.X + 10;
|
||||
return left;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -698,17 +698,70 @@
|
|||
<StackPanel Style="{StaticResource TextPanel}">
|
||||
<TextBlock Style="{DynamicResource SettingTitleLabel}" Text="{DynamicResource SearchWindowPosition}" />
|
||||
</StackPanel>
|
||||
<ComboBox
|
||||
x:Name="SearchWindowPosition"
|
||||
Grid.Column="2"
|
||||
MinWidth="220"
|
||||
Margin="0,0,18,0"
|
||||
VerticalAlignment="Center"
|
||||
DisplayMemberPath="Display"
|
||||
FontSize="14"
|
||||
ItemsSource="{Binding SearchWindowPositions}"
|
||||
SelectedValue="{Binding Settings.SearchWindowPosition}"
|
||||
SelectedValuePath="Value" />
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||||
<ComboBox
|
||||
x:Name="SearchWindowScreen"
|
||||
MinWidth="220"
|
||||
Margin="0,0,18,0"
|
||||
VerticalAlignment="Center"
|
||||
DisplayMemberPath="Display"
|
||||
FontSize="14"
|
||||
ItemsSource="{Binding SearchWindowScreens}"
|
||||
SelectedValue="{Binding Settings.SearchWindowScreen}"
|
||||
SelectedValuePath="Value" />
|
||||
<ComboBox
|
||||
x:Name="SearchWindowPosition"
|
||||
MinWidth="160"
|
||||
Margin="0,0,18,0"
|
||||
VerticalAlignment="Center"
|
||||
DisplayMemberPath="Display"
|
||||
FontSize="14"
|
||||
ItemsSource="{Binding SearchWindowAligns}"
|
||||
SelectedValue="{Binding Settings.SearchWindowAlign}"
|
||||
SelectedValuePath="Value">
|
||||
<ComboBox.Style>
|
||||
<Style BasedOn="{StaticResource DefaultComboBoxStyle}" TargetType="ComboBox">
|
||||
<Setter Property="Visibility" Value="Visible" />
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding ElementName=SearchWindowScreen, Path=SelectedIndex}" Value="0">
|
||||
<Setter Property="Visibility" Value="Collapsed" />
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding ElementName=SearchWindowScreen, Path=SelectedIndex}" Value="4">
|
||||
<Setter Property="Visibility" Value="Collapsed" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
|
||||
</Style>
|
||||
</ComboBox.Style>
|
||||
</ComboBox>
|
||||
<StackPanel Margin="0,0,18,0" Orientation="Horizontal">
|
||||
<StackPanel.Style>
|
||||
<Style TargetType="StackPanel">
|
||||
<Setter Property="Visibility" Value="Collapsed" />
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding ElementName=SearchWindowScreen, Path=SelectedIndex}" Value="4">
|
||||
<Setter Property="Visibility" Value="Visible" />
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</StackPanel.Style>
|
||||
<TextBox
|
||||
Height="35"
|
||||
MinWidth="120"
|
||||
Text="{Binding Settings.CustomWindowLeft}"
|
||||
TextWrapping="NoWrap" />
|
||||
<TextBlock
|
||||
Margin="10"
|
||||
VerticalAlignment="Center"
|
||||
Foreground="{DynamicResource Color05B}"
|
||||
Text="x" />
|
||||
<TextBox
|
||||
Height="35"
|
||||
MinWidth="120"
|
||||
Text="{Binding Settings.CustomWindowTop}"
|
||||
TextWrapping="NoWrap" />
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<TextBlock Style="{StaticResource Glyph}">
|
||||

|
||||
</TextBlock>
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ using Flow.Launcher.Plugin.SharedModels;
|
|||
using System.Collections.ObjectModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using System.Globalization;
|
||||
using static Flow.Launcher.ViewModel.SettingWindowViewModel;
|
||||
|
||||
namespace Flow.Launcher.ViewModel
|
||||
{
|
||||
|
|
@ -463,23 +464,50 @@ namespace Flow.Launcher.ViewModel
|
|||
}
|
||||
}
|
||||
|
||||
public class SearchWindowPosition
|
||||
public class SearchWindowScreen
|
||||
{
|
||||
public string Display { get; set; }
|
||||
public SearchWindowPositions Value { get; set; }
|
||||
public SearchWindowScreens Value { get; set; }
|
||||
}
|
||||
|
||||
public List<SearchWindowPosition> SearchWindowPositions
|
||||
public List<SearchWindowScreen> SearchWindowScreens
|
||||
{
|
||||
get
|
||||
{
|
||||
List<SearchWindowPosition> modes = new List<SearchWindowPosition>();
|
||||
var enums = (SearchWindowPositions[])Enum.GetValues(typeof(SearchWindowPositions));
|
||||
List<SearchWindowScreen> modes = new List<SearchWindowScreen>();
|
||||
var enums = (SearchWindowScreens[])Enum.GetValues(typeof(SearchWindowScreens));
|
||||
foreach (var e in enums)
|
||||
{
|
||||
var key = $"SearchWindowPosition{e}";
|
||||
var key = $"SearchWindowScreen{e}";
|
||||
var display = _translater.GetTranslation(key);
|
||||
var m = new SearchWindowPosition
|
||||
var m = new SearchWindowScreen
|
||||
{
|
||||
Display = display,
|
||||
Value = e,
|
||||
};
|
||||
modes.Add(m);
|
||||
}
|
||||
return modes;
|
||||
}
|
||||
}
|
||||
|
||||
public class SearchWindowAlign
|
||||
{
|
||||
public string Display { get; set; }
|
||||
public SearchWindowAligns Value { get; set; }
|
||||
}
|
||||
|
||||
public List<SearchWindowAlign> SearchWindowAligns
|
||||
{
|
||||
get
|
||||
{
|
||||
List<SearchWindowAlign> modes = new List<SearchWindowAlign>();
|
||||
var enums = (SearchWindowAligns[])Enum.GetValues(typeof(SearchWindowAligns));
|
||||
foreach (var e in enums)
|
||||
{
|
||||
var key = $"SearchWindowAlign{e}";
|
||||
var display = _translater.GetTranslation(key);
|
||||
var m = new SearchWindowAlign
|
||||
{
|
||||
Display = display, Value = e,
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue