diff --git a/ui/rsc/entry.ui b/ui/rsc/entry.ui
new file mode 100644
index 0000000..6c066e3
--- /dev/null
+++ b/ui/rsc/entry.ui
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
diff --git a/ui/rsc/pane/sidebar.ui b/ui/rsc/pane/sidebar.ui
index 62edd8d..86c59c0 100644
--- a/ui/rsc/pane/sidebar.ui
+++ b/ui/rsc/pane/sidebar.ui
@@ -15,7 +15,28 @@
-
+
+
+ never
+ automatic
+
+
+ vertical
+ 12
+ 12
+ 12
+ 12
+ 12
+
+
+ browse
+ navigation-sidebar
+
+
+
+
+
+
@@ -26,7 +47,7 @@
12
12
-
+
Create New Profile
suggested-action
diff --git a/ui/rsc/resources.gresource.xml b/ui/rsc/resources.gresource.xml
index 5ef5672..b1d3e98 100644
--- a/ui/rsc/resources.gresource.xml
+++ b/ui/rsc/resources.gresource.xml
@@ -1,6 +1,7 @@
+ entry.ui
window.ui
pane/main.ui
pane/sidebar.ui
diff --git a/ui/src/config.rs b/ui/src/config.rs
index 75c4a9d..39f6d88 100644
--- a/ui/src/config.rs
+++ b/ui/src/config.rs
@@ -58,7 +58,6 @@ pub fn load_config() -> Result<(), anyhow::Error> {
while rx.try_recv().is_ok() {}
// write the configuration
- eprintln!("Saving configuration...");
if let Ok(config) = config.try_read() {
if let Err(e) = save_config(&config) {
eprintln!("Failed to save configuration: {}", e);
diff --git a/ui/src/main.rs b/ui/src/main.rs
index 2bd44e0..fa21709 100644
--- a/ui/src/main.rs
+++ b/ui/src/main.rs
@@ -42,6 +42,17 @@ fn build_ui(app: &adw::Application) {
let window = wrapper::Window::new(app);
window.set_application(Some(app));
+ // load profiles from configuration
+ let sidebar = window.imp().sidebar.imp();
+
+ let config = config::get_config()
+ .expect("Failed to get configuration");
+ for game in config.game.iter() {
+ let entry = wrapper::entry::Entry::new();
+ entry.set_exe(game.exe.clone());
+ sidebar.profiles.append(&entry);
+ }
+
// register main pane signals
let main = window.imp().main.imp();
diff --git a/ui/src/wrapper.rs b/ui/src/wrapper.rs
index 5a981df..23f0f95 100644
--- a/ui/src/wrapper.rs
+++ b/ui/src/wrapper.rs
@@ -3,6 +3,7 @@ use gtk;
use adw;
use gtk::glib::types::StaticTypeExt;
+pub mod entry;
pub mod pane;
pub mod pref;
diff --git a/ui/src/wrapper/entry.rs b/ui/src/wrapper/entry.rs
new file mode 100644
index 0000000..90e2a88
--- /dev/null
+++ b/ui/src/wrapper/entry.rs
@@ -0,0 +1,18 @@
+use gtk::glib;
+use gtk;
+
+pub mod entry;
+
+glib::wrapper! {
+ pub struct Entry(ObjectSubclass)
+ @extends
+ gtk::ListBoxRow, gtk::Widget,
+ @implements
+ gtk::Accessible, gtk::Actionable, gtk::Buildable, gtk::ConstraintTarget;
+}
+
+impl Entry {
+ pub fn new() -> Self {
+ glib::Object::new()
+ }
+}
diff --git a/ui/src/wrapper/entry/entry.rs b/ui/src/wrapper/entry/entry.rs
new file mode 100644
index 0000000..0a65df7
--- /dev/null
+++ b/ui/src/wrapper/entry/entry.rs
@@ -0,0 +1,41 @@
+use std::cell::RefCell;
+
+use gtk::glib;
+use gtk::subclass::prelude::*;
+use gtk::prelude::*;
+
+#[derive(gtk::CompositeTemplate, glib::Properties, Default)]
+#[properties(wrapper_type = super::Entry)]
+#[template(resource = "/gay/pancake/lsfg-vk/entry.ui")]
+pub struct Entry {
+ #[property(get, set)]
+ exe: RefCell,
+
+ #[template_child]
+ pub delete: TemplateChild,
+}
+
+#[glib::object_subclass]
+impl ObjectSubclass for Entry {
+ const NAME: &'static str = "LSEntry";
+ type Type = super::Entry;
+ type ParentType = gtk::ListBoxRow;
+
+ fn class_init(klass: &mut Self::Class) {
+ klass.bind_template();
+ }
+
+ fn instance_init(obj: &glib::subclass::InitializingObject) {
+ obj.init_template();
+ }
+}
+
+#[glib::derived_properties]
+impl ObjectImpl for Entry {
+ fn constructed(&self) {
+ self.parent_constructed();
+ }
+}
+
+impl WidgetImpl for Entry {}
+impl ListBoxRowImpl for Entry {}
diff --git a/ui/src/wrapper/pane/sidebar.rs b/ui/src/wrapper/pane/sidebar.rs
index c43c31e..20ea990 100644
--- a/ui/src/wrapper/pane/sidebar.rs
+++ b/ui/src/wrapper/pane/sidebar.rs
@@ -5,7 +5,10 @@ use adw::subclass::prelude::*;
#[derive(gtk::CompositeTemplate, Default)]
#[template(resource = "/gay/pancake/lsfg-vk/pane/sidebar.ui")]
pub struct PaneSidebar {
-
+ #[template_child]
+ pub profiles: TemplateChild,
+ #[template_child]
+ pub create: TemplateChild
}
#[glib::object_subclass]