Page 1 of 1

Style

PostPosted: 17 Apr 2016, 22:35
by ArtMares
Версия
0.2

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

Когда проектировал аддон оталкивался от того с чем сам сталкнулся во время разработки PQStudio.
Так как студия разделена на отдельные компоненты и есть загрузчик компонентов, то описывать в каждом классе стили не удобно. Так же как и если их хранить полностью в отдельном файле который при инициализации приложения попадает в Storage.
По этому написал аддон который реализует хранение стилей и удобное задаение стиля приложению или его более маленьким компанентам, таким как кастомные кнопки и тд.

Так как по моей задумке PQStudio будет иметь как минимум две темы оформления, то было решено что в указанной директории будут находится директории в которых уже будут находится файлы со стилями.

Сами файлы стилей имею расширение .qss

При инициализации аддона он сканирует директорию на наличие вложенных директорий, названия этих деректорий будут служить названием для темы оформления или в простонароде skin.
Вложенные директории сканируеются на наличие файлов qss.

Внимание!
Аддон получит информацию только из файлов qss все остальные файлы и директории будут проигнорированны


Дочерний каталог должен выглядеть следующим образом:
Code:
/**
 * AppDir - Директория приложения
 * |---ChildDir - Дочерний каталог в котором расположены все темы приложения
 *     |---ThemeName1
 *     |   |---FileName1.qss
 *     |   |---FileName2.qss
 *     |
 *     |---ThemeName2
 *         |---FileName1.qss
 *         |---FileName2.qss
 */
Зависисмости
Для корректной работы необходимо расширение для движка PQEngineFS

Использование
Необходимо инициализирвоать аддон передав ему одним единственным аргументов название дочернего каталога приложения в котором будут находится все skins приложения и задать skin который будет использоваться:
Code:
new Style('Themes');
Style::setTheme('ThemeName1');

/** or */

$style = new Style('Themes');
$style->setTheme('ThemeName1');
Задать стиль элементу или окну приложения
Code:
$label = new QLabel($this);
$label->styleSheet = Style::get('FileName');

/** or */

$label = new QLabel($this);
Style::set($label, 'FileName');
Если необходимо получить список всех доступных тем оформления, воспользуйтесь методом getThemesList()
Будет возвращен массив содержащий все названия всех доступных тем
Code:
$skins = $style->getThemesList();

/** or */

$skins = Style::getThemesList();
Пример
Код приложения:
Code:
new Style('Themes');
Style::setTheme('Dark');

class MainWindow extends QWidget {
    public function __construct() {
        parent::__construct();

        Style::set($this, 'Main');
        
        $this->initComponents();
    }
}

$mainWindow = new MainWindow;
$mainWindow->show();
Содрежимое файла Main.qss
Который находится в директории Dark
Code:
QWidget {
    background: #7ad177;
}
UPD. Версия 0.2
Добавлены методы:
  • setSkin('ThemeName') - Алиас метода setTheme()
  • getSkinsList() - Алиас метода getThemesList()
  • about('ThemeName') - Метод возвращает информацию из файла about.json, который должен находится в директории темы. Если был передан аргумент, то возвратит информация по названию темы. Иначе возвратит информацию о теме заданной через метод setTheme() или setSkin(). Если у темы не было файла about.json то возвратит пустой массив
  • aboutAll() - Метод возвратит массив информации о всех темах у которых был файл about.json
Изменена логика хранения стилей тем. Раньше аддон хранил в себе стили всех тем оформления, теперь он хранит стили только той темы которая была задана через метод setTheme() или setSkin().

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

Структура файла styleSheet.json
Code:
{
    "ThemeName1" : [
        "FileName1",
        "FileName2"
    ],
    "ThemeName2" : [
        "FileName1",
        "FileName2"
    ]
}
В директории рядом с файлом styleSheet.json должны находится директории тем с их файлами.
При инициализации аддон проверит существуют ли файлы в директории приложения, если файлов нет то он их скопирует из ресурсов. Если файлы существуют, то он проверит их контрольные суммы и при не соответствии перезапишет только те файлы которые были изменены, файлами из ресурсов.

Архив
Style_0.2.7z
Архив необходимо скачать и распаковать в директорию addons установленной программы PQBuilder
Пример пути куда необходимо распаковывать архив:
C:\Program FIles (x86)\PQBuilder\addons

