Pull to refresh
239.75
FirstVDS
Виртуальные серверы в ДЦ в Москве

Библиотека Helium от проекта tauOS

Reading time7 min
Views1.2K

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

Ребята из tauOS решили, что существующих библиотек в мире явно недостаточно, и запилили еще одну. Так появилась библиотека виджетов под названием Helium. Она основана на GTK и предоставляет разработчикам некоторое количество готовых компонентов для создания графического интерфейса пользователя.

Несмотря на то, что дистрибутив tauOS еще не доступен, для него уже имеется небольшой набор своих приложений, написанных на языке программирования Vala. Есть музыкальный плеер, текстовый редактор, калькулятор, эмулятор терминала и прочее. Библиотека Helium как раз и применяется при создании этих приложений.

Что касается самого дистрибутива, то судя по всему, это будет атомарный дистрибутив, основанный на Fedora Linux, в котором установка ПО будет происходить из репозитория Flathub. В пользу его атомарности говорит наличие репозитория ostree, а о нацеленности на flatpak говорят некоторые исходники в репозитории их магазина приложений Catalogue. Вывод о том, что дистрибутив будет основан именно на Fedora можно сделать, изучив файл README в репозитории testers. В одном из разделов файла приводится небольшая инструкция по преобразованию существующей установки Fedora в tauOS.

В этой статье я хочу немного рассказать о компонентах библиотеки Helium, о том как запускать приложения, написанные с ее помощью, и как на ней разрабатывать свои программы. Репозиторий библиотеки можно найти здесь. Все действия, приведенные в этой статье, выполнялись в Fedora Linux 39 (Workstation Edition).

Виджеты

Разработчики из tauOS при создании Helium явно вдохновлялись не только библиотекой Libadwaita, но и Granite от проекта elementary OS. Granite, как и Helium, написан на языке программирования Vala. Если сравнить документации, например, к таким компонентам как He.Toast и Granite.Toast или же He.TextField и Granite.ValidatedEntry, то можно увидеть, что они во многом похожи. Особенно это касается компонента Toast. Подробнее о библиотеке Granite можно прочитать в этой статье.

Ниже перечисляются некоторые компоненты из библиотеки Helium:

  • PillButton — закругленная с двух сторон кнопка;

  • FillButton — кнопка, занимающая всю ширину контейнера;

  • IconicButton — кнопка с иконкой;

  • OverlayButton — плавающая кнопка;

  • AppBar — панель в заголовке окна;

  • Dialog — диалоговое окно для вывода сообщений;

  • Banner — виджет для показа сообщения пользователю и предоставления какого-либо действия; 

  • Badge — небольшой индикатор статуса, который можно использовать для получения дополнительной информации об объекте;

  • Avatar — компонент, содержащий изображение представляющее человека;

  • ContentList — список блоков с каким-либо контентом и необязательными заголовком и описанием.

Создателям, по всей видимости, очень нравятся кнопки! Кроме указанных выше, есть TintButton, TextButton и еще парочка наименований. Полный список компонентов можно найти здесь и здесь.

Запускаем приложения!

В проекте имеется несколько своих приложений. Например, вот так у них выглядит музыкальный плеер под названием Victrola:

А это простой текстовый редактор Enigma:

Калькулятор Abacus:

Скриншоты пришлось делать свои, так как представленные в репозиториях уже довольно устаревшие. 

Все доступные приложения содержат в своем репозитории манифест для создания самодостаточных пакетов flatpak. Проблема в том, что в манифесте указана их родная платформа (com.fyralabs.Platform), которая на Flathub на данный момент недоступна. Поэтому просто так запустить приложения не получится. Что в этом случае можно предпринять?

Например, можно переписать манифест. Берем все модули, расположенные в секции modules, из манифеста платформы tau-flatpak-platform.

