Merge pull request #251 from zjs81/dev-discoverScreen

Contact discovery
This commit is contained in:
zjs81
2026-03-06 11:59:24 -07:00
committed by GitHub
43 changed files with 3084 additions and 105 deletions
+13 -4
View File
@@ -9,7 +9,16 @@ class AppBarTitle extends StatelessWidget {
final String title;
final Widget? leading;
final Widget? trailing;
const AppBarTitle(this.title, {this.leading, this.trailing, super.key});
final bool indicators;
final bool subtitle;
const AppBarTitle(
this.title, {
this.leading,
this.trailing,
this.indicators = true,
this.subtitle = true,
super.key,
});
@override
Widget build(BuildContext context) {
@@ -21,12 +30,12 @@ class AppBarTitle extends StatelessWidget {
final availableWidth = constraints.hasBoundedWidth
? constraints.maxWidth
: MediaQuery.sizeOf(context).width;
final compact = availableWidth < 240;
final compact = availableWidth < 170;
final showSubtitle =
!compact && connector.isConnected && selfName != null;
!compact && connector.isConnected && selfName != null && subtitle;
final showBattery = availableWidth >= 60;
final showSnr = availableWidth >= 110;
final showIndicators = showBattery || showSnr;
final showIndicators = (showBattery || showSnr) && indicators;
return Row(
mainAxisAlignment: MainAxisAlignment.start,
+90
View File
@@ -224,3 +224,93 @@ class ContactsFilterMenu extends StatelessWidget {
);
}
}
class DiscoveryContactsFilterMenu extends StatelessWidget {
final ContactSortOption sortOption;
final ContactTypeFilter typeFilter;
final ValueChanged<ContactSortOption> onSortChanged;
final ValueChanged<ContactTypeFilter> onTypeFilterChanged;
const DiscoveryContactsFilterMenu({
super.key,
required this.sortOption,
required this.typeFilter,
required this.onSortChanged,
required this.onTypeFilterChanged,
});
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
return SortFilterMenu(
tooltip: l10n.listFilter_tooltip,
sections: [
SortFilterMenuSection(
title: l10n.listFilter_sortBy,
options: [
SortFilterMenuOption(
value: _actionSortLastSeen,
label: l10n.listFilter_heardRecently,
checked: sortOption == ContactSortOption.lastSeen,
),
SortFilterMenuOption(
value: _actionSortName,
label: l10n.listFilter_az,
checked: sortOption == ContactSortOption.name,
),
],
),
SortFilterMenuSection(
title: l10n.listFilter_filters,
options: [
SortFilterMenuOption(
value: _actionFilterAll,
label: l10n.listFilter_all,
checked: typeFilter == ContactTypeFilter.all,
),
SortFilterMenuOption(
value: _actionFilterUsers,
label: l10n.listFilter_users,
checked: typeFilter == ContactTypeFilter.users,
),
SortFilterMenuOption(
value: _actionFilterRepeaters,
label: l10n.listFilter_repeaters,
checked: typeFilter == ContactTypeFilter.repeaters,
),
SortFilterMenuOption(
value: _actionFilterRooms,
label: l10n.listFilter_roomServers,
checked: typeFilter == ContactTypeFilter.rooms,
),
],
),
],
onSelected: (action) {
switch (action) {
case _actionSortName:
onSortChanged(ContactSortOption.name);
break;
case _actionSortLastSeen:
onSortChanged(ContactSortOption.lastSeen);
break;
case _actionFilterAll:
onTypeFilterChanged(ContactTypeFilter.all);
break;
case _actionFilterUsers:
onTypeFilterChanged(ContactTypeFilter.users);
break;
case _actionFilterFavorites:
onTypeFilterChanged(ContactTypeFilter.favorites);
break;
case _actionFilterRepeaters:
onTypeFilterChanged(ContactTypeFilter.repeaters);
break;
case _actionFilterRooms:
onTypeFilterChanged(ContactTypeFilter.rooms);
break;
}
},
);
}
}