plugin_system

This commit is contained in:
Tsuki 2024-01-26 20:09:43 +08:00
parent 8a855557da
commit faf1995470
6 changed files with 225 additions and 49 deletions

143
Cargo.lock generated
View File

@ -18,6 +18,54 @@ 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 = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
[[package]]
name = "abi_stable"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69d6512d3eb05ffe5004c59c206de7f99c34951504056ce23fc953842f12c445"
dependencies = [
"abi_stable_derive",
"abi_stable_shared",
"const_panic",
"core_extensions",
"crossbeam-channel",
"generational-arena",
"libloading 0.7.4",
"lock_api",
"parking_lot",
"paste 1.0.14",
"repr_offset",
"rustc_version",
"serde",
"serde_derive",
"serde_json",
]
[[package]]
name = "abi_stable_derive"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7178468b407a4ee10e881bc7a328a65e739f0863615cca4429d43916b05e898"
dependencies = [
"abi_stable_shared",
"as_derive_utils",
"core_extensions",
"proc-macro2 1.0.76",
"quote 1.0.35",
"rustc_version",
"syn 1.0.109",
"typed-arena",
]
[[package]]
name = "abi_stable_shared"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2b5df7688c123e63f4d4d649cba63f2967ba7f7861b1664fca3f77d3dad2b63"
dependencies = [
"core_extensions",
]
[[package]] [[package]]
name = "addr2line" name = "addr2line"
version = "0.20.0" version = "0.20.0"
@ -128,6 +176,18 @@ version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "as_derive_utils"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff3c96645900a44cf11941c111bd08a6573b0e2f9f69bc9264b179d8fae753c4"
dependencies = [
"core_extensions",
"proc-macro2 1.0.76",
"quote 1.0.35",
"syn 1.0.109",
]
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.77" version = "0.1.77"
@ -419,6 +479,7 @@ dependencies = [
name = "cinrad_g" name = "cinrad_g"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"abi_stable",
"anyhow", "anyhow",
"async-trait", "async-trait",
"cairo-rs", "cairo-rs",
@ -552,6 +613,12 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed3d0b5ff30645a68f35ece8cea4556ca14ef8a1651455f789a099a0513532a6" checksum = "ed3d0b5ff30645a68f35ece8cea4556ca14ef8a1651455f789a099a0513532a6"
[[package]]
name = "const_panic"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b"
[[package]] [[package]]
name = "constant_time_eq" name = "constant_time_eq"
version = "0.1.5" version = "0.1.5"
@ -610,6 +677,21 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "core_extensions"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92c71dc07c9721607e7a16108336048ee978c3a8b129294534272e8bac96c0ee"
dependencies = [
"core_extensions_proc_macros",
]
[[package]]
name = "core_extensions_proc_macros"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69f3b219d28b6e3b4ac87bc1fc522e0803ab22e055da177bff0068c4150c61a6"
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.2.8" version = "0.2.8"
@ -1485,7 +1567,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0051e4d4b01c6e853d7db02f181d08ee0e19d6a53e91bdf80543ceb062f0b57" checksum = "a0051e4d4b01c6e853d7db02f181d08ee0e19d6a53e91bdf80543ceb062f0b57"
dependencies = [ dependencies = [
"bork", "bork",
"paste", "paste 0.1.18",
] ]
[[package]] [[package]]
@ -2496,6 +2578,29 @@ dependencies = [
"system-deps", "system-deps",
] ]
[[package]]
name = "parking_lot"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.4.1",
"smallvec",
"windows-targets 0.48.1",
]
[[package]] [[package]]
name = "password-hash" name = "password-hash"
version = "0.4.2" version = "0.4.2"
@ -2517,6 +2622,12 @@ dependencies = [
"proc-macro-hack", "proc-macro-hack",
] ]
[[package]]
name = "paste"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]] [[package]]
name = "paste-impl" name = "paste-impl"
version = "0.1.18" version = "0.1.18"
@ -3008,6 +3119,15 @@ dependencies = [
"syn 2.0.48", "syn 2.0.48",
] ]
[[package]]
name = "repr_offset"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb1070755bd29dffc19d0971cab794e607839ba2ef4b69a9e6fbc8733c1b72ea"
dependencies = [
"tstr",
]
[[package]] [[package]]
name = "rgb" name = "rgb"
version = "0.8.36" version = "0.8.36"
@ -3640,6 +3760,21 @@ dependencies = [
"syn 2.0.48", "syn 2.0.48",
] ]
[[package]]
name = "tstr"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cca3264971090dec0feef3b455a3c178f02762f7550cf4592991ac64b3be2d7e"
dependencies = [
"tstr_proc_macros",
]
[[package]]
name = "tstr_proc_macros"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e78122066b0cb818b8afd08f7ed22f7fdbc3e90815035726f0840d0d26c0747a"
[[package]] [[package]]
name = "ttf-parser" name = "ttf-parser"
version = "0.17.1" version = "0.17.1"
@ -3658,6 +3793,12 @@ version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4"
[[package]]
name = "typed-arena"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.16.0" version = "1.16.0"

