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
PluginAppis reloaded with it, i.e. [arc_swap::ArcSwap]; orPluginAppis 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. ButUnsafeCellto 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
Sourcepub fn handle_init_i18n(_msg: u32, _data: *mut c_void)
pub fn handle_init_i18n(_msg: u32, _data: *mut c_void)
Should be called before PluginHandler is created, as some fields may depend on the locale.
Already called in the plugin_main! macro. (Requiring manually calling is a footgun: IbEverythingExt #100)
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 58-70)
35 async fn init(
36 mut init: Self::Init<'_>,
37 sender: &ComponentSender<Self>,
38 ) -> Result<Self, Self::Error> {
39 let mut window = init.window(sender).await?;
40 // window.set_size(Size::new(800.0, 600.0));
41
42 let mut enabled = Child::<CheckBox>::init(&window).await?;
43 enabled.set_text("Enable");
44
45 let mut b = Child::<CheckBox>::init(&window).await?;
46 b.set_text("Switch");
47
48 let mut e_label = Child::<Label>::init(&window).await?;
49 e_label.set_text("Mode:");
50 let mut e = Child::<ComboBox>::init(&window).await?;
51 e.insert(0, "A");
52 e.insert(1, "B");
53
54 let mut s_label = Child::<Label>::init(&window).await?;
55 s_label.set_text("Message:");
56 let mut s = Child::<Edit>::init(&window).await?;
57
58 HANDLER.with_app(|a| {
59 let config = a.config();
60
61 enabled.set_checked(config.enabled);
62 b.set_checked(config.b);
63
64 e.set_selection(match config.e {
65 Mode::A => 0,
66 Mode::B => 1,
67 });
68
69 s.set_text(&config.s);
70 });
71
72 sender.post(MainMessage::EnabledClick);
73
74 window.show();
75
76 Ok(Self {
77 window,
78 enabled,
79 b,
80 s_label,
81 s,
82 e_label,
83 e,
84 })
85 }More examples
examples/test/widgets.rs (line 120)
68 async fn init(
69 mut init: Self::Init<'_>,
70 sender: &ComponentSender<Self>,
71 ) -> Result<Self, Self::Error> {
72 // let mut window = Child::<Window>::init(init);
73 let mut window = init.window(sender).await?;
74 // window.set_text("Widgets example");
75 window.set_size(Size::new(800.0, 600.0));
76
77 let canvas = Child::<Canvas>::init(&window).await?;
78 let mut ulabel = Child::<Label>::init(&window).await?;
79 ulabel.set_text("Username:");
80 ulabel.set_halign(HAlign::Right);
81 let mut plabel = Child::<Label>::init(&window).await?;
82 plabel.set_text("Password:");
83 plabel.set_halign(HAlign::Right);
84 let mut uentry = Child::<Edit>::init(&window).await?;
85 uentry.set_text("AAA");
86 let mut pentry = Child::<Edit>::init(&window).await?;
87 pentry.set_text("123456");
88 pentry.set_password(true);
89 let mut pcheck = Child::<CheckBox>::init(&window).await?;
90 pcheck.set_text("Show");
91 pcheck.set_checked(false);
92 let combo = Child::<ComboBox>::init(&window).await?;
93 let mut list = Child::<ObservableVec<String>>::init(Vec::new())
94 .await
95 .unwrap();
96 // https://www.zhihu.com/question/23600507/answer/140640887
97 list.push("烫烫烫".to_string());
98 list.push("昍昍昍".to_string());
99 list.push("フフフフフフ".to_string());
100 list.push("쳌쳌쳌".to_string());
101 let mut r1 = Child::<RadioButton>::init(&window).await?;
102 r1.set_text("屯屯屯");
103 r1.set_checked(true);
104 let mut r2 = Child::<RadioButton>::init(&window).await?;
105 r2.set_text("锟斤拷");
106 let mut r3 = Child::<RadioButton>::init(&window).await?;
107 r3.set_text("╠╠╠");
108 // Initialize radio group with the radio buttons
109 let radio_group = Child::<RadioButtonGroup>::init(vec![r1, r2, r3]).await?;
110
111 let mut push_button = Child::<Button>::init(&window).await?;
112 push_button.set_text("Push");
113 let mut pop_button = Child::<Button>::init(&window).await?;
114 pop_button.set_text("Pop");
115 let mut show_button = Child::<Button>::init(&window).await?;
116 show_button.set_text("Show");
117 let mut progress = Child::<Progress>::init(&window).await?;
118 progress.set_indeterminate(true);
119 let mut mltext = Child::<TextBox>::init(&window).await?;
120 HANDLER.with_app(|a| mltext.set_text(&a.config().s));
121
122 window.show();
123
124 Ok(Self {
125 window,
126 ulabel,
127 plabel,
128 uentry,
129 pentry,
130 pcheck,
131 canvas,
132 combo,
133 list,
134 index: None,
135 radio_group,
136 rindex: 0,
137 push_button,
138 pop_button,
139 show_button,
140 progress,
141 mltext,
142 })
143 }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> UnsafeUnpin for PluginHandler<A>where
A: UnsafeUnpin,
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