flemish 0.7.0

An Elmish architecture for fltk-rs
Documentation
use fltk::{
    browser::*, button::*, frame::Frame, group::*, input::*, menu::*, misc::*, output::*,
    prelude::WidgetExt, table::*, text::*, tree::*, valuator::*, widget::Widget, window::*,
};
use std::any::Any;
use std::collections::HashMap;
use std::rc::Rc;

pub trait IsWidget: Any {
    fn as_widget(&self) -> Widget;
    fn as_any(&self) -> &dyn Any;
    fn as_any_mut(&mut self) -> &mut dyn Any;
}

impl<W: WidgetExt + 'static> IsWidget for W {
    fn as_widget(&self) -> Widget {
        unsafe { self.into_widget() }
    }
    fn as_any(&self) -> &dyn Any {
        self
    }
    fn as_any_mut(&mut self) -> &mut dyn Any {
        self
    }
}

#[derive(Clone)]
pub enum WidgetUnion {
    Column(Flex),
    Row(Flex),
    Button(Button),
    Frame(Frame),
    Input(Input),
    MenuBar(MenuBar),
    RadioButton(RadioButton),
    ToggleButton(ToggleButton),
    RoundButton(RoundButton),
    CheckButton(CheckButton),
    LightButton(LightButton),
    RepeatButton(RepeatButton),
    RadioLightButton(RadioLightButton),
    RadioRoundButton(RadioRoundButton),
    ReturnButton(ReturnButton),
    ShortcutButton(ShortcutButton),
    Group(Group),
    Pack(Pack),
    HorPack(Pack),
    Tabs(Tabs),
    Scroll(Scroll),
    Tile(Tile),
    Wizard(Wizard),
    ColorChooser(ColorChooser),
    Grid(Grid),
    TextDisplay(TextDisplay),
    TextEditor(TextEditor),
    IntInput(IntInput),
    FloatInput(FloatInput),
    MultilineInput(MultilineInput),
    SecretInput(SecretInput),
    FileInput(FileInput),
    Output(Output),
    MultilineOutput(MultilineOutput),
    Choice(Choice),
    MenuButton(MenuButton),
    SysMenuBar(SysMenuBar),
    Slider(Slider),
    NiceSlider(NiceSlider),
    ValueSlider(ValueSlider),
    Dial(Dial),
    LineDial(LineDial),
    Counter(Counter),
    Scrollbar(Scrollbar),
    HorScrollbar(Scrollbar),
    Roller(Roller),
    Adjuster(Adjuster),
    ValueInput(ValueInput),
    ValueOutput(ValueOutput),
    FillSlider(FillSlider),
    FillDial(FillDial),
    HorSlider(HorSlider),
    HorFillSlider(HorFillSlider),
    HorNiceSlider(HorNiceSlider),
    HorValueSlider(HorValueSlider),
    Browser(Browser),
    SelectBrowser(SelectBrowser),
    HoldBrowser(HoldBrowser),
    MultiBrowser(MultiBrowser),
    FileBrowser(FileBrowser),
    CheckBrowser(CheckBrowser),
    Spinner(Spinner),
    Clock(Clock),
    Chart(Chart),
    Progress(Progress),
    InputChoice(InputChoice),
    HelpView(HelpView),
    Table(Table),
    TableRow(TableRow),
    Tree(Tree),
    Window(Window),
    Other(Rc<dyn IsWidget>),
}

