1
0
mirror of synced 2024-11-25 12:13:09 +01:00

Refactored UI to not use view macro

Placeholders for serializing configuration
This commit is contained in:
Mark van Renswoude 2024-06-15 11:52:21 +02:00
parent e07a3bbb1b
commit beb24e985e
7 changed files with 206 additions and 21 deletions

75
Linux/Cargo.lock generated
View File

@ -9,9 +9,11 @@ dependencies = [
"env_logger", "env_logger",
"log", "log",
"min-rs", "min-rs",
"platform-dirs",
"relm4", "relm4",
"relm4-icons", "relm4-icons",
"rust-i18n", "rust-i18n",
"serde",
"slint-build", "slint-build",
"walkdir", "walkdir",
] ]
@ -358,6 +360,27 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "dirs-next"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf36e65a80337bea855cd4ef9b8401ffce06a7baedf2e85ec467b1ac3f6e82b6"
dependencies = [
"cfg-if",
"dirs-sys-next",
]
[[package]]
name = "dirs-sys-next"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
dependencies = [
"libc",
"redox_users",
"winapi",
]
[[package]] [[package]]
name = "displaydoc" name = "displaydoc"
version = "0.2.4" version = "0.2.4"
@ -1297,6 +1320,16 @@ version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
[[package]]
name = "libredox"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
dependencies = [
"bitflags 2.5.0",
"libc",
]
[[package]] [[package]]
name = "linked-hash-map" name = "linked-hash-map"
version = "0.5.6" version = "0.5.6"
@ -1535,6 +1568,15 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
[[package]]
name = "platform-dirs"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e188d043c1a692985f78b5464853a263f1a27e5bd6322bad3a4078ee3c998a38"
dependencies = [
"dirs-next",
]
[[package]] [[package]]
name = "png" name = "png"
version = "0.17.13" version = "0.17.13"
@ -1624,6 +1666,17 @@ dependencies = [
"crossbeam-utils", "crossbeam-utils",
] ]
[[package]]
name = "redox_users"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891"
dependencies = [
"getrandom",
"libredox",
"thiserror",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.10.5" version = "1.10.5"
@ -2514,6 +2567,22 @@ version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]] [[package]]
name = "winapi-util" name = "winapi-util"
version = "0.1.8" version = "0.1.8"
@ -2523,6 +2592,12 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.52.0" version = "0.52.0"

View File

@ -7,9 +7,11 @@ build = "build.rs"
[dependencies] [dependencies]
env_logger = "0.11.3" env_logger = "0.11.3"
log = "0.4.21" log = "0.4.21"
platform-dirs = "0.3.0"
relm4 = "0.8.1" relm4 = "0.8.1"
relm4-icons = "0.8.3" relm4-icons = "0.8.3"
rust-i18n = "3.0.1" rust-i18n = "3.0.1"
serde = "1.0.203"
[dependencies.min-rs] [dependencies.min-rs]
git = "https://github.com/MvRens/min-rs.git" git = "https://github.com/MvRens/min-rs.git"

View File

@ -3,3 +3,14 @@ _version: 2
mainwindow: mainwindow:
title: title:
en: MassiveKnob en: MassiveKnob
tab:
device:
en: Device
analoginputs:
en: Analog inputs
digitalinputs:
en: Digital inputs
analogoutputs:
en: Analog outputs
digitaloutputs:
en: Digital outputs

55
Linux/src/config.rs Normal file
View File

@ -0,0 +1,55 @@
use std::path::{Path, PathBuf};
use std::io::{Error, Read, Write};
use platform_dirs::AppDirs;
pub struct Config
{
root: PathBuf
}
impl Config
{
pub fn new() -> Self
{
let appdirs = AppDirs::new(Some("massiveknob"), false).unwrap();
Self
{
root: appdirs.data_dir
}
}
pub fn get_reader(&self, name: &str) -> Option<impl Read>
{
let path = Path::join(&self.root, name);
if !path.exists()
{
return None;
}
match std::fs::File::open(path)
{
Ok(v) => Some(v),
Err(_) => None
}
}
pub fn get_writer(&self, name: &str) -> Result<impl Write, Error>
{
let path = Path::join(&self.root, name);
if !path.exists()
{
match std::fs::create_dir_all(path.clone())
{
Ok(_v) => (),
Err(e) => return Err(e)
}
}
std::fs::File::create(path)
}
}

