Merge pull request #80 from Xetibo/dashie

feat: Add basic shortcuts and fix popover
This commit is contained in:
takotori 2023-12-12 08:15:45 +01:00 committed by GitHub
commit 13321039be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 193 additions and 98 deletions

View file

@ -6,7 +6,7 @@ use std::sync::Arc;
use std::time::SystemTime;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, ProgressBar, Scale};
use gtk::{glib, Button, CheckButton, CompositeTemplate, Label, Scale};
use super::source_entry;
@ -23,8 +23,6 @@ pub struct SourceEntry {
pub reset_volume_slider: TemplateChild<Scale>,
#[template_child]
pub reset_volume_percentage: TemplateChild<Label>,
#[template_child]
pub reset_volume_meter: TemplateChild<ProgressBar>,
pub source: Arc<RefCell<Source>>,
pub volume_time_stamp: RefCell<Option<SystemTime>>,
}

View file

@ -2,8 +2,9 @@ use adw::glib::clone;
use adw::subclass::prelude::ObjectSubclassIsExt;
use adw::BreakpointCondition;
use glib::Object;
use gtk::prelude::*;
use gtk::gio::ActionEntry;
use gtk::{gio, glib, Application, ListBoxRow, Orientation};
use gtk::{prelude::*, DirectionType};
use crate::components::window::handle_sidebar_click::*;
use crate::components::window::reset_window_impl;
@ -23,9 +24,87 @@ unsafe impl Sync for ReSetWindow {}
impl ReSetWindow {
pub fn new(app: &Application) -> Self {
app.set_accels_for_action("win.search", &["<Ctrl>F"]);
app.set_accels_for_action("win.close", &["<Ctrl>Q"]);
app.set_accels_for_action("win.about", &["<Ctrl>A"]);
// implemented when a proper movement method is found
// app.set_accels_for_action("win.up", &["<Ctrl>K"]);
// app.set_accels_for_action("win.right", &["<Ctrl>L"]);
// app.set_accels_for_action("win.down", &["<Ctrl>J"]);
// app.set_accels_for_action("win.left", &["<Ctrl>H"]);
Object::builder().property("application", app).build()
}
pub fn setup_shortcuts(&self) {
let search_action = ActionEntry::builder("search")
.activate(move |window: &Self, _, _| {
window.imp().reset_search_entry.grab_focus();
})
.build();
let close_action = ActionEntry::builder("close")
.activate(move |window: &Self, _, _| {
window.close();
})
.build();
let vim_up = ActionEntry::builder("up")
.activate(move |window: &Self, _, _| {
window.child_focus(DirectionType::Up);
})
.build();
let vim_right = ActionEntry::builder("right")
.activate(move |window: &Self, _, _| {
window.child_focus(DirectionType::Right);
})
.build();
let vim_down = ActionEntry::builder("down")
.activate(move |window: &Self, _, _| {
window.child_focus(DirectionType::Down);
})
.build();
let vim_left = ActionEntry::builder("left")
.activate(move |window: &Self, _, _| {
window.child_focus(DirectionType::Left);
})
.build();
let about_action = ActionEntry::builder("about")
.activate(move |window: &ReSetWindow, _, _| {
let dialog = adw::AboutWindow::builder()
.application_name("ReSet")
.application_icon("ReSet")
.developer_name("Xetibo")
.license("GPL-3.0")
.license_type(gtk::License::Gpl30)
.website("https://github.com/Xetibo/ReSet")
.issue_url("https://github.com/Xetibo/ReSet/issues")
.version("0.0.1")
.transient_for(window)
.modal(true)
.copyright("© 2022-2023 Xetibo")
.developers(vec!["DashieTM".to_string(), "Takotori".to_string()])
.designers(vec!["DashieTM".to_string(), "Takotori".to_string()])
.build();
// window.imp().reset_popover_menu.popdown();
dialog.present();
})
.build();
self.add_action_entries([
search_action,
close_action,
about_action,
vim_up,
vim_right,
vim_down,
vim_left,
]);
}
pub fn setup_callback(&self) {
let self_imp = self.imp();
@ -248,46 +327,9 @@ impl ReSetWindow {
separator_row.set_child(Some(&separator));
separator_row.set_selectable(false);
separator_row.set_activatable(false);
separator_row.set_can_target(false);
// TODO how to simply skip this ?
self_imp.reset_sidebar_list.append(&separator_row);
}
}
pub fn setup_popover_buttons(&self) {
let self_imp = self.imp();
self_imp
.reset_about_button
.connect_clicked(clone!(@ weak self as window => move |_| {
let dialog = adw::AboutWindow::builder()
.application_name("ReSet")
.application_icon("ReSet")
.developer_name("Xetibo")
.license("GPL-3.0")
.license_type(gtk::License::Gpl30)
.website("https://github.com/Xetibo/ReSet")
.issue_url("https://github.com/Xetibo/ReSet/issues")
.version("0.0.1")
.transient_for(&window)
.modal(true)
.copyright("© 2022-2023 Xetibo")
.developers(vec!["DashieTM".to_string(), "Takotori".to_string()])
.designers(vec!["DashieTM".to_string(), "Takotori".to_string()])
.build();
window.imp().reset_popover_menu.popdown();
dialog.present();
}));
self_imp
.reset_preference_button
.connect_clicked(clone!(@weak self as window => move |_| {
let preferences = adw::PreferencesWindow::builder().build();
window.imp().reset_popover_menu.popdown();
preferences.present();
}));
self_imp
.reset_shortcuts_button
.connect_clicked(clone!(@weak self as window => move |_| {
let shortcuts = gtk::ShortcutsWindow::builder().build();
window.imp().reset_popover_menu.popdown();
shortcuts.present();
}));
}
}

