Как подключить кнопки к действиям в пользовательских SimpleActionGroups в gtk-rs? - PullRequest
1 голос
/ 25 марта 2019

Я хотел бы использовать SimpleActionGroup, зарегистрированную в виджете, который обрабатывает SimpleActions.Но в любом случае каждая кнопка, которая нацелена на действия с моим пользовательским префиксом, затенена и не может быть нажата.Однако кнопки, нацеленные на префиксы действий «app» и «win», работают как положено.

Приложение с двумя кнопками

Вот часть моего кода, гдемой пользовательский префикс определен.

// Create action group for view
let view_action_group = gio::SimpleActionGroup::new();
view.insert_action_group("view", &view_action_group);

// SimpleAction for view
let view_action = gio::SimpleAction::new("test", None);
view_action.connect_activate(|_, _| println!("view.test"));
view_action_group.add_action(&view_action);

Здесь я отвечаю на SimpleActions с префиксом "app"

// SimpleAction for app
let app_action = gio::SimpleAction::new("test", None);
app_action.connect_activate(|_, _| println!("app.test"));
app.add_action(&app_action);

Сам SimpleAction должен быть в порядке, потому что, если я запускаю приложение с GTK InspectorЯ могу активировать его.

Инспектор GTK, вызывающий действия

Так чего мне не хватает, что кнопка secound не отображается серым цветом и отвечает на мой SimpleAction?

Вот полный код:

extern crate gtk;
extern crate gio;

use std::env::args;
use gtk::{GtkApplicationExt, GtkWindowExt, ContainerExt, WidgetExt, HeaderBarExt, ActionableExt};
use gio::{SimpleActionExt, ActionMapExt, ApplicationExt, ApplicationExtManual};

struct Window {
    pub window: gtk::Window,
}

impl Window {
    pub fn new() -> Self {
        // Create Widgets and window
        let header_bar = gtk::HeaderBar::new();
        let window = gtk::Window::new(gtk::WindowType::Toplevel);
        let view = gtk::Box::new(gtk::Orientation::Horizontal, 5);
        let app_button = gtk::Button::new_with_label("App-Action-Button");
        let view_button = gtk::Button::new_with_label("View-Action-Button");

        // Create Action Group for view
        let view_action_group = gio::SimpleActionGroup::new();
        view.insert_action_group("view", &view_action_group);

        // SimpleAction for view
        let view_action = gio::SimpleAction::new("test", None);
        view_action.connect_activate(|_, _| println!("view.test"));
        view_action_group.add_action(&view_action);

        // Set Action for Buttons
        app_button.set_action_name("app.test");
        view_button.set_action_name("view.test");

        // Configure HeaderBar and add Buttons to it
        header_bar.set_show_close_button(true);
        header_bar.pack_start(&app_button);
        header_bar.pack_start(&view_button);

        // Window Stuff
        window.set_titlebar(&header_bar);
        window.add(&view);
        window.show_all();

        Self { window }
    }
}

struct App {
    app: gtk::Application
}

impl App {
    pub fn new () -> Self {

        // Create app and window
        let app = gtk::Application::new(Some("com.example.test"), gio::ApplicationFlags::FLAGS_NONE).unwrap();
        let window = Window::new();

        // SimpleAction for app
        let app_action = gio::SimpleAction::new("test", None);
        app_action.connect_activate(|_, _| println!("app.test"));
        app.add_action(&app_action);

        // add Signal
        let cloned_window = window.window.clone();
        app.connect_activate(move |app| app.add_window(&cloned_window));

        Self { app }
    }

    pub fn run(&self, args: &[String]) {
        self.app.run(args);
    }

}


fn main() {
    let app = App::new();
    app.run(&args().collect::<Vec<_>>());
}
...