GUI-та с GTK

18 декември 2018

Административни неща

Административни неща

Административни неща

Административни неща

Предизвикателство (demo)

Домашно (demo)

GTK

https://gtk-rs.org/

ООП-style наследяване

ООП-style наследяване

ООП-style наследяване

ООП-style наследяване

ООП-style наследяване

Ext-traits

Типа gtk::MessageDialog има само и единствено една асоциирана функция new. (Други типове могат да имат и други асоциирани методи, но предимно само за конструиране).

Оттам нататък, всички собствени методи на този "клас" се намират в trait-а MessageDialogExt.

Всички наследени методи се намират в trait-овете: DialogExt, GtkWindowExt, BinExt, ContainerExt, WidgetExt, glib::object::ObjectExt, BuildableExt.

Това работи, когато повечето код е автоматично-генерирани binding-и, но би било доста тегаво да се поддържа ръчно.

ООП-style наследяване

IsA<T>

(Вижте и https://gtk-rs.org/tuto/upcast_downcast)

Примерно, имаме

1
MessageDialog::new<T: IsA<Window>>(parent: Option<&T>, /* ... */)

Това ни позволява да cast-ваме неща напред-назад:

1 2 3
let button = gtk::Button::new();
let widget = button.upcast::<gtk::Widget>();
assert!(widget.downcast::<gtk::Button>().is_ok());

Забележете, че upcast не връща резултат, а връща директно структура от правилния тип. Това се проверява compile-time, така че upcast няма да се компилира, ако cast-а е несъвместим.

Downcast, от друга страна, няма как да се провери at compile-time, затова връща Result.

Native rust-ки аналог (kind of): Any

Инсталация

Външните библиотеки вероятно ще са най-досадната част, особено под Windows: https://gtk-rs.org/docs-src/requirements.html

1 2
[dependencies]
gtk = { version = "0.5", features = ["v3_10"] }

В main файла:

1 2 3 4 5
extern crate gtk;

// За да може всички trait-ове да се include-нат,
// иначе ще трябва да се изброяват *доста*:
use gtk::prelude::*;

Demo

Markdown previewer

Source: https://mmstick.github.io/gtkrs-tutorials/chapter_04/index.html

Markdown previewer

Интересни неща

Markdown previewer

Интересни неща

Markdown previewer

Интересни неща

Markdown previewer

Интересни неща

Markdown previewer

Интересни неща

Glade

При твърде сложен дизайн на интерфейса, вероятно си заслужава да минем на Glade: https://gtk-rs.org/tuto/glade

Тук обаче "опаковането" на gui компоненти в наши си типове може да се окаже по-сложно… Експериментирайте с разделение на кода, за да достигнете до нещо, което ви е удобно.

Demo

Cameraview

Source: https://github.com/sdroege/rustfest-rome18-gtk-gst-workshop

Cameraview

Интересни неща

Cameraview

Интересни неща

Cameraview

Интересни неща

Cameraview

Интересни неща

Cameraview

Интересни неща

Cameraview

Интересни неща

Други интересни ресурси

Други интересни ресурси

Други интересни ресурси

Други интересни ресурси

Въпроси