add select and fetch proton versions

This commit is contained in:
ALEZ-DEV 2024-05-24 23:49:55 +02:00
parent 26d4e35d19
commit 436827b390
8 changed files with 136 additions and 8 deletions

View File

@ -0,0 +1,18 @@
import 'package:babylonia_terminal_launcher/messages/github.pb.dart';
class Github {
static bool _isFetchingProtonVersions = false;
static Future<List<String>> 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 [];
}
}

View File

@ -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"),

View File

@ -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<ProtonSteps> createState() => _ProtonStepsState();
}
class _ProtonStepsState extends State<ProtonSteps> {
bool hasLoaded = false;
bool isLoading = false;
late List<String> 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!),
),
);
}
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
package github;
// [RINF:DART-SIGNAL]
message AskProtonVersions {}
// [RINF:RUST-SIGNAL]
message ProtonVersions {
repeated string versions = 1;
}

View File

@ -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;

View File

@ -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;

View File

@ -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<Vec<GithubRelease>, _> =
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!(),
}
}
}

View File

@ -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());
}