diff --git a/readme.md b/readme.md index 11d5cf0..ae1e11d 100644 --- a/readme.md +++ b/readme.md @@ -5,4 +5,11 @@ Un simple overlay pour Sea of Thieves ## Fonctionnalités - Permet de savoir le temps pour cuire un aliment -- Permet de montrer ce que vous faites sur le jeu avec la compatibilité Rich Presence de Discord \ No newline at end of file +- Permet de montrer ce que vous faites sur le jeu avec la compatibilité Rich Presence de Discord +- Permet de voir les différents sites proposant des cartes de Sea of Thieves (rarethief et merfolk's lullaby) + +## Crédits + +L'overlay utilise les sites suivants pour le module "map" : +- https://www.merfolkslullaby.com/ +- https://maps.seaofthieves.rarethief.com/ diff --git a/sot_companion/lib/class/module.dart b/sot_companion/lib/class/module.dart index 2da5f3d..7818f9a 100644 --- a/sot_companion/lib/class/module.dart +++ b/sot_companion/lib/class/module.dart @@ -1,22 +1,31 @@ import 'package:flutter/widgets.dart'; import 'package:sot_companion/modules/cook_time/pages/food_page.dart'; import 'package:sot_companion/modules/discord_rpc/pages/rpc.dart'; +import 'package:sot_companion/modules/maps/pages/map.dart'; class Module { String name; String image; - Widget mainPage; + Size size; + StatefulWidget mainPage; - Module(this.name, this.image, this.mainPage); + Module(this.name, this.image, this.size, this.mainPage); static List moduleList = [ Module( "Cuisine", "https://static.wikia.nocookie.net/seaofthieves_gamepedia/images/c/c6/Food.png/revision/latest/scale-to-width-down/1000?cb=20200116140939", + Size(400, 100), CookTime_Page()), Module( "Discord_rpc", "https://discord.com/assets/9f6f9cd156ce35e2d94c0e62e3eff462.png", + Size(400, 300), RPC_Page()), + Module( + "Maps", + "https://static.wikia.nocookie.net/seaofthieves_gamepedia/images/5/5c/Treasure_Map_Icon.png/revision/latest/scale-to-width-down/125?cb=20200923101156", + Size(400, 600), + Map_Page()), ]; } diff --git a/sot_companion/lib/helper/WebviewManager.dart b/sot_companion/lib/helper/WebviewManager.dart new file mode 100644 index 0000000..68b4631 --- /dev/null +++ b/sot_companion/lib/helper/WebviewManager.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; +import 'package:webview_windows/webview_windows.dart'; + +class SOT_WebviewManager { + static final currentController = WebviewController(); + + static init() async{ + + } +} \ No newline at end of file diff --git a/sot_companion/lib/main.dart b/sot_companion/lib/main.dart index 44cda50..110730b 100644 --- a/sot_companion/lib/main.dart +++ b/sot_companion/lib/main.dart @@ -2,7 +2,10 @@ import 'package:dart_discord_rpc/dart_discord_rpc.dart'; import 'package:flutter/material.dart'; import 'package:flutter_acrylic/flutter_acrylic.dart'; import 'package:sot_companion/class/module.dart'; +import 'package:sot_companion/helper/WebviewManager.dart'; import 'package:sot_companion/helper/WindowManager.dart'; +import 'package:sot_companion/modules/discord_rpc/class/sot_activity.dart'; +import 'package:webview_windows/webview_windows.dart'; import 'package:window_manager/window_manager.dart'; void main() async { @@ -11,6 +14,7 @@ void main() async { // Must add this line. await Window.initialize(); await windowManager.ensureInitialized(); + await SOT_WebviewManager.init(); WindowOptions windowOptions = const WindowOptions( size: Size(100, 50), @@ -75,11 +79,23 @@ class MyHomePage extends StatefulWidget { State createState() => _MyHomePageState(); } -class _MyHomePageState extends State { +class _MyHomePageState extends State + with SingleTickerProviderStateMixin { String status = "MINIMIZE"; Module? moduleSelected; + late TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = + TabController(vsync: this, length: Module.moduleList.length); + } Widget build(BuildContext context) { + if (moduleSelected == null) { + SOT_WindowsManager.changeSize(const Size(400, 100)); + } late Widget scaffoldChild; if (status == "MODULES") { scaffoldChild = _buildModules(); @@ -90,40 +106,68 @@ class _MyHomePageState extends State { } Widget _buildModules() { - if (moduleSelected == null) { - SOT_WindowsManager.changeSize(Size(250, 50)); - } - return Column(children: [ - Row(children: [ - InkWell( - child: Icon(Icons.arrow_right), - onTap: () { - setState(() { - status = "MINIMIZE"; - }); - }, - ), - Expanded( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: List.generate(Module.moduleList.length, (index) { - return Expanded(child:Row(mainAxisAlignment: MainAxisAlignment.center, children: [ _buildModuleIcon(Module.moduleList[index])])); - }))) - ]), - moduleSelected != null - ? Expanded( - child: Column(children: [ - SizedBox(height: 4,), - Container( - margin: EdgeInsets.symmetric(horizontal:10), - height: 2, - width: MediaQuery.of(context).size.width, - color: Colors.white), - SizedBox(height: 4,), - Expanded(child: moduleSelected!.mainPage) - ])) - : Container() - ]); + return _buildAllModulesColumn(); + } + + Widget _buildWebView() { + return Expanded(child: Webview(SOT_WebviewManager.currentController)); + } + + Widget _buildAllModulesColumn() { + return Container( + child: DefaultTabController( + length: 3, + child: Column(children: [ + Row(children: [ + InkWell( + child: Icon(Icons.arrow_right), + onTap: () { + status = "MINIMIZE"; + setState(() {}); + }, + ), + Expanded( + child: TabBar( + onTap: (int index) { + WindowManager.instance + .setSize(Module.moduleList[index].size); + }, + controller: _tabController, + tabs: List.generate(Module.moduleList.length, (index) { + return Tab( + child: _buildModuleIcon( + Module.moduleList[index])); + }))) + ]), + Expanded( + child: TabBarView( + controller: _tabController, + children: + List.generate(Module.moduleList.length, (index) { + return Module.moduleList[index].mainPage; + }))) + ]))); + } + + Widget _buildModulePage() { + return moduleSelected != null + ? Container( + child: Expanded( + child: Column(children: [ + SizedBox( + height: 4, + ), + Container( + margin: EdgeInsets.symmetric(horizontal: 10), + height: 2, + width: MediaQuery.of(context).size.width, + color: Colors.white), + SizedBox( + height: 4, + ), + Expanded(child: moduleSelected!.mainPage) + ]))) + : Container(); } Widget _buildMinimize() { @@ -144,8 +188,9 @@ class _MyHomePageState extends State { backgroundColor: Colors.transparent, backgroundImage: NetworkImage( "https://static.wikia.nocookie.net/seaofthieves_gamepedia/images/b/b8/Investigator_of_Dark_Intrigue_emblem.png/revision/latest/scale-to-width-down/1000?cb=20220630155533"), - ), + ), onTap: () { + _tabController.animateTo(0); status = "MODULES"; setState(() {}); }), @@ -154,16 +199,10 @@ class _MyHomePageState extends State { } Widget _buildModuleIcon(Module module) { - return InkWell( - child: CircleAvatar( - backgroundColor: Colors.transparent, - backgroundImage: NetworkImage(module.image), - ), - onTap: () { - if (moduleSelected == null || moduleSelected!.name != module.name) { - moduleSelected = module; - setState(() {}); - } - }); + return CircleAvatar( + backgroundColor: Colors.transparent, + backgroundImage: NetworkImage(module.image), + ) + ; } } diff --git a/sot_companion/lib/modules/cook_time/pages/food_page.dart b/sot_companion/lib/modules/cook_time/pages/food_page.dart index b6b9229..7ed9517 100644 --- a/sot_companion/lib/modules/cook_time/pages/food_page.dart +++ b/sot_companion/lib/modules/cook_time/pages/food_page.dart @@ -42,7 +42,7 @@ class _CookTime_PageState extends State { } Widget _buildSelectFood() { - SOT_WindowsManager.changeSize(Size(250, 100)); + //SOT_WindowsManager.changeSize(Size(250, 100)); return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -57,7 +57,7 @@ class _CookTime_PageState extends State { } Widget _buildCooking() { - SOT_WindowsManager.changeSize(Size(250, 100)); + //SOT_WindowsManager.changeSize(Size(250, 100)); print(double.maxFinite); return Container( padding: EdgeInsets.only(right: 10), diff --git a/sot_companion/lib/modules/discord_rpc/pages/rpc.dart b/sot_companion/lib/modules/discord_rpc/pages/rpc.dart index a30087c..48fe755 100644 --- a/sot_companion/lib/modules/discord_rpc/pages/rpc.dart +++ b/sot_companion/lib/modules/discord_rpc/pages/rpc.dart @@ -42,7 +42,7 @@ class _RPC_PageState extends State { } Widget _buildMenu() { - SOT_WindowsManager.changeSize(const Size(250, 300)); + //SOT_WindowsManager.changeSize(const Size(250, 300)); return Row(children: [ Expanded( child: Column( diff --git a/sot_companion/lib/modules/maps/pages/map.dart b/sot_companion/lib/modules/maps/pages/map.dart new file mode 100644 index 0000000..a89eff8 --- /dev/null +++ b/sot_companion/lib/modules/maps/pages/map.dart @@ -0,0 +1,116 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:sot_companion/helper/WebviewManager.dart'; +import 'package:webview_windows/webview_windows.dart'; + +import '../../../helper/WindowManager.dart'; + +class Map_Page extends StatefulWidget { + Map_Page({Key? key}) : super(key: key); + + @override + State createState() => _Map_PageState(); +} + +class _Map_PageState extends State { + final _controller = WebviewController(); + bool ready = false; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) async { + if (mounted) { + initPlatformState(); + } + }); + } + + Future initPlatformState() async { + // Optionally initialize the webview environment using + // a custom user data directory + // and/or a custom browser executable directory + // and/or custom chromium command line flags + //await WebviewController.initializeEnvironment( + // additionalArguments: '--show-fps-counter'); + + try { + await SOT_WebviewManager.currentController.initialize(); + + await SOT_WebviewManager.currentController + .setBackgroundColor(Colors.transparent); + await SOT_WebviewManager.currentController + .setPopupWindowPolicy(WebviewPopupWindowPolicy.allow); + await SOT_WebviewManager.currentController + .loadUrl('https://maps.seaofthieves.rarethief.com/'); + + await SOT_WebviewManager.currentController.executeScript( + "window.addEventListener('load', (event) => {document.body.style.width='100vw';document.body.style.height='100vh';document.body.style.overflow='hidden'});"); + //await _controller.stop(); + setState(() { + ready = true; + }); + } on PlatformException catch (e) { + print(e.toString()); + } + } + + Future _onPermissionRequested( + String url, WebviewPermissionKind kind, bool isUserInitiated) async { + final decision = await showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + title: const Text('WebView permission requested'), + content: Text('WebView has requested permission \'$kind\''), + actions: [ + TextButton( + onPressed: () => + Navigator.pop(context, WebviewPermissionDecision.deny), + child: const Text('Deny'), + ), + TextButton( + onPressed: () => + Navigator.pop(context, WebviewPermissionDecision.allow), + child: const Text('Allow'), + ), + ], + ), + ); + + return decision ?? WebviewPermissionDecision.none; + } + + @override + Widget build(BuildContext context) { + //SOT_WindowsManager.changeSize(const Size(400, 600)); + + return Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded(child: Container()), + InkWell(child: + CircleAvatar(backgroundImage: NetworkImage("https://cdn.discordapp.com/attachments/839604520245264404/993969738726260836/rare_thief.png")), + onTap: ()async { + await SOT_WebviewManager.currentController + .loadUrl('https://maps.seaofthieves.rarethief.com/'); + }, + ), + Expanded(child: Container()), + InkWell(child: + CircleAvatar(backgroundImage: NetworkImage("https://cdn.discordapp.com/attachments/839604520245264404/993974389940965468/merfolks_lullaby.png")), + onTap: ()async { + await SOT_WebviewManager.currentController + .loadUrl('https://www.merfolkslullaby.com/map?tab=weather'); + }, + ), + Expanded(child: Container()) + ]), + ready + ? Expanded( + child: Stack( + children: [Webview(SOT_WebviewManager.currentController)], + )) + : Container()]); + } +} diff --git a/sot_companion/pubspec.lock b/sot_companion/pubspec.lock index 5bfbef3..d2e9c14 100644 --- a/sot_companion/pubspec.lock +++ b/sot_companion/pubspec.lock @@ -198,6 +198,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + webview_windows: + dependency: "direct main" + description: + name: webview_windows + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" window_manager: dependency: "direct main" description: @@ -207,4 +214,4 @@ packages: version: "0.2.5" sdks: dart: ">=2.17.3 <3.0.0" - flutter: ">=1.20.0" + flutter: ">=2.8.0" diff --git a/sot_companion/pubspec.yaml b/sot_companion/pubspec.yaml index db72173..f73411a 100644 --- a/sot_companion/pubspec.yaml +++ b/sot_companion/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: window_manager: ^0.2.5 flutter_acrylic: dart_discord_rpc: + webview_windows: # The following adds the Cupertino Icons font to your application. diff --git a/sot_companion/windows/flutter/generated_plugin_registrant.cc b/sot_companion/windows/flutter/generated_plugin_registrant.cc index 8325153..4812917 100644 --- a/sot_companion/windows/flutter/generated_plugin_registrant.cc +++ b/sot_companion/windows/flutter/generated_plugin_registrant.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include void RegisterPlugins(flutter::PluginRegistry* registry) { @@ -18,6 +19,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("FlutterAcrylicPlugin")); ScreenRetrieverPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ScreenRetrieverPlugin")); + WebviewWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WebviewWindowsPlugin")); WindowManagerPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("WindowManagerPlugin")); } diff --git a/sot_companion/windows/flutter/generated_plugins.cmake b/sot_companion/windows/flutter/generated_plugins.cmake index 14335e5..cd4a7a6 100644 --- a/sot_companion/windows/flutter/generated_plugins.cmake +++ b/sot_companion/windows/flutter/generated_plugins.cmake @@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST dart_discord_rpc flutter_acrylic screen_retriever + webview_windows window_manager )