From 3c6100197cedd6b2e08a3237f596aff6e25f672b Mon Sep 17 00:00:00 2001 From: uvok Date: Fri, 1 Aug 2025 14:12:03 +0200 Subject: Rewrite BadgeMotiveList widget --- .../motive_selection/badge_motive_selection.dart | 22 ++++++++ .../mock_badge_motive_selection.dart | 45 +++++++++++++++ lib/view_model/badge_motive_view_model.dart | 31 +++++++++++ lib/widgets/badge_motive_list.dart | 64 ++++++++++++++++++++++ lib/widgets/badge_template_list.dart | 49 ----------------- lib/widgets/device_details.dart | 5 +- 6 files changed, 165 insertions(+), 51 deletions(-) create mode 100644 lib/model/motive_selection/badge_motive_selection.dart create mode 100644 lib/model/motive_selection/mock_badge_motive_selection.dart create mode 100644 lib/view_model/badge_motive_view_model.dart create mode 100644 lib/widgets/badge_motive_list.dart delete mode 100644 lib/widgets/badge_template_list.dart diff --git a/lib/model/motive_selection/badge_motive_selection.dart b/lib/model/motive_selection/badge_motive_selection.dart new file mode 100644 index 0000000..b6f2b9a --- /dev/null +++ b/lib/model/motive_selection/badge_motive_selection.dart @@ -0,0 +1,22 @@ +// 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 . + +import 'package:uvok_epaper_badge/model/badge_motive.dart'; + +abstract interface class BadgeMotiveSelection { + Future getCurrentMotive(); + Future setCurrentMotive(BadgeMotive motive); + Future> getMotives(); +} diff --git a/lib/model/motive_selection/mock_badge_motive_selection.dart b/lib/model/motive_selection/mock_badge_motive_selection.dart new file mode 100644 index 0000000..6a4cff0 --- /dev/null +++ b/lib/model/motive_selection/mock_badge_motive_selection.dart @@ -0,0 +1,45 @@ +// 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 . + +import 'package:uvok_epaper_badge/model/badge_motive.dart'; +import 'package:uvok_epaper_badge/model/motive_selection/badge_motive_selection.dart'; + +class MockBadgeMotiveSelection implements BadgeMotiveSelection { + static const List templates = [ + BadgeMotive(0, "Foo"), + BadgeMotive(1, "Bar"), + BadgeMotive(2, "Baz"), + ]; + + BadgeMotive _currentMotive = templates[0]; + + @override + Future getCurrentMotive() async { + templates.add(BadgeMotive(templates.length, "foo")); + return _currentMotive; + } + + @override + Future> getMotives() { + return Future.delayed(Duration(milliseconds: 100), () => templates); + } + + @override + Future setCurrentMotive(BadgeMotive motive) async { + return await Future.delayed(Duration(milliseconds: 100), () { + _currentMotive = motive; + }); + } +} diff --git a/lib/view_model/badge_motive_view_model.dart b/lib/view_model/badge_motive_view_model.dart new file mode 100644 index 0000000..bf2a910 --- /dev/null +++ b/lib/view_model/badge_motive_view_model.dart @@ -0,0 +1,31 @@ +// 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 . + +import 'package:flutter/foundation.dart'; +import 'package:uvok_epaper_badge/model/badge_motive.dart'; +import 'package:uvok_epaper_badge/model/motive_selection/badge_motive_selection.dart'; +import 'package:uvok_epaper_badge/model/motive_selection/mock_badge_motive_selection.dart'; + +class BadgeMotiveViewModel extends ChangeNotifier { + final BadgeMotiveSelection _motivSelect = MockBadgeMotiveSelection(); + List _motives = []; + + List get motives => _motives; + + Future updateMotives() async { + _motives = await _motivSelect.getMotives(); + notifyListeners(); + } +} diff --git a/lib/widgets/badge_motive_list.dart b/lib/widgets/badge_motive_list.dart new file mode 100644 index 0000000..93e79f8 --- /dev/null +++ b/lib/widgets/badge_motive_list.dart @@ -0,0 +1,64 @@ +// 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 . + +import 'package:flutter/material.dart'; +import 'package:uvok_epaper_badge/model/badge_motive.dart'; +import 'package:uvok_epaper_badge/view_model/badge_motive_view_model.dart'; +import 'package:uvok_epaper_badge/widgets/notifying_list_widget.dart'; + +class BadgeMotiveList extends NotifyingListWidget { + final BadgeMotiveViewModel _motiveVM; + + const BadgeMotiveList({super.key, required BadgeMotiveViewModel motiveVM}) + : _motiveVM = motiveVM, + super(items: const []); + + @override + State createState() => _BadgeMotiveListState(); +} + +class _BadgeMotiveListState extends State { + @override + Widget build(BuildContext context) { + return Flexible( + fit: FlexFit.loose, + child: Column( + children: [ + ElevatedButton( + child: Text("Refresh"), + onPressed: () async => await widget._motiveVM.updateMotives(), + ), + Expanded( + child: ListenableBuilder( + listenable: widget._motiveVM, + builder: (context, child) { + return ListView.separated( + itemBuilder: (context, index) { + var item = widget._motiveVM.motives[index]; + return ListTile(title: Text(item.toString())); + }, + separatorBuilder: (context, index) { + return Divider(); + }, + itemCount: widget._motiveVM.motives.length, + ); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/badge_template_list.dart b/lib/widgets/badge_template_list.dart deleted file mode 100644 index 84cec76..0000000 --- a/lib/widgets/badge_template_list.dart +++ /dev/null @@ -1,49 +0,0 @@ -// 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 . - -import 'package:flutter/material.dart'; -import 'package:uvok_epaper_badge/model/badge_motive.dart'; -import 'package:uvok_epaper_badge/widgets/notifying_list_widget.dart'; - -class BadgeMotiveList extends NotifyingListWidget { - BadgeMotiveList({super.key, required super.items}); - - final List templates = [ - BadgeMotive(0, "Foo"), - BadgeMotive(1, "Bar"), - BadgeMotive(2, "Baz"), - ]; - - @override - State createState() => _BadgeMotiveListState(); -} - -class _BadgeMotiveListState extends State { - @override - Widget build(BuildContext context) { - return Expanded( - child: ListView.separated( - itemBuilder: (context, index) { - var item = widget.templates[index]; - return ListTile(title: Text(item.toString())); - }, - separatorBuilder: (context, index) { - return Divider(); - }, - itemCount: widget.templates.length, - ), - ); - } -} diff --git a/lib/widgets/device_details.dart b/lib/widgets/device_details.dart index 1b6ecf0..f612d96 100644 --- a/lib/widgets/device_details.dart +++ b/lib/widgets/device_details.dart @@ -19,7 +19,8 @@ import 'package:uvok_epaper_badge/model/device/device.dart'; import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; import 'package:uvok_epaper_badge/model/connection/device_connection.dart'; -import 'package:uvok_epaper_badge/widgets/badge_template_list.dart'; +import 'package:uvok_epaper_badge/view_model/badge_motive_view_model.dart'; +import 'package:uvok_epaper_badge/widgets/badge_motive_list.dart'; var logger = Logger(); @@ -71,7 +72,7 @@ class DeviceDetailsState extends State { children: [ SizedBox(height: 20), Text("Connection state: ${value.toString()}"), - BadgeMotiveList(items: []), + BadgeMotiveList(motiveVM: BadgeMotiveViewModel()), ], ); }, -- cgit v1.2.3