merge trunk
continuous-integration/drone/pr Build is failing
Details
|
@ -79,6 +79,12 @@ class CwtchNotifier {
|
|||
server.setRunning(data["Intent"] == "running");
|
||||
}
|
||||
break;
|
||||
case "ServerStatsUpdate":
|
||||
EnvironmentConfig.debugLog("ServerStatsUpdate $data");
|
||||
var totalMessages = int.parse(data["TotalMessages"]);
|
||||
var connections = int.parse(data["Connections"]);
|
||||
serverListState.updateServerStats(data["Identity"], totalMessages, connections);
|
||||
break;
|
||||
case "GroupCreated":
|
||||
// Retrieve Server Status from Cache...
|
||||
String status = "";
|
||||
|
@ -86,8 +92,8 @@ class CwtchNotifier {
|
|||
if (serverInfoState != null) {
|
||||
status = serverInfoState.status;
|
||||
}
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) == null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], data["ConversationID"], data["GroupID"],
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(int.parse(data["ConversationID"])) == null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.add(ContactInfoState(data["ProfileOnion"], int.parse(data["ConversationID"]), data["GroupID"],
|
||||
authorization: ContactAuthorization.approved,
|
||||
imagePath: data["PicturePath"],
|
||||
nickname: data["GroupName"],
|
||||
|
@ -95,7 +101,7 @@ class CwtchNotifier {
|
|||
server: data["GroupServer"],
|
||||
isGroup: true,
|
||||
lastMessageTime: DateTime.now()));
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.now());
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(int.parse(data["ConversationID"]), DateTime.now());
|
||||
}
|
||||
break;
|
||||
case "PeerDeleted":
|
||||
|
@ -299,12 +305,6 @@ class CwtchNotifier {
|
|||
}
|
||||
}
|
||||
break;
|
||||
case "AcceptGroupInvite":
|
||||
EnvironmentConfig.debugLog("accept group invite");
|
||||
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.authorization = ContactAuthorization.approved;
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.updateLastMessageTime(data["GroupID"], DateTime.fromMillisecondsSinceEpoch(0));
|
||||
break;
|
||||
case "ServerStateChange":
|
||||
// Update the Server Cache
|
||||
profileCN.getProfile(data["ProfileOnion"])?.updateServerStatusCache(data["GroupServer"], data["ConnectionState"]);
|
||||
|
@ -315,19 +315,6 @@ class CwtchNotifier {
|
|||
});
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.resort();
|
||||
break;
|
||||
case "SetGroupAttribute":
|
||||
if (data["Key"] == "local.name") {
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) != null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.nickname = data["Data"];
|
||||
}
|
||||
} else if (data["Key"] == "local.archived") {
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"]) != null) {
|
||||
profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["GroupID"])!.isArchived = data["Data"] == "true";
|
||||
}
|
||||
} else {
|
||||
EnvironmentConfig.debugLog("unhandled set group attribute event: ${data['Key']}");
|
||||
}
|
||||
break;
|
||||
case "SetPeerAttribute":
|
||||
if (data["Key"] == "local.name") {
|
||||
if (profileCN.getProfile(data["ProfileOnion"])?.contactList.getContact(data["RemotePeer"]) != null) {
|
||||
|
@ -378,6 +365,12 @@ class CwtchNotifier {
|
|||
break;
|
||||
case "ImportingProfileEvent":
|
||||
break;
|
||||
case "StartingStorageMigration":
|
||||
appState.SetModalState(ModalState.storageMigration);
|
||||
break;
|
||||
case "DoneStorageMigration":
|
||||
appState.SetModalState(ModalState.none);
|
||||
break;
|
||||
default:
|
||||
EnvironmentConfig.debugLog("unhandled event: $type");
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import 'dart:convert';
|
||||
import 'package:cwtch/config.dart';
|
||||
import 'package:cwtch/notification_manager.dart';
|
||||
import 'package:cwtch/themes/cwtch.dart';
|
||||
import 'package:cwtch/views/messageview.dart';
|
||||
import 'package:cwtch/widgets/rightshiftfixer.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -21,10 +22,10 @@ import 'models/servers.dart';
|
|||
import 'views/profilemgrview.dart';
|
||||
import 'views/splashView.dart';
|
||||
import 'dart:io' show Platform, exit;
|
||||
import 'opaque.dart';
|
||||
import 'themes/opaque.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
var globalSettings = Settings(Locale("en", ''), OpaqueDark());
|
||||
var globalSettings = Settings(Locale("en", ''), CwtchDark());
|
||||
var globalErrorHandler = ErrorHandler();
|
||||
var globalTorStatus = TorStatus();
|
||||
var globalAppState = AppState();
|
||||
|
@ -109,7 +110,7 @@ class FlwtchState extends State<Flwtch> {
|
|||
supportedLocales: AppLocalizations.supportedLocales,
|
||||
title: 'Cwtch',
|
||||
theme: mkThemeData(settings),
|
||||
home: appState.cwtchInit == true ? ShiftRightFixer(child: ProfileMgrView()) : SplashView(),
|
||||
home: (!appState.cwtchInit || appState.modalState != ModalState.none) ? SplashView() : ShiftRightFixer(child: ProfileMgrView()),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -26,8 +26,14 @@ class ChatMessage {
|
|||
};
|
||||
}
|
||||
|
||||
enum ModalState {
|
||||
none,
|
||||
storageMigration
|
||||
}
|
||||
|
||||
class AppState extends ChangeNotifier {
|
||||
bool cwtchInit = false;
|
||||
ModalState modalState = ModalState.none;
|
||||
bool cwtchIsClosing = false;
|
||||
String appError = "";
|
||||
String? _selectedProfile;
|
||||
|
@ -47,6 +53,11 @@ class AppState extends ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
void SetModalState(ModalState newState) {
|
||||
modalState = newState;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String? get selectedProfile => _selectedProfile;
|
||||
set selectedProfile(String? newVal) {
|
||||
this._selectedProfile = newVal;
|
||||
|
@ -149,6 +160,7 @@ class ContactListState extends ChangeNotifier {
|
|||
servers?.addGroup(contact);
|
||||
}
|
||||
});
|
||||
resort();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
@ -157,6 +169,7 @@ class ContactListState extends ChangeNotifier {
|
|||
if (newContact.isGroup) {
|
||||
servers?.addGroup(newContact);
|
||||
}
|
||||
resort();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
@ -164,12 +177,18 @@ class ContactListState extends ChangeNotifier {
|
|||
_contacts.sort((ContactInfoState a, ContactInfoState b) {
|
||||
// return -1 = a first in list
|
||||
// return 1 = b first in list
|
||||
|
||||
// blocked contacts last
|
||||
if (a.isBlocked == true && b.isBlocked != true) return 1;
|
||||
if (a.isBlocked != true && b.isBlocked == true) return -1;
|
||||
// archive is next...
|
||||
if (!a.isArchived && b.isArchived) return -1;
|
||||
if (a.isArchived && !b.isArchived) return 1;
|
||||
|
||||
// unapproved top
|
||||
if (a.isInvitation && !b.isInvitation) return -1;
|
||||
if (!a.isInvitation && b.isInvitation) return 1;
|
||||
|
||||
// special sorting for contacts with no messages in either history
|
||||
if (a.lastMessageTime.millisecondsSinceEpoch == 0 && b.lastMessageTime.millisecondsSinceEpoch == 0) {
|
||||
// online contacts first
|
||||
|
|
|
@ -39,11 +39,34 @@ class ServerListState extends ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
void updateServerStats(String onion, int newTotalMessages, int newConnections) {
|
||||
var server = getServer(onion);
|
||||
if (server != null) {
|
||||
server.setStats(newTotalMessages, newConnections);
|
||||
resort();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
void delete(String onion) {
|
||||
_servers.removeWhere((element) => element.onion == onion);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void resort() {
|
||||
_servers.sort((ServerInfoState a, ServerInfoState b) {
|
||||
// return -1 = a first in list
|
||||
// return 1 = b first in list
|
||||
if (a.totalMessages > b.totalMessages) {
|
||||
return -1;
|
||||
} else if (b.totalMessages > a.totalMessages) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
List<ServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
||||
|
||||
}
|
||||
|
@ -55,6 +78,8 @@ class ServerInfoState extends ChangeNotifier {
|
|||
bool running;
|
||||
bool autoStart;
|
||||
bool isEncrypted;
|
||||
int totalMessages = 0;
|
||||
int connections = 0;
|
||||
|
||||
ServerInfoState({required this.onion, required this.serverBundle, required this.running, required this.description, required this.autoStart, required this.isEncrypted});
|
||||
|
||||
|
@ -72,4 +97,10 @@ class ServerInfoState extends ChangeNotifier {
|
|||
description = val;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void setStats(int newTotalMessages, int newConnections) {
|
||||
totalMessages = newTotalMessages;
|
||||
connections = newConnections;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
|
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";
|
||||
|
@ -38,15 +39,8 @@ class Settings extends ChangeNotifier {
|
|||
bool streamerMode = false;
|
||||
String _downloadPath = "";
|
||||
|
||||
/// Set the dark theme.
|
||||
void setDark() {
|
||||
theme = OpaqueDark();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// Set the Light theme.
|
||||
void setLight() {
|
||||
theme = OpaqueLight();
|
||||
void setTheme(String themeId, String mode) {
|
||||
theme = getTheme(themeId, mode);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
@ -71,11 +65,7 @@ class Settings extends ChangeNotifier {
|
|||
/// be sent to the function and new settings will be instantiated based on the contents.
|
||||
handleUpdate(dynamic settings) {
|
||||
// Set Theme and notify listeners
|
||||
if (settings["Theme"] == "light") {
|
||||
this.setLight();
|
||||
} else {
|
||||
this.setDark();
|
||||
}
|
||||
this.setTheme(settings["Theme"], settings["ThemeMode"] ?? mode_dark);
|
||||
|
||||
// Set Locale and notify listeners
|
||||
switchLocale(Locale(settings["Locale"]));
|
||||
|
@ -254,11 +244,10 @@ class Settings extends ChangeNotifier {
|
|||
/// Convert this Settings object to a JSON representation for serialization on the
|
||||
/// event bus.
|
||||
dynamic asJson() {
|
||||
var themeString = theme.identifier();
|
||||
|
||||
return {
|
||||
"Locale": this.locale.languageCode,
|
||||
"Theme": themeString,
|
||||
"Theme": theme.theme,
|
||||
"ThemeMode": theme.mode,
|
||||
"PreviousPid": -1,
|
||||
"BlockUnknownConnections": blockUnknownConnections,
|
||||
"StreamerMode": streamerMode,
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -18,6 +18,9 @@ class TorStatus extends ChangeNotifier {
|
|||
|
||||
progress = new_progress;
|
||||
status = new_status;
|
||||
if (new_progress != 100) {
|
||||
status = "$new_progress% - $new_status";
|
||||
}
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
|
|
@ -163,7 +163,7 @@ class _AddContactViewState extends State<AddContactView> {
|
|||
}
|
||||
});
|
||||
},
|
||||
labelText: '',
|
||||
hintText: '',
|
||||
)
|
||||
])));
|
||||
}
|
||||
|
@ -197,11 +197,15 @@ class _AddContactViewState extends State<AddContactView> {
|
|||
},
|
||||
isExpanded: true, // magic property
|
||||
value: server,
|
||||
items: Provider.of<ProfileInfoState>(context).serverList.servers.map<DropdownMenuItem<String>>((RemoteServerInfoState serverInfo) {
|
||||
items: Provider.of<ProfileInfoState>(context)
|
||||
.serverList
|
||||
.servers
|
||||
.where((serverInfo) => serverInfo.status == "Synced")
|
||||
.map<DropdownMenuItem<String>>((RemoteServerInfoState serverInfo) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: serverInfo.onion,
|
||||
child: Text(
|
||||
serverInfo.onion,
|
||||
serverInfo.description,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
);
|
||||
|
@ -215,7 +219,7 @@ class _AddContactViewState extends State<AddContactView> {
|
|||
),
|
||||
CwtchTextField(
|
||||
controller: ctrlrGroupName,
|
||||
labelText: AppLocalizations.of(context)!.groupNameLabel,
|
||||
hintText: AppLocalizations.of(context)!.groupNameLabel,
|
||||
onChanged: (newValue) {},
|
||||
validator: (value) {},
|
||||
),
|
||||
|
|
|
@ -18,7 +18,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|||
import '../cwtch_icons_icons.dart';
|
||||
import '../errorHandler.dart';
|
||||
import '../main.dart';
|
||||
import '../opaque.dart';
|
||||
import '../themes/opaque.dart';
|
||||
import '../settings.dart';
|
||||
|
||||
class AddEditProfileView extends StatefulWidget {
|
||||
|
@ -93,7 +93,7 @@ class _AddEditProfileViewState extends State<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,
|
||||
)
|
||||
|
@ -106,7 +106,7 @@ 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;
|
||||
|
@ -147,13 +147,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() {
|
||||
|
@ -81,22 +80,16 @@ class _AddEditServerViewState extends State<AddEditServerView> {
|
|||
child: Form(
|
||||
key: _formKey,
|
||||
child: Container(
|
||||
margin: EdgeInsets.fromLTRB(30, 0, 30, 10),
|
||||
padding: EdgeInsets.fromLTRB(20, 0, 20, 10),
|
||||
margin: EdgeInsets.fromLTRB(30, 5, 30, 10),
|
||||
padding: EdgeInsets.fromLTRB(20, 5, 20, 10),
|
||||
child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [
|
||||
// Onion
|
||||
Visibility(
|
||||
visible: serverInfoState.onion.isNotEmpty,
|
||||
child: Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
CwtchLabel(label: AppLocalizations.of(context)!.serverAddress),
|
||||
SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
SelectableText(serverInfoState.onion)
|
||||
])),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [CwtchLabel(label: AppLocalizations.of(context)!.serverAddress), SelectableText(serverInfoState.onion)])),
|
||||
|
||||
// Description
|
||||
Column(mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
|
@ -110,7 +103,7 @@ class _AddEditServerViewState extends State<AddEditServerView> {
|
|||
),
|
||||
CwtchTextField(
|
||||
controller: ctrlrDesc,
|
||||
labelText: AppLocalizations.of(context)!.fieldDescriptionLabel,
|
||||
hintText: AppLocalizations.of(context)!.fieldDescriptionLabel,
|
||||
autofocus: false,
|
||||
)
|
||||
]),
|
||||
|
@ -123,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) {
|
||||
|
@ -134,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) {
|
||||
|
@ -151,11 +144,33 @@ 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
|
||||
Visibility(
|
||||
visible: serverInfoState.onion.isNotEmpty,
|
||||
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
SizedBox(
|
||||
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())
|
||||
]),
|
||||
])),
|
||||
|
||||
// ***** Password *****
|
||||
|
||||
// use password toggle
|
||||
|
@ -167,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),
|
||||
),
|
||||
|
@ -114,7 +114,7 @@ class _ContactsViewState extends State<ContactsView> {
|
|||
}));
|
||||
|
||||
// Manage known Servers
|
||||
if (Provider.of<Settings>(context, listen: false).isExperimentEnabled(ServerManagementExperiment)) {
|
||||
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,
|
||||
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -3,6 +3,16 @@ import 'dart:io';
|
|||
import 'package:cwtch/cwtch_icons_icons.dart';
|
||||
import 'package:cwtch/models/servers.dart';
|
||||
import 'package:cwtch/widgets/folderpicker.dart';
|
||||
import 'package:cwtch/themes/cwtch.dart';
|
||||
import 'package:cwtch/themes/ghost.dart';
|
||||
import 'package:cwtch/themes/mermaid.dart';
|
||||
import 'package:cwtch/themes/midnight.dart';
|
||||
import 'package:cwtch/themes/neon1.dart';
|
||||
import 'package:cwtch/themes/neon2.dart';
|
||||
import 'package:cwtch/themes/opaque.dart';
|
||||
import 'package:cwtch/themes/pumpkin.dart';
|
||||
import 'package:cwtch/themes/vampire.dart';
|
||||
import 'package:cwtch/themes/witch.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cwtch/settings.dart';
|
||||
|
@ -37,7 +47,7 @@ class _GlobalSettingsViewState extends State<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(
|
||||
|
@ -48,8 +58,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) {
|
||||
|
@ -65,25 +75,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) {
|
||||
|
@ -101,9 +129,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(
|
||||
|
@ -123,7 +151,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) {
|
||||
|
@ -136,12 +164,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) {
|
||||
|
@ -149,12 +177,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) {
|
||||
|
@ -166,16 +194,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) {
|
||||
|
@ -187,14 +215,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) {
|
||||
|
@ -207,12 +235,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) {
|
||||
|
@ -223,15 +251,15 @@ 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),
|
||||
),
|
||||
Visibility(
|
||||
visible: settings.isExperimentEnabled(FileSharingExperiment),
|
||||
child: Column(children: [
|
||||
SwitchListTile(
|
||||
title: Text(AppLocalizations.of(context)!.settingImagePreviews, style: TextStyle(color: settings.current().mainTextColor())),
|
||||
title: Text(AppLocalizations.of(context)!.settingImagePreviews, style: TextStyle(color: settings.current().mainTextColor)),
|
||||
subtitle: Text(AppLocalizations.of(context)!.settingImagePreviewsDescription),
|
||||
value: settings.isExperimentEnabled(ImagePreviewsExperiment),
|
||||
onChanged: (bool value) {
|
||||
|
@ -243,9 +271,9 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
|
|||
}
|
||||
saveSettings(context);
|
||||
},
|
||||
activeTrackColor: settings.theme.defaultButtonActiveColor(),
|
||||
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
|
||||
secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor()),
|
||||
activeTrackColor: settings.theme.defaultButtonActiveColor,
|
||||
inactiveTrackColor: settings.theme.defaultButtonDisabledColor,
|
||||
secondary: Icon(Icons.attach_file, color: settings.current().mainTextColor),
|
||||
),
|
||||
Visibility(
|
||||
visible: settings.isExperimentEnabled(ImagePreviewsExperiment) && !Platform.isAndroid,
|
||||
|
@ -259,7 +287,7 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
|
|||
),
|
||||
),
|
||||
SwitchListTile(
|
||||
title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks, style: TextStyle(color: settings.current().mainTextColor())),
|
||||
title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks, style: TextStyle(color: settings.current().mainTextColor)),
|
||||
subtitle: Text(AppLocalizations.of(context)!.experimentClickableLinksDescription),
|
||||
value: settings.isExperimentEnabled(ClickableLinksExperiment),
|
||||
onChanged: (bool value) {
|
||||
|
@ -270,9 +298,9 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
|
|||
}
|
||||
saveSettings(context);
|
||||
},
|
||||
activeTrackColor: settings.theme.defaultButtonActiveColor(),
|
||||
inactiveTrackColor: settings.theme.defaultButtonDisabledColor(),
|
||||
secondary: Icon(Icons.link, color: settings.current().mainTextColor()),
|
||||
activeTrackColor: settings.theme.defaultButtonActiveColor,
|
||||
inactiveTrackColor: settings.theme.defaultButtonDisabledColor,
|
||||
secondary: Icon(Icons.link, color: settings.current().mainTextColor),
|
||||
),
|
||||
]),
|
||||
),
|
||||
|
@ -285,8 +313,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)),
|
||||
)
|
||||
]),
|
||||
|
@ -334,6 +362,31 @@ String getLanguageFull(context, String languageCode) {
|
|||
return languageCode;
|
||||
}
|
||||
|
||||
/// Since we don't seem to able to dynamically pull translations, this function maps themes to their names
|
||||
String getThemeName(context, String theme) {
|
||||
switch (theme) {
|
||||
case cwtch_theme:
|
||||
return AppLocalizations.of(context)!.themeNameCwtch;
|
||||
case ghost_theme:
|
||||
return AppLocalizations.of(context)!.themeNameGhost;
|
||||
case mermaid_theme:
|
||||
return AppLocalizations.of(context)!.themeNameMermaid;
|
||||
case midnight_theme:
|
||||
return AppLocalizations.of(context)!.themeNameMidnight;
|
||||
case neon1_theme:
|
||||
return AppLocalizations.of(context)!.themeNameNeon1;
|
||||
case neon2_theme:
|
||||
return AppLocalizations.of(context)!.themeNameNeon2;
|
||||
case pumpkin_theme:
|
||||
return AppLocalizations.of(context)!.themeNamePumpkin;
|
||||
case vampire_theme:
|
||||
return AppLocalizations.of(context)!.themeNameVampire;
|
||||
case witch_theme:
|
||||
return AppLocalizations.of(context)!.themeNameWitch;
|
||||
}
|
||||
return theme;
|
||||
}
|
||||
|
||||
/// Send an UpdateGlobalSettings to the Event Bus
|
||||
saveSettings(context) {
|
||||
var settings = Provider.of<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: '',
|
||||
)
|
||||
]),
|
||||
|
||||
|
|
|
@ -106,6 +106,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),
|
||||
|
@ -122,7 +123,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,
|
||||
),
|
||||
|
@ -227,7 +228,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,
|
||||
|
@ -235,7 +236,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,
|
||||
|
@ -255,12 +256,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,
|
||||
))),
|
||||
)))),
|
||||
|
@ -280,8 +281,8 @@ class _MessageViewState extends State<MessageView> {
|
|||
margin: EdgeInsets.all(5),
|
||||
padding: EdgeInsets.all(5),
|
||||
color: message.getMetadata().senderHandle != Provider.of<AppState>(context).selectedProfile
|
||||
? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor()
|
||||
: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor(),
|
||||
? Provider.of<Settings>(context).theme.messageFromOtherBackgroundColor
|
||||
: Provider.of<Settings>(context).theme.messageFromMeBackgroundColor,
|
||||
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||
Stack(children: [
|
||||
Align(
|
||||
|
@ -315,7 +316,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,
|
||||
));
|
||||
|
|
|
@ -62,7 +62,7 @@ class _ProfileServersView extends State<ProfileServersView> {
|
|||
final importCard = Card(
|
||||
child: ListTile(
|
||||
title: Text(AppLocalizations.of(context)!.importLocalServerLabel),
|
||||
leading: Icon(CwtchIcons.add_circle_24px, color: Provider.of<Settings>(context).current().mainTextColor()),
|
||||
leading: Icon(CwtchIcons.add_circle_24px, color: Provider.of<Settings>(context).current().mainTextColor),
|
||||
trailing: DropdownButton(
|
||||
onChanged: (String? importServer) {
|
||||
if (importServer!.isNotEmpty) {
|
||||
|
|
|
@ -128,7 +128,7 @@ class _RemoteServerViewState extends State<RemoteServerView> {
|
|||
child: Column(children: [
|
||||
Text(
|
||||
group.nickname,
|
||||
style: Provider.of<FlwtchState>(context).biggerFont.apply(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor()),
|
||||
style: Provider.of<FlwtchState>(context).biggerFont.apply(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
@ -139,7 +139,7 @@ class _RemoteServerViewState extends State<RemoteServerView> {
|
|||
group.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor()),
|
||||
style: TextStyle(color: Provider.of<Settings>(context).theme.portraitOnlineBorderColor),
|
||||
)))
|
||||
]));
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ class _ServersView extends State<ServersView> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Provider.of<Settings>(context, listen: false).theme.backgroundMainColor,
|
||||
appBar: AppBar(
|
||||
title: Text(MediaQuery.of(context).size.width > 600 ? AppLocalizations.of(context)!.serversManagerTitleLong : AppLocalizations.of(context)!.serversManagerTitleShort),
|
||||
actions: getActions(),
|
||||
|
@ -77,7 +78,7 @@ class _ServersView extends State<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,
|
||||
));
|
||||
|
|
|
@ -1,11 +1,17 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import '../model.dart';
|
||||
import '../settings.dart';
|
||||
|
||||
class SplashView extends StatelessWidget {
|
||||
class SplashView extends StatefulWidget {
|
||||
@override
|
||||
_SplashViewState createState() => _SplashViewState();
|
||||
}
|
||||
|
||||
class _SplashViewState extends State<SplashView> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer<AppState>(
|
||||
|
@ -25,11 +31,24 @@ class SplashView extends StatelessWidget {
|
|||
isAntiAlias: true,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(20.0),
|
||||
child: Text(appState.appError == "" ? "Loading Cwtch..." : appState.appError,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0, color: appState.appError == "" ? Provider.of<Settings>(context).theme.mainTextColor() : Provider.of<Settings>(context).theme.textfieldErrorColor())),
|
||||
),
|
||||
padding: const EdgeInsets.all(20.0),
|
||||
child: Column(children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.all(6.0),
|
||||
child: Text(
|
||||
appState.appError != ""
|
||||
? appState.appError
|
||||
: appState.modalState == ModalState.none
|
||||
? AppLocalizations.of(context)!.loadingCwtch
|
||||
: AppLocalizations.of(context)!.storageMigrationModalMessage,
|
||||
style: TextStyle(
|
||||
fontSize: 16.0, color: appState.appError == "" ? Provider.of<Settings>(context).theme.mainTextColor : Provider.of<Settings>(context).theme.textfieldErrorColor))),
|
||||
Visibility(
|
||||
visible: appState.modalState == ModalState.storageMigration,
|
||||
child: LinearProgressIndicator(
|
||||
color: Provider.of<Settings>(context).theme.defaultButtonActiveColor,
|
||||
))
|
||||
])),
|
||||
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),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -88,8 +88,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
var wdgSender = Visibility(
|
||||
visible: widget.interactive,
|
||||
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 isPreview = false;
|
||||
var wdgMessage = !showFileSharing
|
||||
? Text(AppLocalizations.of(context)!.messageEnableFileSharing)
|
||||
|
@ -98,6 +97,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
: (fileChrome(AppLocalizations.of(context)!.messageFileOffered + ":", widget.nameSuggestion, widget.rootHash, widget.fileSize,
|
||||
Provider.of<ProfileInfoState>(context).downloadSpeed(widget.fileKey())));
|
||||
Widget wdgDecorations;
|
||||
|
||||
if (!showFileSharing) {
|
||||
wdgDecorations = Text('\u202F');
|
||||
} else if (fromMe) {
|
||||
|
@ -139,7 +139,7 @@ class FileBubbleState extends State<FileBubble> {
|
|||
visible: widget.interactive,
|
||||
child: 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) {
|
||||
|
@ -175,8 +175,8 @@ class FileBubbleState extends State<FileBubble> {
|
|||
return Container(
|
||||
constraints: constraints,
|
||||
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),
|
||||
|
@ -248,7 +248,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,
|
||||
|
@ -257,7 +257,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,
|
||||
),
|
||||
|
@ -268,7 +268,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,
|
||||
|
@ -277,7 +277,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",
|
||||
),
|
||||
|
@ -285,7 +285,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
|
||||
|
@ -296,7 +296,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,
|
||||
|
@ -305,7 +305,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,
|
||||
),
|
||||
|
@ -316,7 +316,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,
|
||||
|
@ -325,7 +325,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",
|
||||
),
|
||||
|
@ -333,13 +333,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),
|
||||
|
|
|
@ -34,7 +34,7 @@ class _RemoteServerRowState extends State<RemoteServerRow> {
|
|||
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)),
|
||||
color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor, size: 64)),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
|
@ -43,7 +43,7 @@ class _RemoteServerRowState extends State<RemoteServerRow> {
|
|||
semanticsLabel: description,
|
||||
style: Provider.of<FlwtchState>(context)
|
||||
.biggerFont
|
||||
.apply(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
.apply(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
@ -54,7 +54,7 @@ class _RemoteServerRowState extends State<RemoteServerRow> {
|
|||
server.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
style: TextStyle(color: running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
)))
|
||||
],
|
||||
)),
|
||||
|
|
|
@ -29,7 +29,7 @@ class _ServerRowState extends State<ServerRow> {
|
|||
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)),
|
||||
color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor, size: 64)),
|
||||
Expanded(
|
||||
child: Column(
|
||||
children: [
|
||||
|
@ -38,7 +38,7 @@ class _ServerRowState extends State<ServerRow> {
|
|||
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()),
|
||||
.apply(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
@ -49,7 +49,7 @@ class _ServerRowState extends State<ServerRow> {
|
|||
server.onion,
|
||||
softWrap: true,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor() : Provider.of<Settings>(context).theme.portraitOfflineBorderColor()),
|
||||
style: TextStyle(color: server.running ? Provider.of<Settings>(context).theme.portraitOnlineBorderColor : Provider.of<Settings>(context).theme.portraitOfflineBorderColor),
|
||||
)))
|
||||
],
|
||||
)),
|
||||
|
@ -58,7 +58,7 @@ class _ServerRowState extends State<ServerRow> {
|
|||
IconButton(
|
||||
enableFeedback: true,
|
||||
tooltip: AppLocalizations.of(context)!.copyServerKeys,
|
||||
icon: Icon(CwtchIcons.address_copy_2, color: Provider.of<Settings>(context).current().mainTextColor()),
|
||||
icon: Icon(CwtchIcons.address_copy_2, color: Provider.of<Settings>(context).current().mainTextColor),
|
||||
onPressed: () {
|
||||
Clipboard.setData(new ClipboardData(text: server.serverBundle));
|
||||
},
|
||||
|
@ -68,7 +68,7 @@ class _ServerRowState extends State<ServerRow> {
|
|||
IconButton(
|
||||
enableFeedback: true,
|
||||
tooltip: AppLocalizations.of(context)!.editServerTitle,
|
||||
icon: Icon(Icons.create, color: Provider.of<Settings>(context).current().mainTextColor()),
|
||||
icon: Icon(Icons.create, color: Provider.of<Settings>(context).current().mainTextColor),
|
||||
onPressed: () {
|
||||
_pushEditServer(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);
|
||||
|
|
|
@ -65,6 +65,11 @@ ShowInstDetails show
|
|||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_PAGE_FINISH
|
||||
|
||||
!insertmacro MUI_UNPAGE_WELCOME
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
!insertmacro MUI_UNPAGE_FINISH
|
||||
|
||||
; Languages --------------------------------
|
||||
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
|
@ -81,12 +86,20 @@ Section
|
|||
FILE /r "..\..\build\windows\runner\Release\"
|
||||
#FILESLISTEND
|
||||
|
||||
CreateDirectory "$SMPROGRAMS\Cwtch"
|
||||
|
||||
# create a shortcut in the start menu programs directory
|
||||
CreateDirectory "$SMPROGRAMS\Cwtch"
|
||||
CreateShortcut "$SMPROGRAMS\Cwtch\Cwtch.lnk" "$INSTDIR\cwtch.exe" "" "$INSTDIR\cwtch.ico"
|
||||
|
||||
;Store installation folder
|
||||
WriteRegStr HKCU "Software\Cwtch" "installLocation" $INSTDIR
|
||||
|
||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
||||
|
||||
SectionEnd
|
||||
|
||||
Section "Uninstall"
|
||||
RMDir /r /REBOOTOK "$INSTDIR"
|
||||
|
||||
DeleteRegKey /ifempty HKCU "Software\Cwtch\installLocation"
|
||||
SectionEnd
|