View file

@ -8,7 +8,7 @@ use adw::{Breakpoint, OverlaySplitView};
use glib::subclass::InitializingObject;
use gtk::prelude::WidgetExt;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, FlowBox, ListBox, PopoverMenu, SearchEntry};
use gtk::{glib, Button, CompositeTemplate, FlowBox, ListBox, SearchEntry};
use crate::components::base::utils::{Listeners, Position};
use crate::components::wifi::wifi_box::WifiBox;
@ -31,15 +31,7 @@ pub struct ReSetWindow {
#[template_child]
pub reset_sidebar_toggle: TemplateChild<Button>,
#[template_child]
pub reset_popover_menu: TemplateChild<PopoverMenu>,
#[template_child]
pub reset_close: TemplateChild<Button>,
#[template_child]
pub reset_about_button: TemplateChild<Button>,
#[template_child]
pub reset_preference_button: TemplateChild<Button>,
#[template_child]
pub reset_shortcuts_button: TemplateChild<Button>,
pub sidebar_entries: RefCell<Vec<(SidebarEntry, Vec<SidebarEntry>)>>,
pub listeners: Arc<Listeners>,
pub position: Rc<RefCell<Position>>,
@ -70,8 +62,8 @@ impl ObjectImpl for ReSetWindow {
self.parent_constructed();
let obj = self.obj();
obj.setup_shortcuts();
obj.setup_callback();
obj.setup_popover_buttons();
obj.handle_dynamic_sidebar();
obj.setup_sidebar_entries();
}

View file

@ -1,6 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gio" version="2.0"/>
<requires lib="gtk" version="4.12"/>
<requires lib="libadwaita" version="1.4"/>
<template class="resetUI" parent="AdwApplicationWindow">
@ -38,33 +39,7 @@
<property name="hexpand">True</property>
<property name="hexpand-set">True</property>
<property name="icon-name">open-menu-symbolic</property>
<property name="popover">
<object class="GtkPopoverMenu" id="reset_popover_menu">
<property name="child">
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkButton" id="reset_shortcuts_button">
<property name="has-frame">False</property>
<property name="label">Shortcuts</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset_preference_button">
<property name="has-frame">False</property>
<property name="label">Preferences</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset_about_button">
<property name="has-frame">False</property>
<property name="label">About</property>
</object>
</child>
</object>
</property>
</object>
</property>
<property name="menu-model">main_menu</property>
<property name="valign">end</property>
<property name="vexpand">True</property>
</object>
@ -152,4 +127,14 @@
</object>
</child>
</template>
<menu id="main_menu">
<item>
<attribute name="action">win.about</attribute>
<attribute name="label">About</attribute>
</item>
<item>
<attribute name="action">win.show-help-overlay</attribute>
<attribute name="label">Shortcuts</attribute>
</item>
</menu>
</interface>

View file

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gio" version="2.0"/>
<menu id="menu">
<item>
<attribute name="action">win.about</attribute>
<attribute name="label">About</attribute>
</item>
<item>
<attribute name="action">win.show-help-overlay</attribute>
<attribute name="label">Shortcuts</attribute>
</item>
</menu>
</interface>

View file

@ -0,0 +1,39 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkShortcutsWindow" id="help_overlay">
<child>
<object class="GtkShortcutsSection">
<child>
<object class="GtkShortcutsGroup">
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;Ctrl&gt;F</property>
<property name="action-name">win.search</property>
<property name="icon-set">True</property>
<property name="title">Search for Setting</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;Ctrl&gt;Q</property>
<property name="action-name">win.close</property>
<property name="icon-set">True</property>
<property name="title">Close ReSet</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="accelerator">&lt;Ctrl&gt;A</property>
<property name="action-name">win.about</property>
<property name="icon-set">True</property>
<property name="title">Show about window</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View file

@ -21,7 +21,8 @@
(20,None,None,"resetCardEntry.ui",None,None,None,None,None,None,None),
(21,1,None,"resetWifiOptions.ui",None,None,None,None,None,None,None),
(22,1,None,"resetWifiAddressEntry.ui",None,None,None,None,None,None,None),
(23,1,None,"resetWifiRouteEntry.ui",None,None,None,None,None,None,None)
(23,1,None,"resetWifiRouteEntry.ui",None,None,None,None,None,None,None),
(24,None,None,"resetShortcuts.ui",None,None,None,None,None,None,None)
</ui>
<ui_library>
(21,"gtk","4.12",None),
@ -40,17 +41,23 @@
(3,26,"GtkButton","reset_sidebar_toggle",25,None,None,None,None,None),
(3,31,"GtkButton","reset_close",25,None,None,None,2,None),
(3,33,"GtkMenuButton",None,25,None,None,None,1,None),
(3,35,"GtkPopoverMenu","reset_popover_menu",33,None,None,None,-1,None),
(3,36,"GtkBox",None,35,None,None,None,-1,None),
(3,38,"GtkButton","reset_preference_button",36,None,None,None,1,None),
(3,39,"GtkButton","reset_about_button",36,None,None,None,2,None),
(3,40,"GtkScrolledWindow",None,18,None,None,None,1,None),
(3,41,"GtkViewport",None,40,None,None,None,None,None),
(3,42,"GtkListBox","reset_sidebar_list",41,None,None,None,None,None),
(3,43,"GtkScrolledWindow",None,3,None,None,None,1,None),
(3,44,"GtkViewport",None,43,None,None,None,None,None),
(3,45,"GtkFlowBox","reset_main",44,None,None,None,None,None),
(3,51,"GtkButton","reset_shortcuts_button",36,None,None,None,None,None),
(3,54,"(menu)","main_menu",None,None,None,None,None,None),
(3,59,"(external)","54",None,None,None,None,None,None),
(3,61,"(external)","59",None,None,None,None,None,None),
(3,63,"(external)","61",None,None,None,None,None,None),
(3,65,"(external)","63",None,None,None,None,None,None),
(3,69,"(external)","67",None,None,None,None,None,None),
(3,72,"(external)","71",None,None,None,None,None,None),
(3,73,"(item)",None,54,None,None,None,1,None),
(3,74,"(external)","72",None,None,None,None,None,None),
(3,75,"(item)",None,54,None,None,None,2,None),
(3,76,"(external)","74",None,None,None,None,None,None),
(4,7,"GtkBox","resetWifi",None,None,None,None,None,None),
(4,152,"AdwNavigationView","reset_wifi_navigation",7,None,None,None,1,None),
(4,153,"AdwNavigationPage",None,152,None,None,None,None,None),
@ -284,7 +291,13 @@
(23,8,"AdwEntryRow","reset_route_metric",6,None,None,None,1,None),
(23,9,"GtkBox",None,2,None,None,None,None,None),
(23,10,"AdwEntryRow","reset_route_address",9,None,None,None,None,None),
(23,11,"AdwEntryRow","reset_route_prefix",9,None,None,None,1,None)
(23,11,"AdwEntryRow","reset_route_prefix",9,None,None,None,1,None),
(24,1,"GtkShortcutsWindow","help_overlay",None,None,None,None,-1,None),
(24,2,"GtkShortcutsSection",None,1,None,None,None,-1,None),
(24,3,"GtkShortcutsGroup",None,2,None,None,None,-1,None),
(24,4,"GtkShortcutsShortcut",None,3,None,None,None,-1,None),
(24,5,"GtkShortcutsShortcut",None,3,None,None,None,-1,None),
(24,6,"GtkShortcutsShortcut",None,3,None,None,None,2,None)
</object>
<object_property>
(3,1,"GtkWidget","height-request","200",None,None,None,None,None,None,None,None,None),
@ -316,18 +329,12 @@
(3,33,"GtkMenuButton","can-shrink","True",None,None,None,None,None,None,None,None,None),
(3,33,"GtkMenuButton","has-frame","False",None,None,None,None,None,None,None,None,None),
(3,33,"GtkMenuButton","icon-name","open-menu-symbolic",None,None,None,None,None,None,None,None,None),
(3,33,"GtkMenuButton","popover",None,None,None,None,None,35,None,None,None,None),
(3,33,"GtkMenuButton","menu-model","54",None,None,None,None,None,None,None,None,None),
(3,33,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(3,33,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(3,33,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
(3,33,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
(3,33,"GtkWidget","vexpand","True",None,None,None,None,None,None,None,None,None),
(3,35,"GtkPopover","child",None,None,None,None,None,36,None,None,None,None),
(3,36,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(3,38,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
(3,38,"GtkButton","label","Preferences",None,None,None,None,None,None,None,None,None),
(3,39,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
(3,39,"GtkButton","label","About",None,None,None,None,None,None,None,None,None),
(3,40,"GtkScrolledWindow","propagate-natural-height","True",None,None,None,None,None,None,None,None,None),
(3,40,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(3,42,"GtkWidget","css-name","resetList",None,None,None,None,None,None,None,None,None),
@ -340,8 +347,10 @@
(3,45,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
(3,45,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(3,45,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(3,51,"GtkButton","has-frame","False",None,None,None,None,None,None,None,None,None),
(3,51,"GtkButton","label","Shortcuts",None,None,None,None,None,None,None,None,None),
(3,73,"(item)","action","win.about",None,None,None,None,None,None,None,None,None),
(3,73,"(item)","label","About",None,None,None,None,None,None,None,None,None),
(3,75,"(item)","action","win.show-help-overlay",None,None,None,None,None,None,None,None,None),
(3,75,"(item)","label","Shortcuts",None,None,None,None,None,None,None,None,None),
(4,7,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(4,7,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(4,7,"GtkWidget","hexpand-set","True",None,None,None,None,None,None,None,None,None),
@ -804,7 +813,19 @@
(23,10,"AdwPreferencesRow","title","Address",None,None,None,None,None,None,None,None,None),
(23,10,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(23,11,"AdwPreferencesRow","title","Prefix",None,None,None,None,None,None,None,None,None),
(23,11,"GtkEditable","max-width-chars","5",None,None,None,None,None,None,None,None,None)
(23,11,"GtkEditable","max-width-chars","5",None,None,None,None,None,None,None,None,None),
(24,4,"GtkShortcutsShortcut","accelerator","&lt;Ctrl&gt;F",None,None,None,None,None,None,None,None,None),
(24,4,"GtkShortcutsShortcut","action-name","win.search",None,None,None,None,None,None,None,None,None),
(24,4,"GtkShortcutsShortcut","icon-set","True",None,None,None,None,None,None,None,None,None),
(24,4,"GtkShortcutsShortcut","title","Search for Setting",None,None,None,None,None,None,None,None,None),
(24,5,"GtkShortcutsShortcut","accelerator","&lt;Ctrl&gt;Q",None,None,None,None,None,None,None,None,None),
(24,5,"GtkShortcutsShortcut","action-name","win.close",None,None,None,None,None,None,None,None,None),
(24,5,"GtkShortcutsShortcut","icon-set","True",None,None,None,None,None,None,None,None,None),
(24,5,"GtkShortcutsShortcut","title","Close ReSet",None,None,None,None,None,None,None,None,None),
(24,6,"GtkShortcutsShortcut","accelerator","&lt;Ctrl&gt;A",None,None,None,None,None,None,None,None,None),
(24,6,"GtkShortcutsShortcut","action-name","win.about",None,None,None,None,None,None,None,None,None),
(24,6,"GtkShortcutsShortcut","icon-set","True",None,None,None,None,None,None,None,None,None),
(24,6,"GtkShortcutsShortcut","title","Show about window",None,None,None,None,None,None,None,None,None)
</object_property>
<object_data>
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),

View file

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/Xetibo/ReSet/">
<!--Main window-->
<!--Main
window-->
<file compressed="true" preprocess="xml-stripblanks">resetMainWindow.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetSidebarEntry.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetSettingBox.ui</file>
@ -26,6 +27,8 @@
<file compressed="true" preprocess="xml-stripblanks">resetSourceEntry.ui</file>
<!--Misc-->
<file compressed="true" preprocess="xml-stripblanks">resetPopup.ui</file>
<file compressed="true" preprocess="xml-stripblanks" alias="gtk/help-overlay.ui">resetShortcuts.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetMenu.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetCardEntry.ui</file>
</gresource>
</gresources>