From 74a9656216d84852635532892a9c621d06fefad8 Mon Sep 17 00:00:00 2001 From: Dan Ballard Date: Fri, 2 Feb 2024 18:08:21 -0800 Subject: [PATCH] formatting with -l 200 --- lib/cwtch/gomobile.dart | 1 - lib/themes/opaque.dart | 231 ++++---- lib/themes/yamltheme.dart | 15 +- lib/views/globalsettingsaboutview.dart | 228 +++----- lib/views/globalsettingsappearanceview.dart | 473 +++++++--------- lib/views/globalsettingsbehaviourview.dart | 113 ++-- lib/views/globalsettingsexperimentsview.dart | 541 +++++++------------ lib/views/globalsettingsview.dart | 33 +- lib/widgets/folderpicker.dart | 5 +- 9 files changed, 641 insertions(+), 999 deletions(-) diff --git a/lib/cwtch/gomobile.dart b/lib/cwtch/gomobile.dart index fc50bfb3..89ac928e 100644 --- a/lib/cwtch/gomobile.dart +++ b/lib/cwtch/gomobile.dart @@ -57,7 +57,6 @@ class CwtchGomobile implements Cwtch { cwtchNotifier.setMessageSeenCallback((String profile, int conversation, DateTime time) => {this.SetConversationAttribute(profile, conversation, LastMessageSeenTimeKey, time.toIso8601String())}); androidHomeDirectory = getApplicationDocumentsDirectory(); - androidLibraryDir = appInfoPlatform.invokeMethod('getNativeLibDir'); // Method channel to receive libcwtch-go events via Kotlin and dispatch them to _handleAppbusEvent (sends to cwtchNotifier) diff --git a/lib/themes/opaque.dart b/lib/themes/opaque.dart index 42c71bc9..e1c5b514 100644 --- a/lib/themes/opaque.dart +++ b/lib/themes/opaque.dart @@ -132,7 +132,9 @@ abstract class OpaqueThemeType { get chatImageColor => red; get chatImage => null; - ImageProvider loadImage(String key, {BuildContext? context}) { return AssetImage(""); } + ImageProvider loadImage(String key, {BuildContext? context}) { + return AssetImage(""); + } // Sizes double contactOnionTextSize() { @@ -142,122 +144,117 @@ abstract class OpaqueThemeType { ThemeData mkThemeData(Settings opaque) { return ThemeData( - hoverColor: opaque.current().backgroundHilightElementColor.withOpacity(0.5), - visualDensity: VisualDensity.adaptivePlatformDensity, - primarySwatch: Colors.red, - primaryIconTheme: IconThemeData( - color: opaque.current().mainTextColor, - ), - primaryColor: opaque.current().mainTextColor, - canvasColor: opaque.current().backgroundMainColor, - backgroundColor: opaque.current().backgroundMainColor, - highlightColor: opaque.current().hilightElementColor, - iconTheme: IconThemeData( - color: opaque.current().toolbarIconColor, - ), - cardColor: opaque.current().backgroundMainColor, - appBarTheme: AppBarTheme( - systemOverlayStyle: SystemUiOverlayStyle( - // Status bar color - statusBarColor: opaque.current().topbarColor, - // Status bar brightness (optional) - statusBarIconBrightness: opaque.current().mode == mode_light ? Brightness.dark : Brightness.light, // For Android (dark icons) - statusBarBrightness: opaque.current().mode == mode_light ? Brightness.dark : Brightness.light, // For iOS (dark icons) - ), - backgroundColor: opaque.current().topbarColor, - iconTheme: IconThemeData( - color: opaque.current().mainTextColor, - ), - titleTextStyle: TextStyle(fontWeight: FontWeight.bold, fontFamily: "Inter", color: opaque.current().mainTextColor, fontSize: opaque.fontScaling * 18.0), - actionsIconTheme: IconThemeData( - color: opaque.current().mainTextColor, - )), - - //bottomNavigationBarTheme: BottomNavigationBarThemeData(type: BottomNavigationBarType.fixed, backgroundColor: opaque.current().backgroundHilightElementColor), // Can't determine current use - textButtonTheme: TextButtonThemeData( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all(opaque.current().defaultButtonColor), - foregroundColor: MaterialStateProperty.all(opaque.current().defaultButtonTextColor), - overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor), - padding: MaterialStateProperty.all(EdgeInsets.all(20))), - ), - hintColor: opaque.current().textfieldHintColor, - elevatedButtonTheme: ElevatedButtonThemeData( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.resolveWith((states) => states.contains(MaterialState.disabled) ? opaque.current().defaultButtonDisabledColor : opaque.current().defaultButtonColor), - foregroundColor: MaterialStateProperty.all(opaque.current().defaultButtonTextColor), - overlayColor: MaterialStateProperty.resolveWith((states) => (states.contains(MaterialState.pressed) && states.contains(MaterialState.hovered)) - ? opaque.current().defaultButtonActiveColor - : states.contains(MaterialState.disabled) - ? opaque.current().defaultButtonDisabledColor - : null), - enableFeedback: true, - textStyle: MaterialStateProperty.all(opaque.scaleFonts(defaultTextButtonStyle)), - padding: MaterialStateProperty.all(EdgeInsets.all(20)), - shape: MaterialStateProperty.all(RoundedRectangleBorder( - borderRadius: BorderRadius.circular(6.0), - )), + hoverColor: opaque.current().backgroundHilightElementColor.withOpacity(0.5), + visualDensity: VisualDensity.adaptivePlatformDensity, + primarySwatch: Colors.red, + primaryIconTheme: IconThemeData( + color: opaque.current().mainTextColor, ), - ), + primaryColor: opaque.current().mainTextColor, + canvasColor: opaque.current().backgroundMainColor, + backgroundColor: opaque.current().backgroundMainColor, + highlightColor: opaque.current().hilightElementColor, + iconTheme: IconThemeData( + color: opaque.current().toolbarIconColor, + ), + cardColor: opaque.current().backgroundMainColor, + appBarTheme: AppBarTheme( + systemOverlayStyle: SystemUiOverlayStyle( + // Status bar color + statusBarColor: opaque.current().topbarColor, + // Status bar brightness (optional) + statusBarIconBrightness: opaque.current().mode == mode_light ? Brightness.dark : Brightness.light, // For Android (dark icons) + statusBarBrightness: opaque.current().mode == mode_light ? Brightness.dark : Brightness.light, // For iOS (dark icons) + ), + backgroundColor: opaque.current().topbarColor, + iconTheme: IconThemeData( + color: opaque.current().mainTextColor, + ), + titleTextStyle: TextStyle(fontWeight: FontWeight.bold, fontFamily: "Inter", color: opaque.current().mainTextColor, fontSize: opaque.fontScaling * 18.0), + actionsIconTheme: IconThemeData( + color: opaque.current().mainTextColor, + )), - scrollbarTheme: ScrollbarThemeData(thumbVisibility: MaterialStateProperty.all(false), thumbColor: MaterialStateProperty.all(opaque.current().scrollbarDefaultColor)), - tabBarTheme: TabBarTheme( - labelColor: opaque.current().mainTextColor, - unselectedLabelColor: opaque.current().mainTextColor, - indicator: UnderlineTabIndicator(borderSide: BorderSide(color: opaque.current().defaultButtonActiveColor)), - labelStyle: opaque.scaleFonts(defaultTextButtonStyle), - unselectedLabelStyle: opaque.scaleFonts(defaultTextStyle), - ), - dialogTheme: DialogTheme( - backgroundColor: opaque.current().backgroundPaneColor, - titleTextStyle: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, color: opaque.current().mainTextColor), - contentTextStyle: TextStyle( - fontFamily: "Inter", - color: opaque.current().mainTextColor, - )), - textTheme: TextTheme( - // NOTE: The following font scales were arrived at after consulting the material text scale - // docs: https://m3.material.io/styles/typography/type-scale-tokens and some trial and error - displaySmall: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 14.0, color: opaque.current().mainTextColor), - displayMedium: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), - displayLarge: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 18.0, color: opaque.current().mainTextColor), - titleSmall: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), - titleLarge: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 18.0, color: opaque.current().mainTextColor), - titleMedium: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 20.0, color: opaque.current().mainTextColor), - bodySmall: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 12.0, color: opaque.current().mainTextColor), - bodyMedium: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 14.0, color: opaque.current().mainTextColor), - bodyLarge: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), - headlineSmall: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 24.0, color: opaque.current().mainTextColor), - headlineMedium: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 26.0, color: opaque.current().mainTextColor), - headlineLarge: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 28.0, color: opaque.current().mainTextColor), - labelSmall: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.w100, fontSize: opaque.fontScaling * 14.0, color: opaque.current().mainTextColor), - labelMedium: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.w300, fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), - labelLarge: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.w200, fontSize: opaque.fontScaling * 18.0, color: opaque.current().mainTextColor), - ), - switchTheme: SwitchThemeData( - overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor), - thumbColor: MaterialStateProperty.all(opaque.current().mainTextColor), - trackColor: MaterialStateProperty.all(opaque.current().dropShadowColor), - ), - // the only way to change the text Selection Context Menu Color ?! - brightness: opaque.current().mode == mode_dark ? Brightness.dark : Brightness.light, - floatingActionButtonTheme: FloatingActionButtonThemeData( - foregroundColor: opaque.current().mainTextColor, - backgroundColor: opaque.current().defaultButtonColor, - hoverColor: opaque.current().defaultButtonActiveColor, - enableFeedback: true, - splashColor: opaque.current().defaultButtonActiveColor), - textSelectionTheme: TextSelectionThemeData( - cursorColor: opaque.current().defaultButtonActiveColor, selectionColor: opaque.current().defaultButtonActiveColor, selectionHandleColor: opaque.current().defaultButtonActiveColor), - popupMenuTheme: PopupMenuThemeData( - color: opaque - .current() - .backgroundPaneColor - .withOpacity(0.9), - ), - snackBarTheme: SnackBarThemeData( - backgroundColor: opaque.current().snackbarBackgroundColor, - contentTextStyle: TextStyle(color: opaque.current().snackbarTextColor), - ) - ); + //bottomNavigationBarTheme: BottomNavigationBarThemeData(type: BottomNavigationBarType.fixed, backgroundColor: opaque.current().backgroundHilightElementColor), // Can't determine current use + textButtonTheme: TextButtonThemeData( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(opaque.current().defaultButtonColor), + foregroundColor: MaterialStateProperty.all(opaque.current().defaultButtonTextColor), + overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor), + padding: MaterialStateProperty.all(EdgeInsets.all(20))), + ), + hintColor: opaque.current().textfieldHintColor, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.resolveWith((states) => states.contains(MaterialState.disabled) ? opaque.current().defaultButtonDisabledColor : opaque.current().defaultButtonColor), + foregroundColor: MaterialStateProperty.all(opaque.current().defaultButtonTextColor), + overlayColor: MaterialStateProperty.resolveWith((states) => (states.contains(MaterialState.pressed) && states.contains(MaterialState.hovered)) + ? opaque.current().defaultButtonActiveColor + : states.contains(MaterialState.disabled) + ? opaque.current().defaultButtonDisabledColor + : null), + enableFeedback: true, + textStyle: MaterialStateProperty.all(opaque.scaleFonts(defaultTextButtonStyle)), + padding: MaterialStateProperty.all(EdgeInsets.all(20)), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6.0), + )), + ), + ), + scrollbarTheme: ScrollbarThemeData(thumbVisibility: MaterialStateProperty.all(false), thumbColor: MaterialStateProperty.all(opaque.current().scrollbarDefaultColor)), + tabBarTheme: TabBarTheme( + labelColor: opaque.current().mainTextColor, + unselectedLabelColor: opaque.current().mainTextColor, + indicator: UnderlineTabIndicator(borderSide: BorderSide(color: opaque.current().defaultButtonActiveColor)), + labelStyle: opaque.scaleFonts(defaultTextButtonStyle), + unselectedLabelStyle: opaque.scaleFonts(defaultTextStyle), + ), + dialogTheme: DialogTheme( + backgroundColor: opaque.current().backgroundPaneColor, + titleTextStyle: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, color: opaque.current().mainTextColor), + contentTextStyle: TextStyle( + fontFamily: "Inter", + color: opaque.current().mainTextColor, + )), + textTheme: TextTheme( + // NOTE: The following font scales were arrived at after consulting the material text scale + // docs: https://m3.material.io/styles/typography/type-scale-tokens and some trial and error + displaySmall: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 14.0, color: opaque.current().mainTextColor), + displayMedium: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), + displayLarge: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 18.0, color: opaque.current().mainTextColor), + titleSmall: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), + titleLarge: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 18.0, color: opaque.current().mainTextColor), + titleMedium: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 20.0, color: opaque.current().mainTextColor), + bodySmall: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 12.0, color: opaque.current().mainTextColor), + bodyMedium: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 14.0, color: opaque.current().mainTextColor), + bodyLarge: TextStyle(fontFamily: "Inter", fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), + headlineSmall: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 24.0, color: opaque.current().mainTextColor), + headlineMedium: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 26.0, color: opaque.current().mainTextColor), + headlineLarge: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.bold, fontSize: opaque.fontScaling * 28.0, color: opaque.current().mainTextColor), + labelSmall: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.w100, fontSize: opaque.fontScaling * 14.0, color: opaque.current().mainTextColor), + labelMedium: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.w300, fontSize: opaque.fontScaling * 16.0, color: opaque.current().mainTextColor), + labelLarge: TextStyle(fontFamily: "Inter", fontWeight: FontWeight.w200, fontSize: opaque.fontScaling * 18.0, color: opaque.current().mainTextColor), + ), + switchTheme: SwitchThemeData( + overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor), + thumbColor: MaterialStateProperty.all(opaque.current().mainTextColor), + trackColor: MaterialStateProperty.all(opaque.current().dropShadowColor), + ), + // the only way to change the text Selection Context Menu Color ?! + brightness: opaque.current().mode == mode_dark ? Brightness.dark : Brightness.light, + floatingActionButtonTheme: FloatingActionButtonThemeData( + foregroundColor: opaque.current().mainTextColor, + backgroundColor: opaque.current().defaultButtonColor, + hoverColor: opaque.current().defaultButtonActiveColor, + enableFeedback: true, + splashColor: opaque.current().defaultButtonActiveColor), + textSelectionTheme: TextSelectionThemeData( + cursorColor: opaque.current().defaultButtonActiveColor, selectionColor: opaque.current().defaultButtonActiveColor, selectionHandleColor: opaque.current().defaultButtonActiveColor), + popupMenuTheme: PopupMenuThemeData( + color: opaque.current().backgroundPaneColor.withOpacity(0.9), + ), + snackBarTheme: SnackBarThemeData( + backgroundColor: opaque.current().snackbarBackgroundColor, + contentTextStyle: TextStyle(color: opaque.current().snackbarTextColor), + )); } diff --git a/lib/themes/yamltheme.dart b/lib/themes/yamltheme.dart index 97a2fc9d..eb90c7a0 100644 --- a/lib/themes/yamltheme.dart +++ b/lib/themes/yamltheme.dart @@ -41,14 +41,13 @@ Future>> loadBuiltinThemes() async { } Future>> loadCustomThemes(String themesDirPath) async { - Map> themes = Map(); Directory themesDir = Directory(themesDirPath); - if (! themesDir.existsSync()) { + if (!themesDir.existsSync()) { themesDir = await themesDir.create(); } - await themesDir.list(recursive: false).forEach( (themeDir) async { + await themesDir.list(recursive: false).forEach((themeDir) async { //final themeDir = Directory(path.join(themesDir, themedir)); File themefile = File(path.join(themeDir.path, "theme.yml")); if (themefile.existsSync()) { @@ -63,7 +62,7 @@ Future>> loadCustomThemes(String themes } } }); - + return themes; } @@ -97,7 +96,6 @@ Future?> loadFileYamlTheme(String themefile, String return loadYamlTheme(yml, assetsDir); } - Future?> loadYamlTheme(YamlMap yml, [String? assetsDir]) async { Map subthemes = Map(); if ((yml["themes"] as YamlMap).containsKey(mode_dark)) { @@ -143,7 +141,7 @@ class YmlTheme extends OpaqueThemeType { return null; } - if ( val <= 0xFFFFFF) { + if (val <= 0xFFFFFF) { return Color(0xFF000000 + val); } else { return Color(val); @@ -219,10 +217,7 @@ class YmlTheme extends OpaqueThemeType { } if (context != null) { - File af = File(path.join(Provider - .of(context, listen: false) - .cwtch - .getAssetsDir(), key)); + File af = File(path.join(Provider.of(context, listen: false).cwtch.getAssetsDir(), key)); if (af.existsSync()) { return FileImage(af); } diff --git a/lib/views/globalsettingsaboutview.dart b/lib/views/globalsettingsaboutview.dart index 215a819c..ccf8919c 100644 --- a/lib/views/globalsettingsaboutview.dart +++ b/lib/views/globalsettingsaboutview.dart @@ -19,154 +19,104 @@ class GlobalSettingsAboutView extends StatefulWidget { } class _GlobalSettingsAboutViewState extends State { - ScrollController settingsListScrollController = ScrollController(); Widget build(BuildContext context) { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { - var appIcon = Icon(Icons.info, color: settings - .current() - .mainTextColor); - return Scrollbar( - key: Key("AboutSettingsView"), - trackVisibility: true, + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { + var appIcon = Icon(Icons.info, color: settings.current().mainTextColor); + return Scrollbar( + key: Key("AboutSettingsView"), + trackVisibility: true, + controller: settingsListScrollController, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, controller: settingsListScrollController, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - controller: settingsListScrollController, - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - ), - child: Column(children: [ - AboutListTile( - icon: appIcon, - applicationIcon: Padding( - padding: EdgeInsets.all(5), - child: Icon(CwtchIcons.cwtch_knott)), - applicationName: "Cwtch UI", - applicationLegalese: - '\u{a9} 2021-2023 Open Privacy Research Society', - aboutBoxChildren: [ - Padding( - padding: EdgeInsets.fromLTRB( - 24.0 + 10.0 + (appIcon.size ?? 24.0), - 16.0, - 0.0, - 0.0), - // About has 24 padding (ln 389) and there appears to be another 10 of padding in the widget - child: SelectableText( - AppLocalizations.of(context)! - .versionBuilddate - .replaceAll( - "%1", EnvironmentConfig.BUILD_VER) - .replaceAll("%2", - EnvironmentConfig.BUILD_DATE)), - ) - ]), - SwitchListTile( - // TODO: Translate, Remove, OR Hide Prior to Release - title: Text("Show Performance Overlay"), - subtitle: - Text("Display an overlay graph of render time."), - value: settings.profileMode, + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Column(children: [ + AboutListTile( + icon: appIcon, + applicationIcon: Padding(padding: EdgeInsets.all(5), child: Icon(CwtchIcons.cwtch_knott)), + applicationName: "Cwtch UI", + applicationLegalese: '\u{a9} 2021-2023 Open Privacy Research Society', + aboutBoxChildren: [ + Padding( + padding: EdgeInsets.fromLTRB(24.0 + 10.0 + (appIcon.size ?? 24.0), 16.0, 0.0, 0.0), + // About has 24 padding (ln 389) and there appears to be another 10 of padding in the widget + child: SelectableText(AppLocalizations.of(context)!.versionBuilddate.replaceAll("%1", EnvironmentConfig.BUILD_VER).replaceAll("%2", EnvironmentConfig.BUILD_DATE)), + ) + ]), + SwitchListTile( + // TODO: Translate, Remove, OR Hide Prior to Release + title: Text("Show Performance Overlay"), + subtitle: Text("Display an overlay graph of render time."), + value: settings.profileMode, + onChanged: (bool value) { + setState(() { + if (value) { + settings.profileMode = value; + } else { + settings.profileMode = value; + } + }); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.bar_chart, color: settings.current().mainTextColor), + ), + Visibility( + visible: EnvironmentConfig.BUILD_VER == dev_version && !Platform.isAndroid, + child: SwitchListTile( + title: Text("Show Semantic Debugger"), + subtitle: Text("Show Accessibility Debugging View"), + value: settings.useSemanticDebugger, onChanged: (bool value) { - setState(() { - if (value) { - settings.profileMode = value; - } else { - settings.profileMode = value; - } - }); + if (value) { + settings.useSemanticDebugger = value; + } else { + settings.useSemanticDebugger = value; + } + saveSettings(context); }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.bar_chart, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: - EnvironmentConfig.BUILD_VER == dev_version && - !Platform.isAndroid, - child: SwitchListTile( - title: Text("Show Semantic Debugger"), - subtitle: - Text("Show Accessibility Debugging View"), - value: settings.useSemanticDebugger, - onChanged: (bool value) { - if (value) { - settings.useSemanticDebugger = value; - } else { - settings.useSemanticDebugger = value; - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.settings_accessibility, - color: settings - .current() - .mainTextColor), - )), - Visibility( - visible: EnvironmentConfig.BUILD_VER == dev_version && - !Platform.isAndroid, - child: FutureBuilder( - future: - EnvironmentConfig.BUILD_VER != dev_version || - Platform.isAndroid - ? null - : Provider - .of(context) - .cwtch - .GetDebugInfo(), + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.settings_accessibility, color: settings.current().mainTextColor), + )), + Visibility( + visible: EnvironmentConfig.BUILD_VER == dev_version && !Platform.isAndroid, + child: FutureBuilder( + future: EnvironmentConfig.BUILD_VER != dev_version || Platform.isAndroid ? null : Provider.of(context).cwtch.GetDebugInfo(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Column( + children: [ + Text("libCwtch Debug Info: " + snapshot.data.toString()), + Text("Message Cache Size (Mb): " + (Provider.of(context).profs.cacheMemUsage() / (1024 * 1024)).toString()) + ], + ); + } else { + return Container(); + } + }, + ), + ), + Visibility( + visible: EnvironmentConfig.BUILD_VER == dev_version, + child: FutureBuilder( + future: Provider.of(context).cwtch.PlatformChannelInfo(), builder: (context, snapshot) { if (snapshot.hasData) { - return Column( - children: [ - Text("libCwtch Debug Info: " + - snapshot.data.toString()), - Text("Message Cache Size (Mb): " + - (Provider - .of(context) - .profs - .cacheMemUsage() / - (1024 * 1024)) - .toString()) - ], - ); - } else { - return Container(); + HashMap data = snapshot.data as HashMap; + return getPlatformInfo(settings, data); } - }, - ), - ), - Visibility( - visible: EnvironmentConfig.BUILD_VER == dev_version, - child: FutureBuilder( - future: Provider - .of(context) - .cwtch - .PlatformChannelInfo(), - builder: (context, snapshot) { - if (snapshot.hasData) { - HashMap data = snapshot.data - as HashMap; - return getPlatformInfo(settings, data); - } - return Container(); - })) - ])))); - }); + return Container(); + })) + ])))); + }); }); } @@ -194,4 +144,4 @@ class _GlobalSettingsAboutViewState extends State { } return pinfo.version + "." + pinfo.buildNumber; } -} \ No newline at end of file +} diff --git a/lib/views/globalsettingsappearanceview.dart b/lib/views/globalsettingsappearanceview.dart index 1e310d52..cf31d9e0 100644 --- a/lib/views/globalsettingsappearanceview.dart +++ b/lib/views/globalsettingsappearanceview.dart @@ -27,109 +27,74 @@ class _GlobalSettingsAppearanceViewState extends State(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { - return Scrollbar( - key: Key("AppearanceSettingsView"), - trackVisibility: true, + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { + return Scrollbar( + key: Key("AppearanceSettingsView"), + trackVisibility: true, + controller: settingsListScrollController, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, controller: settingsListScrollController, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - controller: settingsListScrollController, - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - ), - child: Column(children: [ - ListTile( - title: Text( - AppLocalizations.of(context)!.settingLanguage), - leading: Icon(CwtchIcons.change_language, - color: settings - .current() - .mainTextColor), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: DropdownButton( - key: Key("languagelist"), - isExpanded: true, - value: Provider - .of(context) - .locale - .toString(), - onChanged: (String? newValue) { - setState(() { - EnvironmentConfig.debugLog( - "setting language: $newValue"); - settings.switchLocaleByCode(newValue!); - saveSettings(context); - }); - }, - items: AppLocalizations.supportedLocales - .map>( - (Locale value) { - return DropdownMenuItem( - value: value.toString(), - child: Text( - key: Key("dropdownLanguage" + - value.languageCode), - getLanguageFull( - context, - value.languageCode, - value.countryCode), - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle), - overflow: TextOverflow.ellipsis, - ), - ); - }).toList()))), - SwitchListTile( - title: - Text(AppLocalizations.of(context)!.settingTheme), - value: settings - .current() - .mode == mode_light, - onChanged: (bool value) { - if (value) { - settings.setTheme( - settings.theme.theme, mode_light); - } else { - settings.setTheme( - settings.theme.theme, mode_dark); - } + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Column(children: [ + ListTile( + title: Text(AppLocalizations.of(context)!.settingLanguage), + leading: Icon(CwtchIcons.change_language, color: settings.current().mainTextColor), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: DropdownButton( + key: Key("languagelist"), + isExpanded: true, + value: Provider.of(context).locale.toString(), + onChanged: (String? newValue) { + setState(() { + EnvironmentConfig.debugLog("setting language: $newValue"); + settings.switchLocaleByCode(newValue!); + saveSettings(context); + }); + }, + items: AppLocalizations.supportedLocales.map>((Locale value) { + return DropdownMenuItem( + value: value.toString(), + child: Text( + key: Key("dropdownLanguage" + value.languageCode), + getLanguageFull(context, value.languageCode, value.countryCode), + style: settings.scaleFonts(defaultDropDownMenuItemTextStyle), + overflow: TextOverflow.ellipsis, + ), + ); + }).toList()))), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingTheme), + value: settings.current().mode == mode_light, + onChanged: (bool value) { + if (value) { + settings.setTheme(settings.theme.theme, mode_light); + } else { + settings.setTheme(settings.theme.theme, mode_dark); + } // Save Settings... - saveSettings(context); - }, - activeTrackColor: settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.change_theme, - color: settings - .current() - .mainTextColor), - ), - ListTile( - title: Text( - AppLocalizations.of(context)!.themeColorLabel), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: DropdownButton( - key: Key("DropdownTheme"), - isExpanded: true, - value: Provider - .of(context) - .theme - .theme, - onChanged: (String? newValue) { - setState(() { + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.change_theme, color: settings.current().mainTextColor), + ), + ListTile( + title: Text(AppLocalizations.of(context)!.themeColorLabel), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: DropdownButton( + key: Key("DropdownTheme"), + isExpanded: true, + value: Provider.of(context).theme.theme, + onChanged: (String? newValue) { + setState(() { settings.setTheme(newValue!, settings.theme.mode); saveSettings(context); }); @@ -142,39 +107,39 @@ class _GlobalSettingsAppearanceViewState extends State(context).theme.messageFromMeTextColor), - title: Text(AppLocalizations.of(context)!.settingsImportThemeTitle), - subtitle: Text(AppLocalizations.of(context)!.settingsImportThemeDescription), - //AppLocalizations.of( - //context)! - //.fileSharingSettingsDownloadFolderDescription, - trailing: Container( - width: MediaQuery.of(context).size.width / 4, - child: ElevatedButton.icon( - label: Text(AppLocalizations.of(context)!.settingsImportThemeButton), - onPressed: Provider.of(context).disableFilePicker - ? null - : () async { - if (Platform.isAndroid) { - return; - } - var selectedDirectory = await showSelectDirectoryPicker(context); - if (selectedDirectory != null) { - selectedDirectory += path.separator; - final customThemeDir = path.join(await Provider.of(context, listen: false).cwtch.getCwtchDir(), custom_themes_subdir); - importThemeCheck(context, settings, customThemeDir, selectedDirectory); - } else { - // User canceled the picker - } - }, - //onChanged: widget.onSave, - icon: Icon(Icons.folder), - //tooltip: widget.tooltip, - )))), + Visibility( + // TODO: Android support needs gomobile support for reading / writing themes, and ideally importing from a .zip or .tar.gz + visible: !Platform.isAndroid, + child: ListTile( + leading: Icon(Icons.palette, color: Provider.of(context).theme.messageFromMeTextColor), + title: Text(AppLocalizations.of(context)!.settingsImportThemeTitle), + subtitle: Text(AppLocalizations.of(context)!.settingsImportThemeDescription), + //AppLocalizations.of( + //context)! + //.fileSharingSettingsDownloadFolderDescription, + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: ElevatedButton.icon( + label: Text(AppLocalizations.of(context)!.settingsImportThemeButton), + onPressed: Provider.of(context).disableFilePicker + ? null + : () async { + if (Platform.isAndroid) { + return; + } + var selectedDirectory = await showSelectDirectoryPicker(context); + if (selectedDirectory != null) { + selectedDirectory += path.separator; + final customThemeDir = path.join(await Provider.of(context, listen: false).cwtch.getCwtchDir(), custom_themes_subdir); + importThemeCheck(context, settings, customThemeDir, selectedDirectory); + } else { + // User canceled the picker + } + }, + //onChanged: widget.onSave, + icon: Icon(Icons.folder), + //tooltip: widget.tooltip, + )))), SwitchListTile( title: Text(AppLocalizations.of(context)!.settingsThemeImages), subtitle: Text(AppLocalizations.of(context)!.settingsThemeImagesDescription), @@ -189,168 +154,100 @@ class _GlobalSettingsAppearanceViewState extends State>((DualpaneMode value) { + return DropdownMenuItem( + value: value.toString(), + child: Text(Settings.uiColumnModeToString(value, context), style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList()))), + ListTile( + title: Text( + AppLocalizations.of(context)!.settingUIColumnLandscape, + textWidthBasis: TextWidthBasis.longestLine, + softWrap: true, + ), + leading: Icon(Icons.stay_primary_landscape, color: settings.current().mainTextColor), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: Container( + width: MediaQuery.of(context).size.width / 4, child: DropdownButton( isExpanded: true, - value: settings.uiColumnModePortrait - .toString(), + value: settings.uiColumnModeLandscape.toString(), onChanged: (String? newValue) { - settings.uiColumnModePortrait = - Settings.uiColumnModeFromString( - newValue!); + settings.uiColumnModeLandscape = Settings.uiColumnModeFromString(newValue!); saveSettings(context); }, - items: Settings.uiColumnModeOptions(false) - .map>( - (DualpaneMode value) { - return DropdownMenuItem( - value: value.toString(), - child: Text( - Settings.uiColumnModeToString( - value, context), - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList()))), - ListTile( - title: Text( - AppLocalizations.of(context)! - .settingUIColumnLandscape, - textWidthBasis: TextWidthBasis.longestLine, - softWrap: true, - ), - leading: Icon(Icons.stay_primary_landscape, - color: settings - .current() - .mainTextColor), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: Container( - width: - MediaQuery - .of(context) - .size - .width / 4, - child: DropdownButton( - isExpanded: true, - value: settings.uiColumnModeLandscape - .toString(), - onChanged: (String? newValue) { - settings.uiColumnModeLandscape = - Settings.uiColumnModeFromString( - newValue!); - saveSettings(context); - }, - items: - Settings.uiColumnModeOptions(true) - .map>( - (DualpaneMode value) { - return DropdownMenuItem( - value: value.toString(), - child: Text( - Settings.uiColumnModeToString( - value, context), - overflow: TextOverflow.ellipsis, - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList())))), - ListTile( - title: Text( - AppLocalizations.of(context)!.defaultScalingText), - subtitle: Text(AppLocalizations.of(context)! - .fontScalingDescription), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: Slider( - onChanged: (double value) { - settings.fontScaling = value; + items: Settings.uiColumnModeOptions(true).map>((DualpaneMode value) { + return DropdownMenuItem( + value: value.toString(), + child: Text(Settings.uiColumnModeToString(value, context), overflow: TextOverflow.ellipsis, style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList())))), + ListTile( + title: Text(AppLocalizations.of(context)!.defaultScalingText), + subtitle: Text(AppLocalizations.of(context)!.fontScalingDescription), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: Slider( + onChanged: (double value) { + settings.fontScaling = value; // Save Settings... - saveSettings(context); - EnvironmentConfig.debugLog( - "Font Scaling: $value"); - }, - min: 0.5, - divisions: 12, - max: 2.0, - label: '${settings.fontScaling * 100}%', - activeColor: - settings - .current() - .defaultButtonColor, - thumbColor: settings - .current() - .mainTextColor, - overlayColor: MaterialStateProperty.all( - settings - .current() - .mainTextColor), - inactiveColor: - settings.theme.defaultButtonDisabledColor, - value: settings.fontScaling)), - leading: Icon(Icons.format_size, - color: settings - .current() - .mainTextColor), - ), - SwitchListTile( - title: Text( - AppLocalizations.of(context)!.streamerModeLabel), - subtitle: Text(AppLocalizations.of(context)! - .descriptionStreamerMode), - value: settings.streamerMode, - onChanged: (bool value) { - settings.setStreamerMode(value); + saveSettings(context); + EnvironmentConfig.debugLog("Font Scaling: $value"); + }, + min: 0.5, + divisions: 12, + max: 2.0, + label: '${settings.fontScaling * 100}%', + activeColor: settings.current().defaultButtonColor, + thumbColor: settings.current().mainTextColor, + overlayColor: MaterialStateProperty.all(settings.current().mainTextColor), + inactiveColor: settings.theme.defaultButtonDisabledColor, + value: settings.fontScaling)), + leading: Icon(Icons.format_size, color: settings.current().mainTextColor), + ), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.streamerModeLabel), + subtitle: Text(AppLocalizations.of(context)!.descriptionStreamerMode), + value: settings.streamerMode, + onChanged: (bool value) { + settings.setStreamerMode(value); // Save Settings... - saveSettings(context); - }, - activeTrackColor: settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.streamer_bunnymask, - color: settings - .current() - .mainTextColor), - ), - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .formattingExperiment), - subtitle: Text(AppLocalizations.of(context)! - .messageFormattingDescription), - value: settings - .isExperimentEnabled(FormattingExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment(FormattingExperiment); - } else { - settings.disableExperiment(FormattingExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.text_fields, - color: settings - .current() - .mainTextColor), - ), - ])))); - }); + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.streamer_bunnymask, color: settings.current().mainTextColor), + ), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.formattingExperiment), + subtitle: Text(AppLocalizations.of(context)!.messageFormattingDescription), + value: settings.isExperimentEnabled(FormattingExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(FormattingExperiment); + } else { + settings.disableExperiment(FormattingExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.text_fields, color: settings.current().mainTextColor), + ), + ])))); + }); }); } diff --git a/lib/views/globalsettingsbehaviourview.dart b/lib/views/globalsettingsbehaviourview.dart index 31116d86..fc72e582 100644 --- a/lib/views/globalsettingsbehaviourview.dart +++ b/lib/views/globalsettingsbehaviourview.dart @@ -20,7 +20,6 @@ class _GlobalSettingsBehaviourViewState extends State setState(() { - powerExempt = value; - })); + powerExempt = value; + })); } else { powerExempt = false; } @@ -51,8 +50,7 @@ class _GlobalSettingsBehaviourViewState extends State isBatteryExempt() async { - return await androidSettingsChannel.invokeMethod('isBatteryExempt', {}) ?? - false; + return await androidSettingsChannel.invokeMethod('isBatteryExempt', {}) ?? false; } Future requestBatteryExemption() async { @@ -62,11 +60,9 @@ class _GlobalSettingsBehaviourViewState extends State(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { return Scrollbar( key: Key("BehaviourSettingsView"), trackVisibility: true, @@ -83,10 +79,8 @@ class _GlobalSettingsBehaviourViewState extends State>( - (NotificationPolicy value) { - return DropdownMenuItem( - value: value, - child: Text( - Settings.notificationPolicyToString( - value, context), - overflow: TextOverflow.ellipsis, - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList())), - leading: Icon(CwtchIcons.chat_bubble_empty_24px, - color: settings.current().mainTextColor), + items: NotificationPolicy.values.map>((NotificationPolicy value) { + return DropdownMenuItem( + value: value, + child: Text(Settings.notificationPolicyToString(value, context), overflow: TextOverflow.ellipsis, style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList())), + leading: Icon(CwtchIcons.chat_bubble_empty_24px, color: settings.current().mainTextColor), ), ListTile( - title: Text(AppLocalizations.of(context)! - .notificationContentSettingLabel), - subtitle: Text(AppLocalizations.of(context)! - .notificationContentSettingDescription), + title: Text(AppLocalizations.of(context)!.notificationContentSettingLabel), + subtitle: Text(AppLocalizations.of(context)!.notificationContentSettingDescription), trailing: Container( width: MediaQuery.of(context).size.width / 4, child: DropdownButton( @@ -147,29 +127,17 @@ class _GlobalSettingsBehaviourViewState extends State>( - (NotificationContent value) { - return DropdownMenuItem< - NotificationContent>( - value: value, - child: Text( - Settings.notificationContentToString( - value, context), - overflow: TextOverflow.ellipsis, - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList())), - leading: Icon(CwtchIcons.chat_bubble_empty_24px, - color: settings.current().mainTextColor), + items: NotificationContent.values.map>((NotificationContent value) { + return DropdownMenuItem( + value: value, + child: Text(Settings.notificationContentToString(value, context), overflow: TextOverflow.ellipsis, style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList())), + leading: Icon(CwtchIcons.chat_bubble_empty_24px, color: settings.current().mainTextColor), ), SwitchListTile( - title: Text( - AppLocalizations.of(context)!.blockUnknownLabel), - subtitle: Text(AppLocalizations.of(context)! - .descriptionBlockUnknownConnections), + title: Text(AppLocalizations.of(context)!.blockUnknownLabel), + subtitle: Text(AppLocalizations.of(context)!.descriptionBlockUnknownConnections), value: settings.blockUnknownConnections, onChanged: (bool value) { if (value) { @@ -182,16 +150,12 @@ class _GlobalSettingsBehaviourViewState extends State { - ScrollController settingsListScrollController = ScrollController(); Widget build(BuildContext context) { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { - return Scrollbar( - key: Key("ExperimentsSettingsView"), - trackVisibility: true, + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { + return Scrollbar( + key: Key("ExperimentsSettingsView"), + trackVisibility: true, + controller: settingsListScrollController, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, controller: settingsListScrollController, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - controller: settingsListScrollController, - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - ), - child: Column(children: [ - SwitchListTile( - title: Text( - AppLocalizations.of(context)!.experimentsEnabled), - subtitle: Text(AppLocalizations.of(context)! - .descriptionExperiments), - value: settings.experimentsEnabled, - onChanged: (bool value) { - if (value) { - settings.enableExperiments(); - } else { - settings.disableExperiments(); - } - // Save Settings... - saveSettings(context); - }, - activeTrackColor: settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.enable_experiments, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: settings.experimentsEnabled, - child: Column( - children: [ - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .enableGroups), - subtitle: Text(AppLocalizations.of(context)! - .descriptionExperimentsGroups), - value: settings.isExperimentEnabled( - TapirGroupsExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment( - TapirGroupsExperiment); - } else { - settings.disableExperiment( - TapirGroupsExperiment); - } - // Save Settings... - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.enable_groups, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: - !Platform.isAndroid && !Platform.isIOS, - child: SwitchListTile( - title: Text(AppLocalizations.of(context)! - .settingServers), - subtitle: Provider - .of( - context, - listen: false) - .cwtch - .IsServersCompiled() - ? Text(AppLocalizations.of(context)! - .settingServersDescription) - : Text( - "This version of Cwtch has been compiled without support for the server hosting experiment."), - value: Provider - .of(context, - listen: false) - .cwtch - .IsServersCompiled() && - settings.isExperimentEnabled( - ServerManagementExperiment), - onChanged: Provider - .of( - context, - listen: false) - .cwtch - .IsServersCompiled() - ? (bool value) { - Provider.of( - context, - listen: false) - .clear(); - if (value) { - settings.enableExperiment( - ServerManagementExperiment); - } else { - settings.disableExperiment( - ServerManagementExperiment); - } - // Save Settings... - saveSettings(context); - } - : null, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: settings - .theme.defaultButtonDisabledColor, - inactiveThumbColor: settings - .theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.dns_24px), - )), - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .settingFileSharing), - subtitle: Text(AppLocalizations.of(context)! - .descriptionFileSharing), - value: settings.isExperimentEnabled( - FileSharingExperiment), - onChanged: (bool value) { - if (value) { - if (checkDownloadDirectory( - context, settings)) { - settings.enableExperiment( - FileSharingExperiment); - } else { - settings.enableExperiment( - FileSharingExperiment); - settings.disableExperiment( - ImagePreviewsExperiment); - } - } else { - settings.disableExperiment( - FileSharingExperiment); - settings.disableExperiment( - ImagePreviewsExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.attached_file_3, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: settings.isExperimentEnabled( - FileSharingExperiment), - child: Column(children: [ - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .settingImagePreviews), - subtitle: Text( - AppLocalizations.of(context)! - .settingImagePreviewsDescription), - value: settings.isExperimentEnabled( - ImagePreviewsExperiment), - onChanged: (bool value) { - if (value) { - if (checkDownloadDirectory( - context, settings)) { - settings.enableExperiment( - ImagePreviewsExperiment); - } else { - settings.disableExperiment( - ImagePreviewsExperiment); - } - } else { - settings.disableExperiment( - ImagePreviewsExperiment); - } - saveSettings(context); - }, - activeTrackColor: settings - .theme.defaultButtonActiveColor, - inactiveTrackColor: settings - .theme.defaultButtonDisabledColor, - secondary: Icon(Icons.photo, - color: - settings - .current() - .mainTextColor), - ), - Visibility( - visible: settings.isExperimentEnabled( - ImagePreviewsExperiment) && - !Platform.isAndroid, - child: CwtchFolderPicker( - testKey: Key("DownloadFolderPicker"), - label: AppLocalizations.of(context)! - .settingDownloadFolder, - initialValue: settings.downloadPath, - textStyle: settings.scaleFonts( - defaultDropDownMenuItemTextStyle), - description: AppLocalizations.of( - context)! - .fileSharingSettingsDownloadFolderDescription, - tooltip: AppLocalizations.of(context)! - .fileSharingSettingsDownloadFolderTooltip, - onSave: (newVal) { - settings.downloadPath = newVal; - saveSettings(context); - }, - ), - ), - ]), - ), - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .blodeuweddExperimentEnable), - subtitle: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() - ? Text(AppLocalizations.of(context)! - .blodeuweddDescription) - : Text(AppLocalizations.of(context)! - .blodeuweddNotSupported), - value: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() && - settings.isExperimentEnabled( - BlodeuweddExperiment), - onChanged: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Column(children: [ + SwitchListTile( + title: Text(AppLocalizations.of(context)!.experimentsEnabled), + subtitle: Text(AppLocalizations.of(context)!.descriptionExperiments), + value: settings.experimentsEnabled, + onChanged: (bool value) { + if (value) { + settings.enableExperiments(); + } else { + settings.disableExperiments(); + } + // Save Settings... + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.enable_experiments, color: settings.current().mainTextColor), + ), + Visibility( + visible: settings.experimentsEnabled, + child: Column( + children: [ + SwitchListTile( + title: Text(AppLocalizations.of(context)!.enableGroups), + subtitle: Text(AppLocalizations.of(context)!.descriptionExperimentsGroups), + value: settings.isExperimentEnabled(TapirGroupsExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(TapirGroupsExperiment); + } else { + settings.disableExperiment(TapirGroupsExperiment); + } + // Save Settings... + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.enable_groups, color: settings.current().mainTextColor), + ), + Visibility( + visible: !Platform.isAndroid && !Platform.isIOS, + child: SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingServers), + subtitle: Provider.of(context, listen: false).cwtch.IsServersCompiled() + ? Text(AppLocalizations.of(context)!.settingServersDescription) + : Text("This version of Cwtch has been compiled without support for the server hosting experiment."), + value: Provider.of(context, listen: false).cwtch.IsServersCompiled() && settings.isExperimentEnabled(ServerManagementExperiment), + onChanged: Provider.of(context, listen: false).cwtch.IsServersCompiled() ? (bool value) { + Provider.of(context, listen: false).clear(); + if (value) { + settings.enableExperiment(ServerManagementExperiment); + } else { + settings.disableExperiment(ServerManagementExperiment); + } + // Save Settings... + saveSettings(context); + } + : null, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + inactiveThumbColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.dns_24px), + )), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingFileSharing), + subtitle: Text(AppLocalizations.of(context)!.descriptionFileSharing), + value: settings.isExperimentEnabled(FileSharingExperiment), + onChanged: (bool value) { + if (value) { + if (checkDownloadDirectory(context, settings)) { + settings.enableExperiment(FileSharingExperiment); + } else { + settings.enableExperiment(FileSharingExperiment); + settings.disableExperiment(ImagePreviewsExperiment); + } + } else { + settings.disableExperiment(FileSharingExperiment); + settings.disableExperiment(ImagePreviewsExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.attached_file_3, color: settings.current().mainTextColor), + ), + Visibility( + visible: settings.isExperimentEnabled(FileSharingExperiment), + child: Column(children: [ + SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingImagePreviews), + subtitle: Text(AppLocalizations.of(context)!.settingImagePreviewsDescription), + value: settings.isExperimentEnabled(ImagePreviewsExperiment), + onChanged: (bool value) { if (value) { - settings.enableExperiment( - BlodeuweddExperiment); + if (checkDownloadDirectory(context, settings)) { + settings.enableExperiment(ImagePreviewsExperiment); + } else { + settings.disableExperiment(ImagePreviewsExperiment); + } } else { - settings.disableExperiment( - BlodeuweddExperiment); + settings.disableExperiment(ImagePreviewsExperiment); } saveSettings(context); - } - : null, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - inactiveThumbColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.assistant, - color: settings - .current() - .mainTextColor), + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.photo, color: settings.current().mainTextColor), ), Visibility( - visible: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() && - settings.isExperimentEnabled( - BlodeuweddExperiment), + visible: settings.isExperimentEnabled(ImagePreviewsExperiment) && !Platform.isAndroid, child: CwtchFolderPicker( testKey: Key("DownloadFolderPicker"), - label: AppLocalizations.of(context)! - .settingDownloadFolder, - initialValue: settings.blodeuweddPath, - description: AppLocalizations.of(context)! - .blodeuweddPath, - tooltip: AppLocalizations.of(context)! - .blodeuweddPath, + label: AppLocalizations.of(context)!.settingDownloadFolder, + initialValue: settings.downloadPath, + textStyle: settings.scaleFonts(defaultDropDownMenuItemTextStyle), + description: AppLocalizations.of(context)!.fileSharingSettingsDownloadFolderDescription, + tooltip: AppLocalizations.of(context)!.fileSharingSettingsDownloadFolderTooltip, onSave: (newVal) { - settings.blodeuweddPath = newVal; + settings.downloadPath = newVal; saveSettings(context); }, ), ), - ], - )), - Visibility( - visible: settings.experimentsEnabled, - child: SwitchListTile( - title: Text(AppLocalizations.of(context)! - .enableExperimentClickableLinks), - subtitle: Text(AppLocalizations.of(context)! - .experimentClickableLinksDescription), - value: settings.isExperimentEnabled( - ClickableLinksExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment( - ClickableLinksExperiment); - } else { - settings.disableExperiment( - ClickableLinksExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.link, - color: settings - .current() - .mainTextColor), - )), - Visibility( - visible: settings.experimentsEnabled, - child: SwitchListTile( - title: Text(AppLocalizations.of(context)! - .enableExperimentQRCode), - subtitle: Text(AppLocalizations.of(context)! - .experimentQRCodeDescription), - value: settings - .isExperimentEnabled(QRCodeExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment(QRCodeExperiment); - } else { - settings.disableExperiment(QRCodeExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.qr_code, - color: settings - .current() - .mainTextColor), - )), - ])))); - }); + ]), + ), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.blodeuweddExperimentEnable), + subtitle: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() + ? Text(AppLocalizations.of(context)!.blodeuweddDescription) + : Text(AppLocalizations.of(context)!.blodeuweddNotSupported), + value: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() && settings.isExperimentEnabled(BlodeuweddExperiment), + onChanged: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() + ? (bool value) { + if (value) { + settings.enableExperiment(BlodeuweddExperiment); + } else { + settings.disableExperiment(BlodeuweddExperiment); + } + saveSettings(context); + } + : null, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + inactiveThumbColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.assistant, color: settings.current().mainTextColor), + ), + Visibility( + visible: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() && settings.isExperimentEnabled(BlodeuweddExperiment), + child: CwtchFolderPicker( + testKey: Key("DownloadFolderPicker"), + label: AppLocalizations.of(context)!.settingDownloadFolder, + initialValue: settings.blodeuweddPath, + description: AppLocalizations.of(context)!.blodeuweddPath, + tooltip: AppLocalizations.of(context)!.blodeuweddPath, + onSave: (newVal) { + settings.blodeuweddPath = newVal; + saveSettings(context); + }, + ), + ), + ], + )), + Visibility( + visible: settings.experimentsEnabled, + child: SwitchListTile( + title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks), + subtitle: Text(AppLocalizations.of(context)!.experimentClickableLinksDescription), + value: settings.isExperimentEnabled(ClickableLinksExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(ClickableLinksExperiment); + } else { + settings.disableExperiment(ClickableLinksExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.link, color: settings.current().mainTextColor), + )), + Visibility( + visible: settings.experimentsEnabled, + child: SwitchListTile( + title: Text(AppLocalizations.of(context)!.enableExperimentQRCode), + subtitle: Text(AppLocalizations.of(context)!.experimentQRCodeDescription), + value: settings.isExperimentEnabled(QRCodeExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(QRCodeExperiment); + } else { + settings.disableExperiment(QRCodeExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.qr_code, color: settings.current().mainTextColor), + )), + ])))); + }); }); } @@ -379,9 +245,7 @@ class _GlobalSettingsExperimentsViewState extends State(context, listen: false) - .cwtch - .defaultDownloadPath(); + var path = Provider.of(context, listen: false).cwtch.defaultDownloadPath(); if (path != null) { settings.downloadPath = path; } else { @@ -393,11 +257,10 @@ class _GlobalSettingsExperimentsViewState extends State { - ScrollController settingsListScrollController = ScrollController(); @override @@ -35,7 +34,6 @@ class _GlobalSettingsViewState extends State { super.dispose(); } - @override Widget build(BuildContext context) { return DefaultTabController( @@ -46,23 +44,10 @@ class _GlobalSettingsViewState extends State { bottom: TabBar( isScrollable: true, tabs: [ - Tab( - key: Key("OpenSettingsAppearance"), - icon: Icon(Icons.palette), - text: AppLocalizations.of(context)! - .settingsGroupAppearance), - Tab( - key: Key("OpenSettingsBehaviour"), - icon: Icon(Icons.settings), - text: - AppLocalizations.of(context)!.settingGroupBehaviour), - Tab( - key: Key("OpenSettingsExperiments"), - icon: Icon(CwtchIcons.enable_experiments), - text: AppLocalizations.of(context)! - .settingsGroupExperiments), - Tab(icon: Icon(Icons.info), text: AppLocalizations.of(context)! - .settingsGroupAbout), + Tab(key: Key("OpenSettingsAppearance"), icon: Icon(Icons.palette), text: AppLocalizations.of(context)!.settingsGroupAppearance), + Tab(key: Key("OpenSettingsBehaviour"), icon: Icon(Icons.settings), text: AppLocalizations.of(context)!.settingGroupBehaviour), + Tab(key: Key("OpenSettingsExperiments"), icon: Icon(CwtchIcons.enable_experiments), text: AppLocalizations.of(context)!.settingsGroupExperiments), + Tab(icon: Icon(Icons.info), text: AppLocalizations.of(context)!.settingsGroupAbout), ], )), body: _buildSettingsList(), @@ -71,15 +56,11 @@ class _GlobalSettingsViewState extends State { Widget _buildSettingsList() { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { return TabBarView(children: [ GlobalSettingsAppearanceView(), - GlobalSettingsBehaviourView(), - GlobalSettingsExperimentsView(), - GlobalSettingsAboutView(), ]); }); @@ -90,7 +71,5 @@ class _GlobalSettingsViewState extends State { /// Send an UpdateGlobalSettings to the Event Bus saveSettings(context) { var settings = Provider.of(context, listen: false); - Provider.of(context, listen: false) - .cwtch - .UpdateSettings(jsonEncode(settings.asJson())); + Provider.of(context, listen: false).cwtch.UpdateSettings(jsonEncode(settings.asJson())); } diff --git a/lib/widgets/folderpicker.dart b/lib/widgets/folderpicker.dart index bae6d72e..8f16c839 100644 --- a/lib/widgets/folderpicker.dart +++ b/lib/widgets/folderpicker.dart @@ -17,7 +17,8 @@ class CwtchFolderPicker extends StatefulWidget { final Key? testKey; final TextStyle? textStyle; final IconData icon; - const CwtchFolderPicker({Key? key, this.testKey, this.textStyle, this.label = "", this.tooltip = "", this.initialValue = "", this.onSave, this.description = "", this.icon = Icons.file_download}) : super(key: key); + const CwtchFolderPicker({Key? key, this.testKey, this.textStyle, this.label = "", this.tooltip = "", this.initialValue = "", this.onSave, this.description = "", this.icon = Icons.file_download}) + : super(key: key); @override _CwtchFolderPickerState createState() => _CwtchFolderPickerState(); @@ -55,7 +56,7 @@ class _CwtchFolderPickerState extends State { var selectedDirectory = await showSelectDirectoryPicker(context); if (selectedDirectory != null) { //File directory = File(selectedDirectory); - selectedDirectory += path.separator ; + selectedDirectory += path.separator; ctrlrVal.text = selectedDirectory; if (widget.onSave != null) { widget.onSave!(selectedDirectory);