refactor themes from methods to get fields; add theme selector; add neon1

pull/260/head
Dan Ballard 1 year ago
parent 194ade9aa6
commit 53e79f5b9d

@ -25,7 +25,7 @@ import 'dart:io' show Platform, exit;
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();

@ -37,15 +37,9 @@ 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();
}
@ -70,11 +64,12 @@ 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.setTheme(settings["Theme"], settings["ThemeMode"] ?? mode_dark);
/*if (settings["Theme"] == "light") {
this.setLight();
} else {
this.setDark();
}
}*/
// Set Locale and notify listeners
switchLocale(Locale(settings["Locale"]));
@ -230,11 +225,11 @@ 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,

@ -5,6 +5,9 @@ import 'package:flutter/material.dart';
import 'opaque.dart';
final cwtch_name = "Cwtch"; // todo translate
final cwtch_theme = "cwtch";
final Color darkGreyPurple = Color(0xFF281831);
final Color deepPurple = Color(0xFF422850);
final Color mauvePurple = Color(0xFF8E64A5);
@ -25,7 +28,15 @@ final Color softGrey = Color(0xFFB3B6B3); // not in new theme: blocked
//static final Color softGreen = Color(0xFFA0FFB0);
//static final Color softRed = Color(0xFFFFA0B0);
class OpaqueDark extends OpaqueThemeType {
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;
@ -34,136 +45,44 @@ class OpaqueDark extends OpaqueThemeType {
static final Color settings = whiteishPurple;
static final Color accent = hotPink;
String identifier() {
return mode_dark;
}
Color backgroundMainColor() {
return background; // darkGreyPurple;
}
Color backgroundPaneColor() {
return header; //darkGreyPurple;
}
Color backgroundHilightElementColor() {
return deepPurple;
}
Color mainTextColor() {
return font; //whiteishPurple;
}
Color sendHintTextColor() {
return mauvePurple;
}
Color hilightElementColor() {
return purple;
}
Color defaultButtonColor() {
return accent; //hotPink;
}
Color defaultButtonActiveColor() {
return pink;
}
Color defaultButtonTextColor() {
return whiteishPurple;
}
Color defaultButtonDisabledColor() {
return lightGrey;
}
Color defaultButtonDisabledTextColor() {
return darkGreyPurple;
}
Color textfieldBackgroundColor() {
return deepPurple;
}
Color textfieldBorderColor() {
return deepPurple;
}
Color textfieldHintColor() {
return mainTextColor(); //TODO pick
}
Color textfieldErrorColor() {
return hotPink;
}
Color scrollbarDefaultColor() {
return purple;
}
Color portraitBackgroundColor() {
return deepPurple;
}
Color portraitOnlineBorderColor() {
return whiteishPurple;
}
Color portraitOfflineBorderColor() {
return purple;
}
Color portraitBlockedBorderColor() {
return lightGrey;
}
Color portraitBlockedTextColor() {
return lightGrey;
}
Color portraitContactBadgeColor() {
return hotPink;
}
Color portraitContactBadgeTextColor() {
return whiteishPurple;
}
Color portraitProfileBadgeColor() {
return mauvePurple;
}
Color portraitProfileBadgeTextColor() {
return darkGreyPurple;
}
Color dropShadowColor() {
return mauvePurple;
}
Color toolbarIconColor() {
return settings; //whiteishPurple;
}
Color messageFromMeBackgroundColor() {
return userBubble; // mauvePurple;
}
Color messageFromMeTextColor() {
return font; //whiteishPurple;
}
Color messageFromOtherBackgroundColor() {
return peerBubble; //deepPurple;
}
Color messageFromOtherTextColor() {
return font; //whiteishPurple;
}
get name => cwtch_name;
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 defaultButtonActiveColor => pink;
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 OpaqueLight extends OpaqueThemeType {
class CwtchLight extends OpaqueThemeType {
static final Color background = whitePurple;
static final Color header = softPurple;
static final Color userBubble = purple;
@ -172,139 +91,38 @@ class OpaqueLight extends OpaqueThemeType {
static final Color settings = darkPurple;
static final Color accent = hotPink;
String identifier() {
return mode_light;
}
// Main screen background color (message pane, item rows)
Color backgroundMainColor() {
return background; //whitePurple;
}
// Top pane ane pane colors (settings)
Color backgroundPaneColor() {
return header; //softPurple;
}
// Selected row color
Color backgroundHilightElementColor() {
// Todo: lighten? cant
// hm... in light its the top pane color. but in dark its unique
return softPurple;
}
// Main text color
Color mainTextColor() {
return settings;
}
// Faded text color for suggestions in textfields
Color sendHintTextColor() {
return purple;
}
// pressed row, offline heart
Color hilightElementColor() {
return purple; //darkPurple; // todo shouldn't be this, too dark, makes font unreadable
}
Color defaultButtonColor() {
return accent; // hotPink;
}
Color defaultButtonActiveColor() {
return pink; // todo: lighten in light, darken in dark
}
Color defaultButtonTextColor() {
return whitePurple; // ?
}
Color defaultButtonDisabledColor() {
return softGrey;
}
Color textfieldBackgroundColor() {
return purple;
}
Color textfieldBorderColor() {
return purple;
}
Color textfieldHintColor() {
return font; //TODO pick
}
Color textfieldErrorColor() {
return hotPink;
}
// todo button
Color scrollbarDefaultColor() {
return accent;
}
Color portraitBackgroundColor() {
return softPurple;
}
Color portraitOnlineBorderColor() {
return greyPurple;
}
Color portraitOfflineBorderColor() {
return greyPurple;
}
Color portraitBlockedBorderColor() {
return softGrey;
}
Color portraitBlockedTextColor() {
return softGrey;
}
Color portraitContactBadgeColor() {
return accent;
}
Color portraitContactBadgeTextColor() {
return whitePurple; // todo button color
}
// TODO del
Color portraitProfileBadgeColor() {
return brightPurple;
}
// TODO del
Color portraitProfileBadgeTextColor() {
return whitePurple;
}
Color dropShadowColor() {
return purple;
}
Color toolbarIconColor() {
return settings; //darkPurple;
}
Color messageFromMeBackgroundColor() {
return userBubble; //brightPurple;
}
Color messageFromMeTextColor() {
return font; //mainTextColor();
}
Color messageFromOtherBackgroundColor() {
return peerBubble; //purple;
}
Color messageFromOtherTextColor() {
return font; //darkPurple;
}
get name => cwtch_name;
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 defaultButtonActiveColor => pink; // todo: lighten in light, darken in dark
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;
}

@ -0,0 +1,126 @@
import 'dart:ui';
import 'dart:core';
import 'package:flutter/material.dart';
import 'opaque.dart';
final neon1_theme = "neon1";
final neon1_name = "Neon1"; //Todo translate
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 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
//static final Color softGreen = Color(0xFFA0FFB0);
//static final Color softRed = Color(0xFFFFA0B0);
OpaqueThemeType GetNeon1Theme(String mode) {
if (mode == mode_dark) {
return Neon1Dark();
} else {
return Neon1Light();
}
}
class Neon1Dark extends OpaqueThemeType {
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 name => neon1_name;
get theme => neon1_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 defaultButtonActiveColor => pink;
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 Neon1Light extends OpaqueThemeType {
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 name => neon1_name;
get theme => neon1_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 defaultButtonActiveColor => pink; // todo: lighten in light, darken in dark
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;
}

@ -1,148 +1,100 @@
import 'dart:ui';
import 'dart:core';
import 'package:cwtch/themes/cwtch.dart';
import 'package:cwtch/themes/neon1.dart';
import 'package:flutter/material.dart';
import 'package:cwtch/settings.dart';
const mode_light = "light";
const mode_dark = "dark";
abstract class OpaqueThemeType {
static final Color red = Color(0xFFFF0000);
String identifier() {
return "dummy";
}
// Main screen background color (message pane, item rows)
Color backgroundMainColor() {
return red;
}
// Top pane ane pane colors (settings)
Color backgroundPaneColor() {
return red;
}
// Selected Row
Color backgroundHilightElementColor() {
return red;
}
Color mainTextColor() {
return red;
}
// Faded text color for suggestions in textfields
// Todo: implement way more places
Color sendHintTextColor() {
return red;
}
final themes = { cwtch_theme: {mode_light: CwtchLight(), mode_dark: CwtchDark()},
neon1_theme: {mode_light: Neon1Light(), mode_dark: Neon1Dark()},
};
// pressed row, offline heart
Color hilightElementColor() {
return red;
OpaqueThemeType getTheme(String themeId, String mode) {
if (themeId == "") {
themeId = cwtch_theme;
}
Color defaultButtonColor() {
return red;
if (themeId == mode_light) {
themeId = cwtch_theme;
mode = mode_light;
}
Color defaultButtonActiveColor() {
return red;
}
Color defaultButtonTextColor() {
return red;
}
Color defaultButtonDisabledColor() {
return red;
if (themeId == mode_dark) {
themeId = cwtch_theme;
mode = mode_dark;
}
Color textfieldBackgroundColor() {
return red;
}
Color textfieldBorderColor() {
return red;
}
Color textfieldHintColor() {
return red;
}
var theme = themes[themeId]?[mode];
return theme ?? CwtchDark();
}
Color textfieldErrorColor() {
return red;
}
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));
Color scrollbarDefaultColor() {
return red;
}
return hslLight.toColor();
}
Color portraitBackgroundColor() {
return red;
}
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));
Color portraitOnlineBorderColor() {
return red;
}
return hslDarken.toColor();
}
Color portraitOfflineBorderColor() {
return red;
}
abstract class OpaqueThemeType {
static final Color red = Color(0xFFFF0000);
Color portraitBlockedBorderColor() {
return red;
}
get name => "Dummy";
get theme => "dummy";
get mode => mode_light;
Color portraitBlockedTextColor() {
return red;
}
Color portraitContactBadgeColor() {
return red;
}
// Main screen background color (message pane, item rows)
get backgroundMainColor => red;
Color portraitContactBadgeTextColor() {
return red;
}
// Top pane ane pane colors (settings)
get backgroundPaneColor => red;
Color portraitProfileBadgeColor() {
return red;
}
get mainTextColor => red;
Color portraitProfileBadgeTextColor() {
return 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 ? lighten(defaultButtonColor) : darken(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
Color dropShadowColor() {
return red;
}
Color toolbarIconColor() {
return red;
}
Color messageFromMeBackgroundColor() {
return red;
}
get dropShadowColor => red;
Color messageFromMeTextColor() {
return red;
}
Color messageFromOtherBackgroundColor() {
return red;
}
Color messageFromOtherTextColor() {
return red;
}
// ... more to come
get toolbarIconColor => red;
get messageFromMeBackgroundColor => red;
get messageFromMeTextColor => red;
get messageFromOtherBackgroundColor => red;
get messageFromOtherTextColor => red;
// Sizes
@ -151,51 +103,49 @@ abstract class OpaqueThemeType {
}
}
ThemeData mkThemeData(Settings opaque) {
return ThemeData(
visualDensity: VisualDensity.adaptivePlatformDensity,
primarySwatch: Colors.red,
primaryIconTheme: IconThemeData(
color: opaque.current().mainTextColor(),
color: opaque.current().mainTextColor,
),
primaryColor: opaque.current().backgroundMainColor(),
canvasColor: opaque.current().backgroundPaneColor(),
backgroundColor: opaque.current().backgroundMainColor(),
highlightColor: opaque.current().hilightElementColor(),
primaryColor: opaque.current().backgroundMainColor,
canvasColor: opaque.current().backgroundPaneColor,
backgroundColor: opaque.current().backgroundMainColor,
highlightColor: opaque.current().hilightElementColor,
iconTheme: IconThemeData(
color: opaque.current().toolbarIconColor(),
color: opaque.current().toolbarIconColor,
),
cardColor: opaque.current().backgroundMainColor(),
cardColor: opaque.current().backgroundMainColor,
appBarTheme: AppBarTheme(
backgroundColor: opaque.current().backgroundPaneColor(),
backgroundColor: opaque.current().backgroundPaneColor,
iconTheme: IconThemeData(
color: opaque.current().mainTextColor(),
color: opaque.current().mainTextColor,
),
titleTextStyle: TextStyle(
color: opaque.current().mainTextColor(),
color: opaque.current().mainTextColor,
),
actionsIconTheme: IconThemeData(
color: opaque.current().mainTextColor(),
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()),
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(),
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()),
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()
? opaque.current().defaultButtonActiveColor
: states.contains(MaterialState.disabled)
? opaque.current().defaultButtonDisabledColor()
? opaque.current().defaultButtonDisabledColor
: null),
enableFeedback: true,
splashFactory: InkRipple.splashFactory,
@ -206,37 +156,37 @@ ThemeData mkThemeData(Settings opaque) {
),
),
scrollbarTheme: ScrollbarThemeData(
isAlwaysShown: false, thumbColor: MaterialStateProperty.all(opaque.current().scrollbarDefaultColor())),
tabBarTheme: TabBarTheme(indicator: UnderlineTabIndicator(borderSide: BorderSide(color: opaque.current().defaultButtonActiveColor()))),
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())),
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())),
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()),
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(),
backgroundColor: opaque.current().defaultButtonColor,
hoverColor: opaque.current().defaultButtonActiveColor,
enableFeedback: true,
splashColor: opaque.current().defaultButtonActiveColor()),
splashColor: opaque.current().defaultButtonActiveColor),
textSelectionTheme: TextSelectionThemeData(
cursorColor: opaque.current().defaultButtonActiveColor(), selectionColor: opaque.current().defaultButtonActiveColor(), selectionHandleColor: opaque.current().defaultButtonActiveColor()),
cursorColor: opaque.current().defaultButtonActiveColor, selectionColor: opaque.current().defaultButtonActiveColor, selectionHandleColor: opaque.current().defaultButtonActiveColor),
);
}

