1- using Diffusion . Toolkit . Models ;
1+ using Diffusion . Common ;
2+ using Diffusion . Common . Query ;
3+ using Diffusion . Database . Models ;
4+ using Diffusion . Toolkit . Configuration ;
5+ using Diffusion . Toolkit . Models ;
6+ using Diffusion . Toolkit . Services ;
7+ using System . Linq ;
28using System . Threading ;
39using System . Windows ;
410using System . Windows . Controls ;
511using System . Windows . Input ;
6- using Diffusion . Common ;
7- using Diffusion . Database . Models ;
8- using Diffusion . Toolkit . Configuration ;
9- using Diffusion . Toolkit . Services ;
12+ using System . Windows . Media ;
1013
1114namespace Diffusion . Toolkit . Controls
1215{
@@ -19,9 +22,24 @@ public partial class MetadataPanel : UserControl
1922 nameof ( CurrentImage ) ,
2023 typeof ( ImageViewModel ) ,
2124 typeof ( MetadataPanel ) ,
22- new PropertyMetadata ( default ( ImageEntry ) )
25+ new PropertyMetadata ( default ( ImageEntry ) , PropertyChangedCallback )
2326 ) ;
2427
28+ private static void PropertyChangedCallback ( DependencyObject d , DependencyPropertyChangedEventArgs e )
29+ {
30+ if ( d is MetadataPanel panel )
31+ {
32+ panel . CurrentImage . PropertyChanged += ( sender , args ) =>
33+ {
34+ if ( args . PropertyName == nameof ( ImageViewModel . ImageTags ) )
35+ {
36+ panel . UpdateFilter ( ) ;
37+ }
38+ } ;
39+ panel . UpdateFilter ( ) ;
40+ }
41+ }
42+
2543 public ImageViewModel CurrentImage
2644 {
2745 get => ( ImageViewModel ) GetValue ( CurrentImageProperty ) ;
@@ -81,13 +99,85 @@ private void UIElement_OnGotFocus(object sender, RoutedEventArgs e)
8199 }
82100
83101 private void AddTagButton_OnClick ( object sender , RoutedEventArgs e )
102+ {
103+ AddTag ( ) ;
104+ }
105+
106+ private void AddTagText_OnKeyDown ( object sender , KeyEventArgs e )
107+ {
108+ if ( e . Key == Key . Enter )
109+ {
110+ AddTag ( ) ;
111+ }
112+ }
113+
114+ private void AddTag ( )
84115 {
85116 var tagName = AddTagText . Text . Trim ( ) ;
86117 if ( tagName . Length > 0 )
87118 {
88119 ServiceLocator . DataStore . CreateTag ( tagName ) ;
89120 AddTagText . Text = "" ;
90121 CurrentImage . ImageTags = ServiceLocator . TagService . GetImageTagViews ( CurrentImage . Id ) ;
122+ ServiceLocator . TagService . LoadTags ( ) ;
123+ UpdateFilter ( ) ;
124+ }
125+ }
126+
127+ private void UpdateFilter ( )
128+ {
129+ if ( CurrentImage . ImageTags == null )
130+ {
131+ CurrentImage . FilteredTags = null ;
132+ return ;
133+ }
134+ if ( TagFilter . Text is { Length : > 0 } )
135+ {
136+ var filter = TagFilter . Text . ToLower ( ) . Trim ( ) ;
137+
138+ CurrentImage . FilteredTags = CurrentImage . ImageTags . Where ( d => d . Name . ToLower ( ) . Contains ( filter ) ) . ToList ( ) ;
139+ }
140+ else
141+ {
142+ CurrentImage . FilteredTags = CurrentImage . ImageTags . ToList ( ) ;
143+ }
144+ }
145+
146+ private void ClearFilter_OnClick ( object sender , RoutedEventArgs e )
147+ {
148+ TagFilter . Text = "" ;
149+ UpdateFilter ( ) ;
150+ }
151+
152+ private void TagFilter_OnTextChanged ( object sender , TextChangedEventArgs e )
153+ {
154+ UpdateFilter ( ) ;
155+ }
156+
157+ private void UIElement_OnPreviewMouseWheel ( object sender , MouseWheelEventArgs e )
158+ {
159+ e . Handled = true ; // Mark the event as handled to stop tunneling
160+
161+ // Create a new MouseWheelEventArgs for the bubbling event
162+ var eventArg = new MouseWheelEventArgs ( e . MouseDevice , e . Timestamp , e . Delta )
163+ {
164+ RoutedEvent = UIElement . MouseWheelEvent ,
165+ Source = sender
166+ } ;
167+
168+ // Raise the new bubbling event on the ListView itself
169+ if ( VisualTreeHelper . GetParent ( ( FrameworkElement ) sender ) is UIElement parent )
170+ {
171+ parent . RaiseEvent ( eventArg ) ;
172+ }
173+ }
174+
175+ private void TagFilter_OnKeyDown ( object sender , KeyEventArgs e )
176+ {
177+ if ( e . Key == Key . Escape )
178+ {
179+ TagFilter . Text = "" ;
180+ UpdateFilter ( ) ;
91181 }
92182 }
93183 }
0 commit comments