Blueprint: удобный инструмент для создания UI на Gtk4

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Привет, Хабр!

Разметку для Gtk-приложений можно создавать несколькими способами. Это можно сделать при помощи средств самого языка программирования, на котором пишется программа. Или же применить визуальный конструктор, типа Cambalache, который, в свою очередь, создаст специальный ui-файл в формате XML.

Blueprint — это язык разметки, а также компилятор, специально созданный для приложений написанных на Gtk4. С официальной документацией по этому проекту можно ознакомиться на этом сайте. Если программа использует ui-файлы для пользовательского интерфейса, то разработчику нужно будет лишь заменить эти файлы на blp-файлы и немного дополнить сборочные сценарии. Но об этом чуть позже.

Рассмотрим как применить этот инструмент на примере простой программки для расчета даты католической Пасхи. Программа использует для расчета даты так называемый алгоритм Гаусса. Написано приложение на языке Vala с использованием библиотек Gtk4 и libadwaita. Репозиторий приложения находится здесь. Выглядит оно примерно таким образом:

Весь интерфейс построен на контейнерах Gtk.Box, которые вложены один в другой. Значок очистки в поле для ввода номера года добавляется при помощи vala-кода:

 year.set_icon_from_icon_name (Gtk.EntryIconPosition.SECONDARY, "edit-clear-symbolic");
        year.icon_press.connect ((pos, event) => {
              year.set_text("");
              year.grab_focus();
        });

Файл интерфейса на XML для этого приложения выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk" version="4.0"/>
  <template class="ValaGtkTemplateWindow" parent="AdwApplicationWindow">
    <property name="title">Vala &amp; GTK Template</property>
    <property name="default-height">300</property>
    <child>
      <object class="GtkBox">
        <property name="orientation">1</property>
        <child>
          <object class="AdwHeaderBar"></object>
        </child>
        <child>
          <object class="GtkBox">
            <property name="orientation">1</property>
            <property name="vexpand">true</property>
            <property name="hexpand">true</property>
            <property name="margin-top">6</property>
            <property name="margin-end">6</property>
            <property name="margin-start">6</property>
            <property name="margin-bottom">6</property>
            <child>
              <object class="GtkBox">
                <property name="orientation">0</property>
                <property name="spacing">6</property>
                <property name="hexpand">true</property>
                <child>
                  <object class="GtkBox">
                    <property name="orientation">1</property>
                    <property name="spacing">6</property>
                    <child>
                      <object class="GtkLabel">
                        <property name="label">year:</property>
                        <property name="xalign">0</property>
                      </object>
                    </child>
                    <child>
                      <object class="GtkEntry" id="year">
                        <property name="hexpand">true</property>
                      </object>
                    </child>
                  </object>
                </child>
                <child>
                  <object class="GtkButton" id="calculate">
                    <property name="label">CALCULATE</property>
                  </object>
                </child>
              </object>
            </child>
            <child>
              <object class="GtkLabel" id="result">
                <property name="vexpand">true</property>
                <property name="valign">3</property>
                <style>
                  <class name="title-1"/>
                </style>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
  </template>
</interface>

Согласитесь, что это не совсем удобный формат для ручного редактирования. А вот тот же файл, но уже в формате Blueprint:

using Gtk 4.0;
using Adw 1;

template ValaGtkTemplateWindow : Adw.ApplicationWindow {
  title: "Vala & GTK Template";
  default-height: 300;
  Box {
    orientation: vertical;

    Adw.HeaderBar {}

    Box {
      orientation: vertical;
      vexpand: true;
      hexpand: true;
      margin-top: 6;
      margin-end: 6;
      margin-start: 6;
      margin-bottom: 6;
      Box {
        orientation: horizontal;
        spacing: 6;
        hexpand: true;
         Box {
           orientation: vertical;
           spacing: 6;
           Label {
             label: "year:";
             xalign: 0;
           }
           Entry year {
              hexpand: true;
           }
         }
         Button calculate {
           label: "CALCULATE";
         }
      }
      Label result {
         vexpand: true;
         valign: center;
         styles ["title-1"]
      }
    }
  }
}

Так уже гораздо лучше. Проще разобраться, где какой компонент расположен, где он начинается и где заканчивается. Как это все работает? К проекту подключается программа blueprint-compiler. Ее задача заключается в том, чтобы из файла в формате blp создать ui-файл. Для этого в файле meson.build нужно прописать:

blueprints = custom_target (
  'blueprints',
  input: files (
    'data/resources/window.blp',
  ),
  output: '.',
  command: [ find_program ('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@' ]
)

И еще не забыть в разделе ресурсов в том же файле указать:

dependencies: blueprints

Таким образом, один файл подменяется другим. Там, где указывается путь до ui-файла, в частности, в window.vala и gresource.xml, ничего изменять не нужно. Если ваш проект использует упаковку flatpak, то в манифест необходимо добавить следующий модуль:

 {
            "name": "blueprint-compiler",
            "buildsystem": "meson",
            "sources": [
               {
                  "type": "git",
                  "url": "https://gitlab.gnome.org/jwestman/blueprint-compiler",
                  "branch": "main"
               }
             ]
            }

Для работы с Blueprint рекомендуется использовать Workbench или GNOME Builder. Обе программы поддерживают подсветку синтаксиса blp-файлов, а Workbench вдобавок имеет встроенную функцию предварительного просмотра дизайна интерфейса.

Источник: https://habr.com/ru/articles/729084/


Интересные статьи

Интересные статьи

Для деплоя приложений в Kubernetes существует огромное количество различных инструментов. Если посмотреть на соответствующий раздел в CNCF Landscape, то можно потеряться в разнообразии. Поэтому иногда...
Боязнь новых технологий и чувство дискомфорта перед ними у людей происходит повсеместно. Тридцать, а то и двадцать лет назад трудно себе было представить современного здорового и образованного человек...
Привет! Продолжаем публиковать текстовые версии докладов с QIWI Server Party 6.0, в этом посте — Александр Прокопьев и Developer Experience. Про инструменты, их качество и развитие инструментов разра...
Привет, Хаброжители! Python — это динамический язык программирования, используемый в самых разных предметных областях. Хотя писать код на Python просто, гораздо сложнее сделать этот код ...
Изображение: Unsplash Выход за пределы родного рынка для любого стартапа – непростое испытание. У вас ограничены ресурсы, вы мало знаете о специфике продвижения в новых странах, не работал...