@ -91,7 +91,7 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
imagePath: Provider.of<ProfileInfoState>(context).imagePath,
diameter: 120,
maskOut: false,
border: theme.theme.portraitOnlineBorderColor(),
border: theme.theme.portraitOnlineBorderColor,
badgeTextColor: Colors.red,
badgeColor: Colors.red,
)
@ -145,13 +145,13 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
child: Column(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
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,

@ -33,6 +33,7 @@ class _AddEditServerViewState extends State<AddEditServerView> {
final ctrlrOnion = TextEditingController(text: "");
late bool usePassword;
//late bool deleted;
@override

@ -78,7 +78,7 @@ class _ContactsViewState extends State<ContactsView> {
ProfileImage(
imagePath: Provider.of<ProfileInfoState>(context).imagePath,
diameter: 42,
border: Provider.of<Settings>(context).current().portraitOnlineBorderColor(),
border: Provider.of<Settings>(context).current().portraitOnlineBorderColor,
badgeTextColor: Colors.red,
badgeColor: Colors.red,
),
@ -87,7 +87,7 @@ class _ContactsViewState extends State<ContactsView> {
),
Expanded(
child: Text("%1 ยป %2".replaceAll("%1", Provider.of<ProfileInfoState>(context).nickname).replaceAll("%2", AppLocalizations.of(context)!.titleManageContacts),
overflow: TextOverflow.ellipsis, style: TextStyle(color: Provider.of<Settings>(context).current().mainTextColor()))),
overflow: TextOverflow.ellipsis, style: TextStyle(color: Provider.of<Settings>(context).current().mainTextColor))),
])),
actions: getActions(context),
),

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:cwtch/cwtch_icons_icons.dart';
import 'package:cwtch/models/servers.dart';
import 'package:cwtch/themes/opaque.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:flutter/material.dart';
import 'package:cwtch/settings.dart';
@ -36,7 +37,7 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
Widget _buildSettingsList() {
return Consumer<Settings>(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 +48,8 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
),
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<Settings>(context).locale.languageCode,
onChanged: (String? newValue) {
@ -64,25 +65,42 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
);
}).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.defaultButtonActiveColor,
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("Colour Theme"),
//AppLocalizations.of(context)!.settingTheme)),
trailing: DropdownButton<String>(
value: Provider.of<Settings>(context).theme.theme,
onChanged: (String? newValue) {
setState(() {
settings.setTheme(newValue!, settings.theme.mode);
saveSettings(context);
});
},
items: themes.keys.map<DropdownMenuItem<String>>((String themeId) {
return DropdownMenuItem<String>(
value: themeId,
child: Text(themes[themeId]?[mode_light]?.name ?? "Unknown"), //todo translate
);
}).toList())),
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 +118,9 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
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 +140,7 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
);
}).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 +153,12 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
// Save Settings...
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(CwtchIcons.block_unknown, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
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 +166,12 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
// Save Settings...
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(CwtchIcons.streamer_bunnymask, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
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 +183,16 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
// Save Settings...
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(CwtchIcons.enable_experiments, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
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 +204,14 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
// Save Settings...
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(CwtchIcons.enable_groups, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
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 +224,12 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
// Save Settings...
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(CwtchIcons.dns_24px, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
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,9 +240,9 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
}
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
inactiveTrackColor: settings.theme.defaultButtonDisabledColor,
secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor),
),
SwitchListTile(
title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks, style: TextStyle(color: settings.current().mainTextColor())),
@ -238,9 +256,9 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
}
saveSettings(context);
},
activeTrackColor: settings.theme.defaultButtonActiveColor(),
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
secondary: Icon(Icons.link, color: settings.current().mainTextColor()),
activeTrackColor: settings.theme.defaultButtonActiveColor,
inactiveTrackColor: settings.theme.defaultButtonDisabledColor,
secondary: Icon(Icons.link, color: settings.current().mainTextColor),
),
],
)),
@ -251,8 +269,8 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
applicationLegalese: '\u{a9} 2021 Open Privacy Research Society',
aboutBoxChildren: <Widget>[
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)),
)
]),

