Add Bluetooth UI

This commit is contained in:
takotori 2023-10-28 14:21:22 +02:00
parent 01835f0018
commit eeebfe3033
12 changed files with 381 additions and 13 deletions

View file

@ -0,0 +1,46 @@
use gtk::{CompositeTemplate, glib, ListBox, Switch};
use gtk::prelude::*;
use gtk::subclass::prelude::*;
use crate::bluetooth::BluetoothEntry;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/xetibo/reset/resetBluetooth.ui")]
pub struct BluetoothBox {
#[template_child]
pub resetBluetoothSwitch: TemplateChild<Switch>,
#[template_child]
pub resetBluetoothAvailableDevices: TemplateChild<ListBox>,
#[template_child]
pub resetBluetoothConnectedDevices: TemplateChild<ListBox>,
}
#[glib::object_subclass]
impl ObjectSubclass for BluetoothBox {
const NAME: &'static str = "resetBluetooth";
type Type = super::BluetoothBox;
type ParentType = gtk::Box;
fn class_init(klass: &mut Self::Class) {
BluetoothEntry::ensure_type();
klass.bind_template();
}
fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {
obj.init_template();
}
}
impl ObjectImpl for BluetoothBox {
fn constructed(&self) {
self.parent_constructed();
}
}
impl BoxImpl for BluetoothBox {}
impl WidgetImpl for BluetoothBox {}
impl WindowImpl for BluetoothBox {}
impl ApplicationWindowImpl for BluetoothBox {}

View file

@ -0,0 +1,43 @@
use gtk::{Button, CompositeTemplate, glib, Image, Label};
use gtk::subclass::prelude::*;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/xetibo/reset/resetBluetoothEntry.ui")]
pub struct BluetoothEntry {
#[template_child]
pub resetBluetoothDeviceType: TemplateChild<Image>,
#[template_child]
pub resetBluetoothLabel: TemplateChild<Label>,
#[template_child]
pub resetBluetoothButton: TemplateChild<Button>,
}
#[glib::object_subclass]
impl ObjectSubclass for BluetoothEntry {
const NAME: &'static str = "resetBluetoothEntry";
type Type = super::BluetoothEntry;
type ParentType = gtk::ListBoxRow;
fn class_init(klass: &mut Self::Class) {
klass.bind_template();
}
fn instance_init(obj: &glib::subclass::InitializingObject<Self>) {
obj.init_template();
}
}
impl ObjectImpl for BluetoothEntry {
fn constructed(&self) {
self.parent_constructed();
}
}
impl ListBoxRowImpl for BluetoothEntry {}
impl WidgetImpl for BluetoothEntry {}
impl WindowImpl for BluetoothEntry {}
impl ApplicationWindowImpl for BluetoothEntry {}

30
src/bluetooth/mod.rs Normal file
View file

@ -0,0 +1,30 @@
#![allow(non_snake_case)]
mod bluetoothBox;
mod bluetoothEntry;
use adw::glib::Object;
use gtk::{glib};
glib::wrapper! {
pub struct BluetoothBox(ObjectSubclass<bluetoothBox::BluetoothBox>)
@extends gtk::Box, gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
}
glib::wrapper! {
pub struct BluetoothEntry(ObjectSubclass<bluetoothEntry::BluetoothEntry>)
@extends gtk::Widget,
@implements gtk::Accessible, gtk::Buildable, gtk::Actionable, gtk::ConstraintTarget;
}
impl BluetoothBox {
pub fn new() -> Self {
Object::builder().build()
}
}
impl BluetoothEntry {
pub fn new() -> Self {
Object::builder().build()
}
}

View file

@ -1,6 +1,7 @@
mod window;
mod audio;
mod wifi;
mod bluetooth;
use gtk::prelude::*;
use gtk::{Application, gio};

View file

