peer card batch operation

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages
2023-08-03 16:48:14 +08:00
parent bdc5cded22
commit 5a0865559c
8 changed files with 462 additions and 174 deletions

View File

@ -131,6 +131,12 @@ class AbModel {
peers.add(peer);
}
void addPeers(List<Peer> ps) {
for (var p in ps) {
addPeer(p);
}
}
void addTag(String tag) async {
if (tagContainBy(tag)) {
return;
@ -146,6 +152,14 @@ class AbModel {
it.first.tags = tags;
}
void changeTagForPeers(List<String> ids, List<dynamic> tags) {
peers.map((e) {
if (ids.contains(e.id)) {
e.tags = tags;
}
}).toList();
}
Future<void> pushAb() async {
debugPrint("pushAb");
final api = "${await bind.mainGetApiServer()}/api/ab";
@ -192,6 +206,10 @@ class AbModel {
peers.removeWhere((element) => element.id == id);
}
void deletePeers(List<String> ids) {
peers.removeWhere((e) => ids.contains(e.id));
}
void deleteTag(String tag) {
gFFI.abModel.selectedTags.remove(tag);
tags.removeWhere((element) => element == tag);

View File

@ -1,10 +1,19 @@
import 'package:flutter/material.dart';
import 'package:flutter_hbb/models/peer_model.dart';
import 'package:flutter_hbb/models/platform_model.dart';
import 'package:get/get.dart';
import '../common.dart';
import 'model.dart';
const int groupTabIndex = 4;
enum PeerTabIndex {
recent,
fav,
lan,
ab,
group,
}
const String defaultGroupTabname = 'Group';
class PeerTabModel with ChangeNotifier {
@ -26,6 +35,11 @@ class PeerTabModel with ChangeNotifier {
Icons.group,
];
List<int> get indexs => List.generate(tabNames.length, (index) => index);
List<Peer> _selectedPeers = List.empty(growable: true);
List<Peer> get selectedPeers => _selectedPeers;
bool get multiSelectionMode => _selectedPeers.isNotEmpty;
List<Peer> _currentTabCachedPeers = List.empty(growable: true);
List<Peer> get currentTabCachedPeers => _currentTabCachedPeers;
PeerTabModel(this.parent) {
// init currentTab
@ -45,7 +59,7 @@ class PeerTabModel with ChangeNotifier {
String tabTooltip(int index, String groupName) {
if (index >= 0 && index < tabNames.length) {
if (index == groupTabIndex) {
if (index == PeerTabIndex.group.index) {
if (gFFI.userModel.isAdmin.value || groupName.isEmpty) {
return translate(defaultGroupTabname);
} else {
@ -66,4 +80,39 @@ class PeerTabModel with ChangeNotifier {
assert(false);
return Icons.help;
}
togglePeerSelect(Peer peer) {
if (_selectedPeers.firstWhereOrNull((p) => p.id == peer.id) != null) {
_selectedPeers.removeWhere((p) => p.id == peer.id);
} else {
_selectedPeers.add(peer);
}
notifyListeners();
}
onPeerCardTap(Peer peer) {
if (!multiSelectionMode) return;
togglePeerSelect(peer);
}
closeSelection() {
_selectedPeers.clear();
notifyListeners();
}
setCurrentTabCachedPeers(List<Peer> peers) {
Future.delayed(Duration.zero, () {
_currentTabCachedPeers = peers;
notifyListeners();
});
}
selectAll() {
_selectedPeers = _currentTabCachedPeers.toList();
notifyListeners();
}
bool isPeerSelected(String id) {
return selectedPeers.firstWhereOrNull((p) => p.id == id) != null;
}
}

View File

@ -15,6 +15,7 @@ bool refreshingUser = false;
class UserModel {
final RxString userName = ''.obs;
final RxBool isAdmin = false.obs;
bool get isLogin => userName.isNotEmpty;
WeakReference<FFI> parent;
UserModel(this.parent);