mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-20 11:40:55 +03:00
The gtk frontend can now be built in windows! The github workflow is updated to build GTK and add it to the releases section.
111 lines
3.0 KiB
Rust
111 lines
3.0 KiB
Rust
use std::cell::{Cell, RefCell};
|
|
|
|
#[cfg(windows)]
|
|
use std::net::TcpStream;
|
|
#[cfg(unix)]
|
|
use std::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>>,
|
|
#[cfg(unix)]
|
|
pub stream: RefCell<Option<UnixStream>>,
|
|
#[cfg(windows)]
|
|
pub stream: RefCell<Option<TcpStream>>,
|
|
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 {}
|