@ -104,7 +104,7 @@ class _MessageViewState extends State<MessageView> {
return WillPopScope(
onWillPop: _onWillPop,
child: Scaffold(
backgroundColor: Provider.of<Settings>(context).theme.backgroundMainColor(),
backgroundColor: Provider.of<Settings>(context).theme.backgroundMainColor,
floatingActionButton: appState.unreadMessagesBelow
? FloatingActionButton(
child: Icon(Icons.arrow_downward),
@ -121,7 +121,7 @@ class _MessageViewState extends State<MessageView> {
ProfileImage(
imagePath: Provider.of<ContactInfoState>(context).imagePath,
diameter: 42,
border: Provider.of<Settings>(context).current().portraitOnlineBorderColor(),
border: Provider.of<Settings>(context).current().portraitOnlineBorderColor,
badgeTextColor: Colors.red,
badgeColor: Colors.red,
),
@ -226,7 +226,7 @@ class _MessageViewState extends State<MessageView> {
bool isOffline = Provider.of<ContactInfoState>(context).isOnline() == false;
var composeBox = Container(
color: Provider.of<Settings>(context).theme.backgroundMainColor(),
color: Provider.of<Settings>(context).theme.backgroundMainColor,
padding: EdgeInsets.all(2),
margin: EdgeInsets.all(2),
height: 100,
@ -234,7 +234,7 @@ class _MessageViewState extends State<MessageView> {
children: <Widget>[
Expanded(
child: Container(
decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of<Settings>(context).theme.defaultButtonActiveColor()))),
decoration: BoxDecoration(border: Border(top: BorderSide(color: Provider.of<Settings>(context).theme.defaultButtonActiveColor))),
child: RawKeyboardListener(
focusNode: FocusNode(),
onKey: handleKeyPress,
@ -254,12 +254,12 @@ class _MessageViewState extends State<MessageView> {
enabled: !isOffline,
decoration: InputDecoration(
hintText: isOffline ? "" : AppLocalizations.of(context)!.placeholderEnterMessage,
hintStyle: TextStyle(color: Provider.of<Settings>(context).theme.sendHintTextColor()),
hintStyle: TextStyle(color: Provider.of<Settings>(context).theme.sendHintTextColor),
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
enabled: true,
suffixIcon: ElevatedButton(
child: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of<Settings>(context).theme.defaultButtonTextColor()),
child: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of<Settings>(context).theme.defaultButtonTextColor),
onPressed: isOffline ? null : _sendMessage,
))),
)))),
@ -279,8 +279,8 @@ class _MessageViewState extends State<MessageView> {
margin: EdgeInsets.all(5),
padding: EdgeInsets.all(5),
color: message.getMetadata().senderHandle != Provider.of<AppState>(context).selectedProfile
? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor()
: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor(),
? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor
: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor,
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Stack(children: [
Align(
@ -315,7 +315,7 @@ class _MessageViewState extends State<MessageView> {
}
return Container(
color: Provider.of<Settings>(context).theme.backgroundMainColor(), child: Column(mainAxisSize: MainAxisSize.min, children: children));
color: Provider.of<Settings>(context).theme.backgroundMainColor, child: Column(mainAxisSize: MainAxisSize.min, children: children));
}
// Send the message if enter is pressed without the shift key...

@ -105,7 +105,7 @@ class _PeerSettingsViewState extends State<PeerSettingsView> {
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<ContactInfoState>(context).isBlocked,
onChanged: (bool blocked) {
// Save local blocked status
@ -137,14 +137,14 @@ class _PeerSettingsViewState extends State<PeerSettingsView> {
Provider.of<FlwtchState>(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.defaultButtonActiveColor,
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<ContactInfoState>(context).savePeerHistory == "DefaultDeleteHistory"