55using System . Windows . Input ;
66using _1RM . Model ;
77using _1RM . Model . Protocol . Base ;
8- using _1RM . Service . DataSource ;
98using Shawn . Utils ;
109using Shawn . Utils . Wpf ;
1110using Shawn . Utils . Wpf . Controls ;
@@ -20,18 +19,17 @@ public partial class NoteDisplayAndEditor : UserControl
2019 new FrameworkPropertyMetadata ( null , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , OnServerChanged ) ) ;
2120 private static void OnServerChanged ( DependencyObject d , DependencyPropertyChangedEventArgs e )
2221 {
23- if ( d is NoteDisplayAndEditor control )
22+ if ( d is not NoteDisplayAndEditor control ) return ;
23+
24+ control . SwitchToView ( View . Normal ) ;
25+ if ( e . OldValue is ProtocolBase server0 )
2426 {
25- control . EndEdit ( ) ;
26- if ( e . OldValue is ProtocolBase server0 )
27- {
28- server0 . PropertyChanged -= control . ServerOnPropertyChanged ;
29- }
30- if ( e . NewValue is ProtocolBase server1 )
31- {
32- server1 . PropertyChanged += control . ServerOnPropertyChanged ;
33- control . EditEnable = control . EditEnable && server1 . DataSource ? . IsWritable == true ;
34- }
27+ server0 . PropertyChanged -= control . ServerOnPropertyChanged ;
28+ }
29+ if ( e . NewValue is ProtocolBase server1 )
30+ {
31+ server1 . PropertyChanged += control . ServerOnPropertyChanged ;
32+ control . EditEnable = control . EditEnable && server1 . DataSource ? . IsWritable == true ;
3533 }
3634 }
3735
@@ -49,36 +47,18 @@ public ProtocolBase? Server
4947 set => SetValue ( ServerProperty , value ) ;
5048 }
5149
52-
50+ // a callback for save launcher settings
5351 public static readonly DependencyProperty CommandOnCloseRequestProperty = DependencyProperty . Register (
5452 "CommandOnCloseRequest" , typeof ( RelayCommand ) , typeof ( NoteDisplayAndEditor ) , new FrameworkPropertyMetadata ( default ( RelayCommand ) , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault ) ) ;
55-
56-
5753 public RelayCommand CommandOnCloseRequest
5854 {
5955 get => ( RelayCommand ) GetValue ( CommandOnCloseRequestProperty ) ;
6056 set => SetValue ( CommandOnCloseRequestProperty , value ) ;
6157 }
6258
63- public bool CloseEnable { get ; set ; }
64-
65- private bool _editEnable ;
66- public bool EditEnable
67- {
68- get => _editEnable ;
69- set
70- {
71- _editEnable = value ;
72- if ( IsLoaded )
73- {
74- Execute . OnUIThreadSync ( ( ) =>
75- {
76- ButtonSave . IsEnabled = EditEnable ;
77- TbMarkdown . IsReadOnly = ! EditEnable ;
78- } ) ;
79- }
80- }
81- }
59+ public Visibility CloseButtonVisibility { get ; set ; } = Visibility . Collapsed ;
60+ public Visibility EditButtonVisibility { get ; set ; } = Visibility . Visible ;
61+ public bool EditEnable { get ; set ; }
8262
8363 public NoteDisplayAndEditor ( )
8464 {
@@ -88,10 +68,7 @@ public NoteDisplayAndEditor()
8868
8969 private void NoteDisplayAndEditor_Loaded ( object sender , RoutedEventArgs e )
9070 {
91- ButtonSave . IsEnabled = EditEnable ;
92- TbMarkdown . IsReadOnly = ! EditEnable ;
93- ButtonClose . IsEnabled = CloseEnable ;
94- ButtonClose . Visibility = CloseEnable ? Visibility . Visible : Visibility . Collapsed ;
71+ SwitchToView ( View . Normal ) ;
9572 }
9673
9774 private void OpenHyperlink ( object sender , System . Windows . Input . ExecutedRoutedEventArgs e )
@@ -112,7 +89,6 @@ private void OpenHyperlink(object sender, System.Windows.Input.ExecutedRoutedEve
11289
11390 private void ClickOnImage ( object sender , System . Windows . Input . ExecutedRoutedEventArgs e )
11491 {
115- //MessageBox.Show($"URL: {e.Parameter}");
11692 try
11793 {
11894 var url = e ? . Parameter ? . ToString ( ) ;
@@ -127,40 +103,102 @@ private void ClickOnImage(object sender, System.Windows.Input.ExecutedRoutedEven
127103 }
128104 }
129105
130- private void EndEdit ( )
106+ public enum View
131107 {
132- MarkdownViewer . Markdown = Server ? . Note ?? "" ;
133- MarkdownViewer . Visibility = Visibility . Visible ;
134- GridEditor . Visibility = Visibility . Collapsed ;
108+ Normal ,
109+ Editor ,
110+ Copy
135111 }
136- private void StartEdit ( )
112+ private View ? _currentView = null ;
113+ public void SwitchToView ( NoteDisplayAndEditor . View v )
137114 {
138- MarkdownViewer . Visibility = Visibility . Collapsed ;
139- GridEditor . Visibility = Visibility . Visible ;
115+ if ( v == _currentView ) return ;
116+ ButtonClose . Visibility = CloseButtonVisibility ;
117+ ButtonEdit . Visibility = EditButtonVisibility ;
118+ Execute . OnUIThreadSync ( ( ) =>
119+ {
120+ switch ( v )
121+ {
122+ case View . Normal :
123+ MarkdownViewer . Markdown = Server ? . Note ?? "" ;
124+ MarkdownViewer . Visibility = Visibility . Visible ;
125+ GridEditor . Visibility = Visibility . Collapsed ;
126+ break ;
127+ case View . Editor :
128+ TbMarkdown . Text = Server ? . Note ?? "" ;
129+ GridButtons . Visibility = Visibility . Visible ;
130+ ButtonSave . IsEnabled = true ;
131+ TbMarkdown . IsReadOnly = false ;
132+ MarkdownViewer . Visibility = Visibility . Collapsed ;
133+ GridEditor . Visibility = Visibility . Visible ;
134+ break ;
135+ case View . Copy :
136+ if ( _currentView == View . Normal )
137+ {
138+ TbMarkdown . Text = Server ? . Note ?? "" ;
139+ // 只能拷贝,不能编辑
140+ GridButtons . Visibility = Visibility . Hidden ;
141+ ButtonSave . IsEnabled = false ;
142+ TbMarkdown . IsReadOnly = true ;
143+ MarkdownViewer . Visibility = Visibility . Collapsed ;
144+ GridEditor . Visibility = Visibility . Visible ;
145+ }
146+ break ;
147+ default :
148+ throw new ArgumentOutOfRangeException ( nameof ( v ) , v , null ) ;
149+ }
150+ _currentView = v ;
151+ } ) ;
140152 }
141153
142154 private void ButtonSave_OnClick ( object sender , RoutedEventArgs e )
143155 {
144- if ( EditEnable && Server != null && Server . Note . Trim ( ) != TbMarkdown . Text . Trim ( ) )
156+ if ( Server ? . DataSource ? . IsWritable == true
157+ && Server . Note . Trim ( ) != TbMarkdown . Text . Trim ( ) )
145158 {
146159 Server . Note = TbMarkdown . Text . Trim ( ) ;
147160 IoC . Get < GlobalData > ( ) . UpdateServer ( Server ) ;
148161 }
149- EndEdit ( ) ;
162+ SwitchToView ( View . Normal ) ;
150163 }
151164
152165 private void ButtonCancelEdit_OnClick ( object sender , RoutedEventArgs e )
153166 {
154- EndEdit ( ) ;
167+ SwitchToView ( View . Normal ) ;
155168 }
156169
157170 private void ButtonNoteStartEdit_OnClick ( object sender , RoutedEventArgs e )
158171 {
159172 TbMarkdown . Text = Server ? . Note ?? "" ;
160- if ( MarkdownViewer . Visibility != Visibility . Collapsed )
161- StartEdit ( ) ;
173+ if ( Server ? . DataSource ? . IsWritable == true )
174+ {
175+ SwitchToView ( View . Editor ) ;
176+ }
162177 else
163- EndEdit ( ) ;
178+ {
179+ SwitchToView ( View . Copy ) ;
180+ }
181+ }
182+
183+ private void GridEditor_OnMouseEnter ( object sender , MouseEventArgs e )
184+ {
185+ if ( _currentView == View . Normal )
186+ SwitchToView ( View . Copy ) ;
187+ }
188+
189+ private void GridEditor_OnMouseLeave ( object sender , MouseEventArgs e )
190+ {
191+ if ( _currentView == View . Copy )
192+ SwitchToView ( View . Normal ) ;
193+ }
194+
195+ private void TbMarkdown_OnPreviewMouseDown ( object sender , MouseButtonEventArgs e )
196+ {
197+ if ( _currentView == View . Copy
198+ && Server ? . DataSource ? . IsWritable == true )
199+ {
200+ SwitchToView ( View . Editor ) ;
201+ }
164202 }
165203
166204 private void ButtonClose_OnClick ( object sender , RoutedEventArgs e )
0 commit comments