11use anyhow:: { Context , Result } ;
22use serde:: { Deserialize , Serialize } ;
3+ use std:: collections:: HashMap ;
34use std:: path:: PathBuf ;
45use std:: sync:: RwLock ;
56
6- const APP_NAME : & str = "clipper-slint" ;
7+ // Use the same app identifier as the Tauri app to share settings
8+ const APP_IDENTIFIER : & str = "codes.unwritten.clipper" ;
79const SETTINGS_FILE : & str = "settings.json" ;
810
11+ /// Theme preference: "light", "dark", or "auto" (follows system)
12+ /// Uses camelCase to match the Tauri app's settings format
913#[ derive( Debug , Clone , Copy , PartialEq , Eq , Serialize , Deserialize , Default ) ]
1014#[ serde( rename_all = "lowercase" ) ]
1115pub enum Theme {
@@ -15,55 +19,123 @@ pub enum Theme {
1519 Auto ,
1620}
1721
22+ /// Settings structure matching the Tauri app's settings.json format.
23+ /// All fields use camelCase to match the Tauri app's format.
24+ /// Fields not supported by clipper-slint are still deserialized to maintain
25+ /// compatibility when reading/writing the shared settings file.
1826#[ derive( Debug , Clone , Serialize , Deserialize ) ]
27+ #[ serde( rename_all = "camelCase" ) ]
1928pub struct Settings {
20- /// Whether to use the bundled server (true) or external server (false )
21- #[ serde( default = "default_use_bundled_server " ) ]
22- pub use_bundled_server : bool ,
29+ /// Server address for syncing clips (maps to external_server_url in the old format )
30+ #[ serde( default = "default_server_address " ) ]
31+ pub server_address : String ,
2332
24- /// External server URL (used when use_bundled_server is false)
25- #[ serde( default = "default_external_server_url" ) ]
26- pub external_server_url : String ,
33+ /// Default save location for clipped content (not used by clipper-slint)
34+ #[ serde( default ) ]
35+ pub default_save_location : Option < String > ,
36+
37+ /// Whether to show the main window on startup (not used by clipper-slint)
38+ #[ serde( default = "default_open_on_startup" ) ]
39+ pub open_on_startup : bool ,
40+
41+ /// Whether to start the application on login (not used by clipper-slint)
42+ #[ serde( default ) ]
43+ pub start_on_login : bool ,
2744
28- /// Port for the bundled server (persisted across restarts)
45+ /// Theme preference: light, dark, or auto
46+ #[ serde( default ) ]
47+ pub theme : Theme ,
48+
49+ /// Syntax highlighting theme for code snippets (not used by clipper-slint)
50+ #[ serde( default ) ]
51+ pub syntax_theme : String ,
52+
53+ /// Server port for the bundled server (persisted across restarts)
2954 #[ serde( default ) ]
3055 pub server_port : Option < u16 > ,
3156
32- /// Whether to listen on all interfaces (0.0.0.0) for LAN access
57+ /// Whether to use the bundled server (true) or external server (false)
58+ #[ serde( default = "default_use_bundled_server" ) ]
59+ pub use_bundled_server : bool ,
60+
61+ /// Whether to listen on all network interfaces (bundled server only)
3362 #[ serde( default ) ]
3463 pub listen_on_all_interfaces : bool ,
3564
36- /// UI theme (light, dark, auto )
65+ /// Language preference (not used by clipper-slint )
3766 #[ serde( default ) ]
38- pub theme : Theme ,
67+ pub language : Option < String > ,
3968
40- /// Whether auto-cleanup is enabled
69+ /// Whether to show toast notifications (not used by clipper-slint)
70+ #[ serde( default = "default_notifications_enabled" ) ]
71+ pub notifications_enabled : bool ,
72+
73+ /// Global shortcut to toggle window visibility (not used by clipper-slint)
74+ #[ serde( default = "default_global_shortcut" ) ]
75+ pub global_shortcut : String ,
76+
77+ /// Whether to enable automatic cleanup of old clips (bundled server only)
4178 #[ serde( default ) ]
4279 pub cleanup_enabled : bool ,
4380
44- /// Retention period in days for auto- cleanup
81+ /// Retention period in days for automatic cleanup (bundled server only)
4582 #[ serde( default = "default_cleanup_retention_days" ) ]
4683 pub cleanup_retention_days : u32 ,
4784
48- /// Bearer token for bundled server authentication (used when listen_on_all_interfaces is true)
49- #[ serde( default ) ]
50- pub bundled_server_token : Option < String > ,
51-
5285 /// Bearer token for external server authentication
5386 #[ serde( default ) ]
5487 pub external_server_token : Option < String > ,
5588
56- /// Maximum upload size in megabytes
89+ /// Bearer token for bundled server when external access is enabled
90+ #[ serde( default ) ]
91+ pub bundled_server_token : Option < String > ,
92+
93+ /// Maximum upload size in MB for bundled server
5794 #[ serde( default = "default_max_upload_size_mb" ) ]
5895 pub max_upload_size_mb : u64 ,
96+
97+ /// Settings dialog window geometry (not used by clipper-slint)
98+ #[ serde( default ) ]
99+ pub settings_window_geometry : serde_json:: Value ,
100+
101+ /// Main window geometry (not used by clipper-slint)
102+ #[ serde( default ) ]
103+ pub main_window_geometry : serde_json:: Value ,
104+
105+ /// Trusted certificate fingerprints for self-signed HTTPS servers
106+ #[ serde( default ) ]
107+ pub trusted_certificates : HashMap < String , String > ,
108+
109+ /// Enable debug logging to log file (not used by clipper-slint)
110+ #[ serde( default ) ]
111+ pub debug_logging : bool ,
112+ }
113+
114+ fn default_server_address ( ) -> String {
115+ "http://localhost:3000" . to_string ( )
116+ }
117+
118+ fn default_open_on_startup ( ) -> bool {
119+ true
59120}
60121
61122fn default_use_bundled_server ( ) -> bool {
62123 true
63124}
64125
65- fn default_external_server_url ( ) -> String {
66- "http://localhost:3000" . to_string ( )
126+ fn default_notifications_enabled ( ) -> bool {
127+ true
128+ }
129+
130+ fn default_global_shortcut ( ) -> String {
131+ #[ cfg( target_os = "macos" ) ]
132+ {
133+ "Command+Shift+V" . to_string ( )
134+ }
135+ #[ cfg( not( target_os = "macos" ) ) ]
136+ {
137+ "Ctrl+Shift+V" . to_string ( )
138+ }
67139}
68140
69141fn default_cleanup_retention_days ( ) -> u32 {
@@ -77,16 +149,27 @@ fn default_max_upload_size_mb() -> u64 {
77149impl Default for Settings {
78150 fn default ( ) -> Self {
79151 Self {
80- use_bundled_server : default_use_bundled_server ( ) ,
81- external_server_url : default_external_server_url ( ) ,
152+ server_address : default_server_address ( ) ,
153+ default_save_location : None ,
154+ open_on_startup : default_open_on_startup ( ) ,
155+ start_on_login : false ,
156+ theme : Theme :: default ( ) ,
157+ syntax_theme : String :: new ( ) ,
82158 server_port : None ,
159+ use_bundled_server : default_use_bundled_server ( ) ,
83160 listen_on_all_interfaces : false ,
84- theme : Theme :: default ( ) ,
161+ language : None ,
162+ notifications_enabled : default_notifications_enabled ( ) ,
163+ global_shortcut : default_global_shortcut ( ) ,
85164 cleanup_enabled : false ,
86165 cleanup_retention_days : default_cleanup_retention_days ( ) ,
87- bundled_server_token : None ,
88166 external_server_token : None ,
167+ bundled_server_token : None ,
89168 max_upload_size_mb : default_max_upload_size_mb ( ) ,
169+ settings_window_geometry : serde_json:: Value :: Object ( Default :: default ( ) ) ,
170+ main_window_geometry : serde_json:: Value :: Object ( Default :: default ( ) ) ,
171+ trusted_certificates : HashMap :: new ( ) ,
172+ debug_logging : false ,
90173 }
91174 }
92175}
@@ -100,7 +183,7 @@ impl SettingsManager {
100183 pub fn new ( ) -> Result < Self > {
101184 let config_dir = dirs:: config_dir ( )
102185 . context ( "Failed to get config directory" ) ?
103- . join ( APP_NAME ) ;
186+ . join ( APP_IDENTIFIER ) ;
104187
105188 std:: fs:: create_dir_all ( & config_dir) . context ( "Failed to create config directory" ) ?;
106189
@@ -187,13 +270,13 @@ impl SettingsManager {
187270 }
188271
189272 pub fn get_external_server_url ( & self ) -> String {
190- self . settings . read ( ) . unwrap ( ) . external_server_url . clone ( )
273+ self . settings . read ( ) . unwrap ( ) . server_address . clone ( )
191274 }
192275
193276 pub fn set_external_server_url ( & self , url : String ) -> Result < ( ) > {
194277 {
195278 let mut settings = self . settings . write ( ) . unwrap ( ) ;
196- settings. external_server_url = url;
279+ settings. server_address = url;
197280 }
198281 self . save ( )
199282 }
0 commit comments