diff options
author | uvok | 2025-07-30 20:34:54 +0200 |
---|---|---|
committer | uvok | 2025-07-30 20:34:54 +0200 |
commit | e0fb75037ae575bb0c63703299c2039bf970ad65 (patch) | |
tree | 0d259415e2bf115106ff25ebc77ff1f54d7c2284 /lib/widgets/device_scan_select.dart | |
parent | 87e1dfffd2c17ef0e3d0711394122456e9d0c7c8 (diff) |
Shuffle code around / reorder
Diffstat (limited to 'lib/widgets/device_scan_select.dart')
-rw-r--r-- | lib/widgets/device_scan_select.dart | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/widgets/device_scan_select.dart b/lib/widgets/device_scan_select.dart new file mode 100644 index 0000000..c89d3cf --- /dev/null +++ b/lib/widgets/device_scan_select.dart @@ -0,0 +1,86 @@ +// Copyright (C) 2025, uvok cheetah +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +import 'package:uvok_epaper_badge/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:uvok_epaper_badge/widgets/notifying_list_widget.dart'; + +class DeviceScanSelection extends NotifyingListWidget<Device> { + const DeviceScanSelection({ + super.key, + required super.items, + required super.onItemSelected, + }); + + @override + State<DeviceScanSelection> createState() => _DeviceScanSelectionState(); +} + +class _DeviceScanSelectionState extends State<DeviceScanSelection> { + int selectedResult = -1; + + @override + Widget build(BuildContext context) { + return Expanded( + child: ListView.separated( + itemCount: widget.items.length, + itemBuilder: (context, index) { + if (index >= widget.items.length) return null; + final Device result = widget.items[index]; + final String name = result.name ?? "???"; + + return ListTile( + title: Text(name), + subtitle: Text(result.address ?? "???"), + trailing: Text('RSSI: ${result.rssi}'), + selectedTileColor: Colors.amber, + selectedColor: Colors.black, + onTap: () { + setState(() { + selectedResult = index; + }); + widget.onItemSelected(result); + }, + selected: selectedResult == index, + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Divider(); + }, + ), + ); + } + + @override + void didUpdateWidget(covariant DeviceScanSelection oldWidget) { + super.didUpdateWidget(oldWidget); + + if (!_deviceListEqual(oldWidget.items, widget.items)) { + setState(() { + selectedResult = -1; + }); + } + } + + bool _deviceListEqual(List<Device> oldList, List<Device> newList) { + if (oldList.length != newList.length) return false; + for (int i = 0; i < oldList.length; i++) { + if (oldList[i].address != newList[i].address) { + return false; + } + } + return true; + } +} |