Skip to content

Commit

Permalink
! Usability enhancement to Navi Bar member filter
Browse files Browse the repository at this point in the history
  • Loading branch information
wmjordan committed Dec 16, 2018
1 parent e19ceb2 commit 234cd9b
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 1 deletion.
1 change: 1 addition & 0 deletions Codist/Controls/MemberFilterBox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ void _FilterBox_IsVisibleChanged(object sender, DependencyPropertyChangedEventAr

void FilterChanged(object sender, EventArgs e) {
Filter(_FilterBox.Text.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries), _FilterButtons.Filters);
FocusTextBox();
}
void Filter(string[] keywords, MemberFilterTypes filters) {
bool useModifierFilter = filters != MemberFilterTypes.All;
Expand Down
15 changes: 15 additions & 0 deletions Codist/Controls/ThemedMenuItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@ public object SubMenuHeader {
SetValue(SubMenuHeaderProperty, _SubMenuHeader = value);
if (_SubMenuHeader != null && HasItems == false) {
Items.Add(new MenuItemPlaceHolder());
(value as FrameworkElement).KeyUp += (s, args) => {
switch (args.Key) {
case System.Windows.Input.Key.Enter:
if (args.OriginalSource is TextBox) {
Items.GetFirst<ThemedMenuItem>(i => i.IsEnabled && i.IsVisible).PerformClick();
}
break;
case System.Windows.Input.Key.Down: Items.FocusFirst<MenuItem>(); break;
case System.Windows.Input.Key.Up: Items.FocusLast<MenuItem>(); break;
}
};
}
}
}
Expand All @@ -50,6 +61,10 @@ public void ClearItems() {
}
}

public void PerformClick() {
OnClick();
}

internal sealed class MenuItemPlaceHolder : Separator
{
public MenuItemPlaceHolder() {
Expand Down
39 changes: 39 additions & 0 deletions Codist/Helpers/WpfHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,45 @@ public static TControl ReferenceStyle<TControl>(this TControl control, object re
#endregion

#region Others
public static TItem GetFirst<TItem>(this ItemCollection items, Predicate<TItem> predicate)
where TItem : FrameworkElement {
foreach (var item in items) {
var i = item as TItem;
if (i != null && (predicate == null || predicate(i))) {
return i;
}
}
return null;
}
public static bool ClickFirstMenuItem<TItem>(this ItemCollection items)
where TItem : MenuItem {
foreach (var item in items) {
var i = item as TItem;
if (i != null && i.Visibility == Visibility.Visible && i.IsEnabled) {
i.RaiseEvent(new RoutedEventArgs(MenuItem.ClickEvent));
return true;
}
}
return false;
}
public static bool FocusFirst<TItem>(this ItemCollection items)
where TItem : FrameworkElement {
foreach (var item in items) {
if ((item as TItem)?.Focus() == true) {
return true;
}
}
return false;
}
public static bool FocusLast<TItem>(this ItemCollection items)
where TItem : FrameworkElement {
for (int i = items.Count - 1; i >= 0; i--) {
if ((items[i] as TItem)?.Focus() == true) {
return true;
}
}
return false;
}
public static TItem Get<TItem>(this ResourceDictionary items, object key) {
return (items != null && items.Contains(key) && items[key] is TItem item)
? item
Expand Down
5 changes: 4 additions & 1 deletion Codist/NaviBar/CSharpBar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,9 @@ public RootItem(CSharpBar bar) {
};
_FinderBox.TextChanged += SearchCriteriaChanged;
_ScopeBox.FilterChanged += SearchCriteriaChanged;
_ScopeBox.FilterChanged += (s, args) => {
_FinderBox.Focus();
};
}

void SearchCriteriaChanged(object sender, EventArgs e) {
Expand Down Expand Up @@ -303,7 +306,7 @@ void ControlMenuSelection(object sender, KeyEventArgs e) {
foreach (var item in _Items) {
var nav = item as NaviItem;
if (nav != null) {
nav.RaiseEvent(new RoutedEventArgs(MenuItem.ClickEvent));
nav.RaiseEvent(new RoutedEventArgs(ClickEvent));
return;
}
}
Expand Down

0 comments on commit 234cd9b

Please sign in to comment.