View File

@ -1,6 +1,6 @@
use emulatorwindow::EmulatorWindow; //use emulatorwindow::EmulatorWindow;
use relm4::prelude::*; //use relm4::prelude::*;
use relm4::gtk::prelude::GtkApplicationExt; //use relm4::gtk::prelude::GtkApplicationExt;
use super::registry::{MkDevice, register_device}; use super::registry::{MkDevice, register_device};
@ -12,10 +12,12 @@ pub mod emulatorwindow;
pub fn register() pub fn register()
{ {
register_device(MkDevice::new("Emulator")); register_device(MkDevice::new("Emulator"));
}
/*
let app = relm4::main_application(); let app = relm4::main_application();
let builder = EmulatorWindow::builder(); let builder = EmulatorWindow::builder();
app.add_window(&builder.root); app.add_window(&builder.root);
builder.launch(()).detach_runtime(); builder.launch(()).detach_runtime();
} */

View File

@ -10,6 +10,7 @@ i18n!("locales");
pub mod devices; pub mod devices;
pub mod actions; pub mod actions;
pub mod config;
pub mod mainwindow; pub mod mainwindow;
fn main() fn main()
@ -18,12 +19,20 @@ fn main()
// .format_timestamp(None) // .format_timestamp(None)
.init(); .init();
//devices::register(); devices::register();
actions::register(); actions::register();
relm4_icons::initialize_icons(); relm4_icons::initialize_icons();
let app = RelmApp::new("com.github.mvrens.massiveknob"); load_config();
let app = RelmApp::new("com.github.mvrens.massiveknob");
app.run::<mainwindow::MainWindow>(()); app.run::<mainwindow::MainWindow>(());
}
fn load_config()
{
//let config = config::Config::new();
//config.get_reader(name)
} }

View File

@ -7,36 +7,51 @@ pub struct MainWindow
#[derive(Debug)] #[derive(Debug)]
pub enum Msg pub enum MainWindowMsg
{
}
pub struct MainWindowWidgets
{ {
} }
#[relm4::component(pub)]
impl SimpleComponent for MainWindow impl SimpleComponent for MainWindow
{ {
type Init = (); type Init = ();
type Input = Msg; type Input = MainWindowMsg;
type Output = (); type Output = ();
type Root = gtk::Window;
type Widgets = MainWindowWidgets;
view!
{ fn init_root() -> Self::Root
gtk::Window {
{ // I prefer not to use the view! macro, as VSCode / rust-analyzer will not provide autocompletion
set_title: Some(&t!("mainwindow.title")), gtk::Window::builder()
set_default_size: (300, 100) .title(t!("mainwindow.title"))
} .default_width(500)
.default_height(500)
.build()
} }
fn init(_data: Self::Init, root: Self::Root, _sender: ComponentSender<Self>, ) -> ComponentParts<Self> fn init(_data: Self::Init, window: Self::Root, _sender: ComponentSender<Self>, ) -> ComponentParts<Self>
{ {
// TEMP - device should not use GTK at register time
crate::devices::register();
let model = MainWindow {}; let model = MainWindow {};
let widgets = view_output!(); let tabs = gtk::Notebook::builder().build();
window.set_child(Some(&tabs));
add_box_tab(&tabs, "mainwindow.tab.device");
add_box_tab(&tabs, "mainwindow.tab.analoginputs");
add_box_tab(&tabs, "mainwindow.tab.digitalinputs");
//add_box_tab(&tabs, "mainwindow.tab.analogoutputs");
//add_box_tab(&tabs, "mainwindow.tab.digitaloutputs");
let widgets = MainWindowWidgets {};
ComponentParts { model, widgets } ComponentParts { model, widgets }
} }
@ -47,4 +62,20 @@ impl SimpleComponent for MainWindow
{ {
} }
} }
}
fn add_box_tab(notebook: &gtk::Notebook, title_key: &str) -> gtk::Box
{
let tab = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
.build();
let tab_label = gtk::Label::builder()
.label(t!(title_key))
.build();
notebook.append_page(&tab, Some(&tab_label));
tab
} }