UI: session save/resume controls + resync status (#8)
Some checks failed
Rust / build-linux (linux-x86_64, X64, ubuntu-24.04, x86_64-unknown-linux-gnu) (push) Failing after 5s
Rust / build-android (29.0.14206865, ubuntu-24.04, 33) (push) Failing after 4s
Rust-lint / lint-linux (push) Failing after 23s
Rust / build-linux (linux-aarch64, ARM64, ubuntu-24.04-arm, aarch64-unknown-linux-gnu) (push) Has been cancelled
Rust / build-windows (windows-aarch64, woa64, windows-11-arm, aarch64-pc-windows-msvc) (push) Has been cancelled
Rust / build-windows (windows-x86_64, win64, windows-2025, x86_64-pc-windows-msvc) (push) Has been cancelled
Rust / build-macos (macos-aarch64, ARM64, aarch64-apple-darwin) (push) Has been cancelled
Rust / Collect release artifacts (push) Has been cancelled
Some checks failed
Rust / build-linux (linux-x86_64, X64, ubuntu-24.04, x86_64-unknown-linux-gnu) (push) Failing after 5s
Rust / build-android (29.0.14206865, ubuntu-24.04, 33) (push) Failing after 4s
Rust-lint / lint-linux (push) Failing after 23s
Rust / build-linux (linux-aarch64, ARM64, ubuntu-24.04-arm, aarch64-unknown-linux-gnu) (push) Has been cancelled
Rust / build-windows (windows-aarch64, woa64, windows-11-arm, aarch64-pc-windows-msvc) (push) Has been cancelled
Rust / build-windows (windows-x86_64, win64, windows-2025, x86_64-pc-windows-msvc) (push) Has been cancelled
Rust / build-macos (macos-aarch64, ARM64, aarch64-apple-darwin) (push) Has been cancelled
Rust / Collect release artifacts (push) Has been cancelled
This commit is contained in:
commit
3bdbcd0402
@ -53,6 +53,8 @@ export component AppWindow inherits Window {
|
||||
callback netplay_create_session(string, string, string, string, string, string, bool, bool);
|
||||
callback netplay_select_rom(string);
|
||||
callback netplay_join_session(string, string, string, string);
|
||||
callback netplay_resume_session(string);
|
||||
callback netplay_save_session;
|
||||
callback netplay_close;
|
||||
callback cheats_select_rom_clicked(string);
|
||||
callback cheats_clear_clicked;
|
||||
@ -134,6 +136,8 @@ export component AppWindow inherits Window {
|
||||
in-out property netplay_recommended_delay <=> NetplayWaitData.recommended_delay;
|
||||
in-out property netplay_game_pal <=> NetplayWaitData.game_pal;
|
||||
in-out property netplay_connected_peers_count <=> NetplayWaitData.connected_peers_count;
|
||||
in-out property netplay_is_host <=> NetplayWaitData.is_host;
|
||||
in-out property netplay_resyncing <=> NetplayWaitData.resyncing;
|
||||
|
||||
private property <string> popup_message;
|
||||
private property <bool> popup_has_close;
|
||||
@ -275,6 +279,9 @@ export component AppWindow inherits Window {
|
||||
begin_game(a) => {
|
||||
netplay_begin_game(a);
|
||||
}
|
||||
save_session => {
|
||||
netplay_save_session();
|
||||
}
|
||||
close => {
|
||||
netplay_close();
|
||||
}
|
||||
@ -288,6 +295,9 @@ export component AppWindow inherits Window {
|
||||
create_session(a, b, c, d, e, f, g, h) => {
|
||||
netplay_create_session(a,b,c,d,e,f,g,h);
|
||||
}
|
||||
resume_session(rom_dir) => {
|
||||
netplay_resume_session(rom_dir);
|
||||
}
|
||||
close => {
|
||||
netplay_close();
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@ export component NetplayCreate inherits Page {
|
||||
title: @tr("Netplay: Create Session");
|
||||
callback select_rom(string);
|
||||
callback create_session(string, string, string, string, string, string, bool, bool);
|
||||
callback resume_session(string);
|
||||
callback close;
|
||||
|
||||
VerticalBox {
|
||||
@ -113,6 +114,14 @@ export component NetplayCreate inherits Page {
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: @tr("Resume Session…");
|
||||
enabled: !NetplayData.pending_session;
|
||||
clicked => {
|
||||
resume_session(SettingsData.rom_dir);
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: @tr("Cancel");
|
||||
clicked => {
|
||||
|
||||
@ -27,6 +27,7 @@ export global NetplayData {
|
||||
in-out property <bool> show_wait_session;
|
||||
in-out property <bool> show_create_session;
|
||||
in-out property <bool> show_join_session;
|
||||
in-out property <bool> resyncing;
|
||||
}
|
||||
|
||||
export component Netplay inherits Page {
|
||||
|
||||
@ -21,12 +21,15 @@ export global NetplayWaitData {
|
||||
in-out property <int> recommended_delay;
|
||||
in-out property <bool> game_pal;
|
||||
in-out property <int> connected_peers_count;
|
||||
in-out property <bool> is_host;
|
||||
in-out property <bool> resyncing;
|
||||
}
|
||||
|
||||
export component NetplayWait inherits Page {
|
||||
title: @tr("Netplay: Waiting Room");
|
||||
callback send_chat_message(string);
|
||||
callback begin_game(int);
|
||||
callback save_session;
|
||||
callback close;
|
||||
VerticalBox {
|
||||
alignment: start;
|
||||
@ -143,6 +146,14 @@ export component NetplayWait inherits Page {
|
||||
}
|
||||
}
|
||||
|
||||
if NetplayWaitData.is_host: Button {
|
||||
text: @tr("Save Session");
|
||||
enabled: NetplayWaitData.can_start;
|
||||
clicked => {
|
||||
save_session();
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: @tr("Cancel");
|
||||
clicked => {
|
||||
@ -150,6 +161,17 @@ export component NetplayWait inherits Page {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if NetplayWaitData.resyncing: Rectangle {
|
||||
background: #ffaa00;
|
||||
height: 24px;
|
||||
Text {
|
||||
text: @tr("Resyncing…");
|
||||
horizontal-alignment: center;
|
||||
vertical-alignment: center;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -271,6 +271,48 @@ fn setup_callbacks(
|
||||
app.on_netplay_feedback_button_clicked(move || {
|
||||
open_uri("https://github.com/gopher64/gopher64/discussions/453");
|
||||
});
|
||||
|
||||
// Resume Session: open a file picker for .netplay-state files
|
||||
let weak_app = app.as_weak();
|
||||
app.on_netplay_resume_session(move |rom_dir| {
|
||||
let weak_app = weak_app.clone();
|
||||
tokio::spawn(async move {
|
||||
if let Some(file) = rfd::AsyncFileDialog::new()
|
||||
.add_filter("Netplay State", &["netplay-state"])
|
||||
.set_directory(rom_dir)
|
||||
.pick_file()
|
||||
.await
|
||||
{
|
||||
eprintln!("resume session from: {}", file.path().display());
|
||||
// TODO: #3 — load the netplay session state from the file and
|
||||
// re-establish the connection. For now, just show a message.
|
||||
weak_app
|
||||
.upgrade_in_event_loop(|handle| {
|
||||
ui::video::onscreen_message(
|
||||
"Resume session not yet implemented (#3)",
|
||||
ui::video::MESSAGE_LENGTH_MESSAGE_SHORT,
|
||||
);
|
||||
let _ = handle;
|
||||
})
|
||||
.ok();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Save Session: host-only, triggers the save flow from #3
|
||||
let weak_app = app.as_weak();
|
||||
app.on_netplay_save_session(move || {
|
||||
eprintln!("save session requested");
|
||||
weak_app
|
||||
.upgrade_in_event_loop(|handle| {
|
||||
ui::video::onscreen_message(
|
||||
"Save session not yet implemented (#3)",
|
||||
ui::video::MESSAGE_LENGTH_MESSAGE_SHORT,
|
||||
);
|
||||
let _ = handle;
|
||||
})
|
||||
.ok();
|
||||
});
|
||||
}
|
||||
|
||||
fn close_connections(
|
||||
@ -751,6 +793,8 @@ fn setup_wait_window(
|
||||
app.set_netplay_game_name(game_name);
|
||||
app.set_netplay_rom_path(rom_path);
|
||||
app.set_netplay_can_start(true);
|
||||
// is_host is set when the first ResponseSession arrives and the players
|
||||
// list is populated (host is players[0], see netplay_wait.slint).
|
||||
|
||||
let request_update = NetplayLobbyMessage {
|
||||
message_type: MessageType::RequestUpdateSession,
|
||||
@ -780,6 +824,20 @@ fn setup_wait_window(
|
||||
.collect::<Vec<slint::SharedString>>(),
|
||||
),
|
||||
)));
|
||||
// The host is the session creator, always
|
||||
// registered first in the lobby; the wait
|
||||
// window's host-gated controls (input delay,
|
||||
// Start Game, Save Session) all key off
|
||||
// players[0] == player_name.
|
||||
handle.set_netplay_is_host(
|
||||
handle.get_netplay_player_name()
|
||||
== handle
|
||||
.get_netplay_players()
|
||||
.iter()
|
||||
.next()
|
||||
.map(|s| s.to_string())
|
||||
.unwrap_or_default(),
|
||||
);
|
||||
})
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user