summaryrefslogtreecommitdiffstats
path: root/native/src/widget/operation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/widget/operation.rs')
-rw-r--r--native/src/widget/operation.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/native/src/widget/operation.rs b/native/src/widget/operation.rs
new file mode 100644
index 00000000..b6c108e0
--- /dev/null
+++ b/native/src/widget/operation.rs
@@ -0,0 +1,62 @@
+use crate::widget::state;
+use crate::widget::Id;
+
+pub trait Operation<T> {
+ fn container(
+ &mut self,
+ id: Option<&Id>,
+ operate_on_children: &dyn Fn(&mut dyn Operation<T>),
+ );
+
+ fn focusable(
+ &mut self,
+ _state: &mut dyn state::Focusable,
+ _id: Option<&Id>,
+ ) {
+ }
+
+ fn finish(&self) -> Outcome<T> {
+ Outcome::None
+ }
+}
+
+pub enum Outcome<T> {
+ None,
+ Some(T),
+ Chain(Box<dyn Operation<T>>),
+}
+
+pub fn focus<T>(target: Id) -> impl Operation<T> {
+ struct Focus {
+ target: Id,
+ }
+
+ impl<T> Operation<T> for Focus {
+ fn focusable(
+ &mut self,
+ state: &mut dyn state::Focusable,
+ id: Option<&Id>,
+ ) {
+ if state.is_focused() {
+ match id {
+ Some(id) if id == &self.target => {
+ state.focus();
+ }
+ _ => {
+ state.unfocus();
+ }
+ }
+ }
+ }
+
+ fn container(
+ &mut self,
+ _id: Option<&Id>,
+ operate_on_children: &dyn Fn(&mut dyn Operation<T>),
+ ) {
+ operate_on_children(self)
+ }
+ }
+
+ Focus { target }
+}