@@ -192,6 +192,12 @@ public static Flyout CreateSettings(string currentTheme, string currentBackdropT
192192 Action onChangeFolder , Action onResetFolder ,
193193 Action onConfigureFirebase , Action onDisconnectFirebase , Action onSyncFirebase ,
194194 Action onConfigureWebDav , Action onDisconnectWebDav , Action onSyncWebDav ,
195+ bool isOneNoteConnected = false , string ? oneNoteUser = null ,
196+ string ? activeProfile = null , List < string > ? profiles = null ,
197+ Action < string > ? onSwitchProfile = null , Action ? onCreateProfile = null ,
198+ Action < string , Action > ? onRenameProfile = null , Action < string > ? onDeleteProfile = null ,
199+ Func < string > ? getActiveProfile = null , Func < List < string > > ? getProfiles = null ,
200+ Action ? onConfigureOneNote = null , Action ? onDisconnectOneNote = null , Action ? onSyncOneNote = null ,
195201 Action < Flyout > ? onShowVoiceModels = null ,
196202 Action < Flyout > ? onShowShortcuts = null ,
197203 string ? currentLanguage = null , bool slashEnabled = true ,
@@ -304,17 +310,27 @@ static string FindLabel((string key, string label)[] items, string current)
304310 var isCustomFolder = ! string . Equals ( currentNotesFolder , defaultNotesFolder , StringComparison . OrdinalIgnoreCase ) ;
305311 var storageSubMenu = CreateStorageSubMenu (
306312 isCustomFolder , isFirebaseConnected , isWebDavConnected ,
313+ isOneNoteConnected ,
307314 currentNotesFolder , firebaseEmail , webDavUrl ,
315+ oneNoteUser ,
316+ activeProfile ?? "" , profiles ?? [ ] ,
308317 onResetFolder , onChangeFolder ,
318+ onSwitchProfile ?? ( _ => { } ) , onCreateProfile ?? ( ( ) => { } ) ,
319+ onRenameProfile ?? ( ( _ , _ ) => { } ) , onDeleteProfile ?? ( _ => { } ) ,
309320 onConfigureFirebase , onDisconnectFirebase , onSyncFirebase ,
310321 onConfigureWebDav , onDisconnectWebDav , onSyncWebDav ,
322+ onConfigureOneNote ?? ( ( ) => { } ) , onDisconnectOneNote ?? ( ( ) => { } ) , onSyncOneNote ?? ( ( ) => { } ) ,
323+ getActiveProfile ?? ( ( ) => activeProfile ?? "" ) ,
324+ getProfiles ?? ( ( ) => profiles ?? [ ] ) ,
311325 ( ) => flyout . Hide ( ) ) ;
312- var storageValue = isFirebaseConnected ? Lang . T ( "cloud" )
326+ var storageValue = isFirebaseConnected ? "Firebase"
313327 : isWebDavConnected ? "WebDAV"
328+ : isOneNoteConnected ? "OneNote"
329+ : ! string . IsNullOrEmpty ( activeProfile ) ? activeProfile
314330 : isCustomFolder ? Lang . T ( "custom_folder" )
315331 : Lang . T ( "local" ) ;
316332 var storageBtn = CreateCascadeButton ( Lang . T ( "storage" ) , storageValue , storageSubMenu , "\uE753 " ) ;
317- storageBtn . Tag = Lang . T ( "storage" ) + " Cloud Firebase WebDAV Local" ;
333+ storageBtn . Tag = Lang . T ( "storage" ) + " Firebase WebDAV OneNote Local" ;
318334 allButtons . Add ( storageBtn ) ;
319335 panel . Children . Add ( storageBtn ) ;
320336
@@ -476,57 +492,146 @@ private static Flyout CreateRadioSubMenu(string groupName,
476492
477493 private static Flyout CreateStorageSubMenu (
478494 bool isCustomFolder , bool isFirebaseConnected , bool isWebDavConnected ,
495+ bool isOneNoteConnected ,
479496 string currentNotesFolder , string ? firebaseEmail , string ? webDavUrl ,
497+ string ? oneNoteUser ,
498+ string activeProfile , List < string > profiles ,
480499 Action onResetFolder , Action onChangeFolder ,
500+ Action < string > onSwitchProfile , Action onCreateProfile ,
501+ Action < string , Action > onRenameProfile , Action < string > onDeleteProfile ,
481502 Action onConfigureFirebase , Action onDisconnectFirebase , Action onSyncFirebase ,
482503 Action onConfigureWebDav , Action onDisconnectWebDav , Action onSyncWebDav ,
504+ Action onConfigureOneNote , Action onDisconnectOneNote , Action onSyncOneNote ,
505+ Func < string > getActiveProfile , Func < List < string > > getProfiles ,
483506 Action onDone )
484507 {
485508 var flyout = new Flyout
486509 {
487510 Placement = Microsoft . UI . Xaml . Controls . Primitives . FlyoutPlacementMode . RightEdgeAlignedTop ,
488- FlyoutPresenterStyle = CreateFlyoutPresenterStyle ( 200 , 300 )
511+ FlyoutPresenterStyle = CreateFlyoutPresenterStyle ( 210 , 360 )
489512 } ;
490513
491514 var panel = new StackPanel { Spacing = 0 } ;
492515
493- bool isLocal = ! isFirebaseConnected && ! isWebDavConnected && ! isCustomFolder ;
494- panel . Children . Add ( CreateCheckItem ( Lang . T ( "local" ) , isLocal , ( ) =>
516+ void RebuildPanel ( )
495517 {
496- if ( isCustomFolder ) onResetFolder ( ) ; else if ( isFirebaseConnected ) onDisconnectFirebase ( ) ;
497- onDone ( ) ;
498- } ) ) ;
518+ panel . Children . Clear ( ) ;
519+ var currentProfiles = getProfiles ( ) ;
520+ var currentActive = getActiveProfile ( ) ;
521+ bool cloudConnected = isFirebaseConnected || isWebDavConnected || isOneNoteConnected ;
499522
500- var folderLabel = isCustomFolder ? $ "{ Lang . T ( "custom_folder" ) } — { ShortenPath ( currentNotesFolder ) } " : Lang . T ( "custom_folder" ) ;
501- panel . Children . Add ( CreateCheckItem ( folderLabel , isCustomFolder && ! isFirebaseConnected , ( ) =>
502- {
503- onChangeFolder ( ) ; onDone ( ) ;
504- } ) ) ;
523+ // ── Local (default) ──
524+ bool defaultLocal = ! cloudConnected && ! isCustomFolder && string . IsNullOrEmpty ( currentActive ) ;
525+ panel . Children . Add ( CreateCheckItem ( Lang . T ( "local" ) , defaultLocal , ( ) =>
526+ {
527+ onSwitchProfile ( "" ) ;
528+ onDone ( ) ;
529+ } ) ) ;
505530
506- panel . Children . Add ( CreateSeparator ( ) ) ;
531+ // ── Profiles ──
532+ foreach ( var p in currentProfiles )
533+ {
534+ var name = p ;
535+ bool active = ! cloudConnected && string . Equals ( currentActive , name , StringComparison . OrdinalIgnoreCase ) ;
536+ var profileBtn = CreateCheckItem ( name , active , ( ) =>
537+ {
538+ onSwitchProfile ( name ) ;
539+ onDone ( ) ;
540+ } ) ;
507541
508- if ( isFirebaseConnected )
509- {
510- var cloudLabel = ! string . IsNullOrEmpty ( firebaseEmail ) ? $ "{ Lang . T ( "cloud" ) } — { firebaseEmail } " : Lang . T ( "cloud" ) ;
511- panel . Children . Add ( CreateCheckItem ( cloudLabel , true , ( ) => { onSyncFirebase ( ) ; onDone ( ) ; } ) ) ;
512- panel . Children . Add ( CreateActionItem ( Lang . T ( "disconnect" ) , ( ) => { onDisconnectFirebase ( ) ; onDone ( ) ; } ) ) ;
513- }
514- else
515- {
516- panel . Children . Add ( CreateCheckItem ( Lang . T ( "cloud" ) , false , ( ) => { onConfigureFirebase ( ) ; onDone ( ) ; } ) ) ;
517- }
542+ var ctxFlyout = new Flyout
543+ {
544+ Placement = Microsoft . UI . Xaml . Controls . Primitives . FlyoutPlacementMode . RightEdgeAlignedTop ,
545+ FlyoutPresenterStyle = CreateFlyoutPresenterStyle ( 140 , 80 )
546+ } ;
547+ var ctxPanel = new StackPanel { Spacing = 0 } ;
548+ ctxPanel . Children . Add ( CreateActionItem ( Lang . T ( "rename" ) , ( ) =>
549+ {
550+ ctxFlyout . Hide ( ) ;
551+ onRenameProfile ( name , RebuildPanel ) ;
552+ } ) ) ;
518553
519- if ( isWebDavConnected )
520- {
521- var wdLabel = ! string . IsNullOrEmpty ( webDavUrl ) ? $ "WebDAV — { ShortenPath ( webDavUrl ) } " : "WebDAV" ;
522- panel . Children . Add ( CreateCheckItem ( wdLabel , true , ( ) => { onSyncWebDav ( ) ; onDone ( ) ; } ) ) ;
523- panel . Children . Add ( CreateActionItem ( Lang . T ( "disconnect" ) , ( ) => { onDisconnectWebDav ( ) ; onDone ( ) ; } ) ) ;
524- }
525- else
526- {
527- panel . Children . Add ( CreateCheckItem ( "WebDAV" , false , ( ) => { onConfigureWebDav ( ) ; onDone ( ) ; } ) ) ;
554+ var deleteBtn = new Button
555+ {
556+ HorizontalAlignment = HorizontalAlignment . Stretch ,
557+ HorizontalContentAlignment = HorizontalAlignment . Stretch ,
558+ Background = new SolidColorBrush ( Microsoft . UI . Colors . Transparent ) ,
559+ BorderThickness = new Thickness ( 0 ) ,
560+ Padding = new Thickness ( 8 , 4 , 8 , 4 ) ,
561+ CornerRadius = new CornerRadius ( 4 ) ,
562+ MinHeight = 0 ,
563+ Content = new TextBlock
564+ {
565+ Text = Lang . T ( "delete" ) ,
566+ FontSize = 12 ,
567+ Foreground = new SolidColorBrush ( Windows . UI . Color . FromArgb ( 255 , 235 , 70 , 70 ) )
568+ }
569+ } ;
570+ deleteBtn . Click += ( _ , _ ) =>
571+ {
572+ ctxFlyout . Hide ( ) ;
573+ onDeleteProfile ( name ) ;
574+ RebuildPanel ( ) ;
575+ } ;
576+ ctxPanel . Children . Add ( deleteBtn ) ;
577+
578+ ctxFlyout . Content = ctxPanel ;
579+ profileBtn . ContextFlyout = ctxFlyout ;
580+ panel . Children . Add ( profileBtn ) ;
581+ }
582+
583+ // ── New profile button ──
584+ panel . Children . Add ( CreateActionItem ( "+ " + Lang . T ( "new_profile" ) , ( ) => { onCreateProfile ( ) ; onDone ( ) ; } ) ) ;
585+
586+ panel . Children . Add ( CreateSeparator ( ) ) ;
587+
588+ // ── Custom folder ──
589+ var folderLabel = isCustomFolder ? $ "{ Lang . T ( "custom_folder" ) } — { ShortenPath ( currentNotesFolder ) } " : Lang . T ( "custom_folder" ) ;
590+ panel . Children . Add ( CreateCheckItem ( folderLabel , isCustomFolder && ! cloudConnected , ( ) =>
591+ {
592+ onChangeFolder ( ) ; onDone ( ) ;
593+ } ) ) ;
594+
595+ panel . Children . Add ( CreateSeparator ( ) ) ;
596+
597+ // ── Firebase ──
598+ if ( isFirebaseConnected )
599+ {
600+ var fbLabel = ! string . IsNullOrEmpty ( firebaseEmail ) ? $ "Firebase — { firebaseEmail } " : "Firebase" ;
601+ panel . Children . Add ( CreateCheckItem ( fbLabel , true , ( ) => { onSyncFirebase ( ) ; onDone ( ) ; } ) ) ;
602+ panel . Children . Add ( CreateActionItem ( Lang . T ( "disconnect" ) , ( ) => { onDisconnectFirebase ( ) ; onDone ( ) ; } ) ) ;
603+ }
604+ else
605+ {
606+ panel . Children . Add ( CreateCheckItem ( "Firebase" , false , ( ) => { onConfigureFirebase ( ) ; onDone ( ) ; } ) ) ;
607+ }
608+
609+ // ── WebDAV ──
610+ if ( isWebDavConnected )
611+ {
612+ var wdLabel = ! string . IsNullOrEmpty ( webDavUrl ) ? $ "WebDAV — { ShortenPath ( webDavUrl ) } " : "WebDAV" ;
613+ panel . Children . Add ( CreateCheckItem ( wdLabel , true , ( ) => { onSyncWebDav ( ) ; onDone ( ) ; } ) ) ;
614+ panel . Children . Add ( CreateActionItem ( Lang . T ( "disconnect" ) , ( ) => { onDisconnectWebDav ( ) ; onDone ( ) ; } ) ) ;
615+ }
616+ else
617+ {
618+ panel . Children . Add ( CreateCheckItem ( "WebDAV" , false , ( ) => { onConfigureWebDav ( ) ; onDone ( ) ; } ) ) ;
619+ }
620+
621+ // ── OneNote ──
622+ if ( isOneNoteConnected )
623+ {
624+ var onLabel = ! string . IsNullOrEmpty ( oneNoteUser ) ? $ "OneNote — { oneNoteUser } " : "OneNote" ;
625+ panel . Children . Add ( CreateCheckItem ( onLabel , true , ( ) => { onSyncOneNote ( ) ; onDone ( ) ; } ) ) ;
626+ panel . Children . Add ( CreateActionItem ( Lang . T ( "disconnect" ) , ( ) => { onDisconnectOneNote ( ) ; onDone ( ) ; } ) ) ;
627+ }
628+ else
629+ {
630+ panel . Children . Add ( CreateCheckItem ( "OneNote" , false , ( ) => { onConfigureOneNote ( ) ; onDone ( ) ; } ) ) ;
631+ }
528632 }
529633
634+ RebuildPanel ( ) ;
530635 flyout . Content = panel ;
531636 return flyout ;
532637 }
0 commit comments