From d5d2a985729847ceea1a77fc4a554482c4665937 Mon Sep 17 00:00:00 2001 From: 21pages Date: Thu, 8 Sep 2022 08:52:56 +0800 Subject: [PATCH] sync language Signed-off-by: 21pages --- flutter/lib/common.dart | 19 ------------------- .../desktop/pages/desktop_setting_page.dart | 1 + flutter/lib/main.dart | 16 +++++++++++++++- src/flutter.rs | 4 ++++ src/flutter_ffi.rs | 17 ++++++++++++++--- src/ipc.rs | 1 + src/ui/cm.rs | 4 ++++ src/ui_cm_interface.rs | 8 ++++++++ 8 files changed, 47 insertions(+), 23 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 06d901368..92ae17f9a 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -218,17 +218,6 @@ class MyTheme { return dark ? ThemeMode.dark : ThemeMode.light; } - static registerEventHandler() { - if (desktopType != DesktopType.main) { - platformFFI.registerEventHandler('theme', 'theme-$desktopType', (evt) { - String? dark = evt['dark']; - if (dark != null) { - changeTo(dark == 'true'); - } - }); - } - } - static ColorThemeExtension color(BuildContext context) { return Theme.of(context).extension()!; } @@ -238,14 +227,6 @@ class MyTheme { } } -class ThemeModeNotifier { - final ValueNotifier brightness; - ThemeModeNotifier(this.brightness); - changeThemeBrightness({required Brightness brightness}) { - this.brightness.value = brightness; - } -} - bool isDarkTheme() { return Get.isDarkMode; } diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index a6ae89d71..823a32fb6 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -218,6 +218,7 @@ class _UserInterfaceState extends State<_UserInterface> onChanged: (key) async { await bind.mainSetLocalOption(key: "lang", value: key); Get.forceAppUpdate(); + bind.mainChangeLanguage(lang: key); }, ).marginOnly(left: _kContentHMargin); }); diff --git a/flutter/lib/main.dart b/flutter/lib/main.dart index 2ca1d3e51..8efc7c6ad 100644 --- a/flutter/lib/main.dart +++ b/flutter/lib/main.dart @@ -79,7 +79,7 @@ Future initEnv(String appType) async { await initGlobalFFI(); // await Firebase.initializeApp(); refreshCurrentUser(); - MyTheme.registerEventHandler(); + _registerEventHandler(); } void runMainApp(bool startService) async { @@ -270,3 +270,17 @@ _keepScaleBuilder() { ); }; } + +_registerEventHandler() { + if (desktopType != DesktopType.main) { + platformFFI.registerEventHandler('theme', 'theme', (evt) { + String? dark = evt['dark']; + if (dark != null) { + MyTheme.changeTo(dark == 'true'); + } + }); + platformFFI.registerEventHandler('language', 'language', (_) { + Get.forceAppUpdate(); + }); + } +} diff --git a/src/flutter.rs b/src/flutter.rs index ffabef1a9..b22c0da83 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -382,6 +382,10 @@ pub mod connection_manager { fn change_theme(&self, dark: bool) { self.push_event("theme", vec![("dark", &dark.to_string())]); } + + fn change_language(&self) { + self.push_event("language", vec![]); + } } impl FlutterHandler { diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 13966e07c..56d69f4c4 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -659,7 +659,7 @@ pub fn main_load_lan_peers() { }; } -pub fn main_change_theme(dark: bool) { +fn main_broadcast_message(data: &HashMap<&str, &str>) { let apps = vec![ flutter::APP_TYPE_DESKTOP_REMOTE, flutter::APP_TYPE_DESKTOP_FILE_TRANSFER, @@ -669,13 +669,24 @@ pub fn main_change_theme(dark: bool) { for app in apps { if let Some(s) = flutter::GLOBAL_EVENT_STREAM.read().unwrap().get(app) { - let data = HashMap::from([("name", "theme".to_owned()), ("dark", dark.to_string())]); - s.add(serde_json::ser::to_string(&data).unwrap_or("".to_owned())); + s.add(serde_json::ser::to_string(data).unwrap_or("".to_owned())); }; } +} + +pub fn main_change_theme(dark: bool) { + main_broadcast_message(&HashMap::from([ + ("name", "theme"), + ("dark", &dark.to_string()), + ])); send_to_cm(&crate::ipc::Data::Theme(dark)); } +pub fn main_change_language(lang: String) { + main_broadcast_message(&HashMap::from([("name", "language"), ("lang", &lang)])); + send_to_cm(&crate::ipc::Data::Language(lang)); +} + pub fn session_add_port_forward( id: String, local_port: i32, diff --git a/src/ipc.rs b/src/ipc.rs index 3d289e499..2d841755b 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -183,6 +183,7 @@ pub enum Data { Mouse(DataMouse), Control(DataControl), Theme(bool), + Language(String), Empty, } diff --git a/src/ui/cm.rs b/src/ui/cm.rs index 615718e4a..c5f64699a 100644 --- a/src/ui/cm.rs +++ b/src/ui/cm.rs @@ -51,6 +51,10 @@ impl InvokeUiCM for SciterHandler { fn change_theme(&self, _dark: bool) { // TODO } + + fn change_language(&self) { + // TODO + } } impl SciterHandler { diff --git a/src/ui_cm_interface.rs b/src/ui_cm_interface.rs index 92724bb25..a7082e9ee 100644 --- a/src/ui_cm_interface.rs +++ b/src/ui_cm_interface.rs @@ -62,6 +62,8 @@ pub trait InvokeUiCM: Send + Clone + 'static + Sized { fn new_message(&self, id: i32, text: String); fn change_theme(&self, dark: bool); + + fn change_language(&self); } impl Deref for ConnectionManager { @@ -200,6 +202,8 @@ pub enum ClipboardFileData { #[cfg(not(any(target_os = "android", target_os = "ios")))] #[tokio::main(flavor = "current_thread")] pub async fn start_ipc(cm: ConnectionManager) { + use hbb_common::config::LocalConfig; + let (tx_file, _rx_file) = mpsc::unbounded_channel::(); #[cfg(windows)] let cm_clip = cm.clone(); @@ -285,6 +289,10 @@ pub async fn start_ipc(cm: ConnectionManager) { Data::Theme(dark) => { cm.change_theme(dark); } + Data::Language(lang) => { + LocalConfig::set_option("lang".to_owned(), lang); + cm.change_language(); + } _ => { }