GUI-та с GTK
18 декември 2018
Административни неща
Административни неща
- Трето домашно и второ предизвикателство приключиха
Административни неща
- Трето домашно и второ предизвикателство приключиха
- Четвъртък няма да имаме лекция
Административни неща
- Трето домашно и второ предизвикателство приключиха
- Четвъртък няма да имаме лекция
- Мислете за проекти
Предизвикателство (demo)
- Базова имплементация
- Правилни и грешни решения
Домашно (demo)
- Базова имплементация
- Интересни грешки
- Тестване
- Паралелизъм
ООП-style наследяване
ООП-style наследяване
Deref
: Ограничен, само за един тип
ООП-style наследяване
Deref
: Ограничен, само за един тип- Делегация, в някоя бъдеща версия на Rust (RFC)
ООП-style наследяване
Deref
: Ограничен, само за един тип- Делегация, в някоя бъдеща версия на Rust (RFC)
- Trait-ове
ООП-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)
Примерно, имаме
MessageDialog::new<T: IsA<Window>>(parent: Option<&T>, /* ... */)
Това ни позволява да cast-ваме неща напред-назад:
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
[dependencies]
gtk = { version = "0.5", features = ["v3_10"] }
В main файла:
extern crate gtk;
// За да може всички trait-ове да се include-нат,
// иначе ще трябва да се изброяват *доста*:
use gtk::prelude::*;
Markdown previewer
Интересни неща
Markdown previewer
Интересни неща
- Разделение на "модел" и "ui"
Markdown previewer
Интересни неща
- Разделение на "модел" и "ui"
- Тестване на модела в изолация
Markdown previewer
Интересни неща
- Разделение на "модел" и "ui"
- Тестване на модела в изолация
App
се превръща вConnectedApp
-- интересен вариант за разделение на отговорностите на типовете.
Markdown previewer
Интересни неща
- Разделение на "модел" и "ui"
- Тестване на модела в изолация
App
се превръща вConnectedApp
-- интересен вариант за разделение на отговорностите на типовете.Sourceview
,Webkit2gtk
Glade
При твърде сложен дизайн на интерфейса, вероятно си заслужава да минем на Glade: https://gtk-rs.org/tuto/glade
Тук обаче "опаковането" на gui компоненти в наши си типове може да се окаже по-сложно… Експериментирайте с разделение на кода, за да достигнете до нещо, което ви е удобно.
Cameraview
Интересни неща
Cameraview
Интересни неща
- Reference-counting:
App
,AppInner
,AppWeak
Cameraview
Интересни неща
- Reference-counting:
App
,AppInner
,AppWeak
- Конвертиране на всичко до наши типове с
From
:SnapshotState
,RecordState
Cameraview
Интересни неща
- Reference-counting:
App
,AppInner
,AppWeak
- Конвертиране на всичко до наши типове с
From
:SnapshotState
,RecordState
- RAII (SnapshotTimer)
Cameraview
Интересни неща
- Reference-counting:
App
,AppInner
,AppWeak
- Конвертиране на всичко до наши типове с
From
:SnapshotState
,RecordState
- RAII (SnapshotTimer)
- Връзване и енкапсулиране на "actions":
gtk::SimpleAction
Cameraview
Интересни неща
- Reference-counting:
App
,AppInner
,AppWeak
- Конвертиране на всичко до наши типове с
From
:SnapshotState
,RecordState
- RAII (SnapshotTimer)
- Връзване и енкапсулиране на "actions":
gtk::SimpleAction
- Gstreamer
Други интересни ресурси
Други интересни ресурси
- relm: Библиотека, която седи отгоре на GTK и предоставя elm-подобен интерфейс.
Други интересни ресурси
Други интересни ресурси
- relm: Библиотека, която седи отгоре на GTK и предоставя elm-подобен интерфейс.
- conrod: Immediate-mode GUI, което e доста различно откъм widget-и.
- И всичко друго в секция "GUI" в "awesome-rust".