pub struct PluginHandler<A: PluginApp> { /* private fields */ }
Expand description
§Example
ⓘ
PluginHandler::builder()
.name("Test Plugin")
.description("A test plugin for Everything")
.author("Chaoses-Ib")
.version("0.1.0")
.link("https://github.com/Chaoses-Ib/IbEverythingLib")
.options_pages(vec![
OptionsPage::builder()
.name("Test Plugin")
.load(ui::winio::spawn::<options::MainModel>)
.build(),
])
.build()
§Design
- Config may be accessed from multiple threads, and options pages need to modify it. To avoid race conditions, either config is cloned when modifying, and then
PluginApp
is reloaded with it, i.e. [arc_swap::ArcSwap
]; orPluginApp
is shutdown before modifying and then restarted. - User defined static to work around generic static limit.
- Interior mutability to make it easy to use with
static
. ButUnsafeCell
to avoid cost.
- Interior mutability to make it easy to use with
Config lifetime:
- May be set with
PluginHandler::builder()
(as default value) - May be loaded when
sys::EVERYTHING_PLUGIN_PM_START
- Be read when start
- Be read when loading (and rendering) options pages (
sys::EVERYTHING_PLUGIN_PM_LOAD_OPTIONS_PAGE
) - Be written/applied when
sys::EVERYTHING_PLUGIN_PM_SAVE_OPTIONS_PAGE
, zero, one or multiple times- TODO: Defer
- Be saved when
sys::EVERYTHING_PLUGIN_PM_SAVE_SETTINGS
(can occur without priorsys::EVERYTHING_PLUGIN_PM_SAVE_OPTIONS_PAGE
)
Implementations§
Source§impl<A: PluginApp> PluginHandler<A>
impl<A: PluginApp> PluginHandler<A>
pub fn get_language_name(&self) -> String
Source§impl<A: PluginApp> PluginHandler<A>
impl<A: PluginApp> PluginHandler<A>
Source§impl<A: PluginApp> PluginHandler<A>
impl<A: PluginApp> PluginHandler<A>
pub fn add_options_pages(&self, data: *mut c_void) -> *mut c_void
Sourcepub fn load_options_page(&self, data: *mut c_void) -> *mut c_void
pub fn load_options_page(&self, data: *mut c_void) -> *mut c_void
Evertyhing only loads a options page when the user selects it
TODO: tooltip_hwnd
pub fn load_options_page_winio<'a, T: OptionsPageComponent<'a>>( &self, data: *mut c_void, ) -> *mut c_void
Available on crate feature
winio
only.pub fn save_options_page(&self, data: *mut c_void) -> *mut c_void
pub fn get_options_page_minmax(&self, _data: *mut c_void) -> *mut c_void
pub fn size_options_page(&self, _data: *mut c_void) -> *mut c_void
pub fn options_page_proc(&self, data: *mut c_void) -> *mut c_void
pub fn kill_options_page(&self, data: *mut c_void) -> *mut c_void
Source§impl<A: PluginApp> PluginHandler<A>
impl<A: PluginApp> PluginHandler<A>
Sourcepub fn builder() -> PluginHandlerBuilder<A>
pub fn builder() -> PluginHandlerBuilder<A>
Create an instance of PluginHandler
using the builder syntax
Source§impl<A: PluginApp> PluginHandler<A>
impl<A: PluginApp> PluginHandler<A>
Sourcepub fn init_start(&self)
pub fn init_start(&self)
Panics if already initialized.
Sourcepub fn init_start_with_config(&self, config: A::Config)
pub fn init_start_with_config(&self, config: A::Config)
Panics if already initialized.
Sourcepub fn get_host(&self) -> Option<&PluginHost>
pub fn get_host(&self) -> Option<&PluginHost>
None
before handling EVERYTHING_PLUGIN_PM_INIT
Sourcepub fn host(&self) -> &PluginHost
pub fn host(&self) -> &PluginHost
Not available before handling EVERYTHING_PLUGIN_PM_INIT
pub fn handle_init_i18n(_msg: u32, _data: *mut c_void)
Sourcepub fn handle(&self, msg: u32, data: *mut c_void) -> *mut c_void
pub fn handle(&self, msg: u32, data: *mut c_void) -> *mut c_void
You shouldn’t and unlikely need to call this function from multiple threads.
pub fn instance_name(&self) -> Option<&str>
Sourcepub unsafe fn app(&self) -> &A
pub unsafe fn app(&self) -> &A
Not available during saving config and recreated afterwards. Use Self::with_app
instead when possible.
Sourcepub fn with_app<T>(&self, f: impl FnOnce(&A) -> T) -> T
pub fn with_app<T>(&self, f: impl FnOnce(&A) -> T) -> T
Not available during saving config.
Examples found in repository?
examples/options/options.rs (lines 55-67)
35 fn init(mut init: Self::Init<'_>, sender: &ComponentSender<Self>) -> Self {
36 let mut window = init.window(sender);
37 // window.set_size(Size::new(800.0, 600.0));
38
39 let mut enabled = Child::<CheckBox>::init(&window);
40 enabled.set_text("Enable");
41
42 let mut b = Child::<CheckBox>::init(&window);
43 b.set_text("Switch");
44
45 let mut e_label = Child::<Label>::init(&window);
46 e_label.set_text("Mode:");
47 let mut e = Child::<ComboBox>::init(&window);
48 e.insert(0, "A");
49 e.insert(1, "B");
50
51 let mut s_label = Child::<Label>::init(&window);
52 s_label.set_text("Message:");
53 let mut s = Child::<Edit>::init(&window);
54
55 HANDLER.with_app(|a| {
56 let config = a.config();
57
58 enabled.set_checked(config.enabled);
59 b.set_checked(config.b);
60
61 e.set_selection(Some(match config.e {
62 Mode::A => 0,
63 Mode::B => 1,
64 }));
65
66 s.set_text(&config.s);
67 });
68
69 sender.post(MainMessage::EnabledClick);
70
71 window.show();
72
73 Self {
74 window,
75 enabled,
76 b,
77 s_label,
78 s,
79 e_label,
80 e,
81 }
82 }
More examples
examples/test/widgets.rs (line 128)
67 fn init(mut init: Self::Init<'_>, sender: &ComponentSender<Self>) -> Self {
68 // let mut window = Child::<Window>::init(init);
69 let mut window = init.window(sender);
70 window.set_text("Widgets example");
71 window.set_size(Size::new(800.0, 600.0));
72 init! {
73 canvas: Canvas = (&window),
74 ulabel: Label = (&window) => {
75 text: "Username:",
76 halign: HAlign::Right,
77 },
78 plabel: Label = (&window) => {
79 text: "Password:",
80 halign: HAlign::Right,
81 },
82 uentry: Edit = (&window) => {
83 text: "AAA",
84 },
85 pentry: Edit = (&window) => {
86 text: "123456",
87 password: true,
88 },
89 pcheck: CheckBox = (&window) => {
90 text: "Show",
91 checked: false,
92 },
93 combo: ComboBox = (&window),
94 list: ObservableVec<String> = (()) => {
95 // https://www.zhihu.com/question/23600507/answer/140640887
96 items: [
97 "烫烫烫",
98 "昍昍昍",
99 "フフフフフフ",
100 "쳌쳌쳌"
101 ],
102 },
103 r1: RadioButton = (&window) => {
104 text: "屯屯屯",
105 checked: true,
106 },
107 r2: RadioButton = (&window) => {
108 text: "锟斤拷",
109 },
110 r3: RadioButton = (&window) => {
111 text: "╠╠╠"
112 },
113 push_button: Button = (&window) => {
114 text: "Push",
115 },
116 pop_button: Button = (&window) => {
117 text: "Pop",
118 },
119 show_button: Button = (&window) => {
120 text: "Show",
121 },
122 progress: Progress = (&window) => {
123 indeterminate: true,
124 },
125 mltext: TextBox = (&window) => {
126 },
127 }
128 HANDLER.with_app(|a| mltext.set_text(&a.config().s));
129
130 window.show();
131
132 Self {
133 window,
134 ulabel,
135 plabel,
136 uentry,
137 pentry,
138 pcheck,
139 canvas,
140 combo,
141 list,
142 index: None,
143 r1,
144 r2,
145 r3,
146 rindex: 0,
147 push_button,
148 pop_button,
149 show_button,
150 progress,
151 mltext,
152 }
153 }
Trait Implementations§
impl<A: PluginApp> Send for PluginHandler<A>
impl<A: PluginApp> Sync for PluginHandler<A>
Auto Trait Implementations§
impl<A> !Freeze for PluginHandler<A>
impl<A> !RefUnwindSafe for PluginHandler<A>
impl<A> Unpin for PluginHandler<A>where
A: Unpin,
impl<A> !UnwindSafe for PluginHandler<A>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more