Манифест
{
      "name": "tau-hydrogen",
      "buildsystem": "meson",
      "sources": [
        {
          "type": "git",
          "url": "https://github.com/tau-OS/tau-hydrogen.git",
          "branch": "main"
        }
      ],
      "modules": [
        {
          "name": "xcursorgen",
          "cleanup": ["*"],
          "sources": [
            {
              "type": "archive",
              "url": "https://xorg.freedesktop.org/archive/individual/app/xcursorgen-1.0.7.tar.gz",
              "sha256": "6bc32d4977ffd60c00583bfd217f1d1245ca54dafbfbbcdbf14f696f9487b83e"
            }
          ]
        }
      ]
    },
    {
      "name": "stylesheet",
      "buildsystem": "meson",
      "sources": [
        {
          "type": "git",
          "url": "https://github.com/tau-OS/tau-helium.git",
          "branch": "main"
        }
      ],
      "modules": [
        {
          "name": "sass",
          "buildsystem": "simple",
          "build-commands": ["install -D -m755 sass ${FLATPAK_DEST}/bin/sass"],
          "sources": [
            {
              "type": "archive",
              "url": "https://github.com/sass/dart-sass/releases/download/1.53.0/dart-sass-1.53.0-linux-x64.tar.gz",
              "sha256": "c9d819e5e42c939c80b7b19f6142574a6c899425dae1f353b45cb98ee6565174",
              "only-arches": ["x86_64"]
            },
            {
              "type": "archive",
              "url": "https://github.com/sass/dart-sass/releases/download/1.53.0/dart-sass-1.53.0-linux-arm64.tar.gz",
              "sha256": "0b19824ea688dcfb4474c51c42cb010ca3ba20aaf3e09480c5d995f5ab2886ba",
              "only-arches": ["aarch64"]
            }
          ]
        }
      ]
    },
    {
      "name": "manrope-fonts",
      "buildsystem": "simple",
      "build-commands": [
        "install -d ${FLATPAK_DEST}/share/fonts/manrope",
        "install -D -m755 fonts/otf/*.otf ${FLATPAK_DEST}/share/fonts/manrope/",
        "fc-cache -f -v"
      ],
      "sources": [
        {
          "type": "git",
          "url": "https://github.com/sharanda/manrope.git",
          "branch": "master"
        }
      ]
    },
    {
      "name": "libhelium",
      "buildsystem": "meson",
      "config-opts": [
        "-Dstylesheet=false",
        "-Ddemo=false",
        "-Dvaladoc=false",
        "-Dgidoc=false",
        "--wrap-mode=nodownload"
      ],
      "sources": [
        {
          "type": "git",
          "url": "https://github.com/tau-OS/libhelium.git",
          "branch": "main"
        },
        {
          "type": "git",
          "url": "https://github.com/tau-OS/libbismuth.git",
          "branch": "main",
          "dest": "./subprojects/libbismuth"
        },
        {
          "type": "git",
          "url": "https://github.com/tau-OS/tau-helium.git",
          "branch": "main",
          "dest": "./subprojects/tau-helium"
        },
        {
          "type": "git",
          "url": "https://gitlab.gnome.org/jwestman/blueprint-compiler.git",
          "branch": "main",
          "dest": "./subprojects/blueprint-compiler"
        }
      ]
    },
    {
      "name": "libbismuth",
      "buildsystem": "meson",
      "config-opts": [
        "-Dvapi=true",
        "-Dintrospection=enabled",
        "--wrap-mode=nodownload"
      ],
      "sources": [
        {
          "type": "git",
          "url": "https://github.com/tau-OS/libbismuth.git",
          "branch": "main"
        }
      ]
    },
    {
      "name": "default-gtk-settings",
      "buildsystem": "simple",
      "sources": [
        {
          "type": "git",
          "url": "https://github.com/tau-OS/tau-release.git",
          "branch": "main"
        }
      ],
      "build-commands": [
        "install -Dm644 gtk/settings.ini ${FLATPAK_DEST}/etc/gtk-4.0/settings.ini"
      ]
    }

Переносим их в манифест приложения, а в качестве платформы и Sdk указываем соответственно org.gnome.Platform и org,gnome.Sdk. Не забываем прописать runtime-version. На момент публикации статьи актуальная версия — 45. Теперь приложение можно запустить при помощи того же GNOME Builder.

Как разрабатывать?

Создатели позаботились о будущих разработчиках приложений для своей ОС и создали простой шаблон, в котором уже есть все необходимое. Единственное, что потребуется сделать —это изменить манифест так, как мы рассказали в прошлом разделе.

Но также можно использовать стандартный шаблон для GTK-приложений, который предоставляет GNOME Builder. После создания проекта по этому шаблону и дополнения манифеста необходимыми модулями следует прописать библиотеку libhelium в сборочном сценарии meson.build, который находится в папке src:

dependency('libhelium-1')

Также не забываем в объявлениях классов заменить Gtk на He. Это надо сделать в файлах application.vala и window.vala. В файле пользовательского интерфейса window.ui в строке, где указывается template, в качестве parent следует прописать HeApplicationWindow.

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

public override void startup () {
        Gdk.RGBA accent_color = { 0 };
        accent_color.parse ("#00FF00");
        default_accent_color = He.Color.from_gdk_rgba (accent_color);

        base.startup ();
    }