@ -0,0 +1,109 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gtk" version="4.12"/>
<requires lib="libadwaita" version="1.4"/>
<template class="resetBluetooth" parent="GtkBox">
<property name="halign">start</property>
<property name="margin-start">5</property>
<property name="orientation">vertical</property>
<property name="valign">start</property>
<property name="width-request">300</property>
<child>
<object class="GtkBox">
<property name="margin-bottom">5</property>
<child>
<object class="GtkLabel">
<property name="label">Bluetooth</property>
</object>
</child>
<child>
<object class="GtkSwitch" id="resetBluetoothSwitch">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="valign">end</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwClampScrollable">
<property name="maximum-size">0</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="valign">start</property>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="justify">right</property>
<property name="label">Available device</property>
</object>
</child>
<child>
<object class="GtkListBox" id="resetBluetoothAvailableDevices">
<property name="valign">start</property>
<child>
<object class="resetBluetoothEntry"/>
</child>
<child>
<object class="resetBluetoothEntry"/>
</child>
<child>
<object class="resetBluetoothEntry"/>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparator">
<property name="margin-bottom">5</property>
<property name="margin-top">5</property>
</object>
</child>
<child>
<object class="AdwClampScrollable">
<property name="maximum-size">0</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="valign">start</property>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="justify">right</property>
<property name="label">Connected devices</property>
</object>
</child>
<child>
<object class="GtkListBox" id="resetBluetoothConnectedDevices">
<property name="valign">start</property>
<child>
<object class="resetBluetoothEntry"/>
</child>
<child>
<object class="resetBluetoothEntry"/>
</child>
<child>
<object class="resetBluetoothEntry"/>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkButton">
<property name="halign">start</property>
<property name="label">Advanced</property>
<property name="valign">start</property>
</object>
</child>
</template>
</interface>

View file

@ -0,0 +1,33 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.17.0 -->
<interface>
<requires lib="gtk" version="4.12"/>
<template class="resetBluetoothEntry" parent="GtkListBoxRow">
<child>
<object class="GtkBox">
<child>
<object class="GtkImage" id="resetBluetoothDeviceType">
<property name="icon-name">input-mouse-symbolic</property>
<property name="margin-end">15</property>
</object>
</child>
<child>
<object class="GtkLabel" id="resetBluetoothLabel">
<property name="ellipsize">end</property>
<property name="hexpand">True</property>
<property name="label">LoremIpsum Wireless Mouse</property>
<property name="margin-end">10</property>
<property name="single-line-mode">True</property>
<property name="width-request">200</property>
<property name="xalign">0.0</property>
</object>
</child>
<child>
<object class="GtkButton" id="resetBluetoothButton">
<property name="icon-name">emblem-system-symbolic</property>
</object>
</child>
</object>
</child>
</template>
</interface>

View file

