Добавить в корзинуПозвонить
Найти в Дзене
Ржавый код

UI приложение на Druid

В текущее время растет популярность flutter разработанного компанией google под язык dart. Многим разработчикам нравится простота работы в flutter с виджетами, но этот UI фрамеворк не одинок в своей идее, виджеты используются во многих UI библиотеках с ранних времен. Rust так же не обошло это стороной, Raph Levien и Colin Rofls разрабатывают в настоящее время простой графический интерфейс, ориентированный на виджеты - druid. Данная библиотека позволяет создавать простые интерактивные графические приложения, которые могут быть развернуты на Windows, macOS, Linux, OpenBSD, FreeBSD и в web. Сам druid построен поверх druid-shell, которая реализует весь код нижнего уровня, специфичный для платформы, обеспечивая общую абстракцию для таких вещей, как события клавиш и мыши, создание окон и запуск приложения. Ниже druid-shell находится piet, представляющий собой кроссплатформенную библиотеку 2D-графики, простой и знакомый API для рисования, который может быть реализован так же для различных пла

В текущее время растет популярность flutter разработанного компанией google под язык dart. Многим разработчикам нравится простота работы в flutter с виджетами, но этот UI фрамеворк не одинок в своей идее, виджеты используются во многих UI библиотеках с ранних времен. Rust так же не обошло это стороной, Raph Levien и Colin Rofls разрабатывают в настоящее время простой графический интерфейс, ориентированный на виджеты - druid.

Данная библиотека позволяет создавать простые интерактивные графические приложения, которые могут быть развернуты на Windows, macOS, Linux, OpenBSD, FreeBSD и в web.

Сам druid построен поверх druid-shell, которая реализует весь код нижнего уровня, специфичный для платформы, обеспечивая общую абстракцию для таких вещей, как события клавиш и мыши, создание окон и запуск приложения. Ниже druid-shell находится piet, представляющий собой кроссплатформенную библиотеку 2D-графики, простой и знакомый API для рисования, который может быть реализован так же для различных платформ.

Давайте создадим простое приложение, что бы попробовать библиотеку на "вкус". Для этого нам понадобится компилятор rust и любой текстовый редактор. Я предпологаю, что вы знакомы с основами языка rust и не буду останавливаться на мелочах.

Инициализируем приложение:

-2

Это очень похоже на npm install <приложение> из мира node.js, неправда ли?

Добавим после всего, в самый низ файла `Cargo.toml` следующиее:

-3

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

Для начала подключим один виджет и несколько необходимых функций

-4

и создадим структуру, описывающую состояние виджета (компонента), которое нам пригодится в будущем. Указав что это клонируемые данные, плюс добавим атрибут друида `Data`.

-5

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

-6

А теперь самое интересное. Функция main(). Нам понадобится окно, куда мы передадим для отображения созданный выше виджет, а так же передадим его состояние (в данном случае состояние приложения) и обработаем ошибку, мало ли, подстрахуемся лучше, все равно нам надо что то сделать с Result.

-7

В итоге, у вас обязано получится:

-8

Запускаем cargo run. Первый раз компилируются все зависимости, повторные компиляции не потребуют много времени, будет перекомпилироваться только наш изменяемый `main.rs`.

-9

Что же, добавим main_window заголовок и размер окна и заново запустим компиляцию с выполнением, `cargo run`.

-10
-11

Совсем другое дело. Теперь пора доработать наш виджет, добавим надпись и будущую информацию значения счетчика в наше пустое окно. Изменим функцию, и импортируем кое что из библиотечных функций, в том числе и виджет label. Ниже измененные участки кода нашего приложения.

-12
-13

Счетчик есть, нужно позаботится о кнопках инкремента и декремента. Расположим их на следующей строке.

-14

Как видно из представленного кода, мы просто наполняем виджет окна другими виджетами реализованными за нас разработчиками druid.

-15

Остался последний штрих, добавить события для кнопок "+" и "-" для изменения счетчика, не зря же мы виджету передали структуру о его состоянии счетчика.

-16

`cargo run` и вуаля, кнопки изменяют счетчик. Получившийся код даже проще чем в flutter(dart) с его подключением материалов и скафолдами.

Для тех кто ещё не знает rust, или начинает и запутался в изменениях по ходу доработки приложения, полный образец исходного кода привожу ниже.

-17
-18

Статья на list-site.