feat: Add dynamic window expansion

This commit is contained in:
Fabio Lenherr / DashieTM 2023-12-06 11:47:47 +01:00
parent e03dad964b
commit 4836f1d8c2
10 changed files with 61 additions and 49 deletions

View file

@ -5,14 +5,14 @@ use std::time::{Duration, SystemTime};
use adw::glib;
use adw::glib::Object;
use adw::prelude::{ComboRowExt, ListModelExtManual};
use adw::prelude::{ComboRowExt, ListModelExtManual, PreferencesGroupExt};
use adw::subclass::prelude::ObjectSubclassIsExt;
use dbus::blocking::Connection;
use dbus::message::SignalArgs;
use dbus::{Error, Path};
use glib::{clone, Cast};
use gtk::glib::Variant;
use gtk::prelude::{ActionableExt, BoxExt, ButtonExt, ListBoxRowExt, WidgetExt};
use gtk::prelude::{ActionableExt, ButtonExt, ListBoxRowExt, WidgetExt};
use gtk::{gio, StringObject, Widget};
use ReSet_Lib::bluetooth::bluetooth::{BluetoothAdapter, BluetoothDevice};
use ReSet_Lib::signals::{BluetoothDeviceAdded, BluetoothDeviceChanged, BluetoothDeviceRemoved};
@ -183,9 +183,9 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
.borrow_mut()
.insert(path, (bluetooth_entry.clone(), entry.clone(), device));
if connected {
imp.reset_bluetooth_connected_devices.append(&*entry);
imp.reset_bluetooth_connected_devices.add(&*entry);
} else {
imp.reset_bluetooth_available_devices.append(&*entry);
imp.reset_bluetooth_available_devices.add(&*entry);
}
}
});
@ -245,9 +245,9 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
(bluetooth_entry.clone(), entry.clone(), ir.bluetooth_device),
);
if connected {
imp.reset_bluetooth_connected_devices.append(&*entry);
imp.reset_bluetooth_connected_devices.add(&*entry);
} else {
imp.reset_bluetooth_available_devices.append(&*entry);
imp.reset_bluetooth_available_devices.add(&*entry);
}
});
});
@ -287,10 +287,10 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
if let Some(list_entry) = map.get(&ir.bluetooth_device.path) {
if list_entry.2.connected != ir.bluetooth_device.connected {
if ir.bluetooth_device.connected {
imp.reset_bluetooth_connected_devices.append(&*list_entry.1);
imp.reset_bluetooth_connected_devices.add(&*list_entry.1);
imp.reset_bluetooth_available_devices.remove(&*list_entry.1);
} else {
imp.reset_bluetooth_available_devices.append(&*list_entry.1);
imp.reset_bluetooth_available_devices.add(&*list_entry.1);
imp.reset_bluetooth_connected_devices.remove(&*list_entry.1);
}
}

View file

@ -1,4 +1,4 @@
use adw::{ActionRow, ComboRow};
use adw::{ActionRow, ComboRow, PreferencesGroup};
use dbus::Path;
use gtk::subclass::prelude::*;
use gtk::{glib, Button, CompositeTemplate, Switch};
@ -21,13 +21,13 @@ pub struct BluetoothBox {
#[template_child]
pub reset_bluetooth_switch: TemplateChild<Switch>,
#[template_child]
pub reset_bluetooth_available_devices: TemplateChild<gtk::Box>,
pub reset_bluetooth_available_devices: TemplateChild<PreferencesGroup>,
#[template_child]
pub reset_bluetooth_refresh_button: TemplateChild<Button>,
#[template_child]
pub reset_bluetooth_adapter: TemplateChild<ComboRow>,
#[template_child]
pub reset_bluetooth_connected_devices: TemplateChild<gtk::Box>,
pub reset_bluetooth_connected_devices: TemplateChild<PreferencesGroup>,
#[template_child]
pub reset_visibility: TemplateChild<ActionRow>,
#[template_child]

View file

@ -13,7 +13,7 @@ use crate::components::wifi::wifi_box::{
scan_for_wifi, show_stored_connections, start_event_listener, WifiBox,
};
use gtk::prelude::WidgetExt;
use gtk::{FlowBox, Frame};
use gtk::{Align, FlowBox, FlowBoxChild, Frame};
pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
|listeners: Arc<Listeners>, reset_main: FlowBox| {
@ -22,11 +22,11 @@ pub const HANDLE_CONNECTIVITY_CLICK: fn(Arc<Listeners>, FlowBox) =
start_event_listener(listeners.clone(), wifi_box.clone());
show_stored_connections(wifi_box.clone());
scan_for_wifi(wifi_box.clone());
let wifi_frame = wrap_in_frame(SettingBox::new(&*wifi_box));
let wifi_frame = wrap_in_flow_box_child(SettingBox::new(&*wifi_box));
let bluetooth_box = BluetoothBox::new(listeners.clone());
populate_conntected_bluetooth_devices(bluetooth_box.clone());
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
let bluetooth_frame = wrap_in_frame(SettingBox::new(&*bluetooth_box));
let bluetooth_frame = wrap_in_flow_box_child(SettingBox::new(&*bluetooth_box));
reset_main.remove_all();
reset_main.insert(&wifi_frame, -1);
reset_main.insert(&bluetooth_frame, -1);
@ -41,7 +41,7 @@ pub const HANDLE_WIFI_CLICK: fn(Arc<Listeners>, FlowBox) =
start_event_listener(listeners.clone(), wifi_box.clone());
show_stored_connections(wifi_box.clone());
scan_for_wifi(wifi_box.clone());
let wifi_frame = wrap_in_frame(SettingBox::new(&*wifi_box));
let wifi_frame = wrap_in_flow_box_child(SettingBox::new(&*wifi_box));
reset_main.remove_all();
reset_main.insert(&wifi_frame, -1);
reset_main.set_max_children_per_line(1);
@ -54,7 +54,7 @@ pub const HANDLE_BLUETOOTH_CLICK: fn(Arc<Listeners>, FlowBox) =
let bluetooth_box = BluetoothBox::new(listeners.clone());
start_bluetooth_listener(listeners.clone(), bluetooth_box.clone());
populate_conntected_bluetooth_devices(bluetooth_box.clone());
let bluetooth_frame = wrap_in_frame(SettingBox::new(&*bluetooth_box));
let bluetooth_frame = wrap_in_flow_box_child(SettingBox::new(&*bluetooth_box));
reset_main.remove_all();
reset_main.insert(&bluetooth_frame, -1);
reset_main.set_max_children_per_line(1);
@ -72,9 +72,9 @@ pub const HANDLE_AUDIO_CLICK: fn(Arc<Listeners>, FlowBox) =
Some(audio_input.clone()),
);
populate_sinks(audio_output.clone());
let audio_frame = wrap_in_frame(SettingBox::new(&*audio_output));
let audio_frame = wrap_in_flow_box_child(SettingBox::new(&*audio_output));
populate_sources(audio_input.clone());
let source_frame = wrap_in_frame(SettingBox::new(&*audio_input));
let source_frame = wrap_in_flow_box_child(SettingBox::new(&*audio_input));
reset_main.remove_all();
reset_main.insert(&audio_frame, -1);
reset_main.insert(&source_frame, -1);
@ -91,7 +91,7 @@ pub const HANDLE_VOLUME_CLICK: fn(Arc<Listeners>, FlowBox) =
std::hint::spin_loop()
}
populate_sinks(audio_output.clone());
let audio_frame = wrap_in_frame(SettingBox::new(&*audio_output));
let audio_frame = wrap_in_flow_box_child(SettingBox::new(&*audio_output));
reset_main.remove_all();
reset_main.insert(&audio_frame, -1);
reset_main.set_max_children_per_line(1);
@ -104,7 +104,7 @@ pub const HANDLE_MICROPHONE_CLICK: fn(Arc<Listeners>, FlowBox) =
let audio_input = Arc::new(SourceBox::new());
start_audio_listener(listeners.clone(), None, Some(audio_input.clone()));
populate_sources(audio_input.clone());
let source_frame = wrap_in_frame(SettingBox::new(&*audio_input));
let source_frame = wrap_in_flow_box_child(SettingBox::new(&*audio_input));
reset_main.remove_all();
reset_main.insert(&source_frame, -1);
reset_main.set_max_children_per_line(1);
@ -118,11 +118,15 @@ pub const HANDLE_HOME: fn(Arc<Listeners>, FlowBox) =
reset_main.remove_all();
};
fn wrap_in_frame(widget: SettingBox) -> Frame {
fn wrap_in_flow_box_child(widget: SettingBox) -> FlowBoxChild {
let frame = Frame::new(None);
frame.set_child(Some(&widget));
frame.add_css_class("resetSettingFrame");
frame
FlowBoxChild::builder()
.child(&frame)
.halign(Align::Fill)
.valign(Align::Start)
.build()
}
// for future implementations

View file

@ -1,7 +1,7 @@
use adw::glib::clone;
use adw::subclass::prelude::ObjectSubclassIsExt;
use adw::BreakpointCondition;
use glib::Object;
use adw::{ApplicationWindow, BreakpointCondition};
use glib::{closure_local, Object};
use gtk::prelude::*;
use gtk::{gio, glib, Application, ListBoxRow, Orientation};
@ -12,7 +12,7 @@ use crate::components::window::sidebar_entry_impl::Categories;
glib::wrapper! {
pub struct ReSetWindow(ObjectSubclass<reset_window_impl::ReSetWindow>)
@extends gtk::ApplicationWindow, gtk::Window, gtk::Widget,
@extends adw::ApplicationWindow, gtk::Window, gtk::Widget,
@implements gio::ActionGroup, gio::ActionMap, gtk::Accessible, gtk::Buildable,
gtk::ConstraintTarget, gtk::Native, gtk::Root, gtk::ShortcutManager;
}
@ -54,18 +54,13 @@ impl ReSetWindow {
.connect_clicked(clone!(@ weak self as window => move |_| {
window.close();
}));
// selfImp.resetMenu.connect_clicked(|_| {
// WifiBox::donotdisturb();
//
// });
}
pub fn handle_dynamic_sidebar(&self) {
let self_imp = self.imp();
self_imp
.reset_sidebar_breakpoint
.set_condition(BreakpointCondition::parse("max-width: 700sp").as_ref().ok());
.set_condition(BreakpointCondition::parse("max-width: 950sp").as_ref().ok());
self_imp.reset_sidebar_breakpoint.add_setter(
&Object::from(self_imp.reset_overlay_split_view.get()),
"collapsed",
@ -143,6 +138,7 @@ impl ReSetWindow {
true,
HANDLE_BLUETOOTH_CLICK,
),
// uncommented when VPN is implemented
// SidebarEntry::new(
// "VPN",
// "network-vpn-symbolic",
@ -191,6 +187,7 @@ impl ReSetWindow {
audio_list,
));
// uncommented when implemented
// let peripheralsList = vec![
// SidebarEntry::new(
// "Displays",

View file

@ -5,6 +5,7 @@ use adw::glib::StaticTypeExt;
use adw::subclass::prelude::AdwApplicationWindowImpl;
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};
@ -74,7 +75,24 @@ impl ObjectImpl for ReSetWindow {
}
}
impl WidgetImpl for ReSetWindow {}
impl WidgetImpl for ReSetWindow {
fn size_allocate(&self, width: i32, height: i32, baseline: i32) {
// felixusan, use "the force" for debugging
// aka this variable
// println!("{width}");
self.parent_size_allocate(width, height, baseline);
if width > 738 {
self.reset_main.set_margin_start(100);
self.reset_main.set_margin_end(100);
} else if width > 600 {
self.reset_main.set_margin_start((width - 600)/2);
self.reset_main.set_margin_end((width - 600)/2);
} else {
self.reset_main.set_margin_start(0);
self.reset_main.set_margin_end(0);
}
}
}
impl WindowImpl for ReSetWindow {}