View File

@ -67,6 +67,7 @@ gl = "0.14.0"
crossbeam = "0.8.4" crossbeam = "0.8.4"
chrono = "0.4.32" chrono = "0.4.32"
tracker = "0.2.1" tracker = "0.2.1"
abi_stable = "0.11.3"
# plotters-cairo = "0.5.0" # plotters-cairo = "0.5.0"

View File

@ -1,41 +1,36 @@
use super::{control_panel::ControlPanelModel, render_panel::RenderPanelModel}; use super::{control_panel::ControlPanelModel, render_panel::RenderPanelModel};
use gtk::{ use gtk::{
prelude::{ prelude::{ApplicationExt, BoxExt, GtkWindowExt, WidgetExt},
ApplicationExt, BoxExt, ButtonExt, DialogExt, GtkWindowExt, ToggleButtonExt, WidgetExt,
},
traits::OrientableExt, traits::OrientableExt,
}; };
use relm4::actions::{AccelsPlus, ActionablePlus, RelmAction, RelmActionGroup}; use relm4::actions::{AccelsPlus, RelmAction, RelmActionGroup};
use relm4::*; use relm4::*;
use relm4::{gtk, ComponentParts, ComponentSender, RelmWidgetExt, SimpleComponent}; use relm4::{gtk, ComponentParts, ComponentSender, RelmWidgetExt, SimpleComponent};
use relm4_components::open_dialog::{
OpenDialog, OpenDialogMsg, OpenDialogResponse, OpenDialogSettings,
};
relm4::new_action_group!(WindowActionGroup, "win"); relm4::new_action_group!(FileActionGroup, "file");
relm4::new_stateless_action!(ExampleAction, WindowActionGroup, "example"); relm4::new_stateless_action!(OpenAction, FileActionGroup, "open");
relm4::new_stateful_action!(ExampleU8Action, WindowActionGroup, "example2", u8, u8);
#[derive(Debug)]
pub enum AppMode {
View,
Edit,
Export,
}
#[derive(Debug)] #[derive(Debug)]
pub enum AppMsg { pub enum AppMsg {
SetMode(AppMode),
CloseRequest, CloseRequest,
Close, Close,
OpenDialog,
OpenDialogMulti,
} }
pub struct AppModel { pub struct AppModel {
mode: AppMode, open_dialog: Controller<OpenDialog>,
control: Controller<ControlPanelModel>, control: Controller<ControlPanelModel>,
render: Controller<RenderPanelModel>, render: Controller<RenderPanelModel>,
} }
#[relm4::component(pub)] #[relm4::component(pub)]
impl SimpleComponent for AppModel { impl SimpleComponent for AppModel {
type Init = AppMode; type Init = ();
type Input = AppMsg; type Input = AppMsg;
type Output = (); type Output = ();
@ -45,19 +40,35 @@ impl SimpleComponent for AppModel {
set_default_width: 1200, set_default_width: 1200,
set_default_height: 900, set_default_height: 900,
set_focus_on_click:true, set_focus_on_click:true,
connect_close_request[sender,app] => move |_| {
sender.input(AppMsg::CloseRequest);
app.quit();
gtk::Inhibit(true)
},
gtk::Box{ gtk::Box{
set_orientation: gtk::Orientation::Vertical, set_orientation: gtk::Orientation::Vertical,
set_valign:gtk::Align::Fill, set_valign:gtk::Align::Fill,
set_spacing:2, set_spacing:2,
adw::HeaderBar { gtk::HeaderBar{
#[wrap(Some)]
set_title_widget = &adw::WindowTitle {
}
}, },
// adw::HeaderBar {
// #[wrap(Some)]
// set_title_widget = &adw::WindowTitle {},
// connect_show_end_title_buttons_notify[sender] => move |_| {
// println!("show end title buttons");
// sender.input(AppMsg::OpenDialog);
// },
// // connect_close_request[sender] => move |_| {
// // sender.input(AppMsg::CloseRequest);
// // gtk::Inhibit(true)
// // },
// }
gtk::Box{ gtk::Box{
set_margin_top: 2, set_margin_top: 2,
set_margin_horizontal: 10, set_margin_horizontal: 10,
gtk::PopoverMenuBar::from_model(Some(&main_menu))->gtk::PopoverMenuBar{}, gtk::PopoverMenuBar::from_model(Some(&main_menu))->gtk::PopoverMenuBar{
set_hexpand:true,
},
}, },
model.control.widget(), model.control.widget(),
model.render.widget(), model.render.widget(),
@ -76,10 +87,18 @@ impl SimpleComponent for AppModel {
menu! { menu! {
main_menu: { main_menu: {
"File" { "File" {
"Example" => ExampleAction, "Open" => OpenAction,
"Example2" => ExampleAction, "Open Folder" => OpenAction,
"Example toggle" => ExampleU8Action(1_u8), },
} "Edit" {
"New Layer" => OpenAction,
"Undo" => OpenAction,
"Redo" => OpenAction,
},
"Plugins" {
"Plugin1" => OpenAction,
"Plugin2" => OpenAction,
},
} }
} }
@ -96,37 +115,50 @@ impl SimpleComponent for AppModel {
.launch(()) .launch(())
.forward(sender.input_sender(), |a| AppMsg::Close); .forward(sender.input_sender(), |a| AppMsg::Close);
let dialog = OpenDialog::builder()
.transient_for_native(&root)
.launch(OpenDialogSettings::default())
.forward(sender.input_sender(), |response| match response {
OpenDialogResponse::Accept(path) => {
println!("Open file: {:?}", path);
AppMsg::Close
}
OpenDialogResponse::Cancel => AppMsg::Close,
});
let app = relm4::main_application(); let app = relm4::main_application();
relm4_icons::initialize_icons(); relm4_icons::initialize_icons();
app.set_accelerators_for_action::<ExampleAction>(&["<primary>W"]);
let action: RelmAction<ExampleAction> = {
RelmAction::new_stateless(move |_| {
println!("Statelesss action!");
})
};
let action2: RelmAction<ExampleU8Action> =
RelmAction::new_stateful_with_target_value(&0, |_, state, _value| {
*state ^= 1;
dbg!(state);
});
let model = AppModel { let model = AppModel {
mode: AppMode::View, open_dialog: dialog,
control: control, control: control,
render: render, render: render,
}; };
let widgets = view_output!(); let widgets = view_output!();
let mut group = RelmActionGroup::<WindowActionGroup>::new(); let mut group = RelmActionGroup::<FileActionGroup>::new();
app.set_accelerators_for_action::<OpenAction>(&["<primary>O"]);
let action: RelmAction<OpenAction> = {
RelmAction::new_stateless(move |_| {
sender.input(AppMsg::OpenDialog);
})
};
group.add_action(action); group.add_action(action);
group.add_action(action2);
group.register_for_widget(&widgets.main_window); group.register_for_widget(&widgets.main_window);
ComponentParts { model, widgets } ComponentParts { model, widgets }
} }
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {} fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
match msg {
AppMsg::CloseRequest => {
}
AppMsg::Close => {}
AppMsg::OpenDialog => {
self.open_dialog.emit(OpenDialogMsg::Open);
}
AppMsg::OpenDialogMulti => {}
}
}
} }

View File

@ -1,3 +1,5 @@
#![allow(unused)]
#![allow(dead_code)]
mod utils; mod utils;
use gtk::gio; use gtk::gio;
use std::ptr; use std::ptr;
@ -13,7 +15,8 @@ mod pipeline;
mod render; mod render;
mod timeline; mod timeline;
mod window; mod window;
use components::app::{AppMode, AppModel}; mod plugin_system;
use components::app::AppModel;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
const APP_ID: &str = "org.tsuki.radar_g"; const APP_ID: &str = "org.tsuki.radar_g";
@ -39,17 +42,16 @@ fn main() {
.or_else(|_| libloading::os::windows::Library::open_already_loaded("epoxy-0.dll")) .or_else(|_| libloading::os::windows::Library::open_already_loaded("epoxy-0.dll"))
.unwrap(); .unwrap();
// gio::resources_register_include!("p.gresource").expect("Failed to register resources.");
epoxy::load_with(|name| { epoxy::load_with(|name| {
unsafe { library.get(name.as_bytes()) } unsafe { library.get(name.as_bytes()) }
.map(|symbol| *symbol) .map(|symbol| *symbol)
.unwrap_or(ptr::null()) .unwrap_or(ptr::null())
}); });
} }
let relm = relm4::RelmApp::new(APP_ID); let relm = relm4::RelmApp::new(APP_ID);
initialize_custom_css(); initialize_custom_css();
relm.run::<AppModel>(AppMode::Edit); relm.run::<AppModel>(());
} }
fn initialize_custom_css() { fn initialize_custom_css() {

0
src/plugin_system/mod.rs Normal file
View File

View File

@ -59,5 +59,5 @@ pub fn creator() {
}; };
renderer.set_screen_target(Some(fbo)); renderer.set_screen_target(Some(fbo));
device.destroy_context(&mut context); device.destroy_context(&mut context).unwrap();
} }