Qt Quick Controls 2 Silica Style

March 13, 2018

Проблема

Sailfish Silica компоненты создавались, когда еще не были опубликованы Qt Quick Controls (ни первые, ни вторые).

Публикация о Qt Quick Controls – июль 2013. Jolla представила Sailfish OS и свой UI на Slush 2012 – ноябрь 2012.

И теперь мы имеем два несвязанных набора компонентов для Sailfish OS и всех-остальных-поддерживаемых-Qt-платформ, которые при этом дублируют свои функции. Становится сложнее поддерживать кросс-платформенное приложение и для Sailfish. А изменения от разработчиков Qt, работающих над общим набором компонентов, не попадают в Sailfish.

Исследование

Вступление

Я очень сильно хотел решить проблему с тех пор как купил первый телефон от Jolla несколько лет назад. Я задавал вопросы русскоязычному сообществу на встречах и в чатах. И получал примерно такие ответы:

Это сделать можно, но не нужно. У Sailfish особенный UI/UX”.

Практически все мои знакомые, кто занимается кроссплатформенной мобильной разработкой на заказ предпочитают использовать нативные для платформы компоненты, вынося бизнес-логику в обычные плюсы.

Это правда, я тоже вижу такую картину и уважают такой подход. Но это меня долгое время останавливало от работы над решением… :(

Примеры

На практике же, когда я пишу свои приложения, мне приходится переписывать GUI полностью только под Sailfish.

Например, у меня есть банковское приложение по отображению списка транзакций и баланса. Приходится переписывать ListView, Buttons и другие компоненты с Silica на Qt Quick Controls, если я захочу запустить их в Linux/KDE. Но в случае с Android, я могу переиспользовать Qt Quick Controls с подходящим для системы графическим интерфейсом.

Другой пример – мультимедиа-приложение для IPTV. Я хочу собрать его для самодельного smartTV (arm железка + ЭЛТ-ТВ :) – без шансов, надо переписать UI-часть полностью, повторяя аналогичные части.

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

Похожие вопросы звучали на TJC [1,2] и на недавной IRC-встрече Collaboration Meeting от marmistrz.

Аналоги

Разработчику M4rtinK приходится держать прослойку для своего приложения modrana. Это тоже вариант, но если мы сделаем Silica стиль для Qt Quick Controls 2, дополнительная прослойка не потребуется.

Qt Quick Controls 2 (QQC2) уже содержат Default, Fusion, Imagine, Material and Universal стили. Сделать стиль Silica определенно возможно, и я получил положительные отзывы насчет своих задумок от Joona Petrell из Jolla по email.

Мой друг eetu, locusf и neochapay разрабатывают Qt Quick Nemo Controls. Насколько я знаю, их работа основана на QtQuick.Controls 1.0 и не предполагает жесты. (TODO: спросить у eetu и Сергея (neochapay) побольше об этом). Они трудятся над тем, чтобы предоставить полностью open-source решение, и это отлично. Но мне больше интересны стиль Silica, жесты и QQC2. Qt Quick Controls 2 по сравнению с первой версией были частично переписаны на C++ (презентация с деталями на QtWS16).

Недавно в русскоязычном чате мы разговаривали с Kaffeine (Александр) и он тоже поддерживает идеи насчет QQC2. В обсуждении с другими участниками он предоставил больше аргументов:

Сколько стартует Silica приложение? В среднем — 1500 мс. Из них 700 мс компиляция (после первого запуска компенсируется invoker’ом) и 700 мс отработка javascript в PageStack и ApplicationWindow. Приложение на Qt Quick стартует за 50 мс. Не зря в Qt при переходе с QQC1 на QQC2 всё переписали на C++.

Даёшь быстрые эффективные приложения на QQC2 под Sailfish! Ещё бы в Lipstick десятки захардкоженных Animation { duration: 600 } сделать настраиваемыми и поменять на, скажем, 100 и телефон просто полетит :). Уверен на 90%, что продолжительность анимации подбиралась под время запуска приложений на Jolla C.

Я говорю о том, что есть радикальный вариант повышения быстродействия — переписать js на C++. Стили тоже стóит частично реализовывать на плюсах. QQC2 — набор намного более высокоуровневых компонентов.

Повторю то, что сказал Алексей — уже есть стили Material и Universal. Я сомневаюсь, что есть принципиальная проблема обеспечения UI/UX Silica на базе QQC2. Для меню и других компонентов можно сделать Qt.SailfishExtras. material style.

QML — для декларативного описания. Quick — для описания интерфейсов. Общая рекомендация — Move complex code to C++. И — да, PageStack.js — это complex code Пример бенчмарка от KDAB. Другая публикация на woboq.

Также существует проект Kirigami от KDE и я слежу за их успехами, но мне больше по душе Silica. Kirigami, впрочем, тоже переиспользует Qt Quick Controls 2.

Текущие результаты

Поэкспериментировал с QQC2 в прошлом году.

По-прежнему требуется куча работы. Также в текущей LTS ветке Qt (5.9) были внесены изменения по отношению к текущей версии Qt 5.6 в Sailfish OS, что тоже следует принять во внимание.

Дополнительные задачи

P.S.

Я очень хочу помочь сделать QQC2 для своей любимой мобильной операционки. Sailfish Silica UI офигенный потому что:

 █████╗  █████╗  ██╗██████╗  ██████╗ 
██╔══██╗██╔══██╗███║╚════██╗██╔═══██╗
███████║███████║╚██║ █████╔╝██║   ██║
██╔══██║██╔══██║ ██║ ╚═══██╗██║▄▄ ██║
██║  ██║██║  ██║ ██║██████╔╝╚██████╔╝
╚═╝  ╚═╝╚═╝  ╚═╝ ╚═╝╚═════╝  ╚══▀▀═╝