View file

@ -74,9 +74,7 @@
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox" id="reset_bluetooth_available_devices">
<property name="orientation">vertical</property>
</object>
<object class="AdwPreferencesGroup" id="reset_bluetooth_available_devices"/>
</child>
</object>
</child>
@ -94,9 +92,7 @@
<child>
<object class="GtkViewport">
<child>
<object class="GtkBox" id="reset_bluetooth_connected_devices">
<property name="orientation">vertical</property>
</object>
<object class="AdwPreferencesGroup" id="reset_bluetooth_connected_devices"/>
</child>
</object>
</child>

View file

@ -2,8 +2,12 @@
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gtk" version="4.12"/>
<requires lib="libadwaita" version="1.0"/>
<template class="resetBluetoothEntry" parent="GtkBox">
<property name="margin-start">5</property>
<child>
<object class="AdwComboRow"/>
</child>
<child>
<object class="GtkImage" id="reset_bluetooth_device_type">
<property name="icon-name">input-mouse-symbolic</property>

View file

@ -90,10 +90,8 @@
<child>
<object class="GtkFlowBox" id="reset_main">
<property name="column-spacing">25</property>
<property name="halign">center</property>
<property name="hexpand">True</property>
<property name="hexpand-set">True</property>
<property name="homogeneous">True</property>
<property name="margin-top">5</property>
<property name="row-spacing">25</property>
<property name="selection-mode">none</property>

