Skip to content

Commit a3ef6fa

Browse files
authored
Merge pull request #3396 from Flow-Launcher/placeholder_resize
Support Placeholder Text & Toggle Resize Mode
2 parents 697fb72 + cd01260 commit a3ef6fa

File tree

13 files changed

+251
-65
lines changed

13 files changed

+251
-65
lines changed

Flow.Launcher.Core/Resource/Theme.cs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class Theme
2424
{
2525
#region Properties & Fields
2626

27-
public bool BlurEnabled { get; set; }
27+
public bool BlurEnabled { get; private set; }
2828

2929
private const string ThemeMetadataNamePrefix = "Name:";
3030
private const string ThemeMetadataIsDarkPrefix = "IsDark:";
@@ -42,6 +42,8 @@ public class Theme
4242
private static string DirectoryPath => Path.Combine(Constant.ProgramDirectory, Folder);
4343
private static string UserDirectoryPath => Path.Combine(DataLocation.DataDirectory(), Folder);
4444

45+
private Thickness _themeResizeBorderThickness;
46+
4547
#endregion
4648

4749
#region Constructor
@@ -463,7 +465,7 @@ public void AddDropShadowEffectToCurrentTheme()
463465

464466
var effectSetter = new Setter
465467
{
466-
Property = Border.EffectProperty,
468+
Property = UIElement.EffectProperty,
467469
Value = new DropShadowEffect
468470
{
469471
Opacity = 0.3,
@@ -473,12 +475,12 @@ public void AddDropShadowEffectToCurrentTheme()
473475
}
474476
};
475477

476-
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) is not Setter marginSetter)
478+
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == FrameworkElement.MarginProperty) is not Setter marginSetter)
477479
{
478480
var margin = new Thickness(ShadowExtraMargin, 12, ShadowExtraMargin, ShadowExtraMargin);
479481
marginSetter = new Setter()
480482
{
481-
Property = Border.MarginProperty,
483+
Property = FrameworkElement.MarginProperty,
482484
Value = margin,
483485
};
484486
windowBorderStyle.Setters.Add(marginSetter);
@@ -508,12 +510,12 @@ public void RemoveDropShadowEffectFromCurrentTheme()
508510
var dict = GetCurrentResourceDictionary();
509511
var windowBorderStyle = dict["WindowBorderStyle"] as Style;
510512

511-
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.EffectProperty) is Setter effectSetter)
513+
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == UIElement.EffectProperty) is Setter effectSetter)
512514
{
513515
windowBorderStyle.Setters.Remove(effectSetter);
514516
}
515517

516-
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == Border.MarginProperty) is Setter marginSetter)
518+
if (windowBorderStyle.Setters.FirstOrDefault(setterBase => setterBase is Setter setter && setter.Property == FrameworkElement.MarginProperty) is Setter marginSetter)
517519
{
518520
var currentMargin = (Thickness)marginSetter.Value;
519521
var newMargin = new Thickness(
@@ -529,28 +531,41 @@ public void RemoveDropShadowEffectFromCurrentTheme()
529531
UpdateResourceDictionary(dict);
530532
}
531533

534+
public void SetResizeBorderThickness(WindowChrome windowChrome, bool fixedWindowSize)
535+
{
536+
if (fixedWindowSize)
537+
{
538+
windowChrome.ResizeBorderThickness = new Thickness(0);
539+
}
540+
else
541+
{
542+
windowChrome.ResizeBorderThickness = _themeResizeBorderThickness;
543+
}
544+
}
545+
532546
// because adding drop shadow effect will change the margin of the window,
533547
// we need to update the window chrome thickness to correct set the resize border
534-
private static void SetResizeBoarderThickness(Thickness? effectMargin)
548+
private void SetResizeBoarderThickness(Thickness? effectMargin)
535549
{
536550
var window = Application.Current.MainWindow;
537551
if (WindowChrome.GetWindowChrome(window) is WindowChrome windowChrome)
538552
{
539-
Thickness thickness;
553+
// Save the theme resize border thickness so that we can restore it if we change ResizeWindow setting
540554
if (effectMargin == null)
541555
{
542-
thickness = SystemParameters.WindowResizeBorderThickness;
556+
_themeResizeBorderThickness = SystemParameters.WindowResizeBorderThickness;
543557
}
544558
else
545559
{
546-
thickness = new Thickness(
560+
_themeResizeBorderThickness = new Thickness(
547561
effectMargin.Value.Left + SystemParameters.WindowResizeBorderThickness.Left,
548562
effectMargin.Value.Top + SystemParameters.WindowResizeBorderThickness.Top,
549563
effectMargin.Value.Right + SystemParameters.WindowResizeBorderThickness.Right,
550564
effectMargin.Value.Bottom + SystemParameters.WindowResizeBorderThickness.Bottom);
551565
}
552566

553-
windowChrome.ResizeBorderThickness = thickness;
567+
// Apply the resize border thickness to the window chrome
568+
SetResizeBorderThickness(windowChrome, _settings.KeepMaxResults);
554569
}
555570
}
556571

@@ -582,7 +597,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
582597
{
583598
AutoDropShadow(useDropShadowEffect);
584599
}
585-
}, DispatcherPriority.Normal);
600+
}, DispatcherPriority.Render);
586601
}
587602

