From 1a9080dcc26617b4e066612c7266e88822d72388 Mon Sep 17 00:00:00 2001 From: kima Date: Tue, 13 Jun 2023 23:27:40 +0200 Subject: [PATCH] added event functionality and summary to livecard --- .../lib/api/providers/live_card_provider.dart | 3 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 2 + .../lib/pages/home/live_card/live_card.dart | 16 + .../home/live_card/live_card_widget.dart | 430 +++++++++++------- 6 files changed, 303 insertions(+), 153 deletions(-) diff --git a/filcnaplo/lib/api/providers/live_card_provider.dart b/filcnaplo/lib/api/providers/live_card_provider.dart index 96a3bf2..332b0da 100644 --- a/filcnaplo/lib/api/providers/live_card_provider.dart +++ b/filcnaplo/lib/api/providers/live_card_provider.dart @@ -19,7 +19,8 @@ enum LiveCardState { duringBreak, morning, afternoon, - night + night, + summary } class LiveCardProvider extends ChangeNotifier { diff --git a/filcnaplo/linux/flutter/generated_plugin_registrant.cc b/filcnaplo/linux/flutter/generated_plugin_registrant.cc index 4894d34..0fcfb27 100644 --- a/filcnaplo/linux/flutter/generated_plugin_registrant.cc +++ b/filcnaplo/linux/flutter/generated_plugin_registrant.cc @@ -7,6 +7,7 @@ #include "generated_plugin_registrant.h" #include +#include #include #include @@ -14,6 +15,9 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_acrylic_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterAcrylicPlugin"); flutter_acrylic_plugin_register_with_registrar(flutter_acrylic_registrar); diff --git a/filcnaplo/linux/flutter/generated_plugins.cmake b/filcnaplo/linux/flutter/generated_plugins.cmake index c8808fe..c5541e6 100644 --- a/filcnaplo/linux/flutter/generated_plugins.cmake +++ b/filcnaplo/linux/flutter/generated_plugins.cmake @@ -4,6 +4,7 @@ list(APPEND FLUTTER_PLUGIN_LIST dynamic_color + file_selector_linux flutter_acrylic url_launcher_linux ) diff --git a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift index c6b190d..53df988 100644 --- a/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/filcnaplo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import connectivity_plus import dynamic_color +import file_selector_macos import flutter_local_notifications import macos_window_utils import package_info_plus @@ -18,6 +19,7 @@ import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart index eb31124..aed3234 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card.dart @@ -4,6 +4,7 @@ import 'package:filcnaplo/helpers/subject.dart'; import 'package:filcnaplo/icons/filc_icons.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo_mobile_ui/pages/home/live_card/heads_up_countdown.dart'; +import 'package:filcnaplo_mobile_ui/screens/summary/summary_screen.dart'; import 'package:flutter/material.dart'; import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo/api/providers/live_card_provider.dart'; @@ -52,6 +53,21 @@ class _LiveCardState extends State { Duration bellDelay = liveCard.delay; switch (liveCard.currentState) { + case LiveCardState.summary: + child = LiveCardWidget( + key: const Key('livecard.summary'), + title: '', + icon: FeatherIcons.arrowRight, + description: Text(''), + onTap: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (BuildContext context) => const SummaryScreen( + currentPage: 'grades', + ), + ), + ), + ); + break; case LiveCardState.morning: child = LiveCardWidget( key: const Key('livecard.morning'), diff --git a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart index 78639a7..308e4e7 100755 --- a/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart +++ b/filcnaplo_mobile_ui/lib/pages/home/live_card/live_card_widget.dart @@ -9,6 +9,7 @@ enum ProgressAccuracy { minutes, seconds } class LiveCardWidget extends StatefulWidget { const LiveCardWidget({ Key? key, + this.isEvent = false, this.leading, this.title, this.titleItalic = false, @@ -22,8 +23,10 @@ class LiveCardWidget extends StatefulWidget { this.progressMax, this.progressAccuracy = ProgressAccuracy.minutes, this.onProgressTap, + this.onTap, }) : super(key: key); + final bool isEvent; final String? leading; final String? title; final bool titleItalic; @@ -37,6 +40,7 @@ class LiveCardWidget extends StatefulWidget { final double? progressMax; final ProgressAccuracy? progressAccuracy; final Function()? onProgressTap; + final Function()? onTap; @override State createState() => _LiveCardWidgetState(); @@ -51,6 +55,7 @@ class _LiveCardWidgetState extends State { onLongPressDown: (_) => setState(() => hold = true), onLongPressEnd: (_) => setState(() => hold = false), onLongPressCancel: () => setState(() => hold = false), + onTap: widget.onTap, child: AnimatedScale( scale: hold ? 1.03 : 1.0, curve: Curves.easeInOutBack, @@ -73,171 +78,292 @@ class _LiveCardWidgetState extends State { padding: const EdgeInsets.symmetric(horizontal: 6.0), child: OverflowBox( maxHeight: 96.0, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Expanded( - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, + child: widget.isEvent + ? Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - if (widget.leading != null) - Padding( - padding: const EdgeInsets.only(right: 12.0, top: 8.0), - child: Text( - widget.leading!, - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 32.0, - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary, - ), - ), - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - Row( - children: [ - if (widget.title != null) - Expanded( - child: Text.rich( - TextSpan( - children: [ - TextSpan(text: widget.title!, style: TextStyle(fontStyle: widget.titleItalic ? FontStyle.italic : null)), - if (widget.subtitle != null) - WidgetSpan( - child: Container( - margin: const EdgeInsets.only(left: 6.0, bottom: 3.0), - padding: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 2.0), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary.withOpacity(.3), - borderRadius: BorderRadius.circular(4.0), - ), - child: Text( - widget.subtitle!, - style: TextStyle( - height: 1.2, - fontSize: 14.0, - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary, - ), - ), - ), - ), - ], - ), - style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 22.0), - maxLines: 1, - softWrap: false, - overflow: TextOverflow.ellipsis, - ), - ), - if (widget.title != null) const SizedBox(width: 6.0), - if (widget.icon != null) - Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: Icon( - widget.icon, - size: 26.0, - color: AppColors.of(context).text.withOpacity(.75), - ), - ), - ], - ), - if (widget.description != null) - DefaultTextStyle( - style: Theme.of(context).textTheme.bodyMedium!.copyWith( - fontWeight: FontWeight.w500, - fontSize: 16.0, - height: 1.0, - color: AppColors.of(context).text.withOpacity(.75), - ), - maxLines: !(widget.nextSubject == null && widget.progressCurrent == null && widget.progressMax == null) ? 1 : 2, - softWrap: false, - overflow: TextOverflow.ellipsis, - child: widget.description!, - ), - ], + Text( + widget.title ?? 'Esemény', + style: TextStyle( + fontSize: 32, + fontStyle: + widget.titleItalic ? FontStyle.italic : null, ), ), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + widget.description ?? + const Text('Nincs leírás megadva.'), + SizedBox( + height: 15, + child: Container( + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(0.5), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), + ), + child: Padding( + padding: const EdgeInsets.all(4), + child: Icon(widget.icon), + ), + ), + ), + ], + ), ], - ), - ), - if (!(widget.nextSubject == null && widget.progressCurrent == null && widget.progressMax == null)) - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: Row( - children: [ - if (widget.nextSubject != null) const Icon(FeatherIcons.arrowRight, size: 12.0), - if (widget.nextSubject != null) const SizedBox(width: 4.0), - if (widget.nextSubject != null) - Expanded( - child: Text.rich( - TextSpan( + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.leading != null) + Padding( + padding: const EdgeInsets.only( + right: 12.0, top: 8.0), + child: Text( + widget.leading!, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 32.0, + fontWeight: FontWeight.w600, + color: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: + MainAxisAlignment.spaceAround, children: [ - TextSpan( - text: widget.nextSubject!, style: TextStyle(fontStyle: widget.nextSubjectItalic ? FontStyle.italic : null)), - if (widget.nextRoom != null) - WidgetSpan( - child: Container( - margin: const EdgeInsets.only(left: 4.0), - padding: const EdgeInsets.symmetric(horizontal: 3.0, vertical: 1.5), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary.withOpacity(.25), - borderRadius: BorderRadius.circular(4.0), - ), - child: Text( - widget.nextRoom!, - style: TextStyle( - height: 1.1, - fontSize: 11.0, - fontWeight: FontWeight.w600, - color: Theme.of(context).colorScheme.secondary.withOpacity(.9), + Row( + children: [ + if (widget.title != null) + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: widget.title!, + style: TextStyle( + fontStyle: widget + .titleItalic + ? FontStyle.italic + : null)), + if (widget.subtitle != null) + WidgetSpan( + child: Container( + margin: const EdgeInsets + .only( + left: 6.0, + bottom: 3.0), + padding: + const EdgeInsets + .symmetric( + horizontal: 4.0, + vertical: 2.0), + decoration: + BoxDecoration( + color: Theme.of( + context) + .colorScheme + .secondary + .withOpacity(.3), + borderRadius: + BorderRadius + .circular( + 4.0), + ), + child: Text( + widget.subtitle!, + style: TextStyle( + height: 1.2, + fontSize: 14.0, + fontWeight: + FontWeight.w600, + color: Theme.of( + context) + .colorScheme + .secondary, + ), + ), + ), + ), + ], + ), + style: const TextStyle( + fontWeight: FontWeight.w600, + fontSize: 22.0), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, ), ), - ), + if (widget.title != null) + const SizedBox(width: 6.0), + if (widget.icon != null) + Padding( + padding: const EdgeInsets.symmetric( + vertical: 4.0), + child: Icon( + widget.icon, + size: 26.0, + color: AppColors.of(context) + .text + .withOpacity(.75), + ), + ), + ], + ), + if (widget.description != null) + DefaultTextStyle( + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + fontWeight: FontWeight.w500, + fontSize: 16.0, + height: 1.0, + color: AppColors.of(context) + .text + .withOpacity(.75), + ), + maxLines: + !(widget.nextSubject == null && + widget.progressCurrent == + null && + widget.progressMax == null) + ? 1 + : 2, + softWrap: false, + overflow: TextOverflow.ellipsis, + child: widget.description!, ), ], ), - style: TextStyle( - color: AppColors.of(context).text.withOpacity(.8), - fontWeight: FontWeight.w600, - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - softWrap: false, ), - ), - if (widget.nextRoom == null && widget.nextSubject == null) const Spacer(), - if (widget.progressCurrent != null && widget.progressMax != null) - GestureDetector( - onTap: widget.onProgressTap, - child: Container( - color: Colors.transparent, - child: Text( - "remaining ${widget.progressAccuracy == ProgressAccuracy.minutes ? 'min' : 'sec'}" - .plural((widget.progressMax! - widget.progressCurrent!).round()), - maxLines: 1, - style: TextStyle( - fontWeight: FontWeight.w500, - color: AppColors.of(context).text.withOpacity(.75), + ], + ), + ), + if (!(widget.nextSubject == null && + widget.progressCurrent == null && + widget.progressMax == null)) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + children: [ + if (widget.nextSubject != null) + const Icon(FeatherIcons.arrowRight, + size: 12.0), + if (widget.nextSubject != null) + const SizedBox(width: 4.0), + if (widget.nextSubject != null) + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: widget.nextSubject!, + style: TextStyle( + fontStyle: + widget.nextSubjectItalic + ? FontStyle.italic + : null)), + if (widget.nextRoom != null) + WidgetSpan( + child: Container( + margin: const EdgeInsets.only( + left: 4.0), + padding: + const EdgeInsets.symmetric( + horizontal: 3.0, + vertical: 1.5), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.25), + borderRadius: + BorderRadius.circular( + 4.0), + ), + child: Text( + widget.nextRoom!, + style: TextStyle( + height: 1.1, + fontSize: 11.0, + fontWeight: FontWeight.w600, + color: Theme.of(context) + .colorScheme + .secondary + .withOpacity(.9), + ), + ), + ), + ), + ], + ), + style: TextStyle( + color: AppColors.of(context) + .text + .withOpacity(.8), + fontWeight: FontWeight.w600, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + softWrap: false, + ), ), - ), - ), - ) - ], - ), + if (widget.nextRoom == null && + widget.nextSubject == null) + const Spacer(), + if (widget.progressCurrent != null && + widget.progressMax != null) + GestureDetector( + onTap: widget.onProgressTap, + child: Container( + color: Colors.transparent, + child: Text( + "remaining ${widget.progressAccuracy == ProgressAccuracy.minutes ? 'min' : 'sec'}" + .plural((widget.progressMax! - + widget.progressCurrent!) + .round()), + maxLines: 1, + style: TextStyle( + fontWeight: FontWeight.w500, + color: AppColors.of(context) + .text + .withOpacity(.75), + ), + ), + ), + ) + ], + ), + ), + if (widget.progressCurrent != null && + widget.progressMax != null) + Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: ProgressBar( + value: widget.progressCurrent! / + widget.progressMax!), + ) + ], ), - if (widget.progressCurrent != null && widget.progressMax != null) - Padding( - padding: const EdgeInsets.symmetric(vertical: 4.0), - child: ProgressBar(value: widget.progressCurrent! / widget.progressMax!), - ) - ], - ), ), ), ),