~emersion/goguma

2f9b06736b880f96c0a882a53efe4f116fa5e50c — Simon Ser 13 days ago fa19560 unread-filter
page/buffer_list: add unread filter
1 files changed, 45 insertions(+), 1 deletions(-)

M lib/page/buffer_list.dart
M lib/page/buffer_list.dart => lib/page/buffer_list.dart +45 -1
@@ 33,6 33,8 @@ String _initials(String name) {

class _BufferListPageState extends State<BufferListPage> {
	String? _searchQuery;
	bool _filterUnread = false;

	final TextEditingController _searchController = TextEditingController();
	final _listKey = GlobalKey();



@@ 77,7 79,9 @@ class _BufferListPageState extends State<BufferListPage> {
		}

		// Re-compute hasUnreadBuffer
		setState(() {});
		setState(() {
			_filterUnread = false;
		});
	}

	bool _shouldSuggestNewNetwork() {


@@ 103,6 107,15 @@ class _BufferListPageState extends State<BufferListPage> {
			}
			buffers = filtered;
		}
		if (_filterUnread) {
			List<BufferModel> filtered = [];
			for (var buf in buffers) {
				if (buf.unreadCount > 0) {
					filtered.add(buf);
				}
			}
			buffers = filtered;
		}

		Map<String, int> bufferNames = {};
		var hasUnreadBuffer = false;


@@ 148,6 161,7 @@ class _BufferListPageState extends State<BufferListPage> {
			}
		} else {
			body = ListView.builder(
				padding: _filterUnread ? EdgeInsets.only(top: 40) : null,
				key: _listKey,
				itemCount: buffers.length,
				itemBuilder: (context, index) {


@@ 160,6 174,30 @@ class _BufferListPageState extends State<BufferListPage> {
			);
		}

		if (_filterUnread) {
			body = Stack(fit: StackFit.expand, children: [
				body,
				Column(children: [
					Container(
						padding: const EdgeInsets.all(10),
						child: FilterChip(
							label: Wrap(children: [
								Text('Filtered by unread '),
								Icon(Icons.close, size: 18),
							]),
							selected: true,
							showCheckmark: false,
							onSelected: (value) {
								setState(() {
									_filterUnread = value;
								});
							},
						),
					),
				]),
			]);
		}

		return Scaffold(
			appBar: AppBar(
				leading: _searchQuery != null ? CloseButton() : null,


@@ 195,6 233,11 @@ class _BufferListPageState extends State<BufferListPage> {
							case 'mark-all-read':
								_markAllBuffersRead();
								break;
							case 'filter-unread':
								setState(() {
									_filterUnread = true;
								});
								break;
							case 'settings':
								Navigator.pushNamed(context, SettingsPage.routeName);
								break;


@@ 204,6 247,7 @@ class _BufferListPageState extends State<BufferListPage> {
							return [
								PopupMenuItem(child: Text('New conversation'), value: 'join'),
								if (hasUnreadBuffer) PopupMenuItem(child: Text('Mark all as read'), value: 'mark-all-read'),
								if (hasUnreadBuffer && !_filterUnread) PopupMenuItem(child: Text('Filter unread'), value: 'filter-unread'),
								PopupMenuItem(child: Text('Settings'), value: 'settings'),
							];
						},