relm, 在 Rust Idiomatic 基于GTK+的库中,受Elm的启发

分享于 

10分钟阅读

GitHub

  繁體 雙語
Asynchronous, GTK+-based, GUI library, inspired by Elm, written in Rust
  • 源代码名称:relm
  • 源代码网址:http://www.github.com/antoyo/relm
  • relm源代码文档
  • relm源代码下载
  • Git URL:
    git://www.github.com/antoyo/relm.git
    Git Clone代码到本地:
    git clone http://www.github.com/antoyo/relm
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/antoyo/relm
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Relm

    异步,GTK+-based,GUI库,由Elm编写,由 Rust 编写。

    这个库的在alpha阶段: 它没有经过彻底的测试,它的API可能随时会改变。

    mastermasterrelmrust documentation bluerelmLobbyrelm

    要求

    由于relm基于 GTK+,所以你需要在系统上使用这个库来使用它。

    有关如何安装GTK+的信息,请参见

    用法

    首先,将这里添加到你 Cargo.toml:

    gtk = "^0.3.0"relm = "^0.11.0"relm-derive = "^0.11.0"

    接下来,将这个添加到你的板条箱中:

    externcrate gtk;
    #[macro_use]externcrate relm;
    #[macro_use]externcrate relm_derive;use relm::{Relm, Widget};

    然后,创建你的模型:

    structModel {
     //...}

    模型包含与 Widget 相关的数据。 它可以由 Widget::update 函数更新。

    创建你的消息 enum:

    #[derive(Msg)]enumMsg {
     //... Quit,
    }

    将消息发送到 Widget::update 以指示发生了事件。 接收事件时可以更新模型。

    创建一个 struct,它代表一个包含GTK+部件( 在本例中,应用程序的主窗口) 和模型的Widget:

    structWin {
     //... model: Model,
     window: Window,
    }

    要使这里 struct 成为可以由库显示的relm Widget,请实现 UpdateWidget 特性:

    implUpdateforWin {
     //Specify the model used for this widget.typeModel = Model;
     //Specify the model parameter used to init the model.typeModelParam = ();
     //Specify the type of the messages sent to the update function.typeMsg = Msg;
     //Return the initial model.fnmodel(_: &Relm<Self>, _: ()) -> Model {
     Model {
     }
     }
     //The model may be updated when a message is received.//Widgets may also be updated in this function.//Futures and streams can be connected to send a message when a value is ready.fnupdate(&mutself, event: Msg) {
     match event {
     Msg::SomeEvent => {
     let future =create_future();
     relm.connect_exec_ignore_err(future, SomeEvent);
     },
     Msg::Quit => gtk::main_quit(),
     }
     }
     //The next method is optional.//Futures and streams can be connected when the `Widget` is created in the//`subscriptions()` method.//fn subscriptions(&mut self, relm: &Relm<Self>) {//let stream = Interval::new(Duration::from_secs(1));//relm.connect_exec_ignore_err(stream, Tick);//}}implWidgetforWin {
     //Specify the type of the root widget.typeRoot = Window;
     //Return the root widget.fnroot(&self) -> Self::Root {
     self.window.clone()
     }
     //Create the widgets.fnview(relm: &Relm<Self>, model: Self::Model) -> Self {
     //GTK+ widgets are used normally within a `Widget`.let window = Window::new(WindowType::Toplevel);
     //Connect the signal `delete_event` to send the `Quit` message.connect!(relm, window, connect_delete_event(_, _), return (Some(Msg::Quit), Inhibit(false)));
     //There is also a `connect!()` macro for GTK+ events that do not need a//value to be returned in the callback. window.show_all();
     Win {
     model,
     window: window,
     }
     }
    }

    最后,通过调用 Win::run() 来显示这里 Widget:

    fnmain() {
     Win::run(()).unwrap();
    }

    #[widget] 属性

    对于夜间用户,为了简化小部件的创建,提供了 #[widget] 属性。

    这里属性执行以下操作:

    • 提供 view 宏以创建具有声明性语法的小部件。!

    • 自动创建 fn root()type Msgtype Modeltype ModelParamtype Root 项。

    • Widget::set_property()的调用自动插入到模型的属性时,将调用插入到 update() 函数中。

    • 自动创建 Widgetstruct

    • 这两个特性可以同时实现。

    要使用这里属性,你需要在 Cargo.toml 中添加 relm-attributes 板条箱:

    relm-attributes = "^0.11.0"

    并添加以下代码:

    #![feature(proc_macro)]externcrate relm_attributes;use relm_attributes::widget;

    下面是使用这里属性的示例:

    #[widget]implWidgetforWin {
     fnmodel() -> Model {
     Model {
     counter: 0,
     }
     }
     fnupdate(&mutself, event: Msg) {
     match event {
     //A call to self.label1.set_text() is automatically inserted by the//attribute every time the model.counter attribute is updated. Msg::Decrement =>self.model.counter -=1,
     Msg::Increment =>self.model.counter +=1,
     Msg::Quit => gtk::main_quit(),
     }
     }
     view! {
     gtk::Window {
     gtk::Box {
     orientation: Vertical,
     gtk::Button {
     //By default, an event with one paramater is assumed. clicked => Increment,
     //Hence, the previous line is equivalent to://clicked(_) => Increment, label: "+",
     },
     gtk::Label {
     //Bind the text property of this Label to the counter attribute//of the model.//Every time the counter attribute is updated, the text property//will be updated too. text: &self.model.counter.to_string(),
     },
     gtk::Button {
     clicked => Decrement,
     label: "-",
     },
     },
     //Use a tuple when you want to both send a message and return a value to//the GTK+ callback.delete_event(_, _) => (Quit, Inhibit(false)),
     }
     }
    }
    便笺struct Win 现在是由属性自动创建的,如函数 root() 和关联类型 ModelModelParamMsgContainer。 如果需要,仍然可以提供方法和关联类型,但不能创建 struct
    便笺

    要从更好的错误消息中获益,请启用以下功能:

    • relm/不稳定

    • relm属性/不稳定

    • relm导出/不稳定

    为此,请将以下行添加到 Cargo.toml:

    [features]default = ["relm/unstable", "relm-attributes/unstable", "relm-derive/unstable"]
    便笺

    从稳定的Rust 中使用这个语法是有可能的。

    要这样做,需要替换以下内容:

    #[widget]implWidgetforWin {
    }

    通过:

    #[widget]relm_widget! {
     implWidgetforWin {
     }
    }
    警告#[widget] 使生成的struct public 成为: 因此,相应的模型和消息类型必须是 public。
    警告

    当使用这里属性时,程序可能会更慢,因为代码生成简单。 例如下面的代码

    fnupdate(&mutself, event: Msg, model: &mut Model) {
     for _ in0..100 {
     model.counter +=1;
     }
    }

    将生成这里函数:

    fnupdate(&mutself, event: Msg, model: &mut Model) {
     for _ in0..100 {
     model.counter +=1;
     self.label1.set_text(&model.counter.to_string());
     }
    }
    警告

    另外,当前仅在分配给模型的属性时才插入 set_property() 调用。 例如下面的代码

    fnupdate(&mutself, event: Msg, model: &mut Model) {
     model.text.push_str("Text");
    }

    将无法按预期工作。

    如有必要,请使用下列。

    fnupdate(&mutself, event: Msg, model: &mut Model) {
     model.text +="Text";
    }

    你可以查看有关如何使用relm的更多信息,以了解有关如何使用的详细信息。

    使用 relm的项目

    如果要将项目添加到这里列表中,请创建一个请求请求。


    BASE  gui  RUST  GTK  ELM  Idiomatic  
    相关文章