impl WidgetUnion {
    pub(crate) fn view(&self) -> Widget {
        match self {
            WidgetUnion::Column(w) => w.as_widget(),
            WidgetUnion::Row(w) => w.as_widget(),
            WidgetUnion::Button(w) => w.as_widget(),
            WidgetUnion::Frame(w) => w.as_widget(),
            WidgetUnion::Input(w) => w.as_widget(),
            WidgetUnion::MenuBar(w) => w.as_widget(),
            WidgetUnion::RadioButton(w) => w.as_widget(),
            WidgetUnion::ToggleButton(w) => w.as_widget(),
            WidgetUnion::RoundButton(w) => w.as_widget(),
            WidgetUnion::CheckButton(w) => w.as_widget(),
            WidgetUnion::LightButton(w) => w.as_widget(),
            WidgetUnion::RepeatButton(w) => w.as_widget(),
            WidgetUnion::RadioLightButton(w) => w.as_widget(),
            WidgetUnion::RadioRoundButton(w) => w.as_widget(),
            WidgetUnion::ReturnButton(w) => w.as_widget(),
            WidgetUnion::ShortcutButton(w) => w.as_widget(),
            WidgetUnion::Group(w) => w.as_widget(),
            WidgetUnion::Pack(w) => w.as_widget(),
            WidgetUnion::HorPack(w) => w.as_widget(),
            WidgetUnion::Tabs(w) => w.as_widget(),
            WidgetUnion::Scroll(w) => w.as_widget(),
            WidgetUnion::Tile(w) => w.as_widget(),
            WidgetUnion::Wizard(w) => w.as_widget(),
            WidgetUnion::ColorChooser(w) => w.as_widget(),
            WidgetUnion::Grid(w) => w.as_widget(),
            WidgetUnion::TextDisplay(w) => w.as_widget(),
            WidgetUnion::TextEditor(w) => w.as_widget(),
            WidgetUnion::IntInput(w) => w.as_widget(),
            WidgetUnion::FloatInput(w) => w.as_widget(),
            WidgetUnion::MultilineInput(w) => w.as_widget(),
            WidgetUnion::SecretInput(w) => w.as_widget(),
            WidgetUnion::FileInput(w) => w.as_widget(),
            WidgetUnion::Output(w) => w.as_widget(),
            WidgetUnion::MultilineOutput(w) => w.as_widget(),
            WidgetUnion::Choice(w) => w.as_widget(),
            WidgetUnion::SysMenuBar(w) => w.as_widget(),
            WidgetUnion::MenuButton(w) => w.as_widget(),
            WidgetUnion::Slider(w) => w.as_widget(),
            WidgetUnion::NiceSlider(w) => w.as_widget(),
            WidgetUnion::ValueSlider(w) => w.as_widget(),
            WidgetUnion::Dial(w) => w.as_widget(),
            WidgetUnion::LineDial(w) => w.as_widget(),
            WidgetUnion::Counter(w) => w.as_widget(),
            WidgetUnion::Scrollbar(w) => w.as_widget(),
            WidgetUnion::HorScrollbar(w) => w.as_widget(),
            WidgetUnion::Roller(w) => w.as_widget(),
            WidgetUnion::Adjuster(w) => w.as_widget(),
            WidgetUnion::ValueInput(w) => w.as_widget(),
            WidgetUnion::ValueOutput(w) => w.as_widget(),
            WidgetUnion::FillSlider(w) => w.as_widget(),
            WidgetUnion::FillDial(w) => w.as_widget(),
            WidgetUnion::HorSlider(w) => w.as_widget(),
            WidgetUnion::HorFillSlider(w) => w.as_widget(),
            WidgetUnion::HorNiceSlider(w) => w.as_widget(),
            WidgetUnion::HorValueSlider(w) => w.as_widget(),
            WidgetUnion::Browser(w) => w.as_widget(),
            WidgetUnion::SelectBrowser(w) => w.as_widget(),
            WidgetUnion::HoldBrowser(w) => w.as_widget(),
            WidgetUnion::MultiBrowser(w) => w.as_widget(),
            WidgetUnion::FileBrowser(w) => w.as_widget(),
            WidgetUnion::CheckBrowser(w) => w.as_widget(),
            WidgetUnion::Spinner(w) => w.as_widget(),
            WidgetUnion::Clock(w) => w.as_widget(),
            WidgetUnion::Chart(w) => w.as_widget(),
            WidgetUnion::Progress(w) => w.as_widget(),
            WidgetUnion::InputChoice(w) => w.as_widget(),
            WidgetUnion::HelpView(w) => w.as_widget(),
            WidgetUnion::Table(w) => w.as_widget(),
            WidgetUnion::TableRow(w) => w.as_widget(),
            WidgetUnion::Tree(w) => w.as_widget(),
            WidgetUnion::Window(w) => w.as_widget(),
            WidgetUnion::Other(w) => w.as_widget(),
        }
    }
}

pub type WidgetMap = HashMap<usize, WidgetUnion>;