Skip to main content

PluginHandler

Struct PluginHandler 

Source
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]; or PluginApp 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. But UnsafeCell to avoid cost.

Config lifetime:

Implementations§

Source§

impl<A: PluginApp> PluginHandler<A>

Source§

impl<A: PluginApp> PluginHandler<A>

Source

pub fn load_settings(&self, data: *mut c_void) -> Option<A::Config>

Source

pub fn save_settings(&self, data: *mut c_void) -> *mut c_void

Source§

impl<A: PluginApp> PluginHandler<A>

Source

pub fn add_options_pages(&self, data: *mut c_void) -> *mut c_void

Source

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

Source

pub fn load_options_page_winio<'a, T: OptionsPageComponent<'a>>( &self, data: *mut c_void, ) -> *mut c_void

Available on crate feature winio only.
Source

pub fn save_options_page(&self, data: *mut c_void) -> *mut c_void

Source

pub fn get_options_page_minmax(&self, _data: *mut c_void) -> *mut c_void

Source

pub fn size_options_page(&self, _data: *mut c_void) -> *mut c_void

Source

pub fn options_page_proc(&self, data: *mut c_void) -> *mut c_void

Source

pub fn kill_options_page(&self, data: *mut c_void) -> *mut c_void

Source§

impl<A: PluginApp> PluginHandler<A>

Source

pub fn builder() -> PluginHandlerBuilder<A>

Create an instance of PluginHandler using the builder syntax

Source§

impl<A: PluginApp> PluginHandler<A>

Source

pub fn init_start(&self)

Panics if already initialized.

Source

pub fn init_start_with_config(&self, config: A::Config)

Panics if already initialized.

Source

pub fn stop_kill(&self)

Panics if not initialized or already stopped.

Source

pub fn get_host(&self) -> Option<&PluginHost>

None before handling EVERYTHING_PLUGIN_PM_INIT

Source

pub fn host(&self) -> &PluginHost

Not available before handling EVERYTHING_PLUGIN_PM_INIT

Source

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)

Source

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.

Source

pub fn instance_name(&self) -> Option<&str>

Source

pub unsafe fn app(&self) -> &A

Not available during saving config and recreated afterwards. Use Self::with_app instead when possible.

Source

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
Hide additional 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§

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
Source§

impl<Src, Dest> IntoTuple<Dest> for Src
where Dest: FromTuple<Src>,

Source§

fn into_tuple(self) -> Dest

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more