Gtk::SpinButton get_value_as_int дает step_increment в качестве результата

Я борюсь со SpinButton в Rust, используя Relm. (Отказ от ответственности, я нуб с Rust и GTK)

#![feature(proc_macro)]
extern crate gtk;

use chrono::{NaiveTime, Duration};

use gtk::prelude::*;
use gtk::{
    WidgetExt,
    ContainerExt,
    EntryExt,
    Adjustment
};

use relm::Widget;
use relm_attributes::widget;

#[derive(Msg, Debug)]
pub enum Msg {
    Changed,
    Display,
}

#[widget]
impl Widget for DurationSpin {
    fn model(m: Duration) -> Duration {
        m
    }

    fn update(&mut self, event: Msg) {
        match event {
            Msg::Display => self.format_display(),
            Msg::Changed => {
                println!("update, self.spin_btn.get_value_as_int() = {:?}", self.spin_btn.get_value_as_int());
                self.model = Duration::minutes(self.spin_btn.get_value_as_int() as i64)

            },
        };
    }

    fn format_display(&mut self) {
        println!("format_display, self.spin_btn.get_value_as_int() = {:?}", self.spin_btn.get_value_as_int());
        let minus = self.model.num_hours() * 60;
        self.spin_btn.set_text(&format!("{:02}:{:02}",
                                        self.model.num_hours(), self.model.num_minutes() - minus));
    }

    view! {
        #[name="spin_btn"]
        gtk::SpinButton {
            max_width_chars: 5,
            width_chars: 5,
            max_length: 5,
            numeric: false,
            output => (Msg::Display, Inhibit(false)),
            value_changed => Msg::Changed,
            adjustment: &Adjustment::new(self.model.num_minutes() as f64, 0.0, 720.0, 1.0, 60.0, 0.0),
        }
    }
}

(весь проект здесь: https://github.com/Geobert/rusty_flexi)

Моя проблема в том, что нажатие на "+" делает get_value_as_int всегда возвращает "1".

Кажется, что мой output Сигнал вызывает это, поскольку деактивация соединения решает ошибку, но я не вижу, что с ней не так.

0 ответов

Кажется outputобработчик сигнала не должен быть асинхронным. Это означает, что в этом случае вам не следует использовать передачу сообщений relm.

Вы должны сделать что-то вроде:

fn init_view(&mut self) {
    let hours = self.model.num_hours();
    let minutes = self.model.num_minutes();
    self.spin_btn.connect_output(move |spin_btn| {
        let minus = hours * 60;
        spin_btn.set_text(&format!("{:02}:{:02}",
                                    hours, minutes - minus));
        Inhibit(false)
    });
}

и удалить output => (Msg::Display, Inhibit(false)),

Другие вопросы по тегам