diff --git a/ui/rsc/pane/main.ui b/ui/rsc/pane/main.ui
index 9fd3022..e4a0f03 100644
--- a/ui/rsc/pane/main.ui
+++ b/ui/rsc/pane/main.ui
@@ -26,8 +26,26 @@
32
32
32
+
+
+
+
Frame Generation
@@ -49,10 +67,10 @@
false
-
+
-
+
Misc
diff --git a/ui/rsc/pref/entry.ui b/ui/rsc/pref/entry.ui
index 899e5ae..6a821f6 100644
--- a/ui/rsc/pref/entry.ui
+++ b/ui/rsc/pref/entry.ui
@@ -24,8 +24,9 @@
bind-source="LSPrefEntry" bind-property="default-text" bind-flags="sync-create"/>
- number
compact
+ 60
+ 60
diff --git a/ui/rsc/window.ui b/ui/rsc/window.ui
index 99ae122..8b69489 100644
--- a/ui/rsc/window.ui
+++ b/ui/rsc/window.ui
@@ -2,8 +2,8 @@
lsfg-vk Configuration Window
- 800
- 600
+ 1000
+ 700
diff --git a/ui/src/main.rs b/ui/src/main.rs
index 5dd0682..1093d1d 100644
--- a/ui/src/main.rs
+++ b/ui/src/main.rs
@@ -11,7 +11,6 @@ const APP_ID: &str = "gay.pancake.lsfg-vk.ConfigurationUi";
#[derive(Debug)]
struct State {
- // ui state
selected_game: Option
}
diff --git a/ui/src/ui.rs b/ui/src/ui.rs
index db7dee3..c0eaac1 100644
--- a/ui/src/ui.rs
+++ b/ui/src/ui.rs
@@ -1,5 +1,5 @@
use adw::{self, subclass::prelude::ObjectSubclassIsExt};
-use gtk::prelude::*;
+use gtk::prelude::{WidgetExt, EditableExt, GtkWindowExt};
use crate::config;
use crate::wrapper;
@@ -22,11 +22,20 @@ pub fn build(app: &adw::Application) {
entry_handler::add_entry(entry, imp.sidebar.imp().profiles.clone());
}
+ if let Some(dll_path) = config.global.dll {
+ imp.main.imp().dll.imp().entry.set_text(&dll_path);
+ }
+
// register handlers on sidebar pane.
sidebar_handler::register_signals(&imp.sidebar, imp.main.clone());
// register handlers on main pane.
- main_handler::register_signals(&imp.main);
+ main_handler::register_signals(imp.sidebar.clone(), &imp.main);
+
+ // activate the first profile if available
+ if let Some(entry) = imp.sidebar.imp().profiles.row_at_index(0) {
+ entry.activate();
+ }
// present the window
window.present();
diff --git a/ui/src/ui/main_handler.rs b/ui/src/ui/main_handler.rs
index 3e683dd..16e1fe9 100644
--- a/ui/src/ui/main_handler.rs
+++ b/ui/src/ui/main_handler.rs
@@ -1,7 +1,7 @@
use adw::subclass::prelude::ObjectSubclassIsExt;
-use gtk::prelude::RangeExt;
+use gtk::{glib::object::CastNone, prelude::{EditableExt, RangeExt}};
-use crate::{config, wrapper::pane, STATE};
+use crate::{config, wrapper::{pane, entry}, STATE};
// update the currently selected game configuration
fn update_game(update: F) {
@@ -17,14 +17,32 @@ fn update_game(update: F) {
///
/// Register signals for preset preferences.
///
-pub fn register_signals(main: &pane::PaneMain) {
+pub fn register_signals(sidebar_: pane::PaneSidebar, main: &pane::PaneMain) {
let main = main.imp();
+ let exe = main.preset_name.imp();
let multiplier = main.multiplier.imp();
let flow_scale = main.flow_scale.imp();
let performance_mode = main.performance_mode.imp();
let hdr_mode = main.hdr_mode.imp();
let experimental_present_mode = main.experimental_present_mode.imp();
+ let sidebar = sidebar_.clone();
+ exe.entry.connect_changed(move |entry| {
+ let mut exe = entry.text().to_string();
+ if exe.trim().is_empty() {
+ exe = "new preset".to_string();
+ }
+
+ // rename list entry
+ let row = sidebar.imp().profiles.selected_row()
+ .and_downcast::().unwrap();
+ row.set_exe(exe.clone());
+
+ // update the game configuration
+ update_game(|conf| {
+ conf.exe = exe;
+ });
+ });
multiplier.number.connect_value_changed(|dropdown| {
update_game(|conf| {
conf.multiplier = (dropdown.value() as i64).into();
@@ -55,4 +73,16 @@ pub fn register_signals(main: &pane::PaneMain) {
};
});
});
+
+ let dll = main.dll.imp();
+ dll.entry.connect_changed(|entry| {
+ let _ = config::edit_config(|config| {
+ let text = entry.text().to_string();
+ if text.trim().is_empty() {
+ config.global.dll = None;
+ } else {
+ config.global.dll = Some(text);
+ }
+ });
+ });
}
diff --git a/ui/src/ui/sidebar_handler.rs b/ui/src/ui/sidebar_handler.rs
index 39c7c69..c1d6c8e 100644
--- a/ui/src/ui/sidebar_handler.rs
+++ b/ui/src/ui/sidebar_handler.rs
@@ -1,5 +1,5 @@
use adw::subclass::prelude::ObjectSubclassIsExt;
-use gtk::prelude::{ButtonExt, ListBoxRowExt, RangeExt, WidgetExt};
+use gtk::prelude::{ButtonExt, EditableExt, ListBoxRowExt, RangeExt, WidgetExt};
use crate::{config, ui::entry_handler, wrapper::{pane, entry}, STATE};
@@ -21,6 +21,7 @@ pub fn register_signals(sidebar_: &pane::PaneSidebar, main: pane::PaneMain) {
// update main pane
let main = main.imp();
+ let exe = main.preset_name.imp();
let multiplier = main.multiplier.imp();
let flow_scale = main.flow_scale.imp();
let performance_mode = main.performance_mode.imp();
@@ -29,6 +30,7 @@ pub fn register_signals(sidebar_: &pane::PaneSidebar, main: pane::PaneMain) {
// (lock state early, so the ui update doesn't override the config)
if let Ok(mut state) = state.write() {
+ exe.entry.set_text(&conf.exe);
multiplier.number.set_value(conf.multiplier.into());
flow_scale.slider.set_value(Into::::into(conf.flow_scale) * 100.0);
performance_mode.switch.set_active(conf.performance_mode);
diff --git a/ui/src/wrapper/pane/main.rs b/ui/src/wrapper/pane/main.rs
index 3cc8b67..63f8d44 100644
--- a/ui/src/wrapper/pane/main.rs
+++ b/ui/src/wrapper/pane/main.rs
@@ -6,6 +6,10 @@ use crate::wrapper::pref::*;
#[derive(gtk::CompositeTemplate, Default)]
#[template(resource = "/gay/pancake/lsfg-vk/pane/main.ui")]
pub struct PaneMain {
+ #[template_child]
+ pub dll: TemplateChild,
+ #[template_child]
+ pub preset_name: TemplateChild,
#[template_child]
pub multiplier: TemplateChild,
#[template_child]