From b0ee52c3f4a53af142748503f3e39e4b934658c2 Mon Sep 17 00:00:00 2001 From: yggverse Date: Wed, 13 Nov 2024 07:05:46 +0200 Subject: [PATCH] draft welcome dialog with profile selection --- src/app/browser.rs | 9 ++++++ src/app/browser/welcome.rs | 30 ++++++++++++++++++++ src/app/browser/welcome/widget.rs | 47 +++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/app/browser/welcome.rs create mode 100644 src/app/browser/welcome/widget.rs diff --git a/src/app/browser.rs b/src/app/browser.rs index dccf1644..d41c9834 100644 --- a/src/app/browser.rs +++ b/src/app/browser.rs @@ -1,11 +1,13 @@ mod about; mod action; mod database; +mod welcome; mod widget; mod window; use about::About; use action::Action; +use welcome::Welcome; use widget::Widget; use window::Window; @@ -21,6 +23,7 @@ use std::rc::Rc; pub struct Browser { action: Rc, + profile: Rc, widget: Rc, window: Rc, } @@ -71,6 +74,7 @@ impl Browser { }); action.profile().connect_activate({ + let profile = profile.clone(); move || { FileLauncher::new(Some(&File::for_path(profile.config_path()))).launch( None::<>k::Window>, @@ -92,6 +96,7 @@ impl Browser { // Return new activated `Self` Self { action, + profile, widget, window, } @@ -159,6 +164,10 @@ impl Browser { } pub fn init(&self) { + // Show welcome dialog on profile not selected yet (e.g. first launch) @TODO + // Welcome::new(self.profile.clone()).present(Some(self.widget.gobject())); + + // Init main window self.window.init(); } diff --git a/src/app/browser/welcome.rs b/src/app/browser/welcome.rs new file mode 100644 index 00000000..7b26ec53 --- /dev/null +++ b/src/app/browser/welcome.rs @@ -0,0 +1,30 @@ +mod widget; +use widget::Widget; + +use crate::profile::Profile; +use gtk::prelude::IsA; +use std::rc::Rc; + +pub struct Welcome { + profile: Rc, + widget: Rc, +} + +impl Welcome { + // Construct + + /// Create new `Self` for given Profile + pub fn new(profile: Rc) -> Self { + Self { + profile, + widget: Rc::new(Widget::new()), + } + } + + // Actions + + /// Show dialog for parent [Window](https://docs.gtk.org/gtk4/class.Window.html) + pub fn present(&self, parent: Option<&impl IsA>) { + self.widget.present(parent); + } +} diff --git a/src/app/browser/welcome/widget.rs b/src/app/browser/welcome/widget.rs new file mode 100644 index 00000000..dfab7e86 --- /dev/null +++ b/src/app/browser/welcome/widget.rs @@ -0,0 +1,47 @@ +use adw::{ + prelude::{AdwDialogExt, AlertDialogExtManual}, + AlertDialog, +}; +use gtk::prelude::IsA; + +const HEADING: &str = "Welcome!"; +const BODY: &str = "Select profile for browser data"; +const RESPONSE_QUIT: (&str, &str) = ("quit", "Quit"); +const RESPONSE_CREATE: (&str, &str) = ("create", "Create new profile"); + +pub struct Widget { + gobject: AlertDialog, +} + +impl Widget { + // Constructors + + /// Create new `Self` + pub fn new() -> Self { + // Init gobject + let gobject = AlertDialog::builder() + .heading(HEADING) + .body(BODY) + .default_response(RESPONSE_QUIT.1) + .build(); + + gobject.add_responses(&[RESPONSE_QUIT, RESPONSE_CREATE]); + + // Return new `Self` + Self { gobject } + } + + // Actions + + /// Show dialog for parent [Window](https://docs.gtk.org/gtk4/class.Window.html) + pub fn present(&self, parent: Option<&impl IsA>) { + self.gobject.present(parent); + } + + /* @TODO not in use + /// Get reference to GObject + /// + pub fn gobject(&self) -> &AlertDialog { + &self.gobject + } */ +}