import 'dart:async'; import 'dart:collection'; import 'package:fluent_ui/fluent_ui.dart'; import 'package:get/get.dart'; import 'package:reboot_launcher/src/messenger/abstract/overlay.dart'; import 'package:reboot_launcher/src/page/abstract/page.dart'; import 'package:reboot_launcher/src/page/abstract/page_type.dart'; import 'package:reboot_launcher/src/page/implementation/backend_page.dart'; import 'package:reboot_launcher/src/page/implementation/browser_page.dart'; import 'package:reboot_launcher/src/page/implementation/host_page.dart'; import 'package:reboot_launcher/src/page/implementation/info_page.dart'; import 'package:reboot_launcher/src/page/implementation/play_page.dart'; import 'package:reboot_launcher/src/page/implementation/settings_page.dart'; import 'package:reboot_launcher/src/widget/info_bar_area.dart'; final StreamController pagesController = StreamController.broadcast(); bool hitBack = false; final List pages = [ const PlayPage(), const HostPage(), const BrowsePage(), const BackendPage(), const InfoPage(), const SettingsPage() ]; final List> _flyoutPageControllers = List.generate(pages.length, (_) => GlobalKey()); final RxInt pageIndex = RxInt(RebootPageType.play.index); final HashMap _pageKeys = HashMap(); final GlobalKey appNavigatorKey = GlobalKey(); final GlobalKey appOverlayKey = GlobalKey(); final GlobalKey infoBarAreaKey = GlobalKey(); GlobalKey get pageKey => getPageKeyByIndex(pageIndex.value); GlobalKey getPageKeyByIndex(int index) { final key = _pageKeys[index]; if(key != null) { return key; } final result = GlobalKey(); _pageKeys[index] = result; return result; } bool get hasPageButton => pages[pageIndex.value].hasButton(pageStack.lastOrNull); final Queue appStack = _createAppStack(); Queue _createAppStack() { final queue = Queue(); var lastValue = pageIndex.value; pageIndex.listen((index) { if(!hitBack && lastValue != index) { queue.add(lastValue); pagesController.add(null); } hitBack = false; lastValue = index; }); return queue; } final Map> _pagesStack = Map.fromEntries(List.generate(pages.length, (index) => MapEntry(index, Queue()))); Queue get pageStack => _pagesStack[pageIndex.value]!; void addSubPageToStack(String pageName) { final index = pageIndex.value; final identifier = "${index}_$pageName"; appStack.add(identifier); _pagesStack[index]!.add(identifier); pagesController.add(null); } GlobalKey getOverlayTargetKeyByPage(int pageIndex) => _flyoutPageControllers[pageIndex]; GlobalKey get pageOverlayTargetKey => _flyoutPageControllers[pageIndex.value];