diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 71936b39..3c7bdb25 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1,6 +1,19 @@ { "@@locale": "de", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index f1546402..42b7fca9 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1,6 +1,19 @@ { "@@locale": "en", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index ce52d391..809b2d91 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1,6 +1,19 @@ { "@@locale": "es", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 5f4b6fc2..8140da2c 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1,6 +1,19 @@ { "@@locale": "fr", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverMetricsLabel": "Métriques du serveur", diff --git a/lib/l10n/intl_it.arb b/lib/l10n/intl_it.arb index ece23e55..e30cfb70 100644 --- a/lib/l10n/intl_it.arb +++ b/lib/l10n/intl_it.arb @@ -1,6 +1,19 @@ { "@@locale": "it", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index a5d18aa7..78708ee7 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1,6 +1,19 @@ { "@@locale": "pl", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/l10n/intl_pt.arb b/lib/l10n/intl_pt.arb index f41f5a06..a548ca3a 100644 --- a/lib/l10n/intl_pt.arb +++ b/lib/l10n/intl_pt.arb @@ -1,6 +1,19 @@ { "@@locale": "pt", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index d4137344..8751074d 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1,6 +1,19 @@ { "@@locale": "ru", - "@@last_modified": "2021-12-13T23:43:26+01:00", + "@@last_modified": "2021-12-15T20:46:48+01:00", + "themeColorLabel": "Color Theme", + "themeNameNeon2": "Neon2", + "themeNameNeon1": "Neon1", + "themeNameMidnight": "Midnight", + "themeNameMermaid": "Mermaid", + "themeNamePumpkin": "Pumpkin", + "themeNameGhost": "Ghost", + "themeNameVampire": "Vampire", + "themeNameWitch": "Witch", + "themeNameCwtch": "Cwtch", + "settingDownloadFolder": "Download Folder", + "settingImagePreviewsDescription": "Images will be downloaded and previewed automatically. Please note that image previews can often lead to security vulnerabilities, and you should not enable this Experiment if you use Cwtch with untrusted contacts. Profile pictures are planned for Cwtch 1.6.", + "settingImagePreviews": "Image Previews and Profile Pictures", "experimentClickableLinksDescription": "The clickable links experiment allows you to click on URLs shared in messages", "enableExperimentClickableLinks": "Enable Clickable Links", "serverConnectionsLabel": "Connection", diff --git a/lib/main.dart b/lib/main.dart index 9ab2ad4b..3c3f27bd 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(); 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 82246ee0..2106895b 100644 --- a/lib/model.dart +++ b/lib/model.dart @@ -282,8 +282,6 @@ class ProfileInfoState extends ChangeNotifier { this._contacts.updateLastMessageTime(this._contacts._contacts.first.identifier, this._contacts._contacts.first.lastMessageTime); } } - - } // Parse out the server list json into our server info state struct... diff --git a/lib/models/profileservers.dart b/lib/models/profileservers.dart index 5f422538..4b868b95 100644 --- a/lib/models/profileservers.dart +++ b/lib/models/profileservers.dart @@ -35,7 +35,7 @@ class ProfileServerListState extends ChangeNotifier { // online v offline if (a.status == "Synced" && b.status != "Synced") { return -1; - } else if (a.status != "Synced" && b.status == "Synced") { + } else if (a.status != "Synced" && b.status == "Synced") { return 1; } @@ -73,7 +73,7 @@ class RemoteServerInfoState extends ChangeNotifier { List _groups = []; RemoteServerInfoState({required this.onion, required this.identifier, required this.description, required this.status}); - + void updateDescription(String newDescription) { this.description = newDescription; 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 7397ce39..f961af89 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"; @@ -36,15 +37,8 @@ class Settings extends ChangeNotifier { bool blockUnknownConnections = false; bool streamerMode = false; - /// 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(); } @@ -69,11 +63,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"])); @@ -229,11 +219,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/views/addcontactview.dart b/lib/views/addcontactview.dart index 8485058f..c073f0f5 100644 --- a/lib/views/addcontactview.dart +++ b/lib/views/addcontactview.dart @@ -163,7 +163,7 @@ class _AddContactViewState extends State { } }); }, - labelText: '', + hintText: '', ) ]))); } @@ -215,7 +215,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 03084ca2..95706b92 100644 --- a/lib/views/addeditprofileview.dart +++ b/lib/views/addeditprofileview.dart @@ -16,7 +16,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 { @@ -91,7 +91,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, ) @@ -104,10 +104,10 @@ 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; + return AppLocalizations.of(context)!.displayNameTooltip; } return null; }, @@ -145,13 +145,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 aec67bfe..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() { @@ -87,10 +86,10 @@ class _AddEditServerViewState extends State { // Onion Visibility( visible: serverInfoState.onion.isNotEmpty, - child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - CwtchLabel(label: AppLocalizations.of(context)!.serverAddress), - 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: [ @@ -104,7 +103,7 @@ class _AddEditServerViewState extends State { ), CwtchTextField( controller: ctrlrDesc, - labelText: AppLocalizations.of(context)!.fieldDescriptionLabel, + hintText: AppLocalizations.of(context)!.fieldDescriptionLabel, autofocus: false, ) ]), @@ -117,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) { @@ -128,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) { @@ -145,9 +144,9 @@ 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 @@ -158,25 +157,18 @@ class _AddEditServerViewState extends State { 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()) - ]), - - + 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 ***** @@ -190,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 e6e13c19..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), ), @@ -117,7 +117,7 @@ class _ContactsViewState extends State { 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, + tooltip: AppLocalizations.of(context)!.manageKnownServersButton, onPressed: () { _pushServers(); })); @@ -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 22d02dfc..e6887350 100644 --- a/lib/views/globalsettingsview.dart +++ b/lib/views/globalsettingsview.dart @@ -2,6 +2,16 @@ import 'dart:convert'; import 'dart:io'; import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:cwtch/models/servers.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'; @@ -36,7 +46,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( @@ -47,8 +57,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) { @@ -64,25 +74,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) { @@ -100,9 +128,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( @@ -122,7 +150,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) { @@ -135,12 +163,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) { @@ -148,12 +176,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) { @@ -165,16 +193,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) { @@ -186,14 +214,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) { @@ -206,12 +234,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) { @@ -222,12 +250,12 @@ 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), ), 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) { @@ -238,9 +266,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.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.link, color: settings.current().mainTextColor), ), ], )), @@ -251,8 +279,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)), ) ]), @@ -300,6 +328,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 539bebfb..8b803daf 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -104,6 +104,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), @@ -120,7 +121,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, ), @@ -225,7 +226,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, @@ -233,7 +234,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, @@ -253,12 +254,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, ))), )))), @@ -278,8 +279,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( @@ -313,7 +314,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 7ac06520..1fd029b4 100644 --- a/lib/views/profileserversview.dart +++ b/lib/views/profileserversview.dart @@ -10,14 +10,12 @@ import '../main.dart'; import '../model.dart'; import '../settings.dart'; - class ProfileServersView extends StatefulWidget { @override _ProfileServersView createState() => _ProfileServersView(); } class _ProfileServersView extends State { - @override void dispose() { super.dispose(); @@ -25,9 +23,10 @@ class _ProfileServersView extends State { @override Widget build(BuildContext context) { - - var knownServers = Provider.of(context).serverList.servers.map((RemoteServerInfoState remoteServer) { return remoteServer.onion + ".onion"; }).toSet(); - var importServerList = Provider.of(context).servers.where((server) => !knownServers.contains(server.onion) ).map>((ServerInfoState serverInfo) { + var knownServers = Provider.of(context).serverList.servers.map((RemoteServerInfoState remoteServer) { + return remoteServer.onion + ".onion"; + }).toSet(); + var importServerList = Provider.of(context).servers.where((server) => !knownServers.contains(server.onion)).map>((ServerInfoState serverInfo) { return DropdownMenuItem( value: serverInfo.onion, child: Text( @@ -37,25 +36,22 @@ class _ProfileServersView extends State { ); }).toList(); - importServerList.insert(0, DropdownMenuItem( - value: "", - child: Text(AppLocalizations.of(context)!.importLocalServerSelectText))); + importServerList.insert(0, DropdownMenuItem(value: "", child: Text(AppLocalizations.of(context)!.importLocalServerSelectText))); return Scaffold( appBar: AppBar( - title: Text(MediaQuery - .of(context) - .size - .width > 600 ? AppLocalizations.of(context)!.manageKnownServersLong : AppLocalizations.of(context)!.manageKnownServersShort), + title: Text(MediaQuery.of(context).size.width > 600 ? AppLocalizations.of(context)!.manageKnownServersLong : AppLocalizations.of(context)!.manageKnownServersShort), ), - body: Consumer(builder: (context, profile, child) { + body: Consumer( + builder: (context, profile, child) { ProfileServerListState servers = profile.serverList; - final tiles = servers.servers.map((RemoteServerInfoState server) { - return ChangeNotifierProvider.value( - value: server, - builder: (context, child) => RepaintBoundary(child: RemoteServerRow()), - ); - }, + final tiles = servers.servers.map( + (RemoteServerInfoState server) { + return ChangeNotifierProvider.value( + value: server, + builder: (context, child) => RepaintBoundary(child: RemoteServerRow()), + ); + }, ); final divided = ListTile.divideTiles( @@ -63,37 +59,31 @@ class _ProfileServersView extends State { tiles: tiles, ).toList(); - final importCard = Card( child: ListTile( - title: Text(AppLocalizations.of(context)!.importLocalServerLabel), - leading: Icon(CwtchIcons.add_circle_24px , color: Provider.of(context).current().mainTextColor()), - trailing: DropdownButton( - onChanged: (String? importServer) { - if (importServer!.isNotEmpty) { - var server = Provider.of(context).getServer(importServer)!; - showImportConfirm(context, profile.onion, server.onion, server.description, server.serverBundle); - } - - }, - value: "", - items: importServerList, - - ))); + final importCard = Card( + child: ListTile( + title: Text(AppLocalizations.of(context)!.importLocalServerLabel), + leading: Icon(CwtchIcons.add_circle_24px, color: Provider.of(context).current().mainTextColor), + trailing: DropdownButton( + onChanged: (String? importServer) { + if (importServer!.isNotEmpty) { + var server = Provider.of(context).getServer(importServer)!; + showImportConfirm(context, profile.onion, server.onion, server.description, server.serverBundle); + } + }, + value: "", + items: importServerList, + ))); return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { - return Scrollbar( - isAlwaysShown: true, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - child: - Container( - margin: EdgeInsets.fromLTRB(5, 0, 5, 10), - padding: EdgeInsets.fromLTRB(5, 0, 5, 10), - child: Column(children: [ - - if (importServerList.length > 1) importCard, - - Column( children: divided ) - ]))));}); + return Scrollbar( + isAlwaysShown: true, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, + child: Container( + margin: EdgeInsets.fromLTRB(5, 0, 5, 10), + padding: EdgeInsets.fromLTRB(5, 0, 5, 10), + child: Column(children: [if (importServerList.length > 1) importCard, Column(children: divided)])))); + }); return ListView(children: divided); }, @@ -102,7 +92,7 @@ class _ProfileServersView extends State { showImportConfirm(BuildContext context, String profileHandle, String serverHandle, String serverDesc, String bundle) { var serverLabel = serverDesc.isNotEmpty ? serverDesc : serverHandle; - serverHandle = serverHandle.substring(0, serverHandle.length-6 ); // remove '.onion' + serverHandle = serverHandle.substring(0, serverHandle.length - 6); // remove '.onion' // set up the buttons Widget cancelButton = ElevatedButton( child: Text(AppLocalizations.of(context)!.cancel), @@ -118,15 +108,9 @@ class _ProfileServersView extends State { Future.delayed(const Duration(milliseconds: 500), () { var profile = Provider.of(context); if (profile.serverList.getServer(serverHandle) != null) { - profile.serverList.getServer(serverHandle)?.updateDescription( - serverDesc); + profile.serverList.getServer(serverHandle)?.updateDescription(serverDesc); - Provider - .of(context, listen: false) - .cwtch - .SetConversationAttribute(profile.onion, profile.serverList - .getServer(serverHandle) - !.identifier, "server.description", serverDesc); + Provider.of(context, listen: false).cwtch.SetConversationAttribute(profile.onion, profile.serverList.getServer(serverHandle)!.identifier, "server.description", serverDesc); } }); Navigator.of(context).pop(); @@ -149,7 +133,4 @@ class _ProfileServersView extends State { }, ); } - - - -} \ No newline at end of file +} diff --git a/lib/views/remoteserverview.dart b/lib/views/remoteserverview.dart index bc940807..18bcdd04 100644 --- a/lib/views/remoteserverview.dart +++ b/lib/views/remoteserverview.dart @@ -50,63 +50,62 @@ class _RemoteServerViewState extends State { Widget build(BuildContext context) { return Consumer3(builder: (context, profile, serverInfoState, settings, child) { return Scaffold( - appBar: AppBar( - title: Text(ctrlrDesc.text.isNotEmpty ? ctrlrDesc.text : serverInfoState.onion) - ), - body: Container( - margin: EdgeInsets.fromLTRB(30, 0, 30, 10), - padding: EdgeInsets.fromLTRB(20, 0, 20, 10), - child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox( - height: 20, - ), - CwtchLabel(label: AppLocalizations.of(context)!.serverAddress), - SizedBox( - height: 20, - ), - SelectableText( - serverInfoState.onion - ), + appBar: AppBar(title: Text(ctrlrDesc.text.isNotEmpty ? ctrlrDesc.text : serverInfoState.onion)), + body: Container( + margin: EdgeInsets.fromLTRB(30, 0, 30, 10), + padding: EdgeInsets.fromLTRB(20, 0, 20, 10), + child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox( + height: 20, + ), + CwtchLabel(label: AppLocalizations.of(context)!.serverAddress), + SizedBox( + height: 20, + ), + SelectableText(serverInfoState.onion), - // Description - SizedBox( - height: 20, - ), - CwtchLabel(label: AppLocalizations.of(context)!.serverDescriptionLabel), - Text(AppLocalizations.of(context)!.serverDescriptionDescription), - SizedBox( - height: 20, - ), - CwtchButtonTextField( - controller: ctrlrDesc, - readonly: false, - tooltip: AppLocalizations.of(context)!.saveBtn, - labelText: AppLocalizations.of(context)!.fieldDescriptionLabel, - icon: Icon(Icons.save), - onPressed: () { - Provider.of(context, listen: false).cwtch.SetConversationAttribute(profile.onion, serverInfoState.identifier, "server.description", ctrlrDesc.text); - serverInfoState.updateDescription(ctrlrDesc.text); - }, - ), + // Description + SizedBox( + height: 20, + ), + CwtchLabel(label: AppLocalizations.of(context)!.serverDescriptionLabel), + Text(AppLocalizations.of(context)!.serverDescriptionDescription), + SizedBox( + height: 20, + ), + CwtchButtonTextField( + controller: ctrlrDesc, + readonly: false, + tooltip: AppLocalizations.of(context)!.saveBtn, + labelText: AppLocalizations.of(context)!.fieldDescriptionLabel, + icon: Icon(Icons.save), + onPressed: () { + Provider.of(context, listen: false).cwtch.SetConversationAttribute(profile.onion, serverInfoState.identifier, "server.description", ctrlrDesc.text); + serverInfoState.updateDescription(ctrlrDesc.text); + }, + ), - SizedBox( - height: 20, - ), + SizedBox( + height: 20, + ), - Padding(padding: EdgeInsets.all(8), child: Text( AppLocalizations.of(context)!.groupsOnThisServerLabel),), - Expanded(child: _buildGroupsList(serverInfoState)) - ]))); - - }); + Padding( + padding: EdgeInsets.all(8), + child: Text(AppLocalizations.of(context)!.groupsOnThisServerLabel), + ), + Expanded(child: _buildGroupsList(serverInfoState)) + ]))); + }); } Widget _buildGroupsList(RemoteServerInfoState serverInfoState) { - final tiles = serverInfoState.groups.map((ContactInfoState group) { - return ChangeNotifierProvider.value( - value: group, - builder: (context, child) => RepaintBoundary(child: _buildGroupRow(group)), // ServerRow()), - ); - }, + final tiles = serverInfoState.groups.map( + (ContactInfoState group) { + return ChangeNotifierProvider.value( + value: group, + builder: (context, child) => RepaintBoundary(child: _buildGroupRow(group)), // ServerRow()), + ); + }, ); final divided = ListTile.divideTiles( @@ -126,26 +125,22 @@ class _RemoteServerViewState extends State { Widget _buildGroupRow(ContactInfoState group) { return Padding( padding: const EdgeInsets.all(6.0), //border size - child: Column( - children: [ - Text( - group.nickname, - style: Provider.of(context).biggerFont.apply(color: Provider.of(context).theme.portraitOnlineBorderColor()), - softWrap: true, - overflow: TextOverflow.ellipsis, - ), - Visibility( - visible: !Provider.of(context).streamerMode, - child: ExcludeSemantics( - child: Text( - group.onion, - softWrap: true, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: Provider.of(context).theme.portraitOnlineBorderColor()), - ))) - ]) - ); + child: Column(children: [ + Text( + group.nickname, + style: Provider.of(context).biggerFont.apply(color: Provider.of(context).theme.portraitOnlineBorderColor), + softWrap: true, + overflow: TextOverflow.ellipsis, + ), + Visibility( + visible: !Provider.of(context).streamerMode, + child: ExcludeSemantics( + child: Text( + group.onion, + softWrap: true, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: Provider.of(context).theme.portraitOnlineBorderColor), + ))) + ])); } - } - diff --git a/lib/views/serversview.dart b/lib/views/serversview.dart index 148d1daf..5e943b43 100644 --- a/lib/views/serversview.dart +++ b/lib/views/serversview.dart @@ -77,7 +77,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..33eb9097 100644 --- a/lib/views/splashView.dart +++ b/lib/views/splashView.dart @@ -27,8 +27,7 @@ class SplashView extends StatelessWidget { 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())), + style: TextStyle(fontSize: 16.0, color: appState.appError == "" ? Provider.of(context).theme.mainTextColor : Provider.of(context).theme.textfieldErrorColor)), ), 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 ea26052a..fd49e9fe 100644 --- a/lib/widgets/filebubble.dart +++ b/lib/widgets/filebubble.dart @@ -61,7 +61,7 @@ class FileBubbleState 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))); var wdgMessage = !showFileSharing ? Text(AppLocalizations.of(context)!.messageEnableFileSharing) @@ -84,7 +84,7 @@ class FileBubbleState extends State { } else { wdgDecorations = LinearProgressIndicator( value: Provider.of(context).downloadProgress(widget.fileKey()), - color: Provider.of(context).theme.defaultButtonActiveColor(), + color: Provider.of(context).theme.defaultButtonActiveColor, ); } } else if (flagStarted) { @@ -114,9 +114,8 @@ class FileBubbleState 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), @@ -196,7 +195,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, @@ -205,7 +204,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, ), @@ -216,7 +215,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, @@ -225,7 +224,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", ), @@ -233,7 +232,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 @@ -244,7 +243,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, @@ -253,7 +252,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, ), @@ -264,7 +263,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, @@ -273,7 +272,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", ), @@ -281,13 +280,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 39bce219..a5d9e418 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 339a170d..e7b2417a 100644 --- a/lib/widgets/remoteserverrow.dart +++ b/lib/widgets/remoteserverrow.dart @@ -23,46 +23,42 @@ class _RemoteServerRowState extends State { @override Widget build(BuildContext context) { var server = Provider.of(context); - var description = server.description.isNotEmpty ? server.description : server.onion; + var description = server.description.isNotEmpty ? server.description : server.onion; var running = server.status == "Synced"; - return Consumer( - builder: (context, profile, child) { - return Card(clipBehavior: Clip.antiAlias, + return Consumer(builder: (context, profile, child) { + return Card( + clipBehavior: Clip.antiAlias, margin: EdgeInsets.all(0.0), child: InkWell( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + 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)), + Expanded( + child: Column( children: [ - 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) - + Text( + description, + semanticsLabel: description, + style: Provider.of(context) + .biggerFont + .apply(color: running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), + softWrap: true, + overflow: TextOverflow.ellipsis, ), - Expanded( - child: Column( - children: [ - Text( - description, - semanticsLabel: description, - style: Provider.of(context).biggerFont.apply(color: running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), - softWrap: true, - overflow: TextOverflow.ellipsis, - ), - Visibility( - visible: !Provider.of(context).streamerMode, - child: ExcludeSemantics( - child: Text( - server.onion, - softWrap: true, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), - ))) - ], - )), - - ]), + Visibility( + visible: !Provider.of(context).streamerMode, + child: ExcludeSemantics( + child: Text( + server.onion, + softWrap: true, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), + ))) + ], + )), + ]), onTap: () { Navigator.of(context).push(MaterialPageRoute( settings: RouteSettings(name: "remoteserverview"), @@ -72,7 +68,7 @@ class _RemoteServerRowState extends State { child: RemoteServerView(), ); })); - } - ));}); - } + })); + }); + } } diff --git a/lib/widgets/serverrow.dart b/lib/widgets/serverrow.dart index a4e8bb05..2c245b51 100644 --- a/lib/widgets/serverrow.dart +++ b/lib/widgets/serverrow.dart @@ -26,58 +26,57 @@ class _ServerRowState extends State { margin: EdgeInsets.all(0.0), child: InkWell( child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - 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)), - Expanded( - child: Column( - children: [ - Text( - server.description, - semanticsLabel: server.description, - style: Provider.of(context) - .biggerFont - .apply(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), - softWrap: true, - overflow: TextOverflow.ellipsis, - ), - Visibility( - visible: !Provider.of(context).streamerMode, - child: ExcludeSemantics( - child: Text( - server.onion, + 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)), + Expanded( + child: Column( + children: [ + Text( + server.description, + semanticsLabel: server.description, + style: Provider.of(context) + .biggerFont + .apply(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), softWrap: true, overflow: TextOverflow.ellipsis, - style: TextStyle(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor() : Provider.of(context).theme.portraitOfflineBorderColor()), - ))) - ], - )), + ), + Visibility( + visible: !Provider.of(context).streamerMode, + child: ExcludeSemantics( + child: Text( + server.onion, + softWrap: true, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: server.running ? Provider.of(context).theme.portraitOnlineBorderColor : Provider.of(context).theme.portraitOfflineBorderColor), + ))) + ], + )), - // Copy server button - IconButton( - enableFeedback: true, - tooltip: AppLocalizations.of(context)!.copyServerKeys, - icon: Icon(CwtchIcons.address_copy_2, color: Provider.of(context).current().mainTextColor()), - onPressed: () { - Clipboard.setData(new ClipboardData(text: server.serverBundle)); - }, - ), + // Copy server button + IconButton( + enableFeedback: true, + tooltip: AppLocalizations.of(context)!.copyServerKeys, + icon: Icon(CwtchIcons.address_copy_2, color: Provider.of(context).current().mainTextColor), + onPressed: () { + Clipboard.setData(new ClipboardData(text: server.serverBundle)); + }, + ), - // Edit button - IconButton( - enableFeedback: true, - tooltip: AppLocalizations.of(context)!.editServerTitle, - icon: Icon(Icons.create, color: Provider.of(context).current().mainTextColor()), - onPressed: () { + // Edit button + IconButton( + enableFeedback: true, + tooltip: AppLocalizations.of(context)!.editServerTitle, + icon: Icon(Icons.create, color: Provider.of(context).current().mainTextColor), + onPressed: () { + _pushEditServer(server); + }, + ) + ]), + onTap: () { _pushEditServer(server); - }, - ) - ]), - onTap: () { - _pushEditServer(server); - } - )); + })); } void _pushEditServer(ServerInfoState 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);