Merge pull request 'New Themes' (#260) from themes into trunk
continuous-integration/drone/push Build is passing
Details
Reviewed-on: #260 Reviewed-by: erinn <erinn@openprivacy.ca>
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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...
|
||||
|
|
|
@ -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<ContactInfoState> _groups = [];
|
||||
|
||||
RemoteServerInfoState({required this.onion, required this.identifier, required this.description, required this.status});
|
||||
|
||||
|
||||
void updateDescription(String newDescription) {
|
||||
this.description = newDescription;
|
||||
notifyListeners();
|
||||
|
|
1455
lib/opaque.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,
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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),
|
||||
);
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -163,7 +163,7 @@ class _AddContactViewState extends State<AddContactView> {
|
|||
}
|
||||
});
|
||||
},
|
||||
labelText: '',
|
||||
hintText: '',
|
||||
)
|
||||
])));
|
||||
}
|
||||
|
@ -215,7 +215,7 @@ class _AddContactViewState extends State<AddContactView> {
|
|||
),
|
||||
CwtchTextField(
|
||||
controller: ctrlrGroupName,
|
||||
labelText: AppLocalizations.of(context)!.groupNameLabel,
|
||||
hintText: AppLocalizations.of(context)!.groupNameLabel,
|
||||
onChanged: (newValue) {},
|
||||
validator: (value) {},
|
||||
),
|
||||
|
|
|
@ -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<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,
|
||||
)
|
||||
|
@ -104,10 +104,10 @@ class _AddEditProfileViewState extends State<AddEditProfileView> {
|
|||
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<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,7 +33,6 @@ class _AddEditServerViewState extends State<AddEditServerView> {
|
|||
final ctrlrOnion = TextEditingController(text: "");
|
||||
|
||||
late bool usePassword;
|
||||
//late bool deleted;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
@ -87,10 +86,10 @@ class _AddEditServerViewState extends State<AddEditServerView> {
|
|||
// 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<AddEditServerView> {
|
|||
),
|
||||
CwtchTextField(
|
||||
controller: ctrlrDesc,
|
||||
labelText: AppLocalizations.of(context)!.fieldDescriptionLabel,
|
||||
hintText: AppLocalizations.of(context)!.fieldDescriptionLabel,
|
||||
autofocus: false,
|
||||
)
|
||||
]),
|
||||
|
@ -117,7 +116,7 @@ class _AddEditServerViewState extends State<AddEditServerView> {
|
|||
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<AddEditServerView> {
|
|||
Provider.of<FlwtchState>(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<AddEditServerView> {
|
|||
Provider.of<FlwtchState>(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<AddEditServerView> {
|
|||
height: 20,
|
||||
),
|
||||
Text(AppLocalizations.of(context)!.serverMetricsLabel, style: Provider.of<FlwtchState>(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<AddEditServerView> {
|
|||
),
|
||||
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,
|
||||
|
|
|
@ -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),
|
||||
),
|
||||
|
@ -117,7 +117,7 @@ class _ContactsViewState extends State<ContactsView> {
|
|||
if (Provider.of<Settings>(context, listen: false).isExperimentEnabled(TapirGroupsExperiment) || Provider.of<Settings>(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<ContactsView> {
|
|||
Widget _buildFilterable() {
|
||||
Widget txtfield = CwtchTextField(
|
||||
controller: ctrlrFilter,
|
||||
labelText: AppLocalizations.of(context)!.search,
|
||||
hintText: AppLocalizations.of(context)!.search,
|
||||
onChanged: (newVal) {
|
||||
Provider.of<ContactListState>(context, listen: false).filter = newVal;
|
||||
},
|
||||
|
|
|
@ -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<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 +57,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 +74,43 @@ 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.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<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(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<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 +150,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 +163,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.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<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.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<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.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<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.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<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.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<GlobalSettingsView> {
|
|||
}
|
||||
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<GlobalSettingsView> {
|
|||
}
|
||||
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<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)),
|
||||
)
|
||||
]),
|
||||
|
@ -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<Settings>(context, listen: false);
|
||||
|
|
|
@ -101,7 +101,7 @@ class _GroupSettingsViewState extends State<GroupSettingsView> {
|
|||
),
|
||||
CwtchTextField(
|
||||
controller: ctrlrGroupAddr,
|
||||
labelText: '',
|
||||
hintText: '',
|
||||
validator: (value) {},
|
||||
)
|
||||
]),
|
||||
|
@ -116,7 +116,7 @@ class _GroupSettingsViewState extends State<GroupSettingsView> {
|
|||
CwtchTextField(
|
||||
controller: TextEditingController(text: Provider.of<ContactInfoState>(context, listen: false).server),
|
||||
validator: (value) {},
|
||||
labelText: '',
|
||||
hintText: '',
|
||||
)
|
||||
]),
|
||||
|
||||
|
|
|
@ -104,6 +104,7 @@ class _MessageViewState extends State<MessageView> {
|
|||
return WillPopScope(
|
||||
onWillPop: _onWillPop,
|
||||
child: Scaffold(
|
||||
backgroundColor: Provider.of<Settings>(context).theme.backgroundMainColor,
|
||||
floatingActionButton: appState.unreadMessagesBelow
|
||||
? FloatingActionButton(
|
||||
child: Icon(Icons.arrow_downward),
|
||||
|
@ -120,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,
|
||||
),
|
||||
|
@ -225,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,
|
||||
|
@ -233,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,
|
||||
|
@ -253,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.altTextColor()),
|
||||
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,
|
||||
))),
|
||||
)))),
|
||||
|
@ -278,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(
|
||||
|
@ -313,7 +314,7 @@ class _MessageViewState extends State<MessageView> {
|
|||
children = [composeBox];
|
||||
}
|
||||
|
||||
return Column(mainAxisSize: MainAxisSize.min, children: children);
|
||||
return Container(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.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<ContactInfoState>(context).savePeerHistory == "DefaultDeleteHistory"
|
||||
? AppLocalizations.of(context)!.dontSavePeerHistory
|
||||
|
|
|
@ -46,20 +46,20 @@ class _ProfileMgrViewState extends State<ProfileMgrView> {
|
|||
return Provider.of<AppState>(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<ProfileMgrView> {
|
|||
// Unlock Profiles
|
||||
actions.add(IconButton(
|
||||
icon: Icon(CwtchIcons.lock_open_24px),
|
||||
color: Provider.of<ProfileListState>(context).profiles.isEmpty ? Provider.of<Settings>(context).theme.defaultButtonColor() : Provider.of<Settings>(context).theme.mainTextColor(),
|
||||
color: Provider.of<ProfileListState>(context).profiles.isEmpty ? Provider.of<Settings>(context).theme.defaultButtonColor : Provider.of<Settings>(context).theme.mainTextColor,
|
||||
tooltip: AppLocalizations.of(context)!.tooltipUnlockProfiles,
|
||||
onPressed: _modalUnlockProfiles,
|
||||
));
|
||||
|
|
|
@ -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<ProfileServersView> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
|
@ -25,9 +23,10 @@ class _ProfileServersView extends State<ProfileServersView> {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
var knownServers = Provider.of<ProfileInfoState>(context).serverList.servers.map<String>((RemoteServerInfoState remoteServer) { return remoteServer.onion + ".onion"; }).toSet();
|
||||
var importServerList = Provider.of<ServerListState>(context).servers.where((server) => !knownServers.contains(server.onion) ).map<DropdownMenuItem<String>>((ServerInfoState serverInfo) {
|
||||
var knownServers = Provider.of<ProfileInfoState>(context).serverList.servers.map<String>((RemoteServerInfoState remoteServer) {
|
||||
return remoteServer.onion + ".onion";
|
||||
}).toSet();
|
||||
var importServerList = Provider.of<ServerListState>(context).servers.where((server) => !knownServers.contains(server.onion)).map<DropdownMenuItem<String>>((ServerInfoState serverInfo) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: serverInfo.onion,
|
||||
child: Text(
|
||||
|
@ -37,25 +36,22 @@ class _ProfileServersView extends State<ProfileServersView> {
|
|||
);
|
||||
}).toList();
|
||||
|
||||
importServerList.insert(0, DropdownMenuItem<String>(
|
||||
value: "",
|
||||
child: Text(AppLocalizations.of(context)!.importLocalServerSelectText)));
|
||||
importServerList.insert(0, DropdownMenuItem<String>(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<ProfileInfoState>(builder: (context, profile, child) {
|
||||
body: Consumer<ProfileInfoState>(
|
||||
builder: (context, profile, child) {
|
||||
ProfileServerListState servers = profile.serverList;
|
||||
final tiles = servers.servers.map((RemoteServerInfoState server) {
|
||||
return ChangeNotifierProvider<RemoteServerInfoState>.value(
|
||||
value: server,
|
||||
builder: (context, child) => RepaintBoundary(child: RemoteServerRow()),
|
||||
);
|
||||
},
|
||||
final tiles = servers.servers.map(
|
||||
(RemoteServerInfoState server) {
|
||||
return ChangeNotifierProvider<RemoteServerInfoState>.value(
|
||||
value: server,
|
||||
builder: (context, child) => RepaintBoundary(child: RemoteServerRow()),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
final divided = ListTile.divideTiles(
|
||||
|
@ -63,37 +59,31 @@ class _ProfileServersView extends State<ProfileServersView> {
|
|||
tiles: tiles,
|
||||
).toList();
|
||||
|
||||
final importCard = Card( child: ListTile(
|
||||
title: Text(AppLocalizations.of(context)!.importLocalServerLabel),
|
||||
leading: Icon(CwtchIcons.add_circle_24px , color: Provider.of<Settings>(context).current().mainTextColor()),
|
||||
trailing: DropdownButton(
|
||||
onChanged: (String? importServer) {
|
||||
if (importServer!.isNotEmpty) {
|
||||
var server = Provider.of<ServerListState>(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<Settings>(context).current().mainTextColor),
|
||||
trailing: DropdownButton(
|
||||
onChanged: (String? importServer) {
|
||||
if (importServer!.isNotEmpty) {
|
||||
var server = Provider.of<ServerListState>(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<ProfileServersView> {
|
|||
|
||||
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<ProfileServersView> {
|
|||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
var profile = Provider.of<ProfileInfoState>(context);
|
||||
if (profile.serverList.getServer(serverHandle) != null) {
|
||||
profile.serverList.getServer(serverHandle)?.updateDescription(
|
||||
serverDesc);
|
||||
profile.serverList.getServer(serverHandle)?.updateDescription(serverDesc);
|
||||
|
||||
Provider
|
||||
.of<FlwtchState>(context, listen: false)
|
||||
.cwtch
|
||||
.SetConversationAttribute(profile.onion, profile.serverList
|
||||
.getServer(serverHandle)
|
||||
!.identifier, "server.description", serverDesc);
|
||||
Provider.of<FlwtchState>(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<ProfileServersView> {
|
|||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,63 +50,62 @@ class _RemoteServerViewState extends State<RemoteServerView> {
|
|||
Widget build(BuildContext context) {
|
||||
return Consumer3<ProfileInfoState, RemoteServerInfoState, Settings>(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<FlwtchState>(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<FlwtchState>(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<ContactInfoState>.value(
|
||||
value: group,
|
||||
builder: (context, child) => RepaintBoundary(child: _buildGroupRow(group)), // ServerRow()),
|
||||
);
|
||||
},
|
||||
final tiles = serverInfoState.groups.map(
|
||||
(ContactInfoState group) {
|
||||
return ChangeNotifierProvider<ContactInfoState>.value(
|
||||
value: group,
|
||||
builder: (context, child) => RepaintBoundary(child: _buildGroupRow(group)), // ServerRow()),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
final divided = ListTile.divideTiles(
|
||||
|
@ -126,26 +125,22 @@ class _RemoteServerViewState extends State<RemoteServerView> {
|
|||
Widget _buildGroupRow(ContactInfoState group) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(6.0), //border size
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
group.nickname,
|
||||
style: Provider.of<FlwtchState>(context).biggerFont.apply(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor()),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(context).streamerMode,
|
||||
child: ExcludeSemantics(
|
||||
child: Text(
|
||||
group.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor()),
|
||||
)))
|
||||
])
|
||||
);
|
||||
child: Column(children: [
|
||||
Text(
|
||||
group.nickname,
|
||||
style: Provider.of<FlwtchState>(context).biggerFont.apply(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(context).streamerMode,
|
||||
child: ExcludeSemantics(
|
||||
child: Text(
|
||||
group.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor),
|
||||
)))
|
||||
]));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ class _ServersView extends State<ServersView> {
|
|||
// Unlock Profiles
|
||||
actions.add(IconButton(
|
||||
icon: Icon(CwtchIcons.lock_open_24px),
|
||||
color: Provider.of<ServerListState>(context).servers.isEmpty ? Provider.of<Settings>(context).theme.defaultButtonColor() : Provider.of<Settings>(context).theme.mainTextColor(),
|
||||
color: Provider.of<ServerListState>(context).servers.isEmpty ? Provider.of<Settings>(context).theme.defaultButtonColor : Provider.of<Settings>(context).theme.mainTextColor,
|
||||
tooltip: AppLocalizations.of(context)!.tooltipUnlockProfiles,
|
||||
onPressed: _modalUnlockServers,
|
||||
));
|
||||
|
|
|
@ -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<Settings>(context).theme.mainTextColor() : Provider.of<Settings>(context).theme.textfieldErrorColor())),
|
||||
style: TextStyle(fontSize: 16.0, color: appState.appError == "" ? Provider.of<Settings>(context).theme.mainTextColor : Provider.of<Settings>(context).theme.textfieldErrorColor)),
|
||||
),
|
||||
Image(image: AssetImage("assets/Open_Privacy_Logo_lightoutline.png")),
|
||||
])),
|
||||
|
|
|
@ -41,30 +41,30 @@ class _CwtchButtonTextFieldState extends State<CwtchButtonTextField> {
|
|||
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))),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ class _ContactRowState extends State<ContactRow> {
|
|||
var contact = Provider.of<ContactInfoState>(context);
|
||||
return Card(
|
||||
clipBehavior: Clip.antiAlias,
|
||||
color: Provider.of<AppState>(context).selectedConversation == contact.onion ? Provider.of<Settings>(context).theme.backgroundHilightElementColor() : null,
|
||||
color: Provider.of<AppState>(context).selectedConversation == contact.identifier ? Provider.of<Settings>(context).theme.backgroundHilightElementColor : null,
|
||||
borderOnForeground: false,
|
||||
margin: EdgeInsets.all(0.0),
|
||||
child: InkWell(
|
||||
|
@ -32,16 +32,16 @@ class _ContactRowState extends State<ContactRow> {
|
|||
padding: const EdgeInsets.all(6.0), //border size
|
||||
child: ProfileImage(
|
||||
badgeCount: contact.unreadMessages,
|
||||
badgeColor: Provider.of<Settings>(context).theme.portraitContactBadgeColor(),
|
||||
badgeTextColor: Provider.of<Settings>(context).theme.portraitContactBadgeTextColor(),
|
||||
badgeColor: Provider.of<Settings>(context).theme.portraitContactBadgeColor,
|
||||
badgeTextColor: Provider.of<Settings>(context).theme.portraitContactBadgeTextColor,
|
||||
diameter: 64.0,
|
||||
imagePath: contact.imagePath,
|
||||
maskOut: !contact.isOnline(),
|
||||
border: contact.isOnline()
|
||||
? Provider.of<Settings>(context).theme.portraitOnlineBorderColor()
|
||||
? Provider.of<Settings>(context).theme.portraitOnlineBorderColor
|
||||
: contact.isBlocked
|
||||
? Provider.of<Settings>(context).theme.portraitBlockedBorderColor()
|
||||
: Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
? Provider.of<Settings>(context).theme.portraitBlockedBorderColor
|
||||
: Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
|
@ -55,20 +55,20 @@ class _ContactRowState extends State<ContactRow> {
|
|||
style: TextStyle(
|
||||
fontSize: Provider.of<Settings>(context).theme.contactOnionTextSize(),
|
||||
color: contact.isBlocked
|
||||
? Provider.of<Settings>(context).theme.portraitBlockedTextColor()
|
||||
: Provider.of<Settings>(context).theme.mainTextColor()), //Provider.of<FlwtchState>(context).biggerFont,
|
||||
? Provider.of<Settings>(context).theme.portraitBlockedTextColor
|
||||
: Provider.of<Settings>(context).theme.mainTextColor), //Provider.of<FlwtchState>(context).biggerFont,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.visible,
|
||||
),
|
||||
Visibility(
|
||||
visible: contact.isGroup && contact.status == "Authenticated",
|
||||
child: LinearProgressIndicator(
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor(),
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor,
|
||||
)),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(context).streamerMode,
|
||||
child: Text(contact.onion,
|
||||
style: TextStyle(color: contact.isBlocked ? Provider.of<Settings>(context).theme.portraitBlockedTextColor() : Provider.of<Settings>(context).theme.mainTextColor())),
|
||||
style: TextStyle(color: contact.isBlocked ? Provider.of<Settings>(context).theme.portraitBlockedTextColor : Provider.of<Settings>(context).theme.mainTextColor)),
|
||||
)
|
||||
],
|
||||
))),
|
||||
|
@ -81,7 +81,7 @@ class _ContactRowState extends State<ContactRow> {
|
|||
iconSize: 16,
|
||||
icon: Icon(
|
||||
Icons.favorite,
|
||||
color: Provider.of<Settings>(context).theme.mainTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.mainTextColor,
|
||||
),
|
||||
tooltip: AppLocalizations.of(context)!.tooltipAcceptContactRequest,
|
||||
onPressed: _btnApprove,
|
||||
|
@ -89,7 +89,7 @@ class _ContactRowState extends State<ContactRow> {
|
|||
IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
iconSize: 16,
|
||||
icon: Icon(Icons.delete, color: Provider.of<Settings>(context).theme.mainTextColor()),
|
||||
icon: Icon(Icons.delete, color: Provider.of<Settings>(context).theme.mainTextColor),
|
||||
tooltip: AppLocalizations.of(context)!.tooltipRejectContactRequest,
|
||||
onPressed: _btnReject,
|
||||
)
|
||||
|
@ -98,7 +98,7 @@ class _ContactRowState extends State<ContactRow> {
|
|||
? IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
iconSize: 16,
|
||||
icon: Icon(Icons.block, color: Provider.of<Settings>(context).theme.mainTextColor()),
|
||||
icon: Icon(Icons.block, color: Provider.of<Settings>(context).theme.mainTextColor),
|
||||
onPressed: () {},
|
||||
)
|
||||
: Text(dateToNiceString(contact.lastMessageTime))),
|
||||
|
|
|
@ -18,7 +18,7 @@ class _CwtchLabelState extends State<CwtchLabel> {
|
|||
return Consumer<Settings>(builder: (context, theme, child) {
|
||||
return Text(
|
||||
widget.label,
|
||||
style: TextStyle(fontSize: 20, color: theme.current().mainTextColor()),
|
||||
style: TextStyle(fontSize: 20, color: theme.current().mainTextColor),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
var wdgSender = Center(
|
||||
widthFactor: 1,
|
||||
child: SelectableText(senderDisplayStr + '\u202F',
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor())));
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor)));
|
||||
|
||||
var wdgMessage = !showFileSharing
|
||||
? Text(AppLocalizations.of(context)!.messageEnableFileSharing)
|
||||
|
@ -84,7 +84,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
} else {
|
||||
wdgDecorations = LinearProgressIndicator(
|
||||
value: Provider.of<ProfileInfoState>(context).downloadProgress(widget.fileKey()),
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor(),
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor,
|
||||
);
|
||||
}
|
||||
} else if (flagStarted) {
|
||||
|
@ -114,9 +114,8 @@ class FileBubbleState extends State<FileBubble> {
|
|||
widthFactor: 1.0,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor(),
|
||||
border:
|
||||
Border.all(color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor(), width: 1),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor,
|
||||
border: Border.all(color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor, width: 1),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(borderRadiousEh),
|
||||
topRight: Radius.circular(borderRadiousEh),
|
||||
|
@ -196,7 +195,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
SelectableText(
|
||||
chrome + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
|
@ -205,7 +204,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
SelectableText(
|
||||
fileName + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
@ -216,7 +215,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
SelectableText(
|
||||
prettyBytes(fileSize) + '\u202F' + '\n',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
|
@ -225,7 +224,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
subtitle: SelectableText(
|
||||
'sha512: ' + rootHash + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
fontSize: 10,
|
||||
fontFamily: "monospace",
|
||||
),
|
||||
|
@ -233,7 +232,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
maxLines: 4,
|
||||
textWidthBasis: TextWidthBasis.parent,
|
||||
),
|
||||
leading: Icon(Icons.attach_file, size: 32, color: Provider.of<Settings>(context).theme.messageFromMeTextColor()));
|
||||
leading: Icon(Icons.attach_file, size: 32, color: Provider.of<Settings>(context).theme.messageFromMeTextColor));
|
||||
}
|
||||
|
||||
// Construct an file chrome
|
||||
|
@ -244,7 +243,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
SelectableText(
|
||||
chrome + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
|
@ -253,7 +252,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
SelectableText(
|
||||
fileName + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
fontWeight: FontWeight.bold,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
@ -264,7 +263,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
SelectableText(
|
||||
AppLocalizations.of(context)!.labelFilesize + ': ' + prettyBytes(fileSize) + '\u202F' + '\n',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
|
@ -273,7 +272,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
subtitle: SelectableText(
|
||||
'sha512: ' + rootHash + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
fontSize: 10,
|
||||
fontFamily: "monospace",
|
||||
),
|
||||
|
@ -281,13 +280,13 @@ class FileBubbleState extends State<FileBubble> {
|
|||
maxLines: 4,
|
||||
textWidthBasis: TextWidthBasis.parent,
|
||||
),
|
||||
leading: Icon(Icons.attach_file, size: 32, color: Provider.of<Settings>(context).theme.messageFromOtherTextColor()),
|
||||
leading: Icon(Icons.attach_file, size: 32, color: Provider.of<Settings>(context).theme.messageFromOtherTextColor),
|
||||
trailing: Visibility(
|
||||
visible: speed != "0 B/s",
|
||||
child: SelectableText(
|
||||
speed + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 1,
|
||||
|
|
|
@ -56,7 +56,7 @@ class InvitationBubbleState extends State<InvitationBubble> {
|
|||
var wdgSender = Center(
|
||||
widthFactor: 1,
|
||||
child: SelectableText(senderDisplayStr + '\u202F',
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor())));
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(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<InvitationBubble> {
|
|||
widthFactor: 1.0,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor(),
|
||||
border:
|
||||
Border.all(color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor(), width: 1),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor,
|
||||
border: Border.all(color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor, width: 1),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(borderRadiousEh),
|
||||
topRight: Radius.circular(borderRadiousEh),
|
||||
|
@ -149,7 +148,7 @@ class InvitationBubbleState extends State<InvitationBubble> {
|
|||
SelectableText(
|
||||
chrome + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
|
@ -158,7 +157,7 @@ class InvitationBubbleState extends State<InvitationBubble> {
|
|||
SelectableText(
|
||||
targetName + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
|
@ -173,7 +172,7 @@ class InvitationBubbleState extends State<InvitationBubble> {
|
|||
SelectableText(
|
||||
chrome + '\u202F',
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
|
@ -181,7 +180,7 @@ class InvitationBubbleState extends State<InvitationBubble> {
|
|||
),
|
||||
SelectableText(
|
||||
targetName + '\u202F',
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.messageFromOtherTextColor()),
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.messageFromOtherTextColor),
|
||||
textAlign: TextAlign.left,
|
||||
maxLines: 2,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
|
|
|
@ -48,7 +48,7 @@ class MessageBubbleState extends State<MessageBubble> {
|
|||
}
|
||||
}
|
||||
var wdgSender = SelectableText(senderDisplayStr,
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor()));
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor));
|
||||
|
||||
var wdgMessage;
|
||||
|
||||
|
@ -58,7 +58,7 @@ class MessageBubbleState extends State<MessageBubble> {
|
|||
//key: Key(myKey),
|
||||
focusNode: _focus,
|
||||
style: TextStyle(
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
|
@ -75,10 +75,10 @@ class MessageBubbleState extends State<MessageBubble> {
|
|||
//key: Key(myKey),
|
||||
focusNode: _focus,
|
||||
style: TextStyle(
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
linkStyle: TextStyle(
|
||||
color: Provider.of<Settings>(context).current().mainTextColor(),
|
||||
color: Provider.of<Settings>(context).current().mainTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
|
@ -95,13 +95,11 @@ class MessageBubbleState extends State<MessageBubble> {
|
|||
child: Container(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: error
|
||||
? malformedColor
|
||||
: (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor()),
|
||||
color: error ? malformedColor : (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor),
|
||||
border: Border.all(
|
||||
color: error
|
||||
? malformedColor
|
||||
: (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor()),
|
||||
: (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor),
|
||||
width: 1),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(borderRadiousEh),
|
||||
|
|
|
@ -25,8 +25,7 @@ class _MessageBubbleDecoration extends State<MessageBubbleDecoration> {
|
|||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(widget.prettyDate,
|
||||
style:
|
||||
TextStyle(fontSize: 9.0, color: widget.fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor()),
|
||||
style: TextStyle(fontSize: 9.0, color: widget.fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(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<MessageBubbleDecoration> {
|
|||
child: widget.ackd == true
|
||||
? Tooltip(
|
||||
message: AppLocalizations.of(context)!.acknowledgedLabel,
|
||||
child: Icon(Icons.check_circle_outline, color: Provider.of<Settings>(context).theme.messageFromMeTextColor(), size: 16))
|
||||
child: Icon(Icons.check_circle_outline, color: Provider.of<Settings>(context).theme.messageFromMeTextColor, size: 16))
|
||||
: (widget.errored == true
|
||||
? Tooltip(
|
||||
message: AppLocalizations.of(context)!.couldNotSendMsgError,
|
||||
child: Icon(Icons.error_outline, color: Provider.of<Settings>(context).theme.messageFromMeTextColor(), size: 16))
|
||||
child: Icon(Icons.error_outline, color: Provider.of<Settings>(context).theme.messageFromMeTextColor, size: 16))
|
||||
: Tooltip(
|
||||
message: AppLocalizations.of(context)!.pendingLabel,
|
||||
child: Icon(Icons.hourglass_bottom_outlined, color: Provider.of<Settings>(context).theme.messageFromMeTextColor(), size: 16))))
|
||||
child: Icon(Icons.hourglass_bottom_outlined, color: Provider.of<Settings>(context).theme.messageFromMeTextColor, size: 16))))
|
||||
],
|
||||
));
|
||||
}
|
||||
|
|
|
@ -35,65 +35,66 @@ class _MessageListState extends State<MessageList> {
|
|||
|
||||
return RepaintBoundary(
|
||||
child: Container(
|
||||
color: Provider.of<Settings>(context).theme.backgroundMainColor,
|
||||
child: Column(children: [
|
||||
Visibility(
|
||||
visible: showMessageWarning,
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(5.0),
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor(),
|
||||
child: DefaultTextStyle(
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.defaultButtonTextColor()),
|
||||
child: showSyncing
|
||||
? Text(AppLocalizations.of(context)!.serverNotSynced, textAlign: TextAlign.center)
|
||||
: showOfflineWarning
|
||||
? Text(Provider.of<ContactInfoState>(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<ContactInfoState>(outerContext).isOnline()
|
||||
? null
|
||||
: DecorationImage(
|
||||
fit: BoxFit.scaleDown,
|
||||
alignment: Alignment.center,
|
||||
image: AssetImage("assets/core/negative_heart_512px.png"),
|
||||
colorFilter: ColorFilter.mode(Provider.of<Settings>(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<ContactInfoState>(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<ProfileInfoState>(outerContext, listen: false).onion;
|
||||
var contactHandle = Provider.of<ContactInfoState>(outerContext, listen: false).identifier;
|
||||
var messageIndex = index;
|
||||
Visibility(
|
||||
visible: showMessageWarning,
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(5.0),
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor,
|
||||
child: DefaultTextStyle(
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.defaultButtonTextColor),
|
||||
child: showSyncing
|
||||
? Text(AppLocalizations.of(context)!.serverNotSynced, textAlign: TextAlign.center)
|
||||
: showOfflineWarning
|
||||
? Text(Provider.of<ContactInfoState>(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<ContactInfoState>(outerContext).isOnline()
|
||||
? null
|
||||
: DecorationImage(
|
||||
fit: BoxFit.scaleDown,
|
||||
alignment: Alignment.center,
|
||||
image: AssetImage("assets/core/negative_heart_512px.png"),
|
||||
colorFilter: ColorFilter.mode(Provider.of<Settings>(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<ContactInfoState>(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<ProfileInfoState>(outerContext, listen: false).onion;
|
||||
var contactHandle = Provider.of<ContactInfoState>(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<ContactInfoState>(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<ContactInfoState>(outerContext, listen: false).getMessageKey(contactHandle, message.getMetadata().messageID);
|
||||
return message.getWidget(context, key);
|
||||
} else {
|
||||
return MessageLoadingBubble();
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
)
|
||||
: null))
|
||||
])));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -85,7 +85,7 @@ class MessageRowState extends State<MessageRow> with SingleTickerProviderStateMi
|
|||
onPressed: () {
|
||||
Provider.of<AppState>(context, listen: false).selectedIndex = Provider.of<MessageMetadata>(context, listen: false).messageID;
|
||||
},
|
||||
icon: Icon(Icons.reply, color: Provider.of<Settings>(context).theme.dropShadowColor())));
|
||||
icon: Icon(Icons.reply, color: Provider.of<Settings>(context).theme.dropShadowColor)));
|
||||
Widget wdgSpacer = Flexible(child: SizedBox(width: 60, height: 10));
|
||||
var widgetRow = <Widget>[];
|
||||
|
||||
|
@ -96,7 +96,7 @@ class MessageRowState extends State<MessageRow> with SingleTickerProviderStateMi
|
|||
actualMessage,
|
||||
];
|
||||
} else if (isBlocked && !showBlockedMessage) {
|
||||
Color blockedMessageBackground = Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor();
|
||||
Color blockedMessageBackground = Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor;
|
||||
Widget wdgPortrait = Padding(padding: EdgeInsets.all(4.0), child: Icon(CwtchIcons.account_blocked));
|
||||
widgetRow = <Widget>[
|
||||
wdgPortrait,
|
||||
|
@ -118,7 +118,7 @@ class MessageRowState extends State<MessageRow> with SingleTickerProviderStateMi
|
|||
AppLocalizations.of(context)!.blockedMessageMessage,
|
||||
//key: Key(myKey),
|
||||
style: TextStyle(
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
|
@ -152,8 +152,9 @@ class MessageRowState extends State<MessageRow> with SingleTickerProviderStateMi
|
|||
diameter: 48.0,
|
||||
imagePath: Provider.of<MessageMetadata>(context).senderImage ?? contact.imagePath,
|
||||
//maskOut: contact.status != "Authenticated",
|
||||
border: contact.status == "Authenticated" ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor(),
|
||||
badgeTextColor: Colors.red, badgeColor: Colors.red,
|
||||
border: contact.status == "Authenticated" ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(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<MessageRow> with SingleTickerProviderStateMi
|
|||
Widget _bubbleNew() {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor(),
|
||||
border: Border.all(color: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor(), width: 1),
|
||||
color: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor,
|
||||
border: Border.all(color: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor, width: 1),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(8),
|
||||
topRight: Radius.circular(8),
|
||||
|
|
|
@ -53,21 +53,21 @@ class _CwtchTextFieldState extends State<CwtchPasswordField> {
|
|||
},
|
||||
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)),
|
||||
),
|
||||
);
|
||||
});
|
||||
|
|
|
@ -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<ProfileImage> {
|
|||
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<Settings>(context).theme.identifier() == "dark"
|
||||
? Provider.of<Settings>(context).theme.mode == mode_dark
|
||||
? BlendMode.softLight
|
||||
: BlendMode.darken
|
||||
: BlendMode.srcOut,
|
||||
color: Provider.of<Settings>(context).theme.backgroundHilightElementColor(),
|
||||
color: Provider.of<Settings>(context).theme.portraitBackgroundColor,
|
||||
isAntiAlias: true,
|
||||
width: widget.diameter,
|
||||
height: widget.diameter,
|
||||
|
|
|
@ -32,11 +32,11 @@ class _ProfileRowState extends State<ProfileRow> {
|
|||
padding: const EdgeInsets.all(6.0), //border size
|
||||
child: ProfileImage(
|
||||
badgeCount: 0,
|
||||
badgeColor: Provider.of<Settings>(context).theme.portraitProfileBadgeColor(),
|
||||
badgeTextColor: Provider.of<Settings>(context).theme.portraitProfileBadgeTextColor(),
|
||||
badgeColor: Provider.of<Settings>(context).theme.portraitProfileBadgeColor,
|
||||
badgeTextColor: Provider.of<Settings>(context).theme.portraitProfileBadgeTextColor,
|
||||
diameter: 64.0,
|
||||
imagePath: profile.imagePath,
|
||||
border: profile.isOnline ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor())),
|
||||
border: profile.isOnline ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor)),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
|
@ -60,7 +60,7 @@ class _ProfileRowState extends State<ProfileRow> {
|
|||
IconButton(
|
||||
enableFeedback: true,
|
||||
tooltip: AppLocalizations.of(context)!.editProfile + " " + profile.nickname,
|
||||
icon: Icon(Icons.create, color: Provider.of<Settings>(context).current().mainTextColor()),
|
||||
icon: Icon(Icons.create, color: Provider.of<Settings>(context).current().mainTextColor),
|
||||
onPressed: () {
|
||||
_pushEditProfile(onion: profile.onion, displayName: profile.nickname, profileImage: profile.imagePath, encrypted: profile.isEncrypted);
|
||||
},
|
||||
|
|
|
@ -42,13 +42,13 @@ class QuotedMessageBubbleState extends State<QuotedMessageBubble> {
|
|||
}
|
||||
}
|
||||
var wdgSender = SelectableText(senderDisplayStr,
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor()));
|
||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor));
|
||||
|
||||
var wdgMessage = SelectableText(
|
||||
widget.body + '\u202F',
|
||||
focusNode: _focus,
|
||||
style: TextStyle(
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor() : Provider.of<Settings>(context).theme.messageFromOtherTextColor(),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||
),
|
||||
textAlign: TextAlign.left,
|
||||
textWidthBasis: TextWidthBasis.longestLine,
|
||||
|
@ -61,11 +61,11 @@ class QuotedMessageBubbleState extends State<QuotedMessageBubble> {
|
|||
try {
|
||||
var qMessage = (snapshot.data! as Message);
|
||||
// Swap the background color for quoted tweets..
|
||||
var qTextColor = fromMe ? Provider.of<Settings>(context).theme.messageFromOtherTextColor() : Provider.of<Settings>(context).theme.messageFromMeTextColor();
|
||||
var qTextColor = fromMe ? Provider.of<Settings>(context).theme.messageFromOtherTextColor : Provider.of<Settings>(context).theme.messageFromMeTextColor;
|
||||
return Container(
|
||||
margin: EdgeInsets.all(5),
|
||||
padding: EdgeInsets.all(5),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor() : Provider.of<Settings>(context).theme.messageFromMeBackgroundColor(),
|
||||
color: fromMe ? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor : Provider.of<Settings>(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<QuotedMessageBubble> {
|
|||
child: Container(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: error
|
||||
? malformedColor
|
||||
: (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor()),
|
||||
color: error ? malformedColor : (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor),
|
||||
border: Border.all(
|
||||
color: error
|
||||
? malformedColor
|
||||
: (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor() : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor()),
|
||||
: (fromMe ? Provider.of<Settings>(context).theme.messageFromMeBackgroundColor : Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor),
|
||||
width: 1),
|
||||
borderRadius: BorderRadius.only(
|
||||
topLeft: Radius.circular(borderRadiousEh),
|
||||
|
|
|
@ -23,46 +23,42 @@ class _RemoteServerRowState extends State<RemoteServerRow> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var server = Provider.of<RemoteServerInfoState>(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<ProfileInfoState>(
|
||||
builder: (context, profile, child) {
|
||||
return Card(clipBehavior: Clip.antiAlias,
|
||||
return Consumer<ProfileInfoState>(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<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(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<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor(),
|
||||
size: 64)
|
||||
|
||||
Text(
|
||||
description,
|
||||
semanticsLabel: description,
|
||||
style: Provider.of<FlwtchState>(context)
|
||||
.biggerFont
|
||||
.apply(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
description,
|
||||
semanticsLabel: description,
|
||||
style: Provider.of<FlwtchState>(context).biggerFont.apply(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(context).streamerMode,
|
||||
child: ExcludeSemantics(
|
||||
child: Text(
|
||||
server.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
)))
|
||||
],
|
||||
)),
|
||||
|
||||
]),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(context).streamerMode,
|
||||
child: ExcludeSemantics(
|
||||
child: Text(
|
||||
server.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
)))
|
||||
],
|
||||
)),
|
||||
]),
|
||||
onTap: () {
|
||||
Navigator.of(context).push(MaterialPageRoute<void>(
|
||||
settings: RouteSettings(name: "remoteserverview"),
|
||||
|
@ -72,7 +68,7 @@ class _RemoteServerRowState extends State<RemoteServerRow> {
|
|||
child: RemoteServerView(),
|
||||
);
|
||||
}));
|
||||
}
|
||||
));});
|
||||
}
|
||||
}));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,58 +26,57 @@ class _ServerRowState extends State<ServerRow> {
|
|||
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<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor(), size: 64)),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
server.description,
|
||||
semanticsLabel: server.description,
|
||||
style: Provider.of<FlwtchState>(context)
|
||||
.biggerFont
|
||||
.apply(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(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<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor, size: 64)),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
server.description,
|
||||
semanticsLabel: server.description,
|
||||
style: Provider.of<FlwtchState>(context)
|
||||
.biggerFont
|
||||
.apply(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
)))
|
||||
],
|
||||
)),
|
||||
),
|
||||
Visibility(
|
||||
visible: !Provider.of<Settings>(context).streamerMode,
|
||||
child: ExcludeSemantics(
|
||||
child: Text(
|
||||
server.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
)))
|
||||
],
|
||||
)),
|
||||
|
||||
// Copy server button
|
||||
IconButton(
|
||||
enableFeedback: true,
|
||||
tooltip: AppLocalizations.of(context)!.copyServerKeys,
|
||||
icon: Icon(CwtchIcons.address_copy_2, color: Provider.of<Settings>(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<Settings>(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<Settings>(context).current().mainTextColor()),
|
||||
onPressed: () {
|
||||
// Edit button
|
||||
IconButton(
|
||||
enableFeedback: true,
|
||||
tooltip: AppLocalizations.of(context)!.editServerTitle,
|
||||
icon: Icon(Icons.create, color: Provider.of<Settings>(context).current().mainTextColor),
|
||||
onPressed: () {
|
||||
_pushEditServer(server);
|
||||
},
|
||||
)
|
||||
]),
|
||||
onTap: () {
|
||||
_pushEditServer(server);
|
||||
},
|
||||
)
|
||||
]),
|
||||
onTap: () {
|
||||
_pushEditServer(server);
|
||||
}
|
||||
));
|
||||
}));
|
||||
}
|
||||
|
||||
void _pushEditServer(ServerInfoState server) {
|
||||
|
|
|
@ -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<CwtchTextField> {
|
|||
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))),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ class _TorIconState extends State<TorIcon> {
|
|||
return RepaintBoundary(
|
||||
child: Icon(
|
||||
Provider.of<TorStatus>(context).progress == 0 ? CwtchIcons.onion_off : (Provider.of<TorStatus>(context).progress == 100 ? CwtchIcons.onion_on : CwtchIcons.onion_waiting),
|
||||
color: Provider.of<Settings>(context).theme.mainTextColor(),
|
||||
color: Provider.of<Settings>(context).theme.mainTextColor,
|
||||
semanticLabel: Provider.of<TorStatus>(context).progress == 100
|
||||
? AppLocalizations.of(context)!.networkStatusOnline
|
||||
: (Provider.of<TorStatus>(context).progress == 0 ? AppLocalizations.of(context)!.networkStatusDisconnected : AppLocalizations.of(context)!.networkStatusAttemptingTor),
|
||||
|
|
|
@ -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"
|
|
@ -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<Settings> getSettingsEnglishDark() => ChangeNotifierProvider.value(value: settingsEnglishDark);
|
||||
|
||||
void main() {
|
||||
|
|
|
@ -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<Settings> getSettingsEnglishDark() => ChangeNotifierProvider.value(value: settingsEnglishDark);
|
||||
|
||||
void main() {
|
||||
|
|
|
@ -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<Settings> 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,
|
||||
);
|
||||
|
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.9 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
|
@ -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<Settings> 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);
|
||||
|
|