-
-
Notifications
You must be signed in to change notification settings - Fork 79
/
widget.rs
102 lines (88 loc) · 4 KB
/
widget.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
* Copyright (c) 2017 Boucher, Antoni <bouanto@zoho.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
use gtk::{self, IsA, Object};
use super::{DisplayVariant, Relm, RemoteRelm, run};
/// Trait to implement to manage widget's events.
pub trait Widget
where Self: Clone,
Self::Root: Clone + IsA<gtk::Widget>,
Self::Msg: Clone + DisplayVariant,
{
/// The type of the model.
type Model;
/// The type of the parameter of the model() function used to initialize the model.
type ModelParam: Sized;
/// The type of the messages sent to the [`update()`](trait.Widget.html#tymethod.update) method.
type Msg;
/// The type of the root widget.
type Root;
/// Update the view after it is initially created.
/// This method is only useful when using the `#[widget]` attribute, because when not using it,
/// you can use the [`view()`](trait.Widget.html#tymethod.view) method instead.
fn init_view(&self) {
}
/// Create the initial model.
fn model(param: Self::ModelParam) -> Self::Model;
/// Method called when the widget is added to its parent.
fn on_add<W: IsA<gtk::Widget> + IsA<Object>>(&self, _parent: W) {
}
/// Get the parent ID.
/// This is useful for custom Container implementation: when you implement the
/// [`Container::add_widget()`](trait.Container.html#tymethod.add_widget), you might want to
/// insert widgets elsewhere depending of this id.
fn parent_id() -> Option<&'static str> {
None
}
// TODO: ajouter une méthode param() pour déterminer des paramètres qui seront pris en compte à
// l’ajout du widget.
/// Get the root widget of the view.e. the root widget of the view.
fn root(&self) -> &Self::Root;
/// Create the window from this widget and start the main loop.
fn run(model_param: Self::ModelParam) -> Result<(), ()>
where Self: 'static,
Self::Model: Clone + Send,
Self::ModelParam: Default,
Self::Msg: Send,
{
run::<Self>(model_param)
}
/// Connect the subscriptions.
/// Subscriptions are `Future`/`Stream` that are spawn when the widget is created.
///
/// ## Note
/// This method is called in the tokio thread, so that you can spawn `Future`s and `Stream`s.
fn subscriptions(_relm: &Relm<Self::Msg>) {
}
/// Method called when a message is received from an event.
///
/// ## Note
/// This method is called in the GTK+ thread, so that you can update widgets.
fn update(&mut self, event: Self::Msg, model: &mut Self::Model);
/// Connect `Future`s or `Stream`s when receiving an event.
///
/// ## Warning
/// This method is executed in the tokio thread: hence, you **must** spawn any futures in this
/// method, not in `Widget::update()`.
fn update_command(_relm: &Relm<Self::Msg>, _event: Self::Msg, _model: &mut Self::Model) {
}
/// Create the initial view.
fn view(relm: &RemoteRelm<Self>, model: &Self::Model) -> Self;
}