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
// Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License in the LICENSE-APACHE file or at: // https://www.apache.org/licenses/LICENSE-2.0 //! Class-specific widget traits //! //! These traits provide generic ways to interact with common widget properties, //! e.g. to read the text of a `Label` or set the state of a `CheckBox`. use crate::{string::CowString, TkAction}; /// Functionality for widgets which can be toggled or selected: check boxes, /// radio buttons, toggle switches. /// /// The value `true` means *checked*, *selected* or *toggled on*. pub trait HasBool { /// Get the widget's state fn get_bool(&self) -> bool; /// Set the widget's state fn set_bool(&mut self, state: bool) -> TkAction; } /// Functionality for widgets with visible text. /// /// This applies to both labels and the text content of interactive widgets. /// The only widgets supporting both labels and interactive content have /// boolean values (e.g. checkboxes); these may support *both* `HasText` and /// [`HasBool`]. pub trait HasText { /// Get the widget's text. fn get_text(&self) -> &str; /// Set the widget's text. fn set_text<T: Into<CowString>>(&mut self, text: T) -> TkAction where Self: Sized, { self.set_cow_string(text.into()) } /// Set the widget's text ([`CowString`]) /// /// This method is for implementation. It is recommended to use /// [`HasText::set_text`] instead. fn set_cow_string(&mut self, text: CowString) -> TkAction; } /// Additional functionality required by the `EditBox` widget. pub trait Editable: HasText { /// Get whether this input field is editable. fn is_editable(&self) -> bool; /// Set whether this input field is editable. fn set_editable(&mut self, editable: bool); } /// Summation of [`HasBool`] and [`HasText`] traits. /// /// Used because Rust doesn't (yet) support multi-trait objects. pub trait HasBoolText: HasBool + HasText {} impl<T> HasBoolText for T where T: HasBool + HasText {}