Окно с панелью заголовка

Исходный код программы для этой главы можно найти здесь.

В этой главе мы создадим простое GTK приложение с панелью заголовка. Этот пример познакомит Вас с основами создания структуры приложения, которое будет содержать виджет и окно с заголовком.

Создание структуры приложения

Следующая диаграмма показывает, как мы будет проектировать структуру для нашего GTK приложения. Можно и не следовать этой диаграмме для достижения главного результата, однако, проектирование структуры пользовательского интерфейса может быть полезной пищей для ума.

В примере ниже, мы создадим структуру с GtkWindow и Header:


# #![allow(unused_variables)]
#fn main() {
extern crate gtk;

use gtk::*;

// Объявим структуру `Application`.
pub struct Application {
    pub window: Window,
    pub header: Header,
}
#}

Header - это еще одна структура, которая будет содержать GtkHeaderbar и все виджеты внутри этой панели заголовка.


# #![allow(unused_variables)]
#fn main() {
// Объявим структуру `Header`.
pub struct Header {
    pub container: HeaderBar,
}
#}

Создание пользовательского интерфейса (UI)

Далее, мы создадим интерфейс с помощью Rust и расположим его в "ново-объявленных" структурах.

Во-первых, структура нашего приложения будет содержать в себе все другие структуры нашего пользовательского интерфейса. В примере ниже находится код с комментариями, описывающие каждый метод, который мы будем использовать для конфигурации.

Мы создадим GtkWindow и "присоединим" каждый элемент UI. Структура Header будет располагать в себе другие GtkHeaderBar. Далее, напишем функцию для выхода из приложения. Важно также установить описание для окна и wmclass, который будет отображаться оконными менеджерами, а с помощью функции Window::set_default_icon_name() настроим отображаемую иконку.


# #![allow(unused_variables)]
#fn main() {
// Блок реализации.
impl Application {
    fn new() -> Application {
        // Создадим новое окно с типом `Toplevel`.
        let window = Window::new(WindowType::Toplevel);
        // Создадим панель заголовка и связанный с ним контент.
        let header = Header::new();

        // Укажем название заголовка виджета.
        window.set_titlebar(&header.container);
        // Укажем название для окна приложения.
        window.set_title("Простая программа");
        // Установим класс для оконного менеджера.
        window.set_wmclass("simple-gtk", "Простая программа");
        // Установим иконку, отображаемую приложением.
        Window::set_default_icon_name("имя_иконки");

        // Программа закроется, если нажата кнопка выхода.
        window.connect_delete_event(move |_, _| {
            main_quit();
            Inhibit(false)
        });

        // Возвращаем основное состояние приложения.
        Application { window, header }
    }
}
#}

Здесь располагается блок реализации для структуры Header, которая на данный момент содержит только GtkHeaderBar. Важно указать описание для этой панели заголовка, чтобы она отображалась, а также сделать активными элементы управления окном, поскольку они отключены по-умолчанию.


# #![allow(unused_variables)]
#fn main() {
impl Header {
    fn new() -> Header {
        // Создадим виджет контейнера для главной панели заголовка.
        let container = HeaderBar::new();
        // Установим отображаемый тект в секции для названия.
        container.set_title("Simple GTK");
        // Делаем активными элементы управления окна в этой панели.
        container.set_show_close_button(true);

        // Возвращаем заголовок и его состояние.
        Header { container }
    }
}
#}

Инициализация и запуск приложения

Теперь, когда мы готовы, нам нужно просто инициализировать GTK, создать структуру приложения, показать все виджеты внутри этой структуры и запустить главный цикл событий GTK.

fn main() {
    // Инициализация GTK.
    if gtk::init().is_err() {
        eprintln!("Не удалось инициализировать GTK приложение.");
        return;
    }

    // Инициализация начального состояния UI.
    let app = Application::new();

    // Делаем видимыми все виджеты с UI.
    app.window.show_all();

    // Запуск основного цикла GTK.
    gtk::main();
}

После того, как основной поток вошёл в цикл событий, он будет взаимодействовать с каждым вызванным виджетом для действий, например: метод connect_delete_event(), который мы использовали выше, чтобы запрограммировать кнопку выхода для закрытия программы.

Результат

После того, как вы написали код, соберите и запустите программу, которая выглядит вот так:

cargo build && cargo run