@ -7,7 +7,9 @@
(5,1,None,"resetWifiEntry",None,None,None,None,None,None,None),
(6,1,None,"resetSidebarEntry",None,None,None,None,None,None,None),
(7,1,None,"resetAudioSourceEntry",None,None,None,None,None,None,None),
(8,1,None,"resetAudio",None,None,None,None,None,None,None)
(8,1,None,"resetAudio",None,None,None,None,None,None,None),
(10,1,None,"resetBluetooth",None,None,None,None,None,None,None),
(11,1,None,"resetBluetoothEntry",None,None,None,None,None,None,None)
</ui>
<object>
(3,1,"AdwApplicationWindow","resetUI",None,None,None,None,-1," &lt;child&gt;\n &lt;object id=\"resetSidebarBreakpoint\" class=\"AdwBreakpoint\"&gt;\n &lt;/object&gt;\n &lt;/child&gt;"),
@ -30,18 +32,21 @@
(3,31,"GtkButton","resetClose",25,None,None,None,5,None),
(3,32,"GtkFlowBox","resetMain",3,None,None,None,1,None),
(4,7,"GtkBox","resetWifi",None,None,None,None,None,None),
(4,8,"AdwClampScrollable",None,7,None,None,None,None,None),
(4,8,"AdwClampScrollable",None,7,None,None,None,1,None),
(4,9,"GtkBox",None,8,None,None,None,None,None),
(4,10,"GtkLabel",None,9,None,None,None,None,None),
(4,11,"GtkListBox","resetWifiList",9,None,None,None,1,None),
(4,42,"GtkButton",None,7,None,None,None,1,None),
(4,42,"GtkButton",None,7,None,None,None,2,None),
(4,44,"resetWifiEntry",None,11,None,None,None,1,None),
(4,45,"resetWifiEntry",None,11,None,None,None,1,None),
(4,45,"resetWifiEntry",None,11,None,None,None,None,None),
(4,46,"resetWifiEntry",None,11,None,None,None,2,None),
(4,47,"resetWifiEntry",None,11,None,None,None,3,None),
(4,48,"resetWifiEntry",None,11,None,None,None,4,None),
(4,49,"resetWifiEntry",None,11,None,None,None,5,None),
(4,50,"resetWifiEntry",None,11,None,None,None,6,None),
(4,51,"GtkBox",None,7,None,None,None,None,None),
(4,52,"GtkLabel",None,51,None,None,None,None,None),
(4,53,"GtkSwitch","resetWiFiSwitch",51,None,None,None,1,None),
(5,1,"GtkListBoxRow","resetWifiEntry",None,None,None,None,None,None),
(5,2,"GtkBox",None,1,None,None,None,None,None),
(5,3,"GtkImage","resetWifiStrength",2,None,None,None,None,None),
@ -66,7 +71,32 @@
(8,14,"GtkBox",None,1,None,None,None,None,None),
(8,15,"GtkLabel",None,14,None,None,None,None,None),
(8,16,"GtkDropDown","resetOutputDevice",14,None,None,None,1,None),
(8,18,"GtkSeparator",None,1,None,None,None,1,None)
(8,18,"GtkSeparator",None,1,None,None,None,1,None),
(10,1,"GtkBox","resetBluetooth",None,None,None,None,None,None),
(10,2,"AdwClampScrollable",None,1,None,None,None,1,None),
(10,3,"GtkBox",None,2,None,None,None,None,None),
(10,4,"GtkLabel",None,3,None,None,None,None,None),
(10,5,"GtkListBox","resetBluetoothAvailableDevices",3,None,None,None,1,None),
(10,14,"AdwClampScrollable",None,1,None,None,None,3,None),
(10,15,"GtkBox",None,14,None,None,None,None,None),
(10,16,"GtkLabel",None,15,None,None,None,None,None),
(10,17,"GtkListBox","resetBluetoothConnectedDevices",15,None,None,None,1,None),
(10,18,"GtkButton",None,1,None,None,None,4,None),
(10,19,"GtkBox",None,1,None,None,None,None,None),
(10,20,"GtkLabel",None,19,None,None,None,None,None),
(10,21,"GtkSwitch","resetBluetoothSwitch",19,None,None,None,1,None),
(10,22,"resetBluetoothEntry",None,5,None,None,None,-1,None),
(10,23,"resetBluetoothEntry",None,5,None,None,None,1,None),
(10,24,"resetBluetoothEntry",None,5,None,None,None,2,None),
(10,25,"resetBluetoothEntry",None,17,None,None,None,None,None),
(10,26,"resetBluetoothEntry",None,17,None,None,None,1,None),
(10,27,"resetBluetoothEntry",None,17,None,None,None,2,None),
(10,28,"GtkSeparator",None,1,None,None,None,2,None),
(11,1,"GtkListBoxRow","resetBluetoothEntry",None,None,None,None,None,None),
(11,2,"GtkBox",None,1,None,None,None,None,None),
(11,3,"GtkImage","resetBluetoothDeviceType",2,None,None,None,None,None),
(11,4,"GtkLabel","resetBluetoothLabel",2,None,None,None,1,None),
(11,5,"GtkButton","resetBluetoothButton",2,None,None,None,2,None)
</object>
<object_property>
(3,1,"GtkWindow","default-height","500",None,None,None,None,None,None,None,None,None),
@ -109,7 +139,9 @@
(3,32,"GtkWidget","valign","start",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","halign","start",None,None,None,None,None,None,None,None,None),
(4,7,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(4,7,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(4,7,"GtkWidget","width-request","300",None,None,None,None,None,None,None,None,None),
(4,8,"AdwClampScrollable","maximum-size","0",None,None,None,None,None,None,None,None,None),
(4,8,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(4,9,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
@ -121,6 +153,11 @@
(4,42,"GtkButton","label","Advanced",None,None,None,None,None,None,None,None,None),
(4,42,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(4,42,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(4,51,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(4,52,"GtkLabel","label","WiFi",None,None,None,None,None,None,None,None,None),
(4,53,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(4,53,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(4,53,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
(5,3,"GtkImage","icon-name","network-wireless-symbolic",None,None,None,None,None,None,None,None,None),
(5,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None),
(5,4,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None),
@ -161,7 +198,6 @@
(7,12,"GtkWidget","width-request","40",None,None,None,None,None,None,None,None,None),
(8,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(8,1,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(8,1,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
(8,1,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(8,1,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(8,1,"GtkWidget","width-request","300",None,None,None,None,None,None,None,None,None),
@ -174,7 +210,48 @@
(8,15,"GtkLabel","label","Output Device",None,None,None,None,None,None,None,None,None),
(8,16,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(8,16,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(8,16,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None)
(8,16,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
(10,1,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,1,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(10,1,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
(10,1,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,1,"GtkWidget","width-request","300",None,None,None,None,None,None,None,None,None),
(10,2,"AdwClampScrollable","maximum-size","0",None,None,None,None,None,None,None,None,None),
(10,2,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,3,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,3,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,4,"GtkLabel","justify","right",None,None,None,None,None,None,None,None,None),
(10,4,"GtkLabel","label","Available device",None,None,None,None,None,None,None,None,None),
(10,4,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(10,5,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,14,"AdwClampScrollable","maximum-size","0",None,None,None,None,None,None,None,None,None),
(10,14,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,15,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
(10,15,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,16,"GtkLabel","justify","right",None,None,None,None,None,None,None,None,None),
(10,16,"GtkLabel","label","Connected devices",None,None,None,None,None,None,None,None,None),
(10,16,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(10,17,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,18,"GtkButton","label","Advanced",None,None,None,None,None,None,None,None,None),
(10,18,"GtkWidget","halign","start",None,None,None,None,None,None,None,None,None),
(10,18,"GtkWidget","valign","start",None,None,None,None,None,None,None,None,None),
(10,19,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(10,20,"GtkLabel","label","Bluetooth",None,None,None,None,None,None,None,None,None),
(10,21,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
(10,21,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(10,21,"GtkWidget","valign","end",None,None,None,None,None,None,None,None,None),
(10,28,"GtkWidget","margin-bottom","5",None,None,None,None,None,None,None,None,None),
(10,28,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
(11,3,"GtkImage","icon-name","input-mouse-symbolic",None,None,None,None,None,None,None,None,None),
(11,3,"GtkWidget","margin-end","15",None,None,None,None,None,None,None,None,None),
(11,4,"GtkLabel","ellipsize","end",None,None,None,None,None,None,None,None,None),
(11,4,"GtkLabel","label","LoremIpsum Wireless Mouse",None,None,None,None,None,None,None,None,None),
(11,4,"GtkLabel","single-line-mode","True",None,None,None,None,None,None,None,None,None),
(11,4,"GtkLabel","xalign","0.0",None,None,None,None,None,None,None,None,None),
(11,4,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
(11,4,"GtkWidget","margin-end","10",None,None,None,None,None,None,None,None,None),
(11,4,"GtkWidget","width-request","200",None,None,None,None,None,None,None,None,None),
(11,5,"GtkButton","icon-name","emblem-system-symbolic",None,None,None,None,None,None,None,None,None)
</object_property>
<object_data>
(3,23,"GtkWidget",1,1,None,None,None,None,None,None),

View file

@ -5,9 +5,27 @@
<requires lib="libadwaita" version="1.4"/>
<template class="resetWifi" parent="GtkBox">
<property name="halign">start</property>
<property name="margin-start">5</property>
<property name="orientation">vertical</property>
<property name="valign">start</property>
<property name="width-request">300</property>
<child>
<object class="GtkBox">
<property name="margin-bottom">5</property>
<child>
<object class="GtkLabel">
<property name="label">WiFi</property>
</object>
</child>
<child>
<object class="GtkSwitch" id="resetWiFiSwitch">
<property name="halign">end</property>
<property name="hexpand">True</property>
<property name="valign">end</property>
</object>
</child>
</object>
</child>
<child>
<object class="AdwClampScrollable">
<property name="maximum-size">0</property>

View file

@ -5,6 +5,8 @@
<file compressed="true" preprocess="xml-stripblanks">resetSidebarEntry.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetWiFi.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetWifiEntry.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetBluetooth.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetBluetoothEntry.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetAudio.ui</file>
<file compressed="true" preprocess="xml-stripblanks">resetAudioSourceEntry.ui</file>
</gresource>

View file

@ -23,4 +23,8 @@ impl WifiBox {
}
}
impl WifiEntry {}
impl WifiEntry {
pub fn new() -> Self {
Object::builder().build()
}
}

View file

@ -1,10 +1,14 @@
use gtk::{Button, CompositeTemplate, glib};
use gtk::{Button, CompositeTemplate, glib, Image, Label};
use gtk::subclass::prelude::*;
#[allow(non_snake_case)]
#[derive(Default, CompositeTemplate)]
#[template(resource = "/org/xetibo/reset/resetWifiEntry.ui")]
pub struct WifiEntry {
#[template_child]
pub resetWifiStrength: TemplateChild<Image>,
#[template_child]
pub resetWifiLabel: TemplateChild<Label>,
#[template_child]
pub resetWifiButton: TemplateChild<Button>,
}

View file

@ -1,5 +1,6 @@
use gtk::FlowBox;
use crate::audio::AudioBox;
use crate::bluetooth::BluetoothBox;
use crate::wifi::WifiBox;
pub const HANDLE_CONNECTIVITY_CLICK: fn(FlowBox) = |resetMain: FlowBox| {
@ -15,9 +16,9 @@ pub const HANDLE_WIFI_CLICK: fn(FlowBox) = |resetMain: FlowBox| {
};
pub const HANDLE_BLUETOOTH_CLICK: fn(FlowBox) = |resetMain: FlowBox| {
let wifibox = WifiBox::new();
let bluetoothBox = BluetoothBox::new();
resetMain.remove_all();
resetMain.insert(&wifibox, -1);
resetMain.insert(&bluetoothBox, -1);
};
pub const HANDLE_VPN_CLICK: fn(FlowBox) = |resetMain: FlowBox| {
@ -33,9 +34,9 @@ pub const HANDLE_AUDIO_CLICK: fn(FlowBox) = |resetMain: FlowBox| {
};
pub const HANDLE_VOLUME_CLICK: fn(FlowBox) = |resetMain: FlowBox| {
let wifibox = WifiBox::new();
let audioBox = AudioBox::new();
resetMain.remove_all();
resetMain.insert(&wifibox, -1);
resetMain.insert(&audioBox, -1);
};
pub const HANDLE_MICROPHONE_CLICK: fn(FlowBox) = |resetMain: FlowBox| {