Re: Style

PostPosted: 18 Apr 2016, 08:57
by ArtMares
Нововедения планируемые в версии 0.2:

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

Второй пункт это возможное добавление файла конфигурации для самой темы, который будет храниться в директории с файлами темы.
Что приведет к появлению таких методов как
Code:
Style::about();

/** или */

Style::about("ThemeName");

/** и */

Style::aboutAll();
Файл конфигурации будет содержать информацию об авторе темы оформления, дату создания, краткое описание, список файлов используемых в теме

Данное введение позволит упростить процесс скинизации приложения

Так же появится метод alias для задания темы оформления
Code:
Style::setSkin('ThemeName');

/** аналогичен */

Style::setTheme('ThemeName');

Re: Style

PostPosted: 20 Apr 2016, 03:41
by WxMaper
С дуру закинул темы в ресурсы и долго не мог понять почему не работает :) потом глянул исходник и все встало на свои места.

К слову, класс QDirIterator (будет доступен в предстоящем снапшоте) позволяет получить список файлов в ресурсах, возможно это поможет тебе в реализации ресурсной модели аддона, чтобы файлики *.qss не валялись в свободном доступе.
Там вроде как даже не важно как подсовывать путь, класс сам определяет месторасположение файла (на диске или в ресурсах) по его пути. Подозреваю что в аддоне достаточно будет только изменить цикл foreach в методе getStyles. Что-то вроде:
Code:
// foreach($themes as $theme) {  // убираем, заменяем на:

$it = new QDirIterator($this->path, 
                       QDir::NoDotAndDotDot, 
                       QDirIterator::Subdirectories);

while($it->hasNext()) {
    $theme = $it->next();
    /* ... */
}

Re: Style

PostPosted: 20 Apr 2016, 06:55
by ArtMares
WxMaper писал:С дуру закинул темы в ресурсы и долго не мог понять почему не работает :) потом глянул исходник и все встало на свои места.

К слову, класс QDirIterator (будет доступен в предстоящем снапшоте) позволяет получить список файлов в ресурсах, возможно это поможет тебе в реализации ресурсной модели аддона, чтобы файлики *.qss не валялись в свободном доступе.
Там вроде как даже не важно как подсовывать путь, класс сам определяет месторасположение файла (на диске или в ресурсах) по его пути. Подозреваю что в аддоне достаточно будет только изменить цикл foreach в методе getStyles. Что-то вроде:

[code=php]// foreach($themes as $theme) {  // убираем, заменяем на:

$it = new QDirIterator($this->path,
                      QDir::NoDotAndDotDot,
                      QDirIterator::Subdirectories);

while($it->hasNext()) {
   $theme = $it->next();
   /* ... */
}
[/code]
Очень полезный класс :clapping:
Пригодится не только в этом аддоне но и в Icon, так как там шрифты тоже можно использовать из ресурсов и из директории проекта

Re: Style

PostPosted: 20 Apr 2016, 12:53
by WxMaper
Ну в новой версии еще и ресурсы немного пострадают :) если в проектах использовалась функция R(), то по идее ничего не должно изменится, но сама по себе функция будет не нужна, т.к. из пути к ресурсам удалось избавится от имени проекта.
Т.е. если раньше R возвращала что-то вроде :/projectName/path/to/file, то сейчас будет просто :/path/to/file, учитывая это, необходимость в использовании функции просто отпадает.

Re: Style

PostPosted: 20 Apr 2016, 12:56
by ArtMares
WxMaper писал:Ну в новой версии еще и ресурсы немного пострадают :) если в проектах использовалась функция R(), то по идее ничего не должно изменится, но сама по себе функция будет не нужна, т.к. из пути к ресурсам удалось избавится от имени проекта.
Т.е. если раньше R возвращала что-то вроде :/projectName/path/to/file, то сейчас будет просто :/path/to/file, учитывая это, необходимость в использовании функции просто отпадает.
Я везде старался использовать функцию R(), когда необходимо было передать файл объекту Qt. А во всех остальных случаях только qrc://

Re: Style

PostPosted: 21 Apr 2016, 19:56
by ArtMares
Внимание!
Аддон обновился до версии 0.2
Обратите внимание на первый пост или просто пройдите по ссылке Style