588603
/// <summary>
@@ -596,7 +611,7 @@ await Application.Current.Dispatcher.InvokeAsync(() =>
596611
var (backdropType, _) = GetActualValue();
597612

598613
SetBlurForWindow(GetCurrentTheme(), backdropType);
599-
}, DispatcherPriority.Normal);
614+
}, DispatcherPriority.Render);
600615
}
601616

602617
/// <summary>

Flow.Launcher.Core/Resource/ThemeManager.cs

Lines changed: 0 additions & 12 deletions
This file was deleted.

Flow.Launcher.Infrastructure/UserSettings/Settings.cs

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ public string Theme
6868
get => _theme;
6969
set
7070
{
71-
if (value == _theme)
72-
return;
73-
_theme = value;
74-
OnPropertyChanged();
75-
OnPropertyChanged(nameof(MaxResultsToShow));
71+
if (value != _theme)
72+
{
73+
_theme = value;
74+
OnPropertyChanged();
75+
OnPropertyChanged(nameof(MaxResultsToShow));
76+
}
7677
}
7778
}
7879
public bool UseDropShadowEffect { get; set; } = true;
@@ -113,6 +114,33 @@ public string Theme
113114
public double? SettingWindowLeft { get; set; } = null;
114115
public System.Windows.WindowState SettingWindowState { get; set; } = WindowState.Normal;
115116

117+
bool _showPlaceholder { get; set; } = false;
118+
public bool ShowPlaceholder
119+
{
120+
get => _showPlaceholder;
121+
set
122+
{
123+
if (_showPlaceholder != value)
124+
{
125+
_showPlaceholder = value;
126+
OnPropertyChanged();
127+
}
128+
}
129+
}
130+
string _placeholderText { get; set; } = string.Empty;
131+
public string PlaceholderText
132+
{
133+
get => _placeholderText;
134+
set
135+
{
136+
if (_placeholderText != value)
137+
{
138+
_placeholderText = value;
139+
OnPropertyChanged();
140+
}
141+
}
142+
}
143+
116144
public int CustomExplorerIndex { get; set; } = 0;
117145

118146
[JsonIgnore]
@@ -241,10 +269,26 @@ public SearchPrecisionScore QuerySearchPrecision
241269
/// </summary>
242270
public double CustomWindowTop { get; set; } = 0;
243271

244-
public bool KeepMaxResults { get; set; } = false;
272+
/// <summary>
273+
/// Fixed window size
274+
/// </summary>
275+
private bool _keepMaxResults { get; set; } = false;
276+
public bool KeepMaxResults
277+
{
278+
get => _keepMaxResults;
279+
set
280+
{
281+
if (_keepMaxResults != value)
282+
{
283+
_keepMaxResults = value;
284+
OnPropertyChanged();
285+
}
286+
}
287+
}
288+
245289
public int MaxResultsToShow { get; set; } = 5;
246-
public int ActivateTimes { get; set; }
247290

291+
public int ActivateTimes { get; set; }
248292

249293
public ObservableCollection<CustomPluginHotkey> CustomPluginHotkeys { get; set; } = new ObservableCollection<CustomPluginHotkey>();
250294

