From 1eaec8b00a03c66037c1af4afb1d1984b6e98d29 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Thu, 3 Jun 2021 11:32:25 -0700 Subject: [PATCH] Custom Icons + Small Fixes --- assets/fonts/CwtchIcons.ttf | Bin 0 -> 18488 bytes lib/config.dart | 2 +- lib/cwtch_icons_icons.dart | 105 ++++++++++++++++++++++++++++++ lib/model.dart | 23 +++++-- lib/views/addcontactview.dart | 7 +- lib/views/addeditprofileview.dart | 3 +- lib/views/contactsview.dart | 3 +- lib/views/globalsettingsview.dart | 19 ++++-- lib/views/groupsettingsview.dart | 5 +- lib/views/messageview.dart | 5 +- lib/views/peersettingsview.dart | 7 +- lib/views/profilemgrview.dart | 9 ++- lib/widgets/invitationbubble.dart | 2 - lib/widgets/malformedbubble.dart | 19 ++---- lib/widgets/messagerow.dart | 2 +- lib/widgets/passwordfield.dart | 5 +- lib/widgets/textfield.dart | 4 +- lib/widgets/tor_icon.dart | 10 +-- pubspec.yaml | 5 ++ 19 files changed, 183 insertions(+), 52 deletions(-) create mode 100644 assets/fonts/CwtchIcons.ttf create mode 100644 lib/cwtch_icons_icons.dart diff --git a/assets/fonts/CwtchIcons.ttf b/assets/fonts/CwtchIcons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a2dd204283366254a2e49ada78961c0d12922983 GIT binary patch literal 18488 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 this._timestamp; bool get ackd => this._ackd; bool get error => this._error; - get malformed => this._malformed; + bool get malformed => this._malformed; + bool get loaded => this._loaded; get senderOnion => this._senderOnion; get senderImage => this._senderImage; - get loaded => this._loaded; get signature => this._signature; get isInvite => this.overlay == 100 || this.overlay == 101; get inviteTarget => this._inviteTarget; @@ -423,13 +423,22 @@ class MessageState extends ChangeNotifier { notifyListeners(); } + set malformed(bool newVal) { + this._malformed = newVal; + notifyListeners(); + } + + set loaded(bool newVal) { + this._loaded = newVal; + notifyListeners(); + } + void tryLoad(BuildContext context) { Provider.of(context, listen: false).cwtch.GetMessage(profileOnion, contactHandle, messageIndex).then((jsonMessage) { try { dynamic messageWrapper = jsonDecode(jsonMessage); if (messageWrapper['Message'] == null || messageWrapper['Message'] == '' || messageWrapper['Message'] == '{}') { this._senderOnion = profileOnion; - //todo: remove once sent group messages are prestored Future.delayed(const Duration(milliseconds: 2), () { tryLoad(context); }); @@ -463,7 +472,7 @@ class MessageState extends ChangeNotifier { } } - this._loaded = true; + this.loaded = true; //update ackd and error last as they are changenotified this.ackd = messageWrapper['Acknowledged']; @@ -471,7 +480,9 @@ class MessageState extends ChangeNotifier { this.error = true; } } catch (e) { - this._malformed = true; + this._overlay = -1; + this.loaded = true; + this.malformed = true; } }); } diff --git a/lib/views/addcontactview.dart b/lib/views/addcontactview.dart index 2ab248c..6446aca 100644 --- a/lib/views/addcontactview.dart +++ b/lib/views/addcontactview.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:cwtch/errorHandler.dart'; @@ -80,7 +81,7 @@ class _AddContactViewState extends State { return TabBar( tabs: [ Tab( - icon: Icon(Icons.person_add_rounded), + icon: Icon(CwtchIcons.add_peer), text: AppLocalizations.of(context)!.addPeer, ), ], @@ -92,11 +93,11 @@ class _AddContactViewState extends State { return TabBar( tabs: [ Tab( - icon: Icon(Icons.person_add_rounded), + icon: Icon(CwtchIcons.add_peer), text: AppLocalizations.of(context)!.tooltipAddContact, ), //Tab(icon: Icon(Icons.backup), text: AppLocalizations.of(context)!.titleManageServers), - Tab(icon: Icon(Icons.group), text: AppLocalizations.of(context)!.createGroup), + Tab(icon: Icon(CwtchIcons.add_group), text: AppLocalizations.of(context)!.createGroup), ], ); } diff --git a/lib/views/addeditprofileview.dart b/lib/views/addeditprofileview.dart index b991c41..c27308c 100644 --- a/lib/views/addeditprofileview.dart +++ b/lib/views/addeditprofileview.dart @@ -99,6 +99,7 @@ class _AddEditProfileViewState extends State { ), CwtchTextField( controller: ctrlrNick, + autofocus: true, labelText: AppLocalizations.of(context)!.yourDisplayName, validator: (value) { if (value.isEmpty) { @@ -167,7 +168,7 @@ class _AddEditProfileViewState extends State { height: 20, ), ])), - CwtchLabel(label: AppLocalizations.of(context)!.password1Label), + CwtchLabel(label: AppLocalizations.of(context)!.newPassword), SizedBox( height: 20, ), diff --git a/lib/views/contactsview.dart b/lib/views/contactsview.dart index 1c5c077..d52709b 100644 --- a/lib/views/contactsview.dart +++ b/lib/views/contactsview.dart @@ -1,3 +1,4 @@ +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/material.dart'; import 'package:cwtch/views/torstatusview.dart'; import 'package:cwtch/widgets/contactrow.dart'; @@ -66,7 +67,7 @@ class _ContactsViewState extends State { floatingActionButton: FloatingActionButton( onPressed: _pushAddContact, tooltip: AppLocalizations.of(context)!.tooltipAddContact, - child: const Icon(Icons.person_add_sharp), + child: const Icon(CwtchIcons.person_add_alt_1_24px), ), body: showSearchBar || Provider.of(context).isFiltered ? _buildFilterable() : _buildContactList()); } diff --git a/lib/views/globalsettingsview.dart b/lib/views/globalsettingsview.dart index b776d77..1e8caf7 100644 --- a/lib/views/globalsettingsview.dart +++ b/lib/views/globalsettingsview.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:flutter/material.dart'; import 'package:cwtch/opaque.dart'; @@ -46,7 +47,7 @@ class _GlobalSettingsViewState extends State { child: Column(children: [ ListTile( title: Text(AppLocalizations.of(context)!.settingLanguage, style: TextStyle(color: settings.current().mainTextColor())), - leading: Icon(Icons.language, color: settings.current().mainTextColor()), + leading: Icon(CwtchIcons.change_language, color: settings.current().mainTextColor()), trailing: DropdownButton( value: Provider.of(context).locale.languageCode, onChanged: (String? newValue) { @@ -74,7 +75,9 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - secondary: Icon(Icons.lightbulb_outline, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor(), + inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), + secondary: Icon(CwtchIcons.change_theme, color: settings.current().mainTextColor()), ), ListTile( title: Text(/*AppLocalizations.of(context)!.settingLanguage*/ "UI Columns", style: TextStyle(color: settings.current().mainTextColor())), @@ -111,7 +114,9 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - secondary: Icon(Icons.app_blocking, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor(), + inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), + secondary: Icon(CwtchIcons.block_unknown, color: settings.current().mainTextColor()), ), SwitchListTile( title: Text(AppLocalizations.of(context)!.experimentsEnabled, style: TextStyle(color: settings.current().mainTextColor())), @@ -126,7 +131,9 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - secondary: Icon(Icons.science, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor(), + inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), + secondary: Icon(CwtchIcons.enable_experiments, color: settings.current().mainTextColor()), ), Visibility( visible: settings.experimentsEnabled, @@ -145,7 +152,9 @@ class _GlobalSettingsViewState extends State { // Save Settings... saveSettings(context); }, - secondary: Icon(Icons.group_sharp, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor(), + inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), + secondary: Icon(CwtchIcons.enable_groups, color: settings.current().mainTextColor()), ), ], )), diff --git a/lib/views/groupsettingsview.dart b/lib/views/groupsettingsview.dart index c4efe5d..422138e 100644 --- a/lib/views/groupsettingsview.dart +++ b/lib/views/groupsettingsview.dart @@ -1,3 +1,4 @@ +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/services.dart'; import 'package:cwtch/model.dart'; import 'package:cwtch/widgets/buttontextfield.dart'; @@ -135,12 +136,12 @@ class _GroupSettingsViewState extends State { height: 20, ), Tooltip( - message: AppLocalizations.of(context)!.rejectGroupBtn, + message: AppLocalizations.of(context)!.leaveGroup, child: ElevatedButton.icon( onPressed: () { showAlertDialog(context); }, - icon: Icon(Icons.delete), + icon: Icon(CwtchIcons.delete_24px), label: Text(AppLocalizations.of(context)!.leaveGroup), )) ]) diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index 1955481..04e4e99 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:cwtch/views/peersettingsview.dart'; @@ -49,7 +50,7 @@ class _MessageViewState extends State { //IconButton(icon: Icon(Icons.chat), onPressed: _pushContactSettings), //IconButton(icon: Icon(Icons.list), onPressed: _pushContactSettings), //IconButton(icon: Icon(Icons.push_pin), onPressed: _pushContactSettings), - IconButton(icon: Icon(Icons.settings), tooltip: AppLocalizations.of(context)!.conversationSettings, onPressed: _pushContactSettings), + IconButton(icon: Provider.of(context, listen: false).isGroup == true ? Icon(CwtchIcons.group_settings_24px) : Icon(CwtchIcons.peer_settings_24px), tooltip: AppLocalizations.of(context)!.conversationSettings, onPressed: _pushContactSettings), ], ), body: Padding(padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 108.0), child: MessageList()), @@ -138,7 +139,7 @@ class _MessageViewState extends State { tooltip: "Send a contact or group invite", onPressed: () => _modalSendInvitation(context)), suffixIcon: IconButton( - icon: Icon(Icons.send, size: 24, color: Provider.of(context).theme.mainTextColor()), + icon: Icon(CwtchIcons.send_24px, size: 24, color: Provider.of(context).theme.mainTextColor()), tooltip: "Send Message", onPressed: _sendMessage, ), diff --git a/lib/views/peersettingsview.dart b/lib/views/peersettingsview.dart index ca9b5d4..7bd3cb3 100644 --- a/lib/views/peersettingsview.dart +++ b/lib/views/peersettingsview.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/services.dart'; import 'package:cwtch/model.dart'; import 'package:cwtch/widgets/buttontextfield.dart'; @@ -138,12 +139,14 @@ class _PeerSettingsViewState extends State { Provider.of(context, listen: false).cwtch.SendProfileEvent(profileOnion, setPeerAttributeJson); } }, - secondary: Icon(Icons.block, color: settings.current().mainTextColor()), + activeTrackColor: settings.theme.defaultButtonActiveColor(), + inactiveTrackColor: settings.theme.defaultButtonDisabledColor(), + secondary: Icon(CwtchIcons.block_peer, color: settings.current().mainTextColor()), ), ListTile( title: Text(AppLocalizations.of(context)!.savePeerHistory, style: TextStyle(color: settings.current().mainTextColor())), subtitle: Text(AppLocalizations.of(context)!.savePeerHistoryDescription), - leading: Icon(Icons.history_sharp, color: settings.current().mainTextColor()), + leading: Icon(CwtchIcons.peer_history, color: settings.current().mainTextColor()), trailing: DropdownButton( value: Provider.of(context).savePeerHistory == "DefaultDeleteHistory" ? AppLocalizations.of(context)!.dontSavePeerHistory diff --git a/lib/views/profilemgrview.dart b/lib/views/profilemgrview.dart index 65ffdce..2b977d6 100644 --- a/lib/views/profilemgrview.dart +++ b/lib/views/profilemgrview.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/material.dart'; import 'package:cwtch/settings.dart'; import 'package:cwtch/views/torstatusview.dart'; @@ -11,6 +12,7 @@ import 'package:provider/provider.dart'; import '../main.dart'; import '../model.dart'; import '../opaque.dart'; +import '../torstatus.dart'; import 'addeditprofileview.dart'; import 'globalsettingsview.dart'; @@ -57,10 +59,13 @@ class _ProfileMgrViewState extends State { Expanded(child: Text(AppLocalizations.of(context)!.titleManageProfiles, style: TextStyle(color: settings.current().mainTextColor()))) ]), actions: [ - IconButton(icon: TorIcon(), onPressed: _pushTorStatus), + IconButton(icon: TorIcon(), onPressed: _pushTorStatus, tooltip: Provider.of(context).progress == 100 + ? AppLocalizations.of(context)!.networkStatusOnline + : (Provider.of(context).progress == 0 ? AppLocalizations.of(context)!.networkStatusDisconnected : AppLocalizations.of(context)!.networkStatusAttemptingTor), + ), IconButton(icon: Icon(Icons.bug_report_outlined), onPressed: _setLoggingLevelDebug), IconButton( - icon: Icon(Icons.lock_open), + icon: Icon(CwtchIcons.lock_open_24px), tooltip: AppLocalizations.of(context)!.tooltipUnlockProfiles, onPressed: _modalUnlockProfiles, ), diff --git a/lib/widgets/invitationbubble.dart b/lib/widgets/invitationbubble.dart index 0187b15..00f6094 100644 --- a/lib/widgets/invitationbubble.dart +++ b/lib/widgets/invitationbubble.dart @@ -133,7 +133,6 @@ class InvitationBubbleState extends State { child: Row(children: [ SelectableText( chrome, - key: Key(myKey), focusNode: _focus, style: TextStyle( color: Provider.of(context).theme.messageFromMeTextColor(), @@ -161,7 +160,6 @@ class InvitationBubbleState extends State { child: Row(children: [ SelectableText( chrome, - key: Key(myKey), focusNode: _focus, style: TextStyle( color: Provider.of(context).theme.messageFromOtherTextColor(), diff --git a/lib/widgets/malformedbubble.dart b/lib/widgets/malformedbubble.dart index cc8bfcd..8c1339a 100644 --- a/lib/widgets/malformedbubble.dart +++ b/lib/widgets/malformedbubble.dart @@ -1,10 +1,6 @@ -import 'dart:convert'; -import 'dart:ffi'; - +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import '../settings.dart'; final Color malformedColor = Color(0xFFE85DA1); @@ -40,15 +36,10 @@ class MalformedBubbleState extends State { widthFactor: 1, child: Padding( padding: EdgeInsets.all(4), - child: Image( - image: AssetImage("assets/core/broken_heart_24.png"), - filterQuality: FilterQuality.medium, - // We need some theme specific blending here...we might want to consider making this a theme level attribute - colorBlendMode: BlendMode.srcIn, - color: Provider.of(context).theme.mainTextColor(), - isAntiAlias: false, - width: 32, - height: 32))), + child: Icon( + CwtchIcons.favorite_black_24dp_broken, + size: 24, + ))), Center( widthFactor: 1.0, child: Column( diff --git a/lib/widgets/messagerow.dart b/lib/widgets/messagerow.dart index 764ad5a..9c30359 100644 --- a/lib/widgets/messagerow.dart +++ b/lib/widgets/messagerow.dart @@ -34,7 +34,7 @@ class _MessageRowState extends State { Widget wdgBubble = Flexible( flex: 3, fit: FlexFit.loose, - child: malformed ? MalformedBubble() : (Provider.of(context).loaded == true ? widgetForOverlay(Provider.of(context).overlay) : MessageLoadingBubble())); + child: Provider.of(context).loaded == true ? widgetForOverlay(Provider.of(context).overlay) : MessageLoadingBubble()); Widget wdgIcons = Icon(Icons.delete_forever_outlined, color: Provider.of(context).theme.dropShadowColor()); Widget wdgSpacer = Expanded(child: SizedBox(width: 60, height: 10)); var widgetRow = []; diff --git a/lib/widgets/passwordfield.dart b/lib/widgets/passwordfield.dart index 7b8804d..5b095a0 100644 --- a/lib/widgets/passwordfield.dart +++ b/lib/widgets/passwordfield.dart @@ -1,3 +1,4 @@ +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../settings.dart'; @@ -5,7 +6,7 @@ import '../settings.dart'; // Provides a styled Password Input Field for use in Form Widgets. // Callers must provide a text controller, label helper text and a validator. class CwtchPasswordField extends StatefulWidget { - CwtchPasswordField({required this.controller, required this.validator, this.action, this.autofocus = true}); + CwtchPasswordField({required this.controller, required this.validator, this.action, this.autofocus = false}); final TextEditingController controller; final FormFieldValidator validator; final Function(String)? action; @@ -43,7 +44,7 @@ class _CwtchTextFieldState extends State { obscureText = !obscureText; }); }, - icon: Icon((obscureText ? Icons.remove_red_eye : Icons.remove_red_eye_outlined), semanticLabel: label), + icon: Icon((obscureText ? CwtchIcons.eye_closed : CwtchIcons.eye_open), semanticLabel: label), tooltip: label, color: theme.current().mainTextColor(), highlightColor: theme.current().defaultButtonColor(), diff --git a/lib/widgets/textfield.dart b/lib/widgets/textfield.dart index 4addae7..4b68593 100644 --- a/lib/widgets/textfield.dart +++ b/lib/widgets/textfield.dart @@ -7,11 +7,12 @@ 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 = null, this.onChanged = doNothing}); + CwtchTextField({required this.controller, required this.labelText, this.validator = null, this.autofocus=false, this.onChanged = doNothing}); final TextEditingController controller; final String labelText; final FormFieldValidator? validator; final Function(String) onChanged; + final bool autofocus; @override _CwtchTextFieldState createState() => _CwtchTextFieldState(); @@ -25,6 +26,7 @@ class _CwtchTextFieldState extends State { controller: widget.controller, validator: widget.validator, onChanged: widget.onChanged, + autofocus: widget.autofocus, decoration: InputDecoration( labelText: widget.labelText, labelStyle: TextStyle(color: theme.current().mainTextColor(), backgroundColor: theme.current().textfieldBackgroundColor()), diff --git a/lib/widgets/tor_icon.dart b/lib/widgets/tor_icon.dart index eb0c2bf..8ebf1ad 100644 --- a/lib/widgets/tor_icon.dart +++ b/lib/widgets/tor_icon.dart @@ -1,3 +1,4 @@ +import 'package:cwtch/cwtch_icons_icons.dart'; import 'package:flutter/cupertino.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -16,14 +17,9 @@ class _TorIconState extends State { @override Widget build(BuildContext context) { return RepaintBoundary( - child: Image( - image: AssetImage(Provider.of(context).progress == 0 - ? "assets/core/Tor_OFF.png" - : (Provider.of(context).progress == 100 ? "assets/core/Tor_icon.png" : "assets/core/Tor_Booting_up.png")), - // Color the onion per the text color... + child: Icon(Provider.of(context).progress == 0 ? CwtchIcons.onion_off : (Provider.of(context).progress == 100 ? CwtchIcons.onion_on: CwtchIcons.onion_waiting), color: Provider.of(context).theme.mainTextColor(), - colorBlendMode: BlendMode.srcIn, - semanticLabel: Provider.of(context).progress == 100 + semanticLabel: Provider.of(context).progress == 100 ? AppLocalizations.of(context)!.networkStatusOnline : (Provider.of(context).progress == 0 ? AppLocalizations.of(context)!.networkStatusDisconnected : AppLocalizations.of(context)!.networkStatusAttemptingTor), )); diff --git a/pubspec.yaml b/pubspec.yaml index 34fc3c2..3bcc763 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -95,6 +95,11 @@ flutter: - assets/profiles/ - assets/servers/ + fonts: + - family: CwtchIcons + fonts: + - asset: assets/fonts/CwtchIcons.ttf + # To add custom fonts to your application, add a fonts section here, # in this "flutter" section. Each entry in this list should have a # "family" key with the font family name, and a "fonts" key with a