Доброго времени суток.
Примерно полгода назад, когда я начинал изучать Rust, я обнаружил в нем фатальный недостаток - отсутсвие крейта, который бы реализовывал удобный и кроссплатформенный UI. Хотелось поддержки Linux/Windows/MacOS/WASM-web/Android/iOS и удобства использования уровня Qt с их сигналами-слотами.
В ходе парочки бессоных ночей (на самом деле намного больше) появилась некоторое количество крейтов, которые позволяет писать UI вот так:
#[derive(UWidget)]
struct MyWidget {
#[uwidget]
layout: LinearLayout,
#[public_slot] // у структуры будет публичный метод, через который слот будет доступен снаружи
#[uprocess(on_text_updated)]
slot_set_text: SlotImpl<String>,
slotproxy_set_text: SlotProxy<String>,
#[uprocess(on_button_clicked)]
slot_button_clicked: SlotImpl<()>,
}
impl MyWidget {
pub fn new(placeholder: String) -> MyWidget {
let slotproxy_set_text;
let slot_button_clicked = SlotImpl::new();
let mut layout = LinearLayout::new(Orientation::Horizontal);
layout.push_widget({
let textedit = TextEdit::new(placeholder);
slotproxy_set_text = textedit.slot_set_text().proxy();
textedit
});
layout.push_widget({
let mut button = Button::new("Push me");
button.signal_clicked().connect(&slot_button_clicked);
button
});
return MyWidget{
layout,
slot_set_text: SlotImpl::new(),
slotproxy_set_text,
slot_button_clicked,
};
}
fn on_text_updated(&self, s: String) {
self.slotproxy_set_text.exec_for(s);
}
fn on_button_clicked(&self, _:()) {
info!("button clicked!");
}
}
В ближайшем будущем планирую еще немного посидеть над макросами, чтобы можно было писать вот так:
pub fn new(placeholder: String) -> MyWidget {
let layout = layout!(
orientation: Horizontal,
widget: text_edit!(
placeholder: placeholder,
slot_set_text: proxy!(slotproxy_set_text),
),
widget: button!(
signal_clicked: connect!(slot_button_clicked),
),
);
return MyWidget{
layout,
slot_set_text: SlotImpl::new(),
slotproxy_set_text,
slot_button_clicked,
};
}
Немного технических подробностей:
* Уже работает для Linux (Qt) и WASM (web-sys).
** В ближайших планах минимальная поддержка Windows/MacOS через Qt и поддержка Android (Java-jni, нативные виджеты).
** В среднесрочных планах поддержка нативных виджетов Win/Mac, поддержка iOS.
* Система сборки на build.rs-скриптах для cargo, которая позволяет из одних и тех же исходников собирать проект для любой платформы. Небольшой (2-5 строк) скрипт придется написать самому, используя готовые функции из библиотеки.
* В самой библиотеке есть еще Property, которые умеют хранить состояние и обладают встроенными сигналами/слотами. И немного других улучшалок.
* Никаких unsafe в интерфейсах для пользователя (внутри - только для работы с native-кодом).
* Никаких RefCell, Rc и прочих Arc в интерфейсах. Внутри их тоже практически нет, к релизу хочу выпилить совсем.
В основном вдохновлялся Qt, но изначально все писалось под web-sys, с последующим прикручиванием Desktop'а.
Тут хотелось бы обсудить 2 вещи (на самом деле 3):
1. Интересна ли вам такая библиотека.
2. Насколько удобным выглядит интерфейс.
3. Насколько Rust ущербен, порекомендуйте уже готовые библиотеки, и вот это вот все.
P.S. Буду держать вас в курсе, так что можете сразу ставить uniui тег в игнор.