Flow.Launcher/App.xaml.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,6 @@ await Stopwatch.NormalAsync("|App.OnStartup|Startup cost", async () =>
177177
HotKeyMapper.Initialize();
178178

179179
// main windows needs initialized before theme change because of blur settings
180-
// TODO: Clean ThemeManager.Instance in future
181180
Ioc.Default.GetRequiredService<Theme>().ChangeTheme();
182181

183182
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

Flow.Launcher/Languages/en.xaml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
<system:String x:Key="GameMode">Game Mode</system:String>
4040
<system:String x:Key="GameModeToolTip">Suspend the use of Hotkeys.</system:String>
4141
<system:String x:Key="PositionReset">Position Reset</system:String>
42-
<system:String x:Key="PositionResetToolTip">Reset search window position</system:String>
42+
<system:String x:Key="queryTextBoxPlaceholder">Type here to search</system:String>
4343

4444
<!-- Setting General -->
4545
<system:String x:Key="flowlauncher_settings">Settings</system:String>
@@ -72,8 +72,6 @@
7272
<system:String x:Key="LastQueryEmpty">Empty last Query</system:String>
7373
<system:String x:Key="LastQueryActionKeywordPreserved">Preserve Last Action Keyword</system:String>
7474
<system:String x:Key="LastQueryActionKeywordSelected">Select Last Action Keyword</system:String>
75-
<system:String x:Key="KeepMaxResults">Fixed Window Height</system:String>
76-
<system:String x:Key="KeepMaxResultsToolTip">The window height is not adjustable by dragging.</system:String>
7775
<system:String x:Key="maxShowResults">Maximum results shown</system:String>
7876
<system:String x:Key="maxShowResultsToolTip">You can also quickly adjust this by using CTRL+Plus and CTRL+Minus.</system:String>
7977
<system:String x:Key="ignoreHotkeysOnFullscreen">Ignore hotkeys in fullscreen mode</system:String>
@@ -104,11 +102,6 @@
104102
<system:String x:Key="AlwaysPreview">Always Preview</system:String>
105103
<system:String x:Key="AlwaysPreviewToolTip">Always open preview panel when Flow activates. Press {0} to toggle preview.</system:String>
106104
<system:String x:Key="shadowEffectNotAllowed">Shadow effect is not allowed while current theme has blur effect enabled</system:String>
107-
<system:String x:Key="BackdropType">Backdrop Type</system:String>
108-
<system:String x:Key="BackdropTypesNone">None</system:String>
109-
<system:String x:Key="BackdropTypesAcrylic">Acrylic</system:String>
110-
<system:String x:Key="BackdropTypesMica">Mica</system:String>
111-
<system:String x:Key="BackdropTypesMicaAlt">Mica Alt</system:String>
112105

113106
<!-- Setting Plugin -->
114107
<system:String x:Key="searchplugin">Search Plugin</system:String>
@@ -200,8 +193,19 @@
200193
<system:String x:Key="AnimationSpeedCustom">Custom</system:String>
201194
<system:String x:Key="Clock">Clock</system:String>
202195
<system:String x:Key="Date">Date</system:String>
196+
<system:String x:Key="BackdropType">Backdrop Type</system:String>
197+
<system:String x:Key="BackdropTypesNone">None</system:String>
198+
<system:String x:Key="BackdropTypesAcrylic">Acrylic</system:String>
199+
<system:String x:Key="BackdropTypesMica">Mica</system:String>
200+
<system:String x:Key="BackdropTypesMicaAlt">Mica Alt</system:String>
203201
<system:String x:Key="TypeIsDarkToolTip">This theme supports two(light/dark) modes.</system:String>
204202
<system:String x:Key="TypeHasBlurToolTip">This theme supports Blur Transparent Background.</system:String>
203+
<system:String x:Key="ShowPlaceholder">Show placeholder</system:String>
204+
<system:String x:Key="ShowPlaceholderTip">Display placeholder when query is empty</system:String>
205+
<system:String x:Key="PlaceholderText">Placeholder text</system:String>
206+
<system:String x:Key="PlaceholderTextTip">Change placeholder text. Input empty will use: {0}</system:String>
207+
<system:String x:Key="KeepMaxResults">Fixed Window Size</system:String>
208+
<system:String x:Key="KeepMaxResultsToolTip">The window size is not adjustable by dragging.</system:String>
205209

206210
<!-- Setting Hotkey -->
207211
<system:String x:Key="hotkey">Hotkey</system:String>

Flow.Launcher/MainWindow.xaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,14 @@
218218
<Grid x:Name="QueryBoxArea">
219219
<Border MinHeight="30" Style="{DynamicResource QueryBoxBgStyle}">
220220
<Grid>
221+
<TextBox
222+
x:Name="QueryTextPlaceholderBox"
223+
Height="{Binding MainWindowHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
224+
FontSize="{Binding QueryBoxFontSize, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
225+
IsEnabled="False"
226+
Style="{DynamicResource QuerySuggestionBoxStyle}"
227+
Text="{Binding PlaceholderText, Mode=OneWay}"
228+
Visibility="Collapsed" />
221229
<TextBox
222230
x:Name="QueryTextSuggestionBox"
223231
Height="{Binding MainWindowHeight, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

0 commit comments

Comments
 (0)