From 04f22f0f05dedf009a13de1ce36e0181520b5bdc Mon Sep 17 00:00:00 2001 From: "nils.cc" Date: Wed, 29 Nov 2023 18:03:34 +0100 Subject: [PATCH 1/6] Move log page button to settings --- lib/pages/home.dart | 6 ------ lib/pages/settings.dart | 9 +++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 898e677..97965be 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -316,12 +316,6 @@ class _HomePageState extends State with WidgetsBindingObserver { appBar: AppBar( title: _title(), actions: [ - IconButton( - onPressed: () { - Navigator.of(context).push(LogPage.route()); - }, - icon: const Icon(Feather.info), - ), IconButton( onPressed: () { Navigator.of(context).push(SettingsPage.route()); diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 6ae0a37..82fb226 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -3,6 +3,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:weechat/pages/log.dart'; import 'package:weechat/pages/settings/config.dart'; class SettingsPage extends StatefulWidget { @@ -23,6 +24,14 @@ class _SettingsState extends State { return Scaffold( appBar: AppBar( title: Text(loc.settingsTitle), + actions: [ + IconButton( + onPressed: () { + Navigator.of(context).push(LogPage.route()); + }, + icon: const Icon(Feather.info), + ), + ], ), body: ListView( children: [ From d8e3d7296a00c4581186f2414eca2515f650714d Mon Sep 17 00:00:00 2001 From: "nils.cc" Date: Wed, 29 Nov 2023 18:10:40 +0100 Subject: [PATCH 2/6] Add (empty) end drawer for users --- lib/pages/home.dart | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 97965be..5426d1e 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -313,14 +313,32 @@ class _HomePageState extends State with WidgetsBindingObserver { _channelListDrawerChanged(_relayConnection!, isOpen); } }, + endDrawer: _userListDrawer(context), appBar: AppBar( title: _title(), actions: [ + // show users button if connected + if (cs.connected) + Builder( + builder: (context) => IconButton( + icon: const Icon(Icons.group), + onPressed: () { + final scaff = Scaffold.of(context); + if (scaff.isEndDrawerOpen) { + scaff.closeEndDrawer(); + } else { + scaff.openEndDrawer(); + } + }, + ), + ), + // settings button IconButton( - onPressed: () { - Navigator.of(context).push(SettingsPage.route()); - }, - icon: const Icon(Icons.settings)), + icon: const Icon(Icons.settings), + onPressed: () { + Navigator.of(context).push(SettingsPage.route()); + }, + ) ], ), @@ -381,6 +399,19 @@ class _HomePageState extends State with WidgetsBindingObserver { }); } + Future? _userListFuture; + + Widget? _userListDrawer(BuildContext context) { + return Drawer( + child: FutureBuilder( + future: _userListFuture, + builder: (context, snapshot) { + return Container(); + }, + ), + ); + } + Widget? _channelListDrawer(BuildContext context) { final con = RelayConnection.of(context, listen: false); if (!con.isConnected) return null; From 3c1d2fe5d83727a1bd1af8aa508094fcb1d8688d Mon Sep 17 00:00:00 2001 From: "nils.cc" Date: Wed, 29 Nov 2023 22:53:36 +0100 Subject: [PATCH 3/6] some color improvements on the channel list --- lib/widgets/home/channel_list_item.dart | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/widgets/home/channel_list_item.dart b/lib/widgets/home/channel_list_item.dart index 7f55b76..c7b1d0c 100644 --- a/lib/widgets/home/channel_list_item.dart +++ b/lib/widgets/home/channel_list_item.dart @@ -24,12 +24,11 @@ class ChannelListItem extends StatelessWidget { ); @override - Widget build(BuildContext context, - { + Widget build( + BuildContext context, { RelayHotlistEntry? hotlist, Future Function(BuildContext)? openBuffer, }) { - final theme = Theme.of(context); var titleColor = theme.disabledColor; @@ -37,13 +36,13 @@ class ChannelListItem extends StatelessWidget { switch (hotlist?.priority) { case 0: // GUI_HOTLIST_LOW - titleColor = theme.colorScheme.inverseSurface.withAlpha(200); + titleColor = theme.colorScheme.onSurface.withAlpha(180); break; case 1: // GUI_HOTLIST_MESSAGE - titleColor = theme.colorScheme.secondary; + titleColor = theme.colorScheme.onSurface; break; case 2: // GUI_HOTLIST_PRIVATE - titleColor = theme.colorScheme.secondary; + titleColor = theme.colorScheme.onSurface; break; case 3: // GUI_HOTLIST_HIGHLIGHT titleColor = theme.colorScheme.primary; From 0969d1754d724753ef6aa3d8de03fca547f5a522 Mon Sep 17 00:00:00 2001 From: "nils.cc" Date: Wed, 29 Nov 2023 23:28:26 +0100 Subject: [PATCH 4/6] Add nicklist module --- lib/pages/home.dart | 46 ++++++++++++++++++------------ lib/relay/nicklist.dart | 28 ++++++++++++++++++ lib/widgets/channel/user_list.dart | 38 ++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 lib/relay/nicklist.dart create mode 100644 lib/widgets/channel/user_list.dart diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 5426d1e..5609311 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -5,8 +5,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_font_icons/flutter_font_icons.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; +import 'package:weechat/relay/nicklist.dart'; +import 'package:weechat/widgets/channel/user_list.dart'; import 'package:weechat/widgets/home/channel_list_item.dart'; -import 'package:weechat/pages/log.dart'; import 'package:weechat/pages/log/event_logger.dart'; import 'package:weechat/pages/settings.dart'; import 'package:weechat/pages/settings/config.dart'; @@ -322,14 +323,7 @@ class _HomePageState extends State with WidgetsBindingObserver { Builder( builder: (context) => IconButton( icon: const Icon(Icons.group), - onPressed: () { - final scaff = Scaffold.of(context); - if (scaff.isEndDrawerOpen) { - scaff.closeEndDrawer(); - } else { - scaff.openEndDrawer(); - } - }, + onPressed: () => _toggleUserList(context), ), ), // settings button @@ -399,17 +393,31 @@ class _HomePageState extends State with WidgetsBindingObserver { }); } - Future? _userListFuture; - Widget? _userListDrawer(BuildContext context) { - return Drawer( - child: FutureBuilder( - future: _userListFuture, - builder: (context, snapshot) { - return Container(); - }, - ), - ); + if (_relayBuffer != null) { + return Drawer( + child: UserListWidget( + nicklist: RelayBufferNicklist( + bufferId: _relayBuffer!.bufferPointer, + connection: _relayBuffer!.relayConnection, + ), + key: ValueKey( + "UserListWidget(buffer: ${_relayBuffer!.bufferPointer})", + ), + ), + ); + } else { + return const Drawer(); + } + } + + void _toggleUserList(BuildContext context) { + final scaff = Scaffold.of(context); + if (scaff.isEndDrawerOpen) { + scaff.closeEndDrawer(); + } else { + scaff.openEndDrawer(); + } } Widget? _channelListDrawer(BuildContext context) { diff --git a/lib/relay/nicklist.dart b/lib/relay/nicklist.dart new file mode 100644 index 0000000..abbaf78 --- /dev/null +++ b/lib/relay/nicklist.dart @@ -0,0 +1,28 @@ +import 'package:weechat/relay/connection.dart'; +import 'package:weechat/relay/protocol/message_body.dart'; + +class NicklistData {} + +class RelayBufferNicklist { + final RelayConnection connection; + final String bufferId; + + RelayBufferNicklist({ + required this.connection, + required this.bufferId, + }); + + Map> get groups => Map.unmodifiable(_groups); + final Map> _groups = {}; + + Future load() async { + await connection.command( + "nicklist $bufferId", + callback: (RelayMessageBody body) { + for (final o in body.objects()) { + print(o); // TODO: sort objects into _groups + } + }, + ); + } +} diff --git a/lib/widgets/channel/user_list.dart b/lib/widgets/channel/user_list.dart new file mode 100644 index 0000000..a636255 --- /dev/null +++ b/lib/widgets/channel/user_list.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:weechat/relay/nicklist.dart'; + +class UserListWidget extends StatefulWidget { + final RelayBufferNicklist nicklist; + + const UserListWidget({ + required this.nicklist, + super.key, + }); + + @override + State createState() { + return _State(); + } +} + +Future? _request; + +class _State extends State { + RelayBufferNicklist get nicklist => widget.nicklist; + + _State(); + + @override + Widget build(BuildContext context) { + // request nicklist from server + _request ??= nicklist.load(); + + return FutureBuilder( + future: _request, + builder: (context, snapshot) { + return ListView( + children: const [], + ); + }); + } +} From f615d09f918d57d783b6589d8106efaa8697d502 Mon Sep 17 00:00:00 2001 From: "nils.cc" Date: Sat, 2 Dec 2023 19:42:43 +0100 Subject: [PATCH 5/6] WIP --- lib/pages/home.dart | 7 +----- lib/relay/nicklist.dart | 37 ++++++++++++++++++++++++++---- lib/widgets/channel/user_list.dart | 25 +++++++++++++++++--- 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 5609311..b460aa9 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -109,10 +109,8 @@ class _HomePageState extends State with WidgetsBindingObserver { return _suspend(); } case AppLifecycleState.detached: - { - break; - } case AppLifecycleState.inactive: + case AppLifecycleState.hidden: { break; } @@ -401,9 +399,6 @@ class _HomePageState extends State with WidgetsBindingObserver { bufferId: _relayBuffer!.bufferPointer, connection: _relayBuffer!.relayConnection, ), - key: ValueKey( - "UserListWidget(buffer: ${_relayBuffer!.bufferPointer})", - ), ), ); } else { diff --git a/lib/relay/nicklist.dart b/lib/relay/nicklist.dart index abbaf78..00c74de 100644 --- a/lib/relay/nicklist.dart +++ b/lib/relay/nicklist.dart @@ -1,7 +1,19 @@ import 'package:weechat/relay/connection.dart'; import 'package:weechat/relay/protocol/message_body.dart'; -class NicklistData {} +class NicklistData { + final String name; + final String color; + final String prefix; + final String prefix_color; + + NicklistData({ + required this.name, + required this.color, + required this.prefix, + required this.prefix_color, + }); +} class RelayBufferNicklist { final RelayConnection connection; @@ -15,13 +27,28 @@ class RelayBufferNicklist { Map> get groups => Map.unmodifiable(_groups); final Map> _groups = {}; - Future load() async { - await connection.command( + Future?> load() async { + return await connection.command( "nicklist $bufferId", callback: (RelayMessageBody body) { - for (final o in body.objects()) { - print(o); // TODO: sort objects into _groups + final lst = []; + for (final hdata in body.objects()) { + for (final obj in hdata.objects) { + print(obj); + // sort objects into _groups + if (obj.values[0] == "\x01") { + continue; + } else { + lst.add(NicklistData( + name: obj.values[3], + color: obj.values[4], + prefix: obj.values[5], + prefix_color: obj.values[6], + )); + } + } } + return lst; }, ); } diff --git a/lib/widgets/channel/user_list.dart b/lib/widgets/channel/user_list.dart index a636255..84caace 100644 --- a/lib/widgets/channel/user_list.dart +++ b/lib/widgets/channel/user_list.dart @@ -30,9 +30,28 @@ class _State extends State { return FutureBuilder( future: _request, builder: (context, snapshot) { - return ListView( - children: const [], - ); + if (!snapshot.hasData) { + return _loading(); + } else if (snapshot.data == null) { + return _failed(); + } else { + return _userList(context, snapshot.data!); + } }); } + + Widget _loading() => Container(); + Widget _failed() => Container(); + + Widget _userList(BuildContext context, List nicks) { + return ListView( + children: nicks.map((nick) => _userWidget(context, nick)).toList(), + ); + } + + Widget _userWidget(BuildContext context, NicklistData nick) { + return ListTile( + title: Text("${nick.prefix}${nick.name}"), + ); + } } From 29a5d721e9b6f7c056fe14b333f851c50c02e5ea Mon Sep 17 00:00:00 2001 From: "nils.cc" Date: Tue, 19 Dec 2023 08:44:39 +0100 Subject: [PATCH 6/6] update macos --- macos/Flutter/ephemeral/Flutter-Generated.xcconfig | 4 ++-- macos/Flutter/ephemeral/flutter_export_environment.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig index 0ec055c..da89a19 100644 --- a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -3,8 +3,8 @@ FLUTTER_ROOT=E:\dev\flutter FLUTTER_APPLICATION_PATH=E:\dev\weechat COCOAPODS_PARALLEL_CODE_SIGN=true FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=1.24.10 -FLUTTER_BUILD_NUMBER=16 +FLUTTER_BUILD_NAME=1.24.12 +FLUTTER_BUILD_NUMBER=18 DART_OBFUSCATION=false TRACK_WIDGET_CREATION=true TREE_SHAKE_ICONS=false diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh index 9e9e935..edde0b5 100644 --- a/macos/Flutter/ephemeral/flutter_export_environment.sh +++ b/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -4,8 +4,8 @@ export "FLUTTER_ROOT=E:\dev\flutter" export "FLUTTER_APPLICATION_PATH=E:\dev\weechat" export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=1.24.10" -export "FLUTTER_BUILD_NUMBER=16" +export "FLUTTER_BUILD_NAME=1.24.12" +export "FLUTTER_BUILD_NUMBER=18" export "DART_OBFUSCATION=false" export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false"