rust druid 之 Controller控制器

Controller 是一种管理子部件、重写或自定义其事件处理或更新行为的类型。Controller控制器只能处理事件和更新,不能影响布局和绘制。控制器是一种方便; 它可以做的任何事情也可以通过创建一个拥有子控件的自定义 Widget 来完成。但是,这有点麻烦,特别是当您只想拦截或修改一个或两个事件时。Controller 上的方法与 Widget 上的方法相同,只是它们也被传递给控制器的子方法。控制器负责根据需要显式地将调用转发到子级。Controller 与 ControllerHost 一起使用,后者管理它与其子节点之间的关系; 尽管通常您会使用 WidgetExt: : Controller 方法,而不是直接实例化主机。

Controller有3个需要实现的方法

pub fn event(
    &mut self,
    child: &mut W,
    ctx: &mut EventCtx<'_, '_>,
    event: &Event,
    data: &mut T,
    env: &Env
)

处理事件

pub fn lifecycle(
    &mut self,
    child: &mut W,
    ctx: &mut LifeCycleCtx<'_, '_>,
    event: &LifeCycle,
    data: &T,
    env: &Env
)

声明周期

pub fn update(
    &mut self,
    child: &mut W,
    ctx: &mut UpdateCtx<'_, '_>,
    old_data: &T,
    data: &T,
    env: &Env
)

修改小部件

下面通过是一个实例学习Controller的使用

让程序启动的时候,输入框获得聚焦

效果图

创建rust项目

cargo new controller_demo

添加druid的包

[dependencies]
druid = { git = "https://github.com/linebender/druid.git"}

添加需要用到的引用

use druid::widget::{Controller,Flex,TextBox};
use druid::{Env,Event,EventCtx,Widget, WidgetExt, Data, Lens, WindowDesc, AppLauncher};

我们先编写controller控制器

struct TakeFocus;

impl <T, W: Widget<T>> Controller<T, W> for TakeFocus {
    //处理事件
    /*
    child:小部件
    EventCtx:事件etc
    Event:事件
    data:数据
    */
    fn event(&mut self, child: &mut W, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env) {
        //当窗口第一次实例化的时候接收到WindowConnectioned
        if let Event::WindowConnected = event {
            //让小部件获得焦点
            ctx.request_focus();
        }
        child.event(ctx, event, data, env)
    }
}

编写我们的ui,创建textBox并且让textBox使用controller控制器

#[derive(Data,Lens,Clone)]
struct AppState{
    text:String
}

fn builder_ui() -> impl Widget<AppState>{
    Flex::row()
        //给输入框添加controller控制器
        .with_child(TextBox::multiline().controller(TakeFocus).lens(AppState::text))
}

创建我们的启动main方法

fn main() {
    let win = WindowDesc::new(builder_ui()).window_size((200.,200.));

    let _app = AppLauncher::with_window(win).launch(AppState{text:"".to_string()});
}

我们一个简单的控制器使用就完成啦!!发挥你的奇思妙想写更有意思的程序吧!

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!