Этот метод входит в состав официального шаблона от разработчиков и применяется во всех разработках проекта.

Ну, и раз мы используем Helium, то и диалог с информацией о приложении нужно использовать соответствующий:

private void on_about_action () {
        new He.AboutWindow (
            this.active_window,
            "Vala Template",
            "com.fyralabs.vala-template",
            "1.0.0",
            "com.fyralabs.vala-template",
            "https://weblate.fyralabs.com/addons/tauOS/vala-template/",
            "https://github.com/tau-OS/vala-template/issues",
            "https://github.com/tau-OS/vala-template",
            { "Fyra Labs" },
            { "Fyra Labs" },
            2024,
            He.AboutWindow.Licenses.GPLV3,
            He.Colors.GREEN
        ).present ();
      }

Вот таким нехитрым способом можно адаптировать существующий шаблон из GNOME Builder для разработки приложений с использованием Helium.

Приложение Forgetpass на Helium

Есть у меня приложение для генерации паролей для сайтов под названием Forgetpass. Написано оно с применением Libadwaita. Репозиторий его можно найти здесь. Для того чтобы переписать это приложение с применением библиотеки Helium, пришлось удалить все адвайтовские компоненты, заменив их компонентами из Helium и Gtk. В результате у меня получилось вот это:

Все описание интерфейса заняло около пятидесяти строчек:

construct {
            entry_site = new Entry();
            entry_site.placeholder_text = _("Site");
            entry_site.tooltip_text = _("Use only the domain name without prefixes, such as http or www, and endings, such as .com, etc.");
            entry_site.secondary_icon_name = "edit-clear-symbolic";
            entry_site.icon_press.connect((pos, event)=>{
                entry_site.set_text("");
                entry_site.grab_focus();
            });

            entry_key = new PasswordEntry();
            entry_key.show_peek_icon = true;
            entry_key.placeholder_text = _("Keyword");
            entry_key.tooltip_text = _("Be sure to remember the keyword! If you forget it, you won't be able to recover your password!");

            var generate_button = new He.PillButton(_("GENERATE"));

            generated_pass = new PasswordEntry() {
                hexpand = true,
                show_peek_icon = true,
                editable = false
            };     

            var copy_button = new He.IconicButton("edit-copy-symbolic");
            copy_button.tooltip_text = _("Copy to clipboard");

            generate_button.clicked.connect(on_generate);
            copy_button.clicked.connect(on_copy);

            var hbox_pass = new Box (Orientation.HORIZONTAL, 5);
            hbox_pass.append (generated_pass);
            hbox_pass.append (copy_button);

            var box = new Box (Orientation.VERTICAL, 10);
            box.vexpand = true;
            box.margin_start = 10;
            box.margin_end = 10;
            box.append(entry_site);
            box.append(entry_key);
            box.append(generate_button);
            box.append(hbox_pass);

            var appbar = new He.AppBar();

            overlay = new Overlay();
            overlay.set_child(box);

            var main_box = new Box (Orientation.VERTICAL, 0);
            main_box.append(appbar);
            main_box.append(overlay);

            set_child(main_box);

            name_toast = new He.Toast(_("Enter the name of the site"));
            overlay.add_overlay(name_toast);
            keyword_toast = new He.Toast(_("Enter a keyword"));
            overlay.add_overlay(keyword_toast);
	}

Как видно, вместо адвайтовских EntryRow и PasswordEntryRow использованы Entry и PasswordEntry из Gtk. Вместо AdwToastOverlay применен GtkOverlay. В качестве диалогового окна для показа пользователю сообщения об ошибке вместо AdwMessageDialog задействован He.Dialog:

private void alert (){
            var dialog = new He.Dialog (
                                true,
                                this,
                                _("ERROR!"),
                                "",
                                _("Failed to generate password!"),
                                "dialog-error-symbolic",
                                null,
                                null
                            );
            dialog.show ();
        }

Исходный код приложения можно найти здесь.

В целом библиотека мне понравилась. Она позволяет довольно легко и быстро создавать самые разные приложения для еще не вышедшей операционной системы tauOS. Надеюсь, что разработчики не забросят этот проект и продолжат развивать его дальше.

Автор статьи @KAlexAl


НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

Tags:
Hubs:
Total votes 3: ↑3 and ↓0+3
Comments3

Articles

Information

Website
firstvds.ru
Registered
Founded
Employees
51–100 employees
Location
Россия
Representative
FirstJohn