- Add Primary/Second/Custom Position in window position setting

- Adjust Strings
- Rename WindowPosition Setting
This commit is contained in:
DB p 2023-03-13 12:29:52 +09:00
parent 6869aeea83
commit 55b247f540
5 changed files with 194 additions and 55 deletions

View file

@ -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
}
}

View file

@ -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>

View file

@ -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;
}

View file

@ -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}">
&#xe7f4;
</TextBlock>

View file

@ -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,
};