View file

@ -3,7 +3,6 @@
<interface>
<requires lib="gtk" version="4.0"/>
<template class="resetSettingBox" parent="GtkBox">
<property name="halign">center</property>
<property name="orientation">vertical</property>
<property name="width-request">500</property>
</template>

View file

@ -153,23 +153,24 @@
(10,177,"GtkButton","reset_bluetooth_refresh_button",176,None,None,None,None,None),
(10,178,"GtkScrolledWindow",None,176,None,None,None,None,None),
(10,179,"GtkViewport",None,178,None,None,None,None,None),
(10,180,"GtkBox","reset_bluetooth_available_devices",179,None,None,None,None,None),
(10,181,"AdwPreferencesGroup",None,121,None,None,None,2,None),
(10,183,"GtkScrolledWindow",None,181,None,None,None,None,None),
(10,184,"GtkViewport",None,183,None,None,None,None,None),
(10,185,"GtkBox","reset_bluetooth_connected_devices",184,None,None,None,None,None),
(10,188,"GtkBox",None,153,None,None,None,4,None),
(10,193,"GtkLabel",None,188,None,None,None,None,None),
(10,196,"GtkSwitch","reset_bluetooth_discoverable_switch",188,None,None,None,1,None),
(10,197,"GtkBox",None,153,None,None,None,3,None),
(10,198,"GtkLabel",None,197,None,None,None,None,None),
(10,199,"GtkSwitch","reset_bluetooth_pairable_switch",197,None,None,None,1,None),
(10,200,"AdwPreferencesGroup","reset_bluetooth_available_devices",179,None,None,None,-1,None),
(10,201,"AdwPreferencesGroup","reset_bluetooth_connected_devices",184,None,None,None,-1,None),
(11,2,"GtkBox","resetBluetoothEntry",None,None,None,None,None,None),
(11,3,"GtkImage","reset_bluetooth_device_type",2,None,None,None,None,None),
(11,3,"GtkImage","reset_bluetooth_device_type",2,None,None,None,1,None),
(11,5,"GtkButton","reset_bluetooth_button",2,None,None,None,3,None),
(11,6,"GtkBox",None,2,None,None,None,2,None),
(11,7,"GtkLabel","reset_bluetooth_label",6,None,None,None,None,None),
(11,8,"GtkLabel","reset_bluetooth_address",6,None,None,None,1,None),
(11,9,"AdwComboRow",None,2,None,None,None,None,None),
(12,11,"GtkBox","resetAudioInput",None,None,None,None,None,None),
(12,12,"GtkLabel",None,11,None,None,None,None,None),
(12,13,"AdwNavigationView",None,11,None,None,None,1,None),
@ -379,10 +380,8 @@
(3,42,"GtkWidget","width-request","150",None,None,None,None,None,None,None,None,None),
(3,43,"GtkScrolledWindow","propagate-natural-height","True",None,None,None,None,None,None,None,None,None),
(3,45,"GtkFlowBox","column-spacing","25",None,None,None,None,None,None,None,None,None),
(3,45,"GtkFlowBox","homogeneous","True",None,None,None,None,None,None,None,None,None),
(3,45,"GtkFlowBox","row-spacing","25",None,None,None,None,None,None,None,None,None),
(3,45,"GtkFlowBox","selection-mode","none",None,None,None,None,None,None,None,None,None),
(3,45,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
(3,45,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(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),
@ -587,11 +586,9 @@
(10,177,"GtkButton","icon-name","view-refresh-symbolic",None,None,None,None,None,None,None,None,None),
(10,178,"GtkScrolledWindow","min-content-height","100",None,None,None,None,None,None,None,None,None),
(10,178,"GtkScrolledWindow","propagate-natural-height","True",None,None,None,None,None,None,None,None,None),
(10,180,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,181,"AdwPreferencesGroup","title","Connected Devices",None,None,None,None,None,None,None,None,None),
(10,183,"GtkScrolledWindow","min-content-height","100",None,None,None,None,None,None,None,None,None),
(10,183,"GtkScrolledWindow","propagate-natural-height","True",None,None,None,None,None,None,None,None,None),
(10,185,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,188,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(10,188,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(10,188,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
@ -717,7 +714,6 @@
(13,41,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(13,42,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
(14,3,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(14,3,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
(14,3,"GtkWidget","width-request","500",None,None,None,None,None,None,None,None,None),
(15,1,"GtkListBoxRow","selectable","False",None,None,None,None,None,None,None,None,None),
(15,1,"GtkWidget","height-request","40",None,None,None,None,None,None,None,None,None),