diff --git a/lib/cwtch/cwtchNotifier.dart b/lib/cwtch/cwtchNotifier.dart index 0734ed0a..c284d08d 100644 --- a/lib/cwtch/cwtchNotifier.dart +++ b/lib/cwtch/cwtchNotifier.dart @@ -79,6 +79,12 @@ class CwtchNotifier { server.setRunning(data["Intent"] == "running"); } break; + case "ServerStatsUpdate": + EnvironmentConfig.debugLog("ServerStatsUpdate $data"); + var totalMessages = int.parse(data["TotalMessages"]); + var connections = int.parse(data["Connections"]); + serverListState.updateServerStats(data["Identity"], totalMessages, connections); + break; case "GroupCreated": // Retrieve Server Status from Cache... String status = ""; @@ -86,8 +92,8 @@ class CwtchNotifier { if (serverInfoState != null) { status = serverInfoState.status; } - if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) == null) { - profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], data["ConversationID"], data["GroupID"], + if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(int.parse(data["ConversationID"])) == null) { + profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], int.parse(data["ConversationID"]), data["GroupID"], authorization: ContactAuthorization.approved, imagePath: data["PicturePath"], nickname: data["GroupName"], @@ -95,7 +101,7 @@ class CwtchNotifier { server: data["GroupServer"], isGroup: true, lastMessageTime: DateTime.now())); - profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now()); + profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(int.parse(data["ConversationID"]), DateTime.now()); } break; case "PeerDeleted": @@ -299,12 +305,6 @@ class CwtchNotifier { } } break; - case "AcceptGroupInvite": - EnvironmentConfig.debugLog("accept group invite"); - - profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.authorization = ContactAuthorization.approved; - profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.fromMillisecondsSinceEpoch(0)); - break; case "ServerStateChange": // Update the Server Cache profileCN.getProfile(data["ProfileOnion"])?.updateServerStatusCache(data["GroupServer"], data["ConnectionState"]); @@ -315,19 +315,6 @@ class CwtchNotifier { }); profileCN.getProfile(data["ProfileOnion"])?.contactList.resort(); break; - case "SetGroupAttribute": - if (data["Key"] == "local.name") { - if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) != null) { - profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.nickname = data["Data"]; - } - } else if (data["Key"] == "local.archived") { - if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) != null) { - profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.isArchived = data["Data"] == "true"; - } - } else { - EnvironmentConfig.debugLog("unhandled set group attribute event: ${data['Key']}"); - } - break; case "SetPeerAttribute": if (data["Key"] == "local.name") { if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"]) != null) { @@ -378,6 +365,12 @@ class CwtchNotifier { break; case "ImportingProfileEvent": break; + case "StartingStorageMigration": + appState.SetModalState(ModalState.storageMigration); + break; + case "DoneStorageMigration": + appState.SetModalState(ModalState.none); + break; default: EnvironmentConfig.debugLog("unhandled event: $type"); } diff --git a/lib/main.dart b/lib/main.dart index 9ab2ad4b..9a8ba5b5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:cwtch/config.dart'; import 'package:cwtch/notification_manager.dart'; +import 'package:cwtch/themes/cwtch.dart'; import 'package:cwtch/views/messageview.dart'; import 'package:cwtch/widgets/rightshiftfixer.dart'; import 'package:flutter/foundation.dart'; @@ -21,10 +22,10 @@ import 'models/servers.dart'; import 'views/profilemgrview.dart'; import 'views/splashView.dart'; import 'dart:io' show Platform, exit; -import 'opaque.dart'; +import 'themes/opaque.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -var globalSettings = Settings(Locale("en", ''), OpaqueDark()); +var globalSettings = Settings(Locale("en", ''), CwtchDark()); var globalErrorHandler = ErrorHandler(); var globalTorStatus = TorStatus(); var globalAppState = AppState(); @@ -109,7 +110,7 @@ class FlwtchState extends State { supportedLocales: AppLocalizations.supportedLocales, title: 'Cwtch', theme: mkThemeData(settings), - home: appState.cwtchInit == true ? ShiftRightFixer(child: ProfileMgrView()) : SplashView(), + home: (!appState.cwtchInit || appState.modalState != ModalState.none) ? SplashView() : ShiftRightFixer(child: ProfileMgrView()), ), ); }, diff --git a/lib/main_test.dart b/lib/main_test.dart index a2551891..6ba3edd8 100644 --- a/lib/main_test.dart +++ b/lib/main_test.dart @@ -5,7 +5,7 @@ import 'package:cwtch/errorHandler.dart'; import 'package:cwtch/settings.dart'; import 'licenses.dart'; import 'main.dart'; -import 'opaque.dart'; +import 'themes/opaque.dart'; import 'dart:convert'; import 'dart:io'; @@ -14,7 +14,7 @@ import 'dart:typed_data'; import 'package:flutter_test/flutter_test.dart'; import 'package:glob/glob.dart'; -var globalSettings = Settings(Locale("en", ''), OpaqueDark()); +var globalSettings = Settings(Locale("en", ''), CwtchDark()); var globalErrorHandler = ErrorHandler(); void main() { diff --git a/lib/model.dart b/lib/model.dart index 6c1ddd7b..0b68d15a 100644 --- a/lib/model.dart +++ b/lib/model.dart @@ -26,8 +26,14 @@ class ChatMessage { }; } +enum ModalState { + none, + storageMigration +} + class AppState extends ChangeNotifier { bool cwtchInit = false; + ModalState modalState = ModalState.none; bool cwtchIsClosing = false; String appError = ""; String? _selectedProfile; @@ -47,6 +53,11 @@ class AppState extends ChangeNotifier { notifyListeners(); } + void SetModalState(ModalState newState) { + modalState = newState; + notifyListeners(); + } + String? get selectedProfile => _selectedProfile; set selectedProfile(String? newVal) { this._selectedProfile = newVal; @@ -149,6 +160,7 @@ class ContactListState extends ChangeNotifier { servers?.addGroup(contact); } }); + resort(); notifyListeners(); } @@ -157,6 +169,7 @@ class ContactListState extends ChangeNotifier { if (newContact.isGroup) { servers?.addGroup(newContact); } + resort(); notifyListeners(); } @@ -164,12 +177,18 @@ class ContactListState extends ChangeNotifier { _contacts.sort((ContactInfoState a, ContactInfoState b) { // return -1 = a first in list // return 1 = b first in list + // blocked contacts last if (a.isBlocked == true && b.isBlocked != true) return 1; if (a.isBlocked != true && b.isBlocked == true) return -1; // archive is next... if (!a.isArchived && b.isArchived) return -1; if (a.isArchived && !b.isArchived) return 1; + + // unapproved top + if (a.isInvitation && !b.isInvitation) return -1; + if (!a.isInvitation && b.isInvitation) return 1; + // special sorting for contacts with no messages in either history if (a.lastMessageTime.millisecondsSinceEpoch == 0 && b.lastMessageTime.millisecondsSinceEpoch == 0) { // online contacts first diff --git a/lib/models/servers.dart b/lib/models/servers.dart index 2850668b..cd059cbf 100644 --- a/lib/models/servers.dart +++ b/lib/models/servers.dart @@ -39,11 +39,34 @@ class ServerListState extends ChangeNotifier { notifyListeners(); } + void updateServerStats(String onion, int newTotalMessages, int newConnections) { + var server = getServer(onion); + if (server != null) { + server.setStats(newTotalMessages, newConnections); + resort(); + notifyListeners(); + } + } + void delete(String onion) { _servers.removeWhere((element) => element.onion == onion); notifyListeners(); } + void resort() { + _servers.sort((ServerInfoState a, ServerInfoState b) { + // return -1 = a first in list + // return 1 = b first in list + if (a.totalMessages > b.totalMessages) { + return -1; + } else if (b.totalMessages > a.totalMessages) { + return 1; + } + + return 0; + }); + } + List get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier } @@ -55,6 +78,8 @@ class ServerInfoState extends ChangeNotifier { bool running; bool autoStart; bool isEncrypted; + int totalMessages = 0; + int connections = 0; ServerInfoState({required this.onion, required this.serverBundle, required this.running, required this.description, required this.autoStart, required this.isEncrypted}); @@ -72,4 +97,10 @@ class ServerInfoState extends ChangeNotifier { description = val; notifyListeners(); } + + void setStats(int newTotalMessages, int newConnections) { + totalMessages = newTotalMessages; + connections = newConnections; + notifyListeners(); + } } diff --git a/lib/opaque.dart b/lib/opaque.dart deleted file mode 100644 index fc984217..00000000 --- a/lib/opaque.dart +++ /dev/null @@ -1,1455 +0,0 @@ -// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT BY HAND AS CHANGES WILL BE OVERRIDDEN. -// TO EDIT THE THEME, SEE https://git.openprivacy.ca/openprivacy/opaque/ -// FOR HOW THIS FILE IS GENERATED, SEE ../regenerate_opaque_theme.sh - -import 'dart:ui'; -import 'dart:core'; - -import 'package:flutter/material.dart'; -import 'package:cwtch/settings.dart'; - -abstract class OpaqueThemeType { - static final Color red = Color(0xFFFF0000); - - String identifier() { - return "dummy"; - } - - Color backgroundMainColor() { - return red; - } - - Color backgroundPaneColor() { - return red; - } - - Color backgroundHilightElementColor() { - return red; - } - - Color dividerColor() { - return red; - } - - Color mainTextColor() { - return red; - } - - Color altTextColor() { - return red; - } - - Color hilightElementTextColor() { - return red; - } - - Color defaultButtonColor() { - return red; - } - - Color defaultButtonActiveColor() { - return red; - } - - Color defaultButtonTextColor() { - return red; - } - - Color defaultButtonDisabledColor() { - return red; - } - - Color defaultButtonDisabledTextColor() { - return red; - } - - Color altButtonColor() { - return red; - } - - Color altButtonTextColor() { - return red; - } - - Color altButtonDisabledColor() { - return red; - } - - Color altButtonDisabledTextColor() { - return red; - } - - Color textfieldBackgroundColor() { - return red; - } - - Color textfieldBorderColor() { - return red; - } - - Color textfieldTextColor() { - return red; - } - - Color textfieldErrorColor() { - return red; - } - - Color textfieldButtonColor() { - return red; - } - - Color textfieldButtonTextColor() { - return red; - } - - Color scrollbarDefaultColor() { - return red; - } - - Color scrollbarActiveColor() { - return red; - } - - Color portraitOnlineBorderColor() { - return red; - } - - Color portraitOnlineBackgroundColor() { - return red; - } - - Color portraitOnlineTextColor() { - return red; - } - - Color portraitConnectingBorderColor() { - return red; - } - - Color portraitConnectingBackgroundColor() { - return red; - } - - Color portraitConnectingTextColor() { - return red; - } - - Color portraitOfflineBorderColor() { - return red; - } - - Color portraitOfflineBackgroundColor() { - return red; - } - - Color portraitOfflineTextColor() { - return red; - } - - Color portraitBlockedBorderColor() { - return red; - } - - Color portraitBlockedBackgroundColor() { - return red; - } - - Color portraitBlockedTextColor() { - return red; - } - - Color portraitOnlineBadgeColor() { - return red; - } - - Color portraitOfflineBadgeColor() { - return red; - } - - Color portraitContactBadgeColor() { - return red; - } - - Color portraitContactBadgeTextColor() { - return red; - } - - Color portraitProfileBadgeColor() { - return red; - } - - Color portraitProfileBadgeTextColor() { - return red; - } - - Color portraitOverlayOfflineColor() { - return red; - } - - Color dropShadowColor() { - return red; - } - - Color dropShadowPaneColor() { - return red; - } - - Color toggleColor() { - return red; - } - - Color toggleOnColor() { - return red; - } - - Color toggleOffColor() { - return red; - } - - Color sliderButtonColor() { - return red; - } - - Color sliderBarLeftColor() { - return red; - } - - Color sliderBarRightColor() { - return red; - } - - Color boxCheckedColor() { - return red; - } - - Color toolbarIconColor() { - return red; - } - - Color toolbarMainColor() { - return red; - } - - Color toolbarAltColor() { - return red; - } - - Color statusbarDisconnectedInternetColor() { - return red; - } - - Color statusbarDisconnectedInternetFontColor() { - return red; - } - - Color statusbarDisconnectedTorFontColor() { - return red; - } - - Color statusbarDisconnectedTorColor() { - return red; - } - - Color statusbarConnectingColor() { - return red; - } - - Color statusbarConnectingFontColor() { - return red; - } - - Color statusbarOnlineColor() { - return red; - } - - Color statusbarOnlineFontColor() { - return red; - } - - Color chatOverlayWarningTextColor() { - return red; - } - - Color messageFromMeBackgroundColor() { - return red; - } - - Color messageFromMeTextColor() { - return red; - } - - Color messageFromOtherBackgroundColor() { - return red; - } - - Color messageFromOtherTextColor() { - return red; - } - - Color messageStatusNormalColor() { - return red; - } - - Color messageStatusBlockedColor() { - return red; - } - - Color messageStatusBlockedTextColor() { - return red; - } - - Color messageStatusAlertColor() { - return red; - } - - Color messageStatusAlertTextColor() { - return red; - } - - // ... more to come - - // Sizes - - double contactOnionTextSize() { - return 18; - } -} - -class OpaqueDark extends OpaqueThemeType { - static final Color darkGreyPurple = Color(0xFF281831); - static final Color deepPurple = Color(0xFF422850); - static final Color mauvePurple = Color(0xFF8E64A5); - static final Color purple = Color(0xFFDFB9DE); - static final Color whitePurple = Color(0xFFE3DFE4); - static final Color softPurple = Color(0xFFFDF3FC); - static final Color pink = Color(0xFFE85DA1); - static final Color hotPink = Color(0xFFD01972); - static final Color lightGrey = Color(0xFF9E9E9E); - static final Color softGreen = Color(0xFFA0FFB0); - static final Color softRed = Color(0xFFFFA0B0); - - String identifier() { - return "dark"; - } - - Color backgroundMainColor() { - return darkGreyPurple; - } - - Color backgroundPaneColor() { - return darkGreyPurple; - } - - Color backgroundHilightElementColor() { - return deepPurple; - } - - Color dividerColor() { - return deepPurple; - } - - Color mainTextColor() { - return whitePurple; - } - - Color altTextColor() { - return mauvePurple; - } - - Color hilightElementTextColor() { - return purple; - } - - Color defaultButtonColor() { - return hotPink; - } - - Color defaultButtonActiveColor() { - return pink; - } - - Color defaultButtonTextColor() { - return whitePurple; - } - - Color defaultButtonDisabledColor() { - return lightGrey; - } - - Color defaultButtonDisabledTextColor() { - return darkGreyPurple; - } - - Color altButtonColor() { - return darkGreyPurple; - } - - Color altButtonTextColor() { - return purple; - } - - Color altButtonDisabledColor() { - return darkGreyPurple; - } - - Color altButtonDisabledTextColor() { - return purple; - } - - Color textfieldBackgroundColor() { - return deepPurple; - } - - Color textfieldBorderColor() { - return deepPurple; - } - - Color textfieldTextColor() { - return purple; - } - - Color textfieldErrorColor() { - return hotPink; - } - - Color textfieldButtonColor() { - return purple; - } - - Color textfieldButtonTextColor() { - return darkGreyPurple; - } - - Color scrollbarDefaultColor() { - return purple; - } - - Color scrollbarActiveColor() { - return hotPink; - } - - Color portraitOnlineBorderColor() { - return whitePurple; - } - - Color portraitOnlineBackgroundColor() { - return whitePurple; - } - - Color portraitOnlineTextColor() { - return whitePurple; - } - - Color portraitConnectingBorderColor() { - return purple; - } //mauvePurple - - Color portraitConnectingBackgroundColor() { - return purple; - } //darkGreyPurple - - Color portraitConnectingTextColor() { - return purple; - } - - Color portraitOfflineBorderColor() { - return purple; - } - - Color portraitOfflineBackgroundColor() { - return purple; - } - - Color portraitOfflineTextColor() { - return purple; - } - - Color portraitBlockedBorderColor() { - return lightGrey; - } - - Color portraitBlockedBackgroundColor() { - return lightGrey; - } - - Color portraitBlockedTextColor() { - return lightGrey; - } - - Color portraitOnlineBadgeColor() { - return softGreen; - } - - Color portraitOfflineBadgeColor() { - return softRed; - } - - Color portraitContactBadgeColor() { - return hotPink; - } - - Color portraitContactBadgeTextColor() { - return whitePurple; - } - - Color portraitProfileBadgeColor() { - return mauvePurple; - } - - Color portraitProfileBadgeTextColor() { - return darkGreyPurple; - } - - Color portraitOverlayOfflineColor() { - return mauvePurple; - } - - Color dropShadowColor() { - return mauvePurple; - } - - Color dropShadowPaneColor() { - return darkGreyPurple; - } - - Color toggleColor() { - return darkGreyPurple; - } - - Color toggleOnColor() { - return whitePurple; - } - - Color toggleOffColor() { - return deepPurple; - } - - Color sliderButtonColor() { - return whitePurple; - } - - Color sliderBarLeftColor() { - return mauvePurple; - } - - Color sliderBarRightColor() { - return mauvePurple; - } - - Color boxCheckedColor() { - return hotPink; - } - - Color toolbarIconColor() { - return whitePurple; - } - - Color toolbarMainColor() { - return darkGreyPurple; - } - - Color toolbarAltColor() { - return deepPurple; - } - - Color statusbarDisconnectedInternetColor() { - return whitePurple; - } - - Color statusbarDisconnectedInternetFontColor() { - return deepPurple; - } - - Color statusbarDisconnectedTorColor() { - return darkGreyPurple; - } - - Color statusbarDisconnectedTorFontColor() { - return whitePurple; - } - - Color statusbarConnectingColor() { - return deepPurple; - } - - Color statusbarConnectingFontColor() { - return whitePurple; - } - - Color statusbarOnlineColor() { - return mauvePurple; - } - - Color statusbarOnlineFontColor() { - return whitePurple; - } - - Color chatOverlayWarningTextColor() { - return purple; - } - - Color messageFromMeBackgroundColor() { - return mauvePurple; - } - - Color messageFromMeTextColor() { - return whitePurple; - } - - Color messageFromOtherBackgroundColor() { - return deepPurple; - } - - Color messageFromOtherTextColor() { - return whitePurple; - } - - Color messageStatusNormalColor() { - return deepPurple; - } - - Color messageStatusBlockedColor() { - return lightGrey; - } - - Color messageStatusBlockedTextColor() { - return whitePurple; - } - - Color messageStatusAlertColor() { - return mauvePurple; - } - - Color messageStatusAlertTextColor() { - return whitePurple; - } -} - -class OpaqueLight extends OpaqueThemeType { - static final Color whitePurple = Color(0xFFFFFDFF); - static final Color softPurple = Color(0xFFFDF3FC); - static final Color purple = Color(0xFFDFB9DE); - static final Color brightPurple = Color(0xFFD1B0E0); - static final Color darkPurple = Color(0xFF350052); - static final Color greyPurple = Color(0xFF775F84); - static final Color pink = Color(0xFFE85DA1); - static final Color hotPink = Color(0xFFD01972); - static final Color lightGrey = Color(0xFFB3B6B3); - static final Color softGreen = Color(0xFFA0FFB0); - static final Color softRed = Color(0xFFFFA0B0); - - String identifier() { - return "light"; - } - - Color backgroundMainColor() { - return whitePurple; - } - - Color backgroundPaneColor() { - return softPurple; - } - - Color backgroundHilightElementColor() { - return softPurple; - } - - Color dividerColor() { - return purple; - } - - Color mainTextColor() { - return darkPurple; - } - - Color altTextColor() { - return purple; - } - - Color hilightElementTextColor() { - return darkPurple; - } - - Color defaultButtonColor() { - return hotPink; - } - - Color defaultButtonActiveColor() { - return pink; - } - - Color defaultButtonTextColor() { - return whitePurple; - } - - Color defaultButtonDisabledColor() { - return lightGrey; - } - - Color defaultButtonDisabledTextColor() { - return whitePurple; - } - - Color altButtonColor() { - return whitePurple; - } - - Color altButtonTextColor() { - return purple; - } - - Color altButtonDisabledColor() { - return softPurple; - } - - Color altButtonDisabledTextColor() { - return purple; - } - - Color textfieldBackgroundColor() { - return purple; - } - - Color textfieldBorderColor() { - return purple; - } - - Color textfieldTextColor() { - return purple; - } - - Color textfieldErrorColor() { - return hotPink; - } - - Color textfieldButtonColor() { - return hotPink; - } - - Color textfieldButtonTextColor() { - return whitePurple; - } - - Color scrollbarDefaultColor() { - return darkPurple; - } - - Color scrollbarActiveColor() { - return hotPink; - } - - Color portraitOnlineBorderColor() { - return greyPurple; - } - - Color portraitOnlineBackgroundColor() { - return greyPurple; - } - - Color portraitOnlineTextColor() { - return darkPurple; - } - - Color portraitConnectingBorderColor() { - return greyPurple; - } - - Color portraitConnectingBackgroundColor() { - return greyPurple; - } - - Color portraitConnectingTextColor() { - return greyPurple; - } - - Color portraitOfflineBorderColor() { - return greyPurple; - } //purple - - Color portraitOfflineBackgroundColor() { - return greyPurple; - } //purple - - Color portraitOfflineTextColor() { - return greyPurple; - } //purple - - Color portraitBlockedBorderColor() { - return lightGrey; - } - - Color portraitBlockedBackgroundColor() { - return lightGrey; - } - - Color portraitBlockedTextColor() { - return lightGrey; - } - - Color portraitOnlineBadgeColor() { - return softGreen; - } - - Color portraitOfflineBadgeColor() { - return softRed; - } - - Color portraitContactBadgeColor() { - return hotPink; - } - - Color portraitContactBadgeTextColor() { - return whitePurple; - } - - Color portraitProfileBadgeColor() { - return brightPurple; - } - - Color portraitProfileBadgeTextColor() { - return whitePurple; - } - - Color portraitOverlayOfflineColor() { - return whitePurple; - } - - Color dropShadowColor() { - return purple; - } - - Color dropShadowPaneColor() { - return purple; - } - - Color toggleColor() { - return whitePurple; - } - - Color toggleOnColor() { - return hotPink; - } - - Color toggleOffColor() { - return purple; - } - - Color sliderButtonColor() { - return pink; - } - - Color sliderBarLeftColor() { - return purple; - } - - Color sliderBarRightColor() { - return purple; - } - - Color boxCheckedColor() { - return darkPurple; - } - - Color toolbarIconColor() { - return darkPurple; - } - - Color toolbarMainColor() { - return whitePurple; - } - - Color toolbarAltColor() { - return softPurple; - } - - Color statusbarDisconnectedInternetColor() { - return softPurple; - } - - Color statusbarDisconnectedInternetFontColor() { - return darkPurple; - } - - Color statusbarDisconnectedTorColor() { - return purple; - } - - Color statusbarDisconnectedTorFontColor() { - return darkPurple; - } - - Color statusbarConnectingColor() { - return greyPurple; - } - - Color statusbarConnectingFontColor() { - return whitePurple; - } - - Color statusbarOnlineColor() { - return darkPurple; - } - - Color statusbarOnlineFontColor() { - return whitePurple; - } - - Color chatOverlayWarningTextColor() { - return purple; - } - - Color messageFromMeBackgroundColor() { - return brightPurple; - } - - Color messageFromMeTextColor() { - return mainTextColor(); - } - - Color messageFromOtherBackgroundColor() { - return purple; - } - - Color messageFromOtherTextColor() { - return darkPurple; - } - - Color messageStatusNormalColor() { - return purple; - } - - Color messageStatusBlockedColor() { - return lightGrey; - } - - Color messageStatusBlockedTextColor() { - return whitePurple; - } - - Color messageStatusAlertColor() { - return hotPink; - } - - Color messageStatusAlertTextColor() { - return whitePurple; - } -} - -ThemeData mkThemeData(Settings opaque) { - return ThemeData( - visualDensity: VisualDensity.adaptivePlatformDensity, - primarySwatch: Colors.red, - primaryIconTheme: IconThemeData( - color: opaque.current().mainTextColor(), - ), - primaryColor: opaque.current().backgroundMainColor(), - canvasColor: opaque.current().backgroundPaneColor(), - backgroundColor: opaque.current().backgroundMainColor(), - highlightColor: opaque.current().hilightElementTextColor(), - iconTheme: IconThemeData( - color: opaque.current().toolbarIconColor(), - ), - cardColor: opaque.current().backgroundMainColor(), - appBarTheme: AppBarTheme( - backgroundColor: opaque.current().backgroundPaneColor(), - iconTheme: IconThemeData( - color: opaque.current().mainTextColor(), - ), - titleTextStyle: TextStyle( - color: opaque.current().mainTextColor(), - ), - actionsIconTheme: IconThemeData( - color: opaque.current().mainTextColor(), - )), - bottomNavigationBarTheme: BottomNavigationBarThemeData(type: BottomNavigationBarType.fixed, backgroundColor: opaque.current().backgroundHilightElementColor()), - 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))), - ), - 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, - splashFactory: InkRipple.splashFactory, - padding: MaterialStateProperty.all(EdgeInsets.all(20)), - shape: MaterialStateProperty.all(RoundedRectangleBorder( - borderRadius: BorderRadius.circular(18.0), - )), - ), - ), - scrollbarTheme: ScrollbarThemeData( - isAlwaysShown: false, thumbColor: MaterialStateProperty.all(opaque.current().scrollbarActiveColor()), trackColor: MaterialStateProperty.all(opaque.current().scrollbarDefaultColor())), - tabBarTheme: TabBarTheme(indicator: UnderlineTabIndicator(borderSide: BorderSide(color: opaque.current().defaultButtonActiveColor()))), - dialogTheme: DialogTheme( - backgroundColor: opaque.current().backgroundPaneColor(), - titleTextStyle: TextStyle(color: opaque.current().mainTextColor()), - contentTextStyle: TextStyle(color: opaque.current().mainTextColor())), - textTheme: TextTheme( - headline1: TextStyle(color: opaque.current().mainTextColor()), - headline2: TextStyle(color: opaque.current().mainTextColor()), - headline3: TextStyle(color: opaque.current().mainTextColor()), - headline4: TextStyle(color: opaque.current().mainTextColor()), - headline5: TextStyle(color: opaque.current().mainTextColor()), - headline6: TextStyle(color: opaque.current().mainTextColor()), - bodyText1: TextStyle(color: opaque.current().mainTextColor()), - bodyText2: TextStyle(color: opaque.current().mainTextColor()), - subtitle1: TextStyle(color: opaque.current().mainTextColor()), - subtitle2: TextStyle(color: opaque.current().mainTextColor()), - caption: TextStyle(color: opaque.current().mainTextColor()), - button: TextStyle(color: opaque.current().mainTextColor()), - overline: TextStyle(color: opaque.current().mainTextColor())), - switchTheme: SwitchThemeData( - overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor()), - thumbColor: MaterialStateProperty.all(opaque.current().mainTextColor()), - trackColor: MaterialStateProperty.all(opaque.current().dropShadowColor()), - ), - floatingActionButtonTheme: FloatingActionButtonThemeData( - 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()), - ); -} - -/* - -OpaqueThemeType _current = CwtchDark(); - -void setDark() { - _current = CwtchDark(); -} - -void setLight() { - _current = CwtchLight(); -} - -OpaqueThemeType current() { - if (_current == null) { - setDark(); - } - return _current; -} - -class Opaque extends OpaqueThemeType { - Color backgroundMainColor() { - return current().backgroundMainColor(); - } - - Color backgroundPaneColor() { - return current().backgroundPaneColor(); - } - - Color backgroundHilightElementColor() { - return current().backgroundHilightElementColor(); - } - - Color dividerColor() { - return current().dividerColor(); - } - - Color mainTextColor() { - return current().mainTextColor(); - } - - Color altTextColor() { - return current().altTextColor(); - } - - Color hilightElementTextColor() { - return current().hilightElementTextColor(); - } - - Color defaultButtonColor() { - return current().defaultButtonColor(); - } - - Color defaultButtonActiveColor() { - return current().defaultButtonActiveColor(); - } - - Color defaultButtonTextColor() { - return current().defaultButtonTextColor(); - } - - Color defaultButtonDisabledColor() { - return current().defaultButtonDisabledColor(); - } - - Color defaultButtonDisabledTextColor() { - return current().defaultButtonDisabledTextColor(); - } - - Color altButtonColor() { - return current().altButtonColor(); - } - - Color altButtonTextColor() { - return current().altButtonTextColor(); - } - - Color altButtonDisabledColor() { - return current().altButtonDisabledColor(); - } - - Color altButtonDisabledTextColor() { - return current().altButtonDisabledTextColor(); - } - - Color textfieldBackgroundColor() { - return current().textfieldBackgroundColor(); - } - - Color textfieldBorderColor() { - return current().textfieldBorderColor(); - } - - Color textfieldTextColor() { - return current().textfieldTextColor(); - } - - Color textfieldErrorColor() { - return current().textfieldErrorColor(); - } - - Color textfieldButtonColor() { - return current().textfieldButtonColor(); - } - - Color textfieldButtonTextColor() { - return current().textfieldButtonTextColor(); - } - - Color dropShadowColor() { - return current().dropShadowColor(); - } - - Color dropShadowPaneColor() { - return current().dropShadowPaneColor(); - } - - Color portraitOnlineBorderColor() { - return current().portraitOnlineBorderColor(); - } - - Color portraitOnlineBackgroundColor() { - return current().portraitOnlineBackgroundColor(); - } - - Color portraitOnlineTextColor() { - return current().portraitOnlineTextColor(); - } - - Color portraitConnectingBorderColor() { - return current().portraitConnectingBorderColor(); - } - - Color portraitConnectingBackgroundColor() { - return current().portraitConnectingBackgroundColor(); - } - - Color portraitConnectingTextColor() { - return current().portraitConnectingTextColor(); - } - - Color portraitOfflineBorderColor() { - return current().portraitOfflineBorderColor(); - } - - Color portraitOfflineBackgroundColor() { - return current().portraitOfflineBackgroundColor(); - } - - Color portraitOfflineTextColor() { - return current().portraitOfflineTextColor(); - } - - Color portraitBlockedBorderColor() { - return current().portraitBlockedBorderColor(); - } - - Color portraitBlockedBackgroundColor() { - return current().portraitBlockedBackgroundColor(); - } - - Color portraitBlockedTextColor() { - return current().portraitBlockedTextColor(); - } - - Color portraitOnlineBadgeColor() { - return current().portraitOnlineBadgeColor(); - } - - Color portraitOfflineBadgeColor() { - return current().portraitOfflineBadgeColor(); - } - - Color portraitContactBadgeColor() { - return current().portraitContactBadgeColor(); - } - - Color portraitContactBadgeTextColor() { - return current().portraitContactBadgeTextColor(); - } - - Color portraitProfileBadgeColor() { - return current().portraitProfileBadgeColor(); - } - - Color portraitProfileBadgeTextColor() { - return current().portraitProfileBadgeTextColor(); - } - - Color portraitOverlayOfflineColor() { - return current().portraitOverlayOfflineColor(); - } - - Color toggleColor() { - return current().toggleColor(); - } - - Color toggleOffColor() { - return current().toggleOffColor(); - } - - Color toggleOnColor() { - return current().toggleOnColor(); - } - - Color sliderButtonColor() { - return current().sliderButtonColor(); - } - - Color sliderBarLeftColor() { - return current().sliderBarLeftColor(); - } - - Color sliderBarRightColor() { - return current().sliderBarRightColor(); - } - - Color boxCheckedColor() { - return current().boxCheckedColor(); - } - - Color toolbarIconColor() { - return current().toolbarIconColor(); - } - - Color toolbarMainColor() { - return current().toolbarMainColor(); - } - - Color toolbarAltColor() { - return current().toolbarAltColor(); - } - - Color statusbarDisconnectedInternetColor() { - return current().statusbarDisconnectedInternetColor(); - } - - Color statusbarDisconnectedInternetFontColor() { - return current().statusbarDisconnectedInternetFontColor(); - } - - Color statusbarDisconnectedTorFontColor() { - return current().statusbarDisconnectedTorFontColor(); - } - - Color statusbarDisconnectedTorColor() { - return current().statusbarDisconnectedTorColor(); - } - - Color statusbarConnectingColor() { - return current().statusbarConnectingColor(); - } - - Color statusbarConnectingFontColor() { - return current().statusbarConnectingFontColor(); - } - - Color statusbarOnlineColor() { - return current().statusbarOnlineColor(); - } - - Color statusbarOnlineFontColor() { - return current().statusbarOnlineFontColor(); - } - - Color chatOverlayWarningTextColor() { - return current().chatOverlayWarningTextColor(); - } - - Color messageFromMeBackgroundColor() { - return current().messageFromMeBackgroundColor(); - } - - Color messageFromMeTextColor() { - return current().messageFromMeTextColor(); - } - - Color messageFromOtherBackgroundColor() { - return current().messageFromOtherBackgroundColor(); - } - - Color messageFromOtherTextColor() { - return current().messageFromOtherTextColor(); - } - - Color messageStatusNormalColor() { - return current().messageStatusNormalColor(); - } - - Color messageStatusBlockedColor() { - return current().messageStatusBlockedColor(); - } - - Color messageStatusBlockedTextColor() { - return current().messageStatusBlockedTextColor(); - } - - Color messageStatusAlertColor() { - return current().messageStatusAlertColor(); - } - - Color messageStatusAlertTextColor() { - return current().messageStatusAlertTextColor(); - } - - Color scrollbarDefaultColor() { - return current().scrollbarDefaultColor(); - } - - Color scrollbarActiveColor() { - return current().scrollbarActiveColor(); - } - - var sidePaneMinSizeBase = [200, 400, 600]; - int sidePaneMinSize() { - return sidePaneMinSizeBase[p[scale]] + 200 /*for debugging*/; - } - - var chatPaneMinSizeBase = [300, 400, 500]; - int chatPaneMinSize() { - return chatPaneMinSizeBase[p[scale]]; - } - - int doublePaneMinSize() { - return sidePaneMinSize() + chatPaneMinSize(); - } - - static late OpaqueThemeType _current; - //static final OpaqueThemeType dark = CwtchDark(); - //static final OpaqueThemeType light = CwtchLight(); - - - int scale = 2; - static final String gcdOS = "linux"; - - var p = [0, 1, 1, 1, 2]; - var t = [0, 0, 1, 2, 2]; - - var paddingMinimalBase = [1, 4, 6]; - int paddingMinimal() { - return paddingMinimalBase[p[scale]]; - } - - var paddingSmallBase = [3, 10, 15]; - int paddingSmall() { - return paddingSmallBase[p[scale]]; - } - - var paddingStandardBase = [8, 20, 30]; - int paddingStandard() { - return paddingStandardBase[p[scale]]; - } - - var paddingLargeBase = [10, 30, 40]; - int paddingLarge() { - return paddingLargeBase[p[scale]]; - } - - var paddingClickTargetBase = gcdOS == "android" ? [10, 40, 100] : [3, 10, 15]; - int paddingClickTarget() { - return paddingClickTargetBase[p[scale]]; - } - - var textSmallPtBase = [8, 12, 16]; - int textSmallPt() { - return textSmallPtBase[t[scale]]; - } - - var textMediumPtBase = [10, 16, 24]; - int textMediumPt() { - return textMediumPtBase[t[scale]]; - } - - var textLargePtBase = [16, 24, 32]; - int textLargePt() { - return textLargePtBase[t[scale]]; - } - - var textSubHeaderPtBase = [12, 18, 26]; - int textSubHeaderPt() { - return textHeaderPtBase[t[scale]]; - } - - var textHeaderPtBase = [16, 24, 32]; - int textHeaderPt() { - return textHeaderPtBase[t[scale]]; - } - - var uiIconSizeSBase = [8, 16, 24]; - int uiIconSizeS() { - return uiIconSizeSBase[p[scale]]; - } - - var uiIconSizeMBase = [24, 32, 48]; - int uiIconSizeM() { - return uiIconSizeMBase[p[scale]]; - } - - var uiIconSizeLBase = [32, 48, 60]; - int uiIconSizeL() { - return uiIconSizeLBase[p[scale]]; - } - - var uiEmojiSizeBase = [24, 32, 48]; - int uiEmojiSize() { - return uiEmojiSizeBase[p[scale]]; - } - - var contactPortraitSizeBase = [60, 72, 84]; - int contactPortraitSize() { - return contactPortraitSizeBase[p[scale]]; - } - - int badgeTextSize() { - return 12; - } - - int statusTextSize() { - return 12; - } - - int chatSize() { - return textMediumPt(); - } - - int tabSize() { - return textMediumPt(); - } -} - -*/ diff --git a/lib/settings.dart b/lib/settings.dart index 7d9392c8..e887223e 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -2,10 +2,11 @@ import 'dart:collection'; import 'dart:ui'; import 'dart:core'; +import 'package:cwtch/themes/cwtch.dart'; import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; -import 'opaque.dart'; +import 'themes/opaque.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; const TapirGroupsExperiment = "tapir-groups-experiment"; @@ -38,15 +39,8 @@ class Settings extends ChangeNotifier { bool streamerMode = false; String _downloadPath = ""; - /// Set the dark theme. - void setDark() { - theme = OpaqueDark(); - notifyListeners(); - } - - /// Set the Light theme. - void setLight() { - theme = OpaqueLight(); + void setTheme(String themeId, String mode) { + theme = getTheme(themeId, mode); notifyListeners(); } @@ -71,11 +65,7 @@ class Settings extends ChangeNotifier { /// be sent to the function and new settings will be instantiated based on the contents. handleUpdate(dynamic settings) { // Set Theme and notify listeners - if (settings["Theme"] == "light") { - this.setLight(); - } else { - this.setDark(); - } + this.setTheme(settings["Theme"], settings["ThemeMode"] ?? mode_dark); // Set Locale and notify listeners switchLocale(Locale(settings["Locale"])); @@ -254,11 +244,10 @@ class Settings extends ChangeNotifier { /// Convert this Settings object to a JSON representation for serialization on the /// event bus. dynamic asJson() { - var themeString = theme.identifier(); - return { "Locale": this.locale.languageCode, - "Theme": themeString, + "Theme": theme.theme, + "ThemeMode": theme.mode, "PreviousPid": -1, "BlockUnknownConnections": blockUnknownConnections, "StreamerMode": streamerMode, diff --git a/lib/themes/cwtch.dart b/lib/themes/cwtch.dart new file mode 100644 index 00000000..c5c65ae9 --- /dev/null +++ b/lib/themes/cwtch.dart @@ -0,0 +1,121 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const cwtch_theme = "cwtch"; + +final Color darkGreyPurple = Color(0xFF281831); +final Color deepPurple = Color(0xFF422850); +final Color mauvePurple = Color(0xFF8E64A5); +final Color whiteishPurple = Color(0xFFE3DFE4); +final Color lightGrey = Color(0xFF9E9E9E); +final Color softGreen = Color(0xFFA0FFB0); +final Color softRed = Color(0xFFFFA0B0); + +final Color whitePurple = Color(0xFFFFFDFF); +final Color softPurple = Color(0xFFFDF3FC); +final Color purple = Color(0xFFDFB9DE); +final Color brightPurple = Color(0xFFD1B0E0); // not in new: portrait badge color +final Color darkPurple = Color(0xFF350052); +final Color greyPurple = Color(0xFF775F84); // not in new: portrait borders +final Color pink = Color(0xFFE85DA1); // not in new: active button color +final Color hotPink = Color(0xFFD20070); // Color(0xFFD01972); +final Color softGrey = Color(0xFFB3B6B3); // not in new theme: blocked + +OpaqueThemeType GetCwtchTheme(String mode) { + if (mode == mode_dark) { + return CwtchDark(); + } else { + return CwtchLight(); + } +} + +class CwtchDark extends OpaqueThemeType { + static final Color background = darkGreyPurple; + static final Color header = darkGreyPurple; + static final Color userBubble = mauvePurple; + static final Color peerBubble = deepPurple; + static final Color font = whiteishPurple; + static final Color settings = whiteishPurple; + static final Color accent = hotPink; + + get theme => cwtch_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get backgroundHilightElementColor => deepPurple; + get mainTextColor => font; //whiteishPurple; + get sendHintTextColor => mauvePurple; + get hilightElementColor => purple; + get defaultButtonColor => accent; //hotPink; + get defaultButtonTextColor => whiteishPurple; + get defaultButtonDisabledColor => lightGrey; + get defaultButtonDisabledTextColor => darkGreyPurple; + get textfieldBackgroundColor => deepPurple; + get textfieldBorderColor => deepPurple; + get textfieldHintColor => mainTextColor; //TODO pick + get textfieldErrorColor => hotPink; + get scrollbarDefaultColor => purple; + get portraitBackgroundColor => deepPurple; + get portraitOnlineBorderColor => whiteishPurple; + get portraitOfflineBorderColor => purple; + get portraitBlockedBorderColor => lightGrey; + get portraitBlockedTextColor => lightGrey; + get portraitContactBadgeColor => hotPink; + get portraitContactBadgeTextColor => whiteishPurple; + get portraitProfileBadgeColor => mauvePurple; + get portraitProfileBadgeTextColor => darkGreyPurple; + get dropShadowColor => mauvePurple; + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class CwtchLight extends OpaqueThemeType { + static final Color background = whitePurple; + static final Color header = softPurple; + static final Color userBubble = purple; + static final Color peerBubble = softPurple; + static final Color font = darkPurple; + static final Color settings = darkPurple; + static final Color accent = hotPink; + + get theme => cwtch_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get backgroundHilightElementColor => softPurple; + get mainTextColor => settings; + get sendHintTextColor => purple; + get hilightElementColor => purple; //darkPurple; // todo shouldn't be this, too dark, makes font unreadable + get defaultButtonColor => accent; // hotPink; + get defaultButtonTextColor => whitePurple; // ? + get defaultButtonDisabledColor => softGrey; + get textfieldBackgroundColor => purple; + get textfieldBorderColor => purple; + get textfieldHintColor => font; //TODO pick + get textfieldErrorColor => hotPink; + get scrollbarDefaultColor => accent; + get portraitBackgroundColor => softPurple; + get portraitOnlineBorderColor => greyPurple; + get portraitOfflineBorderColor => greyPurple; + get portraitBlockedBorderColor => softGrey; + get portraitBlockedTextColor => softGrey; + get portraitContactBadgeColor => accent; + get portraitContactBadgeTextColor => whitePurple; + get portraitProfileBadgeColor => brightPurple; + get portraitProfileBadgeTextColor => whitePurple; + get dropShadowColor => purple; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/ghost.dart b/lib/themes/ghost.dart new file mode 100644 index 00000000..de2d3f2d --- /dev/null +++ b/lib/themes/ghost.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const ghost_theme = "ghost"; + +OpaqueThemeType GetGhostTheme(String mode) { + if (mode == mode_dark) { + return GhostDark(); + } else { + return GhostLight(); + } +} + +class GhostDark extends CwtchDark { + static final Color background = Color(0xFF0D0D1F); + static final Color header = Color(0xFF0D0D1F); + static final Color userBubble = Color(0xFF1A237E); + static final Color peerBubble = Color(0xFF000051); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFDFFFD); + static final Color accent = Color(0xFFD20070); + + get theme => ghost_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class GhostLight extends CwtchLight { + static final Color background = Color(0xFFFDFDFF); + static final Color header = Color(0xFFAAB6FE); + static final Color userBubble = Color(0xFFAAB6FE); + static final Color peerBubble = Color(0xFFE8EAF6); + static final Color font = Color(0xFF0D0D1F); + static final Color settings = Color(0xFF0D0D1F); + static final Color accent = Color(0xFFD20070); + + get theme => ghost_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/mermaid.dart b/lib/themes/mermaid.dart new file mode 100644 index 00000000..c6e21122 --- /dev/null +++ b/lib/themes/mermaid.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const mermaid_theme = "mermaid"; + +OpaqueThemeType GetMermaidTheme(String mode) { + if (mode == mode_dark) { + return MermaidDark(); + } else { + return MermaidLight(); + } +} + +class MermaidDark extends CwtchDark { + static final Color background = Color(0xFF102426); + static final Color header = Color(0xFF102426); + static final Color userBubble = Color(0xFF00838F); + static final Color peerBubble = Color(0xFF00363A); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFF7FCFD); + static final Color accent = Color(0xFF8E64A5); + + get theme => mermaid_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class MermaidLight extends CwtchLight { + static final Color background = Color(0xFFF7FCFD); + static final Color header = Color(0xFF56C8D8); + static final Color userBubble = Color(0xFF56C8D8); + static final Color peerBubble = Color(0xFFB2EBF2); + static final Color font = Color(0xFF102426); + static final Color settings = Color(0xFF102426); + static final Color accent = Color(0xFF8E64A5); + + get theme => mermaid_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/midnight.dart b/lib/themes/midnight.dart new file mode 100644 index 00000000..da1f1bfd --- /dev/null +++ b/lib/themes/midnight.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const midnight_theme = "midnight"; + +OpaqueThemeType GetMidnightTheme(String mode) { + if (mode == mode_dark) { + return MidnightDark(); + } else { + return MidnightLight(); + } +} + +class MidnightDark extends CwtchDark { + static final Color background = Color(0xFF1B1B1B); + static final Color header = Color(0xFF1B1B1B); + static final Color userBubble = Color(0xFF373737); + static final Color peerBubble = Color(0xFF212121); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFFFDFF); + static final Color accent = Color(0xFFD20070); + + get theme => midnight_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class MidnightLight extends CwtchLight { + static final Color background = Color(0xFFFFFDFF); + static final Color header = Color(0xFFE0E0E0); + static final Color userBubble = Color(0xFFE0E0E0); + static final Color peerBubble = Color(0xFFF3F3F3); + static final Color font = Color(0xFF1B1B1B); + static final Color settings = Color(0xFF1B1B1B); + static final Color accent = Color(0xFFD20070); + + get theme => midnight_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/neon1.dart b/lib/themes/neon1.dart new file mode 100644 index 00000000..fcb4f614 --- /dev/null +++ b/lib/themes/neon1.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const neon1_theme = "neon1"; + +OpaqueThemeType GetNeon1Theme(String mode) { + if (mode == mode_dark) { + return Neon1Dark(); + } else { + return Neon1Light(); + } +} + +class Neon1Dark extends CwtchDark { + static final Color background = Color(0xFF290826); + static final Color header = Color(0xFF290826); + static final Color userBubble = Color(0xFFD20070); + static final Color peerBubble = Color(0xFF26A9A4); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFFFDFF); + static final Color accent = Color(0xFFA604FE); + + get theme => neon1_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class Neon1Light extends CwtchLight { + static final Color background = Color(0xFFFFFDFF); + static final Color header = Color(0xFFFF94C2); + static final Color userBubble = Color(0xFFFF94C2); + static final Color peerBubble = Color(0xFFE7F6F6); + static final Color font = Color(0xFF290826); + static final Color settings = Color(0xFF290826); + static final Color accent = Color(0xFFA604FE); + + get theme => neon1_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/neon2.dart b/lib/themes/neon2.dart new file mode 100644 index 00000000..bdfeaf73 --- /dev/null +++ b/lib/themes/neon2.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const neon2_theme = "neon2"; + +OpaqueThemeType GetNeon2Theme(String mode) { + if (mode == mode_dark) { + return Neon2Dark(); + } else { + return Neon2Light(); + } +} + +class Neon2Dark extends CwtchDark { + static final Color background = Color(0xFF290826); + static final Color header = Color(0xFF290826); + static final Color userBubble = Color(0xFFA604FE); + static final Color peerBubble = Color(0xFF03AD00); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFFFDFF); + static final Color accent = Color(0xFFA604FE); + + get theme => neon2_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class Neon2Light extends CwtchLight { + static final Color background = Color(0xFFFFFDFF); + static final Color header = Color(0xFFD8C7E1); + static final Color userBubble = Color(0xFFD8C7E1); + static final Color peerBubble = Color(0xFF80E27E); + static final Color font = Color(0xFF290826); + static final Color settings = Color(0xFF290826); + static final Color accent = Color(0xFFA604FE); + + get theme => neon2_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/opaque.dart b/lib/themes/opaque.dart new file mode 100644 index 00000000..9e601d32 --- /dev/null +++ b/lib/themes/opaque.dart @@ -0,0 +1,201 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:cwtch/themes/mermaid.dart'; +import 'package:cwtch/themes/neon1.dart'; +import 'package:cwtch/themes/pumpkin.dart'; +import 'package:cwtch/themes/vampire.dart'; +import 'package:cwtch/themes/witch.dart'; +import 'package:flutter/material.dart'; +import 'package:cwtch/settings.dart'; + +import 'ghost.dart'; +import 'midnight.dart'; +import 'neon2.dart'; + +const mode_light = "light"; +const mode_dark = "dark"; + +final themes = { + cwtch_theme: {mode_light: CwtchLight(), mode_dark: CwtchDark()}, + ghost_theme: {mode_light: GhostLight(), mode_dark: GhostDark()}, + mermaid_theme: {mode_light: MermaidLight(), mode_dark: MermaidDark()}, + midnight_theme: {mode_light: MidnightLight(), mode_dark: MidnightDark()}, + neon1_theme: {mode_light: Neon1Light(), mode_dark: Neon1Dark()}, + neon2_theme: {mode_light: Neon2Light(), mode_dark: Neon2Dark()}, + pumpkin_theme: {mode_light: PumpkinLight(), mode_dark: PumpkinDark()}, + witch_theme: {mode_light: WitchLight(), mode_dark: WitchDark()}, + vampire_theme: {mode_light: VampireLight(), mode_dark: VampireDark()}, +}; + +OpaqueThemeType getTheme(String themeId, String mode) { + if (themeId == "") { + themeId = cwtch_theme; + } + if (themeId == mode_light) { + themeId = cwtch_theme; + mode = mode_light; + } + if (themeId == mode_dark) { + themeId = cwtch_theme; + mode = mode_dark; + } + + var theme = themes[themeId]?[mode]; + return theme ?? CwtchDark(); +} + +Color lighten(Color color, [double amount = 0.15]) { + final hsl = HSLColor.fromColor(color); + final hslLight = hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0)); + + return hslLight.toColor(); +} + +Color darken(Color color, [double amount = 0.15]) { + final hsl = HSLColor.fromColor(color); + final hslDarken = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0)); + + return hslDarken.toColor(); +} + +abstract class OpaqueThemeType { + static final Color red = Color(0xFFFF0000); + + get theme => "dummy"; + get mode => mode_light; + + // Main screen background color (message pane, item rows) + get backgroundMainColor => red; + + // Top pane ane pane colors (settings) + get backgroundPaneColor => red; + + get mainTextColor => red; + + // pressed row, offline heart + get hilightElementColor => red; + // Selected Row + get backgroundHilightElementColor => red; + // Faded text color for suggestions in textfields + // Todo: implement way more places + get sendHintTextColor => red; + + get defaultButtonColor => red; + get defaultButtonActiveColor => /*mode == mode_light ? darken(defaultButtonColor) :*/ lighten(defaultButtonColor); + get defaultButtonTextColor => red; + get defaultButtonDisabledColor => red; + get textfieldBackgroundColor => red; + get textfieldBorderColor => red; + get textfieldHintColor => red; + get textfieldErrorColor => red; + get scrollbarDefaultColor => red; + get portraitBackgroundColor => red; + get portraitOnlineBorderColor => red; + get portraitOfflineBorderColor => red; + get portraitBlockedBorderColor => red; + get portraitBlockedTextColor => red; + get portraitContactBadgeColor => red; + get portraitContactBadgeTextColor => red; + get portraitProfileBadgeColor => red; + get portraitProfileBadgeTextColor => red; + + // dropshaddpow + // todo: probably should not be reply icon color in messagerow + get dropShadowColor => red; + + get toolbarIconColor => red; + get messageFromMeBackgroundColor => red; + get messageFromMeTextColor => red; + get messageFromOtherBackgroundColor => red; + get messageFromOtherTextColor => red; + + // Sizes + + double contactOnionTextSize() { + return 18; + } +} + +ThemeData mkThemeData(Settings opaque) { + return ThemeData( + visualDensity: VisualDensity.adaptivePlatformDensity, + primarySwatch: Colors.red, + primaryIconTheme: IconThemeData( + color: opaque.current().mainTextColor, + ), + primaryColor: opaque.current().backgroundMainColor, + canvasColor: opaque.current().backgroundPaneColor, + backgroundColor: opaque.current().backgroundMainColor, + highlightColor: opaque.current().hilightElementColor, + iconTheme: IconThemeData( + color: opaque.current().toolbarIconColor, + ), + cardColor: opaque.current().backgroundMainColor, + appBarTheme: AppBarTheme( + backgroundColor: opaque.current().backgroundPaneColor, + iconTheme: IconThemeData( + color: opaque.current().mainTextColor, + ), + titleTextStyle: TextStyle( + color: opaque.current().mainTextColor, + ), + 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, + splashFactory: InkRipple.splashFactory, + padding: MaterialStateProperty.all(EdgeInsets.all(20)), + shape: MaterialStateProperty.all(RoundedRectangleBorder( + borderRadius: BorderRadius.circular(18.0), + )), + ), + ), + scrollbarTheme: ScrollbarThemeData(isAlwaysShown: false, thumbColor: MaterialStateProperty.all(opaque.current().scrollbarDefaultColor)), + tabBarTheme: TabBarTheme(indicator: UnderlineTabIndicator(borderSide: BorderSide(color: opaque.current().defaultButtonActiveColor))), + dialogTheme: DialogTheme( + backgroundColor: opaque.current().backgroundPaneColor, titleTextStyle: TextStyle(color: opaque.current().mainTextColor), contentTextStyle: TextStyle(color: opaque.current().mainTextColor)), + textTheme: TextTheme( + headline1: TextStyle(color: opaque.current().mainTextColor), + headline2: TextStyle(color: opaque.current().mainTextColor), + headline3: TextStyle(color: opaque.current().mainTextColor), + headline4: TextStyle(color: opaque.current().mainTextColor), + headline5: TextStyle(color: opaque.current().mainTextColor), + headline6: TextStyle(color: opaque.current().mainTextColor), + bodyText1: TextStyle(color: opaque.current().mainTextColor), + bodyText2: TextStyle(color: opaque.current().mainTextColor), + subtitle1: TextStyle(color: opaque.current().mainTextColor), + subtitle2: TextStyle(color: opaque.current().mainTextColor), + caption: TextStyle(color: opaque.current().mainTextColor), + button: TextStyle(color: opaque.current().mainTextColor), + overline: TextStyle(color: opaque.current().mainTextColor)), + switchTheme: SwitchThemeData( + overlayColor: MaterialStateProperty.all(opaque.current().defaultButtonActiveColor), + thumbColor: MaterialStateProperty.all(opaque.current().mainTextColor), + trackColor: MaterialStateProperty.all(opaque.current().dropShadowColor), + ), + floatingActionButtonTheme: FloatingActionButtonThemeData( + 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), + ); +} diff --git a/lib/themes/pumpkin.dart b/lib/themes/pumpkin.dart new file mode 100644 index 00000000..f1c2faef --- /dev/null +++ b/lib/themes/pumpkin.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const pumpkin_theme = "pumpkin"; + +OpaqueThemeType GetPumpkinTheme(String mode) { + if (mode == mode_dark) { + return PumpkinDark(); + } else { + return PumpkinLight(); + } +} + +class PumpkinDark extends CwtchDark { + static final Color background = Color(0xFF281831); + static final Color header = Color(0xFF281831); + static final Color userBubble = Color(0xFFB53D00); + static final Color peerBubble = Color(0xFF422850); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFFFBF6); + static final Color accent = Color(0xFF8E64A5); + + get theme => pumpkin_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class PumpkinLight extends CwtchLight { + static final Color background = Color(0xFFFFFBF6); + static final Color header = Color(0xFFFF9800); + static final Color userBubble = Color(0xFFFF9800); + static final Color peerBubble = Color(0xFFD8C7E1); + static final Color font = Color(0xFF281831); + static final Color settings = Color(0xFF281831); + static final Color accent = Color(0xFF8E64A5); + + get theme => pumpkin_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/vampire.dart b/lib/themes/vampire.dart new file mode 100644 index 00000000..13bba5b2 --- /dev/null +++ b/lib/themes/vampire.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const vampire_theme = "vampire"; + +OpaqueThemeType GetVampireTheme(String mode) { + if (mode == mode_dark) { + return VampireDark(); + } else { + return VampireLight(); + } +} + +class VampireDark extends CwtchDark { + static final Color background = Color(0xFF281831); + static final Color header = Color(0xFF281831); + static final Color userBubble = Color(0xFF9A1218); + static final Color peerBubble = Color(0xFF422850); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFDFFFD); + static final Color accent = Color(0xFF8E64A5); + + get theme => vampire_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class VampireLight extends CwtchLight { + static final Color background = Color(0xFFFFFDFD); + static final Color header = Color(0xFFD8C7E1); + static final Color userBubble = Color(0xFFD8C7E1); + static final Color peerBubble = Color(0xFFFFEBEE); + static final Color font = Color(0xFF281831); + static final Color settings = Color(0xFF281831); + static final Color accent = Color(0xFF8E64A5); + + get theme => vampire_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/themes/witch.dart b/lib/themes/witch.dart new file mode 100644 index 00000000..38ad6c8e --- /dev/null +++ b/lib/themes/witch.dart @@ -0,0 +1,67 @@ +import 'dart:ui'; +import 'dart:core'; + +import 'package:cwtch/themes/cwtch.dart'; +import 'package:flutter/material.dart'; + +import 'opaque.dart'; + +const witch_theme = "witch"; + +OpaqueThemeType GetWitchTheme(String mode) { + if (mode == mode_dark) { + return WitchDark(); + } else { + return WitchLight(); + } +} + +class WitchDark extends CwtchDark { + static final Color background = Color(0xFF0E1E0E); + static final Color header = Color(0xFF0E1E0E); + static final Color userBubble = Color(0xFF1B5E20); + static final Color peerBubble = Color(0xFF003300); + static final Color font = Color(0xFFFFFFFF); + static final Color settings = Color(0xFFFDFFFD); + static final Color accent = Color(0xFFD20070); + + get theme => witch_theme; + get mode => mode_dark; + + get backgroundMainColor => background; // darkGreyPurple; + get backgroundPaneColor => header; //darkGreyPurple; + get mainTextColor => font; //whiteishPurple; + get defaultButtonColor => accent; //hotPink; + get textfieldHintColor => mainTextColor; //TODO pick + get toolbarIconColor => settings; //whiteishPurple; + get messageFromMeBackgroundColor => userBubble; // mauvePurple; + get messageFromMeTextColor => font; //whiteishPurple; + get messageFromOtherBackgroundColor => peerBubble; //deepPurple; + get messageFromOtherTextColor => font; //whiteishPurple; +} + +class WitchLight extends CwtchLight { + static final Color background = Color(0xFFFDFFFD); + static final Color header = Color(0xFF80E27E); + static final Color userBubble = Color(0xFF80E27E); + static final Color peerBubble = Color(0xFFE8F5E9); + static final Color font = Color(0xFF0E1E0E); + static final Color settings = Color(0xFF0E1E0E); + static final Color accent = Color(0xFFD20070); + + get theme => witch_theme; + get mode => mode_light; + + get backgroundMainColor => background; //whitePurple; + get backgroundPaneColor => header; //softPurple; + get mainTextColor => settings; + get defaultButtonColor => accent; // hotPink; + get textfieldHintColor => font; //TODO pick + get scrollbarDefaultColor => accent; + get portraitContactBadgeColor => accent; + get toolbarIconColor => settings; //darkPurple; + get messageFromMeBackgroundColor => userBubble; //brightPurple; + get messageFromMeTextColor => font; //mainTextColor; + get messageFromOtherBackgroundColor => peerBubble; //purple; + get messageFromOtherTextColor => font; //darkPurple; +} diff --git a/lib/torstatus.dart b/lib/torstatus.dart index a6910b58..af94b78d 100644 --- a/lib/torstatus.dart +++ b/lib/torstatus.dart @@ -18,6 +18,9 @@ class TorStatus extends ChangeNotifier { progress = new_progress; status = new_status; + if (new_progress != 100) { + status = "$new_progress% - $new_status"; + } notifyListeners(); } diff --git a/lib/views/addcontactview.dart b/lib/views/addcontactview.dart index 8485058f..4e984595 100644 --- a/lib/views/addcontactview.dart +++ b/lib/views/addcontactview.dart @@ -163,7 +163,7 @@ class _AddContactViewState extends State { } }); }, - labelText: '', + hintText: '', ) ]))); } @@ -197,11 +197,15 @@ class _AddContactViewState extends State { }, isExpanded: true, // magic property value: server, - items: Provider.of(context).serverList.servers.map>((RemoteServerInfoState serverInfo) { + items: Provider.of(context) + .serverList + .servers + .where((serverInfo) => serverInfo.status == "Synced") + .map>((RemoteServerInfoState serverInfo) { return DropdownMenuItem( value: serverInfo.onion, child: Text( - serverInfo.onion, + serverInfo.description, overflow: TextOverflow.ellipsis, ), ); @@ -215,7 +219,7 @@ class _AddContactViewState extends State { ), CwtchTextField( controller: ctrlrGroupName, - labelText: AppLocalizations.of(context)!.groupNameLabel, + hintText: AppLocalizations.of(context)!.groupNameLabel, onChanged: (newValue) {}, validator: (value) {}, ), diff --git a/lib/views/addeditprofileview.dart b/lib/views/addeditprofileview.dart index 0f8a3dd5..b2bddf57 100644 --- a/lib/views/addeditprofileview.dart +++ b/lib/views/addeditprofileview.dart @@ -18,7 +18,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../cwtch_icons_icons.dart'; import '../errorHandler.dart'; import '../main.dart'; -import '../opaque.dart'; +import '../themes/opaque.dart'; import '../settings.dart'; class AddEditProfileView extends StatefulWidget { @@ -93,7 +93,7 @@ class _AddEditProfileViewState extends State { imagePath: Provider.of(context).imagePath, diameter: 120, maskOut: false, - border: theme.theme.portraitOnlineBorderColor(), + border: theme.theme.portraitOnlineBorderColor, badgeTextColor: Colors.red, badgeColor: Colors.red, ) @@ -106,7 +106,7 @@ class _AddEditProfileViewState extends State { CwtchTextField( controller: ctrlrNick, autofocus: false, - labelText: AppLocalizations.of(context)!.yourDisplayName, + hintText: AppLocalizations.of(context)!.yourDisplayName, validator: (value) { if (value.isEmpty) { return AppLocalizations.of(context)!.displayNameTooltip; @@ -147,13 +147,13 @@ class _AddEditProfileViewState extends State { child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ Checkbox( value: usePassword, - fillColor: MaterialStateProperty.all(theme.current().defaultButtonColor()), - activeColor: theme.current().defaultButtonActiveColor(), + fillColor: MaterialStateProperty.all(theme.current().defaultButtonColor), + activeColor: theme.current().defaultButtonActiveColor, onChanged: _handleSwitchPassword, ), Text( AppLocalizations.of(context)!.radioUsePassword, - style: TextStyle(color: theme.current().mainTextColor()), + style: TextStyle(color: theme.current().mainTextColor), ), SizedBox( height: 20, diff --git a/lib/views/addeditservers.dart b/lib/views/addeditservers.dart index b2a5cacf..ede9911a 100644 --- a/lib/views/addeditservers.dart +++ b/lib/views/addeditservers.dart @@ -33,7 +33,6 @@ class _AddEditServerViewState extends State { final ctrlrOnion = TextEditingController(text: ""); late bool usePassword; - //late bool deleted; @override void initState() { @@ -81,22 +80,16 @@ class _AddEditServerViewState extends State { child: Form( key: _formKey, child: Container( - margin: EdgeInsets.fromLTRB(30, 0, 30, 10), - padding: EdgeInsets.fromLTRB(20, 0, 20, 10), + margin: EdgeInsets.fromLTRB(30, 5, 30, 10), + padding: EdgeInsets.fromLTRB(20, 5, 20, 10), child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ // Onion Visibility( visible: serverInfoState.onion.isNotEmpty, - child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - height: 20, - ), - CwtchLabel(label: AppLocalizations.of(context)!.serverAddress), - SizedBox( - height: 20, - ), - SelectableText(serverInfoState.onion) - ])), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [CwtchLabel(label: AppLocalizations.of(context)!.serverAddress), SelectableText(serverInfoState.onion)])), // Description Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -110,7 +103,7 @@ class _AddEditServerViewState extends State { ), CwtchTextField( controller: ctrlrDesc, - labelText: AppLocalizations.of(context)!.fieldDescriptionLabel, + hintText: AppLocalizations.of(context)!.fieldDescriptionLabel, autofocus: false, ) ]), @@ -123,7 +116,7 @@ class _AddEditServerViewState extends State { Visibility( visible: serverInfoState.onion.isNotEmpty, child: SwitchListTile( - title: Text(AppLocalizations.of(context)!.serverEnabled, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.serverEnabled, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.serverEnabledDescription), value: serverInfoState.running, onChanged: (bool value) { @@ -134,14 +127,14 @@ class _AddEditServerViewState extends State { Provider.of(context, listen: false).cwtch.StopServer(serverInfoState.onion); } }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.negative_heart_24px, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.negative_heart_24px, color: settings.current().mainTextColor), )), // Auto start SwitchListTile( - title: Text(AppLocalizations.of(context)!.serverAutostartLabel, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.serverAutostartLabel, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.serverAutostartDescription), value: serverInfoState.autoStart, onChanged: (bool value) { @@ -151,11 +144,33 @@ class _AddEditServerViewState extends State { Provider.of(context, listen: false).cwtch.SetServerAttribute(serverInfoState.onion, "autostart", value ? "true" : "false"); } }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.favorite_24dp, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.favorite_24dp, color: settings.current().mainTextColor), ), + // metrics + Visibility( + visible: serverInfoState.onion.isNotEmpty, + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox( + height: 20, + ), + Text(AppLocalizations.of(context)!.serverMetricsLabel, style: Provider.of(context).biggerFont), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(AppLocalizations.of(context)!.serverTotalMessagesLabel), + ]), + Text(serverInfoState.totalMessages.toString()) + ]), + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Row(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(AppLocalizations.of(context)!.serverConnectionsLabel), + ]), + Text(serverInfoState.connections.toString()) + ]), + ])), + // ***** Password ***** // use password toggle @@ -167,13 +182,13 @@ class _AddEditServerViewState extends State { ), Checkbox( value: usePassword, - fillColor: MaterialStateProperty.all(settings.current().defaultButtonColor()), - activeColor: settings.current().defaultButtonActiveColor(), + fillColor: MaterialStateProperty.all(settings.current().defaultButtonColor), + activeColor: settings.current().defaultButtonActiveColor, onChanged: _handleSwitchPassword, ), Text( AppLocalizations.of(context)!.radioUsePassword, - style: TextStyle(color: settings.current().mainTextColor()), + style: TextStyle(color: settings.current().mainTextColor), ), SizedBox( height: 20, diff --git a/lib/views/contactsview.dart b/lib/views/contactsview.dart index 5c2f564d..cfb29b01 100644 --- a/lib/views/contactsview.dart +++ b/lib/views/contactsview.dart @@ -78,7 +78,7 @@ class _ContactsViewState extends State { ProfileImage( imagePath: Provider.of(context).imagePath, diameter: 42, - border: Provider.of(context).current().portraitOnlineBorderColor(), + border: Provider.of(context).current().portraitOnlineBorderColor, badgeTextColor: Colors.red, badgeColor: Colors.red, ), @@ -87,7 +87,7 @@ class _ContactsViewState extends State { ), Expanded( child: Text("%1 » %2".replaceAll("%1", Provider.of(context).nickname).replaceAll("%2", AppLocalizations.of(context)!.titleManageContacts), - overflow: TextOverflow.ellipsis, style: TextStyle(color: Provider.of(context).current().mainTextColor()))), + overflow: TextOverflow.ellipsis, style: TextStyle(color: Provider.of(context).current().mainTextColor))), ])), actions: getActions(context), ), @@ -114,7 +114,7 @@ class _ContactsViewState extends State { })); // Manage known Servers - if (Provider.of(context, listen: false).isExperimentEnabled(ServerManagementExperiment)) { + if (Provider.of(context, listen: false).isExperimentEnabled(TapirGroupsExperiment) || Provider.of(context, listen: false).isExperimentEnabled(ServerManagementExperiment)) { actions.add(IconButton( icon: Icon(CwtchIcons.dns_24px), tooltip: AppLocalizations.of(context)!.manageKnownServersButton, @@ -139,7 +139,7 @@ class _ContactsViewState extends State { Widget _buildFilterable() { Widget txtfield = CwtchTextField( controller: ctrlrFilter, - labelText: AppLocalizations.of(context)!.search, + hintText: AppLocalizations.of(context)!.search, onChanged: (newVal) { Provider.of(context, listen: false).filter = newVal; }, diff --git a/lib/views/globalsettingsview.dart b/lib/views/globalsettingsview.dart index f473e223..c2d9880c 100644 --- a/lib/views/globalsettingsview.dart +++ b/lib/views/globalsettingsview.dart @@ -3,6 +3,16 @@ import 'dart:io'; import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:cwtch/models/servers.dart'; import 'package:cwtch/widgets/folderpicker.dart'; +import 'package:cwtch/themes/cwtch.dart'; +import 'package:cwtch/themes/ghost.dart'; +import 'package:cwtch/themes/mermaid.dart'; +import 'package:cwtch/themes/midnight.dart'; +import 'package:cwtch/themes/neon1.dart'; +import 'package:cwtch/themes/neon2.dart'; +import 'package:cwtch/themes/opaque.dart'; +import 'package:cwtch/themes/pumpkin.dart'; +import 'package:cwtch/themes/vampire.dart'; +import 'package:cwtch/themes/witch.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:cwtch/settings.dart'; @@ -37,7 +47,7 @@ class _GlobalSettingsViewState extends State { Widget _buildSettingsList() { return Consumer(builder: (context, settings, child) { return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { - var appIcon = Icon(Icons.info, color: settings.current().mainTextColor()); + var appIcon = Icon(Icons.info, color: settings.current().mainTextColor); return Scrollbar( isAlwaysShown: true, child: SingleChildScrollView( @@ -48,8 +58,8 @@ class _GlobalSettingsViewState extends State { ), child: Column(children: [ ListTile( - title: Text(AppLocalizations.of(context)!.settingLanguage, style: TextStyle(color: settings.current().mainTextColor())), - leading: Icon(CwtchIcons.change_language, color: settings.current().mainTextColor()), + title: Text(AppLocalizations.of(context)!.settingLanguage, style: TextStyle(color: settings.current().mainTextColor)), + leading: Icon(CwtchIcons.change_language, color: settings.current().mainTextColor), trailing: DropdownButton( value: Provider.of(context).locale.languageCode, onChanged: (String? newValue) { @@ -65,25 +75,43 @@ class _GlobalSettingsViewState extends State { ); }).toList())), SwitchListTile( - title: Text(AppLocalizations.of(context)!.settingTheme, style: TextStyle(color: settings.current().mainTextColor())), - value: settings.current().identifier() == "light", + title: Text(AppLocalizations.of(context)!.settingTheme, style: TextStyle(color: settings.current().mainTextColor)), + value: settings.current().mode == mode_light, onChanged: (bool value) { if (value) { - settings.setLight(); + settings.setTheme(settings.theme.theme, mode_light); } else { - settings.setDark(); + settings.setTheme(settings.theme.theme, mode_dark); } // Save Settings... saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.change_theme, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.change_theme, color: settings.current().mainTextColor), ), ListTile( - title: Text(AppLocalizations.of(context)!.settingUIColumnPortrait, style: TextStyle(color: settings.current().mainTextColor())), - leading: Icon(Icons.table_chart, color: settings.current().mainTextColor()), + title: Text(AppLocalizations.of(context)!.themeColorLabel), + trailing: DropdownButton( + value: Provider.of(context).theme.theme, + onChanged: (String? newValue) { + setState(() { + settings.setTheme(newValue!, settings.theme.mode); + saveSettings(context); + }); + }, + items: themes.keys.map>((String themeId) { + return DropdownMenuItem( + value: themeId, + child: Text(getThemeName(context, themeId)), + ); + }).toList()), + leading: Icon(CwtchIcons.change_theme, color: settings.current().mainTextColor), + ), + ListTile( + title: Text(AppLocalizations.of(context)!.settingUIColumnPortrait, style: TextStyle(color: settings.current().mainTextColor)), + leading: Icon(Icons.table_chart, color: settings.current().mainTextColor), trailing: DropdownButton( value: settings.uiColumnModePortrait.toString(), onChanged: (String? newValue) { @@ -101,9 +129,9 @@ class _GlobalSettingsViewState extends State { AppLocalizations.of(context)!.settingUIColumnLandscape, textWidthBasis: TextWidthBasis.longestLine, softWrap: true, - style: TextStyle(color: settings.current().mainTextColor()), + style: TextStyle(color: settings.current().mainTextColor), ), - leading: Icon(Icons.table_chart, color: settings.current().mainTextColor()), + leading: Icon(Icons.table_chart, color: settings.current().mainTextColor), trailing: Container( width: 200.0, child: DropdownButton( @@ -123,7 +151,7 @@ class _GlobalSettingsViewState extends State { ); }).toList()))), SwitchListTile( - title: Text(AppLocalizations.of(context)!.blockUnknownLabel, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.blockUnknownLabel, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.descriptionBlockUnknownConnections), value: settings.blockUnknownConnections, onChanged: (bool value) { @@ -136,12 +164,12 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.block_unknown, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.block_unknown, color: settings.current().mainTextColor), ), SwitchListTile( - title: Text(AppLocalizations.of(context)!.streamerModeLabel, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.streamerModeLabel, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.descriptionStreamerMode), value: settings.streamerMode, onChanged: (bool value) { @@ -149,12 +177,12 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.streamer_bunnymask, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.streamer_bunnymask, color: settings.current().mainTextColor), ), SwitchListTile( - title: Text(AppLocalizations.of(context)!.experimentsEnabled, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.experimentsEnabled, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.descriptionExperiments), value: settings.experimentsEnabled, onChanged: (bool value) { @@ -166,16 +194,16 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.enable_experiments, color: settings.current().mainTextColor()), + 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, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.enableGroups, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.descriptionExperimentsGroups), value: settings.isExperimentEnabled(TapirGroupsExperiment), onChanged: (bool value) { @@ -187,14 +215,14 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.enable_groups, color: settings.current().mainTextColor()), + 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, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.settingServers, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.settingServersDescription), value: settings.isExperimentEnabled(ServerManagementExperiment), onChanged: (bool value) { @@ -207,12 +235,12 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.dns_24px, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.dns_24px, color: settings.current().mainTextColor), )), SwitchListTile( - title: Text(AppLocalizations.of(context)!.settingFileSharing, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.settingFileSharing, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.descriptionFileSharing), value: settings.isExperimentEnabled(FileSharingExperiment), onChanged: (bool value) { @@ -223,15 +251,15 @@ class _GlobalSettingsViewState extends State { } saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor), ), Visibility( visible: settings.isExperimentEnabled(FileSharingExperiment), child: Column(children: [ SwitchListTile( - title: Text(AppLocalizations.of(context)!.settingImagePreviews, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.settingImagePreviews, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.settingImagePreviewsDescription), value: settings.isExperimentEnabled(ImagePreviewsExperiment), onChanged: (bool value) { @@ -243,9 +271,9 @@ class _GlobalSettingsViewState extends State { } saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor), ), Visibility( visible: settings.isExperimentEnabled(ImagePreviewsExperiment) && !Platform.isAndroid, @@ -259,7 +287,7 @@ class _GlobalSettingsViewState extends State { ), ), SwitchListTile( - title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.experimentClickableLinksDescription), value: settings.isExperimentEnabled(ClickableLinksExperiment), onChanged: (bool value) { @@ -270,9 +298,9 @@ class _GlobalSettingsViewState extends State { } saveSettings(context); }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(Icons.link, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.link, color: settings.current().mainTextColor), ), ]), ), @@ -285,8 +313,8 @@ class _GlobalSettingsViewState extends State { applicationLegalese: '\u{a9} 2021 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 + 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)), ) ]), @@ -334,6 +362,31 @@ String getLanguageFull(context, String languageCode) { return languageCode; } +/// Since we don't seem to able to dynamically pull translations, this function maps themes to their names +String getThemeName(context, String theme) { + switch (theme) { + case cwtch_theme: + return AppLocalizations.of(context)!.themeNameCwtch; + case ghost_theme: + return AppLocalizations.of(context)!.themeNameGhost; + case mermaid_theme: + return AppLocalizations.of(context)!.themeNameMermaid; + case midnight_theme: + return AppLocalizations.of(context)!.themeNameMidnight; + case neon1_theme: + return AppLocalizations.of(context)!.themeNameNeon1; + case neon2_theme: + return AppLocalizations.of(context)!.themeNameNeon2; + case pumpkin_theme: + return AppLocalizations.of(context)!.themeNamePumpkin; + case vampire_theme: + return AppLocalizations.of(context)!.themeNameVampire; + case witch_theme: + return AppLocalizations.of(context)!.themeNameWitch; + } + return theme; +} + /// Send an UpdateGlobalSettings to the Event Bus saveSettings(context) { var settings = Provider.of(context, listen: false); diff --git a/lib/views/groupsettingsview.dart b/lib/views/groupsettingsview.dart index 463a99b2..6407c4ef 100644 --- a/lib/views/groupsettingsview.dart +++ b/lib/views/groupsettingsview.dart @@ -101,7 +101,7 @@ class _GroupSettingsViewState extends State { ), CwtchTextField( controller: ctrlrGroupAddr, - labelText: '', + hintText: '', validator: (value) {}, ) ]), @@ -116,7 +116,7 @@ class _GroupSettingsViewState extends State { CwtchTextField( controller: TextEditingController(text: Provider.of(context, listen: false).server), validator: (value) {}, - labelText: '', + hintText: '', ) ]), diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index c4315647..6febb013 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -106,6 +106,7 @@ class _MessageViewState extends State { return WillPopScope( onWillPop: _onWillPop, child: Scaffold( + backgroundColor: Provider.of(context).theme.backgroundMainColor, floatingActionButton: appState.unreadMessagesBelow ? FloatingActionButton( child: Icon(Icons.arrow_downward), @@ -122,7 +123,7 @@ class _MessageViewState extends State { ProfileImage( imagePath: Provider.of(context).imagePath, diameter: 42, - border: Provider.of(context).current().portraitOnlineBorderColor(), + border: Provider.of(context).current().portraitOnlineBorderColor, badgeTextColor: Colors.red, badgeColor: Colors.red, ), @@ -227,7 +228,7 @@ class _MessageViewState extends State { bool isOffline = Provider.of(context).isOnline() == false; var composeBox = Container( - color: Provider.of(context).theme.backgroundMainColor(), + color: Provider.of(context).theme.backgroundMainColor, padding: EdgeInsets.all(2), margin: EdgeInsets.all(2), height: 100, @@ -235,7 +236,7 @@ class _MessageViewState extends State { children: [ Expanded( child: Container( - decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of(context).theme.defaultButtonActiveColor()))), + decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of(context).theme.defaultButtonActiveColor))), child: RawKeyboardListener( focusNode: FocusNode(), onKey: handleKeyPress, @@ -255,12 +256,12 @@ class _MessageViewState extends State { enabled: !isOffline, decoration: InputDecoration( hintText: isOffline ? "" : AppLocalizations.of(context)!.placeholderEnterMessage, - hintStyle: TextStyle(color: Provider.of(context).theme.altTextColor()), + hintStyle: TextStyle(color: Provider.of(context).theme.sendHintTextColor), enabledBorder: InputBorder.none, focusedBorder: InputBorder.none, enabled: true, suffixIcon: ElevatedButton( - child: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of(context).theme.defaultButtonTextColor()), + child: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of(context).theme.defaultButtonTextColor), onPressed: isOffline ? null : _sendMessage, ))), )))), @@ -280,8 +281,8 @@ class _MessageViewState extends State { margin: EdgeInsets.all(5), padding: EdgeInsets.all(5), color: message.getMetadata().senderHandle != Provider.of(context).selectedProfile - ? Provider.of(context).theme.messageFromOtherBackgroundColor() - : Provider.of(context).theme.messageFromMeBackgroundColor(), + ? Provider.of(context).theme.messageFromOtherBackgroundColor + : Provider.of(context).theme.messageFromMeBackgroundColor, child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack(children: [ Align( @@ -315,7 +316,7 @@ class _MessageViewState extends State { children = [composeBox]; } - return Column(mainAxisSize: MainAxisSize.min, children: children); + return Container(color: Provider.of(context).theme.backgroundMainColor, child: Column(mainAxisSize: MainAxisSize.min, children: children)); } // Send the message if enter is pressed without the shift key... diff --git a/lib/views/peersettingsview.dart b/lib/views/peersettingsview.dart index 506c1706..57f42b40 100644 --- a/lib/views/peersettingsview.dart +++ b/lib/views/peersettingsview.dart @@ -105,7 +105,7 @@ class _PeerSettingsViewState extends State { height: 20, ), SwitchListTile( - title: Text(AppLocalizations.of(context)!.blockBtn, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.blockBtn, style: TextStyle(color: settings.current().mainTextColor)), value: Provider.of(context).isBlocked, onChanged: (bool blocked) { // Save local blocked status @@ -137,14 +137,14 @@ class _PeerSettingsViewState extends State { Provider.of(context, listen: false).cwtch.SendProfileEvent(profileOnion, setPeerAttributeJson); } }, - activeTrackColor: settings.theme.defaultButtonActiveColor(), - inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), - secondary: Icon(CwtchIcons.block_peer, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.block_peer, color: settings.current().mainTextColor), ), ListTile( - title: Text(AppLocalizations.of(context)!.savePeerHistory, style: TextStyle(color: settings.current().mainTextColor())), + title: Text(AppLocalizations.of(context)!.savePeerHistory, style: TextStyle(color: settings.current().mainTextColor)), subtitle: Text(AppLocalizations.of(context)!.savePeerHistoryDescription), - leading: Icon(CwtchIcons.peer_history, color: settings.current().mainTextColor()), + leading: Icon(CwtchIcons.peer_history, color: settings.current().mainTextColor), trailing: DropdownButton( value: Provider.of(context).savePeerHistory == "DefaultDeleteHistory" ? AppLocalizations.of(context)!.dontSavePeerHistory diff --git a/lib/views/profilemgrview.dart b/lib/views/profilemgrview.dart index e4a6eba0..da72472c 100644 --- a/lib/views/profilemgrview.dart +++ b/lib/views/profilemgrview.dart @@ -46,20 +46,20 @@ class _ProfileMgrViewState extends State { return Provider.of(context, listen: false).cwtchIsClosing; }, child: Scaffold( - backgroundColor: settings.theme.backgroundMainColor(), + backgroundColor: settings.theme.backgroundMainColor, appBar: AppBar( title: Row(children: [ Icon( CwtchIcons.cwtch_knott, size: 36, - color: settings.theme.mainTextColor(), + color: settings.theme.mainTextColor, ), SizedBox( width: 10, ), Expanded( child: Text(MediaQuery.of(context).size.width > 600 ? AppLocalizations.of(context)!.titleManageProfiles : AppLocalizations.of(context)!.titleManageProfilesShort, - style: TextStyle(color: settings.current().mainTextColor()))) + style: TextStyle(color: settings.current().mainTextColor))) ]), actions: getActions(), ), @@ -93,7 +93,7 @@ class _ProfileMgrViewState extends State { // Unlock Profiles actions.add(IconButton( icon: Icon(CwtchIcons.lock_open_24px), - color: Provider.of(context).profiles.isEmpty ? Provider.of(context).theme.defaultButtonColor() : Provider.of(context).theme.mainTextColor(), + color: Provider.of(context).profiles.isEmpty ? Provider.of(context).theme.defaultButtonColor : Provider.of(context).theme.mainTextColor, tooltip: AppLocalizations.of(context)!.tooltipUnlockProfiles, onPressed: _modalUnlockProfiles, )); diff --git a/lib/views/profileserversview.dart b/lib/views/profileserversview.dart index bd4fd40e..1fd029b4 100644 --- a/lib/views/profileserversview.dart +++ b/lib/views/profileserversview.dart @@ -62,7 +62,7 @@ class _ProfileServersView extends State { final importCard = Card( child: ListTile( title: Text(AppLocalizations.of(context)!.importLocalServerLabel), - leading: Icon(CwtchIcons.add_circle_24px, color: Provider.of(context).current().mainTextColor()), + leading: Icon(CwtchIcons.add_circle_24px, color: Provider.of(context).current().mainTextColor), trailing: DropdownButton( onChanged: (String? importServer) { if (importServer!.isNotEmpty) { diff --git a/lib/views/remoteserverview.dart b/lib/views/remoteserverview.dart index e43a79e5..18bcdd04 100644 --- a/lib/views/remoteserverview.dart +++ b/lib/views/remoteserverview.dart @@ -128,7 +128,7 @@ class _RemoteServerViewState extends State { child: Column(children: [ Text( group.nickname, - style: Provider.of(context).biggerFont.apply(color: Provider.of(context).theme.portraitOnlineBorderColor()), + style: Provider.of(context).biggerFont.apply(color: Provider.of(context).theme.portraitOnlineBorderColor), softWrap: true, overflow: TextOverflow.ellipsis, ), @@ -139,7 +139,7 @@ class _RemoteServerViewState extends State { group.onion, softWrap: true, overflow: TextOverflow.ellipsis, - style: TextStyle(color: Provider.of(context).theme.portraitOnlineBorderColor()), + style: TextStyle(color: Provider.of(context).theme.portraitOnlineBorderColor), ))) ])); } diff --git a/lib/views/serversview.dart b/lib/views/serversview.dart index 148d1daf..d413f2b2 100644 --- a/lib/views/serversview.dart +++ b/lib/views/serversview.dart @@ -30,6 +30,7 @@ class _ServersView extends State { @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Provider.of(context, listen: false).theme.backgroundMainColor, appBar: AppBar( title: Text(MediaQuery.of(context).size.width > 600 ? AppLocalizations.of(context)!.serversManagerTitleLong : AppLocalizations.of(context)!.serversManagerTitleShort), actions: getActions(), @@ -77,7 +78,7 @@ class _ServersView extends State { // Unlock Profiles actions.add(IconButton( icon: Icon(CwtchIcons.lock_open_24px), - color: Provider.of(context).servers.isEmpty ? Provider.of(context).theme.defaultButtonColor() : Provider.of(context).theme.mainTextColor(), + color: Provider.of(context).servers.isEmpty ? Provider.of(context).theme.defaultButtonColor : Provider.of(context).theme.mainTextColor, tooltip: AppLocalizations.of(context)!.tooltipUnlockProfiles, onPressed: _modalUnlockServers, )); diff --git a/lib/views/splashView.dart b/lib/views/splashView.dart index a5642f2d..9e68b2f8 100644 --- a/lib/views/splashView.dart +++ b/lib/views/splashView.dart @@ -1,11 +1,17 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import '../model.dart'; import '../settings.dart'; -class SplashView extends StatelessWidget { +class SplashView extends StatefulWidget { + @override + _SplashViewState createState() => _SplashViewState(); +} + +class _SplashViewState extends State { @override Widget build(BuildContext context) { return Consumer( @@ -25,11 +31,24 @@ class SplashView extends StatelessWidget { isAntiAlias: true, ), Padding( - padding: const EdgeInsets.all(20.0), - child: Text(appState.appError == "" ? "Loading Cwtch..." : appState.appError, - style: TextStyle( - fontSize: 16.0, color: appState.appError == "" ? Provider.of(context).theme.mainTextColor() : Provider.of(context).theme.textfieldErrorColor())), - ), + padding: const EdgeInsets.all(20.0), + child: Column(children: [ + Padding( + padding: EdgeInsets.all(6.0), + child: Text( + appState.appError != "" + ? appState.appError + : appState.modalState == ModalState.none + ? AppLocalizations.of(context)!.loadingCwtch + : AppLocalizations.of(context)!.storageMigrationModalMessage, + style: TextStyle( + fontSize: 16.0, color: appState.appError == "" ? Provider.of(context).theme.mainTextColor : Provider.of(context).theme.textfieldErrorColor))), + Visibility( + visible: appState.modalState == ModalState.storageMigration, + child: LinearProgressIndicator( + color: Provider.of(context).theme.defaultButtonActiveColor, + )) + ])), Image(image: AssetImage("assets/Open_Privacy_Logo_lightoutline.png")), ])), )); diff --git a/lib/widgets/buttontextfield.dart b/lib/widgets/buttontextfield.dart index cd1cdb09..dddb7840 100644 --- a/lib/widgets/buttontextfield.dart +++ b/lib/widgets/buttontextfield.dart @@ -41,30 +41,30 @@ class _CwtchButtonTextFieldState extends State { enableIMEPersonalizedLearning: false, decoration: InputDecoration( labelText: widget.labelText, - labelStyle: TextStyle(color: theme.current().mainTextColor(), backgroundColor: theme.current().textfieldBackgroundColor()), + labelStyle: TextStyle(color: theme.current().mainTextColor, backgroundColor: theme.current().textfieldBackgroundColor), suffixIcon: IconButton( onPressed: widget.onPressed, icon: widget.icon, padding: EdgeInsets.fromLTRB(0.0, 4.0, 2.0, 2.0), tooltip: widget.tooltip, enableFeedback: true, - color: theme.current().mainTextColor(), - highlightColor: theme.current().defaultButtonColor(), - focusColor: theme.current().defaultButtonActiveColor(), - splashColor: theme.current().defaultButtonActiveColor(), + color: theme.current().mainTextColor, + highlightColor: theme.current().defaultButtonColor, + focusColor: theme.current().defaultButtonActiveColor, + splashColor: theme.current().defaultButtonActiveColor, ), floatingLabelBehavior: FloatingLabelBehavior.never, filled: true, - fillColor: theme.current().textfieldBackgroundColor(), - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor(), width: 3.0)), - focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor(), width: 3.0)), - errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor(), width: 3.0)), + fillColor: theme.current().textfieldBackgroundColor, + focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 3.0)), + focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 3.0)), + errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 3.0)), errorStyle: TextStyle( - color: theme.current().textfieldErrorColor(), + color: theme.current().textfieldErrorColor, fontWeight: FontWeight.bold, ), contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor(), width: 3.0))), + enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 3.0))), ); }); } diff --git a/lib/widgets/contactrow.dart b/lib/widgets/contactrow.dart index 93bbb655..5872dddb 100644 --- a/lib/widgets/contactrow.dart +++ b/lib/widgets/contactrow.dart @@ -23,7 +23,7 @@ class _ContactRowState extends State { var contact = Provider.of(context); return Card( clipBehavior: Clip.antiAlias, - color: Provider.of(context).selectedConversation == contact.onion ? Provider.of(context).theme.backgroundHilightElementColor() : null, + color: Provider.of(context).selectedConversation == contact.identifier ? Provider.of(context).theme.backgroundHilightElementColor : null, borderOnForeground: false, margin: EdgeInsets.all(0.0), child: InkWell( @@ -32,16 +32,16 @@ class _ContactRowState extends State { padding: const EdgeInsets.all(6.0), //border size child: ProfileImage( badgeCount: contact.unreadMessages, - badgeColor: Provider.of(context).theme.portraitContactBadgeColor(), - badgeTextColor: Provider.of(context).theme.portraitContactBadgeTextColor(), + badgeColor: Provider.of(context).theme.portraitContactBadgeColor, + badgeTextColor: Provider.of(context).theme.portraitContactBadgeTextColor, diameter: 64.0, imagePath: contact.imagePath, maskOut: !contact.isOnline(), border: contact.isOnline() - ? Provider.of(context).theme.portraitOnlineBorderColor() + ? Provider.of(context).theme.portraitOnlineBorderColor : contact.isBlocked - ? Provider.of(context).theme.portraitBlockedBorderColor() - : Provider.of(context).theme.portraitOfflineBorderColor()), + ? Provider.of(context).theme.portraitBlockedBorderColor + : Provider.of(context).theme.portraitOfflineBorderColor), ), Expanded( child: Padding( @@ -55,20 +55,20 @@ class _ContactRowState extends State { style: TextStyle( fontSize: Provider.of(context).theme.contactOnionTextSize(), color: contact.isBlocked - ? Provider.of(context).theme.portraitBlockedTextColor() - : Provider.of(context).theme.mainTextColor()), //Provider.of(context).biggerFont, + ? Provider.of(context).theme.portraitBlockedTextColor + : Provider.of(context).theme.mainTextColor), //Provider.of(context).biggerFont, softWrap: true, overflow: TextOverflow.visible, ), Visibility( visible: contact.isGroup && contact.status == "Authenticated", child: LinearProgressIndicator( - color: Provider.of(context).theme.defaultButtonActiveColor(), + color: Provider.of(context).theme.defaultButtonActiveColor, )), Visibility( visible: !Provider.of(context).streamerMode, child: Text(contact.onion, - style: TextStyle(color: contact.isBlocked ? Provider.of(context).theme.portraitBlockedTextColor() : Provider.of(context).theme.mainTextColor())), + style: TextStyle(color: contact.isBlocked ? Provider.of(context).theme.portraitBlockedTextColor : Provider.of(context).theme.mainTextColor)), ) ], ))), @@ -81,7 +81,7 @@ class _ContactRowState extends State { iconSize: 16, icon: Icon( Icons.favorite, - color: Provider.of(context).theme.mainTextColor(), + color: Provider.of(context).theme.mainTextColor, ), tooltip: AppLocalizations.of(context)!.tooltipAcceptContactRequest, onPressed: _btnApprove, @@ -89,7 +89,7 @@ class _ContactRowState extends State { IconButton( padding: EdgeInsets.zero, iconSize: 16, - icon: Icon(Icons.delete, color: Provider.of(context).theme.mainTextColor()), + icon: Icon(Icons.delete, color: Provider.of(context).theme.mainTextColor), tooltip: AppLocalizations.of(context)!.tooltipRejectContactRequest, onPressed: _btnReject, ) @@ -98,7 +98,7 @@ class _ContactRowState extends State { ? IconButton( padding: EdgeInsets.zero, iconSize: 16, - icon: Icon(Icons.block, color: Provider.of(context).theme.mainTextColor()), + icon: Icon(Icons.block, color: Provider.of(context).theme.mainTextColor), onPressed: () {}, ) : Text(dateToNiceString(contact.lastMessageTime))), diff --git a/lib/widgets/cwtchlabel.dart b/lib/widgets/cwtchlabel.dart index b354c778..07ac3874 100644 --- a/lib/widgets/cwtchlabel.dart +++ b/lib/widgets/cwtchlabel.dart @@ -18,7 +18,7 @@ class _CwtchLabelState extends State { return Consumer(builder: (context, theme, child) { return Text( widget.label, - style: TextStyle(fontSize: 20, color: theme.current().mainTextColor()), + style: TextStyle(fontSize: 20, color: theme.current().mainTextColor), ); }); } diff --git a/lib/widgets/filebubble.dart b/lib/widgets/filebubble.dart index e40c6097..6457ae6a 100644 --- a/lib/widgets/filebubble.dart +++ b/lib/widgets/filebubble.dart @@ -88,8 +88,7 @@ class FileBubbleState extends State { var wdgSender = Visibility( visible: widget.interactive, child: SelectableText(senderDisplayStr + '\u202F', - style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()))); - + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor))); var isPreview = false; var wdgMessage = !showFileSharing ? Text(AppLocalizations.of(context)!.messageEnableFileSharing) @@ -98,6 +97,7 @@ class FileBubbleState extends State { : (fileChrome(AppLocalizations.of(context)!.messageFileOffered + ":", widget.nameSuggestion, widget.rootHash, widget.fileSize, Provider.of(context).downloadSpeed(widget.fileKey()))); Widget wdgDecorations; + if (!showFileSharing) { wdgDecorations = Text('\u202F'); } else if (fromMe) { @@ -139,7 +139,7 @@ class FileBubbleState extends State { visible: widget.interactive, child: LinearProgressIndicator( value: Provider.of(context).downloadProgress(widget.fileKey()), - color: Provider.of(context).theme.defaultButtonActiveColor(), + color: Provider.of(context).theme.defaultButtonActiveColor, )); } } else if (flagStarted) { @@ -175,8 +175,8 @@ class FileBubbleState extends State { return Container( constraints: constraints, decoration: BoxDecoration( - color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor(), - border: Border.all(color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor(), width: 1), + color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor, + border: Border.all(color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor, width: 1), borderRadius: BorderRadius.only( topLeft: Radius.circular(borderRadiousEh), topRight: Radius.circular(borderRadiousEh), @@ -248,7 +248,7 @@ class FileBubbleState extends State { SelectableText( chrome + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, ), textAlign: TextAlign.left, maxLines: 2, @@ -257,7 +257,7 @@ class FileBubbleState extends State { SelectableText( fileName + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, fontWeight: FontWeight.bold, overflow: TextOverflow.ellipsis, ), @@ -268,7 +268,7 @@ class FileBubbleState extends State { SelectableText( prettyBytes(fileSize) + '\u202F' + '\n', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, ), textAlign: TextAlign.left, maxLines: 2, @@ -277,7 +277,7 @@ class FileBubbleState extends State { subtitle: SelectableText( 'sha512: ' + rootHash + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, fontSize: 10, fontFamily: "monospace", ), @@ -285,7 +285,7 @@ class FileBubbleState extends State { maxLines: 4, textWidthBasis: TextWidthBasis.parent, ), - leading: Icon(Icons.attach_file, size: 32, color: Provider.of(context).theme.messageFromMeTextColor())); + leading: Icon(Icons.attach_file, size: 32, color: Provider.of(context).theme.messageFromMeTextColor)); } // Construct an file chrome @@ -296,7 +296,7 @@ class FileBubbleState extends State { SelectableText( chrome + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromOtherTextColor(), + color: Provider.of(context).theme.messageFromOtherTextColor, ), textAlign: TextAlign.left, maxLines: 2, @@ -305,7 +305,7 @@ class FileBubbleState extends State { SelectableText( fileName + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromOtherTextColor(), + color: Provider.of(context).theme.messageFromOtherTextColor, fontWeight: FontWeight.bold, overflow: TextOverflow.ellipsis, ), @@ -316,7 +316,7 @@ class FileBubbleState extends State { SelectableText( AppLocalizations.of(context)!.labelFilesize + ': ' + prettyBytes(fileSize) + '\u202F' + '\n', style: TextStyle( - color: Provider.of(context).theme.messageFromOtherTextColor(), + color: Provider.of(context).theme.messageFromOtherTextColor, ), textAlign: TextAlign.left, maxLines: 2, @@ -325,7 +325,7 @@ class FileBubbleState extends State { subtitle: SelectableText( 'sha512: ' + rootHash + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, fontSize: 10, fontFamily: "monospace", ), @@ -333,13 +333,13 @@ class FileBubbleState extends State { maxLines: 4, textWidthBasis: TextWidthBasis.parent, ), - leading: Icon(Icons.attach_file, size: 32, color: Provider.of(context).theme.messageFromOtherTextColor()), + leading: Icon(Icons.attach_file, size: 32, color: Provider.of(context).theme.messageFromOtherTextColor), trailing: Visibility( visible: speed != "0 B/s", child: SelectableText( speed + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, ), textAlign: TextAlign.left, maxLines: 1, diff --git a/lib/widgets/invitationbubble.dart b/lib/widgets/invitationbubble.dart index 483ed833..2839b550 100644 --- a/lib/widgets/invitationbubble.dart +++ b/lib/widgets/invitationbubble.dart @@ -56,7 +56,7 @@ class InvitationBubbleState extends State { var wdgSender = Center( widthFactor: 1, child: SelectableText(senderDisplayStr + '\u202F', - style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()))); + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor))); // If we receive an invite for ourselves, treat it as a bug. The UI no longer allows this so it could have only come from // some kind of malfeasance. @@ -96,9 +96,8 @@ class InvitationBubbleState extends State { widthFactor: 1.0, child: Container( decoration: BoxDecoration( - color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor(), - border: - Border.all(color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor(), width: 1), + color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor, + border: Border.all(color: fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor, width: 1), borderRadius: BorderRadius.only( topLeft: Radius.circular(borderRadiousEh), topRight: Radius.circular(borderRadiousEh), @@ -149,7 +148,7 @@ class InvitationBubbleState extends State { SelectableText( chrome + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, ), textAlign: TextAlign.left, maxLines: 2, @@ -158,7 +157,7 @@ class InvitationBubbleState extends State { SelectableText( targetName + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromMeTextColor(), + color: Provider.of(context).theme.messageFromMeTextColor, ), textAlign: TextAlign.left, maxLines: 2, @@ -173,7 +172,7 @@ class InvitationBubbleState extends State { SelectableText( chrome + '\u202F', style: TextStyle( - color: Provider.of(context).theme.messageFromOtherTextColor(), + color: Provider.of(context).theme.messageFromOtherTextColor, ), textAlign: TextAlign.left, textWidthBasis: TextWidthBasis.longestLine, @@ -181,7 +180,7 @@ class InvitationBubbleState extends State { ), SelectableText( targetName + '\u202F', - style: TextStyle(color: Provider.of(context).theme.messageFromOtherTextColor()), + style: TextStyle(color: Provider.of(context).theme.messageFromOtherTextColor), textAlign: TextAlign.left, maxLines: 2, textWidthBasis: TextWidthBasis.longestLine, diff --git a/lib/widgets/messagebubble.dart b/lib/widgets/messagebubble.dart index f05908ed..469a1b5a 100644 --- a/lib/widgets/messagebubble.dart +++ b/lib/widgets/messagebubble.dart @@ -48,7 +48,7 @@ class MessageBubbleState extends State { } } var wdgSender = SelectableText(senderDisplayStr, - style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor())); + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor)); var wdgMessage; @@ -58,7 +58,7 @@ class MessageBubbleState extends State { //key: Key(myKey), focusNode: _focus, style: TextStyle( - color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor(), + color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor, ), textAlign: TextAlign.left, textWidthBasis: TextWidthBasis.longestLine, @@ -75,10 +75,10 @@ class MessageBubbleState extends State { //key: Key(myKey), focusNode: _focus, style: TextStyle( - color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor(), + color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor, ), linkStyle: TextStyle( - color: Provider.of(context).current().mainTextColor(), + color: Provider.of(context).current().mainTextColor, ), textAlign: TextAlign.left, textWidthBasis: TextWidthBasis.longestLine, @@ -95,13 +95,11 @@ class MessageBubbleState extends State { child: Container( child: Container( decoration: BoxDecoration( - color: error - ? malformedColor - : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor()), + color: error ? malformedColor : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor), border: Border.all( color: error ? malformedColor - : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor()), + : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor), width: 1), borderRadius: BorderRadius.only( topLeft: Radius.circular(borderRadiousEh), diff --git a/lib/widgets/messagebubbledecorations.dart b/lib/widgets/messagebubbledecorations.dart index 22ba1e91..6b740ea9 100644 --- a/lib/widgets/messagebubbledecorations.dart +++ b/lib/widgets/messagebubbledecorations.dart @@ -25,8 +25,7 @@ class _MessageBubbleDecoration extends State { mainAxisSize: MainAxisSize.min, children: [ Text(widget.prettyDate, - style: - TextStyle(fontSize: 9.0, color: widget.fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor()), + style: TextStyle(fontSize: 9.0, color: widget.fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor), textAlign: widget.fromMe ? TextAlign.right : TextAlign.left), !widget.fromMe ? SizedBox(width: 1, height: 1) @@ -35,14 +34,14 @@ class _MessageBubbleDecoration extends State { child: widget.ackd == true ? Tooltip( message: AppLocalizations.of(context)!.acknowledgedLabel, - child: Icon(Icons.check_circle_outline, color: Provider.of(context).theme.messageFromMeTextColor(), size: 16)) + child: Icon(Icons.check_circle_outline, color: Provider.of(context).theme.messageFromMeTextColor, size: 16)) : (widget.errored == true ? Tooltip( message: AppLocalizations.of(context)!.couldNotSendMsgError, - child: Icon(Icons.error_outline, color: Provider.of(context).theme.messageFromMeTextColor(), size: 16)) + child: Icon(Icons.error_outline, color: Provider.of(context).theme.messageFromMeTextColor, size: 16)) : Tooltip( message: AppLocalizations.of(context)!.pendingLabel, - child: Icon(Icons.hourglass_bottom_outlined, color: Provider.of(context).theme.messageFromMeTextColor(), size: 16)))) + child: Icon(Icons.hourglass_bottom_outlined, color: Provider.of(context).theme.messageFromMeTextColor, size: 16)))) ], )); } diff --git a/lib/widgets/messagelist.dart b/lib/widgets/messagelist.dart index 365a75fc..57009768 100644 --- a/lib/widgets/messagelist.dart +++ b/lib/widgets/messagelist.dart @@ -35,65 +35,66 @@ class _MessageListState extends State { return RepaintBoundary( child: Container( + color: Provider.of(context).theme.backgroundMainColor, child: Column(children: [ - Visibility( - visible: showMessageWarning, - child: Container( - padding: EdgeInsets.all(5.0), - color: Provider.of(context).theme.defaultButtonActiveColor(), - child: DefaultTextStyle( - style: TextStyle(color: Provider.of(context).theme.defaultButtonTextColor()), - child: showSyncing - ? Text(AppLocalizations.of(context)!.serverNotSynced, textAlign: TextAlign.center) - : showOfflineWarning - ? Text(Provider.of(context).isGroup ? AppLocalizations.of(context)!.serverConnectivityDisconnected : AppLocalizations.of(context)!.peerOfflineMessage, - textAlign: TextAlign.center) - // Only show the ephemeral status for peer conversations, not for groups... - : (showEphemeralWarning - ? Text(AppLocalizations.of(context)!.chatHistoryDefault, textAlign: TextAlign.center) - : - // We are not allowed to put null here, so put an empty text widget - Text("")), - ))), - Expanded( - child: Container( - // Only show broken heart is the contact is offline... - decoration: BoxDecoration( - image: Provider.of(outerContext).isOnline() - ? null - : DecorationImage( - fit: BoxFit.scaleDown, - alignment: Alignment.center, - image: AssetImage("assets/core/negative_heart_512px.png"), - colorFilter: ColorFilter.mode(Provider.of(context).theme.hilightElementTextColor(), BlendMode.srcIn))), - // Don't load messages for syncing server... - child: loadMessages - ? ScrollablePositionedList.builder( - itemPositionsListener: widget.scrollListener, - itemScrollController: widget.scrollController, - initialScrollIndex: initi > 4 ? initi - 4 : 0, - itemCount: Provider.of(outerContext).totalMessages, - reverse: true, // NOTE: There seems to be a bug in flutter that corrects the mouse wheel scroll, but not the drag direction... - itemBuilder: (itemBuilderContext, index) { - var profileOnion = Provider.of(outerContext, listen: false).onion; - var contactHandle = Provider.of(outerContext, listen: false).identifier; - var messageIndex = index; + Visibility( + visible: showMessageWarning, + child: Container( + padding: EdgeInsets.all(5.0), + color: Provider.of(context).theme.defaultButtonActiveColor, + child: DefaultTextStyle( + style: TextStyle(color: Provider.of(context).theme.defaultButtonTextColor), + child: showSyncing + ? Text(AppLocalizations.of(context)!.serverNotSynced, textAlign: TextAlign.center) + : showOfflineWarning + ? Text(Provider.of(context).isGroup ? AppLocalizations.of(context)!.serverConnectivityDisconnected : AppLocalizations.of(context)!.peerOfflineMessage, + textAlign: TextAlign.center) + // Only show the ephemeral status for peer conversations, not for groups... + : (showEphemeralWarning + ? Text(AppLocalizations.of(context)!.chatHistoryDefault, textAlign: TextAlign.center) + : + // We are not allowed to put null here, so put an empty text widget + Text("")), + ))), + Expanded( + child: Container( + // Only show broken heart is the contact is offline... + decoration: BoxDecoration( + image: Provider.of(outerContext).isOnline() + ? null + : DecorationImage( + fit: BoxFit.scaleDown, + alignment: Alignment.center, + image: AssetImage("assets/core/negative_heart_512px.png"), + colorFilter: ColorFilter.mode(Provider.of(context).theme.hilightElementColor, BlendMode.srcIn))), + // Don't load messages for syncing server... + child: loadMessages + ? ScrollablePositionedList.builder( + itemPositionsListener: widget.scrollListener, + itemScrollController: widget.scrollController, + initialScrollIndex: initi > 4 ? initi - 4 : 0, + itemCount: Provider.of(outerContext).totalMessages, + reverse: true, // NOTE: There seems to be a bug in flutter that corrects the mouse wheel scroll, but not the drag direction... + itemBuilder: (itemBuilderContext, index) { + var profileOnion = Provider.of(outerContext, listen: false).onion; + var contactHandle = Provider.of(outerContext, listen: false).identifier; + var messageIndex = index; - return FutureBuilder( - future: messageHandler(outerContext, profileOnion, contactHandle, messageIndex), - builder: (context, snapshot) { - if (snapshot.hasData) { - var message = snapshot.data as Message; - var key = Provider.of(outerContext, listen: false).getMessageKey(contactHandle, message.getMetadata().messageID); - return message.getWidget(context, key); - } else { - return MessageLoadingBubble(); - } - }, - ); - }, - ) - : null)) - ]))); + return FutureBuilder( + future: messageHandler(outerContext, profileOnion, contactHandle, messageIndex), + builder: (context, snapshot) { + if (snapshot.hasData) { + var message = snapshot.data as Message; + var key = Provider.of(outerContext, listen: false).getMessageKey(contactHandle, message.getMetadata().messageID); + return message.getWidget(context, key); + } else { + return MessageLoadingBubble(); + } + }, + ); + }, + ) + : null)) + ]))); } } diff --git a/lib/widgets/messagerow.dart b/lib/widgets/messagerow.dart index 9941fb52..98f353c2 100644 --- a/lib/widgets/messagerow.dart +++ b/lib/widgets/messagerow.dart @@ -85,7 +85,7 @@ class MessageRowState extends State with SingleTickerProviderStateMi onPressed: () { Provider.of(context, listen: false).selectedIndex = Provider.of(context, listen: false).messageID; }, - icon: Icon(Icons.reply, color: Provider.of(context).theme.dropShadowColor()))); + icon: Icon(Icons.reply, color: Provider.of(context).theme.dropShadowColor))); Widget wdgSpacer = Flexible(child: SizedBox(width: 60, height: 10)); var widgetRow = []; @@ -96,7 +96,7 @@ class MessageRowState extends State with SingleTickerProviderStateMi actualMessage, ]; } else if (isBlocked && !showBlockedMessage) { - Color blockedMessageBackground = Provider.of(context).theme.messageFromOtherBackgroundColor(); + Color blockedMessageBackground = Provider.of(context).theme.messageFromOtherBackgroundColor; Widget wdgPortrait = Padding(padding: EdgeInsets.all(4.0), child: Icon(CwtchIcons.account_blocked)); widgetRow = [ wdgPortrait, @@ -118,7 +118,7 @@ class MessageRowState extends State with SingleTickerProviderStateMi AppLocalizations.of(context)!.blockedMessageMessage, //key: Key(myKey), style: TextStyle( - color: Provider.of(context).theme.messageFromOtherTextColor(), + color: Provider.of(context).theme.messageFromOtherTextColor, ), textAlign: TextAlign.center, textWidthBasis: TextWidthBasis.longestLine, @@ -152,8 +152,9 @@ class MessageRowState extends State with SingleTickerProviderStateMi diameter: 48.0, imagePath: Provider.of(context).senderImage ?? contact.imagePath, //maskOut: contact.status != "Authenticated", - border: contact.status == "Authenticated" ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor(), - badgeTextColor: Colors.red, badgeColor: Colors.red, + border: contact.status == "Authenticated" ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor, + badgeTextColor: Colors.red, + badgeColor: Colors.red, tooltip: isContact ? AppLocalizations.of(context)!.contactGoto.replaceFirst("%1", senderDisplayStr) : AppLocalizations.of(context)!.addContact, ))); @@ -216,8 +217,8 @@ class MessageRowState extends State with SingleTickerProviderStateMi Widget _bubbleNew() { return Container( decoration: BoxDecoration( - color: Provider.of(context).theme.messageFromMeBackgroundColor(), - border: Border.all(color: Provider.of(context).theme.messageFromMeBackgroundColor(), width: 1), + color: Provider.of(context).theme.messageFromMeBackgroundColor, + border: Border.all(color: Provider.of(context).theme.messageFromMeBackgroundColor, width: 1), borderRadius: BorderRadius.only( topLeft: Radius.circular(8), topRight: Radius.circular(8), diff --git a/lib/widgets/passwordfield.dart b/lib/widgets/passwordfield.dart index acd79787..e8cedd9d 100644 --- a/lib/widgets/passwordfield.dart +++ b/lib/widgets/passwordfield.dart @@ -53,21 +53,21 @@ class _CwtchTextFieldState extends State { }, icon: Icon((obscureText ? CwtchIcons.eye_closed : CwtchIcons.eye_open), semanticLabel: label), tooltip: label, - color: theme.current().mainTextColor(), - highlightColor: theme.current().defaultButtonColor(), - focusColor: theme.current().defaultButtonActiveColor(), - splashColor: theme.current().defaultButtonActiveColor(), + color: theme.current().mainTextColor, + highlightColor: theme.current().defaultButtonColor, + focusColor: theme.current().defaultButtonActiveColor, + splashColor: theme.current().defaultButtonActiveColor, ), errorStyle: TextStyle( - color: theme.current().textfieldErrorColor(), + color: theme.current().textfieldErrorColor, fontWeight: FontWeight.bold, ), - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor(), width: 3.0)), - focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor(), width: 3.0)), - errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor(), width: 3.0)), + focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 3.0)), + focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 3.0)), + errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 3.0)), filled: true, - fillColor: theme.current().textfieldBackgroundColor(), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor(), width: 3.0)), + fillColor: theme.current().textfieldBackgroundColor, + enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 3.0)), ), ); }); diff --git a/lib/widgets/profileimage.dart b/lib/widgets/profileimage.dart index 1516f3e0..f790a520 100644 --- a/lib/widgets/profileimage.dart +++ b/lib/widgets/profileimage.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:cwtch/opaque.dart'; +import 'package:cwtch/themes/opaque.dart'; import 'package:provider/provider.dart'; import '../settings.dart'; @@ -28,11 +28,11 @@ class _ProfileImageState extends State { filterQuality: FilterQuality.medium, // We need some theme specific blending here...we might want to consider making this a theme level attribute colorBlendMode: !widget.maskOut - ? Provider.of(context).theme.identifier() == "dark" + ? Provider.of(context).theme.mode == mode_dark ? BlendMode.softLight : BlendMode.darken : BlendMode.srcOut, - color: Provider.of(context).theme.backgroundHilightElementColor(), + color: Provider.of(context).theme.portraitBackgroundColor, isAntiAlias: true, width: widget.diameter, height: widget.diameter, diff --git a/lib/widgets/profilerow.dart b/lib/widgets/profilerow.dart index 4dd4b3c2..3c4c1a55 100644 --- a/lib/widgets/profilerow.dart +++ b/lib/widgets/profilerow.dart @@ -32,11 +32,11 @@ class _ProfileRowState extends State { padding: const EdgeInsets.all(6.0), //border size child: ProfileImage( badgeCount: 0, - badgeColor: Provider.of(context).theme.portraitProfileBadgeColor(), - badgeTextColor: Provider.of(context).theme.portraitProfileBadgeTextColor(), + badgeColor: Provider.of(context).theme.portraitProfileBadgeColor, + badgeTextColor: Provider.of(context).theme.portraitProfileBadgeTextColor, diameter: 64.0, imagePath: profile.imagePath, - border: profile.isOnline ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor())), + border: profile.isOnline ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor)), Expanded( child: Column( children: [ @@ -60,7 +60,7 @@ class _ProfileRowState extends State { IconButton( enableFeedback: true, tooltip: AppLocalizations.of(context)!.editProfile + " " + profile.nickname, - icon: Icon(Icons.create, color: Provider.of(context).current().mainTextColor()), + icon: Icon(Icons.create, color: Provider.of(context).current().mainTextColor), onPressed: () { _pushEditProfile(onion: profile.onion, displayName: profile.nickname, profileImage: profile.imagePath, encrypted: profile.isEncrypted); }, diff --git a/lib/widgets/quotedmessage.dart b/lib/widgets/quotedmessage.dart index 6d1854bc..e2af135e 100644 --- a/lib/widgets/quotedmessage.dart +++ b/lib/widgets/quotedmessage.dart @@ -42,13 +42,13 @@ class QuotedMessageBubbleState extends State { } } var wdgSender = SelectableText(senderDisplayStr, - style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor())); + style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor)); var wdgMessage = SelectableText( widget.body + '\u202F', focusNode: _focus, style: TextStyle( - color: fromMe ? Provider.of(context).theme.messageFromMeTextColor() : Provider.of(context).theme.messageFromOtherTextColor(), + color: fromMe ? Provider.of(context).theme.messageFromMeTextColor : Provider.of(context).theme.messageFromOtherTextColor, ), textAlign: TextAlign.left, textWidthBasis: TextWidthBasis.longestLine, @@ -61,11 +61,11 @@ class QuotedMessageBubbleState extends State { try { var qMessage = (snapshot.data! as Message); // Swap the background color for quoted tweets.. - var qTextColor = fromMe ? Provider.of(context).theme.messageFromOtherTextColor() : Provider.of(context).theme.messageFromMeTextColor(); + var qTextColor = fromMe ? Provider.of(context).theme.messageFromOtherTextColor : Provider.of(context).theme.messageFromMeTextColor; return Container( margin: EdgeInsets.all(5), padding: EdgeInsets.all(5), - color: fromMe ? Provider.of(context).theme.messageFromOtherBackgroundColor() : Provider.of(context).theme.messageFromMeBackgroundColor(), + color: fromMe ? Provider.of(context).theme.messageFromOtherBackgroundColor : Provider.of(context).theme.messageFromMeBackgroundColor, child: Wrap(runAlignment: WrapAlignment.spaceEvenly, alignment: WrapAlignment.spaceEvenly, runSpacing: 1.0, crossAxisAlignment: WrapCrossAlignment.center, children: [ Center(widthFactor: 1, child: Padding(padding: EdgeInsets.all(10.0), child: Icon(Icons.reply, size: 32, color: qTextColor))), Center(widthFactor: 1.0, child: DefaultTextStyle(child: qMessage.getPreviewWidget(context), style: TextStyle(color: qTextColor))) @@ -90,13 +90,11 @@ class QuotedMessageBubbleState extends State { child: Container( child: Container( decoration: BoxDecoration( - color: error - ? malformedColor - : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor()), + color: error ? malformedColor : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor), border: Border.all( color: error ? malformedColor - : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor() : Provider.of(context).theme.messageFromOtherBackgroundColor()), + : (fromMe ? Provider.of(context).theme.messageFromMeBackgroundColor : Provider.of(context).theme.messageFromOtherBackgroundColor), width: 1), borderRadius: BorderRadius.only( topLeft: Radius.circular(borderRadiousEh), diff --git a/lib/widgets/remoteserverrow.dart b/lib/widgets/remoteserverrow.dart index b3c2f356..e7b2417a 100644 --- a/lib/widgets/remoteserverrow.dart +++ b/lib/widgets/remoteserverrow.dart @@ -34,7 +34,7 @@ class _RemoteServerRowState extends State { Padding( padding: const EdgeInsets.all(6.0), //border size child: Icon(CwtchIcons.dns_24px, - color: running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor(), size: 64)), + color: running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor, size: 64)), Expanded( child: Column( children: [ @@ -43,7 +43,7 @@ class _RemoteServerRowState extends State { semanticsLabel: description, style: Provider.of(context) .biggerFont - .apply(color: running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), + .apply(color: running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), softWrap: true, overflow: TextOverflow.ellipsis, ), @@ -54,7 +54,7 @@ class _RemoteServerRowState extends State { server.onion, softWrap: true, overflow: TextOverflow.ellipsis, - style: TextStyle(color: running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), + style: TextStyle(color: running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), ))) ], )), diff --git a/lib/widgets/serverrow.dart b/lib/widgets/serverrow.dart index 65edb974..2c245b51 100644 --- a/lib/widgets/serverrow.dart +++ b/lib/widgets/serverrow.dart @@ -29,7 +29,7 @@ class _ServerRowState extends State { Padding( padding: const EdgeInsets.all(6.0), //border size child: Icon(CwtchIcons.dns_24px, - color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor(), size: 64)), + color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor, size: 64)), Expanded( child: Column( children: [ @@ -38,7 +38,7 @@ class _ServerRowState extends State { semanticsLabel: server.description, style: Provider.of(context) .biggerFont - .apply(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), + .apply(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), softWrap: true, overflow: TextOverflow.ellipsis, ), @@ -49,7 +49,7 @@ class _ServerRowState extends State { server.onion, softWrap: true, overflow: TextOverflow.ellipsis, - style: TextStyle(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), + style: TextStyle(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), ))) ], )), @@ -58,7 +58,7 @@ class _ServerRowState extends State { IconButton( enableFeedback: true, tooltip: AppLocalizations.of(context)!.copyServerKeys, - icon: Icon(CwtchIcons.address_copy_2, color: Provider.of(context).current().mainTextColor()), + icon: Icon(CwtchIcons.address_copy_2, color: Provider.of(context).current().mainTextColor), onPressed: () { Clipboard.setData(new ClipboardData(text: server.serverBundle)); }, @@ -68,7 +68,7 @@ class _ServerRowState extends State { IconButton( enableFeedback: true, tooltip: AppLocalizations.of(context)!.editServerTitle, - icon: Icon(Icons.create, color: Provider.of(context).current().mainTextColor()), + icon: Icon(Icons.create, color: Provider.of(context).current().mainTextColor), onPressed: () { _pushEditServer(server); }, diff --git a/lib/widgets/textfield.dart b/lib/widgets/textfield.dart index 64b4f020..436bea19 100644 --- a/lib/widgets/textfield.dart +++ b/lib/widgets/textfield.dart @@ -7,9 +7,9 @@ doNothing(String x) {} // Provides a styled Text Field for use in Form Widgets. // Callers must provide a text controller, label helper text and a validator. class CwtchTextField extends StatefulWidget { - CwtchTextField({required this.controller, required this.labelText, this.validator, this.autofocus = false, this.onChanged = doNothing}); + CwtchTextField({required this.controller, required this.hintText, this.validator, this.autofocus = false, this.onChanged = doNothing}); final TextEditingController controller; - final String labelText; + final String hintText; final FormFieldValidator? validator; final Function(String) onChanged; final bool autofocus; @@ -42,20 +42,19 @@ class _CwtchTextFieldState extends State { enableIMEPersonalizedLearning: false, focusNode: _focusNode, decoration: InputDecoration( - labelText: widget.labelText, - labelStyle: TextStyle(color: theme.current().mainTextColor(), backgroundColor: theme.current().textfieldBackgroundColor()), + hintText: widget.hintText, floatingLabelBehavior: FloatingLabelBehavior.never, filled: true, - focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor(), width: 3.0)), - focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor(), width: 3.0)), - errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor(), width: 3.0)), + focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 3.0)), + focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 3.0)), + errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 3.0)), errorStyle: TextStyle( - color: theme.current().textfieldErrorColor(), + color: theme.current().textfieldErrorColor, fontWeight: FontWeight.bold, ), - fillColor: theme.current().textfieldBackgroundColor(), + fillColor: theme.current().textfieldBackgroundColor, contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0), - enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor(), width: 3.0))), + enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(15.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 3.0))), ); }); } diff --git a/lib/widgets/tor_icon.dart b/lib/widgets/tor_icon.dart index 796e2a5f..5bdebfa8 100644 --- a/lib/widgets/tor_icon.dart +++ b/lib/widgets/tor_icon.dart @@ -19,7 +19,7 @@ class _TorIconState extends State { return RepaintBoundary( child: Icon( Provider.of(context).progress == 0 ? CwtchIcons.onion_off : (Provider.of(context).progress == 100 ? CwtchIcons.onion_on : CwtchIcons.onion_waiting), - color: Provider.of(context).theme.mainTextColor(), + color: Provider.of(context).theme.mainTextColor, semanticLabel: Provider.of(context).progress == 100 ? AppLocalizations.of(context)!.networkStatusOnline : (Provider.of(context).progress == 0 ? AppLocalizations.of(context)!.networkStatusDisconnected : AppLocalizations.of(context)!.networkStatusAttemptingTor), diff --git a/regenerate_opaque_theme.sh b/regenerate_opaque_theme.sh deleted file mode 100755 index e4ff06d7..00000000 --- a/regenerate_opaque_theme.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -themes="/home/erinn/go/src/git.openprivacy.ca/openprivacy/opaque/theme" -outfile="./lib/opaque.dart" - -if [ -e "$outfile" ]; then - mv "$outfile" "${outfile}.bak" -fi - -echo "// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT BY HAND AS CHANGES WILL BE OVERRIDDEN." > "$outfile" -echo "// TO EDIT THE THEME, SEE https://git.openprivacy.ca/openprivacy/opaque/" >> "$outfile" -echo "// FOR HOW THIS FILE IS GENERATED, SEE ../regenerate_opaque_theme.sh" >> "$outfile" - -sed 's/import QtQuick 2\.0//g' "${themes}/ThemeType.qml" | \ - sed "s/QtObject ./import 'dart:ui\';\nimport 'dart:core';\nabstract class OpaqueThemeType {\n static final Color red = Color(0xFFFF0000);/g" | \ - sed 's/\(property color\|var\)/Color/g' | \ - sed 's/\(:\| =\) ".*"/(){return red;}/g' >> "$outfile" - -echo -e "\n\n" >> "$outfile" - -sed 's/ThemeType/class CwtchDark extends OpaqueThemeType/g' "${themes}/CwtchDark.qml" | \ - sed 's/readonly property color \(.*\): "#\(\w*\)"/static final Color \1 = Color(0xFF\2);/g' | \ - sed 's/\(\w*\): \(\w*\)/Color \1() { return \2; }/g' >> "$outfile" - -echo -e "\n\n" >> "$outfile" - -sed 's/ThemeType/class CwtchLight extends OpaqueThemeType/g' "${themes}/CwtchLight.qml" | \ - sed 's/readonly property color \(.*\): "#\(\w*\)"/static final Color \1 = Color(0xFF\2);/g' | \ - sed 's/\(\w*\): \(\w*\)/Color \1() { return \2; }/g' >> "$outfile" - -echo -e "\n\n" >> "$outfile" - -sed 's/\(pragma Singleton\|import QtQuick 2\.0\)//g' "${themes}/Theme.qml" | \ - sed 's|//.*$||g' | \ - sed 's/theme\./current./g' | \ - sed 's/property color/property Color/g' | \ - sed 's/readonly property Color \(.*\): \([a-zA-Z0-9._]*\)/Color \1() { return \2(); }/g' | \ - #to preserve int values: #static int \1() { return \2; }/g' | \ - sed 's/readonly property int \(.*\): \(.*\)/int \1() { return \2; }/g' | \ - sed 's/readonly property variant \([a-zA-Z0-9._]*\): \(.*\)$/var \1 = \2;/g' | \ - sed 's/color/Color/g' | \ - sed 's/: \(.+\)/ = \1;/g' | \ - sed 's/property ThemeType \(\w*\): \(.*\)../static final OpaqueThemeType \1 = \2();/g' | \ - sed 's/final OpaqueThemeType theme = .*$/Opaque current() { return dark; }/' | \ - sed 's/^.*themeScaleNew.*$/int scale = 2;\n static final String gcdOS = "linux";/g' | \ - sed 's/gcd.os/gcdOS/g' | \ - sed 's/return \([a-zA-Z]\+\) ;/return \1();/g' | \ - sed 's/return \([a-zA-Z]\+\) + \([a-zA-Z]\+\);/return \1() + \2();/g' | \ - sed 's/Item/class Opaque extends OpaqueThemeType/' | \ - sed 's/current\./current()./g' >> "$outfile" diff --git a/test/buttontextfield_test.dart b/test/buttontextfield_test.dart index 2f750035..95c2d65a 100644 --- a/test/buttontextfield_test.dart +++ b/test/buttontextfield_test.dart @@ -5,8 +5,9 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:cwtch/themes/cwtch.dart'; import 'package:flutter/material.dart'; -import 'package:cwtch/opaque.dart'; +import 'package:cwtch/themes/opaque.dart'; import 'package:cwtch/settings.dart'; import 'package:cwtch/widgets/buttontextfield.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -14,8 +15,8 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -var settingsEnglishDark = Settings(Locale("en", ''), OpaqueDark()); -var settingsEnglishLight = Settings(Locale("en", ''), OpaqueLight()); +var settingsEnglishDark = Settings(Locale("en", ''), CwtchDark()); +var settingsEnglishLight = Settings(Locale("en", ''), CwtchLight()); ChangeNotifierProvider getSettingsEnglishDark() => ChangeNotifierProvider.value(value: settingsEnglishDark); void main() { diff --git a/test/cwtchlabel_test.dart b/test/cwtchlabel_test.dart index d0d077a1..63ad75b7 100644 --- a/test/cwtchlabel_test.dart +++ b/test/cwtchlabel_test.dart @@ -5,8 +5,9 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:cwtch/themes/cwtch.dart'; import 'package:flutter/material.dart'; -import 'package:cwtch/opaque.dart'; +import 'package:cwtch/themes/opaque.dart'; import 'package:cwtch/settings.dart'; import 'package:cwtch/widgets/cwtchlabel.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -14,8 +15,8 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -var settingsEnglishDark = Settings(Locale("en", ''), OpaqueDark()); -var settingsEnglishLight = Settings(Locale("en", ''), OpaqueLight()); +var settingsEnglishDark = Settings(Locale("en", ''), CwtchDark()); +var settingsEnglishLight = Settings(Locale("en", ''), CwtchLight()); ChangeNotifierProvider getSettingsEnglishDark() => ChangeNotifierProvider.value(value: settingsEnglishDark); void main() { diff --git a/test/profileimage_test.dart b/test/profileimage_test.dart index 9a841f9b..239aa5aa 100644 --- a/test/profileimage_test.dart +++ b/test/profileimage_test.dart @@ -5,8 +5,9 @@ // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. +import 'package:cwtch/themes/cwtch.dart'; import 'package:flutter/material.dart'; -import 'package:cwtch/opaque.dart'; +import 'package:cwtch/themes/opaque.dart'; import 'package:cwtch/settings.dart'; import 'package:cwtch/widgets/profileimage.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -14,8 +15,8 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -var settingsEnglishDark = Settings(Locale("en", ''), OpaqueDark()); -var settingsEnglishLight = Settings(Locale("en", ''), OpaqueLight()); +var settingsEnglishDark = Settings(Locale("en", ''), CwtchDark()); +var settingsEnglishLight = Settings(Locale("en", ''), CwtchLight()); ChangeNotifierProvider getSettingsEnglishDark() => ChangeNotifierProvider.value(value: settingsEnglishDark); String file(String slug) { @@ -33,10 +34,10 @@ void main() { Widget testWidget = ProfileImage( imagePath: "profiles/001-centaur.png", - badgeTextColor: settingsEnglishDark.theme.portraitProfileBadgeTextColor(), - badgeColor: settingsEnglishDark.theme.portraitProfileBadgeColor(), + badgeTextColor: settingsEnglishDark.theme.portraitProfileBadgeTextColor, + badgeColor: settingsEnglishDark.theme.portraitProfileBadgeColor, maskOut: false, - border: settingsEnglishDark.theme.portraitOfflineBorderColor(), + border: settingsEnglishDark.theme.portraitOfflineBorderColor, diameter: 64.0, badgeCount: 10, ); diff --git a/test/textfield_basic.png b/test/textfield_basic.png index 693afb1c..b17efd07 100644 Binary files a/test/textfield_basic.png and b/test/textfield_basic.png differ diff --git a/test/textfield_form_42.png b/test/textfield_form_42.png index 3d925698..abb2c137 100644 Binary files a/test/textfield_form_42.png and b/test/textfield_form_42.png differ diff --git a/test/textfield_form_alpha.png b/test/textfield_form_alpha.png index ef0f1d8c..531bb36a 100644 Binary files a/test/textfield_form_alpha.png and b/test/textfield_form_alpha.png differ diff --git a/test/textfield_form_final.png b/test/textfield_form_final.png index 2ad30d6e..d9087d17 100644 Binary files a/test/textfield_form_final.png and b/test/textfield_form_final.png differ diff --git a/test/textfield_form_init.png b/test/textfield_form_init.png index ed39bf8b..5c23672c 100644 Binary files a/test/textfield_form_init.png and b/test/textfield_form_init.png differ diff --git a/test/textfield_test.dart b/test/textfield_test.dart index 9a0f0525..27ea0f3e 100644 --- a/test/textfield_test.dart +++ b/test/textfield_test.dart @@ -6,7 +6,8 @@ // tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart'; -import 'package:cwtch/opaque.dart'; +import 'package:cwtch/themes/opaque.dart'; +import 'package:cwtch/themes/cwtch.dart'; import 'package:cwtch/settings.dart'; import 'package:cwtch/widgets/textfield.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -14,8 +15,8 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -var settingsEnglishDark = Settings(Locale("en", ''), OpaqueDark()); -var settingsEnglishLight = Settings(Locale("en", ''), OpaqueLight()); +var settingsEnglishDark = Settings(Locale("en", ''), CwtchDark()); +var settingsEnglishLight = Settings(Locale("en", ''), CwtchLight()); ChangeNotifierProvider getSettingsEnglishDark() => ChangeNotifierProvider.value(value: settingsEnglishDark); String file(String slug) { @@ -27,7 +28,7 @@ void main() { tester.binding.window.physicalSizeTestValue = Size(800, 300); final TextEditingController ctrlr1 = TextEditingController(); - Widget testWidget = CwtchTextField(controller: ctrlr1, validator: (value) { }, labelText: '',); + Widget testWidget = CwtchTextField(controller: ctrlr1, validator: (value) { }, hintText: '',); Widget testHarness = MultiProvider( providers:[getSettingsEnglishDark()], @@ -69,7 +70,7 @@ void main() { Widget testWidget = CwtchTextField( controller: ctrlr1, - labelText: strLabel1, + hintText: strLabel1, validator: (value) { if (value == null || value == "") return strFail1; final number = num.tryParse(value); diff --git a/windows/nsis/cwtch-installer.nsi b/windows/nsis/cwtch-installer.nsi index 75a59515..a63ee737 100644 --- a/windows/nsis/cwtch-installer.nsi +++ b/windows/nsis/cwtch-installer.nsi @@ -65,6 +65,11 @@ ShowInstDetails show !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + ; Languages -------------------------------- !insertmacro MUI_LANGUAGE "English" @@ -81,12 +86,20 @@ Section FILE /r "..\..\build\windows\runner\Release\" #FILESLISTEND + CreateDirectory "$SMPROGRAMS\Cwtch" # create a shortcut in the start menu programs directory - CreateDirectory "$SMPROGRAMS\Cwtch" CreateShortcut "$SMPROGRAMS\Cwtch\Cwtch.lnk" "$INSTDIR\cwtch.exe" "" "$INSTDIR\cwtch.ico" ;Store installation folder WriteRegStr HKCU "Software\Cwtch" "installLocation" $INSTDIR + WriteUninstaller "$INSTDIR\uninstall.exe" + SectionEnd + +Section "Uninstall" + RMDir /r /REBOOTOK "$INSTDIR" + + DeleteRegKey /ifempty HKCU "Software\Cwtch\installLocation" +SectionEnd \ No newline at end of file