From 436827b3900a6ffb0e3de6322685928f933aa02a Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Fri, 24 May 2024 23:49:55 +0200 Subject: [PATCH] add select and fetch proton versions --- .../lib/models/github.dart | 18 +++++ .../lib/screens/setups/steps_screen.dart | 6 +- .../widgets/steps/proton_steps_widget.dart | 69 +++++++++++++++++++ .../messages/github.proto | 10 +++ .../native/hub/src/config.rs | 2 +- .../native/hub/src/game_state.rs | 2 +- .../native/hub/src/github.rs | 30 ++++++++ .../native/hub/src/lib.rs | 7 +- 8 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 babylonia_terminal_launcher/lib/models/github.dart create mode 100644 babylonia_terminal_launcher/lib/widgets/steps/proton_steps_widget.dart create mode 100644 babylonia_terminal_launcher/messages/github.proto create mode 100644 babylonia_terminal_launcher/native/hub/src/github.rs diff --git a/babylonia_terminal_launcher/lib/models/github.dart b/babylonia_terminal_launcher/lib/models/github.dart new file mode 100644 index 0000000..e3f643a --- /dev/null +++ b/babylonia_terminal_launcher/lib/models/github.dart @@ -0,0 +1,18 @@ +import 'package:babylonia_terminal_launcher/messages/github.pb.dart'; + +class Github { + static bool _isFetchingProtonVersions = false; + static Future> getProtonVersions() async { + if (!_isFetchingProtonVersions) { + _isFetchingProtonVersions = true; + AskProtonVersions().sendSignalToRust(); + final stream = ProtonVersions.rustSignalStream; + + await for (final rustSignal in stream) { + _isFetchingProtonVersions = false; + return rustSignal.message.versions; + } + } + return []; + } +} diff --git a/babylonia_terminal_launcher/lib/screens/setups/steps_screen.dart b/babylonia_terminal_launcher/lib/screens/setups/steps_screen.dart index 4852be9..4058b4e 100644 --- a/babylonia_terminal_launcher/lib/screens/setups/steps_screen.dart +++ b/babylonia_terminal_launcher/lib/screens/setups/steps_screen.dart @@ -6,6 +6,7 @@ import './../../messages/game_state.pb.dart'; import './../../providers/providers.dart'; import './../../widgets/selectable_yaru_expansion_panel.dart'; import './../../widgets/simple_button.dart'; +import './../../widgets/steps/proton_steps_widget.dart'; class StepsScreen extends StatelessWidget { StepsScreen({super.key}); @@ -45,10 +46,7 @@ class StepsScreen extends StatelessWidget { Text("Dependecies"), ], children: const [ - Padding( - padding: EdgeInsets.all(40.0), - child: Text("Proton"), - ), + ProtonSteps(), Padding( padding: EdgeInsets.all(40.0), child: Text("DXVK"), diff --git a/babylonia_terminal_launcher/lib/widgets/steps/proton_steps_widget.dart b/babylonia_terminal_launcher/lib/widgets/steps/proton_steps_widget.dart new file mode 100644 index 0000000..63ec393 --- /dev/null +++ b/babylonia_terminal_launcher/lib/widgets/steps/proton_steps_widget.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:yaru/widgets.dart'; + +import './../../models/github.dart'; + +class ProtonSteps extends StatefulWidget { + const ProtonSteps({super.key}); + + @override + State createState() => _ProtonStepsState(); +} + +class _ProtonStepsState extends State { + bool hasLoaded = false; + bool isLoading = false; + late List protonVersions; + String? selectedValue; + + @override + void didChangeDependencies() async { + if (!hasLoaded) { + isLoading = true; + protonVersions = await Github.getProtonVersions(); + setState(() { + isLoading = false; + hasLoaded = true; + }); + } + + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + if (hasLoaded && selectedValue == null) { + selectedValue = protonVersions.first; + } + + return Padding( + padding: const EdgeInsets.all(8.0), + child: isLoading + ? const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.all(8.0), + child: CircularProgressIndicator(), + ), + Text('Fetching versions...'), + ], + ) + : YaruPopupMenuButton( + initialValue: selectedValue, + itemBuilder: (_) => protonVersions + .map( + (e) => PopupMenuItem( + value: e, + child: Text(e), + ), + ) + .toList(), + onSelected: (v) => setState(() { + selectedValue = v!; + }), + child: Text(selectedValue!), + ), + ); + } +} diff --git a/babylonia_terminal_launcher/messages/github.proto b/babylonia_terminal_launcher/messages/github.proto new file mode 100644 index 0000000..6d33913 --- /dev/null +++ b/babylonia_terminal_launcher/messages/github.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; +package github; + +// [RINF:DART-SIGNAL] +message AskProtonVersions {} + +// [RINF:RUST-SIGNAL] +message ProtonVersions { + repeated string versions = 1; +} diff --git a/babylonia_terminal_launcher/native/hub/src/config.rs b/babylonia_terminal_launcher/native/hub/src/config.rs index ff0656f..9ee76dc 100644 --- a/babylonia_terminal_launcher/native/hub/src/config.rs +++ b/babylonia_terminal_launcher/native/hub/src/config.rs @@ -2,7 +2,7 @@ use babylonia_terminal_sdk::game_state::GameState; use crate::messages::config::{ConfigInput, ConfigOutput}; -pub async fn get_config() { +pub async fn listen_config() { let mut receiver = ConfigInput::get_dart_signal_receiver(); while let Some(_) = receiver.recv().await { let config = GameState::get_config().await; diff --git a/babylonia_terminal_launcher/native/hub/src/game_state.rs b/babylonia_terminal_launcher/native/hub/src/game_state.rs index cab090f..2fffae2 100644 --- a/babylonia_terminal_launcher/native/hub/src/game_state.rs +++ b/babylonia_terminal_launcher/native/hub/src/game_state.rs @@ -20,7 +20,7 @@ impl GameStateMessage { } } -pub async fn get_game_state() { +pub async fn listen_game_state() { let mut receiver = AskGameState::get_dart_signal_receiver(); while let Some(_) = receiver.recv().await { let result_state = GameState::get_current_state().await; diff --git a/babylonia_terminal_launcher/native/hub/src/github.rs b/babylonia_terminal_launcher/native/hub/src/github.rs new file mode 100644 index 0000000..38d4053 --- /dev/null +++ b/babylonia_terminal_launcher/native/hub/src/github.rs @@ -0,0 +1,30 @@ +use babylonia_terminal_sdk::{ + components::proton_component::{PROTON_DEV, PROTON_REPO}, + utils::github_requester::{GithubRelease, GithubRequester}, +}; + +use crate::messages::github::{AskProtonVersions, ProtonVersions}; + +#[warn(dead_code)] +struct GithubInfo; + +impl GithubRequester for GithubInfo { + fn set_github_release_index(&mut self, _: usize) { + todo!() + } +} + +pub async fn listen_proton_version() { + let mut receiver = AskProtonVersions::get_dart_signal_receiver(); + while let Some(_) = receiver.recv().await { + let releases: Result, _> = + GithubInfo::get_github_releases(PROTON_DEV, PROTON_REPO).await; + match releases { + Ok(r) => ProtonVersions { + versions: r.iter().map(|v| v.tag_name.to_owned()).collect(), + } + .send_signal_to_dart(), + Err(_) => todo!(), + } + } +} diff --git a/babylonia_terminal_launcher/native/hub/src/lib.rs b/babylonia_terminal_launcher/native/hub/src/lib.rs index 3f3f235..5cab89a 100755 --- a/babylonia_terminal_launcher/native/hub/src/lib.rs +++ b/babylonia_terminal_launcher/native/hub/src/lib.rs @@ -8,6 +8,7 @@ use tokio_with_wasm::tokio; mod config; mod game_state; +mod github; mod messages; rinf::write_interface!(); @@ -22,6 +23,8 @@ async fn main() { //tokio::spawn(sample_functions::tell_numbers()); //tokio::spawn(sample_functions::stream_fractal()); //tokio::spawn(sample_functions::run_debug_tests()); - tokio::spawn(game_state::get_game_state()); - tokio::spawn(config::get_config()); + tokio::spawn(game_state::listen_game_state()); + tokio::spawn(config::listen_config()); + tokio::spawn(config::listen_config()); + tokio::spawn(github::listen_proton_version()); }