mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-25 06:00:54 +03:00
106 lines
2.9 KiB
Rust
106 lines
2.9 KiB
Rust
use std::{
|
|
cell::{Cell, RefCell},
|
|
os::unix::net::UnixStream,
|
|
};
|
|
|
|
use adw::subclass::prelude::*;
|
|
use adw::{
|
|
prelude::{EditableExt, WidgetExt},
|
|
ActionRow, ToastOverlay,
|
|
};
|
|
use glib::subclass::InitializingObject;
|
|
use gtk::{gio, glib, Button, CompositeTemplate, Entry, ListBox};
|
|
|
|
use crate::config::DEFAULT_PORT;
|
|
|
|
#[derive(CompositeTemplate, Default)]
|
|
#[template(resource = "/de/feschber/LanMouse/window.ui")]
|
|
pub struct Window {
|
|
#[template_child]
|
|
pub port_edit_apply: TemplateChild<Button>,
|
|
#[template_child]
|
|
pub port_edit_cancel: TemplateChild<Button>,
|
|
#[template_child]
|
|
pub client_list: TemplateChild<ListBox>,
|
|
#[template_child]
|
|
pub client_placeholder: TemplateChild<ActionRow>,
|
|
#[template_child]
|
|
pub port_entry: TemplateChild<Entry>,
|
|
#[template_child]
|
|
pub toast_overlay: TemplateChild<ToastOverlay>,
|
|
pub clients: RefCell<Option<gio::ListStore>>,
|
|
pub stream: RefCell<Option<UnixStream>>,
|
|
pub port: Cell<u16>,
|
|
}
|
|
|
|
#[glib::object_subclass]
|
|
impl ObjectSubclass for Window {
|
|
// `NAME` needs to match `class` attribute of template
|
|
const NAME: &'static str = "LanMouseWindow";
|
|
type Type = super::Window;
|
|
type ParentType = adw::ApplicationWindow;
|
|
|
|
fn class_init(klass: &mut Self::Class) {
|
|
klass.bind_template();
|
|
klass.bind_template_callbacks();
|
|
}
|
|
|
|
fn instance_init(obj: &InitializingObject<Self>) {
|
|
obj.init_template();
|
|
}
|
|
}
|
|
|
|
#[gtk::template_callbacks]
|
|
impl Window {
|
|
#[template_callback]
|
|
fn handle_add_client_pressed(&self, _button: &Button) {
|
|
self.obj().request_client_create();
|
|
}
|
|
|
|
#[template_callback]
|
|
fn handle_port_changed(&self, _entry: &Entry) {
|
|
self.port_edit_apply.set_visible(true);
|
|
self.port_edit_cancel.set_visible(true);
|
|
}
|
|
|
|
#[template_callback]
|
|
fn handle_port_edit_apply(&self) {
|
|
self.obj().request_port_change();
|
|
}
|
|
|
|
#[template_callback]
|
|
fn handle_port_edit_cancel(&self) {
|
|
log::debug!("cancel port edit");
|
|
self.port_entry
|
|
.set_text(self.port.get().to_string().as_str());
|
|
self.port_edit_apply.set_visible(false);
|
|
self.port_edit_cancel.set_visible(false);
|
|
}
|
|
|
|
pub fn set_port(&self, port: u16) {
|
|
self.port.set(port);
|
|
if port == DEFAULT_PORT {
|
|
self.port_entry.set_text("");
|
|
} else {
|
|
self.port_entry.set_text(format!("{port}").as_str());
|
|
}
|
|
self.port_edit_apply.set_visible(false);
|
|
self.port_edit_cancel.set_visible(false);
|
|
}
|
|
}
|
|
|
|
impl ObjectImpl for Window {
|
|
fn constructed(&self) {
|
|
self.parent_constructed();
|
|
self.set_port(DEFAULT_PORT);
|
|
let obj = self.obj();
|
|
obj.setup_icon();
|
|
obj.setup_clients();
|
|
}
|
|
}
|
|
|
|
impl WidgetImpl for Window {}
|
|
impl WindowImpl for Window {}
|
|
impl ApplicationWindowImpl for Window {}
|
|
impl AdwApplicationWindowImpl for Window {}
|