diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3dbdc92 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.ropeproject/ +__pycache__/* +*.py[cod] +Session.vim +.idea/ diff --git a/CustomMessageBox.py b/CustomMessageBox.py new file mode 100644 index 0000000..60e85ba --- /dev/null +++ b/CustomMessageBox.py @@ -0,0 +1,151 @@ +import os +import re +from qgis.PyQt.QtWidgets import ( + QWidget, QWidgetAction, QCalendarWidget, QMenu, QToolButton, QPushButton, + QApplication, QAbstractItemView, QStyleOptionViewItem, QDataWidgetMapper, + QMessageBox, QCheckBox, QHeaderView, QGridLayout, QItemDelegate, QStyle, + QLabel, QDialogButtonBox, QProgressDialog, QScrollArea, QCompleter, + QFileDialog, + QComboBox, QFontComboBox, QFrame, QDialog) +from qgis.PyQt.QtGui import ( + QRegExpValidator, QColor, QIcon, QPen, QStandardItemModel, QStandardItem, + QTextDocument, QPixmap, QDesktopServices +) +from PyQt5.QtCore import Qt + + +def normalize_path(path): + return os.path.normpath(os.sep.join(re.split(r'\\|/', path))) + + +class CustomMessageBox(QMessageBox): + stylesheet = """ + * { + background-color: rgb(53, 85, 109, 220); + color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; + border: 0px; + } + + QAbstractItemView { + selection-background-color: rgb(87, 131, 167); + } + + QPushButton { + border: none; + border-width: 2px; + border-radius: 6px; + background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); + padding: 5px 15px; + } + + QPushButton:checked { + background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); + border: solid; + border-width: 2px; + border-color: rgb(65, 97, 124); + } + + QPushButton:pressed { + background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); + border: solid; + border-width: 2px; + border-color: rgb(65, 97, 124); + } + """ + + def __init__(self, parent=None, text='', image=''): + super(CustomMessageBox, self).__init__(parent) + self.text = text + + self.rebuild_layout(text, image) + + def rebuild_layout(self, text, image): + self.setStyleSheet(self.stylesheet) + + scrll = QScrollArea(self) + scrll.setWidgetResizable(True) + self.qwdt = QWidget() + self.qwdt.setLayout(QGridLayout(self)) + grd = self.findChild(QGridLayout) + if text: + lbl = QLabel(text, self) + lbl.setStyleSheet(self.stylesheet) + lbl.setAlignment(Qt.AlignCenter) + lbl.setWordWrap(False) + lbl.setTextInteractionFlags( + Qt.TextSelectableByMouse) + self.qwdt.layout().addWidget(lbl, 1, 0) + if image: + px_lbl = QLabel(self) + img_path = normalize_path(image) + pixmap = QPixmap(img_path) + px_lbl.setPixmap(pixmap) + px_lbl.setMinimumSize(pixmap.width(), pixmap.height()) + px_lbl.setAlignment(Qt.AlignCenter) + px_lbl.setWordWrap(False) + self.qwdt.layout().addWidget(px_lbl, 0, 0) + + scrll.setWidget(self.qwdt) + scrll.setContentsMargins(15, 5, 15, 10) + scrll.setStyleSheet(self.stylesheet) + grd.addWidget(scrll, 0, 1) + self.layout().removeItem(self.layout().itemAt(0)) + self.layout().removeItem(self.layout().itemAt(0)) + self.setWindowTitle('GIAP-PolaMap') + self.setWindowIcon(QIcon(':/plugins/GIAP-PolaMap/icons/giap_logo.png')) + + def button_ok(self): + self.setStandardButtons(QMessageBox.Ok) + self.setDefaultButton(QMessageBox.Ok) + self.set_proper_size() + QMessageBox.exec_(self) + + def button_yes_no(self): + self.setStandardButtons(QMessageBox.Yes | QMessageBox.No) + self.setDefaultButton(QMessageBox.No) + self.set_proper_size() + return QMessageBox.exec_(self) + + def button_yes_no_open(self): + self.setStandardButtons( + QMessageBox.Yes | QMessageBox.No | QMessageBox.Open) + self.setDefaultButton(QMessageBox.No) + self.set_proper_size() + return QMessageBox.exec_(self) + + def button_ok_open(self): + self.setStandardButtons(QMessageBox.Ok | QMessageBox.Open) + self.setDefaultButton(QMessageBox.Open) + self.set_proper_size() + return QMessageBox.exec_(self) + + def button_editr_close(self): + self.setStandardButtons( + QMessageBox.Save | QMessageBox.Cancel | QMessageBox.Discard) + self.setDefaultButton(QMessageBox.Discard) + self.set_proper_size() + return QMessageBox.exec_(self) + + def set_proper_size(self): + scrll = self.findChild(QScrollArea) + new_size = self.qwdt.sizeHint() + if self.qwdt.sizeHint().height() > 600: + new_size.setHeight(600) + else: + new_size.setHeight(self.qwdt.sizeHint().height()) + if self.qwdt.sizeHint().width() > 800: + new_size.setWidth(800) + new_size.setHeight(new_size.height() + 20) + else: + btn_box_width = self.findChild(QDialogButtonBox).sizeHint().width() + if self.qwdt.sizeHint().width() > btn_box_width: + new_size.setWidth(self.qwdt.sizeHint().width()) + else: + new_size.setWidth(btn_box_width) + scrll.setFixedSize(new_size) + scrll.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + scrll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + self.show() + scrll.horizontalScrollBar().setValue( + int(scrll.horizontalScrollBar().maximum() / 2)) diff --git a/Kompozycje/DefaultCompositions.py b/Kompozycje/DefaultCompositions.py index 99e500d..4860d0f 100644 --- a/Kompozycje/DefaultCompositions.py +++ b/Kompozycje/DefaultCompositions.py @@ -1,314 +1,71 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import -import os -import qgis -from qgis.core import QgsProject -from .CompositionsLib import get_all_groups_layers, LayersPanel, get_checked_layers_ids_from_composition, \ - get_layers_ids_from_composition -from GIAP_funkcje import (identify_layer_in_group, get_project_config) +from .CompositionsLib import get_all_groups_layers, LayersPanel, \ + get_checked_layers_ids_from_composition, get_layers_ids_from_composition,\ + get_map_layer +from ..utils import (identify_layer_in_group, get_project_config) default_compositions = {} -# 'Adresat': [('ADRESAT', 'AD_PunktAdresowy', True), -# ('GRANICE', 'DZIAŁKI EWIDENCYJNE', True)], -# 'PRZEZNACZENIE MPZP STANDARD': [], -# 'PRZEZNACZENIE MPZP ORYGINAŁ': [], -# 'PLIKI RASTROWE': [('DOKUMENTY PLANISTYCZNE', 'PLIKI RASTROWE', True)], -# 'PLIKI RASTROWE PRZYCIĘTE': [('', 'PLIKI RASTROWE PRZYCIĘTE', True)], -# } def update_wszystkie_default_compositions(): - wszystkie_layer_list = [ - 'DZIAŁKI EWIDENCYJNE', - 'PRZEZNACZENIE MPZP', - ] - all_layers = get_all_groups_layers() - n = [] - for layer_path in all_layers: - splitted_layer = layer_path.rsplit(':') - group = ':'.join(splitted_layer[:-1]) if len( - splitted_layer) > 1 else '' - layer = splitted_layer[-1] - if layer in wszystkie_layer_list: - n.append((group, layer, True)) + all_layers_list = [] + sel_list = LayersPanel().start_getting_visible_layers() + for group_layer in get_all_groups_layers(): + colon_index = group_layer.rfind(':') + if colon_index == -1: + layer_group = '' else: - n.append((group, layer, False)) - default_compositions['Wszystkie warstwy'] = n + layer_group = group_layer[:colon_index] + layer_name = group_layer[colon_index + 1:] + map_layer, layer_group, layer_name = get_map_layer( + layer_group, layer_name) + active = True if map_layer.id() in sel_list else False + n = [layer_group, layer_name, active] + all_layers_list.append(tuple(n)) -def update_mpzp_default_compositions(): - mpzp_groups = [ - 'DOKUMENTY PLANISTYCZNE', - 'PLIKI RASTROWE PRZYCIĘTE', - ] - mpzp_layers = [ - 'PRZEZNACZENIE MPZP' - ] - all_layers = get_all_groups_layers() - n = [] - for layer_path in all_layers: - splitted_layer = layer_path.rsplit(':') - group = ':'.join(splitted_layer[:-1]) if len( - splitted_layer) > 1 else '' - for mg in mpzp_groups: - if mg in group: - layer = splitted_layer[-1] - if layer in mpzp_layers: - n.append((group, layer, True)) - else: - n.append((group, layer, False)) - default_compositions['PRZEZNACZENIE MPZP ORYGINAŁ'] = n - default_compositions['PRZEZNACZENIE MPZP STANDARD'] = n - - -def update_pliki_rastrowe_compositions(): - all_layers = get_all_groups_layers() - n = [] - for layer_path in all_layers: - splitted_layer = layer_path.rsplit(':') - group = ':'.join(splitted_layer[:-1]) if len( - splitted_layer) > 1 else '' - if 'DOKUMENTY PLANISTYCZNE:PLIKI RASTROWE' in group: - layer = splitted_layer[-1] - n.append((group, layer, True)) - default_compositions['PLIKI RASTROWE'] = n - - -def update_pliki_rastrowe_przyciete_compositions(): - all_layers = get_all_groups_layers() - n = [] - for layer_path in all_layers: - splitted_layer = layer_path.rsplit(':') - group = ':'.join(splitted_layer[:-1]) if len( - splitted_layer) > 1 else '' - if 'PLIKI RASTROWE PRZYCIĘTE' in group: - layer = splitted_layer[-1] - n.append((group, layer, True)) - default_compositions['PLIKI RASTROWE PRZYCIĘTE'] = n - - -def update_default_compositions(): - update_wszystkie_default_compositions() - - -def __show_specified_groups(groups=['DOKUMENTY PLANISTYCZNE', - 'PLIKI RASTROWE PRZYCIĘTE']): - # dokumenty planistyczne i rastry przyciete do widoku - panel = LayersPanel() - panel.uncheckAll() - panel.hideUncheckedNodes() - for group_name in groups: - group = panel.root.findGroup(group_name) - panel.hideNode(group, False) - panel.showHiddenNodes(group) - - -def load_qml_to_layer(layer, qml_name): - qml_path = '' - prjpath = QgsProject.instance().fileName() - proj_dir = os.path.dirname(os.path.abspath(prjpath)) - up_dir = os.path.dirname(proj_dir) - for file in os.listdir(os.path.join(up_dir, 'PLIKI_WEKTOROWE', "MPZP")): - if file.endswith(qml_name): - qml_path = os.path.join(up_dir, 'PLIKI_WEKTOROWE', "MPZP", file) - if os.path.exists(qml_path): - layer.loadNamedStyle(qml_path) - layer.triggerRepaint() - - -def set_mpzp_strefy_linie(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', 'STREFY LINIE') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - -def set_mpzp_wymiarowanie(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', 'WYMIAROWANIE') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - -def set_punktowe_standard(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', - 'DODATKOWE INFORMACJE PUNKTOWE') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - load_qml_to_layer( - map_layer, - 'mpzp_dodatkowe_punktowe_S_STANDARD.qml' - ) - - -def set_punktowe_oryginal(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', - 'DODATKOWE INFORMACJE PUNKTOWE') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - load_qml_to_layer( - map_layer, - 'mpzp_dodatkowe_punktowe_S_ORYGINAL.qml' - ) - - -def set_liniowe_standard(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', - 'DODATKOWE INFORMACJE LINIOWE') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - load_qml_to_layer( - map_layer, - 'mpzp_dodatkowe_liniowe_S_STANDARD.qml' - ) - - -def set_liniowe_oryginal(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', - 'DODATKOWE INFORMACJE LINIOWE') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - load_qml_to_layer( - map_layer, - 'mpzp_dodatkowe_liniowe_S_ORYGINAL.qml' - ) - - -def set_mpzp_standard(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', - 'PRZEZNACZENIE MPZP') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - load_qml_to_layer( - map_layer, - 'mpzp_przeznaczenie_S_STANDARD.qml' - ) - - -def set_mpzp_oryginal(): - __show_specified_groups() - map_layer = identify_layer_in_group('MPZP', - 'PRZEZNACZENIE MPZP') - if map_layer: - LayersPanel().checkLayersByIds([map_layer.id()]) - load_qml_to_layer( - map_layer, - 'mpzp_przeznaczenie_S_ORYGINAL.qml' - ) - - -def set_pliki_rastrowe(): - update_default_compositions() - comp = get_compositions() - rastry = ['DOKUMENTY PLANISTYCZNE:PLIKI RASTROWE'] - LayersPanel().checkGroupsByName(rastry) - LayersPanel().hideUncheckedNodes() - if not comp['PLIKI RASTROWE'][0][2]: - LayersPanel().uncheckGroupsByName(rastry) - set_default_styles() - - -def set_pliki_rastrowe_przyciete(): - comp = get_compositions() - rastry_przyciete = ['PLIKI RASTROWE PRZYCIĘTE'] - LayersPanel().checkGroupsByName(rastry_przyciete) - LayersPanel().hideUncheckedNodes() - if not comp['PLIKI RASTROWE PRZYCIĘTE'][0][2]: - LayersPanel().uncheckGroupsByName(rastry_przyciete) - set_default_styles() + default_compositions['Wszystkie warstwy'] = all_layers_list def set_wszystkie_warstwy(): comp = get_compositions() - checked_layers_ids, groups = get_checked_layers_ids_from_composition(comp['Wszystkie warstwy']['layers'] + checked_layers_ids, groups = get_checked_layers_ids_from_composition( + comp['Wszystkie warstwy']['layers'] ) LayersPanel().checkLayersByIds(checked_layers_ids) LayersPanel().checkGroupsByName(groups) compositons_special = { - # 'MPZP STREFY LINIE': set_mpzp_strefy_linie, - # 'DODATKOWE PUNKTOWE STANDARD': set_punktowe_standard, - # 'DODATKOWE PUNKTOWE ORYGINAŁ': set_punktowe_oryginal, - # 'DODATKOWE LINIOWE STANDARD': set_liniowe_standard, - # 'DODATKOWE LINIOWE ORYGINAŁ': set_liniowe_oryginal, - 'PRZEZNACZENIE MPZP STANDARD': set_mpzp_standard, - 'PRZEZNACZENIE MPZP ORYGINAŁ': set_mpzp_oryginal, - # 'PLIKI RASTROWE': set_pliki_rastrowe, - # 'PLIKI RASTROWE PRZYCIĘTE': set_pliki_rastrowe_przyciete, 'Wszystkie warstwy': set_wszystkie_warstwy, } def get_compositions(): - update_default_compositions() + update_wszystkie_default_compositions() comp = eval( get_project_config('Kompozycje', 'domyslne_kompozycje', str(default_compositions) ) ) + for name in default_compositions: if name not in comp: comp[name] = default_compositions[name] return comp -def compositions_names(): - compositions_dict = get_compositions() - sorted_comps = sorted(list(compositions_dict.items()), key=lambda x: x[1]['order']) - sorted_comps_names = [y[0] for y in sorted_comps] - return sorted_comps_names - - -def set_simple_composition(name): - compositions = get_compositions() - layers_ids = get_layers_ids_from_composition( - compositions[name]['layers']) - checked_layers_ids = get_checked_layers_ids_from_composition( - compositions[name]['layers']) - LayersPanel().checkLayersByIds(layers_ids) - # ukryj wszystkie warstwy i grupy ktore nie sa zaznaczone - LayersPanel().hideUncheckedNodes() - LayersPanel().uncheckAll() - LayersPanel().checkLayersByIds(checked_layers_ids) - set_default_styles() - - def set_composition(name): if name in compositons_special: compositons_special[name]() - else: - set_simple_composition(name) - - -def set_default_styles_decorator(func): - def set_default_styles_wrapper(): - giap_layout = 'giap_layout' - if giap_layout in qgis.utils.plugins: - spdp = qgis.utils.plugins[giap_layout] - combo = giap_layout.main_widget.styleComboBox - text = u'MPZP ORYGINAŁ' - text_id = combo.findText(text) - if text_id == -1: - func() - else: - func() - return set_default_styles_wrapper -@set_default_styles_decorator -def set_default_styles(): - layers_qml = { - 'DODATKOWE INFORMACJE PUNKTOWE': 'mpzp_dodatkowe_punktowe_S_ORYGINAL.qml', - 'DODATKOWE INFORMACJE LINIOWE': "mpzp_dodatkowe_liniowe_S_ORYGINAL.qml", - 'PRZEZNACZENIE MPZP': 'mpzp_przeznaczenie_S_ORYGINAL.qml', - } - for layer, qml in list(layers_qml.items()): - map_layer = identify_layer_in_group('MPZP', layer) - if map_layer: - load_qml_to_layer(map_layer, qml) +def compositions_names(): + compositions_dict = get_compositions() + sorted_comps = sorted(list(compositions_dict.items()), + key=lambda x: x[1]['order']) + sorted_comps_names = [y[0] for y in sorted_comps] + return sorted_comps_names diff --git a/Kompozycje/Kompozycje.py b/Kompozycje/Kompozycje.py index 373eb5d..3707faf 100644 --- a/Kompozycje/Kompozycje.py +++ b/Kompozycje/Kompozycje.py @@ -1,24 +1,26 @@ # -*- coding: utf-8 -*- +import os from collections import OrderedDict +from time import sleep import uuid -from PyQt5.QtCore import QObject, pyqtSignal, QItemSelectionModel, Qt -from PyQt5.QtWidgets import QMessageBox, QApplication, QItemDelegate, QCheckBox +from PyQt5.QtCore import QObject, pyqtSignal, QItemSelectionModel, \ + Qt +from PyQt5.QtWidgets import QMessageBox, QApplication, QItemDelegate, \ + QCheckBox, QFileDialog, QProgressDialog -from qgis.PyQt.QtGui import QStandardItemModel, QStandardItem +from qgis.PyQt.QtGui import QStandardItemModel, QStandardItem, QIcon from qgis.core import QgsProject, QgsLayerTreeNode -from GIAPSettings import write_user_compositions_gui, get_user_compositions_gui from .CompositionsSaverDialog import CompositionsSaverDialog from .dodajKompozycje import DodajKompozycjeDialog from .nowa_kompozycja import NowaKompozycjaDialog -from GIAP_funkcje import ( - set_project_config, - ConfigSaveProgressDialog, - CustomMessageBox, - identify_layer_by_id) +from ..CustomMessageBox import CustomMessageBox + +from ..utils import get_project_config, SingletonModel,\ + set_project_config, identify_layer_by_id, ConfigSaveProgressDialog from .CompositionsLib import ( LayersPanel as lsp, @@ -31,9 +33,81 @@ from . import UserCompositions from . import DefaultCompositions + LayersPanel = lsp wszystkie_warstwy_visible_groups = ['GRANICE', 'DOKUMENTY PLANISTYCZNE:MPZP'] +CODING_TYPE = 'utf-8' + +CONFIG_SEPARATOR = '::&*&::' +CONFIG_LINES_SEPARATOR = ';;@@\n@@;;' + +FILE_CONFIG_EXTENSION = '.giapconfig' +USER_COMPOSITIONS_EXTENSION = '.giapcomp' + +# COMPOSITIONS_SCOPE = "Kompozycje" + + +def write_user_compositions(comp, filename): + text = comp + with open(filename, 'wb') as f: + f.write(text.encode(CODING_TYPE)) + + +def write_user_compositions_gui(comp_list): + save_path = get_project_config('Sciezka', 'sciezka_do_zapisu', '') + filename, __ = QFileDialog.getSaveFileName( + None, + "Zachowaj jako", + save_path, + f'*{USER_COMPOSITIONS_EXTENSION}' + ) + if filename: + progress = ProgressDialog(None, 'Trwa zapisywanie') + progress.start() + new_dirname = os.path.dirname(save_path) + QApplication.processEvents() + set_project_config('Sciezka', 'sciezka_do_zapisu', new_dirname) + QApplication.processEvents() + if not filename.endswith(USER_COMPOSITIONS_EXTENSION): + filename += USER_COMPOSITIONS_EXTENSION + write_user_compositions(comp_list, filename) + QApplication.processEvents() + progress.stop() + CustomMessageBox(None, f'Zapisano plik {filename}.').button_ok() + + +def get_user_compositions(filename): + with open(filename, 'rb') as f: + text = f.read().decode(CODING_TYPE) + comp_dict = eval(str(text)) + return comp_dict + + +def get_user_compositions_gui(): + save_path = get_project_config('Sciezka', 'sciezka_do_zapisu', '') + filename, __ = QFileDialog.getOpenFileName( + None, + "Otwórz", + save_path, + f'*{USER_COMPOSITIONS_EXTENSION}' + ) + user_comp = {} + if filename: + progress = ProgressDialog(None, "Trwa wczytywanie") + progress.start() + new_dirname = os.path.dirname(save_path) + QApplication.processEvents() + set_project_config('Sciezka', 'sciezka_do_zapisu', new_dirname) + QApplication.processEvents() + try: + QApplication.processEvents() + user_comp = get_user_compositions(filename) + except Exception: + CustomMessageBox(None, 'Nie udało się wczytać ustawień!').button_ok() + progress.stop() + return user_comp + class CompositionsTool(object): def __init__(self, iface, parent=None): @@ -44,7 +118,8 @@ def __init__(self, iface, parent=None): self.domyslne_kompozycje = dict() self.stworzone_kompozycje = dict() self.combo_box = None - self.dock.kompozycje_config.clicked.connect(self.config) + + self.dock.toolButton_compositions.clicked.connect(self.config) def start(self): prjpath = QgsProject.instance().fileName() @@ -54,18 +129,28 @@ def start(self): self.modify_tool = CompositionsConfig(self) self.domyslne_kompozycje = DefaultCompositions.get_compositions() self.stworzone_kompozycje = UserCompositions.get_compositions() - self.modify_tool.check_comps_schema(self.domyslne_kompozycje, 'domyślnych') - self.modify_tool.check_comps_schema(self.stworzone_kompozycje, 'użytkownika') + self.modify_tool.check_comps_schema( + self.domyslne_kompozycje, 'domyślnych') + self.modify_tool.check_comps_schema( + self.stworzone_kompozycje, 'użytkownika') self.combo_box = CompositionsComboBox(self) connect_nodes(QgsProject.instance().layerTreeRoot()) - self.modify_tool.compositionsSaved.connect(self.combo_box.fill_with_kompozycje) + self.modify_tool.compositionsSaved.connect( + self.combo_box.fill_with_kompozycje) def config(self): """ Metoda służąca do otworzenia okna ustawian kompozycji. """ + if self.modify_tool is None: + CustomMessageBox( + self.dock, + 'Kompozycje są dostępne tylko w projekatach zapisanych' + 'na dysku!' + ).button_ok() + return self.modify_tool.run() def unload(self): @@ -86,12 +171,6 @@ def __init__(self, parent): self.model_kompozycji = QStandardItemModel() self.order_changed = False - def reset_default(self): - QgsProject.instance().writeEntry("Kompozycje", "domyslne_kompozycje", "{}") - QgsProject.instance().write() - self.dlg.close() - self.run() - def save_to_project_file(self): self.save(False) QgsProject.instance().write() @@ -110,19 +189,15 @@ def create_table_model(self): self.model_kompozycji.clear() if self.dlg.radioButton_1.isChecked(): self.load_compositions(self.kompozycje.stworzone_kompozycje) - else: - self.load_compositions(self.kompozycje.domyslne_kompozycje) self.order_changed = False def run(self): self.dlg = DodajKompozycjeDialog() self.dlg.radioButton_1.clicked.connect(self.create_table_model) - self.dlg.radioButton_2.clicked.connect(self.create_table_model) self.dlg.dodaj_kompozycje.clicked.connect(self.dodaj) self.dlg.edytuj_kompozycje.clicked.connect(self.edytuj) self.dlg.usun_kompozycje.clicked.connect(self.usun) - self.dlg.reset.clicked.connect(self.reset_default) self.dlg.zapisz.clicked.connect(self.write_file) self.dlg.wczytaj.clicked.connect(self.read_file) self.dlg.komp_dol.clicked.connect(self.move_comp_down) @@ -189,7 +264,8 @@ def usun(self): self.order_changed = True def load_compositions(self, compositions): - sorted_comps = sorted(list(compositions.items()), key=lambda x: x[1]['order']) + sorted_comps = sorted(list(compositions.items()), + key=lambda x: x[1]['order']) sorted_comps_names = [y[0] for y in sorted_comps] for comp_name in sorted_comps_names: item = QStandardItem(str(comp_name)) @@ -316,8 +392,10 @@ def check_update_comps(self, compositions): def check_all_layers_comp(self): layertree_changed = False all_groups_layers = get_all_groups_layers() - def_layers = [':'.join([tup[0], tup[1]]) if tup[0] else tup[1] - for tup in self.kompozycje.domyslne_kompozycje['Wszystkie warstwy']['layers']] + def_layers = [ + ':'.join([tup[0], tup[1]]) if tup[0] else tup[1] for tup in + self.kompozycje.domyslne_kompozycje['Wszystkie warstwy']['layers'] + ] if sorted(all_groups_layers) != sorted(def_layers): self.update_all_layers_comp(all_groups_layers) layertree_changed = True @@ -722,12 +800,12 @@ def set_filter(self): LayersPanel().runShow() LayersPanel().uncheckAllGroup() LayersPanel().uncheckAll() - DefaultCompositions.set_default_styles() if comp_name in DefaultCompositions.compositions_names(): DefaultCompositions.set_composition(comp_name) elif comp_name in UserCompositions.compositions_names(): UserCompositions.set_composition(comp_name) QApplication.processEvents() + QApplication.processEvents() self.canvas.refresh() def unload(self): @@ -744,3 +822,60 @@ def paint(self, painter, option, index): self.check_box.setChecked(True) if not self.parent().indexWidget(index): self.parent().setIndexWidget(index, self.check_box) + + +class ProgressDialog(QProgressDialog, SingletonModel): + stylesheet = """ + * { + background-color: rgb(53, 85, 109, 220); + color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; + } + """ + + def __init__(self, parent=None, title='GIAP-Layout'): + super(ProgressDialog, self).__init__(parent) + self.setWindowTitle(title) + self.setWindowIcon(QIcon(':/plugins/giap_layout/icons/giap_logo.png')) + self.setLabelText('Proszę czekać...') + self.setFixedWidth(300) + self.setFixedHeight(100) + self.setMaximum(100) + self.setCancelButton(None) + # self.setStyleSheet(self.stylesheet) + self.setWindowFlags(Qt.Dialog | Qt.WindowCloseButtonHint) + self.rejected.connect(self.stop) + self.setWindowModality(Qt.WindowModal) + + def make_percent_step(self, step=100, new_text=None): + if new_text: + self.setLabelText(new_text) + if "wczytywanie" in new_text: + for pos in range(100 - self.value()): + sleep(0.0005) + self.setValue(self.value() + 1) + return + for pos in range(step): + sleep(0.0005) + self.setValue(self.value() + 1) + QApplication.sendPostedEvents() + QApplication.processEvents() + + def start_steped(self, title='Trwa ładowanie danych.\n Proszę czekać...'): + self.setLabelText(title) + self.setValue(1) + self.show() + QApplication.sendPostedEvents() + QApplication.processEvents() + + def start(self): + self.setFixedWidth(250) + self.setMaximum(0) + self.setCancelButton(None) + self.show() + QApplication.sendPostedEvents() + QApplication.processEvents() + + def stop(self): + self.setValue(100) + self.close() diff --git a/Kompozycje/UserCompositions.py b/Kompozycje/UserCompositions.py index 3dba937..5554b1f 100644 --- a/Kompozycje/UserCompositions.py +++ b/Kompozycje/UserCompositions.py @@ -5,7 +5,7 @@ get_layers_ids_from_composition, get_checked_layers_ids_from_composition, ) -from GIAP_funkcje import get_project_config +from ..utils import get_project_config """ Kompozycje użytkownika. diff --git a/Kompozycje/compositions_saver.ui b/Kompozycje/compositions_saver.ui index 4598633..d77ba82 100644 --- a/Kompozycje/compositions_saver.ui +++ b/Kompozycje/compositions_saver.ui @@ -9,7 +9,7 @@ 0 0 - 944 + 923 428 @@ -41,7 +41,40 @@ font: 10pt "Segoe UI"; } - + +QAbstractItemView +{ + alternate-background-color: #e7e7e7; + color: black; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 1px; +} + +QPushButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QToolButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QHeaderView::section +{ + background-color: #cfcfcf; + color: black; + padding-left: 4px; +} false diff --git a/Kompozycje/dodajKompozycje.py b/Kompozycje/dodajKompozycje.py index b783627..c5abb5e 100644 --- a/Kompozycje/dodajKompozycje.py +++ b/Kompozycje/dodajKompozycje.py @@ -14,23 +14,12 @@ def __init__(self, parent=None): """Constructor.""" super(DodajKompozycjeDialog, self).__init__(parent) self.setupUi(self) - self.radioButton_1.clicked.connect(self.radio_changed) - self.radioButton_2.clicked.connect(self.radio_changed) - self.reset.hide() def radio_changed(self): if self.radioButton_1.isChecked(): self.groupBox_35.setTitle(u"Kompozycje użytkownika") - self.reset.hide() self.dodaj_kompozycje.show() self.usun_kompozycje.show() self.wczytaj.show() self.zapisz.show() - elif self.radioButton_2.isChecked(): - self.groupBox_35.setTitle(u"Kompozycje domyślne") - self.reset.show() - self.dodaj_kompozycje.hide() - self.usun_kompozycje.hide() - self.wczytaj.hide() - self.zapisz.hide() diff --git a/Kompozycje/dodaj_kompozycje.ui b/Kompozycje/dodaj_kompozycje.ui index f4f058f..90382a4 100644 --- a/Kompozycje/dodaj_kompozycje.ui +++ b/Kompozycje/dodaj_kompozycje.ui @@ -12,8 +12,8 @@ 0 0 - 1011 - 493 + 984 + 518 @@ -41,10 +41,44 @@ * { background-color: rgb(255, 255, 255); + color: black; font: 10pt "Segoe UI"; } - + +QAbstractItemView +{ + alternate-background-color: #e7e7e7; + color: black; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 1px; +} + +QPushButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QToolButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QHeaderView::section +{ + background-color: #cfcfcf; + color: black; + padding-left: 4px; +} false @@ -319,222 +353,6 @@ QRadioButton { - - - - true - - - - 0 - 20 - - - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - QRadioButton::indicator::checked { - border: 2px solid black; - border-radius: 9px; - background-color: rgb(252, 67, 73); - width: 15px; - height: 15px; -} - -QRadioButton::indicator::unchecked { - border: 2px solid black; - border-radius: 9px; - background-color: rgb(255, 255, 255); - width: 15px; - height: 15px; -} - -QRadioButton { - color : white; - font-weight: bold; -} - - - Kompozycje domyślne - - - true - - - false - - - @@ -571,7 +389,6 @@ QRadioButton { radioButton_1 verticalSpacer_3 - radioButton_2 zapisz wczytaj @@ -588,7 +405,9 @@ QRadioButton { - + * { +color: black; +} QFrame::NoFrame @@ -846,13 +665,6 @@ QRadioButton { - - - - Resetuj kompozycje domyślne - - - @@ -932,7 +744,6 @@ QRadioButton { tableView komp_dol komp_gora - reset dodaj_kompozycje edytuj_kompozycje usun_kompozycje @@ -941,7 +752,6 @@ QRadioButton { zapisz wczytaj radioButton_1 - radioButton_2 diff --git a/Kompozycje/nowa_kompozycja.py b/Kompozycje/nowa_kompozycja.py index d1e119c..48903c0 100644 --- a/Kompozycje/nowa_kompozycja.py +++ b/Kompozycje/nowa_kompozycja.py @@ -1 +1,55 @@ -# -*- coding: utf-8 -*- import os from qgis.PyQt import QtWidgets, uic, QtCore, QtGui FORM_CLASS, _ = uic.loadUiType(os.path.join( os.path.dirname(__file__), 'nowa_kompozycja.ui')) class NowaKompozycjaDialog(QtWidgets.QDialog, FORM_CLASS): def __init__(self, parent=None): super(NowaKompozycjaDialog, self).__init__(parent) self.setupUi(self) self.setWindowFlags(QtCore.Qt.Window) # żeby nie dało się upuszczać na elementach (inaczej "drop" zastępuje elementy na liście!) standard_item_flags = int(QtGui.QStandardItem().flags()) self.new_flags = QtCore.Qt.ItemFlags(standard_item_flags - 8) self.checkPushButton.clicked.connect(self.check) self.uncheckPushButton.clicked.connect(self.uncheck) self.checkAllPushButton.clicked.connect(self.check_all) self.uncheckAllPushButton.clicked.connect(self.uncheck_all) def check(self): table = self.warstwy_table sel_model = table.selectionModel() model = table.model() rows = sel_model.selectedRows() for row in rows: item = model.itemFromIndex(row) item.setCheckState(QtCore.Qt.Checked) def uncheck(self): table = self.warstwy_table sel_model = table.selectionModel() model = table.model() rows = sel_model.selectedRows() for row in rows: item = model.itemFromIndex(row) item.setCheckState(QtCore.Qt.Unchecked) def check_all(self): table = self.warstwy_table model = table.model() for row in range(model.rowCount()): item = model.itemFromIndex(model.index(row, 0)) item.setCheckState(QtCore.Qt.Checked) def uncheck_all(self): table = self.warstwy_table model = table.model() for row in range(model.rowCount()): item = model.itemFromIndex(model.index(row, 0)) item.setCheckState(QtCore.Qt.Unchecked) \ No newline at end of file +# -*- coding: utf-8 -*- + +import os +from qgis.PyQt import QtWidgets, uic, QtCore, QtGui + +FORM_CLASS, _ = uic.loadUiType(os.path.join( + os.path.dirname(__file__), 'nowa_kompozycja.ui')) + + +class NowaKompozycjaDialog(QtWidgets.QDialog, FORM_CLASS): + def __init__(self, parent=None): + super(NowaKompozycjaDialog, self).__init__(parent) + self.setupUi(self) + self.setWindowFlags(QtCore.Qt.Window) + + # żeby nie dało się upuszczać na elementach (inaczej "drop" zastępuje elementy na liście!) + standard_item_flags = int(QtGui.QStandardItem().flags()) + self.new_flags = QtCore.Qt.ItemFlags(standard_item_flags - 8) + + self.checkPushButton.clicked.connect(self.check) + self.uncheckPushButton.clicked.connect(self.uncheck) + self.checkAllPushButton.clicked.connect(self.check_all) + self.uncheckAllPushButton.clicked.connect(self.uncheck_all) + + def check(self): + table = self.warstwy_table + sel_model = table.selectionModel() + model = table.model() + rows = sel_model.selectedRows() + for row in rows: + item = model.itemFromIndex(row) + item.setCheckState(QtCore.Qt.Checked) + + def uncheck(self): + table = self.warstwy_table + sel_model = table.selectionModel() + model = table.model() + rows = sel_model.selectedRows() + for row in rows: + item = model.itemFromIndex(row) + item.setCheckState(QtCore.Qt.Unchecked) + + def check_all(self): + table = self.warstwy_table + model = table.model() + for row in range(model.rowCount()): + item = model.itemFromIndex(model.index(row, 0)) + item.setCheckState(QtCore.Qt.Checked) + + def uncheck_all(self): + table = self.warstwy_table + model = table.model() + for row in range(model.rowCount()): + item = model.itemFromIndex(model.index(row, 0)) + item.setCheckState(QtCore.Qt.Unchecked) diff --git a/Kompozycje/nowa_kompozycja.ui b/Kompozycje/nowa_kompozycja.ui index 332652a..0b678fc 100644 --- a/Kompozycje/nowa_kompozycja.ui +++ b/Kompozycje/nowa_kompozycja.ui @@ -12,8 +12,8 @@ 0 0 - 1233 - 688 + 1210 + 678 @@ -46,10 +46,45 @@ * { -background-color: rgb(255, 255, 255); -font: 10pt "Segoe UI"; + background-color: rgb(255, 255, 255); + color: black; + font: 10pt "Segoe UI"; } - + + +QAbstractItemView +{ + alternate-background-color: #e7e7e7; + color: black; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 1px; +} + +QPushButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QToolButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QHeaderView::section +{ + background-color: #cfcfcf; + color: black; + padding-left: 4px; +} diff --git a/OrtoTools.py b/OrtoTools.py new file mode 100644 index 0000000..5fccd19 --- /dev/null +++ b/OrtoTools.py @@ -0,0 +1,161 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from qgis.PyQt.QtCore import QObject, pyqtSignal +from qgis.PyQt.QtWidgets import QToolButton, QMenu, QAction +from qgis.core import QgsProject, QgsRasterLayer, QgsMessageLog +from qgis.utils import iface +from .utils import WMS_SERVERS, WMS_SERVERS_GROUPS +from .CustomMessageBox import CustomMessageBox + + +class OrtoAddingTool(object): + def __init__(self, parent, button, group_names=("ORTOFOTOMAPA", "DANE DODATKOWE")): + self.parent = parent + self.button = button + self.group_names = group_names + self.layer_actions_dict = {} + + self.button.setToolTip("Dodaj zdefiniowane adresy WMS/WMTS") + self.button.setPopupMode(QToolButton.InstantPopup) + self.name_service = WMS_SERVERS + self.groups_for_names = WMS_SERVERS_GROUPS + self.services = [] + self.create_menu() + self.connect_ortofotomapa_group() + + def connect_ortofotomapa_group(self): + """ + Łączy sygnał wywoływany podczas zmiany widoczności w grupie o nazwie + self.group_name z funkcją self.create_menu. + """ + for group_name in self.group_names: + root = QgsProject.instance().layerTreeRoot() + group = root.findGroup(group_name) + if group: + group.visibilityChanged.connect(self.create_menu) + group.addedChildren.connect(self.create_menu) + group.removedChildren.connect(self.create_menu) + + def disconnect_ortofotomapa_group(self): + """ + Odłącza sygnał wywoływany podczas zmiany widoczności w grupie o nazwie + self.group_name z funkcją self.create_menu. + """ + for group_name in self.group_names: + group = QgsProject.instance().layerTreeRoot().findGroup( + group_name) + if group: + try: + group.visibilityChanged.disconnect(self.create_menu) + group.addedChildren.disconnect(self.create_menu) + group.removedChildren.disconnect(self.create_menu) + except Exception: + QgsMessageLog.logMessage( + 'Błąd przy rozłączaniu sygnałów z grup ' + 'warstw pomocniczych', + tag="GIAP Layout" + ) + + def action_clicked(self, item): + """ + Uaktualnia widoczność warstw na podstawie akcji z menu przycisku. + """ + layer_name = self.layer_name_dict[item] + if QgsProject.instance().mapLayersByName(layer_name): + try: + for layer, action in self.layer_actions_dict.items(): + if QgsProject.instance().layerTreeRoot().findLayer(layer): + QgsProject.instance().layerTreeRoot().findLayer( + layer).parent().setItemVisibilityChecked(True) + checked = action.isChecked() + QgsProject.instance().layerTreeRoot().findLayer( + layer).setItemVisibilityChecked(checked) + except RuntimeError: + item.setChecked(False) + else: + self.add_to_map(layer_name) + self.create_menu() + + def add_to_map(self, name): + if not QgsProject.instance().mapLayersByName(name): + url = self.name_service[name] + rlayer = QgsRasterLayer(url, name, 'wms') + root = QgsProject.instance().layerTreeRoot() + group_name = self.groups_for_names[name] + if rlayer.isValid(): + group = root.findGroup(group_name) + if not group: + root.addGroup(group_name) + group = root.findGroup(group_name) + QgsProject.instance().addMapLayer(rlayer) + node_layer = root.findLayer(rlayer.id()) + node_parent = node_layer.parent() + clone_node_layer = node_layer.clone() + group.insertChildNode(0, clone_node_layer) + clone_node_layer.setItemVisibilityCheckedParentRecursive(True) + node_parent.removeChildNode(node_layer) + else: + CustomMessageBox(None, f'Nie można dodać {name}').button_ok() + else: + CustomMessageBox(None, f'Istnieje już warstwa {name}').button_ok() + + def create_menu(self): + layers_names = [] + self.layer_name_dict = {} + self.layer_actions_dict = {} + menu = QMenu(self.parent) + for group_name in self.group_names: + group = QgsProject.instance().layerTreeRoot().findGroup(group_name) + if group: + for lr in group.findLayers(): + layer = lr.layer() + layers_names.append(layer.name()) + action = QAction(layer.name(), self.parent) + action.setCheckable(True) + layer_visible = iface.layerTreeView().layerTreeModel().rootGroup().findLayer(layer).itemVisibilityChecked() + action.setChecked(layer_visible) + action.triggered.connect( + lambda checked, item=action: self.action_clicked(item)) + self.layer_name_dict[action] = layer.name() + self.layer_actions_dict[layer] = action + values = list(self.layer_actions_dict.values()) + values.sort(key=lambda x: x.text()) + list(map(menu.addAction, values)) + + self.services = [] + + for name, service in self.name_service.items(): + if name not in layers_names: + action = QAction(name, self.parent) + action.setCheckable(True) + group_name = self.groups_for_names[name] + self.layer_name_dict[action] = name + self.services.append( + OrtoActionService( + action, + service, + name, + group_name, + parent=self + ) + ) + menu.addAction(action) + + self.button.setMenu(menu) + + +class OrtoActionService(QObject): + orto_added = pyqtSignal() + orto_group_added = pyqtSignal() + + def __init__(self, action, url, name, default_group="DANE DODATKOWE", parent=None): + QObject.__init__(self) + self.parent = parent + self.button = action + self.url = url + self.name = name + self.group_name = default_group + + self.button.triggered.connect( + lambda checked, item=self.button: self.parent.action_clicked(item)) diff --git a/StyleManager/stylemanager.py b/StyleManager/stylemanager.py new file mode 100644 index 0000000..993849f --- /dev/null +++ b/StyleManager/stylemanager.py @@ -0,0 +1,73 @@ +import os +from qgis.PyQt import uic +from qgis.PyQt.QtWidgets import QDialog, QFileDialog, QInputDialog, QMessageBox +from qgis.PyQt.QtCore import Qt, QCoreApplication + +FORM_CLASS, _ = uic.loadUiType(os.path.join( + os.path.dirname(__file__), 'ui_stylemanager.ui')) + + +class StyleManagerDialog(QDialog, FORM_CLASS): + def __init__(self, style_mn): + super(StyleManagerDialog, self).__init__() + + self.setupUi(self) + self.setWindowFlag(Qt.Window) + + self.mn = style_mn + + self.listWidget.blockSignals(True) + self.listWidget.addItems(self.mn.config.get_style_list()) + self.listWidget.blockSignals(False) + + # self.pushButton_add.clicked.connect(self.add_style) + # self.pushButton_delete.clicked.connect(self.delete_style) + self.pushButton_default.clicked.connect(self.set_default) + self.pushButton_activate.clicked.connect(self.change_style) + + def add_style(self): + """ add new style""" + filename, _ = QFileDialog.getOpenFileName( + self, "Open qss", '', "*.qss" + ) + text, ok = QInputDialog.getText( + self, 'Style Name', 'Enter name for Style:', + ) + + if ok: + if str(text) in ['', 'None', 'False']: + msg = QMessageBox() + msg.setText('Not valid name, try again') + msg.exec_() + return + self.mn.set_style(text, filename) + self.listWidget.addItem(text) + + def delete_style(self): + """ Delete selected style""" + try: + name = self.listWidget.selectedItems()[0].text() + except Exception: + return + + res = self.mn.remove_style(name) + if res: + self.listWidget.takeItem(self.listWidget.currentRow()) + + def set_default(self): + """Set default qgis style""" + res, msg = self.mn.activate_style('default') + + def change_style(self): + """Change style to user selected""" + + try: + name = self.listWidget.currentItem().text() + except Exception: + return + + res, msg = self.mn.activate_style(name) + + def hide(self): + """unload dialog""" + self.hide() diff --git a/StyleManager/ui_stylemanager.ui b/StyleManager/ui_stylemanager.ui new file mode 100644 index 0000000..cae78ba --- /dev/null +++ b/StyleManager/ui_stylemanager.ui @@ -0,0 +1,616 @@ + + + StyleSelectionDialog + + + true + + + + 0 + 0 + 558 + 403 + + + + + 1 + 1 + + + + + Segoe UI + 10 + 50 + false + false + + + + Style + + + + :/plugins/GIAP-giap_layout/icons/giap_logo.png:/plugins/GIAP-giap_layout/icons/giap_logo.png + + + * { + background-color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; +} + + +QAbstractItemView +{ + alternate-background-color: #e7e7e7; + color: black; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 1px; +} + +QPushButton { + color: black; + border: 1px solid black; + padding: 4px; +} + +QPushButton:disabled +{ + color: gray; +} + +QToolButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QHeaderView::section +{ + background-color: #cfcfcf; + color: black; + padding-left: 4px; +} + + + + + + false + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 120 + 0 + + + + + Segoe UI Light + 8 + 9 + false + false + + + + background-color: rgb(53, 85, 109); +font: 75 8pt "Segoe UI Light"; + + + + + 20 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + false + + + + 0 + 20 + + + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 53 + 85 + 109 + + + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 53 + 85 + 109 + + + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 53 + 85 + 109 + + + + + + + + QRadioButton::indicator::checked { + border: 2px solid black; + border-radius: 9px; + background-color: rgb(252, 67, 73); + width: 15px; + height: 15px; +} + +QRadioButton::indicator::unchecked { + border: 2px solid black; + border-radius: 9px; + background-color: rgb(255, 255, 255); + width: 15px; + height: 15px; +} + +QRadioButton { + color : white; + font-weight: bold; +} + + + Change style + + + true + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + verticalSpacer_3 + obszar_radio + + + + + + + Segoe UI + 10 + 50 + false + false + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 200 + 20 + + + + + 16777215 + 20 + + + + background-color: rgb(252, 67, 73); + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + 1 + 1 + 231 + 16 + + + + + Segoe UI + 10 + 75 + false + true + + + + color : white; font-weight: bold; + + + Change style + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + false + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + + + + + 6 + + + 6 + + + + + Activate + + + + + + + Default + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Segoe UI + 10 + 50 + false + false + + + + Cancel + + + + + + + + + + + pushButton_cancel + clicked() + StyleSelectionDialog + reject() + + + 710 + 419 + + + 461 + 408 + + + + + diff --git a/config.json b/config.json new file mode 100644 index 0000000..34d9dad --- /dev/null +++ b/config.json @@ -0,0 +1 @@ +[{"org_toolbars": ["mFileToolBar", "mLayerToolBar", "mDigitizeToolBar", "mMapNavToolBar", "mAttributesToolBar", "mPluginToolBar", "mLabelToolBar", "mSnappingToolBar", "mSelectionToolBar"], "styles": {"giap": "giap.qss", "wombat": "wombat.qss", "blueglass": "blueglass.qss", "coffee": "coffee.qss", "darbklue": "darkblue.qss", "darkorange": "darkorange.qss", "lightblue": "lightblue.qss"}, "ribbons_config": [{"tab_name": "Main", "sections": [{"label": "Project", "btn_size": 30, "btns": [["mActionNewProject", 0, 0], ["mActionOpenProject", 0, 1], ["mActionSaveProject", 1, 0], ["mActionSaveProjectAs", 1, 1]]}, {"label": "Prints", "btn_size": 30, "btns": [["mActionNewPrintLayout", 0, 0], ["giapMyPrints", 0, 1], ["mActionShowLayoutManager", 1, 0], ["giapQuickPrint", 1, 1]]}, {"label": "Navigation", "btn_size": 30, "btns": [["mActionPan", 0, 0], ["mActionZoomIn", 0, 1], ["mActionZoomOut", 0, 2], ["mActionZoomFullExtent", 0, 3], ["mActionZoomToLayer", 1, 0], ["mActionZoomToSelected", 1, 1], ["mActionZoomLast", 1, 2], ["mActionZoomNext", 1, 3]]}, {"label": "Attributes", "btn_size": 30, "btns": [["mActionIdentify", 0, 0], ["mActionSelectFeatures", 0, 1], ["mActionDeselectAll", 1, 0], ["mActionOpenTable", 1, 1]]}, {"label": "Measures", "btn_size": 60, "btns": [["mActionMeasure", 0, 0], ["mActionMeasureArea", 0, 1], ["mActionMeasureAngle", 0, 2]]}, {"label": "Layers", "btn_size": 30, "btns": [["mActionAddOgrLayer", 0, 0], ["mActionAddWmsLayer", 0, 1], ["mActionAddPgLayer", 0, 2], ["mActionAddMeshLayer", 0, 3], ["mActionAddWcsLayer", 0, 4], ["mActionAddDelimitedText", 0, 5], ["mActionAddRasterLayer", 1, 0], ["mActionAddWfsLayer", 1, 1], ["mActionAddSpatiaLiteLayer", 1, 2], ["mActionAddVirtualLayer", 1, 3], ["mActionNewMemoryLayer", 1, 4]]}]}, {"tab_name": "Tools", "sections": [{"label": "Adv. Attributes", "btn_size": 30, "btns": [["mActionIdentify", 0, 0], ["mActionSelectFeatures", 0, 1], ["mActionSelectPolygon", 0, 2], ["mActionSelectByExpression", 0, 3], ["mActionInvertSelection", 0, 4], ["mActionDeselectAll", 0, 5], ["mActionOpenTable", 1, 0], ["mActionStatisticalSummary", 1, 1], ["mActionOpenFieldCalc", 1, 2], ["mActionMapTips", 1, 3], ["mActionNewBookmark", 1, 4], ["mActionShowBookmarks", 1, 5]]}, {"label": "Labels", "btn_size": 30, "btns": [["mActionLabeling", 0, 0], ["mActionChangeLabelProperties", 0, 1], ["mActionPinLabels", 0, 2], ["mActionShowPinnedLabels", 0, 3], ["mActionShowHideLabels", 0, 4], ["mActionMoveLabel", 1, 0], ["mActionRotateLabel", 1, 1], ["mActionDiagramProperties", 1, 2], ["mActionShowUnplacedLabels", 1, 3]]}, {"label": "Vector", "btn_size": 30, "btns": [["mActionToggleEditing", 0, 0], ["mActionSaveLayerEdits", 0, 1], ["mActionVertexTool", 0, 2], ["mActionUndo", 0, 3], ["mActionRedo", 0, 4], ["mActionAddFeature", 1, 0], ["mActionMoveFeature", 1, 1], ["mActionDeleteSelected", 1, 2], ["mActionCutFeatures", 1, 3], ["mActionCopyFeatures", 1, 4], ["mActionPasteFeatures", 1, 5]]}, {"label": "Digitalization", "btn_size": 30, "btns": [["EnableSnappingAction", 0, 0], ["EnableTracingAction", 0, 1], ["mActionRotateFeature", 0, 2], ["mActionSimplifyFeature", 0, 3], ["mActionAddRing", 0, 4], ["mActionAddPart", 0, 5], ["mActionFillRing", 0, 6], ["mActionOffsetCurve", 0, 7], ["mActionCircularStringCurvePoint", 0, 8], ["mActionDeleteRing", 1, 0], ["mActionDeletePart", 1, 1], ["mActionReshapeFeatures", 1, 2], ["mActionSplitParts", 1, 3], ["mActionSplitFeatures", 1, 4], ["mActionMergeFeatureAttributes", 1, 5], ["mActionMergeFeatures", 1, 6], ["mActionReverseLine", 1, 7], ["mActionTrimExtendFeature", 1, 8]]}]}], "active_style": "giap"}] \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..48c9c69 --- /dev/null +++ b/config.py @@ -0,0 +1,167 @@ +import os +import json + + +class Config: + def __init__(self): + """Constructor""" + # load config from file + self.conf_dir = os.path.dirname(__file__) + fl = open(os.path.join(self.conf_dir, 'config.json'), 'r') + conf = fl.read() + fl.close() + self.setts = json.loads(conf)[0] + + def save_config(self): + """ + Saves config to json file + """ + + save_file = open(os.path.join(self.conf_dir, 'config.json'), 'w') + json.dump([self.setts], save_file) + save_file.close() + + def save_original_toolbars(self, tbrs): + """ Save toolbars to reinstitute them after unload + :tbrs: [str, str, str] + """ + # save only if don't have anything in storage + if 'org_toolbars' in self.setts: + # if we have something in storage, dont change it + if len(self.setts['org_toolbars']) > 0: + return + + self.setts['org_toolbars'] = tbrs + self.save_config() + + def save_user_ribbon_setup(self, val): + """ Saves user setup to config qgis file + {'ribbons': { + 'tab_name': 'name', + 'sections': [ + { + 'label': 'lab_name', + 'btn_size': 30, + 'btns': [ + [action, row, col], + ], ... + } + ], + }, ... }, + 'fast_access': [ action, action, ... ] + } + """ + if not isinstance(val, list): + return False + + self.setts['ribbons_config'] = val + self.save_config() + + def load_user_ribbon_setup(self): + if 'ribbons_config' not in self.setts: + return False + + lay = self.setts['ribbons_config'] + if not lay: + return False + + return self.setts['ribbons_config'] + + def get_original_toolbars(self): + """ Return list of objectnames toolbars originally opened before first + run + :return: [str, str, str] + """ + try: + org_tbrs = self.setts['org_toolbars'] + if 'GiapToolBar' in org_tbrs: # insurance + org_tbrs.remove('GiapToolBar') + except Exception: + # something goes wrong, we don't have previous version of user + # layout in this case, recover main toolbars + org_tbrs = [] + + if len(org_tbrs) == 0: + org_tbrs = [ + 'mFileToolBar', + 'mLayerToolBar', + 'mDigitizeToolBar', + 'mMapNavToolBar', + 'mAttributesToolBar', + 'mPluginToolBar', + 'mLabelToolBar', + 'mSnappingToolBar', + 'mSelectionToolBar', + ] + return org_tbrs + + def set_value(self, key, val): + """ Sets value under key in settings, value if exists will be + overwritten + :key: str + :val: object + """ + self.setts[key] = val + self.save_config() + + def get_value(self, key): + """read value saved in config + :key: str (full path ie 'giap/test') + """ + return self.setts[key] + + def delete_value(self, key): + """delete key from config + :key: str + """ + try: + del self.setts[key] + except Exception: + pass + + def get_style_path(self, style): + """ read path o style from config + :return: str + """ + + try: + return self.setts['styles'][style] + except KeyError: + return '' + + def get_style_list(self): + """ return list of available styles + :return: list + """ + try: + return list(self.setts['styles'].keys()) + except Exception: + return [] + + def get_active_style(self): + """ return name of active style from settings + :return: str + """ + try: + return self.setts['active_style'] + except KeyError: + return '' + + def set_style(self, style, path): + """ Set style in config, for user to choose it + :style: style name + :path: style name (style.qss) + """ + self.setts['styles'][style] = path + + def set_active_style(self, style): + """ + set name of active style in config + """ + self.setts['active_style'] = style + self.save_config() + + def remove_style(self, style): + if style in self.setts['style']: + del self.setts['style'][style] + self.save_config() diff --git a/giap.ico b/giap.ico new file mode 100644 index 0000000..0fe5aaf Binary files /dev/null and b/giap.ico differ diff --git a/giap_dynamic_layout.py b/giap_dynamic_layout.py new file mode 100644 index 0000000..766cc8b --- /dev/null +++ b/giap_dynamic_layout.py @@ -0,0 +1,814 @@ +import os + +from qgis.PyQt.QtCore import Qt, QSize, QEvent, pyqtSignal, QMimeData, QRect +from qgis.PyQt import uic +from qgis.PyQt.QtGui import QDrag, QPainter, QPixmap, QCursor +from qgis.PyQt.QtWidgets import QWidget, QApplication, QHBoxLayout,\ + QFrame, QLabel, QPushButton, QTabBar, QToolButton, QVBoxLayout, \ + QGridLayout, QSpacerItem, QLineEdit, QWidgetItem, QAction, \ + QBoxLayout + +from .utils import STANDARD_TOOLS + +from .select_section import SelectSection +FORM_CLASS, _ = uic.loadUiType(os.path.join( + os.path.dirname(__file__), 'giap_dynamic_layout.ui')) + + +class Widget(QWidget, FORM_CLASS): + editChanged = pyqtSignal(bool) + printsAdded = pyqtSignal() + deletePressSignal = pyqtSignal() + + def __init__(self, parent=None): + super(Widget, self).__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + + self.setupUi(self) + self.parent = parent # mainWindow() + self.tabs = [] # list w tabwidgets + self.edit_session = False + + self.custom_tabbar = CustomTabBar('New Tab', self.tabWidget) + self.tabWidget.setTabBar(self.custom_tabbar) + self.tabWidget.tabBar().tabBarClicked.connect(self.tab_clicked) + self.tabWidget.tabBar().tabBarDoubleClicked.connect( + self.tab_doubleclicked) + + def add_tab(self, label=None): + """Adds new tab at the end + :return: tab widget + """ + if not label: + label = 'New Tab' + + tab = CustomTab(label, self.tabWidget) + self.tabs.append(tab) + + # prevent flickering + self.tabWidget.setUpdatesEnabled(False) + + tab_ind = self.tabWidget.insertTab( + self.tabWidget.count()-1, tab, label + ) + if self.edit_session: + self._section_control(tab_ind) + + self.tabWidget.setCurrentIndex(tab_ind) + + # add button to delete, its edit session so should be visible + right = self.tabWidget.tabBar().RightSide + cbutton = QToolButton(self.tabWidget) + cbutton.setObjectName('giapCloseTab') + cbutton.setText('x') + cbutton.setMinimumSize(QSize(16, 16)) + cbutton.setMaximumSize(QSize(16, 16)) + + self.tabWidget.tabBar().setTabButton(tab_ind, right, cbutton) + cbutton.clicked.connect(lambda: self.remove_tab(tab_ind)) + self.tabWidget.setUpdatesEnabled(True) + + return tab_ind, tab + + def remove_tab(self, tind): + """Removes tab with given tab index""" + + self.tabWidget.removeTab(tind) + if tind > 0: + self.tabWidget.setCurrentIndex(tind-1) + + def add_section(self, itab, lab, size=30): + """Adds new section on tab with label and place for icons + :itab: int + :lab: label for section + :size: int size of button + :return: section widget + """ + if itab > -1: + itab = self.tabWidget.currentIndex() + + cwidget = self.tabWidget.widget(itab) + if str(lab) in ['', 'False', 'None']: + lab = 'New section' + section = CustomSection(str(lab), self.tabWidget) + section.installEventFilter(self) + if size > 30: + section.set_size(size) + + self._section_control_remove(itab) + cwidget.lay.addWidget(section) + + # sep = QFrame() + # sep.setFrameShape(QFrame.VLine) + # sep.setFrameShadow(QFrame.Raised) + # sep.setObjectName('giapLine') + # sep.setMinimumSize(QSize(6, 100)) + # cwidget.lay.addWidget(sep) + self._section_control(itab) + + return section + + def edit_session_toggle(self): + """Show controls for edti session""" + + self.edit_session = not self.edit_session + self.editChanged.emit(self.edit_session) + self._tab_controls() + + def _tab_controls(self): + """ show tab controls""" + right = self.tabWidget.tabBar().RightSide + + if self.edit_session: + for i in range(self.tabWidget.count()): + self.tabWidget.tabBar().tabButton(i, right).show() + self._section_control(i) + self._new_tab_tab_control() # show add tab option + else: + self._new_tab_tab_control() # hide add tab option + for i in range(self.tabWidget.count()): + self.tabWidget.tabBar().tabButton(i, right).hide() + self._section_control(i) + + def _section_control(self, tabind): + """add buttons to every tab for adding new section""" + if self.edit_session: + self.frm = QFrame() + self.frm.setObjectName('giapSectionAdd') + self.frmlay = QVBoxLayout(self.frm) + + self.secadd = CustomSectionAdd() + + self.secadd.clicked.connect(self.add_user_selected_section) + self.frmlay.addWidget(self.secadd) + + lay = self.tabWidget.widget(tabind).lay + cnt = lay.count() + # there should always be something in layout, (controls) + + for i in range(cnt, -1, -1): + if isinstance(lay.itemAt(i), QSpacerItem): + lay.removeItem(lay.itemAt(i)) + + self.tabWidget.widget(tabind).lay.addWidget(self.frm) + self.tabWidget.widget(tabind).lay.addStretch() + + else: + self.tabWidget.widget(tabind).setUpdatesEnabled(False) + self._section_control_remove(tabind) + self.tabWidget.widget(tabind).lay.addStretch() + self.tabWidget.widget(tabind).setUpdatesEnabled(True) + + def add_user_selected_section(self): + """Show dialog to user and adds selected section to current ribbon + if there should be more cutom tools, here is the place to put them + """ + self.dlg = SelectSection() + responce = self.dlg.exec_() + + if not responce: + return + + ind = self.tabWidget.currentIndex() + # selected tools + selected = [x.text() for x in self.dlg.toolList.selectedItems()] + self.tabWidget.setUpdatesEnabled(False) + for sel in selected: + + secdef = [x for x in STANDARD_TOOLS if x['label'] == sel][0] + sec = self.add_section(ind, sel, secdef['btn_size']) + for btn in secdef['btns']: + child = self.parent.findChild(QAction, btn[0]) + if child is None: + sec.add_action(*btn) + else: + sec.add_action(child, *btn[1:]) + + if sel == 'Prints': + self.printsAdded.emit() + + self.tabWidget.setUpdatesEnabled(True) + + def _section_control_remove(self, tabind): + lay = self.tabWidget.widget(tabind).lay + self.tabWidget.setUpdatesEnabled(False) + for ind in range(lay.count()-1, -1, -1): + if isinstance(lay.itemAt(ind), QSpacerItem): + lay.removeItem(lay.itemAt(ind)) + continue + it = lay.itemAt(ind) + if it.widget() is not None: + if it.widget().objectName() == 'giapSectionAdd': + it.widget().hide() + lay.removeItem(it) + QApplication.processEvents() + self.tabWidget.setUpdatesEnabled(True) + + def _new_tab_tab_control(self): + """Pseudo tab to control adding fully feature tab""" + + self.tabWidget.setUpdatesEnabled(False) + if self.edit_session: + tab = QWidget() + tab.setObjectName('giapAddNewTabControl') + self.tabWidget.addTab(tab, '+') + else: + last_tab = self.tabWidget.tabBar().count() - 1 + if self.tabWidget.widget(last_tab).objectName() == \ + 'giapAddNewTabControl': + self.tabWidget.removeTab(last_tab) + self.tabWidget.setUpdatesEnabled(True) + + def tab_doubleclicked(self, ind): + if not self.edit_session: + return + self.tabWidget.tabBar().editTab(ind) + + def tab_clicked(self, ind): + if self.edit_session: + if ind == self.tabWidget.tabBar().count() - 1: + self.add_tab() + + def eventFilter(self, watched, ev): + # turn off dragging while not in edit session + if isinstance(watched, CustomSection) and not self.edit_session: + if ev.type() == QEvent.MouseMove: + return True + return super().eventFilter(watched, ev) + + def keyPressEvent(self, e): + if self.edit_session: + self.deletePressSignal.emit() + + def generate_ribbon_config(self): + """ return ribbon setup to save in user config + (for detail structure look in config file) + return: list + """ + riblist = [] + active_ind = self.tabWidget.currentIndex() + for ind in range(self.tabWidget.count()): + self.tabWidget.setCurrentIndex(ind) + wid = self.tabWidget.widget(ind) + if not isinstance(wid, CustomTab): + continue + tdict = wid.return_tab_config() + tdict['tab_name'] = self.tabWidget.tabText(ind) + riblist.append(tdict) + self.tabWidget.setCurrentIndex(active_ind) + return riblist + + +class CustomTabBar(QTabBar): + def __init__(self, label='New Tab', parent=None): + super().__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + + self._editor = QLineEdit(self) + self._editor.setWindowFlags(Qt.Popup) + self._editor.setFocusProxy(self) + self._editor.editingFinished.connect(self.handleEditingFinished) + self._editor.installEventFilter(self) + self.tabBarDoubleClicked.connect(self.editTab) + + def eventFilter(self, widget, event): + if ((event.type() == QEvent.MouseButtonPress and + not self._editor.geometry().contains(event.globalPos())) or + (event.type() == QEvent.KeyPress and + event.key() == Qt.Key_Escape)): + self._editor.hide() + return super().eventFilter(widget, event) + + def editTab(self, index): + rect = self.parent().tabBar().tabRect(index) + self._editor.setFixedSize(rect.size()) + self._editor.move(self.parent().mapToGlobal(rect.topLeft())) + self._editor.setText(self.parent().tabText(index)) + if not self._editor.isVisible(): + self._editor.show() + + def handleEditingFinished(self): + index = self.parent().currentIndex() + if index >= 0: + self._editor.hide() + self.parent().setTabText(index, self._editor.text()) + + +class CustomTab(QWidget): + def __init__(self, lab, parent=None): + super(CustomTab, self).__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + + self.lab = lab + self.lay = QHBoxLayout() + self.lay.setSpacing(2) + self.lay.setMargin(0) + self.lay.setContentsMargins(1, 1, 1, 1) + self.setLayout(self.lay) + self.setObjectName('giapTab') + + self.lay.addStretch() + self.lay.setDirection(QBoxLayout.LeftToRight) + + self.setAcceptDrops(True) + + def dragEnterEvent(self, e): + e.accept() + + def dragMoveEvent(self, e): + e.accept() + + def dropEvent(self, e): + # accept only Custom Sections + if not isinstance(e.source(), CustomSection): + return True + + try: + lay = e.source().parent().lay + except AttributeError: + return True + + source = None + for i in range(lay.count()): + if not isinstance(lay.itemAt(i).widget(), CustomSection): + continue + + it = lay.itemAt(i) + if it.widget() is e.source(): + source = i + break + + if source is None: + return True + lay.takeAt(lay.count()-1) + addsec = lay.takeAt(lay.count()-1) + item = lay.takeAt(i) + lay.addItem(item) + lay.addItem(addsec) + lay.addStretch() + e.setAccepted(True) + + def return_tab_config(self): + """Returns config for current tab with all sections, + (description in config file) + :return: dict + """ + sec_conf = [] + for ind in range(self.lay.count()): + it = self.lay.itemAt(ind) + if it is None: + continue + wid = it.widget() + if not isinstance(wid, CustomSection): + continue + if wid.isVisible(): + sec_conf.append(wid.return_section_config()) + + return { + 'tab_name': self.lab, + 'sections': sec_conf, + } + + +class CustomSection(QWidget): + def __init__(self, name='New Section', parent=None): + super(CustomSection, self).__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + self.edit = True + self.setAcceptDrops(True) + self.setMaximumSize(QSize(99999, 100)) + self.setMinimumSize(QSize(60, 100)) + + if parent is not None: + parent.parent().editChanged.connect(self.edit_toggle) + parent.parent().deletePressSignal.connect(self.key_pressed) + + self.setObjectName('giapSection') + + # target of drop + self.target = None + + self.verticalLayout = QVBoxLayout() + self.verticalLayout.setSpacing(5) + self.verticalLayout.setMargin(3) + self.verticalLayout.setContentsMargins(5, 0, 5, 0) + self.button_size = 30 + + self.horizontalLayout_2 = QHBoxLayout() + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.horizontalLayout_2.setSpacing(0) + + self.clabel = CustomLabel(name, self) + self.clabel.setObjectName(u"giapSectionLabel") + self.clabel.setMaximumSize(QSize(100000, 25)) + self.clabel.setMinimumSize(QSize(50, 25)) + + self.pushButton_close_sec = QPushButton(self) + self.pushButton_close_sec.setObjectName(u"giapSectionClose") + self.pushButton_close_sec.setText('x') + self.pushButton_close_sec.setStyleSheet( + 'border-radius: 3px; font: 7pt;' + ) + self.pushButton_close_sec.show() + self.pushButton_close_sec.setMaximumSize(QSize(18, 18)) + + self.horizontalLayout_2.addWidget(self.clabel) + self.horizontalLayout_2.addWidget(self.pushButton_close_sec) + self.verticalLayout.addLayout(self.horizontalLayout_2) + + self.gridLayout = QGridLayout() + self.gridLayout.setSpacing(4) + self.gridLayout.setObjectName(u"gridLayout") + + self.verticalLayout.addLayout(self.gridLayout) + + self.update() + + self.setLayout(self.verticalLayout) + self.pushButton_close_sec.clicked.connect(self.unload) + + def unload(self): + self.hide() + self.deleteLater() + QApplication.processEvents() + + def return_section_config(self): + """return config for current section + :return: {} + """ + blist = [] + for row in range(self.gridLayout.rowCount()): + for col in range(self.gridLayout.columnCount()): + it = self.gridLayout.itemAtPosition(row, col) + if it is None: + continue + itw = it.widget() + ind = self.gridLayout.indexOf(itw) + wid = self.gridLayout.itemAt(ind).widget() + if wid.objectName()[:4].lower() == 'giap': + act = wid.objectName() + else: + act = wid.actions()[0].objectName() + blist.append([act, row, col]) + + return { + 'label': self.clabel.text(), + 'btn_size': self.button_size, + 'btns': blist, + } + + def edit_toggle(self, state): + if state: + self.show_edit_options() + else: + self.hide_edit_options() + + def key_pressed(self): + """user pressed delete, and we are in edit session""" + if not self.edit: + return + + # remove selected buttons + for col in range(self.gridLayout.columnCount()): + for row in [0, 1]: + it = self.gridLayout.itemAtPosition(row, col) + if it is None: + continue + if not it.widget().selected: + continue + + ind = self.gridLayout.indexOf(it) + wid = self.gridLayout.takeAt(ind) + wid.widget().turn_off_edit() + wid.widget().deleteLater() + + self.clean_grid_layout() + + def clean_grid_layout(self): + """ move all icons to left, after some where deleted""" + items = [[], []] # both rows + for col in range(self.gridLayout.columnCount()): + for row in [0, 1]: + itl = self.gridLayout.itemAtPosition(row, col) + if itl is None: + continue + it = itl.widget() + ind = self.gridLayout.indexOf(it) + it = self.gridLayout.takeAt(ind) + if it is not None: + items[row].append(it) + + for irow, row in enumerate(items): + for icol, it in enumerate(row): + if isinstance(it, QWidgetItem): + self.gridLayout.addItem(it, irow, icol, 1, 1) + else: + self.gridLayout.addWidget(it, irow, icol, 1, 1) + self.gridLayout.update() + # self.gridLayoutWidget.adjustSize() + + def add_action(self, action, row, col): + self.tbut = CustomToolButton(self) + if isinstance(action, QAction): + self.tbut.setObjectName('gp_'+action.objectName()) + self.tbut.setDefaultAction(action) + self.tbut.org_state = action.isEnabled() + elif isinstance(action, str): + self.tbut.setObjectName(action) + + self.tbut.setMaximumSize(QSize(self.button_size, self.button_size)) + self.tbut.setMinimumSize(QSize(self.button_size, self.button_size)) + if self.button_size > 45: + self.tbut.setIconSize( + QSize(self.button_size-15, self.button_size-15) + ) + self.tbut.setEnabled(True) + self.tbut.installEventFilter(self) + + self.gridLayout.addWidget(self.tbut, row, col, 1, 1) + + return self.tbut + + def change_label(self, lab): + """Changes label + :lab: str + """ + if isinstance(lab, str) and lab not in ['', 'None', 'False']: + self.label.setText(lab) + + def set_size(self, sz): + """change size of button + :sz: int + """ + self.button_size = sz + + def _get_items(self): + """return list with item stored in gridlayout + :return: [[tool, tool], [tool, tool]] + """ + items = [[], []] # both rows + for col in range(self.gridLayout.columnCount()): + for row in [0, 1]: + it = self.gridLayout.itemAtPosition(row, col) + if it is not None: + items[row].append(it.widget()) + return items + + def get_toolbutton_layout_index_from_pos(self, pos): + for i in range(self.gridLayout.count()): + rect = self.gridLayout.itemAt(i).widget() + # recalculate rect to compatible coord system + rect_ok = QRect(0, 0, rect.width(), rect.height()) + if rect_ok.contains(rect.mapFromGlobal(pos)) and \ + i != self.target: + return i + + def eventFilter(self, watched, event): + if event.type() == QEvent.MouseButtonPress: + self.mousePressEvent(event) + elif event.type() == QEvent.MouseMove and \ + isinstance(watched, CustomSection): + self.mouseMoveEvent(event) + elif event.type() == QEvent.MouseButtonRelease: + self.mouseReleaseEvent(event) + + # prevent default action from qtoolbutton + if isinstance(watched, CustomToolButton) and self.edit: + if event.type() == QEvent.MouseButtonPress: + watched.setDown(False) + + return super().eventFilter(watched, event) + + def mouseReleaseEvent(self, event): + event.accept() + + def mouseMoveEvent(self, e): + print('mouse event') + if not self.edit: + return + + drag = QDrag(self) + drag.setDragCursor(QPixmap("images/drag.png"), Qt.MoveAction) + mimedata = QMimeData() + + pixmap = QPixmap(self.size()) # Get the size of the object + painter = QPainter(pixmap) # Set the painter’s pixmap + painter.drawPixmap(self.rect(), self.grab()) + painter.end() + + drag.setMimeData(mimedata) + drag.setHotSpot(e.pos()) + drag.setPixmap(pixmap) + drag.exec_(Qt.MoveAction) + e.accept() + + def dragEnterEvent(self, event): + event.accept() + + def dropEvent(self, event): # noqa + gpos = QCursor().pos() + + if isinstance(event.source(), CustomToolButton): + # check if source and target are in the same gridlayout + if event.source().parent() is not self: + return + + # swap toolbuttons + # get origin button + source = self.get_toolbutton_layout_index_from_pos(gpos) + glay = event.source().parent().gridLayout + self.target = None + for i in range(glay.count()): + it = glay.itemAt(i) + if it.widget() is event.source(): + self.target = i + break + + if source == self.target: + return + + if None not in [source, self.target]: + # swap qtoolbuttons + i, j = max(self.target, source), min(self.target, source) + p1 = self.gridLayout.getItemPosition(i) + p2 = self.gridLayout.getItemPosition(j) + it1 = self.gridLayout.takeAt(i) + it2 = self.gridLayout.takeAt(j) + it1.widget().setDown(False) + it2.widget().setDown(False) + self.gridLayout.addItem(it1, *p2) + self.gridLayout.addItem(it2, *p1) + + if isinstance(event.source(), CustomSection): + lay = self.parent().lay + + target = None + source = None + for i in range(lay.count()): + if not isinstance(lay.itemAt(i).widget(), CustomSection): + continue + + it = lay.itemAt(i) + if it.widget() is event.source(): + source = i + if it.widget().geometry().contains( + it.widget().parent().mapFromGlobal(gpos)): + target = i + + if source == target or None in [source, target]: + return + + item = lay.takeAt(source) + if target > source: + target -= 1 + + it_list = [] + for i in range(lay.count()-1, target-1, -1): + it_list.append(lay.takeAt(i)) + it_list.reverse() + lay.addItem(item) + for it in it_list: + lay.addItem(it) + self.target = target + + def show_edit_options(self): + self.pushButton_close_sec.show() + self.edit = True + self.clean_grid_layout() + itms = self._get_items() + for row in [0, 1]: + for it in itms[row]: + it.turn_on_edit() + it.edit = True + + def hide_edit_options(self): + self.pushButton_close_sec.hide() + self.edit = False + self.clean_grid_layout() + itms = self._get_items() + for row in [0, 1]: + for it in itms[row]: + it.turn_off_edit() + + +class CustomToolButton(QToolButton): + def __init__(self, parent): + super(CustomToolButton, self).__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + self.edit = True + self.selected = False + self.selected_style = '*{border: 3px solid red}' + self.org_state = True # True - enabled for click outside edit sesion + + def eventFilter(self, widget, event): + if event.type() == QEvent.MouseButtonRelease and self.edit: + return True + if self.edit and event.type() == QEvent.MouseButtonPress: + if event.button() == Qt.LeftButton: + return True + return super().eventFilter(widget, event) + + def turn_on_edit(self): + """ toggle standard behaviour, from clicking to select""" + self.org_state = self.isEnabled() + self.setEnabled(True) + self.blockSignals(True) + self.setDown(False) + + def turn_off_edit(self): + """ toggle standard behaviour, from clicking to select""" + self.setStyleSheet('') + self.selected = False + self.setEnabled(self.org_state) + self.blockSignals(False) + self.edit = False + + def mouseClickEvent(self, event): + if self.edit: + event.accept() + event.source.setDown(False) + else: + super(CustomToolButton, self).mouseClickEvent(event) + + def mouseDoubleClickEvent(self, event): + if self.edit: + if self.selected: + self.selected = False + self.setStyleSheet('') + else: + self.setStyleSheet(self.selected_style) + self.selected = True + + def mouseMoveEvent(self, e): + if not self.edit: + return + drag = QDrag(self) + drag.setDragCursor(QPixmap("images/drag.png"), Qt.MoveAction) + mimedata = QMimeData() + + pixmap = QPixmap(self.size()) # Get the size of the object + painter = QPainter(pixmap) # Set the painter’s pixmap + painter.drawPixmap(self.rect(), self.grab()) + painter.end() + + drag.setMimeData(mimedata) + drag.setPixmap(pixmap) + drag.setHotSpot(e.pos()) + drag.exec_(Qt.MoveAction) + + def mousePressEvent(self, event): + if self.edit: + event.accept() + self.setDown(False) + return + else: + super(CustomToolButton, self).mousePressEvent(event) + + def dragEnterEvent(self, event): + event.accept() + + +class CustomSectionAdd(QToolButton): + def __init__(self, parent=None): + super(CustomSectionAdd, self).__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + self.setObjectName('giapSectionAddButton') + self.setMinimumSize(QSize(30, 30)) + self.setMaximumSize(QSize(30, 30)) + self.setText('+') + + self.button_size = 30 + + def bigButtons(self): + """Set size of tools button to big""" + self.button_size = 60 + + +class CustomLabel(QLabel): + def __init__(self, lab, parent=None): + super(CustomLabel, self).__init__(parent) + self.setAttribute(Qt.WA_DeleteOnClose) + self.setText(lab) + self.setStyleSheet( + 'font: 9pt "Segoe UI"; font-weight: bold; ' + ) + self.cinput = QLineEdit(self) + self.cinput.setWindowFlags(Qt.Popup) + self.cinput.setFocusProxy(self) + self.cinput.editingFinished.connect(self.handleEditingFinished) + self.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) + + def mousePressEvent(self, event): + if not self.parent().edit: + return + + rect = self.rect() + self.cinput.setFixedSize(rect.size()) + self.cinput.move(self.mapToGlobal(rect.topLeft())) + self.cinput.setText(self.text()) + if not self.cinput.isVisible(): + self.cinput.show() + + def handleEditingFinished(self): + self.cinput.hide() + self.setText(self.cinput.text()) diff --git a/giap_dynamic_layout.ui b/giap_dynamic_layout.ui new file mode 100644 index 0000000..36dee82 --- /dev/null +++ b/giap_dynamic_layout.ui @@ -0,0 +1,154 @@ + + + Form + + + + 0 + 0 + 1291 + 167 + + + + + 1291 + 167 + + + + + 1291000 + 178 + + + + Form + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 140 + + + + + 16777215 + 140 + + + + + + + + + + + -1 + + + + + + + 0 + + + + + + 60 + 20 + + + + + 90 + 20 + + + + Layers + + + true + + + true + + + + + + + + 70 + 0 + + + + + 16777215 + 20 + + + + orto + + + + + + + + 16777215 + 20 + + + + Compositions + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff --git a/giap_layout.py b/giap_layout.py index 0818f8e..4989638 100644 --- a/giap_layout.py +++ b/giap_layout.py @@ -1,22 +1,34 @@ # -*- coding: utf-8 -*- -import qgis -from PIL import Image -from qgis.PyQt.QtCore import QSettings, QTranslator, QCoreApplication, QSize, \ - Qt, QRect, QPropertyAnimation, QEasingCurve -from qgis.PyQt.QtGui import QIcon, QPixmap +import os.path + +from qgis.PyQt.QtCore import QTranslator, QCoreApplication, QSize, \ + Qt, QRect, QPropertyAnimation, QEasingCurve, QEvent +from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QAction, QToolBar, QToolButton, QWidget, \ - QHBoxLayout, QStyleFactory, QDockWidget, QMenu + QHBoxLayout, QDockWidget, QMenu, QVBoxLayout # Initialize Qt resources from file resources.py -from qgis._core import QgsProject +from qgis._core import QgsProject, Qgis from .QuickPrint import PrintMapTool -from .utils import OBJECT_ACTION_DICT -from .resources import * + +from .Kompozycje.Kompozycje import CompositionsTool +from .kompozycje_widget import kompozycjeWidget +# from .resources import * # Import the code for the dialog -from .giap_layout_dialog import MainTabQgsWidgetDialog -import os.path +# from .giap_layout_dialog import MainTabQgsWidgetDialog +from .config import Config +from .tools import StyleManager + +from .StyleManager.stylemanager import StyleManagerDialog +from .OrtoTools import OrtoAddingTool + +from .giap_dynamic_layout import Widget +from .ribbon_config import RIBBON_DEFAULT + project = QgsProject.instance() + + class MainTabQgsWidget: """QGIS Plugin Implementation.""" @@ -33,7 +45,19 @@ def __init__(self, iface): # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) # initialize locale - self.main_widget = MainTabQgsWidgetDialog() + self.main_widget = Widget(self.iface.mainWindow()) + self.kompozycje_widget = kompozycjeWidget() + + # list with hidden left docs, to reinstitute on user click + self.left_docks = [] + # setup config structure for maintainning, toolbar and user interface + # customization + self.config = Config() + + # initialize StyleManager for styling handling + self.style_manager = StyleManager(self) + + self.iface.projectRead.connect(self.projekt_wczytany) def initGui(self): style = self.main_widget.styleSheet() @@ -42,32 +66,38 @@ def initGui(self): height: 25px; } """) - self.iface.mainWindow().menuBar().hide() - for child in self.iface.mainWindow().children(): - if type(child) == QToolBar: - child.hide() - # Zaawansowana digitalizacja - if child.objectName() == 'mSnappingToolBar': - for child2 in child.children(): - if isinstance(child2, QToolButton) and \ - child2.defaultAction() and \ - child2.defaultAction().objectName() == 'EnableTracingAction': - self.main_widget.btn_dig_2.setDefaultAction(child2.defaultAction()) - child2.defaultAction().menu().setStyleSheet(style + """ - QMenu { - background-color: rgb(53, 85, 109); - color: rgb(255, 255, 255); - font: 10pt "Segoe UI"; - } - """) - - for dlg_object, standard_tool in OBJECT_ACTION_DICT.items(): - if child.objectName() == standard_tool: - self.main_widget.__getattribute__(dlg_object).setDefaultAction(child) - - - if child.objectName() == 'Layers': - child.hide() + self.save_default_user_layout() + self.style_manager.run_last_style() + + self.kompozycje = CompositionsTool(self.iface, self) + + # turn on ribbon editing + self.main_widget.edit_session_toggle() + + ribbon_conf = self.config.load_user_ribbon_setup() + if not ribbon_conf: + ribbon_conf = RIBBON_DEFAULT + + for dtab in ribbon_conf: + itab, tab = self.main_widget.add_tab(dtab['tab_name']) + for dsec in dtab['sections']: + sec = self.main_widget.add_section( + itab, dsec['label'], dsec['btn_size'] + ) + for btn in dsec['btns']: + child = self.iface.mainWindow().findChild(QAction, btn[0]) + if child is None: + sec.add_action(*btn) + else: + sec.add_action(child, *btn[1:]) + + if dsec['label'] == 'Prints': + self.custom_prints() + + self.setup_orto() + self.main_widget.tabWidget.setCurrentIndex(0) + # turn off ribbon editing + self.main_widget.edit_session_toggle() self.toolbar = QToolBar('GiapToolBar', self.iface.mainWindow()) self.toolbar.setObjectName('GiapToolBar') @@ -75,161 +105,302 @@ def initGui(self): self.toolbar.setMovable(False) self.toolbar.setFloatable(False) self.toolbar.addWidget(self.main_widget) - self.ustaw_legende(style) + + self.ustaw_legende() self.menuButton = QToolButton() - self.menuButton.setText("Pokaż menu") + self.menuButton.setText("Show menu") self.menuButton.setCheckable(True) self.menuButton.setBaseSize(QSize(80, 25)) self.menuButton.toggled.connect(self.menu_show) - corner_widget = QWidget(self.main_widget) + + self.editButton = QToolButton() + self.editButton.setText("Edit menu") + self.editButton.setCheckable(True) + self.editButton.setBaseSize(QSize(25, 25)) + self.editButton.toggled.connect(self.main_widget.edit_session_toggle) + self.menu_show() + + self.styleButton = QToolButton() + self.styleButton.setText("Theme") + self.styleButton.setBaseSize(QSize(25, 25)) + self.styleButton.clicked.connect(self.show_style_manager_dialog) + self.styleButton.setObjectName('ThemeButton') + + corner_widget = QWidget(self.main_widget.tabWidget) corner_layout = QHBoxLayout() corner_layout.setContentsMargins(0, 0, 0, 0) corner_layout.addWidget(self.menuButton) + corner_layout.addWidget(self.editButton) + corner_layout.addWidget(self.styleButton) corner_widget.setLayout(corner_layout) self.main_widget.tabWidget.setCornerWidget(corner_widget) self.iface.mapCanvas().refresh() + # signals + self.main_widget.editChanged.connect(self.save_user_ribbon_config) + self.main_widget.printsAdded.connect(self.custom_prints) + + self.project_path = os.path.dirname( + os.path.abspath(project.fileName())) + self.toolbar.show() + + # set strong focus to get keypressevent + self.main_widget.setFocusPolicy(Qt.StrongFocus) + + def custom_prints(self): + """Load custom tools to qgis""" self.quick_print = PrintMapTool(self.iface, self.main_widget) - self.main_widget.btn_szybki_wydruk.clicked.connect( - self.quick_print.run) - self.main_widget.btn_szybki_wydruk.setToolTip( - "Szybki wydruk widoku mapy") + + b_qprints = self.main_widget.findChildren( + QToolButton, 'giapQuickPrint') + for b_qprint in b_qprints: + b_qprint.clicked.connect(self.quick_print.run) + b_qprint.setToolTip("Szybki wydruk widoku mapy") + b_qprint.setIcon(QIcon(f'{self.plugin_dir}/icons/quick_print.png')) + + b_mprints = self.main_widget.findChildren(QToolButton, 'giapMyPrints') + for b_mprint in b_mprints: + b_mprint.setIcon(QIcon(f'{self.plugin_dir}/icons/my_prints.png')) + self.my_prints_setup() - self.main_widget.btn_dig_18.actions()[0].setIcon(QIcon(f'{self.plugin_dir}/icons/magnet_tool.png')) - self.main_widget.btn_moje_wydruki.setIcon(QIcon(f'{self.plugin_dir}/icons/my_prints.png')) - self.main_widget.btn_szybki_wydruk.setIcon(QIcon(f'{self.plugin_dir}/icons/quick_print.png')) - self.project_path = os.path.dirname(os.path.abspath(project.fileName())) - self.toolbar.show() + def save_default_user_layout(self): + """ Saves active user toolbars in qgis user settings. Saves as string + under flag org_toolbars in json config file (user scope). + Assumes that all toolbars have specified name if not, we can't find + them, and therefore will not be loaded again + :return: + """ + # select all active toolbars from mainwindow + active_toolbars = [] + for x in self.iface.mainWindow().findChildren(QToolBar): + try: + if x.parent().windowTitle() == \ + self.iface.mainWindow().windowTitle() and \ + x.isVisible(): + active_toolbars.append(x) + except Exception: + pass + + # hide toolbars + for x in active_toolbars: + x.hide() + + # unique and not empty objects name from toolbars + tbars_names = [ + x.objectName() for x in active_toolbars + if x.objectName() not in ['', None, 'NULL', 'GiapToolBar'] + ] + + self.config.save_original_toolbars(tbars_names) + + def save_user_ribbon_config(self, opt): + """Saves user ribbon setup to config on exit + :opt: bool for edit session, False will save config + :return: None + """ + if not opt: + conf = self.main_widget.generate_ribbon_config() + self.config.save_user_ribbon_setup(conf) + + def load_default_user_layout(self): + """Restores original user toolbars to qgis window from settings + :return: + """ + toolbars_name = self.config.get_original_toolbars() + + # find toolbars and swich their visiblity on + for tname in toolbars_name: + tbar = self.iface.mainWindow().findChild(QToolBar, tname) + if tbar is not None: + tbar.show() + + # show menu bar + self.iface.mainWindow().menuBar().show() def my_prints_setup(self): - btn = self.main_widget.btn_moje_wydruki - btn.setToolTip("Moje wydruki") - btn.setPopupMode(QToolButton.InstantPopup) - self.action_my_prints_menu() - self.projectLayoutManager.layoutAdded.connect(self.action_my_prints_menu) - self.projectLayoutManager.layoutRemoved.connect(self.action_my_prints_menu) + btns = self.iface.mainWindow().findChildren( + QToolButton, 'giapMyPrints') + for btn in btns: + btn.setToolTip("Moje wydruki") + btn.setPopupMode(QToolButton.InstantPopup) + self.action_my_prints_menu() + self.projectLayoutManager.layoutAdded.connect( + self.action_my_prints_menu + ) + self.projectLayoutManager.layoutRemoved.connect( + self.action_my_prints_menu + ) def action_my_prints_menu(self): - if 'giap_layout' in qgis.utils.plugins: - qgis.utils.plugins['giap_layout'].unload() - main_widget = self.main_widget - btn = main_widget.btn_moje_wydruki - menu = QMenu(main_widget) - actions = [] - projectInstance = QgsProject.instance() - self.projectLayoutManager = projectInstance.layoutManager() - for layout in self.projectLayoutManager.layouts(): - title = layout.name() - action = QAction(title, main_widget) - action.triggered.connect(lambda checked, item=action: self.open_layout_by_name(item.text())) - actions.append(action) - actions.sort(key=lambda x: x.text()) - list(map(menu.addAction, actions)) - btn.setMenu(menu) + btns = self.iface.mainWindow().findChildren( + QToolButton, 'giapMyPrints') + for btn in btns: + main_widget = self.main_widget + menu = QMenu(main_widget) + actions = [] + projectInstance = QgsProject.instance() + self.projectLayoutManager = projectInstance.layoutManager() + for layout in self.projectLayoutManager.layouts(): + title = layout.name() + action = QAction(title, main_widget) + action.triggered.connect( + lambda checked, item=action: + self.open_layout_by_name(item.text())) + actions.append(action) + actions.sort(key=lambda x: x.text()) + list(map(menu.addAction, actions)) + btn.setMenu(menu) def open_layout_by_name(self, action_name): layout = self.projectLayoutManager.layoutByName(action_name) self.iface.openLayoutDesigner(layout) def unload(self): - for child in self.iface.mainWindow().children(): - if type(child) == QToolBar and child.objectName() == 'GiapToolBar': - child.hide() + self.iface.mainWindow().menuBar().show() + self.style_manager.activate_style('') + self.save_user_ribbon_config(False) + self.kompozycje.unload() + self.toolbar.hide() + self.orto_add.disconnect_ortofotomapa_group() + + # reinstitute original qgis layout + self.load_default_user_layout() + + self.iface.messageBar().pushMessage( + 'GIAP Layout', + # QApplication.translate('giap_pl', 'Please, restart QGIS!'), + 'Please, restart QGIS!', + Qgis.Info, + 0 + ) def menu_show(self): + """Toggle visiblity of menubar""" if self.menuButton.isChecked(): self.iface.mainWindow().menuBar().show() else: self.iface.mainWindow().menuBar().hide() - def ustaw_legende(self, style): - qt_style = QStyleFactory.create('Cleanlooks') - self.layer_panel = self.iface.mainWindow().findChildren(QDockWidget, 'Layers')[0] + def ustaw_legende(self): + self.layer_panel = self.iface.mainWindow().findChild( + QDockWidget, 'Layers') self.layer_panel.setTitleBarWidget(QWidget()) - self.layer_panel.setStyle(qt_style) - self.layer_panel.setStyleSheet(style + """ - QToolBar { - spacing: 7px; - margin: 7px; - border: none; - } - QToolButton { - padding: 3px 3px 3px 3px; - } - QMenu { - background-color: rgb(53, 85, 109); - color: rgb(255, 255, 255); - font: 10pt "Segoe UI"; - } - QMenu::item:disabled { - color: rgb(200, 200, 200); - } - * { - background-color: rgb(53, 85, 109); - color: rgb(255, 255, 255); - font: 10pt "Segoe UI"; - } - """) + self.layer_view = self.iface.layerTreeView() self.layer_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) - self.layer_view.setStyle(qt_style) - self.layer_view.setStyleSheet(style + """ - QTreeView::item, QTreeView::branch { - color: rgb(255, 255, 255); - } - QTreeView { - border: 2px solid; - border-top-color: rgb(79, 118, 150); - border-left: none; - border-bottom-color: rgb(79, 118, 150); - border-right: none; - padding-top: 5px; - } - * { - background-color: rgb(53, 85, 109); - color: rgb(255, 255, 255); - font: 10pt "Segoe UI"; - } - """) + layer_toolbar = self.layer_view.parent().children()[1] - layer_toolbar.children()[6].menu().setStyleSheet(style + """ - QMenu { - background-color: rgb(53, 85, 109); - color: rgb(255, 255, 255); - font: 10pt "Segoe UI"; - } - QMenu::item:disabled { - color: rgb(200, 200, 200); - } - """) + layer_toolbar.children()[9].setPopupMode(2) + widget_w_warstwach = QWidget() + layout_widgetu = QVBoxLayout() + layout_widgetu.addWidget(layer_toolbar) + layout_widgetu.addWidget(self.kompozycje_widget) + layout_widgetu.addWidget(self.layer_view) + layout_widgetu.setContentsMargins(0, 7, 0, 4) + widget_w_warstwach.setLayout(layout_widgetu) + self.layer_panel.setWidget(widget_w_warstwach) + self.layer_panel.setTitleBarWidget(QWidget()) self.main_widget.pokaz_warstwy.toggled.connect(self.warstwy_show) - self.main_widget.pokaz_warstwy.toggle() + + def get_left_docks(self): + docks = [x for x in self.iface.mainWindow().findChildren(QDockWidget) + if x.isVisible() + ] + left_docks = [ + x for x in docks if + self.iface.mainWindow().dockWidgetArea(x) == Qt.LeftDockWidgetArea + ] + return left_docks def warstwy_show(self): - splitter_start = QRect(-self.layer_panel.width(), self.layer_panel.y(), - self.layer_panel.width(), self.layer_panel.height()) - splitter_end = QRect(0, self.layer_panel.y(), - self.layer_panel.width(), self.layer_panel.height()) if self.main_widget.pokaz_warstwy.isChecked(): - self.layer_panel.show() - self.set_animation(self.layer_panel, splitter_start, splitter_end, 200) - self.layer_view.resizeColumnToContents(0) + left_docks = self.left_docks + # there shoulde be docks if there is none add default from qgis. + # (User turned off qgis with hidden docks) + if len(self.left_docks) == 0: + for dock in ['Layers', 'Browser']: + child = self.iface.mainWindow().findChild(QDockWidget, + dock) + if child: + left_docks.append(child) else: - self.set_animation(self.layer_panel, splitter_end, splitter_start, 200, 'out') + left_docks = self.get_left_docks() + + for ldock in left_docks: + splitter_start = QRect( + -ldock.width(), ldock.y(), + ldock.width(), ldock.height()) + splitter_end = QRect( + 0, ldock.y(), + ldock.width(), ldock.height()) + if self.main_widget.pokaz_warstwy.isChecked(): + ldock.show() + self.set_animation( + ldock, splitter_start, splitter_end, 200 + ) + self.layer_view.resizeColumnToContents(0) + else: + self.set_animation( + ldock, splitter_end, splitter_start, 200, 'out' + ) - def set_animation(self, widget, qrect_start, qrect_end, duration, mode='in'): + self.left_docks = [] + if not self.main_widget.pokaz_warstwy.isChecked(): + self.left_docks = left_docks + + def set_animation( + self, widget, qrect_start, qrect_end, duration, mode='in'): animation_in = QPropertyAnimation(widget, b"geometry") animation_in.setStartValue(qrect_start) animation_in.setEndValue(qrect_end) animation_in.setDuration(duration) animation_in.setEasingCurve(QEasingCurve.InOutQuad) animation_in.start() - animation_in.finished.connect(lambda: self.delete_animation(animation_in, widget, mode)) + animation_in.finished.connect( + lambda: self.delete_animation(animation_in, widget, mode) + ) + + def repair_layers_names_for_compositions(self): + for layer in list(project.mapLayers().values()): + layer.setName(layer.name().replace(':', '_')) + + def projekt_wczytany(self): + """ setup after loading new project + """ + if not project.fileName(): + return + + self.repair_layers_names_for_compositions() + self.kompozycje.start() + # self.main_widget.btn_projekt_3.clicked.connect( + # self.kompozycje.modify_tool.check_for_changes_in_comps) + self.kompozycje.modify_tool.check_for_changes_in_comps() + + def setup_orto(self): + """Setup qtoolbutton with menu, adds wms/wmts services to map + """ + parent = self.main_widget + btn = self.main_widget.btn_orto_2 + + # przycisk dodawania ortofotomap + self.orto_add = OrtoAddingTool(parent, btn) + + connect_orto = self.orto_add.connect_ortofotomapa_group + for service in self.orto_add.services: + service.orto_group_added.connect(connect_orto) def delete_animation(self, animation, widget, mode): del animation if mode == 'out': - widget.hide() \ No newline at end of file + widget.hide() + + def show_style_manager_dialog(self): + """Show dialog to manage qgis styles""" + self.style_manager_dlg = StyleManagerDialog(self.style_manager) + self.style_manager_dlg.setWindowFlags( + Qt.Window | Qt.WindowCloseButtonHint + ) + self.style_manager_dlg.exec_() diff --git a/giap_layout_dialog.py b/giap_layout_dialog.py deleted file mode 100644 index 75375d6..0000000 --- a/giap_layout_dialog.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -import os - -from PyQt5.QtWidgets import QWidget -from qgis.PyQt import uic -from qgis.PyQt import QtWidgets - -# This loads your .ui file so that PyQt can populate your plugin with the elements from Qt Designer -FORM_CLASS, _ = uic.loadUiType(os.path.join( - os.path.dirname(__file__), 'giap_layout_dialog_base.ui')) - - -class MainTabQgsWidgetDialog(QWidget, FORM_CLASS): - - def __init__(self, parent=None): - super(MainTabQgsWidgetDialog, self).__init__(parent) - self.setupUi(self) diff --git a/giap_layout_dialog_base.ui b/giap_layout_dialog_base.ui deleted file mode 100644 index 863f96a..0000000 --- a/giap_layout_dialog_base.ui +++ /dev/null @@ -1,3464 +0,0 @@ - - - Form - - - - 0 - 0 - 1282 - 185 - - - - - 16777215 - 185 - - - - Form - - - * { -background-color: rgb(53, 85, 109); -color: rgb(255, 255, 255); -font: 10pt "Segoe UI"; -} - -QPushButton { -padding: 5px; -} - -QLineEdit, QTextEdit{ -border: 2px solid; -border-radius: 4px; -border-color: rgba(38, 60, 78, 255); -border-top-color: qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:1, stop:0 rgba(26, 44, 60, 255), stop:1 rgba(38, 60, 78, 255)); -background-color: rgba(38, 60, 78, 255); -} -QPushButton { -border: none; -border-width: 2px; -border-radius: 6px; -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -} -QPushButton:checked { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QPushButton:pressed { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QToolButton { -border: none; -border-width: 2px; -border-radius: 6px; -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -} - -QToolButton:checked { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QMenu { -background-color: rgb(53, 85, 109); -color: rgb(255, 255, 255); -font: 10pt "Segoe UI"; -} - -QToolButton:pressed { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QToolButton::menu, QToolButton::menu-button { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QMenu::item:selected { -background-color: rgb(87, 131, 167); -} - -QComboBox QListView{ -selection-background-color: rgb(87, 131, 167); -} - -QComboBox:editable { -border: none; -border-radius: 4px; -background-color: qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:0.1, stop:0 rgba(26, 44, 60, 255), stop:1 rgba(38, 60, 78, 255)); -padding: 0px 0px 0px 3px; -} - -QComboBox:!editable { -border: none; -border-width: 2px; -border-radius: 4px; -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -padding:0px 3px 0px 3px; -} - -QComboBox:!editable:on { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -padding:0px 5px 0px 3px; -} - -QComboBox::drop-down { -width: 15px; -border-left: solid; -border-width: 1px; -border-color: rgb(26, 44, 60); -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -border-top-right-radius: 4px; -border-bottom-right-radius: 4px; -} -QComboBox::drop-down:editable:on { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QComboBox::drop-down:!editable:on { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -} - -QComboBox::down-arrow { - image: url(:/plugins/giap_layout/icons/down_arrow.png); - width: 15px; -} - -QToolTip { -color:black; -background-color: rgb(255, 255, 185); -border-color: rgb(215, 215, 215); -font: 9pt "Segoe UI"; -/*font-weight: bold;*/ -} - -Line { -color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 5 - - - - - - - - - 0 - 0 - - - - - 0 - 140 - - - - - 16777215 - 140 - - - - QTabBar::tab { -border-top-left-radius: 8px; -border-top-right-radius: 8px; -margin-right: -1px; -padding:2px; -padding-left: 5px; -padding-right: 5px; -height: 20px; -font-weight: bold; -} - -QTabBar::tab:selected { -border: 1px solid; -border-color: rgb(79, 118, 150); -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(79, 118, 150, 255), stop:1 rgba(105, 157, 200, 255)); -} - -QTabBar::tab:!selected { -border: 1px solid rgb(90, 135, 172); -border-left-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -border-right-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -border-bottom: 1px solid; -border-bottom-color: rgb(65, 97, 124); -background-color: rgb(65, 97, 124); -color: rgb(203, 212, 220); -} - -QTabBar::tab:last:!selected { -margin-right: 1px; -} -QTabWidget::pane { -border-top: 2px solid rgb(79, 118, 150); -border-bottom: 2px solid rgb(79, 118, 150); -} -QTabWidget::tab-bar { -left: 5px; -right: 5px; -} - - - - 0 - - - true - - - false - - - - QAbstractButton { -border-radius: 4px; -} - - - Narzędzia podstawowe - - - - QLayout::SetDefaultConstraint - - - 5 - - - 3 - - - 5 - - - 3 - - - 8 - - - 5 - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Pomiar - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - :/plugins/giap_layout/icons/panmap.png:/plugins/giap_layout/icons/panmap.png - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 10 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 10 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Nawigacja - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - -1 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 10 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Projekt - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Atrybuty - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 10 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - 0 - - - - 0 - - - 0 - - - 0 - - - 0 - - - 8 - - - 5 - - - - - - - - - 0 - 0 - - - - - 104 - 104 - - - - background-color: none; - - - - - - - :/plugins/giap_layout/icons/giap_logo_big.png:/plugins/giap_layout/icons/giap_logo_big.png - - - - 90 - 90 - - - - - - - - - Narzędzia zaawansowane - - - - 5 - - - 3 - - - 5 - - - 3 - - - 8 - - - 5 - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - :/plugins/giap_layout/icons/my_prints.png:/plugins/giap_layout/icons/my_prints.png - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - :/plugins/giap_layout/icons/magnet_tool.png:/plugins/giap_layout/icons/magnet_tool.png - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 8 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 8 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Atrybuty - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 8 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Warstwy - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Zaawansowana digitalizacja - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Wektor - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 8 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 8 - 0 - - - - color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Etykiety - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - Qt::Horizontal - - - - 1434 - 75 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 16777215 - 13 - - - - - Segoe UI - 10 - 75 - false - true - - - - color: rgb(203, 212, 220); -font: 10pt "Segoe UI" ; -font-weight: bold; - - - Wydruki - - - Qt::AlignHCenter|Qt::AlignTop - - - -4 - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - 104 - 104 - - - - background-color: none; - - - - - - - :/plugins/giap_layout/icons/giap_logo_big.png:/plugins/giap_layout/icons/giap_logo_big.png - - - - 90 - 90 - - - - - - - - - 30 - 30 - - - - - 30 - 30 - - - - - - - - :/plugins/giap_layout/icons/quick_print.png:/plugins/giap_layout/icons/quick_print.png - - - - 25 - 25 - - - - - - - - - Ustawienia - - - - - - - 0 - 0 - - - - - 65 - 65 - - - - - 65 - 65 - - - - - Segoe UI - 10 - 50 - false - false - - - - Kompozycje - - - - - - - :/plugins/GIAP-PolaMap/icons/wyrys.png:/plugins/GIAP-PolaMap/icons/wyrys.png - - - - 60 - 60 - - - - false - - - false - - - Qt::ToolButtonIconOnly - - - - - - - Kompozycje - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - 0 - 0 - - - - - 0 - 40 - - - - QAbstractButton { -border-radius: 4px; -} - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - 5 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 30 - 30 - - - - - Segoe UI - 10 - 50 - false - false - - - - Pokaż informacje o działce - - - - - - - :/plugins/giap_layout/icons/info.png:/plugins/giap_layout/icons/info.png - - - - 24 - 24 - - - - true - - - false - - - Qt::ToolButtonIconOnly - - - - - - - - 0 - 0 - - - - - - - true - - - QComboBox::NoInsert - - - QComboBox::AdjustToContents - - - - - - - Qt::Vertical - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 30 - - - - - Segoe UI - 10 - 50 - false - false - - - - Pokaż panel warstw - - - Warstwy - - - true - - - QToolButton::InstantPopup - - - Qt::NoArrow - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 30 - 30 - - - - - Segoe UI - 10 - 50 - false - false - - - - Pokaż informacje o działce - - - - - - - :/plugins/giap_layout/icons/info.png:/plugins/giap_layout/icons/info.png - - - - 24 - 24 - - - - true - - - false - - - 300 - - - 100 - - - Qt::ToolButtonIconOnly - - - - - - - - 0 - 0 - - - - - 130 - 0 - - - - - 16777215 - 16777215 - - - - - - - Wpisz numer działki - - - - - - - - 0 - 0 - - - - - 130 - 29 - - - - - - - true - - - QComboBox::NoInsert - - - QComboBox::AdjustToContents - - - - - - - - 0 - 30 - - - - Qt::Vertical - - - - - - - - 0 - 0 - - - - - 250 - 0 - - - - - - - Wpisz adres punktu lub nazwę ulicy - - - - - - - - 0 - 0 - - - - wyszukaj działkę - - - QAbstractButton { -border-radius: 4px; -} - - - Wyszukaj - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - 0 - - - - 0 - - - 0 - - - 3 - - - 0 - - - - - - - - - 0 - 0 - - - - Wyszukaj punkt adresowy - - - QAbstractButton { -border-radius: 4px; -} - - - Wyszukaj - - - - - - - - - - - - - - 5 - - - 5 - - - true - - - true - - - true - - - diff --git a/i18n/giap_pl.ts b/i18n/giap_pl.ts new file mode 100644 index 0000000..dfcf78c --- /dev/null +++ b/i18n/giap_pl.ts @@ -0,0 +1,116 @@ + + + + Form + + + Form + + + + + Narzędzia podstawowe + + + + + Pomiar + + + + + Nawigacja + + + + + Projekt + + + + + Atrybuty + + + + + Narzędzia zaawansowane + + + + + Atrybuty + + + + + Warstwy + + + + + Zaawansowana digitalizacja + + + + + Wektor + + + + + Etykiety + + + + + Wydruki + + + + + Ustawienia + + + + + Kompozycje + + + + + Pokaż informacje o działce + + + + + Pokaż panel warstw + + + + + Wpisz numer działki + + + + + Wpisz adres punktu lub nazwę ulicy + + + + + wyszukaj działkę + + + + + Wyszukaj + + + + + Wyszukaj punkt adresowy + + + + diff --git a/i18n/pl.ts b/i18n/pl.ts new file mode 100644 index 0000000..442cc9a --- /dev/null +++ b/i18n/pl.ts @@ -0,0 +1,11 @@ + + + + @default + + + Good morning + Dzień dobry + + + diff --git a/i18n/test.pro b/i18n/test.pro new file mode 100644 index 0000000..d405553 --- /dev/null +++ b/i18n/test.pro @@ -0,0 +1,5 @@ +FORMS = ../giap_layout_dialog_base.ui + +SOURCES = ../giap_layout_dialog.py + +TRANSLATIONS = giap_pl.ts diff --git a/kompozycje_widget.py b/kompozycje_widget.py index b76787f..0a65e72 100644 --- a/kompozycje_widget.py +++ b/kompozycje_widget.py @@ -2,7 +2,6 @@ import os -from qgis.PyQt.QtGui import QIcon from qgis.PyQt.QtWidgets import QWidget from qgis.PyQt.uic import loadUiType @@ -16,11 +15,3 @@ class kompozycjeWidget(QWidget, FORM_CLASS): def __init__(self, parent=None): super(kompozycjeWidget, self).__init__(parent) self.setupUi(self) - self.setup_dialog() - - - def setup_dialog(self): - self.frame.hide() - self.frame_3.hide() - self.kompozycjeComboBox.hide() - self.label_92.hide() diff --git a/kompozycje_widget.ui b/kompozycje_widget.ui index d927bdb..36ab537 100644 --- a/kompozycje_widget.ui +++ b/kompozycje_widget.ui @@ -1,726 +1,259 @@ - - - Form - - - - 0 - 0 - 446 - 185 - - - - - 0 - 37 - - - - - 16777215 - 185 - - - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 255 - 255 - 255 - - - - - - - 255 - 255 - 255 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - Form - - - * { -background-color: rgb(53, 85, 109); -color: rgb(255, 255, 255); -font: 10pt "Segoe UI"; -} - -QPushButton { -padding: 5px; -} - -QLineEdit, QTextEdit{ -border: 2px solid; -border-radius: 4px; -border-color: rgba(38, 60, 78, 255); -border-top-color: qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:1, stop:0 rgba(26, 44, 60, 255), stop:1 rgba(38, 60, 78, 255)); -background-color: rgba(38, 60, 78, 255); -} -QPushButton { -border: none; -border-width: 2px; -border-radius: 6px; -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -} -QPushButton:checked { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QPushButton:pressed { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QToolButton { -border: none; -border-width: 2px; -border-radius: 6px; -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -} - -QToolButton:checked { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QMenu { -background-color: rgb(53, 85, 109); -color: rgb(255, 255, 255); -font: 10pt "Segoe UI"; -} - -QToolButton:pressed { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QToolButton::menu, QToolButton::menu-button { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QMenu::item:selected { -background-color: rgb(87, 131, 167); -} - -QComboBox QListView{ -selection-background-color: rgb(87, 131, 167); -} - -QComboBox:editable { -border: none; -border-radius: 4px; -background-color: qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:0.1, stop:0 rgba(26, 44, 60, 255), stop:1 rgba(38, 60, 78, 255)); -padding: 0px 0px 0px 3px; -} - -QComboBox:!editable { -border: none; -border-width: 2px; -border-radius: 4px; -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -padding:0px 3px 0px 3px; -} - -QComboBox:!editable:on { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -padding:0px 5px 0px 3px; -} - -QComboBox::drop-down { -width: 15px; -border-left: solid; -border-width: 1px; -border-color: rgb(26, 44, 60); -background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); -border-top-right-radius: 4px; -border-bottom-right-radius: 4px; -} -QComboBox::drop-down:editable:on { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -border: solid; -border-width: 2px; -border-color: rgb(65, 97, 124); -} - -QComboBox::drop-down:!editable:on { -background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); -} - -QComboBox::down-arrow { - image: url(:/plugins/GIAP-giap_layout/icons/down_arrow.png); - width: 15px; -} - -QToolTip { -color:black; -background-color: rgb(255, 255, 185); -border-color: rgb(215, 215, 215); -font: 9pt "Segoe UI"; -/*font-weight: bold;*/ -} - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 0 - 5 - - - - - 16777215 - 16 - - - - QFrame::NoFrame - - - QFrame::Raised - - - 0 - - - - - 0 - 0 - 51500 - 3 - - - - - - - - - 79 - 118 - 150 - - - - - - - 53 - 85 - 109 - - - - - - - 79 - 118 - 150 - - - - - - - 79 - 118 - 150 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - 79 - 118 - 150 - - - - - - - 53 - 85 - 109 - - - - - - - 79 - 118 - 150 - - - - - - - 79 - 118 - 150 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - 79 - 118 - 150 - - - - - - - 53 - 85 - 109 - - - - - - - 79 - 118 - 150 - - - - - - - 79 - 118 - 150 - - - - - - - 53 - 85 - 109 - - - - - - - 53 - 85 - 109 - - - - - - - - - Segoe UI - 10 - 50 - false - false - false - - - - - - - - - - - - - - - - - - - false - - - *{ -color: rgb(79,118,150) !important; -} - - - QFrame::Plain - - - 2 - - - Qt::Horizontal - - - - - - - - - 0 - 0 - - - - - 0 - 37 - - - - QAbstractButton { -border-radius: 4px; -} - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - 7 - - - 4 - - - - - - 0 - 30 - - - - - 80 - 30 - - - - Kompozycje: - - - - - - - true - - - - 0 - 0 - - - - - 0 - 30 - - - - - 16777215 - 30 - - - - - - - false - - - QComboBox::NoInsert - - - QComboBox::AdjustToContents - - - true - - - - - - - - - - - - - - 5 - - - 5 - - - true - - - true - - - true - - - + + + Form + + + + 0 + 0 + 409 + 117 + + + + Form + + + * { +font: 8pt "Segoe UI"; +} + +QLabel +{ +font: 8pt "Segoe UI"; +} + +QPushButton { +padding: 5px; +} + +QLineEdit, QTextEdit{ +border: 2px solid; +border-radius: 4px; +border-color: rgba(38, 60, 78, 255); +border-top-color: qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:1, stop:0 rgba(26, 44, 60, 255), stop:1 rgba(38, 60, 78, 255)); +} +QPushButton { +border: none; +border-width: 2px; +border-radius: 6px; +} +QPushButton:checked { +border: solid; +border-width: 2px; +border-color: rgb(65, 97, 124); +} + +QPushButton:pressed { +border: solid; +border-width: 2px; +border-color: rgb(65, 97, 124); +} + +QToolButton { +border: none; +border-width: 2px; +border-radius: 6px; + +} + +QToolButton:checked { + +border: solid; +border-width: 2px; +border-color: rgb(65, 97, 124); +} + +QMenu { + +font: 10pt "Segoe UI"; +} + +QToolButton:pressed { + +border: solid; +border-width: 2px; +border-color: rgb(65, 97, 124); +} + +QToolButton::menu, QToolButton::menu-button { + +border: solid; +border-width: 2px; +border-color: rgb(65, 97, 124); +} + + + +QToolTip { +color:black; +background-color: rgb(255, 255, 185); +border-color: rgb(215, 215, 215); +font: 9pt "Segoe UI"; +/*font-weight: bold;*/ +} + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 5 + + + + + 16777215 + 16 + + + + QFrame::NoFrame + + + QFrame::Raised + + + 0 + + + + + + + 0 + 5 + + + + Qt::Horizontal + + + + + + + + + + + 0 + 0 + + + + + 0 + 37 + + + + QAbstractButton { +border-radius: 4px; +} + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + 7 + + + 4 + + + + + + 0 + 30 + + + + + 80 + 30 + + + + Kompozycje: + + + + + + + true + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 30 + + + + + + + false + + + QComboBox::NoInsert + + + QComboBox::AdjustToContents + + + true + + + + + + + + + + + diff --git a/metadata.txt b/metadata.txt index d05a9a1..038965c 100644 --- a/metadata.txt +++ b/metadata.txt @@ -28,7 +28,7 @@ tags= homepage= category=Plugins -icon=icon.png +icon=giap.ico # experimental flag experimental=True diff --git a/ribbon_config.py b/ribbon_config.py new file mode 100644 index 0000000..f1ea09c --- /dev/null +++ b/ribbon_config.py @@ -0,0 +1,162 @@ +RIBBON_DEFAULT = [ + { + "tab_name": "Main", + "sections": [ + { + "label": "Project", + "btn_size": 30, + "btns": [ + ["mActionOpenProject", 0, 0], + ["mActionNewProject", 0, 1], + ["mActionSaveProject", 1, 0], + ["mActionSaveProjectAs", 1, 1] + ] + }, + + { + "label": "Navigation", + "btn_size": 30, + "btns": [ + ["mActionPan", 0, 0], + ["mActionZoomIn", 0, 1], + ["mActionZoomOut", 0, 2], + ["mActionZoomFullExtent", 0, 3], + + ["mActionZoomToLayer", 1, 0], + ["mActionZoomToSelected", 1, 1], + ["mActionZoomLast", 1, 2], + ["mActionZoomNext", 1, 3] + ] + }, + + { + 'label': 'Attributes', + 'btn_size': 30, + 'btns': [ + ['mActionIdentify', 0, 0], + ['mActionSelectFeatures', 0, 1], + ['mActionDeselectAll', 1, 0], + ['mActionOpenTable', 1, 1], + ], + }, + + { + 'label': 'Measures', + 'btn_size': 60, + 'btns': [ + ['mActionMeasure', 0, 0], + ['mActionMeasureArea', 0, 1], + ['mActionMeasureAngle', 0, 2], + ], + }, + + { + 'label': 'Layers', + 'btn_size': 30, + 'btns': [ + ['mActionAddOgrLayer', 0, 0], + ['mActionAddWmsLayer', 0, 1], + ['mActionAddPgLayer', 0, 2], + ['mActionAddMeshLayer', 0, 3], + ['mActionAddWcsLayer', 0, 4], + ['mActionAddDelimitedText', 0, 5], + + ['mActionAddRasterLayer', 1, 0], + ['mActionAddWfsLayer', 1, 1], + ['mActionAddSpatiaLiteLayer', 1, 2], + ['mActionAddVirtualLayer', 1, 3], + ['mActionNewMemoryLayer', 1, 4], + ], + }, + + ] + }, + + { + "tab_name": "Tools", + "sections": [ + { + 'label': 'Attributes', + 'btn_size': 30, + 'btns': [ + ['mActionIdentify', 0, 0], + ['mActionSelectFeatures', 0, 1], + ['mActionSelectPolygon', 0, 2], + ['mActionSelectByExpression', 0, 3], + ['mActionInvertSelection', 0, 4], + ['mActionDeselectAll', 0, 5], + + ['mActionOpenTable', 1, 0], + ['mActionStatisticalSummary', 1, 1], + ['mActionOpenFieldCalc', 1, 2], + ['mActionMapTips', 1, 3], + ['mActionNewBookmark', 1, 4], + ['mActionShowBookmarks', 1, 5], + ], + }, + + { + 'label': 'Labels', + 'btn_size': 30, + 'btns': [ + ['mActionLabeling', 0, 0], + ['mActionChangeLabelProperties', 0, 1], + ['mActionPinLabels', 0, 2], + ['mActionShowPinnedLabels', 0, 3], + ['mActionShowHideLabels', 0, 4], + ['mActionMoveLabel', 1, 0], + ['mActionRotateLabel', 1, 1], + ['mActionDiagramProperties', 1, 2], + ['mActionShowUnplacedLabels', 1, 3], + ] + }, + + { + 'label': 'Vector', + 'btn_size': 30, + 'btns': [ + ['mActionToggleEditing', 0, 0], + ['mActionSaveLayerEdits', 0, 1], + ['mActionVertexTool', 0, 2], + ['mActionUndo', 0, 3], + ['mActionRedo', 0, 4], + + ['mActionAddFeature', 1, 0], + ['mActionMoveFeature', 1, 1], + ['mActionDeleteSelected', 1, 2], + ['mActionCutFeatures', 1, 3], + ['mActionCopyFeatures', 1, 4], + ['mActionPasteFeatures', 1, 5], + ], + }, + + { + 'label': 'Digitalization', + 'btn_size': 30, + 'btns': [ + ['EnableSnappingAction', 0, 0], + ['EnableTracingAction', 0, 1], + ['mActionRotateFeature', 0, 2], + ['mActionSimplifyFeature', 0, 3], + ['mActionAddRing', 0, 4], + ['mActionAddPart', 0, 5], + ['mActionFillRing', 0, 6], + ['mActionOffsetCurve', 0, 7], + ['mActionCircularStringCurvePoint', 0, 8], + + + ['mActionDeleteRing', 1, 0], + ['mActionDeletePart', 1, 1], + ['mActionReshapeFeatures', 1, 2], + ['mActionSplitParts', 1, 3], + ['mActionSplitFeatures', 1, 4], + ['mActionMergeFeatureAttributes', 1, 5], + ['mActionMergeFeatures', 1, 6], + ['mActionReverseLine', 1, 7], + ['mActionTrimExtendFeature', 1, 8], + ] + }, + ] + }, + +] diff --git a/select_section.py b/select_section.py new file mode 100644 index 0000000..1576848 --- /dev/null +++ b/select_section.py @@ -0,0 +1,16 @@ +import os +from qgis.PyQt import uic +from qgis.PyQt.QtWidgets import QDialog +from .utils import STANDARD_TOOLS + +FORM_CLASS, _ = uic.loadUiType(os.path.join( + os.path.dirname(__file__), 'select_section_dialog.ui')) + + +class SelectSection(QDialog, FORM_CLASS): + def __init__(self, parent=None): + super(SelectSection, self).__init__(parent) + self.setupUi(self) + + tools = [x['label'] for x in STANDARD_TOOLS] + self.toolList.addItems(tools) diff --git a/select_section_dialog.ui b/select_section_dialog.ui new file mode 100644 index 0000000..c74f13d --- /dev/null +++ b/select_section_dialog.ui @@ -0,0 +1,619 @@ + + + SectionSelecterDialog + + + true + + + + 0 + 0 + 462 + 426 + + + + + 1 + 1 + + + + + Segoe UI + 10 + 50 + false + false + + + + Sections + + + + :/plugins/GIAP-giap_layout/icons/giap_logo.png:/plugins/GIAP-giap_layout/icons/giap_logo.png + + + * { + background-color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; +} + +QListWidget { + alternate-background-color: #e7e7e7; +} +QListWidget:item:selected { + background: rgb(38, 60, 78); + color: white; +} + +QAbstractItemView +{ + alternate-background-color: #e7e7e7; + color: black; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 1px; +} + +QAbstractItemView:selected +{ + color: white; + backgroud-color: rgb(38, 60, 78); +} + +QPushButton { + color: black; + border: 1px solid black; + padding: 4px; +} + +QPushButton:disabled +{ + color: gray; +} + +QToolButton { + color: black; +} + +QPushButton:disabled +{ + color: gray; +} + +QHeaderView::section +{ + background-color: #cfcfcf; + color: black; + padding-left: 4px; +} + + + + + + false + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 120 + 0 + + + + + Segoe UI Light + 8 + 9 + false + false + + + + background-color: rgb(53, 85, 109); +font: 75 8pt "Segoe UI Light"; + + + + + 20 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + false + + + + 0 + 20 + + + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 53 + 85 + 109 + + + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 53 + 85 + 109 + + + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 255 + 255 + 255 + + + + + + + 255 + 255 + 255 + + + + + + + 53 + 85 + 109 + + + + + + + 53 + 85 + 109 + + + + + + + + QRadioButton::indicator::checked { + border: 2px solid black; + border-radius: 9px; + background-color: rgb(252, 67, 73); + width: 15px; + height: 15px; +} + +QRadioButton::indicator::unchecked { + border: 2px solid black; + border-radius: 9px; + background-color: rgb(255, 255, 255); + width: 15px; + height: 15px; +} + +QRadioButton { + color : white; + font-weight: bold; +} + + + Add section + + + true + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + verticalSpacer_3 + obszar_radio + + + + + + + Segoe UI + 10 + 50 + false + false + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 200 + 20 + + + + + 16777215 + 20 + + + + background-color: rgb(252, 67, 73); + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + 1 + 1 + 231 + 16 + + + + + Segoe UI + 10 + 75 + false + true + + + + color : white; font-weight: bold; + + + Add section + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + + + Add selected + + + + + + + QListWidget { + alternate-background-color: rgb(87, 131, 167); +} + + + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + Segoe UI + 10 + 50 + false + false + + + + Cancel + + + + + + + + + + + pushButton_cancel + clicked() + SectionSelecterDialog + reject() + + + 710 + 419 + + + 461 + 408 + + + + + pushButton_add + clicked() + SectionSelecterDialog + accept() + + + 290 + 585 + + + 230 + 325 + + + + + diff --git a/styles/blueglass/blueglass.qss b/styles/blueglass/blueglass.qss new file mode 100644 index 0000000..1bd79dc --- /dev/null +++ b/styles/blueglass/blueglass.qss @@ -0,0 +1,344 @@ +/** +QGIS Blue Glass Theme + +based on Minimalist theme + +by Steven Kay www.stevefaeembra.com @stevefaeembra + +changes made relative to original minimalist theme... + +- gave toolbar icons a bit more breathing room +- added borders to combo/spinboxes +- made separators easier to find when you hover over them (they turn red) +- glassy look gradient buttons +- disabled buttons more distinct from enabled buttons +- hover over toolbar buttons gives gradient effect +- currently enabled tools get a border to show they're active (e.g. pan, identify) +- scrollbar thumbs get minimum size to make it easier to scroll through long lists such as the attribute table + +tested under GTK+, YMMV with other qt window styles. + +*/ + +QWidget{border: 0px; background-color: rgba(250, 250, 250, 255); selection-background-color: rgba(0,0,255,75);background-clip: border;outline: 0; } +QDialog { border-radius: 3px; border: 1px;background-color: rgba(250, 250, 250, 255)} +QMenuBar{ background-color: white; border-bottom: 0px solid black; } +QMenuBar::item:selected {background:rgba(0,0,255,75) } +QMenuBar::item:pressed {background: rgba(0,0,255,100) } +QToolBar{ background-color: #fafafa; border: 0px solid #fafafa; } +QToolBar::handle{ + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #fafafa, stop: 1.0 #cbcbff); + border: 0px solid #fafafa; +} +QLabel{color: rgba(0, 0, 0, 225) } + +/** separator goes red on hover, makes it easier to find/move */ + +QMainWindow::separator { + background: #fafafa; + width: 4px; /* when vertical */ + height: 4px; /* when horizontal */ +} +QMainWindow::separator:hover { + background: red; +} + +/** Dock Widgets e.g. Time Manager */ + +QDockWidget {border: 0px solid;background :white; } +QDockWidget::close-button, QDockWidget::float-button {border: 0px solid transparent;padding: 0px;} +QDockWidget::close-button:hover, QDockWidget::float-button:hover {background: #CC0000;} +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed {padding: 1px -1px -1px 1px;} +QDockWidget::title { + text-align: left; /* align the text to the left */ + background: #9b9bff; + padding-left: 5px; +} +/** Menus */ + +QMenu::icon{ margin-left: 5px; margin-right: 5px; } +QMenu::item:pressed{background-color:rgba(0,0,255,75); } +QMenu::item:hover{background-color:rgba(0,0,255,50); } + +QLineEdit { + border: 1px solid gray; + border-radius: 1px; + padding: 0 8px; + background: white; + selection-background-color: darkgray; + border-color: darkgray +} + +QLineEdit:read-only { + background: lightblue; +} + +QTextEdit, QListView { + background-color: white; + border: 1px solid gray; + background-attachment: scroll; +} + +QProgressBar {border: 1px solid grey;border-radius: 3px;} +QProgressBar::chunk {background-color: rgba(0,0,255,50);width: 5px;height:10px;} + +/** Scroll bars */ + +QScrollBar:horizontal{ + height: 15px; + margin: 0px 11px 0px 11px; + border: 0px solid #3A3939; + border-radius: 6px; + background-color: #3A3939; +} +QScrollBar::handle:horizontal{ + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #fafafa, stop: 1.0 #9b9bff); + min-width: 5px; + border-radius: 3px; +} +QScrollBar::down-arrow:horizontal{background: none;display:none;} +QScrollBar::up-arrow:horizontal{background: none;display:none;} +QScrollBar::add-page:horizontal{background: none;display:none;} +QScrollBar::sub-page:horizontal{background: none;display:none;} +QScrollBar:vertical{ + background-color: #3A3939; + width: 15px; + margin: 11px 0 11px 0; + border: 0px solid #3A3939; + border-radius: 6px; +} +QScrollBar::handle:vertical{ + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #fafafa, stop: 1.0 #9b9bff); + min-height: 25px;border-radius: 5px; +} + +QScrollBar::up-arrow:vertical{background: none;display:none;} +QScrollBar::down-arrow:vertical{background: none;display:none;} +QScrollBar::add-page:vertical{background: none;display:none;} +QScrollBar::sub-page:vertical{background: none;display:none;} + +/** +Aim of this is to increase default height of QgsMessageBar. This is not directly stylable for now, so this hack is commented out for now; leaving in here +in the hope I remember to style this when it's stylable :) + +QFrame QFrame { + background-color: #fafafa; + min-height: 100px; + margin:0px; + padding:0px; +} +*/ + +/** +Checkboxes & Radio Buttons +*/ + +QRadioButton::indicator:checked { + background-color:#9b9bff; + border:1px solid black; + border-radius: 8px; +} + +QRadioButton::indicator:unchecked { + background-color:#fafafa; + border:1px solid black; + border-radius: 8px; +} + +QCheckBox::indicator:checked { + background-color:#9b9bff; + border:1px solid black; +} + +QCheckBox::indicator:unchecked { + background-color:#fafafa; + border:1px solid black; +} + +/** +Toolbuttons +*/ + +QToolButton { /* all types of tool button */ + border: 6px solid #fafafa; + border-radius: 15px; +} + +QToolButton[popupMode="1"] { + padding-right: 20px; +} + +QToolButton:hover { + border: 2px solid #9b9bff; + /*background-color: #9b9bff;*/ + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #fafafa, stop: 1.0 #9b9bff); + padding:0px; +} + +QToolButton:pressed { + border: 6px solid #fafafa; + border-radius: 15px; +} + +QToolButton:checked { + border: 3px solid black; + border-radius: 15px; + background-color: #9b9bff; + padding:0px; +} + +QToolButton::menu-button { + border: 0px solid black; + border-top-right-radius: 0px; + border-bottom-right-radius: 0px; + width: 16px; +} + +QToolButton::menu-arrow:open { + top: 1px; left: 1px; + border: 0px solid gray; +} + +/** PushButtons **/ + +QPushButton { + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #fafafa, stop: 1.0 #9b9bff); + border-style: outset; + border-width: 1px; + border-radius: 5px; + border-color: black; + min-width: 2em; + padding: 6px; +} + +QPushButton::hover { + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #9b9bff, stop: 1.0 #fafafa); + border-style: outset; + border-width: 1px; + border-radius: 5px; + border-color: black; + min-width: 2em; + padding: 6px; +} + +QPushButton::disabled { + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #ffffff22, stop: 1.0 #9b9bff22); + border-style: dotted; + border-width: 1px; + border-radius: 5px; + border-color: #99999933; + min-width: 2em; + padding: 6px; + color:#33333; +} + +/** Other widgets */ + +QTableWidget { + border: 1px solid #E6E6E6; + selection-background-color: rgba(0,0,255,50); +} + +QTableWidget QTableCornerButton::section { + border: 1px solid #E6E6E6;; +} + + +QListView { + show-decoration-selected: 1; /* make the selection span the entire width of the view */ + border: 1px solid #E6E6E6; +} + +QListView::item:alternate { + background: #EEEEEE; + border: 1px solid #E6E6E6; +} + +QListView::item:selected { + border: 0px solid #6a6ea9; +} + +QListView::item:selected:!active { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #ABAFE5, stop: 1 #8588B2); +} + +QListView::item:selected:active { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #6a6ea9, stop: 1 #888dd9); +} + +QListView::item:hover { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #FAFBFE, stop: 1 #DCDEF1); +} + +/** Combo boxes */ + +QComboBox { + border: 1px solid ; + border-color: darkgray ; + border-radius: 3px; + padding: 1px 18px 1px 3px; + min-width: 6em; +} + +QTabBar::tab { + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #cccccc, stop: 1.0 #fafafa);; + border:1px solid grey; + border-top-left-radius:12px; + border-top-right-radius:12px; + padding:4px; +} + +QTabBar::tab:selected { + border-bottom:none; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,stop: 0 #9b9bff, stop: 1.0 #fafafa); +} + +/** checkbox inside of a drop-down section XXX*/ + +QGroupBox::indicator { + width: 23px; + height: 23px; +} + +QGroupBox::indicator:checked { + background-color:#9b9bff; + border:1px solid black; +} + +QGroupBox::indicator:unchecked { + background-color:#fafafa; + border:1px solid black; +} + +/** group boxes */ + +QGroupBox { + background-color: rgba(250, 250, 250, 255); + border: 1px solid gray; + border-top-style: solid; + border-right-style: solid; + border-bottom-style: solid; + border-left-style: solid; + border-radius: 3px; + margin-top: 4ex; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 0 6px; + background-color:rgba(250, 250, 250, 255); +} + +/** +spinbox - need to style QAbstractSpinbox or some spinboxes aren't styled... +*/ +QAbstractSpinBox { + border:1px solid darkgray; + padding-bottom:4px; + padding-top:2px; + padding-right:8px; +} \ No newline at end of file diff --git a/styles/coffee/coffee.qss b/styles/coffee/coffee.qss new file mode 100644 index 0000000..114d104 --- /dev/null +++ b/styles/coffee/coffee.qss @@ -0,0 +1,110 @@ +.QWidget { + background-color: beige; +} + +/* Nice Windows-XP-style password character. */ +QLineEdit[echoMode="2"] { + lineedit-password-character: 9679; +} + +/* We provide a min-width and min-height for push buttons + so that they look elegant regardless of the width of the text. */ +QPushButton { + background-color: palegoldenrod; + border-width: 2px; + border-color: darkkhaki; + border-style: solid; + border-radius: 5; + padding: 3px; + min-width: 9ex; + min-height: 2.5ex; +} + +QPushButton:hover { + background-color: khaki; +} + +/* Increase the padding, so the text is shifted when the button is + pressed. */ +QPushButton:pressed { + padding-left: 5px; + padding-top: 5px; + background-color: #d0d67c; +} + +QLabel, QAbstractButton { + font: bold; +} + +/* Mark mandatory fields with a brownish color. */ +.mandatory { + color: brown; +} + +/* Bold text on status bar looks awful. */ +QStatusBar QLabel { + font: normal; +} + +QStatusBar::item { + border-width: 1; + border-color: darkkhaki; + border-style: solid; + border-radius: 2; +} + +QComboBox, QLineEdit, QSpinBox, QTextEdit, QListView { + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: #C19A6B; +} + +QListView { + show-decoration-selected: 1; +} + +QListView::item:hover { + background-color: wheat; +} + +/* We reserve 1 pixel space in padding. When we get the focus, + we kill the padding and enlarge the border. This makes the items + glow. */ +QLineEdit, QFrame { + border-width: 2px; + padding: 1px; + border-style: solid; + border-color: darkkhaki; + border-radius: 5px; +} + +/* As mentioned above, eliminate the padding and increase the border. */ +QLineEdit:focus, QFrame:focus { + border-width: 3px; + padding: 0px; +} + +/* A QLabel is a QFrame ... */ +QLabel { + border: none; + padding: 0; + background: none; +} + +/* A QToolTip is a QLabel ... */ +QToolTip { + border: 2px solid darkkhaki; + padding: 5px; + border-radius: 3px; + opacity: 200; +} + +/* Nice to have the background color change when hovered. */ +QRadioButton:hover, QCheckBox:hover { + background-color: wheat; +} + +/* Force the dialog's buttons to follow the Windows guidelines. */ +QDialogButtonBox { + button-layout: 0; +} diff --git a/styles/darkblue/darkblue.qss b/styles/darkblue/darkblue.qss new file mode 100644 index 0000000..042b9de --- /dev/null +++ b/styles/darkblue/darkblue.qss @@ -0,0 +1,1795 @@ +/* +ABOUT +=========================================================== +version 1.7a +QT theme (stylesheet) specially developed for FreeCAD (http://www.freecadweb.org/). +It might work with other software that uses QT styling. + + +LICENSE +=========================================================== +Copyright (c) 2015 Pablo Gil Fernández +The stylesheet barely uses code from Colin Duquesnoy "generic QT stylesheet" + +This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. +To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. + + + +CUSTOMIZATION +=========================================================== +If you would like to change the overall look/style of the theme, just find and replace following colors in the whole file: + background darker = #4d4e51 + background dark and slighly darker = #5d5e61 + background dark = #6d6e71 + background normal and slighly darker = #797b7f + background normal = #85878a + background light = #9a9b9e + background lighter = #c7c7c9 + + lists background = #bdc1c9 + lists background (alternate) = #b3b8bf + lists backgrounds selection = #abb0b7 + + foreground = white + + selection darker = #1b3774 + selection dark = #3874f2 + selection normal = #5e90fa + selection inbetween normal and light = #6f9efa (used to build SpinBoxes) + selection light = #7cabf9 + selection lighter = #adc5ed + +*/ + +/* RESET EVERYTHING */ +QAbstractScrollArea,QCheckBox,QColumnView,QComboBox,QDateEdit,QDateTimeEdit,QDialog,QDialogButtonBox,QDockWidget,QDoubleSpinBox,QFrame,QGroupBox,QHeaderView,QLabel,QLineEdit,QListView,QListWidget,QMainWindow,QMenu,QMenuBar,QMessageBox,QProgressBar,QPushButton,QRadioButton,QScrollBar,QSizeGrip,QSlider,QSpinBox,QSplitter,QStatusBar,QTabBar,QTabWidget,QTableView,QTableWidget,QTextEdit,QTimeEdit,QToolBar,QToolButton,QToolBox,QToolTip,QTreeView,QTreeWidget,QWidget { + padding: 0px; + margin: 0px; + border: 0px; + border-style: none; + background-color: #85878a; /* set with default background color */ +} + +QMdiArea[showImage="true"] { + background-image: url(icons/background_freecad.png); + background-position: center; + background-repeat: no-repeat; +} + +QProgressBar, +QProgressBar:horizontal { + background: #bdc1c9; + border: 1px solid #6d6e71; + text-align: center; + padding: 1px; + border-radius: 4px; +} +QProgressBar::chunk, +QProgressBar::chunk:horizontal { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-radius: 3px; +} + +QToolTip { + background-color: #4d4e51; + color: white; + padding: 4px; + border-radius: 4px; +} + +QWidget { + color: #4d4e51; + background-color: #85878a; + background-clip: border; + border-image: none; + outline: 0; +} + +QWidget:focus { + border: 1px solid #4d4e51; +} + +QWidget:disabled { + color: #9a9b9e; + background-color: #4d4e51; /* same as QMenu background-color */ +} + +QMenuBar { + color: #c7c7c9; + background-color: #797b7f; +} + +QMenuBar::item { + background-color: #797b7f; +} + +QMenuBar::item:selected { + color: #1b3774; + border: 1px solid #5e90fa; + background-color: #5e90fa; +} + +QMenuBar::item:pressed { + color: #1b3774; + border: 1px solid #7cabf9; + background-color: #7cabf9; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu { + color: #c7c7c9; + background-color: #4d4e51; + margin: 2px; + border: 1px solid transparent; +} + +QMenu::icon { + margin: 5px; + border-style: none; +} + +QMenu::right-arrow { + image:url(icons/right_arrow_light.png); +} + +QMenu::item { + color: #c7c7c9; + background-color: #4d4e51; + padding: 2px 30px 2px 30px; + border: 1px solid #4d4e51; /* reserve space for selection border */ +} + +QMenu::item:selected { + color: #1b3774; + background-color: #7cabf9; +} + +QMenu::separator { + height: 1px; + background-color: #6d6e71; + margin-top: 2px; + margin-bottom: 2px; + margin-left: 6px; + margin-right: 6px; +} + +QMenu::indicator:non-exclusive { + color: #c7c7c9; + background-color: #9a9b9e; + border: 1px solid #4d4e51; + width: 11px; + height: 11px; + border-radius:2px; +} + +QMenu::indicator:non-exclusive:checked { + background-color: #3874f2; + border: 1px solid #1b3774; + image:url(icons/checkbox_light.png); +} + +QGroupBox { + color: #4d4e51; + font-weight: bold; + border:1px solid blue; + border-radius: 4px; + margin-top: 20px; + border-color: rgba(0, 0, 0, 20); /* lighter than "QGroupBox" border-color */ + background-color: rgba(255, 255, 255, 15); +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + background-color: transparent; +} + +QAbstractScrollArea { + border-radius: 2px; + border: 1px solid #3A3939; + background-color: transparent; +} + +QAbstractScrollArea::corner { + border: none; + background-color: #85878a; +} + +QScrollBar:horizontal { + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #4d4e51; + border-radius: 4px; + background-color: #4d4e51; +} + +QScrollBar::handle:horizontal { + background-color: #6d6e71; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal { + margin: 1px 3px 0px 3px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/right_arrow_light.png); + width: 6px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 1px 3px 0px 3px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/left_arrow_light.png); + height: 10px; + width: 6px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on { + border-image: url(icons/right_arrow_lighter.png); +} + + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on { + border-image: url(icons/left_arrow_lighter.png); +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal { + background: none; +} + + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + background-color: #4d4e51; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #4d4e51; + border-radius: 4px; +} + +QScrollBar::handle:vertical { + background-color: #6d6e71; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 1px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/up_arrow_light.png); + height: 6px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 1px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/down_arrow_light.png); + height: 6px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on { + border-image: url(icons/up_arrow_lighter.png); +} + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on { + border-image: url(icons/down_arrow_lighter.png); +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + background: none; +} + + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +QTextEdit { + color: #4d4e51; + background-color: #bdc1c9; + border: 1px solid #6d6e71; + padding: 0px; + margin: 0px; +} + +QPlainTextEdit { + color: #4d4e51; + background-color: #bdc1c9; + border-radius: 2px; + border: 1px solid #6d6e71; + padding: 0px; + margin: 0px; +} + +QSizeGrip { + image: url(icons/sizegrip_light.png); + width: 16px; + height: 16px; + background-color: transparent; +} + +QRadioButton::indicator:unchecked{ + color: #4d4e51; + background-color: #9a9b9e; + border: 1px solid #4d4e51; +} + +QRadioButton::indicator:checked { + background-color: #3874f2; + border: 1px solid #1b3774; + image:url(icons/radiobutton_light.png); +} + +QCheckBox, +QRadioButton, +QCheckBox:disabled, +QRadioButton:disabled { + color: #4d4e51; + padding: 3px; + outline: none; + background-color: transparent; +} + +QCheckBox::indicator, +QGroupBox::indicator { + color: #c7c7c9; + background-color: #9a9b9e; + border: 1px solid #4d4e51; +} + +QCheckBox::indicator { + width: 11px; + height: 11px; + border-radius:2px; +} + +QRadioButton::indicator { + width: 11px; + height: 11px; + border-radius: 6px; +} + +QRadioButton::indicator:pressed, +QCheckBox::indicator:pressed, +QCheckBox::indicator:non-exclusive:checked:pressed, +QCheckBox::indicator:indeterminate:pressed, +QCheckBox::indicator:checked:pressed { + border-color: #adc5ed; +} + +QCheckBox::indicator:checked, +QGroupBox::indicator:checked { + background-color: #3874f2; + border: 1px solid #1b3774; + image:url(icons/checkbox_light.png); +} + +QCheckBox::indicator:disabled, +QRadioButton::indicator:disabled { + border: 1px solid #6d6e71; +} + +QCheckBox:disabled, +QRadioButton::indicator:disabled { + color: #6d6e71; + background-color: transparent; +} + +QCheckBox::indicator:disabled, +QGroupBox::indicator:disabled, +QMenu::indicator:non-exclusive:disabled { + background-color: #85878a; +} + +QCheckBox::indicator:indeterminate { + background-color: #3874f2; + border: 1px solid #1b3774; + image: url(icons/checkbox_indeterminate_light.png); +} + +QCheckBox:focus, +QRadioButton:focus { + border: none; +} + +QFrame, +QFrame:pressed, +QFrame:focus, +QFrame:on { + border: 1px solid #85878a; + border-radius: 3px; + padding: 0px; +} + +/* border and background of QComboBox drop-down */ +QComboBox QFrame, +QComboBox QFrame:pressed, +QComboBox QFrame:focus, +QComboBox QFrame:on { + border: 1px solid #4d4e51; + background-color: #4d4e51; + padding: 0px; + margin: 0px; +} + +QFrame[frameShape="0"] { + border-radius: 3px; +} + +QFrame[height="3"], +QFrame[width="3"] { + border-color: transparent; + background-color: transparent; +} + +QFrame[height="3"] { + border-top-color: #6d6e71; +} + +QFrame[width="3"] { + border-left-color: #6d6e71; +} + +QPushButton { + color: #c7c7c9; + text-align: center; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #6d6e71, stop:1 #85878a); + border: 1px solid #4d4e51; + padding: 5px 12px 5px 12px; + margin: 4px 8px 4px 8px; + border-radius: 3px; + min-width: 14px; + min-height: 14px; +} + +QPushButton:hover, +QPushButton:focus { + color: white; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QPushButton:disabled, +QPushButton:disabled:checked { + color: #6d6e71; + background-color: #85878a; + border-color: #6d6e71; +} + +QPushButton:pressed { + background-color: #3874f2; +} + +QPushButton:checked { + background-color: #5e90fa; + border-color: #3874f2; +} + +/* Color Buttons */ +Gui--ColorButton, +Gui--ColorButton:disabled { + border-color: transparent; + background-color: transparent; + height: 24px; + padding: 0px; + margin: 0px; +} + +Gui--ColorButton:hover { + border-color: #797b7f; + background-color: #797b7f; +} + +/* Buttons inside the toolbar */ +QToolBar QPushButton { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #797b7f, stop:1 #85878a); + border: 1px solid #6d6e71; + min-width: 22px; + min-height: 22px; + margin-left: 2px; + margin-right: 2px; + margin-bottom: 3px; /*bigger margin to correctly separate buttons inside a vertical toolbar */ + margin-top: 1px; + padding: 1px; +} + +QToolBar QPushButton:hover, +QToolBar QPushButton:focus { + color: #c7c7c9; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #797b7f, stop:1 #85878a); + border: 1px solid #4d4e51; +} + +QToolBar QPushButton:disabled, +QToolBar QPushButton:disabled:checked { + background-color: #85878a; + border-color: #797b7f; +} + +QToolBar QPushButton:pressed { + background-color: #6d6e71; + border-color: #6d6e71; +} + +QToolBar QPushButton:checked { + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #5e90fa, stop:1 #7cabf9); + border-color: #5e90fa; +} + +QToolBar QPushButton:checked:hover, +QToolBar QPushButton:checked:focus { + color: #c7c7c9; + border: 1px solid #3874f2; +} + +QToolBar { + border: 1px transparent #393838; + background-color: #85878a; + font-weight: bold; + margin: 0px; + padding: 0px; +} + +QToolBar::handle:horizontal { + background-image: url(icons/Hmovetoolbar_dark.png); + width: 10px; + margin: 6px 2px 6px 2px; + background-position: top right; + background-repeat: repeat-y; +} + +QToolBar::handle:vertical { + background-image: url(icons/Vmovetoolbar_dark.png); + height: 10px; + margin: 2px 6px 2px 6px; + background-position: left bottom; + background-repeat: repeat-x; +} + +QToolBar::separator:horizontal { + background-image: url(icons/separtoolbar_dark.png); + width: 10px; + margin: 6px 2px 6px 2px; + background-position: center center; + background-repeat: repeat-y; +} + +QToolBar::separator:vertical { + background-image: url(icons/separtoolbar_dark.png); + height: 10px; + margin: 2px 6px 2px 6px; + background-position: center center; + background-repeat: repeat-x; +} + +QStackedWidget { + background-color: #85878a; + border: 1px transparent #85878a; +} + +QAbstractSpinBox { + color: #c7c7c9; + border: 1px solid #6d6e71; /* border top color defined after QAbstractSpinBox, QLineEdit and QComboBox */ + background-color: #6d6e71; + selection-color: white; + selection-background-color: #5e90fa; +} + +QAbstractSpinBox:disabled { + color: #9a9b9e; + background-color: #797b7f; + border-color: #797b7f; +} + +QAbstractSpinBox:up-button { + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #6f9efa, stop:1 #7cabf9); + subcontrol-origin: border; + subcontrol-position: top right; + border-top-right-radius: 3px; + height: 13px; + width: 20px; +} + +QAbstractSpinBox:down-button { + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #5e90fa, stop:1 #6f9efa); + subcontrol-origin: border; + subcontrol-position: bottom right; + border-bottom-right-radius: 3px; + height: 13px; + width: 20px; +} + +QAbstractSpinBox:up-button:disabled, +QAbstractSpinBox:down-button:disabled { + background-color: transparent; +} + +QAbstractSpinBox::up-arrow { + image: url(icons/up_arrow_light.png); + top: 0px; /* fix simetry between up and down images */ +} + +QAbstractSpinBox::up-arrow:hover { + image: url(icons/up_arrow_lighter.png); +} + +QAbstractSpinBox::up-arrow:off { + image: url(icons/up_arrow_disabled_dark.png); +} + +QAbstractSpinBox::up-arrow:disabled { + image: none; +} + +QAbstractSpinBox::down-arrow { + image: url(icons/down_arrow_light.png); + bottom: -2px; /* fix simetry between up and down images */ +} +QAbstractSpinBox::down-arrow:hover { + image: url(icons/down_arrow_lighter.png); +} + +QAbstractSpinBox::down-arrow:off { + image: url(icons/down_arrow_disabled_dark.png); +} + +QAbstractSpinBox::down-arrow:disabled { + image: none; +} + +QToolBar QAbstractSpinBox { + margin-top: 0px; + margin-bottom: 0px; +} + +QLineEdit { + color: #c7c7c9; + background-color: #6d6e71; + selection-color: white; + selection-background-color: #5e90fa; + /* Padding and margin defined */ + border-style: solid; + border: 1px solid #6d6e71; /* border top color defined after QAbstractSpinBox, QLineEdit and QComboBox */ + border-radius: 3px; +} + +QAbstractSpinBox:focus, +QLineEdit:focus, +QComboBox:focus { + border-color: #7cabf9; +} + +QComboBox { + color: #c7c7c9; + background-color: #6d6e71; + selection-color: white; + selection-background-color: #5e90fa; + border: 1px solid #6d6e71; /* border top color defined after QAbstractSpinBox, QLineEdit and QComboBox */ + border-radius: 3px; +} + +QComboBox:on { + color: white; + background-color: #6d6e71; + border-color: #7cabf9; +} + +QComboBox::drop-down { + subcontrol-origin: margin; + subcontrol-position: top right; + width: 20px; + border-left-width: 1px; + border-left-color: transparent; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #5e90fa, stop:1 #7cabf9); +} + +QComboBox::down-arrow { + image: url(icons/down_arrow_light.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus { + image: url(icons/down_arrow_lighter.png); +} + +QComboBox QAbstractItemView { + color: #c7c7c9; + background-color: #4d4e51; + border-radius: 3px; + margin: 0px; + padding: 0px; + border: none; +} + +/* Common parameters for QAbstractSpinBox, QLineEdit and QComboBox */ +QSpinBox, +QDoubleSpinBox, +QAbstractSpinBox, +QLineEdit, +QComboBox { + border-top-color: #5d5e61; /* Creates an inset effect inside the elements */ + padding: 2px 6px 2px 6px; /* This makes text colour work on QComboBox */ + margin: 0px 2px 0px 2px; + min-width: 70px; /* it was 120 because of QCombobox... */ + border-radius: 3px; +} +/* end Common parameters */ + +QAbstractItemView { + color: #4d4e51; + alternate-background-color: #b3b8bf; /* related with QListView background */ + border: 1px solid #4d4e51; + border-radius: 3px; + padding: 0px; +} + +/* hack to deactivate changing background color when focus (due to QFrame generic transparent color) */ +QAbstractItemView:selected, +QAbstractItemView:on, +QAbstractItemView:focus { + background-color: #bdc1c9; /* same as QTable background color */ +} + +/* hack to hide weird redundant information inside the value of a Placement cell */ +QTreeView QLabel, +QTreeView QLabel:disabled { + color: transparent; + background-color: transparent; + border: none; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QTreeView QLineEdit { + color: #c7c7c9; + border-color: #6d6e71; + background-color: #6d6e71; + selection-color: white; + selection-background-color: #5e90fa; +} + +/* hack to hide non editable cells inside Property values */ +QTreeView QLineEdit:read-only, +QTreeView QLineEdit:disabled, +QTreeView QAbstractSpinBox:read-only, +QTreeView QAbstractSpinBox:disabled { + color: transparent; + border-color: transparent; + background-color: transparent; + selection-color: transparent; + selection-background-color: transparent; +} + +/* hack to disable margin inside Property values to following elements */ +QTreeView QSpinBox, +QTreeView QDoubleSpinBox, +QTreeView QAbstractSpinBox, +QTreeView QLineEdit, +QTreeView QComboBox { + margin-left: 0px; + margin-right: 0px; +} + +/* Pushbutton style for "..." inside Placement cell which launches Placement tool */ +QTreeView QPushButton { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #6d6e71, stop:1 #85878a); + border-top: none; + border-bottom: none; + border-right: none; + border-left: 1px solid #6d6e71; + border-radius: 0px; + margin: 0px; + padding: 0px; + height: 24px; +} + +/* Color Buttons inside the "Properties window" */ +QAbstractItemView Gui--ColorButton { + padding: 0px; + margin: 0px; + height: 10px; +} + +QAbstractItemView QPushButton:hover { + color: white; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QAbstractItemView QPushButton:disabled { + color: transparent; + background-color: transparent; + border-color: transparent; +} + +QLabel { + border: 0px solid #4d4e51; +} + +QTabWidget{ + border: none; +} + +QTabWidget:focus { + border: none; +} + +QTabWidget::pane { + border: none; + padding: 0px; + background-color: #85878a; + position: absolute; + top: -15px; + padding-top: 15px; +} + +QTabWidget::tab-bar { + alignment: center; +} + +QTabBar { + qproperty-drawBase: 0; + left: 5px; + background-color: transparent; +} + +QTabBar:focus { + border: 0px transparent black; +} + +QTabBar::close-button { + padding: 0px; + margin: 0px; + border-radius: 2px; + background-image: url(icons/close_dark.png); + background-position: center center; + background-repeat: none; +} + +QTabBar::close-button:hover { + background-color: #7cabf9; +} + +QTabBar::close-button:pressed { + background-color: #adc5ed; +} + +QTabBar::scroller { /* the width of the scroll buttons */ + width: 20px; +} + +/* the scroll buttons are tool buttons */ +QTabBar QToolButton, +QTabBar QToolButton:hover { + margin-top: 4px; + margin-bottom: 4px; + margin-left: 0px; + margin-right: 0px; + padding: 0px; + border: none; + background-color: #85878a; + border-radius: 0px; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(icons/right_arrow_light.png); +} + +QTabBar QToolButton::right-arrow:disabled, +QTabBar QToolButton::right-arrow:off { + image: url(icons/right_arrow_disabled_dark.png); +} + +QTabBar QToolButton::right-arrow:hover { + image: url(icons/right_arrow_lighter.png); +} + + QTabBar QToolButton::left-arrow:enabled { + image: url(icons/left_arrow_light.png); +} + + QTabBar QToolButton::left-arrow:disabled, + QTabBar QToolButton::left-arrow:off { + image: url(icons/left_arrow_disabled_dark.png); +} + + QTabBar QToolButton::left-arrow:hover { + image: url(icons/left_arrow_lighter.png); +} + + QTabBar QToolButton::up-arrow:enabled { + image: url(icons/up_arrow_light.png); +} + + QTabBar QToolButton::up-arrow:disabled, + QTabBar QToolButton::up-arrow:off { + image: url(icons/up_arrow_disabled_dark.png); +} + + QTabBar QToolButton::up-arrow:hover { + image: url(icons/up_arrow_lighter.png); +} + + QTabBar QToolButton::down-arrow:enabled { + image: url(icons/down_arrow_light.png); +} + + QTabBar QToolButton::down-arrow:disabled, + QTabBar QToolButton::down-arrow:off { + image: url(icons/down_arrow_disabled_dark.png); +} + + QTabBar QToolButton::down-arrow:hover { + image: url(icons/down_arrow_lighter.png); +} + +/* TOP and BOTTOM TABS */ +QTabBar::tab:top, +QTabBar::tab:bottom { + color: #c7c7c9; + border: 1px solid #6d6e71; + border-left-color: #85878a; + border-right-width: 0px; + background-color: #6d6e71; + padding:5px 15px; + margin-top: 4px; + margin-bottom: 4px; + position: center; +} + +QTabBar::tab:top:first, +QTabBar::tab:bottom:first { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +QTabBar::tab:top:last, +QTabBar::tab:bottom:last { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + border-right-width: 1px; +} + +QTabBar::tab:top:selected, +QTabBar::tab:bottom:selected { + color: white; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QTabBar::tab:top:!selected:hover, +QTabBar::tab:bottom:!selected:hover { + color: white; +} + +QTabBar::tab:top:only-one , +QTabBar::tab:bottom:only-one { + border: 1px solid #1b3774; + border-radius: 6px; +} + +/* LEFT and RIGHT TABS */ +QTabBar::tab:left, +QTabBar::tab:right { + color: #c7c7c9; + border: 1px solid #6d6e71; + border-top-color: #85878a; + border-bottom-width: 0px; + background-color: #6d6e71; + padding: 15px 5px; + margin-left: 4px; + margin-right: 4px; + position: center; +} + +QTabBar::tab:left:first, +QTabBar::tab:right:first { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:left:last, +QTabBar::tab:right:last { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-bottom-width: 1px; +} + +QTabBar::tab:left:selected, +QTabBar::tab:right:selected { + color: white; + background-color: qlineargradient(spread:pad, x1:0.545, y1:1, x2:0, y2:1, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QTabBar::tab:left:!selected:hover, +QTabBar::tab:right:!selected:hover { + color: white; +} + +QTabBar::tab:left:only-one , +QTabBar::tab:right:only-one { + border: 1px solid #1b3774; + border-radius: 6px; +} + +QDockWidget { + color: #4d4e51; + border: 1px solid #85878a; + titlebar-close-icon: url(icons/close_dark.png); + titlebar-normal-icon: url(icons/undock_dark.png); +} + +QDockWidget::title { + text-align: center; + background-color: #797b7f; + padding: 4px; + border-radius: 4px; +} + +QDockWidget::close-button, +QDockWidget::float-button { + border: 1px transparent #85878a; + border-radius: 2px; + background: transparent; + subcontrol-origin: padding; + subcontrol-position: right center; +} + +QDockWidget::close-button { + right: 4px; +} + +QDockWidget::float-button { + right: 22px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background: #9a9b9e; +} + +QDockWidget::close-button:pressed, +QDockWidget::float-button:pressed { + /*padding: 1px -1px -1px 1px;*/ + background-color: #797b7f; +} + +QTreeView, +QListView { + color: #4d4e51; + border: 1px solid #85878a; + border-radius: 4px; + background-color: #bdc1c9; /* related with alternate-background-color*/ + selection-color: white; + selection-background-color: #5e90fa; /* should be similar to QListView::item selected background-color */ + show-decoration-selected: 1; /* make the selection span the entire width of the view */ + padding: 0px; + margin: 0px 4px 0px 4px; + min-width: 130px; /* hack to correctly align Preferences icon list */ +} + +QListView, +QListView::item, +QListView QAbstractItemView { + margin: 0px; + icon-size: 20px; /* temporal */ + paint-alternating-row-colors-for-empty-area: 1; + position: absolute; + subcontrol-origin: margin; + subcontrol-position: left top; +} + +/* Control dropdown list margins of QComboBox */ +QComboBox QTreeView, +QComboBox QListView { + margin: 0px; + padding: 0px; +} + +QListView::item { + border: 0px transparent #85878a; + border-radius: 4px; + background-color: transparent; + padding: 0px; + margin: 0px; + display: inline-block; + position: relative; +} + +QListView::item:selected, +QTreeView::item:selected { + color: white; + background-color: #5e90fa; /* should be similar to QListView selection-background-color */ +} + +/* Branch system */ +QTreeView::branch { + background: transparent; +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(icons/branch_vline.png) 0; +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(icons/branch_more.png) 0; +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(icons/branch_end.png) 0; +} + +QTreeView::branch:closed:has-children:has-siblings { + image: url(icons/branch_closed_dark.png); +} + +QTreeView::branch:has-children:!has-siblings:closed { + image: url(icons/branch_closed_dark.png); + border-image: url(icons/branch_end.png) 0; +} + +QTreeView::branch:open:has-children:has-siblings { + image: url(icons/branch_open_dark.png); + border-image: url(icons/branch_more.png) 0; +} + +QTreeView::branch:open:has-children:!has-siblings { + image: url(icons/branch_open_dark.png); + border-image: url(icons/branch_end.png) 0; +} + +QSlider, +QSlider:active, +QSlider:!active { + border: none; + background-color: transparent; +} + +QSlider:horizontal { + padding: 0px 10px; +} + +QSlider:vertical { + padding: 10px 0px; +} + +QSlider::groove:horizontal { + border: 1px solid #6d6e71; + background-color: #6d6e71; + height: 8px; + border-radius: 5px; + margin: 4px 0; +} + +QSlider::groove:vertical { + border: 1px solid #6d6e71; + background-color: #6d6e71; + width: 8px; + border-radius: 5px; + margin: 4px 0; +} + +QSlider::groove:horizontal:disabled, +QSlider::groove:vertical:disabled { + border-color: #797b7f; + background-color: #797b7f; +} + +QSlider::handle:horizontal, +QSlider::handle:vertical { + background-color: #4d4e51; + border: 1px solid #4d4e51; + width: 14px; + height: 14px; + border-radius: 8px; +} + +QSlider::handle:horizontal { + margin: -4px 0; +} + +QSlider::handle:vertical { + margin: 0 -4px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + border-color: #3874f2; + background-color: #3874f2; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + border-color: #1b3774; + background-color: #1b3774; +} + +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + border-color: #6d6e71; + background-color: #85878a; +} + +QToolButton { + color: #c7c7c9; + text-align: center; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #6d6e71, stop:1 #85878a); + border: 1px solid #4d4e51; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; + padding-right: 15px; + margin-top: 5px; + margin-bottom: 5px; + margin-left: 10px; + margin-right: 10px; + border-radius: 3px; + outline: none; +} + +QToolButton:hover, +QToolButton:focus { + color: white; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QToolButton:disabled, +QToolButton:disabled:checked { + color: #6d6e71; + background-color: #85878a; + border-color: #6d6e71; +} + +QToolButton:pressed { + border-color: #7cabf9; +} + +QToolButton:checked { + background-color: #5e90fa; + border-color: #3874f2; +} + +QToolButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: center right; + right: 4px; +} + +/*The "show more" button (it can also be stylable with "QToolBarExtension" */ +QToolButton#qt_toolbar_ext_button { + border-radius: 0px; + margin: 0px; + padding: 0px; + /*background-image: url(icons/more_dark.png);*/ + image: transparent; + background-repeat: none; + background-position: center left; +} + +QToolButton#qt_toolbar_ext_button:hover { + /*background-image: url(icons/more_light.png);*/ + border-color: #797b7f; + background-color: #797b7f; +} + +QToolButton#qt_toolbar_ext_button:on { + /*background-image: url(icons/more_light.png);*/ + border-color: #797b7f; + background-color: #797b7f; +} + +/*Buttons inside the Toolbar*/ +QToolBar QToolButton { + color: #4d4e51; + background-color: #85878a; + border: 1px transparent #85878a; + border-radius: 3px; + margin: 0px; + padding: 2px; +} + +QToolBar QToolButton:disabled { + background-color: #85878a; +} + +QToolBar QToolButton:checked { + color: #1b3774; + background-color: #5e90fa; + border: 1px solid #5e90fa; +} + +QToolBar QToolButton:hover { + background-color: #85878a; +} + +QToolBar QToolButton:pressed, +QToolBar QToolButton::menu-button:pressed { + background-color: #797b7f; + border: 1px solid #797b7f; +} + + +QToolBar QToolButton::menu-indicator:hover, +QToolBar QToolButton::menu-indicator:pressed { + background-color: transparent; +} + +/* the subcontrols below are used only in the MenuButtonPopup mode */ +QToolBar QToolButton::menu-button { + border: 1px transparent #4A4949; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + width: 16px; /* 16px width + 4px for border = 20px allocated above */ + outline: none; + background-color: transparent; +} + +QToolBar QToolButton::menu-button:hover, +QToolBar QToolButton::menu-button:active, +QToolBar QToolButton::menu-button:disabled { + border-color: transparent; + background-color: transparent; +} + +QToolBar QToolButton::menu-arrow { + background-image: url(icons/down_arrow_light.png); + background-position: center center; + background-repeat: none; + subcontrol-origin: padding; + subcontrol-position: bottom right; + height: 10px; /* same as arrow image */ +} + +QToolBar QToolButton::menu-arrow:open { + background-image: url(icons/down_arrow_lighter.png); +} + +QToolBar:tear { + color: blue; + background-color: red; +} + +QTableView { + color: #4d4e51; + border: 1px solid #6d6e71; + gridline-color: #9a9b9e; + background-color: #bdc1c9; + selection-color: #4d4e51; + selection-background-color: #adc5ed; + border-radius: 3px; + padding: 0px; + margin: 0px; +} + +QTableView::item:hover { + background: #abb0b7; +} + +QTableView::item:disabled { + color: #85878a; +} + +QTableView::item:selected { + color: #1b3774; + background-color: #7cabf9; +} + +/* when editing a cell: */ +QTableView QLineEdit { + color: #4d4e51; + background-color: #b3b8bf; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView { + border: none; + background-color: #4d4e51; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView::section { + background-color: transparent; + color: #c7c7c9; + border: 1px solid transparent; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical { + padding: 0px 6px 0px 6px; + border-bottom: 1px solid #6d6e71; +} + +QHeaderView::section::vertical:first { + border-top: 1px solid #6d6e71; +} + +QHeaderView::section::vertical:last { + border-bottom: none; +} + +QHeaderView::section::vertical:only-one { + border: none; +} + +QHeaderView::section::horizontal { + padding: 0px 0px 0px 6px; + border-right: 1px solid #6d6e71; +} + +QHeaderView::section::horizontal:first { + border-left: 1px solid #6d6e71; +} + +QHeaderView::section::horizontal:last { + border-left: none; +} + +QHeaderView::section::horizontal:only-one { + border: none; +} + +QDockWidget QHeaderView::section { + border-width: 6px 1px 6px 1px; /* hack to bigger margin for Model Panel table headers */ +} + +QHeaderView::section:checked { + color: #1b3774; + background-color: #7cabf9; +} + + /* style the sort indicator */ +QHeaderView::down-arrow { + image: url(icons/down_arrow_light.png); +} + +QHeaderView::up-arrow { + image: url(icons/up_arrow_light.png); +} + +QTableCornerButton::section { + background-color: #4d4e51; + border: 1px solid #4d4e51; + border-radius: 0px; +} + +QToolBox { + padding: 3px; + color: #1b3774; + border: none; +} + +QToolBox::tab { /* TODO */ + color: #c7c7c9; + background-color: #6d6e71; + border: 1px transparent #4d4e51; + border-bottom: 1px transparent #6d6e71; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + padding: 5px; +} + +QToolBox::tab:selected { /* italicize selected tabs */ + color: #1b3774; + font: italic; + background-color: #5e90fa; + border-color: #5e90fa; + } + +QStatusBar::item { + color: #c7c7c9; + background-color: #85878a; + border: 1px solid #85878a; + border-radius: 2px; +} + +QSplitter::handle { + background-color: #85878a; + margin: 0px 11px; + padding: 0px; + border-radius: 3px; +} + +QSplitter::handle:vertical { + background-image: url(icons/splitter_horizontal_dark.png); + background-position: center center; + background-repeat: none; + margin: 2px 10px 2px 10px; + height: 2px; +} + +QSplitter::handle:horizontal { + background-image: url(icons/splitter_horizontal_dark.png); + background-position: center center; + background-repeat: none; + margin: 10px 2px 10px 2px; + width: 2px; +} + +QSplitter::handle:horizontal:hover, +QSplitter::handle:vertical:hover { + background-color: #85878a; +} + +/* Similar to the splitter is the following window separator: */ +QMainWindow::separator { + border: 1px solid #85878a; + background-color: #85878a; + background-position: center center; + background-repeat: none; +} + +QMainWindow::separator:hover { + background-color: #85878a; +} + +QMainWindow::separator:horizontal { + height: 4px; + background-image: url(icons/splitter_horizontal_dark.png); +} + +QMainWindow::separator:vertical { + width: 4px; + background-image: url(icons/splitter_vertical_dark.png); +} + +QLabel { + padding-top: 3px; + padding-bottom: 3px; + background-color: transparent; +} + +QLabel:disabled { + color: #6d6e71; + background-color: transparent; +} + +/* Action group */ +QFrame[class="panel"] { + border: none; + background-color: #85878a; +} + +QSint--ActionGroup QFrame[class="header"] { + border: none; + background-color: #4d4e51; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + margin: 0px; + padding: 0px; +} + +QSint--ActionGroup QFrame[class="header"]:hover { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); +} + +QSint--ActionGroup QToolButton[class="header"] { + text-align: left; + font-weight: bold; + color: #c7c7c9; + background-color: transparent; + border: none; + margin: 0px; + padding: 0px; +} + +QSint--ActionGroup QToolButton[class="header"]:hover { + color: white; +} + +QSint--ActionGroup QFrame[class="header"] QLabel { + background-color: transparent; + background-image: url(icons/down_arrow_light.png); + background-repeat: none; + background-position: center center; + padding: 0px; + margin: 0px; +} + +QSint--ActionGroup QFrame[class="header"] QLabel:hover { + background-color: transparent; + background-image: url(icons/down_arrow_lighter.png); +} + +QSint--ActionGroup QFrame[class="header"] QLabel[fold="true"] { + background-color: transparent; + background-image: url(icons/up_arrow_light.png); + background-repeat: none; + background-position: center center; + padding: 0px; + margin: 0px; +} + +QSint--ActionGroup QFrame[class="header"] QLabel[fold="true"]:hover { + background-color: transparent; + background-image: url(icons/up_arrow_lighter.png); +} + +QSint--ActionGroup QFrame[class="content"] { + background-color: #bdc1c9; + margin: 0px; + padding: 0px; + border: none; + border-top-left-radius: 0px; + border-top-right-radius: 0px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +/* HACK +This might not be the best way to reset the background color: */ +QSint--ActionGroup QFrame[class="content"] QWidget { + background-color: transparent; +} + +QSint--ActionGroup QFrame[class="content"] QPushButton { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #6d6e71, stop:1 #85878a); +} + +QSint--ActionGroup QFrame[class="content"] QPushButton:hover, +QSint--ActionGroup QFrame[class="content"] QPushButton:focus { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); +} + +QSint--ActionGroup QFrame[class="content"] QPushButton:disabled, +QSint--ActionGroup QFrame[class="content"] QPushButton:disabled:checked { + color: #bdc1c9; + border-color: #9a9b9e; + background-color: #9a9b9e; +} +QSint--ActionGroup QFrame[class="content"] QPushButton:checked { + background-color: #5e90fa; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox { + background-color: #6d6e71; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox:on { + background-color: #6d6e71; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox QAbstractItemView { + border-color: #4d4e51; + background-color: #4d4e51; +} + +QSint--ActionGroup QFrame[class="content"] QListView { + border-color: #abb0b7; + background-color: #abb0b7; +} + +QSint--ActionGroup QFrame[class="content"] QAbstractSpinBox { + background-color: #6d6e71; +} + +QSint--ActionGroup QFrame[class="content"] QLineEdit { + background-color: #6d6e71; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox:disabled, +QSint--ActionGroup QFrame[class="content"] QAbstractSpinBox:disabled, +QSint--ActionGroup QFrame[class="content"] QLineEdit:disabled { + color: #bdc1c9; + border-color: #9a9b9e; + background-color: #9a9b9e; +} + +QSint--ActionGroup QFrame[class="content"] QCheckBox:disabled, +QSint--ActionGroup QFrame[class="content"] QRadioButton:disabled { + color: #9a9b9e; + border-color: #9a9b9e; +} + +QSint--ActionGroup QFrame[class="content"] QCheckBox::indicator:disabled, +QSint--ActionGroup QFrame[class="content"] QRadioButton::indicator:disabled { + border-color: #9a9b9e; + background-color: transparent; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView { + border: none; + background-color: #4d4e51; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section { + background-color: transparent; + color: #c7c7c9; + border: 1px solid transparent; + border-radius: 0px; + text-align: center; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal { + padding: 6px 0px 6px 6px; + border-right: 1px solid #6d6e71; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal:first { + border-left: 1px solid #85878a; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal:last { + border-left: none; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal:only-one { + border: none; +} +/* enf of HACK */ + +QSint--ActionGroup QToolButton[class="action"], +QSint--ActionGroup QToolButton[class="action"]:enabled { + font-weight: bold; + color: #6d6e71; +} + +QSint--ActionGroup QToolButton[class="action"]:hover, +QSint--ActionGroup QToolButton[class="action"]:enabled:hover { + text-decoration: none; + color: #4d4e51; + background-color: #abb0b7; + border-color: #abb0b7; +} + +QSint--ActionGroup QToolButton[class="action"]:disabled { + color: #85878a; + background-color: #abb0b7; + border-color: #abb0b7; +} + +QSint--ActionGroup QToolButton[class="action"]:focus, +QSint--ActionGroup QToolButton[class="action"]:pressed +QSint--ActionGroup QToolButton[class="action"]:enabled:focus, +QSint--ActionGroup QToolButton[class="action"]:enabled:pressed { + color: white; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QSint--ActionGroup QToolButton[class="action"]:on { + background-color: red; + color: red; +} \ No newline at end of file diff --git a/styles/darkblue/icons/Hmovetoolbar_dark.png b/styles/darkblue/icons/Hmovetoolbar_dark.png new file mode 100644 index 0000000..a408e85 Binary files /dev/null and b/styles/darkblue/icons/Hmovetoolbar_dark.png differ diff --git a/styles/darkblue/icons/Hmovetoolbar_light.png b/styles/darkblue/icons/Hmovetoolbar_light.png new file mode 100644 index 0000000..663b643 Binary files /dev/null and b/styles/darkblue/icons/Hmovetoolbar_light.png differ diff --git a/styles/darkblue/icons/Hsepartoolbar_dark.png b/styles/darkblue/icons/Hsepartoolbar_dark.png new file mode 100644 index 0000000..002fad0 Binary files /dev/null and b/styles/darkblue/icons/Hsepartoolbar_dark.png differ diff --git a/styles/darkblue/icons/Hsepartoolbar_light.png b/styles/darkblue/icons/Hsepartoolbar_light.png new file mode 100644 index 0000000..841f467 Binary files /dev/null and b/styles/darkblue/icons/Hsepartoolbar_light.png differ diff --git a/styles/darkblue/icons/Vmovetoolbar_dark.png b/styles/darkblue/icons/Vmovetoolbar_dark.png new file mode 100644 index 0000000..a73ced8 Binary files /dev/null and b/styles/darkblue/icons/Vmovetoolbar_dark.png differ diff --git a/styles/darkblue/icons/Vmovetoolbar_light.png b/styles/darkblue/icons/Vmovetoolbar_light.png new file mode 100644 index 0000000..7b5130a Binary files /dev/null and b/styles/darkblue/icons/Vmovetoolbar_light.png differ diff --git a/styles/darkblue/icons/Vsepartoolbar_dark.png b/styles/darkblue/icons/Vsepartoolbar_dark.png new file mode 100644 index 0000000..18806c5 Binary files /dev/null and b/styles/darkblue/icons/Vsepartoolbar_dark.png differ diff --git a/styles/darkblue/icons/Vsepartoolbar_light.png b/styles/darkblue/icons/Vsepartoolbar_light.png new file mode 100644 index 0000000..4b62f79 Binary files /dev/null and b/styles/darkblue/icons/Vsepartoolbar_light.png differ diff --git a/styles/darkblue/icons/background_freecad.png b/styles/darkblue/icons/background_freecad.png new file mode 100644 index 0000000..f2c085a Binary files /dev/null and b/styles/darkblue/icons/background_freecad.png differ diff --git a/styles/darkblue/icons/branch_closed_dark.png b/styles/darkblue/icons/branch_closed_dark.png new file mode 100644 index 0000000..c399923 Binary files /dev/null and b/styles/darkblue/icons/branch_closed_dark.png differ diff --git a/styles/darkblue/icons/branch_closed_darker.png b/styles/darkblue/icons/branch_closed_darker.png new file mode 100644 index 0000000..ff8af8b Binary files /dev/null and b/styles/darkblue/icons/branch_closed_darker.png differ diff --git a/styles/darkblue/icons/branch_end.png b/styles/darkblue/icons/branch_end.png new file mode 100644 index 0000000..963a7cb Binary files /dev/null and b/styles/darkblue/icons/branch_end.png differ diff --git a/styles/darkblue/icons/branch_more.png b/styles/darkblue/icons/branch_more.png new file mode 100644 index 0000000..7c534f1 Binary files /dev/null and b/styles/darkblue/icons/branch_more.png differ diff --git a/styles/darkblue/icons/branch_open_dark.png b/styles/darkblue/icons/branch_open_dark.png new file mode 100644 index 0000000..4d04a22 Binary files /dev/null and b/styles/darkblue/icons/branch_open_dark.png differ diff --git a/styles/darkblue/icons/branch_open_darker.png b/styles/darkblue/icons/branch_open_darker.png new file mode 100644 index 0000000..cdbc89e Binary files /dev/null and b/styles/darkblue/icons/branch_open_darker.png differ diff --git a/styles/darkblue/icons/branch_vline.png b/styles/darkblue/icons/branch_vline.png new file mode 100644 index 0000000..b4c9826 Binary files /dev/null and b/styles/darkblue/icons/branch_vline.png differ diff --git a/styles/darkblue/icons/checkbox_indeterminate_light.png b/styles/darkblue/icons/checkbox_indeterminate_light.png new file mode 100644 index 0000000..9d79911 Binary files /dev/null and b/styles/darkblue/icons/checkbox_indeterminate_light.png differ diff --git a/styles/darkblue/icons/checkbox_light.png b/styles/darkblue/icons/checkbox_light.png new file mode 100644 index 0000000..0e8882c Binary files /dev/null and b/styles/darkblue/icons/checkbox_light.png differ diff --git a/styles/darkblue/icons/close_dark.png b/styles/darkblue/icons/close_dark.png new file mode 100644 index 0000000..8771a0b Binary files /dev/null and b/styles/darkblue/icons/close_dark.png differ diff --git a/styles/darkblue/icons/close_light.png b/styles/darkblue/icons/close_light.png new file mode 100644 index 0000000..3e6b9d8 Binary files /dev/null and b/styles/darkblue/icons/close_light.png differ diff --git a/styles/darkblue/icons/down_arrow_dark.png b/styles/darkblue/icons/down_arrow_dark.png new file mode 100644 index 0000000..9fed1f7 Binary files /dev/null and b/styles/darkblue/icons/down_arrow_dark.png differ diff --git a/styles/darkblue/icons/down_arrow_disabled_dark.png b/styles/darkblue/icons/down_arrow_disabled_dark.png new file mode 100644 index 0000000..9be5446 Binary files /dev/null and b/styles/darkblue/icons/down_arrow_disabled_dark.png differ diff --git a/styles/darkblue/icons/down_arrow_disabled_light.png b/styles/darkblue/icons/down_arrow_disabled_light.png new file mode 100644 index 0000000..b5e881a Binary files /dev/null and b/styles/darkblue/icons/down_arrow_disabled_light.png differ diff --git a/styles/darkblue/icons/down_arrow_light.png b/styles/darkblue/icons/down_arrow_light.png new file mode 100644 index 0000000..2168d71 Binary files /dev/null and b/styles/darkblue/icons/down_arrow_light.png differ diff --git a/styles/darkblue/icons/down_arrow_lighter.png b/styles/darkblue/icons/down_arrow_lighter.png new file mode 100644 index 0000000..db46661 Binary files /dev/null and b/styles/darkblue/icons/down_arrow_lighter.png differ diff --git a/styles/darkblue/icons/left_arrow_dark.png b/styles/darkblue/icons/left_arrow_dark.png new file mode 100644 index 0000000..af678ad Binary files /dev/null and b/styles/darkblue/icons/left_arrow_dark.png differ diff --git a/styles/darkblue/icons/left_arrow_disabled_dark.png b/styles/darkblue/icons/left_arrow_disabled_dark.png new file mode 100644 index 0000000..db9da5d Binary files /dev/null and b/styles/darkblue/icons/left_arrow_disabled_dark.png differ diff --git a/styles/darkblue/icons/left_arrow_disabled_light.png b/styles/darkblue/icons/left_arrow_disabled_light.png new file mode 100644 index 0000000..a1b787f Binary files /dev/null and b/styles/darkblue/icons/left_arrow_disabled_light.png differ diff --git a/styles/darkblue/icons/left_arrow_light.png b/styles/darkblue/icons/left_arrow_light.png new file mode 100644 index 0000000..ef222b4 Binary files /dev/null and b/styles/darkblue/icons/left_arrow_light.png differ diff --git a/styles/darkblue/icons/left_arrow_lighter.png b/styles/darkblue/icons/left_arrow_lighter.png new file mode 100644 index 0000000..6bca3a5 Binary files /dev/null and b/styles/darkblue/icons/left_arrow_lighter.png differ diff --git a/styles/darkblue/icons/more_dark.png b/styles/darkblue/icons/more_dark.png new file mode 100644 index 0000000..9bc9002 Binary files /dev/null and b/styles/darkblue/icons/more_dark.png differ diff --git a/styles/darkblue/icons/more_light.png b/styles/darkblue/icons/more_light.png new file mode 100644 index 0000000..6a958cb Binary files /dev/null and b/styles/darkblue/icons/more_light.png differ diff --git a/styles/darkblue/icons/radiobutton_light.png b/styles/darkblue/icons/radiobutton_light.png new file mode 100644 index 0000000..e9a7e24 Binary files /dev/null and b/styles/darkblue/icons/radiobutton_light.png differ diff --git a/styles/darkblue/icons/right_arrow_dark.png b/styles/darkblue/icons/right_arrow_dark.png new file mode 100644 index 0000000..f24e996 Binary files /dev/null and b/styles/darkblue/icons/right_arrow_dark.png differ diff --git a/styles/darkblue/icons/right_arrow_disabled_dark.png b/styles/darkblue/icons/right_arrow_disabled_dark.png new file mode 100644 index 0000000..8972887 Binary files /dev/null and b/styles/darkblue/icons/right_arrow_disabled_dark.png differ diff --git a/styles/darkblue/icons/right_arrow_disabled_light.png b/styles/darkblue/icons/right_arrow_disabled_light.png new file mode 100644 index 0000000..711cf0f Binary files /dev/null and b/styles/darkblue/icons/right_arrow_disabled_light.png differ diff --git a/styles/darkblue/icons/right_arrow_light.png b/styles/darkblue/icons/right_arrow_light.png new file mode 100644 index 0000000..128b9a5 Binary files /dev/null and b/styles/darkblue/icons/right_arrow_light.png differ diff --git a/styles/darkblue/icons/right_arrow_lighter.png b/styles/darkblue/icons/right_arrow_lighter.png new file mode 100644 index 0000000..3d6bcdb Binary files /dev/null and b/styles/darkblue/icons/right_arrow_lighter.png differ diff --git a/styles/darkblue/icons/separtoolbar_dark.png b/styles/darkblue/icons/separtoolbar_dark.png new file mode 100644 index 0000000..cef2199 Binary files /dev/null and b/styles/darkblue/icons/separtoolbar_dark.png differ diff --git a/styles/darkblue/icons/separtoolbar_light.png b/styles/darkblue/icons/separtoolbar_light.png new file mode 100644 index 0000000..0a4d923 Binary files /dev/null and b/styles/darkblue/icons/separtoolbar_light.png differ diff --git a/styles/darkblue/icons/sizegrip_dark.png b/styles/darkblue/icons/sizegrip_dark.png new file mode 100644 index 0000000..0c3de41 Binary files /dev/null and b/styles/darkblue/icons/sizegrip_dark.png differ diff --git a/styles/darkblue/icons/sizegrip_light.png b/styles/darkblue/icons/sizegrip_light.png new file mode 100644 index 0000000..14fd813 Binary files /dev/null and b/styles/darkblue/icons/sizegrip_light.png differ diff --git a/styles/darkblue/icons/splitter_horizontal_dark.png b/styles/darkblue/icons/splitter_horizontal_dark.png new file mode 100644 index 0000000..9d8e673 Binary files /dev/null and b/styles/darkblue/icons/splitter_horizontal_dark.png differ diff --git a/styles/darkblue/icons/splitter_horizontal_light.png b/styles/darkblue/icons/splitter_horizontal_light.png new file mode 100644 index 0000000..217271b Binary files /dev/null and b/styles/darkblue/icons/splitter_horizontal_light.png differ diff --git a/styles/darkblue/icons/splitter_vertical_dark.png b/styles/darkblue/icons/splitter_vertical_dark.png new file mode 100644 index 0000000..b4c30d6 Binary files /dev/null and b/styles/darkblue/icons/splitter_vertical_dark.png differ diff --git a/styles/darkblue/icons/splitter_vertical_light.png b/styles/darkblue/icons/splitter_vertical_light.png new file mode 100644 index 0000000..1473e2b Binary files /dev/null and b/styles/darkblue/icons/splitter_vertical_light.png differ diff --git a/styles/darkblue/icons/transparent.png b/styles/darkblue/icons/transparent.png new file mode 100644 index 0000000..483df25 Binary files /dev/null and b/styles/darkblue/icons/transparent.png differ diff --git a/styles/darkblue/icons/undock_dark.png b/styles/darkblue/icons/undock_dark.png new file mode 100644 index 0000000..01b6785 Binary files /dev/null and b/styles/darkblue/icons/undock_dark.png differ diff --git a/styles/darkblue/icons/undock_light.png b/styles/darkblue/icons/undock_light.png new file mode 100644 index 0000000..36881f6 Binary files /dev/null and b/styles/darkblue/icons/undock_light.png differ diff --git a/styles/darkblue/icons/up_arrow_dark.png b/styles/darkblue/icons/up_arrow_dark.png new file mode 100644 index 0000000..6943e82 Binary files /dev/null and b/styles/darkblue/icons/up_arrow_dark.png differ diff --git a/styles/darkblue/icons/up_arrow_disabled_dark.png b/styles/darkblue/icons/up_arrow_disabled_dark.png new file mode 100644 index 0000000..d21f24c Binary files /dev/null and b/styles/darkblue/icons/up_arrow_disabled_dark.png differ diff --git a/styles/darkblue/icons/up_arrow_disabled_light.png b/styles/darkblue/icons/up_arrow_disabled_light.png new file mode 100644 index 0000000..6a56e89 Binary files /dev/null and b/styles/darkblue/icons/up_arrow_disabled_light.png differ diff --git a/styles/darkblue/icons/up_arrow_light.png b/styles/darkblue/icons/up_arrow_light.png new file mode 100644 index 0000000..4c32b8a Binary files /dev/null and b/styles/darkblue/icons/up_arrow_light.png differ diff --git a/styles/darkblue/icons/up_arrow_lighter.png b/styles/darkblue/icons/up_arrow_lighter.png new file mode 100644 index 0000000..c687416 Binary files /dev/null and b/styles/darkblue/icons/up_arrow_lighter.png differ diff --git a/styles/darkorange/darkorange.qss b/styles/darkorange/darkorange.qss new file mode 100644 index 0000000..c25c1db --- /dev/null +++ b/styles/darkorange/darkorange.qss @@ -0,0 +1,459 @@ +QToolTip +{ + border: 1px solid black; + background-color: #ffa02f; + padding: 1px; + border-radius: 3px; + opacity: 100; +} + +QWidget +{ + color: #b1b1b1; + background-color: #323232; +} + +QWidget:item:hover +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #ca0619); + color: #000000; +} + +QWidget:item:selected +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 1px solid #ffaa00; +} + +QMenuBar::item:pressed +{ + background: #444; + border: 1px solid #000; + background-color: QLinearGradient( + x1:0, y1:0, + x2:0, y2:1, + stop:1 #212121, + stop:0.4 #343434/*, + stop:0.2 #343434, + stop:0.1 #ffaa00*/ + ); + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #000; +} + +QMenu::item +{ + padding: 2px 20px 2px 20px; +} + +QMenu::item:selected +{ + color: #000000; +} + +QWidget:disabled +{ + color: #404040; + background-color: #323232; +} + +QAbstractItemView +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0.1 #646464, stop: 1 #5d5d5d); +} + +QWidget:focus +{ + /*border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a);*/ +} + +QLineEdit +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #4d4d4d, stop: 0 #646464, stop: 1 #5d5d5d); + padding: 1px; + border-style: solid; + border: 1px solid #1e1e1e; + border-radius: 5; +} + +QPushButton +{ + color: #b1b1b1; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-width: 1px; + border-color: #1e1e1e; + border-style: solid; + border-radius: 6; + padding: 3px; + font-size: 12px; + padding-left: 5px; + padding-right: 5px; +} + +QPushButton:pressed +{ + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); +} + +QComboBox +{ + selection-background-color: #ffaa00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-style: solid; + border: 1px solid #1e1e1e; + border-radius: 5; +} + +QComboBox:hover,QPushButton:hover +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + + +QComboBox:on +{ + padding-top: 3px; + padding-left: 4px; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525); + selection-background-color: #ffaa00; +} + +QComboBox QAbstractItemView +{ + border: 2px solid darkgray; + selection-background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; /* just a single line */ + border-top-right-radius: 3px; /* same radius as the QComboBox */ + border-bottom-right-radius: 3px; + } + +QComboBox::down-arrow +{ + image: url(:/down_arrow.png); +} + +QGroupBox:focus +{ +border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QTextEdit:focus +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +QScrollBar:horizontal { + border: 1px solid #222222; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); + height: 7px; + margin: 0px 16px 0 16px; +} + +QScrollBar::handle:horizontal +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); + min-height: 20px; + border-radius: 2px; +} + +QScrollBar::add-line:horizontal { + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); + width: 14px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0 #ffa02f, stop: 1 #d7801a); + width: 14px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::right-arrow:horizontal, QScrollBar::left-arrow:horizontal +{ + border: 1px solid black; + width: 1px; + height: 1px; + background: white; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 1, y2: 0, stop: 0.0 #121212, stop: 0.2 #282828, stop: 1 #484848); + width: 7px; + margin: 16px 0 16px 0; + border: 1px solid #222222; +} + +QScrollBar::handle:vertical +{ + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 0.5 #d7801a, stop: 1 #ffa02f); + min-height: 20px; + border-radius: 2px; +} + +QScrollBar::add-line:vertical +{ + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); + height: 14px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical +{ + border: 1px solid #1b1b19; + border-radius: 2px; + background: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #d7801a, stop: 1 #ffa02f); + height: 14px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + border: 1px solid black; + width: 1px; + height: 1px; + background: white; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #242424; +} + +QPlainTextEdit +{ + background-color: #242424; +} + +QHeaderView::section +{ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565); + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; +} + +QCheckBox:disabled +{ +color: #414141; +} + +QDockWidget::title +{ + text-align: center; + spacing: 3px; /* spacing between items in the tool bar */ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); +} + +QDockWidget::close-button, QDockWidget::float-button +{ + text-align: center; + spacing: 1px; /* spacing between items in the tool bar */ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #323232, stop: 0.5 #242424, stop:1 #323232); +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover +{ + background: #242424; +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed +{ + padding: 1px -1px -1px 1px; +} + +QMainWindow::separator +{ + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + color: white; + padding-left: 4px; + border: 1px solid #4c4c4c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QMainWindow::separator:hover +{ + + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #d7801a, stop:0.5 #b56c17 stop:1 #ffa02f); + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QToolBar::handle +{ + spacing: 3px; /* spacing between items in the tool bar */ + background: url(:/images/handle.png); +} + +QMenu::separator +{ + height: 2px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + +QProgressBar +{ + border: 2px solid grey; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk +{ + background-color: #d7801a; + width: 2.15px; + margin: 0.5px; +} + +QTabBar::tab { + color: #b1b1b1; + border: 1px solid #444; + border-bottom-style: none; + background-color: #323232; + padding-left: 10px; + padding-right: 10px; + padding-top: 3px; + padding-bottom: 2px; + margin-right: -1px; +} + +QTabWidget::pane { + border: 1px solid #444; + top: 1px; +} + +QTabBar::tab:last +{ + margin-right: 0; /* the last selected tab has nothing to overlap with on the right */ + border-top-right-radius: 3px; +} + +QTabBar::tab:first:!selected +{ + margin-left: 0px; /* the last selected tab has nothing to overlap with on the right */ + + + border-top-left-radius: 3px; +} + +QTabBar::tab:!selected +{ + color: #b1b1b1; + border-bottom-style: solid; + margin-top: 3px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:.4 #343434); +} + +QTabBar::tab:selected +{ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + margin-bottom: 0px; +} + +QTabBar::tab:!selected:hover +{ + /*border-top: 2px solid #ffaa00; + padding-bottom: 3px;*/ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:0.4 #343434, stop:0.2 #343434, stop:0.1 #ffaa00); +} + +QRadioButton::indicator:checked, QRadioButton::indicator:unchecked{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; + border-radius: 6px; +} + +QRadioButton::indicator:checked +{ + background-color: qradialgradient( + cx: 0.5, cy: 0.5, + fx: 0.5, fy: 0.5, + radius: 1.0, + stop: 0.25 #ffaa00, + stop: 0.3 #323232 + ); +} + +QCheckBox::indicator{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; + width: 9px; + height: 9px; +} + +QRadioButton::indicator +{ + border-radius: 6px; +} + +QRadioButton::indicator:hover, QCheckBox::indicator:hover +{ + border: 1px solid #ffaa00; +} + +QCheckBox::indicator:checked +{ + image:url(:/images/checkbox.png); +} + +QCheckBox::indicator:disabled, QRadioButton::indicator:disabled +{ + border: 1px solid #444; +} \ No newline at end of file diff --git a/styles/giap/giap.qss b/styles/giap/giap.qss new file mode 100644 index 0000000..e5e653a --- /dev/null +++ b/styles/giap/giap.qss @@ -0,0 +1,598 @@ + +QToolTip +{ + color: black; + background-color: rgb(255, 255, 185); + border-color: rgb(215, 215, 215); + font: 9pt "Segoe UI"; +} + +QWidget +{ + color: white; + background-color: rgb(53, 85, 109); + selection-background-color: white; + selection-color: black; + font: 9pt "Segoe UI"; +} + +QWidget:item:selected +{ + background-color: QLinearGradient( + x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 white, stop: 1 white + ); +} + +QMenuBar +{ + background-color: rgb(53, 85, 109); + color: white; + font: 9pt "Segoe UI"; +} + +QMenuBar::item +{ + background: transparent; + font: 9pt "Segoe UI"; +} + +QMenuBar::item:selected +{ + background: transparent; + color: white; + font: bold; +} + +QMenuBar::item:pressed +{ + /* border: 1px solid #1a2936; */ + background-color: white; + color: black; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #1a2936; + color: white; + font: 8pt "Segoe UI"; +} + +QMenu::item +{ + padding: 3px 20px 3px 30px; +} + +QMenu::item:selected +{ + color: black; +} + +QWidget:disabled +{ + color: #8b8b8b; + background-color: rgb(53, 85, 109); +} +QAbstractItemView +{ + alternate-background-color: #5783a7; + color: white; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 1px; + font: 9pt "Segoe UI"; +} +QWidget:focus, QMenuBar:focus +{ + border: 1px solid rgba(48, 86, 111); +} + +QTabWidget:focus, QCheckBox:focus +{ + border: none; +} + +QLineEdit +{ + border: 2px solid; + border-radius: 4px; + border-color: rgba(38, 60, 78, 255); + border-top-color: qlineargradient(spread:pad, x1:1, y1:0, x2:1, y2:1, stop:0 rgba(26, 44, 60, 255), stop:1 rgba(38, 60, 78, 255)); + background-color: rgba(38, 60, 78, 255); +} + +QGroupBox { + border:1px solid #1a2936; + border-radius: 7px; + margin-top: 2ex; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 10px; + padding-right: 10px; +} + +QScrollBar:horizontal { + background-color: rgb(38, 60, 78); + height: 0.5em; + margin: 0px; + padding: 0px; +} + +QScrollBar::handle:horizontal { + border: 1px solid rgb(38, 60, 78); + background: rgb(53, 85, 109); + min-width: 0.8em; +} + +QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal, +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + width: 0px; + background: transparent; +} + +QScrollBar:vertical { + background-color: rgb(38, 60, 78); + width: 0.5em; + margin: 0; +} + +QScrollBar::handle:vertical { + border: 1px solid rgb(38, 60, 78); + background: rgb(53, 85, 109); + min-height: 0.8em; +} + +QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + height: 0px; + background: transparent; +} + + +QTabBar::tab { +border-top-left-radius: 8px; +border-top-right-radius: 8px; +margin-right: -1px; +padding:2px; +padding-left: 25px; +padding-right: 25px; +height: 20px; +font-weight: bold; +} + +QTabBar::tab:selected { +border-top-left-radius: 8px; +border-top-right-radius: 8px; +border: 1px solid; +border-color: rgb(79, 118, 150); +} + +QTabBar::tab:!selected { +border: 1px solid rgb(90, 135, 172); +border-top-left-radius: 8px; +border-top-right-radius: 8px; +border-left-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); +border-right-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); +border-bottom: 1px solid; +border-bottom-color: rgb(65, 97, 124); +color: rgb(203, 212, 220); +} + +QTabBar::tab:last:!selected { +margin-right: 1px; +border-top-left-radius: 8px; +border-top-right-radius: 8px; +} +QTabWidget::pane { +border-top: 2px solid rgb(79, 118, 150); +border-bottom: 2px solid rgb(79, 118, 150); +} +QTabWidget::tab-bar { +left: 5px; +right: 5px; +} + +QPushButton +{ + color: white; + background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); + border-radius: 5px; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 5px; + padding-right: 5px; + font: 9pt "Segoe UI"; +} + +QPushButton:disabled +{ + background-color: QLinearGradient(x1: 0, y1: 1, x2: 0, y2: 0, stop: 0 rgb(53, 85, 109), stop: 1 #243a4c); + border: 1px solid #243a4c; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 5px; + color: #1a2936; +} + +QPushButton:checked { + background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); + border: solid; + border-width: 2px; + border-color: rgb(65, 97, 124); +} + +QPushButton:pressed +{ + background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); + border: solid; + border-width: 2px; + border-color: rgb(65, 97, 124); +} + + +QComboBox +{ + selection-background-color: white; + background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); + border-style: solid; + border: 1px solid #1a2936; + border-radius: 3px; + padding: 2px; + font: 9pt "Segoe UI"; +} + +QComboBox:on +{ + background-color: #626873; + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView +{ + background-color: #243a4c; + border-radius: 4px; + border: 1px solid #1a2936; + selection-background-color: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 white, stop: 1 white); + padding: 4px 10px 4px 10px; + width: 1.9em; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 1px; + border-left-color: #1a2936; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow +{ + image: url(icons/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ + image: url(icons/down_arrow.png); +} + + +QAbstractSpinBox { + padding-top: 2px; + padding-bottom: 2px; + border: 1px solid #1a2936; + background-color: #243a4c; + color: white; + border-radius: 3px; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: top right; + width: 11px; + background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); + border-top-right-radius: 3px +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 11px; + background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); + border-bottom-right-radius: 3px +} +QHeaderView::section +{ + background-color: #1a2936; + color: white; + padding-left: 4px; + border: 1px solid black; +} + +QCheckBox:disabled +{ + color: #5d5d5d; +} + +QHeaderView::down-arrow, +QAbstractSpinBox::up-arrow, +QAbstractSpinBox::up-arrow:disabled, +QAbstractSpinBox::up-arrow:off +{ + image: url(icons/up_arrow_disabled.png); + width: 6px; + height: 6px; +} + +QHeaderView::down-arrow:hover, +QAbstractSpinBox::up-arrow:hover + +{ + image: url(icons/up_arrow.png); +} + +QHeaderView::down-arrow, +QAbstractSpinBox::down-arrow, +QAbstractSpinBox::down-arrow:disabled, +QAbstractSpinBox::down-arrow:off +{ + image: url(icons/down_arrow_disabled.png); + width: 6px; + height: 6px; +} + +QHeaderView::up-arrow:hover, +QAbstractSpinBox::down-arrow:hover +{ + image: url(icons/down_arrow.png); +} + +QLabel, +QDateEdit::drop-down +{ + border: 0px solid black; +} + + +QDockWidget +{ + color: white; + titlebar-close-icon: url(icons/close.png); + titlebar-normal-icon: url(icons/undock.png); +} + +QDockWidget::title +{ + border: 1px solid #1a2936; + border-bottom: rgb(53, 85, 109); + text-align: left; + spacing: 2px; + background-color: #1a2936; + background-image: none; + padding-left: 10px; +} + +QDockWidget { + border: 1px solid lightgray; + titlebar-close-icon: url(icons/close.png); + titlebar-normal-icon: url(icons/undock.png); +} + +QDockWidget::close-button, +QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 5px; + background: transparent; + icon-size: 10px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background: #1a2936; + color: white +} + +QDockWidget::close-button:pressed, +QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; +} + +QTreeView, +QListView, +QTableView +{ + border: 1px solid #1a2936; + background-color: rgb(53, 85, 109); + color: white; +} + +QTreeView:item +{ + color: white; +} + +QTreeView:item:selected +{ + color: black; +} + + +QTreeView:branch:selected, +QTreeView:branch:hover +{ + background: url(icons/transparent.png); +} + +QTreeView::branch:has-siblings:!adjoins-item +{ + border-image: url(icons/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item +{ + border-image: url(icons/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item +{ + border-image: url(icons/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings +{ + image: url(icons/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings +{ + image: url(icons/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover +{ + image: url(icons/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover +{ + image: url(icons/branch_open-on.png); +} +QSlider::groove:horizontal +{ + border: 1px solid #1a2936; + height: 8px; + background: #243a4c; + margin: 2px 0; + border-radius: 4px; +} + +QSlider::handle:horizontal +{ + background: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #1a2936, stop: 1 rgb(53, 85, 109)); + border: 1px solid #1a2936; + width: 14px; + height: 14px; + margin: -4px 0; + border-radius: 7px; +} + +QSlider::groove:vertical +{ + border: 1px solid #1a2936; + width: 8px; + background: #243a4c; + margin: 0 0px; + border-radius: 4px; +} + +QSlider::handle:vertical +{ + background: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0.0 #1a2936, stop: 1 rgb(53, 85, 109)); + border: 1px solid #1a2936; + width: 14px; + height: 14px; + margin: 0 -4px; + border-radius: 7px; +} + +QToolBar QToolButton +{ + font: 8pt "Segoe UI"; + font-weight: bold; + background-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(90, 135, 172, 255)); + border-radius: 5px; + border: 1px solid rgba(0,0,0,0); +} +QToolBar QToolButton::menu-arrow { + background-image: url(icons/down_arrow_light.png); + background-position: center center; + background-repeat: none; + subcontrol-origin: padding; + subcontrol-position: bottom right; + height: 10px; + border: none; +} + +QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ + padding-right: 10px; /* make way for the popup button */ +} + +QToolBar QToolButton::menu-button { + background-color: transparent; +} + +QToolButton:pressed +{ + background-color: #243a4c; +} +QToolButton:hover +{ + background-color: #243a4c; +} + +QToolButton:checked { + background-color: qlineargradient(spread:pad, x1:1, y1:1, x2:1, y2:0, stop:0 rgba(65, 97, 124, 255), stop:1 rgba(31, 65, 90, 255)); + border: solid; + border-width: 2px; + border-color: rgb(65, 97, 124); +} + +QTableView#tagView +{ + background-color: transparent; +} + +QLabel#inTotalLabel, QLabel#outTotalLabel, QLabel#recordCountLabel +{ + font: bold; + background-color: #243a4c; +} + +QProgressBar:horizontal { + border: 1px solid #1a2936; + text-align: center; + padding: 1px; + background: #243a4c; +} + + +QTextEdit +{ + background-color: rgb(53, 85, 109); + color: white; + border: 1px solid #1a2936; +} + +QPlainTextEdit +{ + background-color: #243a4c; + color: white; + border-radius: 3px; + border: 1px solid #1a2936; +} + +QProgressBar::chunk:horizontal { + background-color: qlineargradient(spread:reflect, x1:1, y1:0.545, x2:1, y2:0, stop:0 rgba(28, 66, 111, 255), stop:1 rgba(37, 87, 146, 255)); +} \ No newline at end of file diff --git a/styles/giap/icons/Hmovetoolbar.png b/styles/giap/icons/Hmovetoolbar.png new file mode 100644 index 0000000..520c3aa Binary files /dev/null and b/styles/giap/icons/Hmovetoolbar.png differ diff --git a/styles/giap/icons/Hsepartoolbar.png b/styles/giap/icons/Hsepartoolbar.png new file mode 100644 index 0000000..401bfb4 Binary files /dev/null and b/styles/giap/icons/Hsepartoolbar.png differ diff --git a/styles/giap/icons/Vmovetoolbar.png b/styles/giap/icons/Vmovetoolbar.png new file mode 100644 index 0000000..512edce Binary files /dev/null and b/styles/giap/icons/Vmovetoolbar.png differ diff --git a/styles/giap/icons/Vsepartoolbar.png b/styles/giap/icons/Vsepartoolbar.png new file mode 100644 index 0000000..d9dc156 Binary files /dev/null and b/styles/giap/icons/Vsepartoolbar.png differ diff --git a/styles/giap/icons/branch_closed-on.png b/styles/giap/icons/branch_closed-on.png new file mode 100644 index 0000000..d081e9b Binary files /dev/null and b/styles/giap/icons/branch_closed-on.png differ diff --git a/styles/giap/icons/branch_closed.png b/styles/giap/icons/branch_closed.png new file mode 100644 index 0000000..d652159 Binary files /dev/null and b/styles/giap/icons/branch_closed.png differ diff --git a/styles/giap/icons/branch_open-on.png b/styles/giap/icons/branch_open-on.png new file mode 100644 index 0000000..ec372b2 Binary files /dev/null and b/styles/giap/icons/branch_open-on.png differ diff --git a/styles/giap/icons/branch_open.png b/styles/giap/icons/branch_open.png new file mode 100644 index 0000000..66f8e1a Binary files /dev/null and b/styles/giap/icons/branch_open.png differ diff --git a/styles/giap/icons/checkbox.png b/styles/giap/icons/checkbox.png new file mode 100644 index 0000000..b4a9aa3 Binary files /dev/null and b/styles/giap/icons/checkbox.png differ diff --git a/styles/giap/icons/close.png b/styles/giap/icons/close.png new file mode 100644 index 0000000..ffdec9a Binary files /dev/null and b/styles/giap/icons/close.png differ diff --git a/styles/giap/icons/down_arrow.png b/styles/giap/icons/down_arrow.png new file mode 100644 index 0000000..e271f7f Binary files /dev/null and b/styles/giap/icons/down_arrow.png differ diff --git a/styles/giap/icons/down_arrow_disabled.png b/styles/giap/icons/down_arrow_disabled.png new file mode 100644 index 0000000..5805d98 Binary files /dev/null and b/styles/giap/icons/down_arrow_disabled.png differ diff --git a/styles/giap/icons/down_arrow_light.png b/styles/giap/icons/down_arrow_light.png new file mode 100644 index 0000000..2168d71 Binary files /dev/null and b/styles/giap/icons/down_arrow_light.png differ diff --git a/styles/giap/icons/down_arrow_lighter.png b/styles/giap/icons/down_arrow_lighter.png new file mode 100644 index 0000000..db46661 Binary files /dev/null and b/styles/giap/icons/down_arrow_lighter.png differ diff --git a/styles/giap/icons/left_arrow.png b/styles/giap/icons/left_arrow.png new file mode 100644 index 0000000..f808d2d Binary files /dev/null and b/styles/giap/icons/left_arrow.png differ diff --git a/styles/giap/icons/left_arrow_disabled.png b/styles/giap/icons/left_arrow_disabled.png new file mode 100644 index 0000000..f5b9af8 Binary files /dev/null and b/styles/giap/icons/left_arrow_disabled.png differ diff --git a/styles/giap/icons/right_arrow.png b/styles/giap/icons/right_arrow.png new file mode 100644 index 0000000..9b0a4e6 Binary files /dev/null and b/styles/giap/icons/right_arrow.png differ diff --git a/styles/giap/icons/right_arrow_disabled.png b/styles/giap/icons/right_arrow_disabled.png new file mode 100644 index 0000000..5c0bee4 Binary files /dev/null and b/styles/giap/icons/right_arrow_disabled.png differ diff --git a/styles/giap/icons/sizegrip.png b/styles/giap/icons/sizegrip.png new file mode 100644 index 0000000..350583a Binary files /dev/null and b/styles/giap/icons/sizegrip.png differ diff --git a/styles/giap/icons/stylesheet-branch-end.png b/styles/giap/icons/stylesheet-branch-end.png new file mode 100644 index 0000000..cb5d3b5 Binary files /dev/null and b/styles/giap/icons/stylesheet-branch-end.png differ diff --git a/styles/giap/icons/stylesheet-branch-more.png b/styles/giap/icons/stylesheet-branch-more.png new file mode 100644 index 0000000..6271140 Binary files /dev/null and b/styles/giap/icons/stylesheet-branch-more.png differ diff --git a/styles/giap/icons/stylesheet-vline.png b/styles/giap/icons/stylesheet-vline.png new file mode 100644 index 0000000..87536cc Binary files /dev/null and b/styles/giap/icons/stylesheet-vline.png differ diff --git a/styles/giap/icons/transparent.png b/styles/giap/icons/transparent.png new file mode 100644 index 0000000..483df25 Binary files /dev/null and b/styles/giap/icons/transparent.png differ diff --git a/styles/giap/icons/undock.png b/styles/giap/icons/undock.png new file mode 100644 index 0000000..804547a Binary files /dev/null and b/styles/giap/icons/undock.png differ diff --git a/styles/giap/icons/up_arrow.png b/styles/giap/icons/up_arrow.png new file mode 100644 index 0000000..abcc724 Binary files /dev/null and b/styles/giap/icons/up_arrow.png differ diff --git a/styles/giap/icons/up_arrow_disabled.png b/styles/giap/icons/up_arrow_disabled.png new file mode 100644 index 0000000..b9c8e3b Binary files /dev/null and b/styles/giap/icons/up_arrow_disabled.png differ diff --git a/styles/lightblue/icons/Hmovetoolbar_dark.png b/styles/lightblue/icons/Hmovetoolbar_dark.png new file mode 100644 index 0000000..a408e85 Binary files /dev/null and b/styles/lightblue/icons/Hmovetoolbar_dark.png differ diff --git a/styles/lightblue/icons/Hmovetoolbar_light.png b/styles/lightblue/icons/Hmovetoolbar_light.png new file mode 100644 index 0000000..663b643 Binary files /dev/null and b/styles/lightblue/icons/Hmovetoolbar_light.png differ diff --git a/styles/lightblue/icons/Hsepartoolbar_dark.png b/styles/lightblue/icons/Hsepartoolbar_dark.png new file mode 100644 index 0000000..002fad0 Binary files /dev/null and b/styles/lightblue/icons/Hsepartoolbar_dark.png differ diff --git a/styles/lightblue/icons/Hsepartoolbar_light.png b/styles/lightblue/icons/Hsepartoolbar_light.png new file mode 100644 index 0000000..841f467 Binary files /dev/null and b/styles/lightblue/icons/Hsepartoolbar_light.png differ diff --git a/styles/lightblue/icons/Vmovetoolbar_dark.png b/styles/lightblue/icons/Vmovetoolbar_dark.png new file mode 100644 index 0000000..a73ced8 Binary files /dev/null and b/styles/lightblue/icons/Vmovetoolbar_dark.png differ diff --git a/styles/lightblue/icons/Vmovetoolbar_light.png b/styles/lightblue/icons/Vmovetoolbar_light.png new file mode 100644 index 0000000..7b5130a Binary files /dev/null and b/styles/lightblue/icons/Vmovetoolbar_light.png differ diff --git a/styles/lightblue/icons/Vsepartoolbar_dark.png b/styles/lightblue/icons/Vsepartoolbar_dark.png new file mode 100644 index 0000000..18806c5 Binary files /dev/null and b/styles/lightblue/icons/Vsepartoolbar_dark.png differ diff --git a/styles/lightblue/icons/Vsepartoolbar_light.png b/styles/lightblue/icons/Vsepartoolbar_light.png new file mode 100644 index 0000000..4b62f79 Binary files /dev/null and b/styles/lightblue/icons/Vsepartoolbar_light.png differ diff --git a/styles/lightblue/icons/background_freecad.png b/styles/lightblue/icons/background_freecad.png new file mode 100644 index 0000000..f2c085a Binary files /dev/null and b/styles/lightblue/icons/background_freecad.png differ diff --git a/styles/lightblue/icons/branch_closed_dark.png b/styles/lightblue/icons/branch_closed_dark.png new file mode 100644 index 0000000..c399923 Binary files /dev/null and b/styles/lightblue/icons/branch_closed_dark.png differ diff --git a/styles/lightblue/icons/branch_closed_darker.png b/styles/lightblue/icons/branch_closed_darker.png new file mode 100644 index 0000000..ff8af8b Binary files /dev/null and b/styles/lightblue/icons/branch_closed_darker.png differ diff --git a/styles/lightblue/icons/branch_end.png b/styles/lightblue/icons/branch_end.png new file mode 100644 index 0000000..963a7cb Binary files /dev/null and b/styles/lightblue/icons/branch_end.png differ diff --git a/styles/lightblue/icons/branch_more.png b/styles/lightblue/icons/branch_more.png new file mode 100644 index 0000000..7c534f1 Binary files /dev/null and b/styles/lightblue/icons/branch_more.png differ diff --git a/styles/lightblue/icons/branch_open_dark.png b/styles/lightblue/icons/branch_open_dark.png new file mode 100644 index 0000000..4d04a22 Binary files /dev/null and b/styles/lightblue/icons/branch_open_dark.png differ diff --git a/styles/lightblue/icons/branch_open_darker.png b/styles/lightblue/icons/branch_open_darker.png new file mode 100644 index 0000000..cdbc89e Binary files /dev/null and b/styles/lightblue/icons/branch_open_darker.png differ diff --git a/styles/lightblue/icons/branch_vline.png b/styles/lightblue/icons/branch_vline.png new file mode 100644 index 0000000..b4c9826 Binary files /dev/null and b/styles/lightblue/icons/branch_vline.png differ diff --git a/styles/lightblue/icons/checkbox_indeterminate_light.png b/styles/lightblue/icons/checkbox_indeterminate_light.png new file mode 100644 index 0000000..9d79911 Binary files /dev/null and b/styles/lightblue/icons/checkbox_indeterminate_light.png differ diff --git a/styles/lightblue/icons/checkbox_light.png b/styles/lightblue/icons/checkbox_light.png new file mode 100644 index 0000000..0e8882c Binary files /dev/null and b/styles/lightblue/icons/checkbox_light.png differ diff --git a/styles/lightblue/icons/close_dark.png b/styles/lightblue/icons/close_dark.png new file mode 100644 index 0000000..8771a0b Binary files /dev/null and b/styles/lightblue/icons/close_dark.png differ diff --git a/styles/lightblue/icons/close_light.png b/styles/lightblue/icons/close_light.png new file mode 100644 index 0000000..3e6b9d8 Binary files /dev/null and b/styles/lightblue/icons/close_light.png differ diff --git a/styles/lightblue/icons/down_arrow_dark.png b/styles/lightblue/icons/down_arrow_dark.png new file mode 100644 index 0000000..9fed1f7 Binary files /dev/null and b/styles/lightblue/icons/down_arrow_dark.png differ diff --git a/styles/lightblue/icons/down_arrow_disabled_dark.png b/styles/lightblue/icons/down_arrow_disabled_dark.png new file mode 100644 index 0000000..9be5446 Binary files /dev/null and b/styles/lightblue/icons/down_arrow_disabled_dark.png differ diff --git a/styles/lightblue/icons/down_arrow_disabled_light.png b/styles/lightblue/icons/down_arrow_disabled_light.png new file mode 100644 index 0000000..b5e881a Binary files /dev/null and b/styles/lightblue/icons/down_arrow_disabled_light.png differ diff --git a/styles/lightblue/icons/down_arrow_light.png b/styles/lightblue/icons/down_arrow_light.png new file mode 100644 index 0000000..2168d71 Binary files /dev/null and b/styles/lightblue/icons/down_arrow_light.png differ diff --git a/styles/lightblue/icons/down_arrow_lighter.png b/styles/lightblue/icons/down_arrow_lighter.png new file mode 100644 index 0000000..db46661 Binary files /dev/null and b/styles/lightblue/icons/down_arrow_lighter.png differ diff --git a/styles/lightblue/icons/left_arrow_dark.png b/styles/lightblue/icons/left_arrow_dark.png new file mode 100644 index 0000000..af678ad Binary files /dev/null and b/styles/lightblue/icons/left_arrow_dark.png differ diff --git a/styles/lightblue/icons/left_arrow_disabled_dark.png b/styles/lightblue/icons/left_arrow_disabled_dark.png new file mode 100644 index 0000000..db9da5d Binary files /dev/null and b/styles/lightblue/icons/left_arrow_disabled_dark.png differ diff --git a/styles/lightblue/icons/left_arrow_disabled_light.png b/styles/lightblue/icons/left_arrow_disabled_light.png new file mode 100644 index 0000000..a1b787f Binary files /dev/null and b/styles/lightblue/icons/left_arrow_disabled_light.png differ diff --git a/styles/lightblue/icons/left_arrow_light.png b/styles/lightblue/icons/left_arrow_light.png new file mode 100644 index 0000000..ef222b4 Binary files /dev/null and b/styles/lightblue/icons/left_arrow_light.png differ diff --git a/styles/lightblue/icons/left_arrow_lighter.png b/styles/lightblue/icons/left_arrow_lighter.png new file mode 100644 index 0000000..6bca3a5 Binary files /dev/null and b/styles/lightblue/icons/left_arrow_lighter.png differ diff --git a/styles/lightblue/icons/more_dark.png b/styles/lightblue/icons/more_dark.png new file mode 100644 index 0000000..9bc9002 Binary files /dev/null and b/styles/lightblue/icons/more_dark.png differ diff --git a/styles/lightblue/icons/more_light.png b/styles/lightblue/icons/more_light.png new file mode 100644 index 0000000..6a958cb Binary files /dev/null and b/styles/lightblue/icons/more_light.png differ diff --git a/styles/lightblue/icons/radiobutton_light.png b/styles/lightblue/icons/radiobutton_light.png new file mode 100644 index 0000000..e9a7e24 Binary files /dev/null and b/styles/lightblue/icons/radiobutton_light.png differ diff --git a/styles/lightblue/icons/right_arrow_dark.png b/styles/lightblue/icons/right_arrow_dark.png new file mode 100644 index 0000000..f24e996 Binary files /dev/null and b/styles/lightblue/icons/right_arrow_dark.png differ diff --git a/styles/lightblue/icons/right_arrow_disabled_dark.png b/styles/lightblue/icons/right_arrow_disabled_dark.png new file mode 100644 index 0000000..8972887 Binary files /dev/null and b/styles/lightblue/icons/right_arrow_disabled_dark.png differ diff --git a/styles/lightblue/icons/right_arrow_disabled_light.png b/styles/lightblue/icons/right_arrow_disabled_light.png new file mode 100644 index 0000000..711cf0f Binary files /dev/null and b/styles/lightblue/icons/right_arrow_disabled_light.png differ diff --git a/styles/lightblue/icons/right_arrow_light.png b/styles/lightblue/icons/right_arrow_light.png new file mode 100644 index 0000000..128b9a5 Binary files /dev/null and b/styles/lightblue/icons/right_arrow_light.png differ diff --git a/styles/lightblue/icons/right_arrow_lighter.png b/styles/lightblue/icons/right_arrow_lighter.png new file mode 100644 index 0000000..3d6bcdb Binary files /dev/null and b/styles/lightblue/icons/right_arrow_lighter.png differ diff --git a/styles/lightblue/icons/separtoolbar_dark.png b/styles/lightblue/icons/separtoolbar_dark.png new file mode 100644 index 0000000..cef2199 Binary files /dev/null and b/styles/lightblue/icons/separtoolbar_dark.png differ diff --git a/styles/lightblue/icons/separtoolbar_light.png b/styles/lightblue/icons/separtoolbar_light.png new file mode 100644 index 0000000..0a4d923 Binary files /dev/null and b/styles/lightblue/icons/separtoolbar_light.png differ diff --git a/styles/lightblue/icons/sizegrip_dark.png b/styles/lightblue/icons/sizegrip_dark.png new file mode 100644 index 0000000..0c3de41 Binary files /dev/null and b/styles/lightblue/icons/sizegrip_dark.png differ diff --git a/styles/lightblue/icons/sizegrip_light.png b/styles/lightblue/icons/sizegrip_light.png new file mode 100644 index 0000000..14fd813 Binary files /dev/null and b/styles/lightblue/icons/sizegrip_light.png differ diff --git a/styles/lightblue/icons/splitter_horizontal_dark.png b/styles/lightblue/icons/splitter_horizontal_dark.png new file mode 100644 index 0000000..9d8e673 Binary files /dev/null and b/styles/lightblue/icons/splitter_horizontal_dark.png differ diff --git a/styles/lightblue/icons/splitter_horizontal_light.png b/styles/lightblue/icons/splitter_horizontal_light.png new file mode 100644 index 0000000..217271b Binary files /dev/null and b/styles/lightblue/icons/splitter_horizontal_light.png differ diff --git a/styles/lightblue/icons/splitter_vertical_dark.png b/styles/lightblue/icons/splitter_vertical_dark.png new file mode 100644 index 0000000..b4c30d6 Binary files /dev/null and b/styles/lightblue/icons/splitter_vertical_dark.png differ diff --git a/styles/lightblue/icons/splitter_vertical_light.png b/styles/lightblue/icons/splitter_vertical_light.png new file mode 100644 index 0000000..1473e2b Binary files /dev/null and b/styles/lightblue/icons/splitter_vertical_light.png differ diff --git a/styles/lightblue/icons/transparent.png b/styles/lightblue/icons/transparent.png new file mode 100644 index 0000000..483df25 Binary files /dev/null and b/styles/lightblue/icons/transparent.png differ diff --git a/styles/lightblue/icons/undock_dark.png b/styles/lightblue/icons/undock_dark.png new file mode 100644 index 0000000..01b6785 Binary files /dev/null and b/styles/lightblue/icons/undock_dark.png differ diff --git a/styles/lightblue/icons/undock_light.png b/styles/lightblue/icons/undock_light.png new file mode 100644 index 0000000..36881f6 Binary files /dev/null and b/styles/lightblue/icons/undock_light.png differ diff --git a/styles/lightblue/icons/up_arrow_dark.png b/styles/lightblue/icons/up_arrow_dark.png new file mode 100644 index 0000000..6943e82 Binary files /dev/null and b/styles/lightblue/icons/up_arrow_dark.png differ diff --git a/styles/lightblue/icons/up_arrow_disabled_dark.png b/styles/lightblue/icons/up_arrow_disabled_dark.png new file mode 100644 index 0000000..d21f24c Binary files /dev/null and b/styles/lightblue/icons/up_arrow_disabled_dark.png differ diff --git a/styles/lightblue/icons/up_arrow_disabled_light.png b/styles/lightblue/icons/up_arrow_disabled_light.png new file mode 100644 index 0000000..6a56e89 Binary files /dev/null and b/styles/lightblue/icons/up_arrow_disabled_light.png differ diff --git a/styles/lightblue/icons/up_arrow_light.png b/styles/lightblue/icons/up_arrow_light.png new file mode 100644 index 0000000..4c32b8a Binary files /dev/null and b/styles/lightblue/icons/up_arrow_light.png differ diff --git a/styles/lightblue/icons/up_arrow_lighter.png b/styles/lightblue/icons/up_arrow_lighter.png new file mode 100644 index 0000000..c687416 Binary files /dev/null and b/styles/lightblue/icons/up_arrow_lighter.png differ diff --git a/styles/lightblue/ligthtblue b/styles/lightblue/ligthtblue new file mode 100644 index 0000000..85cae15 --- /dev/null +++ b/styles/lightblue/ligthtblue @@ -0,0 +1,1795 @@ +/* +ABOUT +=========================================================== +version 1.7a +QT theme (stylesheet) specially developed for FreeCAD (http://www.freecadweb.org/). +It might work with other software that uses QT styling. + + +LICENSE +=========================================================== +Copyright (c) 2015 Pablo Gil Fernández +The stylesheet barely uses code from Colin Duquesnoy "generic QT stylesheet" + +This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. +To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. + + + +CUSTOMIZATION +=========================================================== +If you would like to change the overall look/style of the theme, just find and replace following colors in the whole file: + background darker = #828282 + background dark and slighly darker = #a2a2a0 + background dark = #b6b6b6 + background normal and slighly darker = #e0e0e0 + background normal = #e6e6e6 + background light = #f5f5f5 + background lighter = #ffffff + + lists background = #bdc1c9 + lists background (alternate) = #b3b8bf + lists backgrounds selection = #abb0b7 + + foreground = black + + selection darker = #1b3774 + selection dark = #3874f2 + selection normal = #5e90fa + selection inbetween normal and light = #6f9efa (used to build SpinBoxes) + selection light = #7cabf9 + selection lighter = #adc5ed + +*/ + +/* RESET EVERYTHING */ +QAbstractScrollArea,QCheckBox,QColumnView,QComboBox,QDateEdit,QDateTimeEdit,QDialog,QDialogButtonBox,QDockWidget,QDoubleSpinBox,QFrame,QGroupBox,QHeaderView,QLabel,QLineEdit,QListView,QListWidget,QMainWindow,QMenu,QMenuBar,QMessageBox,QProgressBar,QPushButton,QRadioButton,QScrollBar,QSizeGrip,QSlider,QSpinBox,QSplitter,QStatusBar,QTabBar,QTabWidget,QTableView,QTableWidget,QTextEdit,QTimeEdit,QToolBar,QToolButton,QToolBox,QToolTip,QTreeView,QTreeWidget,QWidget { + padding: 0px; + margin: 0px; + border: 0px; + border-style: none; + background-color: #e6e6e6; /* set with default background color */ +} + +QMdiArea[showImage="true"] { + background-image: url(icons/background_freecad.png); + background-position: center; + background-repeat: no-repeat; +} + +QProgressBar, +QProgressBar:horizontal { + background: #bdc1c9; + border: 1px solid #b6b6b6; + text-align: center; + padding: 1px; + border-radius: 4px; +} +QProgressBar::chunk, +QProgressBar::chunk:horizontal { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-radius: 3px; +} + +QToolTip { + background-color: #828282; + color: black; + padding: 4px; + border-radius: 4px; +} + +QWidget { + color: #828282; + background-color: #e6e6e6; + background-clip: border; + border-image: none; + outline: 0; +} + +QWidget:focus { + border: 1px solid #828282; +} + +QWidget:disabled { + color: #f5f5f5; + background-color: #828282; /* same as QMenu background-color */ +} + +QMenuBar { + color: #ffffff; + background-color: #e0e0e0; +} + +QMenuBar::item { + background-color: #e0e0e0; +} + +QMenuBar::item:selected { + color: #1b3774; + border: 1px solid #5e90fa; + background-color: #5e90fa; +} + +QMenuBar::item:pressed { + color: #1b3774; + border: 1px solid #7cabf9; + background-color: #7cabf9; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu { + color: #ffffff; + background-color: #828282; + margin: 2px; + border: 1px solid transparent; +} + +QMenu::icon { + margin: 5px; + border-style: none; +} + +QMenu::right-arrow { + image:url(icons/right_arrow_light.png); +} + +QMenu::item { + color: #ffffff; + background-color: #828282; + padding: 2px 30px 2px 30px; + border: 1px solid #828282; /* reserve space for selection border */ +} + +QMenu::item:selected { + color: #1b3774; + background-color: #7cabf9; +} + +QMenu::separator { + height: 1px; + background-color: #b6b6b6; + margin-top: 2px; + margin-bottom: 2px; + margin-left: 6px; + margin-right: 6px; +} + +QMenu::indicator:non-exclusive { + color: #ffffff; + background-color: #f5f5f5; + border: 1px solid #828282; + width: 11px; + height: 11px; + border-radius:2px; +} + +QMenu::indicator:non-exclusive:checked { + background-color: #3874f2; + border: 1px solid #1b3774; + image:url(icons/checkbox_light.png); +} + +QGroupBox { + color: #828282; + font-weight: bold; + border:1px solid blue; + border-radius: 4px; + margin-top: 20px; + border-color: rgba(0, 0, 0, 20); /* lighter than "QGroupBox" border-color */ + background-color: rgba(255, 255, 255, 15); +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + background-color: transparent; +} + +QAbstractScrollArea { + border-radius: 2px; + border: 1px solid #3A3939; + background-color: transparent; +} + +QAbstractScrollArea::corner { + border: none; + background-color: #e6e6e6; +} + +QScrollBar:horizontal { + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #828282; + border-radius: 4px; + background-color: #828282; +} + +QScrollBar::handle:horizontal { + background-color: #b6b6b6; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal { + margin: 1px 3px 0px 3px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/right_arrow_light.png); + width: 6px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 1px 3px 0px 3px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/left_arrow_light.png); + height: 10px; + width: 6px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, +QScrollBar::add-line:horizontal:on { + border-image: url(icons/right_arrow_lighter.png); +} + + +QScrollBar::sub-line:horizontal:hover, +QScrollBar::sub-line:horizontal:on { + border-image: url(icons/left_arrow_lighter.png); +} + +QScrollBar::up-arrow:horizontal, +QScrollBar::down-arrow:horizontal { + background: none; +} + + +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + background-color: #828282; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #828282; + border-radius: 4px; +} + +QScrollBar::handle:vertical { + background-color: #b6b6b6; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 1px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/up_arrow_light.png); + height: 6px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 1px; /* 1px to correctly fit the 10px width image */ + border-image: url(icons/down_arrow_light.png); + height: 6px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, +QScrollBar::sub-line:vertical:on { + border-image: url(icons/up_arrow_lighter.png); +} + +QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:vertical:on { + border-image: url(icons/down_arrow_lighter.png); +} + +QScrollBar::up-arrow:vertical, +QScrollBar::down-arrow:vertical { + background: none; +} + + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +QTextEdit { + color: #828282; + background-color: #bdc1c9; + border: 1px solid #b6b6b6; + padding: 0px; + margin: 0px; +} + +QPlainTextEdit { + color: #828282; + background-color: #bdc1c9; + border-radius: 2px; + border: 1px solid #b6b6b6; + padding: 0px; + margin: 0px; +} + +QSizeGrip { + image: url(icons/sizegrip_light.png); + width: 16px; + height: 16px; + background-color: transparent; +} + +QRadioButton::indicator:unchecked{ + color: #828282; + background-color: #f5f5f5; + border: 1px solid #828282; +} + +QRadioButton::indicator:checked { + background-color: #3874f2; + border: 1px solid #1b3774; + image:url(icons/radiobutton_light.png); +} + +QCheckBox, +QRadioButton, +QCheckBox:disabled, +QRadioButton:disabled { + color: #828282; + padding: 3px; + outline: none; + background-color: transparent; +} + +QCheckBox::indicator, +QGroupBox::indicator { + color: #ffffff; + background-color: #f5f5f5; + border: 1px solid #828282; +} + +QCheckBox::indicator { + width: 11px; + height: 11px; + border-radius:2px; +} + +QRadioButton::indicator { + width: 11px; + height: 11px; + border-radius: 6px; +} + +QRadioButton::indicator:pressed, +QCheckBox::indicator:pressed, +QCheckBox::indicator:non-exclusive:checked:pressed, +QCheckBox::indicator:indeterminate:pressed, +QCheckBox::indicator:checked:pressed { + border-color: #adc5ed; +} + +QCheckBox::indicator:checked, +QGroupBox::indicator:checked { + background-color: #3874f2; + border: 1px solid #1b3774; + image:url(icons/checkbox_light.png); +} + +QCheckBox::indicator:disabled, +QRadioButton::indicator:disabled { + border: 1px solid #b6b6b6; +} + +QCheckBox:disabled, +QRadioButton::indicator:disabled { + color: #b6b6b6; + background-color: transparent; +} + +QCheckBox::indicator:disabled, +QGroupBox::indicator:disabled, +QMenu::indicator:non-exclusive:disabled { + background-color: #e6e6e6; +} + +QCheckBox::indicator:indeterminate { + background-color: #3874f2; + border: 1px solid #1b3774; + image: url(icons/checkbox_indeterminate_light.png); +} + +QCheckBox:focus, +QRadioButton:focus { + border: none; +} + +QFrame, +QFrame:pressed, +QFrame:focus, +QFrame:on { + border: 1px solid #e6e6e6; + border-radius: 3px; + padding: 0px; +} + +/* border and background of QComboBox drop-down */ +QComboBox QFrame, +QComboBox QFrame:pressed, +QComboBox QFrame:focus, +QComboBox QFrame:on { + border: 1px solid #828282; + background-color: #828282; + padding: 0px; + margin: 0px; +} + +QFrame[frameShape="0"] { + border-radius: 3px; +} + +QFrame[height="3"], +QFrame[width="3"] { + border-color: transparent; + background-color: transparent; +} + +QFrame[height="3"] { + border-top-color: #b6b6b6; +} + +QFrame[width="3"] { + border-left-color: #b6b6b6; +} + +QPushButton { + color: #ffffff; + text-align: center; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #b6b6b6, stop:1 #e6e6e6); + border: 1px solid #828282; + padding: 5px 12px 5px 12px; + margin: 4px 8px 4px 8px; + border-radius: 3px; + min-width: 14px; + min-height: 14px; +} + +QPushButton:hover, +QPushButton:focus { + color: black; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QPushButton:disabled, +QPushButton:disabled:checked { + color: #b6b6b6; + background-color: #e6e6e6; + border-color: #b6b6b6; +} + +QPushButton:pressed { + background-color: #3874f2; +} + +QPushButton:checked { + background-color: #5e90fa; + border-color: #3874f2; +} + +/* Color Buttons */ +Gui--ColorButton, +Gui--ColorButton:disabled { + border-color: transparent; + background-color: transparent; + height: 24px; + padding: 0px; + margin: 0px; +} + +Gui--ColorButton:hover { + border-color: #e0e0e0; + background-color: #e0e0e0; +} + +/* Buttons inside the toolbar */ +QToolBar QPushButton { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #e0e0e0, stop:1 #e6e6e6); + border: 1px solid #b6b6b6; + min-width: 22px; + min-height: 22px; + margin-left: 2px; + margin-right: 2px; + margin-bottom: 3px; /*bigger margin to correctly separate buttons inside a vertical toolbar */ + margin-top: 1px; + padding: 1px; +} + +QToolBar QPushButton:hover, +QToolBar QPushButton:focus { + color: #ffffff; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #e0e0e0, stop:1 #e6e6e6); + border: 1px solid #828282; +} + +QToolBar QPushButton:disabled, +QToolBar QPushButton:disabled:checked { + background-color: #e6e6e6; + border-color: #e0e0e0; +} + +QToolBar QPushButton:pressed { + background-color: #b6b6b6; + border-color: #b6b6b6; +} + +QToolBar QPushButton:checked { + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #5e90fa, stop:1 #7cabf9); + border-color: #5e90fa; +} + +QToolBar QPushButton:checked:hover, +QToolBar QPushButton:checked:focus { + color: #ffffff; + border: 1px solid #3874f2; +} + +QToolBar { + border: 1px transparent #393838; + background-color: #e6e6e6; + font-weight: bold; + margin: 0px; + padding: 0px; +} + +QToolBar::handle:horizontal { + background-image: url(icons/Hmovetoolbar_dark.png); + width: 10px; + margin: 6px 2px 6px 2px; + background-position: top right; + background-repeat: repeat-y; +} + +QToolBar::handle:vertical { + background-image: url(icons/Vmovetoolbar_dark.png); + height: 10px; + margin: 2px 6px 2px 6px; + background-position: left bottom; + background-repeat: repeat-x; +} + +QToolBar::separator:horizontal { + background-image: url(icons/separtoolbar_dark.png); + width: 10px; + margin: 6px 2px 6px 2px; + background-position: center center; + background-repeat: repeat-y; +} + +QToolBar::separator:vertical { + background-image: url(icons/separtoolbar_dark.png); + height: 10px; + margin: 2px 6px 2px 6px; + background-position: center center; + background-repeat: repeat-x; +} + +QStackedWidget { + background-color: #e6e6e6; + border: 1px transparent #e6e6e6; +} + +QAbstractSpinBox { + color: #ffffff; + border: 1px solid #b6b6b6; /* border top color defined after QAbstractSpinBox, QLineEdit and QComboBox */ + background-color: #b6b6b6; + selection-color: black; + selection-background-color: #5e90fa; +} + +QAbstractSpinBox:disabled { + color: #f5f5f5; + background-color: #e0e0e0; + border-color: #e0e0e0; +} + +QAbstractSpinBox:up-button { + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #6f9efa, stop:1 #7cabf9); + subcontrol-origin: border; + subcontrol-position: top right; + border-top-right-radius: 3px; + height: 13px; + width: 20px; +} + +QAbstractSpinBox:down-button { + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #5e90fa, stop:1 #6f9efa); + subcontrol-origin: border; + subcontrol-position: bottom right; + border-bottom-right-radius: 3px; + height: 13px; + width: 20px; +} + +QAbstractSpinBox:up-button:disabled, +QAbstractSpinBox:down-button:disabled { + background-color: transparent; +} + +QAbstractSpinBox::up-arrow { + image: url(icons/up_arrow_light.png); + top: 0px; /* fix simetry between up and down images */ +} + +QAbstractSpinBox::up-arrow:hover { + image: url(icons/up_arrow_lighter.png); +} + +QAbstractSpinBox::up-arrow:off { + image: url(icons/up_arrow_disabled_dark.png); +} + +QAbstractSpinBox::up-arrow:disabled { + image: none; +} + +QAbstractSpinBox::down-arrow { + image: url(icons/down_arrow_light.png); + bottom: -2px; /* fix simetry between up and down images */ +} +QAbstractSpinBox::down-arrow:hover { + image: url(icons/down_arrow_lighter.png); +} + +QAbstractSpinBox::down-arrow:off { + image: url(icons/down_arrow_disabled_dark.png); +} + +QAbstractSpinBox::down-arrow:disabled { + image: none; +} + +QToolBar QAbstractSpinBox { + margin-top: 0px; + margin-bottom: 0px; +} + +QLineEdit { + color: #ffffff; + background-color: #b6b6b6; + selection-color: black; + selection-background-color: #5e90fa; + /* Padding and margin defined */ + border-style: solid; + border: 1px solid #b6b6b6; /* border top color defined after QAbstractSpinBox, QLineEdit and QComboBox */ + border-radius: 3px; +} + +QAbstractSpinBox:focus, +QLineEdit:focus, +QComboBox:focus { + border-color: #7cabf9; +} + +QComboBox { + color: #ffffff; + background-color: #b6b6b6; + selection-color: black; + selection-background-color: #5e90fa; + border: 1px solid #b6b6b6; /* border top color defined after QAbstractSpinBox, QLineEdit and QComboBox */ + border-radius: 3px; +} + +QComboBox:on { + color: black; + background-color: #b6b6b6; + border-color: #7cabf9; +} + +QComboBox::drop-down { + subcontrol-origin: margin; + subcontrol-position: top right; + width: 20px; + border-left-width: 1px; + border-left-color: transparent; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + background-color: qlineargradient(spread:pad, x1:1, y1:0.8, x2:1, y2:0, stop:0 #5e90fa, stop:1 #7cabf9); +} + +QComboBox::down-arrow { + image: url(icons/down_arrow_light.png); +} + +QComboBox::down-arrow:on, +QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus { + image: url(icons/down_arrow_lighter.png); +} + +QComboBox QAbstractItemView { + color: #ffffff; + background-color: #828282; + border-radius: 3px; + margin: 0px; + padding: 0px; + border: none; +} + +/* Common parameters for QAbstractSpinBox, QLineEdit and QComboBox */ +QSpinBox, +QDoubleSpinBox, +QAbstractSpinBox, +QLineEdit, +QComboBox { + border-top-color: #a2a2a0; /* Creates an inset effect inside the elements */ + padding: 2px 6px 2px 6px; /* This makes text colour work on QComboBox */ + margin: 0px 2px 0px 2px; + min-width: 70px; /* it was 120 because of QCombobox... */ + border-radius: 3px; +} +/* end Common parameters */ + +QAbstractItemView { + color: #828282; + alternate-background-color: #b3b8bf; /* related with QListView background */ + border: 1px solid #828282; + border-radius: 3px; + padding: 0px; +} + +/* hack to deactivate changing background color when focus (due to QFrame generic transparent color) */ +QAbstractItemView:selected, +QAbstractItemView:on, +QAbstractItemView:focus { + background-color: #bdc1c9; /* same as QTable background color */ +} + +/* hack to hide weird redundant information inside the value of a Placement cell */ +QTreeView QLabel, +QTreeView QLabel:disabled { + color: transparent; + background-color: transparent; + border: none; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QTreeView QLineEdit { + color: #ffffff; + border-color: #b6b6b6; + background-color: #b6b6b6; + selection-color: black; + selection-background-color: #5e90fa; +} + +/* hack to hide non editable cells inside Property values */ +QTreeView QLineEdit:read-only, +QTreeView QLineEdit:disabled, +QTreeView QAbstractSpinBox:read-only, +QTreeView QAbstractSpinBox:disabled { + color: transparent; + border-color: transparent; + background-color: transparent; + selection-color: transparent; + selection-background-color: transparent; +} + +/* hack to disable margin inside Property values to following elements */ +QTreeView QSpinBox, +QTreeView QDoubleSpinBox, +QTreeView QAbstractSpinBox, +QTreeView QLineEdit, +QTreeView QComboBox { + margin-left: 0px; + margin-right: 0px; +} + +/* Pushbutton style for "..." inside Placement cell which launches Placement tool */ +QTreeView QPushButton { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #b6b6b6, stop:1 #e6e6e6); + border-top: none; + border-bottom: none; + border-right: none; + border-left: 1px solid #b6b6b6; + border-radius: 0px; + margin: 0px; + padding: 0px; + height: 24px; +} + +/* Color Buttons inside the "Properties window" */ +QAbstractItemView Gui--ColorButton { + padding: 0px; + margin: 0px; + height: 10px; +} + +QAbstractItemView QPushButton:hover { + color: black; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QAbstractItemView QPushButton:disabled { + color: transparent; + background-color: transparent; + border-color: transparent; +} + +QLabel { + border: 0px solid #828282; +} + +QTabWidget{ + border: none; +} + +QTabWidget:focus { + border: none; +} + +QTabWidget::pane { + border: none; + padding: 0px; + background-color: #e6e6e6; + position: absolute; + top: -15px; + padding-top: 15px; +} + +QTabWidget::tab-bar { + alignment: center; +} + +QTabBar { + qproperty-drawBase: 0; + left: 5px; + background-color: transparent; +} + +QTabBar:focus { + border: 0px transparent black; +} + +QTabBar::close-button { + padding: 0px; + margin: 0px; + border-radius: 2px; + background-image: url(icons/close_dark.png); + background-position: center center; + background-repeat: none; +} + +QTabBar::close-button:hover { + background-color: #7cabf9; +} + +QTabBar::close-button:pressed { + background-color: #adc5ed; +} + +QTabBar::scroller { /* the width of the scroll buttons */ + width: 20px; +} + +/* the scroll buttons are tool buttons */ +QTabBar QToolButton, +QTabBar QToolButton:hover { + margin-top: 4px; + margin-bottom: 4px; + margin-left: 0px; + margin-right: 0px; + padding: 0px; + border: none; + background-color: #e6e6e6; + border-radius: 0px; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(icons/right_arrow_light.png); +} + +QTabBar QToolButton::right-arrow:disabled, +QTabBar QToolButton::right-arrow:off { + image: url(icons/right_arrow_disabled_dark.png); +} + +QTabBar QToolButton::right-arrow:hover { + image: url(icons/right_arrow_lighter.png); +} + + QTabBar QToolButton::left-arrow:enabled { + image: url(icons/left_arrow_light.png); +} + + QTabBar QToolButton::left-arrow:disabled, + QTabBar QToolButton::left-arrow:off { + image: url(icons/left_arrow_disabled_dark.png); +} + + QTabBar QToolButton::left-arrow:hover { + image: url(icons/left_arrow_lighter.png); +} + + QTabBar QToolButton::up-arrow:enabled { + image: url(icons/up_arrow_light.png); +} + + QTabBar QToolButton::up-arrow:disabled, + QTabBar QToolButton::up-arrow:off { + image: url(icons/up_arrow_disabled_dark.png); +} + + QTabBar QToolButton::up-arrow:hover { + image: url(icons/up_arrow_lighter.png); +} + + QTabBar QToolButton::down-arrow:enabled { + image: url(icons/down_arrow_light.png); +} + + QTabBar QToolButton::down-arrow:disabled, + QTabBar QToolButton::down-arrow:off { + image: url(icons/down_arrow_disabled_dark.png); +} + + QTabBar QToolButton::down-arrow:hover { + image: url(icons/down_arrow_lighter.png); +} + +/* TOP and BOTTOM TABS */ +QTabBar::tab:top, +QTabBar::tab:bottom { + color: #ffffff; + border: 1px solid #b6b6b6; + border-left-color: #e6e6e6; + border-right-width: 0px; + background-color: #b6b6b6; + padding:5px 15px; + margin-top: 4px; + margin-bottom: 4px; + position: center; +} + +QTabBar::tab:top:first, +QTabBar::tab:bottom:first { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} + +QTabBar::tab:top:last, +QTabBar::tab:bottom:last { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + border-right-width: 1px; +} + +QTabBar::tab:top:selected, +QTabBar::tab:bottom:selected { + color: black; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QTabBar::tab:top:!selected:hover, +QTabBar::tab:bottom:!selected:hover { + color: black; +} + +QTabBar::tab:top:only-one , +QTabBar::tab:bottom:only-one { + border: 1px solid #1b3774; + border-radius: 6px; +} + +/* LEFT and RIGHT TABS */ +QTabBar::tab:left, +QTabBar::tab:right { + color: #ffffff; + border: 1px solid #b6b6b6; + border-top-color: #e6e6e6; + border-bottom-width: 0px; + background-color: #b6b6b6; + padding: 15px 5px; + margin-left: 4px; + margin-right: 4px; + position: center; +} + +QTabBar::tab:left:first, +QTabBar::tab:right:first { + border-top-left-radius: 6px; + border-top-right-radius: 6px; +} + +QTabBar::tab:left:last, +QTabBar::tab:right:last { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-bottom-width: 1px; +} + +QTabBar::tab:left:selected, +QTabBar::tab:right:selected { + color: black; + background-color: qlineargradient(spread:pad, x1:0.545, y1:1, x2:0, y2:1, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QTabBar::tab:left:!selected:hover, +QTabBar::tab:right:!selected:hover { + color: black; +} + +QTabBar::tab:left:only-one , +QTabBar::tab:right:only-one { + border: 1px solid #1b3774; + border-radius: 6px; +} + +QDockWidget { + color: #828282; + border: 1px solid #e6e6e6; + titlebar-close-icon: url(icons/close_dark.png); + titlebar-normal-icon: url(icons/undock_dark.png); +} + +QDockWidget::title { + text-align: center; + background-color: #e0e0e0; + padding: 4px; + border-radius: 4px; +} + +QDockWidget::close-button, +QDockWidget::float-button { + border: 1px transparent #e6e6e6; + border-radius: 2px; + background: transparent; + subcontrol-origin: padding; + subcontrol-position: right center; +} + +QDockWidget::close-button { + right: 4px; +} + +QDockWidget::float-button { + right: 22px; +} + +QDockWidget::close-button:hover, +QDockWidget::float-button:hover { + background: #f5f5f5; +} + +QDockWidget::close-button:pressed, +QDockWidget::float-button:pressed { + /*padding: 1px -1px -1px 1px;*/ + background-color: #e0e0e0; +} + +QTreeView, +QListView { + color: #828282; + border: 1px solid #e6e6e6; + border-radius: 4px; + background-color: #bdc1c9; /* related with alternate-background-color*/ + selection-color: black; + selection-background-color: #5e90fa; /* should be similar to QListView::item selected background-color */ + show-decoration-selected: 1; /* make the selection span the entire width of the view */ + padding: 0px; + margin: 0px 4px 0px 4px; + min-width: 130px; /* hack to correctly align Preferences icon list */ +} + +QListView, +QListView::item, +QListView QAbstractItemView { + margin: 0px; + icon-size: 20px; /* temporal */ + paint-alternating-row-colors-for-empty-area: 1; + position: absolute; + subcontrol-origin: margin; + subcontrol-position: left top; +} + +/* Control dropdown list margins of QComboBox */ +QComboBox QTreeView, +QComboBox QListView { + margin: 0px; + padding: 0px; +} + +QListView::item { + border: 0px transparent #e6e6e6; + border-radius: 4px; + background-color: transparent; + padding: 0px; + margin: 0px; + display: inline-block; + position: relative; +} + +QListView::item:selected, +QTreeView::item:selected { + color: black; + background-color: #5e90fa; /* should be similar to QListView selection-background-color */ +} + +/* Branch system */ +QTreeView::branch { + background: transparent; +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(icons/branch_vline.png) 0; +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(icons/branch_more.png) 0; +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(icons/branch_end.png) 0; +} + +QTreeView::branch:closed:has-children:has-siblings { + image: url(icons/branch_closed_dark.png); +} + +QTreeView::branch:has-children:!has-siblings:closed { + image: url(icons/branch_closed_dark.png); + border-image: url(icons/branch_end.png) 0; +} + +QTreeView::branch:open:has-children:has-siblings { + image: url(icons/branch_open_dark.png); + border-image: url(icons/branch_more.png) 0; +} + +QTreeView::branch:open:has-children:!has-siblings { + image: url(icons/branch_open_dark.png); + border-image: url(icons/branch_end.png) 0; +} + +QSlider, +QSlider:active, +QSlider:!active { + border: none; + background-color: transparent; +} + +QSlider:horizontal { + padding: 0px 10px; +} + +QSlider:vertical { + padding: 10px 0px; +} + +QSlider::groove:horizontal { + border: 1px solid #b6b6b6; + background-color: #b6b6b6; + height: 8px; + border-radius: 5px; + margin: 4px 0; +} + +QSlider::groove:vertical { + border: 1px solid #b6b6b6; + background-color: #b6b6b6; + width: 8px; + border-radius: 5px; + margin: 4px 0; +} + +QSlider::groove:horizontal:disabled, +QSlider::groove:vertical:disabled { + border-color: #e0e0e0; + background-color: #e0e0e0; +} + +QSlider::handle:horizontal, +QSlider::handle:vertical { + background-color: #828282; + border: 1px solid #828282; + width: 14px; + height: 14px; + border-radius: 8px; +} + +QSlider::handle:horizontal { + margin: -4px 0; +} + +QSlider::handle:vertical { + margin: 0 -4px; +} + +QSlider::handle:horizontal:hover, +QSlider::handle:vertical:hover { + border-color: #3874f2; + background-color: #3874f2; +} + +QSlider::handle:horizontal:pressed, +QSlider::handle:vertical:pressed { + border-color: #1b3774; + background-color: #1b3774; +} + +QSlider::handle:horizontal:disabled, +QSlider::handle:vertical:disabled { + border-color: #b6b6b6; + background-color: #e6e6e6; +} + +QToolButton { + color: #ffffff; + text-align: center; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #b6b6b6, stop:1 #e6e6e6); + border: 1px solid #828282; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; + padding-right: 15px; + margin-top: 5px; + margin-bottom: 5px; + margin-left: 10px; + margin-right: 10px; + border-radius: 3px; + outline: none; +} + +QToolButton:hover, +QToolButton:focus { + color: black; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QToolButton:disabled, +QToolButton:disabled:checked { + color: #b6b6b6; + background-color: #e6e6e6; + border-color: #b6b6b6; +} + +QToolButton:pressed { + border-color: #7cabf9; +} + +QToolButton:checked { + background-color: #5e90fa; + border-color: #3874f2; +} + +QToolButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: center right; + right: 4px; +} + +/*The "show more" button (it can also be stylable with "QToolBarExtension" */ +QToolButton#qt_toolbar_ext_button { + border-radius: 0px; + margin: 0px; + padding: 0px; + /*background-image: url(icons/more_dark.png);*/ + image: transparent; + background-repeat: none; + background-position: center left; +} + +QToolButton#qt_toolbar_ext_button:hover { + /*background-image: url(icons/more_light.png);*/ + border-color: #e0e0e0; + background-color: #e0e0e0; +} + +QToolButton#qt_toolbar_ext_button:on { + /*background-image: url(icons/more_light.png);*/ + border-color: #e0e0e0; + background-color: #e0e0e0; +} + +/*Buttons inside the Toolbar*/ +QToolBar QToolButton { + color: #828282; + background-color: #e6e6e6; + border: 1px transparent #e6e6e6; + border-radius: 3px; + margin: 0px; + padding: 2px; +} + +QToolBar QToolButton:disabled { + background-color: #e6e6e6; +} + +QToolBar QToolButton:checked { + color: #1b3774; + background-color: #5e90fa; + border: 1px solid #5e90fa; +} + +QToolBar QToolButton:hover { + background-color: #e6e6e6; +} + +QToolBar QToolButton:pressed, +QToolBar QToolButton::menu-button:pressed { + background-color: #e0e0e0; + border: 1px solid #e0e0e0; +} + + +QToolBar QToolButton::menu-indicator:hover, +QToolBar QToolButton::menu-indicator:pressed { + background-color: transparent; +} + +/* the subcontrols below are used only in the MenuButtonPopup mode */ +QToolBar QToolButton::menu-button { + border: 1px transparent #4A4949; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + width: 16px; /* 16px width + 4px for border = 20px allocated above */ + outline: none; + background-color: transparent; +} + +QToolBar QToolButton::menu-button:hover, +QToolBar QToolButton::menu-button:active, +QToolBar QToolButton::menu-button:disabled { + border-color: transparent; + background-color: transparent; +} + +QToolBar QToolButton::menu-arrow { + background-image: url(icons/down_arrow_light.png); + background-position: center center; + background-repeat: none; + subcontrol-origin: padding; + subcontrol-position: bottom right; + height: 10px; /* same as arrow image */ +} + +QToolBar QToolButton::menu-arrow:open { + background-image: url(icons/down_arrow_lighter.png); +} + +QToolBar:tear { + color: blue; + background-color: red; +} + +QTableView { + color: #828282; + border: 1px solid #b6b6b6; + gridline-color: #f5f5f5; + background-color: #bdc1c9; + selection-color: #828282; + selection-background-color: #adc5ed; + border-radius: 3px; + padding: 0px; + margin: 0px; +} + +QTableView::item:hover { + background: #abb0b7; +} + +QTableView::item:disabled { + color: #e6e6e6; +} + +QTableView::item:selected { + color: #1b3774; + background-color: #7cabf9; +} + +/* when editing a cell: */ +QTableView QLineEdit { + color: #828282; + background-color: #b3b8bf; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView { + border: none; + background-color: #828282; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + margin: 0px; + padding: 0px; +} + +QHeaderView::section { + background-color: transparent; + color: #ffffff; + border: 1px solid transparent; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical { + padding: 0px 6px 0px 6px; + border-bottom: 1px solid #b6b6b6; +} + +QHeaderView::section::vertical:first { + border-top: 1px solid #b6b6b6; +} + +QHeaderView::section::vertical:last { + border-bottom: none; +} + +QHeaderView::section::vertical:only-one { + border: none; +} + +QHeaderView::section::horizontal { + padding: 0px 0px 0px 6px; + border-right: 1px solid #b6b6b6; +} + +QHeaderView::section::horizontal:first { + border-left: 1px solid #b6b6b6; +} + +QHeaderView::section::horizontal:last { + border-left: none; +} + +QHeaderView::section::horizontal:only-one { + border: none; +} + +QDockWidget QHeaderView::section { + border-width: 6px 1px 6px 1px; /* hack to bigger margin for Model Panel table headers */ +} + +QHeaderView::section:checked { + color: #1b3774; + background-color: #7cabf9; +} + + /* style the sort indicator */ +QHeaderView::down-arrow { + image: url(icons/down_arrow_light.png); +} + +QHeaderView::up-arrow { + image: url(icons/up_arrow_light.png); +} + +QTableCornerButton::section { + background-color: #828282; + border: 1px solid #828282; + border-radius: 0px; +} + +QToolBox { + padding: 3px; + color: #1b3774; + border: none; +} + +QToolBox::tab { /* TODO */ + color: #ffffff; + background-color: #b6b6b6; + border: 1px transparent #828282; + border-bottom: 1px transparent #b6b6b6; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + padding: 5px; +} + +QToolBox::tab:selected { /* italicize selected tabs */ + color: #1b3774; + font: italic; + background-color: #5e90fa; + border-color: #5e90fa; + } + +QStatusBar::item { + color: #ffffff; + background-color: #e6e6e6; + border: 1px solid #e6e6e6; + border-radius: 2px; +} + +QSplitter::handle { + background-color: #e6e6e6; + margin: 0px 11px; + padding: 0px; + border-radius: 3px; +} + +QSplitter::handle:vertical { + background-image: url(icons/splitter_horizontal_dark.png); + background-position: center center; + background-repeat: none; + margin: 2px 10px 2px 10px; + height: 2px; +} + +QSplitter::handle:horizontal { + background-image: url(icons/splitter_horizontal_dark.png); + background-position: center center; + background-repeat: none; + margin: 10px 2px 10px 2px; + width: 2px; +} + +QSplitter::handle:horizontal:hover, +QSplitter::handle:vertical:hover { + background-color: #e6e6e6; +} + +/* Similar to the splitter is the following window separator: */ +QMainWindow::separator { + border: 1px solid #e6e6e6; + background-color: #e6e6e6; + background-position: center center; + background-repeat: none; +} + +QMainWindow::separator:hover { + background-color: #e6e6e6; +} + +QMainWindow::separator:horizontal { + height: 4px; + background-image: url(icons/splitter_horizontal_dark.png); +} + +QMainWindow::separator:vertical { + width: 4px; + background-image: url(icons/splitter_vertical_dark.png); +} + +QLabel { + padding-top: 3px; + padding-bottom: 3px; + background-color: transparent; +} + +QLabel:disabled { + color: #b6b6b6; + background-color: transparent; +} + +/* Action group */ +QFrame[class="panel"] { + border: none; + background-color: #e6e6e6; +} + +QSint--ActionGroup QFrame[class="header"] { + border: none; + background-color: #828282; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; + margin: 0px; + padding: 0px; +} + +QSint--ActionGroup QFrame[class="header"]:hover { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); +} + +QSint--ActionGroup QToolButton[class="header"] { + text-align: left; + font-weight: bold; + color: #ffffff; + background-color: transparent; + border: none; + margin: 0px; + padding: 0px; +} + +QSint--ActionGroup QToolButton[class="header"]:hover { + color: black; +} + +QSint--ActionGroup QFrame[class="header"] QLabel { + background-color: transparent; + background-image: url(icons/down_arrow_light.png); + background-repeat: none; + background-position: center center; + padding: 0px; + margin: 0px; +} + +QSint--ActionGroup QFrame[class="header"] QLabel:hover { + background-color: transparent; + background-image: url(icons/down_arrow_lighter.png); +} + +QSint--ActionGroup QFrame[class="header"] QLabel[fold="true"] { + background-color: transparent; + background-image: url(icons/up_arrow_light.png); + background-repeat: none; + background-position: center center; + padding: 0px; + margin: 0px; +} + +QSint--ActionGroup QFrame[class="header"] QLabel[fold="true"]:hover { + background-color: transparent; + background-image: url(icons/up_arrow_lighter.png); +} + +QSint--ActionGroup QFrame[class="content"] { + background-color: #bdc1c9; + margin: 0px; + padding: 0px; + border: none; + border-top-left-radius: 0px; + border-top-right-radius: 0px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +/* HACK +This might not be the best way to reset the background color: */ +QSint--ActionGroup QFrame[class="content"] QWidget { + background-color: transparent; +} + +QSint--ActionGroup QFrame[class="content"] QPushButton { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #b6b6b6, stop:1 #e6e6e6); +} + +QSint--ActionGroup QFrame[class="content"] QPushButton:hover, +QSint--ActionGroup QFrame[class="content"] QPushButton:focus { + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); +} + +QSint--ActionGroup QFrame[class="content"] QPushButton:disabled, +QSint--ActionGroup QFrame[class="content"] QPushButton:disabled:checked { + color: #bdc1c9; + border-color: #f5f5f5; + background-color: #f5f5f5; +} +QSint--ActionGroup QFrame[class="content"] QPushButton:checked { + background-color: #5e90fa; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox { + background-color: #b6b6b6; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox:on { + background-color: #b6b6b6; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox QAbstractItemView { + border-color: #828282; + background-color: #828282; +} + +QSint--ActionGroup QFrame[class="content"] QListView { + border-color: #abb0b7; + background-color: #abb0b7; +} + +QSint--ActionGroup QFrame[class="content"] QAbstractSpinBox { + background-color: #b6b6b6; +} + +QSint--ActionGroup QFrame[class="content"] QLineEdit { + background-color: #b6b6b6; +} + +QSint--ActionGroup QFrame[class="content"] QComboBox:disabled, +QSint--ActionGroup QFrame[class="content"] QAbstractSpinBox:disabled, +QSint--ActionGroup QFrame[class="content"] QLineEdit:disabled { + color: #bdc1c9; + border-color: #f5f5f5; + background-color: #f5f5f5; +} + +QSint--ActionGroup QFrame[class="content"] QCheckBox:disabled, +QSint--ActionGroup QFrame[class="content"] QRadioButton:disabled { + color: #f5f5f5; + border-color: #f5f5f5; +} + +QSint--ActionGroup QFrame[class="content"] QCheckBox::indicator:disabled, +QSint--ActionGroup QFrame[class="content"] QRadioButton::indicator:disabled { + border-color: #f5f5f5; + background-color: transparent; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView { + border: none; + background-color: #828282; + border-radius: 0px; + margin: 0px; + padding: 0px; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section { + background-color: transparent; + color: #ffffff; + border: 1px solid transparent; + border-radius: 0px; + text-align: center; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal { + padding: 6px 0px 6px 6px; + border-right: 1px solid #b6b6b6; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal:first { + border-left: 1px solid #e6e6e6; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal:last { + border-left: none; +} + +QSint--ActionGroup QFrame[class="content"] QHeaderView::section::horizontal:only-one { + border: none; +} +/* enf of HACK */ + +QSint--ActionGroup QToolButton[class="action"], +QSint--ActionGroup QToolButton[class="action"]:enabled { + font-weight: bold; + color: #b6b6b6; +} + +QSint--ActionGroup QToolButton[class="action"]:hover, +QSint--ActionGroup QToolButton[class="action"]:enabled:hover { + text-decoration: none; + color: #828282; + background-color: #abb0b7; + border-color: #abb0b7; +} + +QSint--ActionGroup QToolButton[class="action"]:disabled { + color: #e6e6e6; + background-color: #abb0b7; + border-color: #abb0b7; +} + +QSint--ActionGroup QToolButton[class="action"]:focus, +QSint--ActionGroup QToolButton[class="action"]:pressed +QSint--ActionGroup QToolButton[class="action"]:enabled:focus, +QSint--ActionGroup QToolButton[class="action"]:enabled:pressed { + color: black; + background-color: qlineargradient(spread:pad, x1:1, y1:0.545, x2:1, y2:0, stop:0 #3874f2, stop:1 #5e90fa); + border-color: #3874f2; +} + +QSint--ActionGroup QToolButton[class="action"]:on { + background-color: red; + color: red; +} \ No newline at end of file diff --git a/styles/machinery/icons/checkbox_inter_disabled.png b/styles/machinery/icons/checkbox_inter_disabled.png new file mode 100644 index 0000000..59b558f Binary files /dev/null and b/styles/machinery/icons/checkbox_inter_disabled.png differ diff --git a/styles/machinery/icons/checkbox_inter_enabled.png b/styles/machinery/icons/checkbox_inter_enabled.png new file mode 100644 index 0000000..7c3832a Binary files /dev/null and b/styles/machinery/icons/checkbox_inter_enabled.png differ diff --git a/styles/machinery/icons/checkbox_inter_enabled_hover.png b/styles/machinery/icons/checkbox_inter_enabled_hover.png new file mode 100644 index 0000000..0fdae22 Binary files /dev/null and b/styles/machinery/icons/checkbox_inter_enabled_hover.png differ diff --git a/styles/machinery/icons/checkbox_inter_enabled_pressed - copia.png b/styles/machinery/icons/checkbox_inter_enabled_pressed - copia.png new file mode 100644 index 0000000..d74bfb5 Binary files /dev/null and b/styles/machinery/icons/checkbox_inter_enabled_pressed - copia.png differ diff --git a/styles/machinery/icons/checkbox_inter_enabled_pressed.png b/styles/machinery/icons/checkbox_inter_enabled_pressed.png new file mode 100644 index 0000000..d74bfb5 Binary files /dev/null and b/styles/machinery/icons/checkbox_inter_enabled_pressed.png differ diff --git a/styles/machinery/icons/checkbox_off_disabled - copia.png b/styles/machinery/icons/checkbox_off_disabled - copia.png new file mode 100644 index 0000000..40d3d3e Binary files /dev/null and b/styles/machinery/icons/checkbox_off_disabled - copia.png differ diff --git a/styles/machinery/icons/checkbox_off_disabled.png b/styles/machinery/icons/checkbox_off_disabled.png new file mode 100644 index 0000000..40d3d3e Binary files /dev/null and b/styles/machinery/icons/checkbox_off_disabled.png differ diff --git a/styles/machinery/icons/checkbox_off_enabled - copia.png b/styles/machinery/icons/checkbox_off_enabled - copia.png new file mode 100644 index 0000000..33d7c00 Binary files /dev/null and b/styles/machinery/icons/checkbox_off_enabled - copia.png differ diff --git a/styles/machinery/icons/checkbox_off_enabled.png b/styles/machinery/icons/checkbox_off_enabled.png new file mode 100644 index 0000000..33d7c00 Binary files /dev/null and b/styles/machinery/icons/checkbox_off_enabled.png differ diff --git a/styles/machinery/icons/checkbox_off_enabled_hover - copia.png b/styles/machinery/icons/checkbox_off_enabled_hover - copia.png new file mode 100644 index 0000000..0426ceb Binary files /dev/null and b/styles/machinery/icons/checkbox_off_enabled_hover - copia.png differ diff --git a/styles/machinery/icons/checkbox_off_enabled_hover.png b/styles/machinery/icons/checkbox_off_enabled_hover.png new file mode 100644 index 0000000..0426ceb Binary files /dev/null and b/styles/machinery/icons/checkbox_off_enabled_hover.png differ diff --git a/styles/machinery/icons/checkbox_off_enabled_pressed.png b/styles/machinery/icons/checkbox_off_enabled_pressed.png new file mode 100644 index 0000000..2cbebd9 Binary files /dev/null and b/styles/machinery/icons/checkbox_off_enabled_pressed.png differ diff --git a/styles/machinery/icons/checkbox_on_disabled.png b/styles/machinery/icons/checkbox_on_disabled.png new file mode 100644 index 0000000..f24110a Binary files /dev/null and b/styles/machinery/icons/checkbox_on_disabled.png differ diff --git a/styles/machinery/icons/checkbox_on_enabled.png b/styles/machinery/icons/checkbox_on_enabled.png new file mode 100644 index 0000000..2c35819 Binary files /dev/null and b/styles/machinery/icons/checkbox_on_enabled.png differ diff --git a/styles/machinery/icons/checkbox_on_enabled_hover - copia.png b/styles/machinery/icons/checkbox_on_enabled_hover - copia.png new file mode 100644 index 0000000..1f123be Binary files /dev/null and b/styles/machinery/icons/checkbox_on_enabled_hover - copia.png differ diff --git a/styles/machinery/icons/checkbox_on_enabled_hover.png b/styles/machinery/icons/checkbox_on_enabled_hover.png new file mode 100644 index 0000000..1f123be Binary files /dev/null and b/styles/machinery/icons/checkbox_on_enabled_hover.png differ diff --git a/styles/machinery/icons/checkbox_on_enabled_pressed - copia.png b/styles/machinery/icons/checkbox_on_enabled_pressed - copia.png new file mode 100644 index 0000000..fb19bdc Binary files /dev/null and b/styles/machinery/icons/checkbox_on_enabled_pressed - copia.png differ diff --git a/styles/machinery/icons/checkbox_on_enabled_pressed.png b/styles/machinery/icons/checkbox_on_enabled_pressed.png new file mode 100644 index 0000000..fb19bdc Binary files /dev/null and b/styles/machinery/icons/checkbox_on_enabled_pressed.png differ diff --git a/styles/machinery/icons/gamelist-bg - copia.png b/styles/machinery/icons/gamelist-bg - copia.png new file mode 100644 index 0000000..8ef8c2e Binary files /dev/null and b/styles/machinery/icons/gamelist-bg - copia.png differ diff --git a/styles/machinery/icons/gamelist-bg.png b/styles/machinery/icons/gamelist-bg.png new file mode 100644 index 0000000..8ef8c2e Binary files /dev/null and b/styles/machinery/icons/gamelist-bg.png differ diff --git a/styles/machinery/icons/menu_indicator.png b/styles/machinery/icons/menu_indicator.png new file mode 100644 index 0000000..3b35b6f Binary files /dev/null and b/styles/machinery/icons/menu_indicator.png differ diff --git a/styles/machinery/icons/menu_indicator_disabled.png b/styles/machinery/icons/menu_indicator_disabled.png new file mode 100644 index 0000000..4bbe21b Binary files /dev/null and b/styles/machinery/icons/menu_indicator_disabled.png differ diff --git a/styles/machinery/icons/radiobutton_off_disabled.png b/styles/machinery/icons/radiobutton_off_disabled.png new file mode 100644 index 0000000..fd8c6a1 Binary files /dev/null and b/styles/machinery/icons/radiobutton_off_disabled.png differ diff --git a/styles/machinery/icons/radiobutton_off_enabled.png b/styles/machinery/icons/radiobutton_off_enabled.png new file mode 100644 index 0000000..a78fc23 Binary files /dev/null and b/styles/machinery/icons/radiobutton_off_enabled.png differ diff --git a/styles/machinery/icons/radiobutton_off_enabled_hover.png b/styles/machinery/icons/radiobutton_off_enabled_hover.png new file mode 100644 index 0000000..3e3a10c Binary files /dev/null and b/styles/machinery/icons/radiobutton_off_enabled_hover.png differ diff --git a/styles/machinery/icons/radiobutton_off_enabled_pressed.png b/styles/machinery/icons/radiobutton_off_enabled_pressed.png new file mode 100644 index 0000000..1874fce Binary files /dev/null and b/styles/machinery/icons/radiobutton_off_enabled_pressed.png differ diff --git a/styles/machinery/icons/radiobutton_on_disabled.png b/styles/machinery/icons/radiobutton_on_disabled.png new file mode 100644 index 0000000..3238c95 Binary files /dev/null and b/styles/machinery/icons/radiobutton_on_disabled.png differ diff --git a/styles/machinery/icons/radiobutton_on_enabled.png b/styles/machinery/icons/radiobutton_on_enabled.png new file mode 100644 index 0000000..4a5ab10 Binary files /dev/null and b/styles/machinery/icons/radiobutton_on_enabled.png differ diff --git a/styles/machinery/icons/radiobutton_on_enabled_hover.png b/styles/machinery/icons/radiobutton_on_enabled_hover.png new file mode 100644 index 0000000..6255d11 Binary files /dev/null and b/styles/machinery/icons/radiobutton_on_enabled_hover.png differ diff --git a/styles/machinery/icons/radiobutton_on_enabled_pressed.png b/styles/machinery/icons/radiobutton_on_enabled_pressed.png new file mode 100644 index 0000000..90b8d62 Binary files /dev/null and b/styles/machinery/icons/radiobutton_on_enabled_pressed.png differ diff --git a/styles/machinery/icons/spin_down_disabled.png b/styles/machinery/icons/spin_down_disabled.png new file mode 100644 index 0000000..0002c1c Binary files /dev/null and b/styles/machinery/icons/spin_down_disabled.png differ diff --git a/styles/machinery/icons/spin_down_enabled.png b/styles/machinery/icons/spin_down_enabled.png new file mode 100644 index 0000000..0cbd35f Binary files /dev/null and b/styles/machinery/icons/spin_down_enabled.png differ diff --git a/styles/machinery/icons/spin_down_enabled_hover.png b/styles/machinery/icons/spin_down_enabled_hover.png new file mode 100644 index 0000000..cb67385 Binary files /dev/null and b/styles/machinery/icons/spin_down_enabled_hover.png differ diff --git a/styles/machinery/icons/spin_down_enabled_pressed.png b/styles/machinery/icons/spin_down_enabled_pressed.png new file mode 100644 index 0000000..a47a62f Binary files /dev/null and b/styles/machinery/icons/spin_down_enabled_pressed.png differ diff --git a/styles/machinery/icons/spin_up_disabled.png b/styles/machinery/icons/spin_up_disabled.png new file mode 100644 index 0000000..b004098 Binary files /dev/null and b/styles/machinery/icons/spin_up_disabled.png differ diff --git a/styles/machinery/icons/spin_up_enabled.png b/styles/machinery/icons/spin_up_enabled.png new file mode 100644 index 0000000..416607b Binary files /dev/null and b/styles/machinery/icons/spin_up_enabled.png differ diff --git a/styles/machinery/icons/spin_up_enabled_hover.png b/styles/machinery/icons/spin_up_enabled_hover.png new file mode 100644 index 0000000..cf70faf Binary files /dev/null and b/styles/machinery/icons/spin_up_enabled_hover.png differ diff --git a/styles/machinery/icons/spin_up_enabled_pressed.png b/styles/machinery/icons/spin_up_enabled_pressed.png new file mode 100644 index 0000000..52d04aa Binary files /dev/null and b/styles/machinery/icons/spin_up_enabled_pressed.png differ diff --git a/styles/machinery/machinery.qss b/styles/machinery/machinery.qss new file mode 100644 index 0000000..034d2b6 --- /dev/null +++ b/styles/machinery/machinery.qss @@ -0,0 +1,366 @@ +/* + qmc2-machinery: v0.3, 10-SEP-2010, rene.reucher@batcom-it.net + + Qt style sheet compatible with QMC2 0.2.b13+ + + http://qmc2.arcadehits.net/wordpress/style-sheets/ + + This style sheet is based on the work of an unknown author from ii-system.com: + + http://ii-system.com/soft/devzone/Qt%20Vista%20Style%20test.2007.12.24.zip + http://ii-system.com/soft/devzone/devzone_en.htm + + Changes: + + v0.3 - updated to 0.2.b17 + v0.2 - updated to 0.2.b15 + v0.1 - initial version +*/ + +QMenuBar { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #fcfdfe, stop:0.5 #cfd7eb stop:1 #e9ecfa); +} + +QMenuBar::item { + background: transparent; +} + +QMenuBar::item:selected { + border: 1px solid #f5f6fa; + border-radius: 3px; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #f0f0f0 stop:0.5 #ffffff stop:1 #e9ecfa); +} + +QMenuBar::item:pressed { + border: 1px solid grey; + border-radius: 3px; +} + +QMenu { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #fcfdfe, stop:0.5 #cfd7eb stop:1 #e9ecfa); + border: 1px solid #979797; +} + +QMenu::item { + margin-left: 2px; + margin-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + padding-left: 20px; + padding-right: 10px; +} + +QMenu::item:selected { + border: 1px solid #a7dbff; + border-radius: 3px; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #f1f1f1 stop:1 #e4f0f5); + margin-left: 2px; + margin-right: 2px; + padding-left: 20px; + padding-right: 10px; +} + +QMenu::indicator:unchecked { + border-radius: 3px; +} + +QMenu::indicator:checked:enabled { + border: 1px solid #a7dbff; + border-radius: 3px; + background-color: #e6eff4; + image: url(icons/menu_indicator.png) +} + +QMenu::indicator:checked:!enabled { + image: url(icons/menu_indicator_disabled.png) +} + +QMenu::separator { + height: 1px; + margin-left: 2px; + margin-right: 2px; + margin-top: 2px; + margin-bottom: 2px; + background-color: #a0a0a0; +} + +QToolBar { + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #9fc6df, stop:0.5 #256894 stop:1 #77c5cb); +} + +QToolBar QToolButton { + background: transparent; + color: white; +} + +QToolBar QToolButton:hover:enabled { + border: 1px solid grey; + border-radius: 3px; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #f0f0f0 stop:0.5 #054874 stop:1 #6fc9ca); +} + +QToolBar QToolButton:pressed { + border: 1px solid grey; + border-radius: 3px; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #c0c0d0 stop:0.5 #054874 stop:1 #377277); +} + +QToolBar QToolButton:on { + border: 1px solid grey; + border-radius: 3px; + background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #c0c0d0 stop:0.5 #054874 stop:1 #377277); +} + +QGroupBox { + border-top: 1px solid gray; + margin-top: 6px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding: 0 3px; +} + +QGroupBox::indicator { + width: 13px; + height: 13px; +} + +QGroupBox::indicator:unchecked { + image: url(icons/checkbox_off_enabled.png); +} + +QGroupBox::indicator:unchecked:!enabled { + image: url(icons/checkbox_off_disabled.png); +} + +QGroupBox::indicator:unchecked:hover { + image: url(icons/checkbox_off_enabled_hover.png); +} + +QGroupBox::indicator:unchecked:pressed { + image: url(icons/checkbox_off_enabled_pressed.png); +} + +QGroupBox::indicator:checked { + image: url(icons/checkbox_on_enabled.png); +} + +QGroupBox::indicator:checked:!enabled { + image: url(icons/checkbox_on_disabled.png); +} + +QGroupBox::indicator:checked:hover { + image: url(icons/checkbox_on_enabled_hover.png); +} + +QGroupBox::indicator:checked:pressed { + image: url(icons/checkbox_on_enabled_pressed.png); +} + +QGroupBox::indicator:indeterminate:hover { + image: url(icons/checkbox_inter_enabled_hover.png); +} + +QGroupBox::indicator:indeterminate { + image: url(icons/checkbox_inter_enabled.png); +} + +QGroupBox::indicator:indeterminate:!enabled { + image: url(icons/checkbox_inter_disabled.png); +} + +QCheckBox { + spacing: 5px; +} + +QCheckBox::indicator { + width: 13px; + height: 13px; +} + +QCheckBox::indicator:unchecked { + image: url(icons/checkbox_off_enabled.png); +} + +QCheckBox::indicator:unchecked:!enabled { + image: url(icons/checkbox_off_disabled.png); +} + +QCheckBox::indicator:unchecked:hover { + image: url(icons/checkbox_off_enabled_hover.png); +} + +QCheckBox::indicator:unchecked:pressed { + image: url(icons/checkbox_off_enabled_pressed.png); +} + +QCheckBox::indicator:checked { + image: url(icons/checkbox_on_enabled.png); +} + +QCheckBox::indicator:checked:!enabled { + image: url(icons/checkbox_on_disabled.png); +} + +QCheckBox::indicator:checked:hover { + image: url(icons/checkbox_on_enabled_hover.png); +} + +QCheckBox::indicator:checked:pressed { + image: url(icons/checkbox_on_enabled_pressed.png); +} + +QCheckBox::indicator:indeterminate:hover { + image: url(icons/checkbox_inter_enabled_hover.png); +} + +QCheckBox::indicator:indeterminate { + image: url(icons/checkbox_inter_enabled.png); +} + +QCheckBox::indicator:indeterminate:!enabled { + image: url(icons/checkbox_inter_disabled.png); +} + +QRadioButton { + spacing: 5px; +} + +QRadioButton::indicator { + width: 12px; + height: 12px; +} + +QRadioButton::indicator:unchecked { + image: url(icons/radiobutton_off_enabled.png); +} + +QRadioButton::indicator:checked { + image: url(icons/radiobutton_on_enabled.png); +} + +QRadioButton::indicator:checked:hover { + image: url(icons/radiobutton_on_enabled_hover.png); +} + +QRadioButton::indicator:checked:pressed { + image: url(icons/radiobutton_on_enabled_pressed.png); +} + +QRadioButton::indicator:unchecked:!enabled { + image: url(icons/radiobutton_off_disabled.png); +} + +QRadioButton::indicator:checked:!enabled { + image: url(icons/radiobutton_on_disabled.png); +} + +QRadioButton::indicator:unchecked:hover { + image: url(icons/radiobutton_off_enabled_hover.png); +} + +QRadioButton::indicator:unchecked:pressed { + image: url(icons/radiobutton_off_enabled_pressed.png); +} + +QLineEdit, QTextEdit, QSpinBox, QDoubleSpinBox { + border-top: 1px solid #abadb3; + border-right: 1px solid #abadb3; + border-left: 1px solid #e3e9ef; + border-bottom: 1px solid #e3e9ef; + border-radius: 2px; + background: white; + selection-background-color: #3399ff; + min-height: 23 px; +} + +QLineEdit:!enabled, QTextEdit:!enabled, QSpinBox:!enabled, QDoubleSpinBox:!enabled { + border: 1px solid #afafaf; + border-radius: 2px; + background: white; + color: #afafaf; + selection-background-color: #3399ff; +} + +QLineEdit:hover:enabled, QTextEdit:hover:enabled, QSpinBox:hover:enabled, QDoubleSpinBox:hover:enabled { + border-top: 1px solid #3d7bad; + border-right: 1px solid #3d7bad; + border-left: 1px solid #b7d9ed; + border-bottom: 1px solid #b7d9ed; +} + +QSpinBox, QDoubleSpinBox { + padding-right: 18px; +} + +QSpinBox::up-button:!enabled, QDoubleSpinBox::up-button:!enabled, +QSpinBox::up-arrow:off, QDoubleSpinBox::up-arrow:off { + border-image: url(icons/spin_up_disabled.png) 1; +} + +QSpinBox::down-button:!enabled, QDoubleSpinBox::down-button:!enabled, +QSpinBox::down-arrow:off, QDoubleSpinBox::down-arrow:off { + border-image: url(icons/spin_down_disabled.png) 1; +} + +QSpinBox::up-button:hover:enabled, QDoubleSpinBox::up-button:hover:enabled { + border-image: url(icons/spin_up_enabled_hover.png) 1; +} + +QSpinBox::up-button:pressed:enabled, QDoubleSpinBox::up-button:pressed:enabled { + border-image: url(icons/spin_up_enabled_pressed.png) 1; +} + +QSpinBox::down-button:hover:enabled, QDoubleSpinBox::down-button:hover:enabled { + border-image: url(icons/spin_down_enabled_hover.png) 1; +} + +QSpinBox::down-button:pressed:enabled, QDoubleSpinBox::down-button:pressed:enabled { + border-image: url(icons/spin_down_enabled_pressed.png) 1; +} + +QSpinBox::up-button, QDoubleSpinBox::up-button { + subcontrol-origin: border; + subcontrol-position: top right; + width: 16px; + border-width: 2px; + border-bottom-width: 0; + border-image: url(icons/spin_up_enabled.png) 1; +} + +QSpinBox::down-button, QDoubleSpinBox::down-button { + subcontrol-origin: border; + subcontrol-position: bottom right; + width: 16px; + border-width: 2px; + border-top-width: 0; + border-image: url(icons/spin_down_enabled.png) 1; +} + +QFrame { + border: 1px solid #828790; +} + +QLabel { + border: 0px +} + +QLabel#labelLogoPixmap { + background: black; +} + +QLabel#labelLoadingGamelist, +QLabel#labelLoadingHierarchy, +QLabel#labelCreatingCategoryView, +QLabel#labelCreatingVersionView, +QListWidget#listWidgetFavorites, +QListWidget#listWidgetPlayed, +QListWidget#listWidgetSearch, +QTreeWidget#treeWidgetCategoryView, +QTreeWidget#treeWidgetVersionView, +QTreeWidget#treeWidgetGamelist, +QTreeWidget#treeWidgetHierarchy { + border-image: url(icons/gamelist-bg.png) repeat; +} diff --git a/styles/macos/macos.qss b/styles/macos/macos.qss new file mode 100644 index 0000000..9a98622 --- /dev/null +++ b/styles/macos/macos.qss @@ -0,0 +1,434 @@ +/* + * MacOS Style Sheet for QT Applications + * Author: Jaime A. Quiroga P. + * Company: GTRONICK + * Last updated: 25/12/2020, 23:10. + * Available at: https://github.com/GTRONICK/QSS/blob/master/MacOS.qss + */ +QMainWindow { + background-color:#ececec; +} +QPushButton, QToolButton, QCommandLinkButton{ + padding: 0 5px 0 5px; + border-style: solid; + border-top-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-right-color: qlineargradient(spread:pad, x1:1, y1:0, x2:0, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-bottom-color: qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-left-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-width: 2px; + border-radius: 8px; + color: #616161; + font-weight: bold; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #fbfdfd, stop:0.5 #ffffff, stop:1 #fbfdfd); +} +QPushButton::default, QToolButton::default, QCommandLinkButton::default{ + border: 2px solid transparent; + color: #FFFFFF; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #84afe5, stop:1 #1168e4); +} +QPushButton:hover, QToolButton:hover, QCommandLinkButton:hover{ + color: #3d3d3d; +} +QPushButton:pressed, QToolButton:pressed, QCommandLinkButton:pressed{ + color: #aeaeae; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #ffffff, stop:0.5 #fbfdfd, stop:1 #ffffff); +} +QPushButton:disabled, QToolButton:disabled, QCommandLinkButton:disabled{ + color: #616161; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #dce7eb, stop:0.5 #e0e8eb, stop:1 #dee7ec); +} +QLineEdit, QTextEdit, QPlainTextEdit, QSpinBox, QDoubleSpinBox, QTimeEdit, QDateEdit, QDateTimeEdit { + border-width: 2px; + border-radius: 8px; + border-style: solid; + border-top-color: qlineargradient(spread:pad, x1:0.5, y1:1, x2:0.5, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-right-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-bottom-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-left-color: qlineargradient(spread:pad, x1:1, y1:0, x2:0, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + background-color: #f4f4f4; + color: #3d3d3d; +} +QLineEdit:focus, QTextEdit:focus, QPlainTextEdit:focus, QSpinBox:focus, QDoubleSpinBox:focus, QTimeEdit:focus, QDateEdit:focus, QDateTimeEdit:focus { + border-width: 2px; + border-radius: 8px; + border-style: solid; + border-top-color: qlineargradient(spread:pad, x1:0.5, y1:1, x2:0.5, y2:0, stop:0 #85b7e3, stop:1 #9ec1db); + border-right-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #85b7e3, stop:1 #9ec1db); + border-bottom-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #85b7e3, stop:1 #9ec1db); + border-left-color: qlineargradient(spread:pad, x1:1, y1:0, x2:0, y2:0, stop:0 #85b7e3, stop:1 #9ec1db); + background-color: #f4f4f4; + color: #3d3d3d; +} +QLineEdit:disabled, QTextEdit:disabled, QPlainTextEdit:disabled, QSpinBox:disabled, QDoubleSpinBox:disabled, QTimeEdit:disabled, QDateEdit:disabled, QDateTimeEdit:disabled { + color: #b9b9b9; +} +QSpinBox::up-button, QDoubleSpinBox::up-button, QTimeEdit::up-button, QDateEdit::up-button, QDateTimeEdit::up-button { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + color: #272727; + border-left-width: 1px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + padding: 3px; +} +QSpinBox::down-button, QDoubleSpinBox::down-button, QTimeEdit::down-button, QDateEdit::down-button, QDateTimeEdit::down-button { + subcontrol-origin: padding; + subcontrol-position: bottom right; + width: 15px; + color: #272727; + border-left-width: 1px; + border-left-color: darkgray; + border-left-style: solid; + border-bottom-right-radius: 3px; + padding: 3px; +} +QSpinBox::up-button:pressed, QDoubleSpinBox::up-button:pressed, QTimeEdit::up-button:pressed, QDateEdit::up-button:pressed, QDateTimeEdit::up-button:pressed { + color: #aeaeae; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #ffffff, stop:0.5 #fbfdfd, stop:1 #ffffff); +} +QSpinBox::down-button:pressed, QDoubleSpinBox::down-button:pressed, QTimeEdit::down-button:pressed, QDateEdit::down-button:pressed, QDateTimeEdit::down-button:pressed { + color: #aeaeae; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #ffffff, stop:0.5 #fbfdfd, stop:1 #ffffff); +} +QSpinBox::up-button:hover, QDoubleSpinBox::up-button:hover, QTimeEdit::up-button:hover, QDateEdit::up-button:hover, QDateTimeEdit::up-button:hover { + color: #FFFFFF; + border-top-right-radius: 5px; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #84afe5, stop:1 #1168e4); + +} +QSpinBox::down-button:hover, QDoubleSpinBox::down-button:hover, QTimeEdit::down-button:hover, QDateEdit::down-button:hover, QDateTimeEdit::down-button:hover { + color: #FFFFFF; + border-bottom-right-radius: 5px; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #84afe5, stop:1 #1168e4); +} +QSpinBox::up-arrow, QDoubleSpinBox::up-arrow, QTimeEdit::up-arrow, QDateEdit::up-arrow, QDateTimeEdit::up-arrow { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-up-symbolic.symbolic.png); +} +QSpinBox::down-arrow, QDoubleSpinBox::down-arrow, QTimeEdit::down-arrow, QDateEdit::down-arrow, QDateTimeEdit::down-arrow { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-down-symbolic.symbolic.png); +} +QProgressBar { + max-height: 8px; + text-align: center; + font: italic bold 11px; + color: #3d3d3d; + border: 1px solid transparent; + border-radius:4px; + background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #ddd5d5, stop:0.5 #dad3d3, stop:1 #ddd5d5); +} +QProgressBar::chunk { + background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #467dd1, stop:0.5 #3b88fc, stop:1 #467dd1); + border-radius: 4px; +} +QProgressBar:disabled { + color: #616161; +} +QProgressBar::chunk:disabled { + background-color: #aeaeae; +} +QSlider::groove { + border: 1px solid #bbbbbb; + background-color: #52595d; + border-radius: 4px; +} +QSlider::groove:horizontal { + height: 6px; +} +QSlider::groove:vertical { + width: 6px; +} +QSlider::handle:horizontal { + background: #ffffff; + border-style: solid; + border-width: 1px; + border-color: rgb(207,207,207); + width: 12px; + margin: -5px 0; + border-radius: 7px; +} +QSlider::handle:vertical { + background: #ffffff; + border-style: solid; + border-width: 1px; + border-color: rgb(207,207,207); + height: 12px; + margin: 0 -5px; + border-radius: 7px; +} +QSlider::add-page, QSlider::sub-page { + border: 1px transparent; + background-color: #52595d; + border-radius: 4px; +} +QSlider::add-page:horizontal { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #ddd5d5, stop:0.5 #dad3d3, stop:1 #ddd5d5); +} +QSlider::sub-page:horizontal { + background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #467dd1, stop:0.5 #3b88fc, stop:1 #467dd1); +} +QSlider::add-page:vertical { + background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #467dd1, stop:0.5 #3b88fc, stop:1 #467dd1); +} +QSlider::sub-page:vertical { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #ddd5d5, stop:0.5 #dad3d3, stop:1 #ddd5d5); +} +QSlider::add-page:horizontal:disabled, QSlider::sub-page:horizontal:disabled, QSlider::add-page:vertical:disabled, QSlider::sub-page:vertical:disabled { + background: #b9b9b9; +} +QComboBox, QFontComboBox { + border-width: 2px; + border-radius: 8px; + border-style: solid; + border-top-color: qlineargradient(spread:pad, x1:0.5, y1:1, x2:0.5, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-right-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-bottom-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #c1c9cf, stop:1 #d2d8dd); + border-left-color: qlineargradient(spread:pad, x1:1, y1:0, x2:0, y2:0, stop:0 #c1c9cf, stop:1 #d2d8dd); + background-color: #f4f4f4; + color: #272727; + padding-left: 5px; +} +QComboBox:editable, QComboBox:!editable, QComboBox::drop-down:editable, QComboBox:!editable:on, QComboBox::drop-down:editable:on { + background: #ffffff; +} +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + color: #272727; + border-left-width: 1px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +QComboBox::down-arrow { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-down-symbolic.symbolic.png); /*Adawaita icon thene*/ +} + +QComboBox::down-arrow:on { + top: 1px; + left: 1px; +} +QComboBox QAbstractItemView { + border: 1px solid darkgray; + border-radius: 8px; + selection-background-color: #dadada; + selection-color: #272727; + color: #272727; + background: white; +} +QLabel, QCheckBox, QRadioButton { + color: #272727; +} +QCheckBox { + padding: 2px; +} +QCheckBox:disabled, QRadioButton:disabled { + color: #808086; + padding: 2px; +} + +QCheckBox:hover { + border-radius:4px; + border-style:solid; + padding-left: 1px; + padding-right: 1px; + padding-bottom: 1px; + padding-top: 1px; + border-width:1px; + border-color: transparent; +} +QCheckBox::indicator:checked { + image: url(/usr/share/icons/Adwaita/16x16/actions/object-select-symbolic.symbolic.png); + height: 15px; + width: 15px; + border-style:solid; + border-width: 1px; + border-color: #48a5fd; + color: #ffffff; + border-radius: 3px; + background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 #48a5fd, stop:0.5 #329cfb, stop:1 #48a5fd); +} +QCheckBox::indicator:unchecked { + + height: 15px; + width: 15px; + border-style:solid; + border-width: 1px; + border-color: #48a5fd; + border-radius: 3px; + background-color: #fbfdfa; +} +QLCDNumber { + color: #616161;; +} +QMenuBar { + background-color: #ececec; +} +QMenuBar::item { + color: #616161; + spacing: 3px; + padding: 1px 4px; + background-color: #ececec; +} + +QMenuBar::item:selected { + background-color: #dadada; + color: #3d3d3d; +} +QMenu { + background-color: #ececec; +} +QMenu::item:selected { + background-color: #dadada; + color: #3d3d3d; +} +QMenu::item { + color: #616161;; + background-color: #e0e0e0; +} +QTabWidget { + color:rgb(0,0,0); + background-color:#000000; +} +QTabWidget::pane { + border-color: #050a0e; + background-color: #e0e0e0; + border-width: 1px; + border-radius: 4px; + position: absolute; + top: -0.5em; + padding-top: 0.5em; +} + +QTabWidget::tab-bar { + alignment: center; +} + +QTabBar::tab { + border-bottom: 1px solid #c0c0c0; + padding: 3px; + color: #272727; + background-color: #fefefc; + margin-left:0px; +} +QTabBar::tab:!last { + border-right: 1px solid; + border-right-color: #c0c0c0; + border-bottom-color: #c0c0c0; +} +QTabBar::tab:first { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +QTabBar::tab:last { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +QTabBar::tab:selected, QTabBar::tab:last:selected, QTabBar::tab:hover { + color: #FFFFFF; + background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 #84afe5, stop:1 #1168e4); +} +QRadioButton::indicator { + height: 14px; + width: 14px; + border-style:solid; + border-radius:7px; + border-width: 1px; +} +QRadioButton::indicator:checked { + border-color: #48a5fd; + background-color: qradialgradient(cx:0.5, cy:0.5, radius:0.4,fx:0.5, fy:0.5, stop:0 #ffffff, stop:0.5 #ffffff, stop:0.6 #48a5fd, stop:1 #48a5fd); +} +QRadioButton::indicator:!checked { + border-color: #a9b7c6; + background-color: #fbfdfa; +} +QStatusBar { + color:#027f7f; +} + +QDial { + background: #16a085; +} + +QToolBox { + color: #a9b7c6; + background-color: #222b2e; +} +QToolBox::tab { + color: #a9b7c6; + background-color:#222b2e; +} +QToolBox::tab:selected { + color: #FFFFFF; + background-color:#222b2e; +} +QScrollArea { + color: #FFFFFF; + background-color:#222b2e; +} + +QScrollBar:horizontal { + max-height: 10px; + border: 1px transparent grey; + margin: 0px 20px 0px 20px; + background: transparent; +} +QScrollBar:vertical { + max-width: 10px; + border: 1px transparent grey; + margin: 20px 0px 20px 0px; + background: transparent; +} +QScrollBar::handle:vertical, QScrollBar::handle:horizontal { + background: #52595d; + border-style: transparent; + border-radius: 4px; + min-height: 25px; +} +QScrollBar::handle:horizontal:hover, QScrollBar::handle:vertical:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #467dd1, stop:0.5 #3b88fc, stop:1 #467dd1); +} +QScrollBar::add-line, QScrollBar::sub-line { + border: 2px transparent grey; + border-radius: 4px; + subcontrol-origin: margin; + background: #b9b9b9; +} +QScrollBar::add-line:horizontal { + width: 20px; + subcontrol-position: right; +} +QScrollBar::add-line:vertical { + height: 20px; + subcontrol-position: bottom; +} +QScrollBar::sub-line:horizontal { + width: 20px; + subcontrol-position: left; +} +QScrollBar::sub-line:vertical { + height: 20px; + subcontrol-position: top; +} +QScrollBar::add-line:vertical:pressed, QScrollBar::add-line:horizontal:pressed, QScrollBar::sub-line:horizontal:pressed, QScrollBar::sub-line:vertical:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 #467dd1, stop:0.5 #3b88fc, stop:1 #467dd1); +} +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal, QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} +QScrollBar::up-arrow:vertical { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-up-symbolic.symbolic.png); +} +QScrollBar::down-arrow:vertical { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-down-symbolic.symbolic.png); +} +QScrollBar::left-arrow:horizontal { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-previous-symbolic.symbolic.png); +} +QScrollBar::right-arrow:horizontal { + image: url(/usr/share/icons/Adwaita/16x16/actions/go-next-symbolic.symbolic.png); +} diff --git a/styles/wombat/icons/caret-down_ffffff_14.png b/styles/wombat/icons/caret-down_ffffff_14.png new file mode 100644 index 0000000..6add5a4 Binary files /dev/null and b/styles/wombat/icons/caret-down_ffffff_14.png differ diff --git a/styles/wombat/icons/caret-right_ffffff_14.png b/styles/wombat/icons/caret-right_ffffff_14.png new file mode 100644 index 0000000..3c46502 Binary files /dev/null and b/styles/wombat/icons/caret-right_ffffff_14.png differ diff --git a/styles/wombat/icons/check.png b/styles/wombat/icons/check.png new file mode 100644 index 0000000..0726b78 Binary files /dev/null and b/styles/wombat/icons/check.png differ diff --git a/styles/wombat/icons/cross.svg b/styles/wombat/icons/cross.svg new file mode 100644 index 0000000..ee86af6 --- /dev/null +++ b/styles/wombat/icons/cross.svg @@ -0,0 +1,59 @@ + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/wombat/icons/down_arrow.png b/styles/wombat/icons/down_arrow.png new file mode 100644 index 0000000..db581cb Binary files /dev/null and b/styles/wombat/icons/down_arrow.png differ diff --git a/styles/wombat/icons/eye-blocked.svg b/styles/wombat/icons/eye-blocked.svg new file mode 100644 index 0000000..2d87d53 --- /dev/null +++ b/styles/wombat/icons/eye-blocked.svg @@ -0,0 +1,67 @@ + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/styles/wombat/icons/eye.svg b/styles/wombat/icons/eye.svg new file mode 100644 index 0000000..5a10d73 --- /dev/null +++ b/styles/wombat/icons/eye.svg @@ -0,0 +1,56 @@ + + + + + + + + image/svg+xml + + + + + + + + diff --git a/styles/wombat/wombat.qss b/styles/wombat/wombat.qss new file mode 100644 index 0000000..53d2e79 --- /dev/null +++ b/styles/wombat/wombat.qss @@ -0,0 +1,516 @@ +/* author = Nathan Woodrow */ + +QToolTip +{ + border: 1px solid #222; + background-color: #333; + color: #aaa; +} + +QWidget +{ + color: #aaa; + background-color: #323232; +} + + +QWidget:item:hover +{ + background-color: #507098; + color: #aaa; +} + +QWidget:item:selected +{ + background-color: #507098; +} + +QMenuBar { + background-color: #323232; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + /* + background: transparent; + border: 1px solid #ffaa00; + */ + background: #444; +} + +QMenuBar::item:pressed +{ + border: 1px solid #000; + background-color: #444; + margin-bottom:-1px; + padding-bottom:1px; +} + +/* ==================================================================================== */ +/* MENU */ +/* ==================================================================================== */ + +QMenu +{ + background: #444; + border: 1px solid #222; + padding: 4px; + padding-right: 0px; +} + +QMenu::item +{ + background: transparent; + padding: 2px 20px 2px 20px; +} + +QMenu::item:disabled +{ + color: #555; + background: transparent; + padding: 2px 20px 2px 20px; +} + + +QMenu::item:selected +{ + background-color: #507098; + color: #aaa; +} + +QWidget:disabled +{ + color: #404040; + background-color: #323232; +} + +QLineEdit +{ + padding: 1px; + border: 1px solid #111; + background-color: #888; + color: #111; +} + +QPushButton +{ + color: #b1b1b1; +/* background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646);*/ + border-width: 1px; + border-color: #1e1e1e; + border-style: solid; + padding: 3px; + font-size: 12px; + padding-left: 5px; + padding-right: 5px; +} + +QPushButton:pressed +{ +/* background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #2d2d2d, stop: 0.1 #2b2b2b, stop: 0.5 #292929, stop: 0.9 #282828, stop: 1 #252525);*/ +} + +/* ==================================================================================== */ +/* COMBO BOX */ +/* ==================================================================================== */ + +QComboBox { + selection-background-color: #ffaa00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #565656, stop: 0.1 #525252, stop: 0.5 #4e4e4e, stop: 0.9 #4a4a4a, stop: 1 #464646); + border-style: solid; + border: 1px solid #1e1e1e; +} + +QComboBox:hover,QPushButton:hover { + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #565656, + stop: 0.1 #525252, + stop: 0.5 #4e4e4e, + stop: 0.9 #4a4a4a, + stop: 1 #464646); +} + + +QComboBox:on { + padding-top: 1px; + padding-left: 3px; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #555, + stop: 0.1 #4C4C4C, + stop: 0.5 #464646, + stop: 0.9 #414141, + stop: 1 #444); + selection-background-color: #ffaa00; +} + +QComboBox QAbstractItemView { + border: 1px solid #222; + selection-background-color: #507098; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border: 0px; + } + +QComboBox::down-arrow +{ + image: url(icons/down_arrow.png); +} +QLineEdit:focus +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + + +QTextEdit:focus +{ + border: 2px solid QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #ffa02f, stop: 1 #d7801a); +} + +/* ==================================================================================== */ +/* SCROLL BAR */ +/* ==================================================================================== */ + +QScrollBar:horizontal { + background-color: #333; + height: 8px; + margin: 0px; + padding: 0px; +} + +QScrollBar::handle:horizontal { + border: 1px solid #111; + background: #535353; +} + +QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal, +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + width: 0px; + background: transparent; +} + +QScrollBar:vertical { + background-color: #333; + width: 8px; + margin: 0; +} + +QScrollBar::handle:vertical { + border: 1px solid #111; + background: #535353; +} + +QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + height: 0px; + background: transparent; +} + + +QTextEdit +{ + background-color: #242424; +} + +QPlainTextEdit +{ + background-color: #242424; +} + +QSizeGrip +{ + width: 1px; +} + +QHeaderView::section +{ + /*background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #616161, stop: 0.5 #505050, stop: 0.6 #434343, stop:1 #656565);*/ + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; +} +QDockWidget +{ + titlebar-close-icon: url(icons/cross.svg); +} + +QDockWidget::separator +{ + border: 1px solid red; +} + +QDockWidget::title +{ + text-align: center; + spacing: 3px; /* spacing between items in the tool bar */ + background-color: #323232; + font-weight: bold; +} + +QDockWidget::close-button, QDockWidget::float-button +{ + text-align: center; + spacing: 1px; /* spacing between items in the tool bar */ +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover +{ + background: #242424; +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed +{ + padding: 1px -1px -1px 1px; +} + +QMainWindow::separator +{ + /*background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434);*/ + color: white; + padding-left: 4px; + border: 0px solid #4c4c4c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QMainWindow::separator:hover +{ + + /*background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #d7801a, stop:0.5 #b56c17 stop:1 #ffa02f);*/ + color: white; + padding-left: 4px; + border: 1px solid #6c6c6c; + spacing: 3px; /* spacing between items in the tool bar */ +} + +QToolBar { + background: #323232; + border: 1px solid #323232; + font-weight: bold; +} + +QToolBar::handle:horizontal +{ + image: url(:/qss_icons/rc/Hmovetoolbar.png); +} + +QToolBar::handle:vertical +{ + image: url(:/qss_icons/rc/Vmovetoolbar.png); +} + +QToolBar::separator:horizontal +{ + image: url(:/qss_icons/rc/Hsepartoolbar.png); +} + +QToolBar::separator:vertical +{ + image: url(:/qss_icons/rc/Vsepartoolbars.png); +} + +QMenu::separator +{ + height: 2px; + /* + background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:0 #161616, stop: 0.5 #151515, stop: 0.6 #212121, stop:1 #343434); + */ + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + +QProgressBar +{ + border: 2px solid grey; + text-align: center; +} + +QProgressBar::chunk +{ + background-color: #d7801a; + width: 2.15px; + margin: 0.5px; +} + +QTabBar::tab { + color: #b1b1b1; + border: 1px solid #444; + border-bottom-style: none; + background-color: #323232; + padding-left: 10px; + padding-right: 10px; + padding-top: 3px; + padding-bottom: 2px; + margin-right: -1px; +} + +QTabWidget::pane { + border: 1px solid #444; + top: 1px; +} + +QTabBar::tab:last +{ + margin-right: 0; /* the last selected tab has nothing to overlap with on the right */ +} + +QTabBar::tab:first:!selected +{ + margin-left: 0px; /* the last selected tab has nothing to overlap with on the right */ +} + +QTabBar::tab:!selected +{ + color: #b1b1b1; + border-bottom-style: solid; + margin-top: 3px; + /*background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:.4 #343434);*/ +} + +QTabBar::tab:selected +{ + margin-bottom: 0px; +} + +QTabBar::tab:!selected:hover +{ + /*border-top: 2px solid #ffaa00; + padding-bottom: 3px;*/ + /*background-color: QLinearGradient(x1:0, y1:0, x2:0, y2:1, stop:1 #212121, stop:0.4 #343434, stop:0.2 #343434, stop:0.1 #ffaa00);*/ +} + +/* ==================================================================================== */ +/* RADIO BUTTON */ +/* ==================================================================================== */ + +QGroupBox::indicator:unchecked, +QGroupBox::indicator:checked, +QCheckBox::indicator:checked, +QCheckBox::indicator:unchecked, +QRadioButton::indicator:checked, +QRadioButton::indicator:unchecked{ + color: #b1b1b1; + background-color: #323232; + border: 1px solid #b1b1b1; +} + +QGroupBox::indicator:checked, +QCheckBox::indicator:checked, +QRadioButton::indicator:checked { + background-color: qradialgradient( + cx: 0.5, cy: 0.5, + fx: 0.5, fy: 0.5, + radius: 1.0, + stop: 0.25 #ffaa00, + stop: 0.3 #323232 + ); +} + +QRadioButton::indicator +{ +} + +QGroupBox::indicator:hover, +QCheckBox::indicator:hover, +QRadioButton::indicator:hover +{ + border: 1px solid #ffaa00; +} + +/* ==================================================================================== */ +/* CHECKBOX */ +/* ==================================================================================== */ + +QAbstractItemView +{ + background-color: #222; + alternate-background-color: #323232; + color: silver; + border: none; + border-radius: 3px; + padding: 1px; +} + +QAbstractItemView::selected { + border: 0px; + outline: none; +} + +/* ==================================================================================== */ +/* TREE VIEW */ +/* ==================================================================================== */ + +QTreeView { + border: 0.5px solid rgba(108,108,108,75); +} + +QTreeView::item, QTreeView::branch { + background: transparent; + color: #DDD; +} + +QTreeView::item:hover, QTreeView::branch:hover { + background-color: #507098; + color: #DDD; +} + +QTreeView::item:selected, QTreeView::branch:selected { + background-color: #507098; + color: #DDD; +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + border-image: none; + image: url(icons/caret-right_ffffff_14.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + border-image: none; + image: url(icons/caret-down_ffffff_14.png); +} + +QgsLayerTreeView +{ +} + +QgsLayerTreeView::item +{ + border-top: 0.5px solid rgba(108,108,108,50); + border-bottom: 0.5px solid rgba(108,108,108,50); + padding: 3px; +} + +QgsLayerTreeView::indicator:unchecked{ + image: url(icons/eye-blocked.svg); +} + +QgsLayerTreeView::indicator:checked { + image: url(icons/eye.svg); +} + +/* ==================================================================================== */ +/* TABLE VIEW */ +/* ==================================================================================== */ + +QHeaderView { +} + +QHeaderView::section { + background: transparent; + background-color: #323232; + color: #777; + border-right: 0px solid #777; + border-top: 0px solid #777; + padding: 0 0 2px 3px +} diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/qgis_interface.py b/tests/qgis_interface.py new file mode 100644 index 0000000..3a65ed5 --- /dev/null +++ b/tests/qgis_interface.py @@ -0,0 +1,205 @@ +# coding=utf-8 +"""QGIS plugin implementation. + +.. note:: This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + +.. note:: This source code was copied from the 'postgis viewer' application + with original authors: + Copyright (c) 2010 by Ivan Mincik, ivan.mincik@gista.sk + Copyright (c) 2011 German Carrillo, geotux_tuxman@linuxmail.org + Copyright (c) 2014 Tim Sutton, tim@linfiniti.com + +""" + +__author__ = 'tim@linfiniti.com' +__revision__ = '$Format:%H$' +__date__ = '10/01/2011' +__copyright__ = ( + 'Copyright (c) 2010 by Ivan Mincik, ivan.mincik@gista.sk and ' + 'Copyright (c) 2011 German Carrillo, geotux_tuxman@linuxmail.org' + 'Copyright (c) 2014 Tim Sutton, tim@linfiniti.com' +) + +import logging +from PyQt5.QtCore import QObject, pyqtSlot, pyqtSignal +from qgis.core import QgsMapLayerRegistry +from qgis.gui import QgsMapCanvasLayer +LOGGER = logging.getLogger('QGIS') + + +#noinspection PyMethodMayBeStatic,PyPep8Naming +class QgisInterface(QObject): + """Class to expose QGIS objects and functions to plugins. + + This class is here for enabling us to run unit tests only, + so most methods are simply stubs. + """ + currentLayerChanged = pyqtSignal(QgsMapCanvasLayer) + + def __init__(self, canvas): + """Constructor + :param canvas: + """ + QObject.__init__(self) + self.canvas = canvas + # Set up slots so we can mimic the behaviour of QGIS when layers + # are added. + LOGGER.debug('Initialising canvas...') + # noinspection PyArgumentList + QgsMapLayerRegistry.instance().layersAdded.connect(self.addLayers) + # noinspection PyArgumentList + QgsMapLayerRegistry.instance().layerWasAdded.connect(self.addLayer) + # noinspection PyArgumentList + QgsMapLayerRegistry.instance().removeAll.connect(self.removeAllLayers) + + # For processing module + self.destCrs = None + + @pyqtSlot('QStringList') + def addLayers(self, layers): + """Handle layers being added to the registry so they show up in canvas. + + :param layers: list list of map layers that were added + + .. note:: The QgsInterface api does not include this method, + it is added here as a helper to facilitate testing. + """ + #LOGGER.debug('addLayers called on qgis_interface') + #LOGGER.debug('Number of layers being added: %s' % len(layers)) + #LOGGER.debug('Layer Count Before: %s' % len(self.canvas.layers())) + current_layers = self.canvas.layers() + final_layers = [] + for layer in current_layers: + final_layers.append(QgsMapCanvasLayer(layer)) + for layer in layers: + final_layers.append(QgsMapCanvasLayer(layer)) + + self.canvas.setLayerSet(final_layers) + #LOGGER.debug('Layer Count After: %s' % len(self.canvas.layers())) + + @pyqtSlot('QgsMapLayer') + def addLayer(self, layer): + """Handle a layer being added to the registry so it shows up in canvas. + + :param layer: list list of map layers that were added + + .. note: The QgsInterface api does not include this method, it is added + here as a helper to facilitate testing. + + .. note: The addLayer method was deprecated in QGIS 1.8 so you should + not need this method much. + """ + pass + + @pyqtSlot() + def removeAllLayers(self): + """Remove layers from the canvas before they get deleted.""" + self.canvas.setLayerSet([]) + + def newProject(self): + """Create new project.""" + # noinspection PyArgumentList + QgsMapLayerRegistry.instance().removeAllMapLayers() + + # ---------------- API Mock for QgsInterface follows ------------------- + + def zoomFull(self): + """Zoom to the map full extent.""" + pass + + def zoomToPrevious(self): + """Zoom to previous view extent.""" + pass + + def zoomToNext(self): + """Zoom to next view extent.""" + pass + + def zoomToActiveLayer(self): + """Zoom to extent of active layer.""" + pass + + def addVectorLayer(self, path, base_name, provider_key): + """Add a vector layer. + + :param path: Path to layer. + :type path: str + + :param base_name: Base name for layer. + :type base_name: str + + :param provider_key: Provider key e.g. 'ogr' + :type provider_key: str + """ + pass + + def addRasterLayer(self, path, base_name): + """Add a raster layer given a raster layer file name + + :param path: Path to layer. + :type path: str + + :param base_name: Base name for layer. + :type base_name: str + """ + pass + + def activeLayer(self): + """Get pointer to the active layer (layer selected in the legend).""" + # noinspection PyArgumentList + layers = QgsMapLayerRegistry.instance().mapLayers() + for item in layers: + return layers[item] + + def addToolBarIcon(self, action): + """Add an icon to the plugins toolbar. + + :param action: Action to add to the toolbar. + :type action: QAction + """ + pass + + def removeToolBarIcon(self, action): + """Remove an action (icon) from the plugin toolbar. + + :param action: Action to add to the toolbar. + :type action: QAction + """ + pass + + def addToolBar(self, name): + """Add toolbar with specified name. + + :param name: Name for the toolbar. + :type name: str + """ + pass + + def mapCanvas(self): + """Return a pointer to the map canvas.""" + return self.canvas + + def mainWindow(self): + """Return a pointer to the main window. + + In case of QGIS it returns an instance of QgisApp. + """ + pass + + def addDockWidget(self, area, dock_widget): + """Add a dock widget to the main window. + + :param area: Where in the ui the dock should be placed. + :type area: + + :param dock_widget: A dock widget to add to the UI. + :type dock_widget: QDockWidget + """ + pass + + def legendInterface(self): + """Get the legend.""" + return self.canvas diff --git a/tests/test_init.py b/tests/test_init.py new file mode 100644 index 0000000..a11ca44 --- /dev/null +++ b/tests/test_init.py @@ -0,0 +1,64 @@ +# coding=utf-8 +"""Tests QGIS plugin init.""" + +__author__ = 'Tim Sutton ' +__revision__ = '$Format:%H$' +__date__ = '17/10/2010' +__license__ = "GPL" +__copyright__ = 'Copyright 2012, Australia Indonesia Facility for ' +__copyright__ += 'Disaster Reduction' + +import os +import unittest +import logging +import configparser + +LOGGER = logging.getLogger('QGIS') + + +class TestInit(unittest.TestCase): + """Test that the plugin init is usable for QGIS. + + Based heavily on the validator class by Alessandro + Passoti available here: + + http://github.com/qgis/qgis-django/blob/master/qgis-app/ + plugins/validator.py + + """ + + def test_read_init(self): + """Test that the plugin __init__ will validate on plugins.qgis.org.""" + + # You should update this list according to the latest in + # https://github.com/qgis/qgis-django/blob/master/qgis-app/ + # plugins/validator.py + + required_metadata = [ + 'name', + 'description', + 'version', + 'qgisMinimumVersion', + 'email', + 'author'] + + file_path = os.path.abspath(os.path.join( + os.path.dirname(__file__), os.pardir, + 'metadata.txt')) + LOGGER.info(file_path) + metadata = [] + parser = configparser.ConfigParser() + parser.optionxform = str + parser.read(file_path) + message = 'Cannot find a section named "general" in %s' % file_path + assert parser.has_section('general'), message + metadata.extend(parser.items('general')) + + for expectation in required_metadata: + message = ('Cannot find metadata "%s" in metadata source (%s).' % ( + expectation, file_path)) + + self.assertIn(expectation, dict(metadata), message) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_qgis_environment.py b/tests/test_qgis_environment.py new file mode 100644 index 0000000..125ddee --- /dev/null +++ b/tests/test_qgis_environment.py @@ -0,0 +1,54 @@ +# coding=utf-8 +"""Tests for QGIS functionality. + + +.. note:: This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + +""" +__author__ = 'tim@linfiniti.com' +__date__ = '20/01/2011' +__copyright__ = ('Copyright 2012, Australia Indonesia Facility for ' + 'Disaster Reduction') + +import os +import unittest +from qgis.core import ( + QgsProviderRegistry, + QgsCoordinateReferenceSystem, + QgsRasterLayer) + +from qgis.testing import start_app +QGIS_APP = start_app() + + +class QGISTest(unittest.TestCase): + """Test the QGIS Environment""" + + def test_qgis_environment(self): + """QGIS environment has the expected providers""" + + r = QgsProviderRegistry.instance() + self.assertIn('gdal', r.providerList()) + self.assertIn('ogr', r.providerList()) + self.assertIn('postgres', r.providerList()) + + def test_projection(self): + """Test that QGIS properly parses a wkt string. + """ + crs = QgsCoordinateReferenceSystem() + wkt = ( + 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",' + 'SPHEROID["WGS_1984",6378137.0,298.257223563]],' + 'PRIMEM["Greenwich",0.0],UNIT["Degree",' + '0.0174532925199433]]') + crs.createFromWkt(wkt) + auth_id = crs.authid() + expected_auth_id = 'EPSG:4326' + self.assertEqual(auth_id, expected_auth_id) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_styles_loading.py b/tests/test_styles_loading.py new file mode 100644 index 0000000..9626a9b --- /dev/null +++ b/tests/test_styles_loading.py @@ -0,0 +1,55 @@ +import pytest +from qgis.testing import start_app +from qgis.PyQt.QtCore import QSettings + +from ..tools import StyleManager + +QGIS_APP = start_app() + + +def test_set_default_style(qtbot): + app = QGIS_APP + + expected = 'foobar' + app.setStyleSheet(expected) + app.processEvents() + + assert app.styleSheet() == expected + + +def test_stylemanager_get_styles(qtbot): + sm = StyleManager() + styles = sm.get_styles() + assert styles == ['blueglass', + 'coffee', + 'darkblue', + 'darkorange', + 'giap', + 'lightblue', + 'wombat'] + + +def test_stylemanager_set_default_style(): + app = QGIS_APP + sm = StyleManager() + sm.activate_style('default') + + assert app.styleSheet() == '' + + +def test_stylemanager_set_giap_style(): + app = QGIS_APP + sm = StyleManager() + sm.activate_style('giap') + + assert len(app.styleSheet()) > 2000 + + +def test_stylemanager_set_active_style(): + app = QGIS_APP + sm = StyleManager() + sm.set_active_style('foobar') + sm.set_active_style('giap') + + assert QSettings().value('giapStyle/active') == 'giap' + diff --git a/tests/utilities.py b/tests/utilities.py new file mode 100644 index 0000000..9c7f1f4 --- /dev/null +++ b/tests/utilities.py @@ -0,0 +1,61 @@ +# coding=utf-8 +"""Common functionality used by regression tests.""" + +import sys +import logging + + +LOGGER = logging.getLogger('QGIS') +QGIS_APP = None # Static variable used to hold hand to running QGIS app +CANVAS = None +PARENT = None +IFACE = None + + +def get_qgis_app(): + """ Start one QGIS application to test against. + + :returns: Handle to QGIS app, canvas, iface and parent. If there are any + errors the tuple members will be returned as None. + :rtype: (QgsApplication, CANVAS, IFACE, PARENT) + + If QGIS is already running the handle to that app will be returned. + """ + + try: + from PyQt5 import QtGui, QtCore + from qgis.core import QgsApplication + from qgis.gui import QgsMapCanvas + from .qgis_interface import QgisInterface + except ImportError: + return None, None, None, None + + global QGIS_APP # pylint: disable=W0603 + + if QGIS_APP is None: + gui_flag = True # All test will run qgis in gui mode + #noinspection PyPep8Naming + QGIS_APP = QgsApplication(sys.argv, gui_flag) + # Make sure QGIS_PREFIX_PATH is set in your env if needed! + QGIS_APP.initQgis() + s = QGIS_APP.showSettings() + LOGGER.debug(s) + + global PARENT # pylint: disable=W0603 + if PARENT is None: + #noinspection PyPep8Naming + PARENT = QtGui.QWidget() + + global CANVAS # pylint: disable=W0603 + if CANVAS is None: + #noinspection PyPep8Naming + CANVAS = QgsMapCanvas(PARENT) + CANVAS.resize(QtCore.QSize(400, 400)) + + global IFACE # pylint: disable=W0603 + if IFACE is None: + # QgisInterface is a stub implementation of the QGIS plugin interface + #noinspection PyPep8Naming + IFACE = QgisInterface(CANVAS) + + return QGIS_APP, CANVAS, IFACE, PARENT diff --git a/tools.py b/tools.py new file mode 100644 index 0000000..01cfe7f --- /dev/null +++ b/tools.py @@ -0,0 +1,105 @@ +import os +import re + +from qgis.PyQt.QtWidgets import QApplication +from qgis.PyQt.QtCore import QFileSystemWatcher + + +class StyleManager: + def __init__(self, parent): + self.app = QApplication.instance() + + self.config = parent.config + # keep watch on file, there are applications that change or remove a + # file + self.watch = QFileSystemWatcher() + self.watch.fileChanged.connect(self.reload_style) + + self.style_dir = os.path.abspath(os.path.join( + os.path.dirname(os.path.abspath(__file__)), 'styles' + )) + + # here add default styles, otherwise the will not be seen in qgis + self.styles = { + 'giap': 'giap.qss', + 'blueglass': 'blueglass.qss', + 'coffee': 'coffee.qss', + 'darkblue': 'darkblue.qss', + 'darkorange': 'darkorange.qss', + 'lightblue': 'lightblue.qss', + 'wombat': 'wombat.qss', + } + + # add default styles to settings + # for style, path in styles.items(): + # self.set_style(style, os.path.join(self.style_dir, style, path)) + + def get_style_list(self): + return [x for x in self.style.keys()] + + def run_last_style(self): + """ load active style on stratup""" + try: + last = self.config.get_active_style() + if last not in [None, '', False]: + last_pth = os.path.join( + self.style_dir, last, self.config.get_style_path(last) + ) + self.reload_style(last_pth) + except Exception: + return + + def remove_style(self, name): + """Remove style from qgis config""" + if self.config.get_active_style() == name: + self.config.set_active_style('') + self.activate_style('') + self.config.delete_style(name) + + def reload_style(self, path): + """ load style to qgis, and set watch on it to remain active + :path: str ( path to style) + :return: bool, str + """ + self.watch.removePaths(self.watch.files()) + self.watch.addPath(path) + with open(path, "r") as f: + stylesheet = f.read() + # Update the image paths to use full paths. + # Fixes image loading in styles + path = os.path.dirname(path).replace("\\", "/") + stylesheet = re.sub(r'url\((.*?)\)', r'url("{}/\1")'.format(path), + stylesheet) + self.app.setStyleSheet(stylesheet) + self.app.processEvents() + + def activate_style(self, name): + """activate selected style, or set default if problem occured + :res: bool + :name: str (message for user) + """ + self.watch.removePaths(self.watch.files()) + pth = '' + styles = self.config.get_style_list() + if name in styles: + pth = os.path.join( + self.style_dir, name, self.config.get_style_path(name) + ) + + # if path to style not found set default style + if pth in ['', None]: + self.app.setStyleSheet('') + pth = '' + + # check if file exist + if not os.path.exists(pth): + self.app.setStyleSheet('') # return do default, and save it in con + if name == 'default': + self.config.set_active_style('') + return False, 'Default style set' + else: + return False, 'Path to *.qss not found, load default style' + + self.reload_style(pth) + self.config.set_active_style(name) + return True, 'Style activated!' diff --git a/utils.py b/utils.py index bb67223..1f33391 100644 --- a/utils.py +++ b/utils.py @@ -1,82 +1,294 @@ -OBJECT_ACTION_DICT = { - 'btn_nav_1': 'mActionPan', - 'btn_nav_2': 'mActionZoomIn', - 'btn_nav_3': 'mActionZoomOut', - 'btn_nav_4': 'mActionZoomFullExtent', - 'btn_nav_5': 'mActionZoomToLayer', - 'btn_nav_6': 'mActionZoomToSelected', - 'btn_nav_7': 'mActionZoomLast', - 'btn_nav_8': 'mActionZoomNext', - - 'btn_projekt_1': 'mActionOpenProject', - 'btn_projekt_2': 'mActionNewProject', - 'btn_projekt_3': 'mActionSaveProject', - 'btn_projekt_4': 'mActionSaveProjectAs', - - 'btn_attr_1': 'mActionIdentify', - 'btn_attr_2': 'mActionSelectFeatures', - 'zaznacz_panelPushButton': 'mActionSelectFeatures', - 'btn_attr_3': 'mActionDeselectAll', - 'odznacz_panelPushButton': 'mActionDeselectAll', - 'btn_attr_4': 'mActionOpenTable', - - 'btn_miary_1': 'mActionMeasure', - 'btn_miary_2': 'mActionMeasureArea', - 'btn_miary_3': 'mActionMeasureAngle', - - 'btn_lr_1': 'mActionAddOgrLayer', - 'btn_lr_2': 'mActionAddWmsLayer', - 'btn_lr_3': 'mActionAddPgLayer', - 'btn_lr_4': 'mActionAddRasterLayer', - 'btn_lr_5': 'mActionAddWfsLayer', - 'btn_lr_6': 'mActionAddSpatiaLiteLayer', - 'btn_nowy_wydruk': 'mActionNewPrintLayout', - 'btn_zarzadzanie_wydr': 'mActionShowLayoutManager', - - 'btn_vec_1': 'mActionToggleEditing', - 'btn_vec_2': 'mActionSaveLayerEdits', - 'btn_vec_3': 'mActionVertexTool', - 'btn_vec_4': 'mActionUndo', - 'btn_vec_5': 'mActionRedo', - 'btn_vec_6': 'mActionAddFeature', - 'btn_vec_7': 'mActionMoveFeature', - 'btn_vec_8': 'mActionDeleteSelected', - 'btn_vec_9': 'mActionCopyFeatures', - 'btn_vec_10': 'mActionPasteFeatures', - 'btn_vec_12': 'mActionCutFeatures', - - 'btn_lab_1': 'mActionLabeling', - 'btn_lab_2': 'mActionChangeLabelProperties', - 'btn_lab_3': 'mActionShowHideLabels', - 'btn_lab_4': 'mActionMoveLabel', - 'btn_lab_5': 'mActionRotateLabel', - 'btn_lab_6': 'mActionDiagramProperties', - - 'btn_attr_5': 'mActionMapTips', - 'btn_attr_6': 'mActionNewBookmark', - 'btn_attr_7': 'mActionShowBookmarks', - 'btn_attr_8': 'mActionSelectByExpression', - 'btn_attr_9': 'mActionIdentify', - 'btn_attr_10': 'mActionSelectFeatures', - 'btn_attr_11': 'mActionDeselectAll', - 'btn_attr_12': 'mActionOpenTable', - 'btn_attr_13': 'mActionOpenFieldCalc', - 'btn_attr_14': 'mActionStatisticalSummary', - 'btn_attr_15': 'mActionSelectPolygon', - 'btn_attr_16': 'mActionInvertSelection', - - 'btn_dig_5': 'mActionRotateFeature', - 'btn_dig_6': 'mActionSimplifyFeature', - 'btn_dig_7': 'mActionAddRing', - 'btn_dig_8': 'mActionAddPart', - 'btn_dig_9': 'mActionFillRing', - 'btn_dig_10': 'mActionDeleteRing', - 'btn_dig_11': 'mActionDeletePart', - 'btn_dig_12': 'mActionOffsetCurve', - 'btn_dig_13': 'mActionReshapeFeatures', - 'btn_dig_14': 'mActionSplitParts', - 'btn_dig_15': 'mActionSplitFeatures', - 'btn_dig_16': 'mActionMergeFeatureAttributes', - 'btn_dig_17': 'mActionMergeFeatures', - 'btn_dig_18': 'mActionSnappingOptions' +from PyQt5.QtCore import QThread +from PyQt5.QtWidgets import QApplication, QProgressDialog + +from qgis.core import QgsProject, QgsMessageLog, Qgis + +project = QgsProject.instance() + + +class SingletonModel: + __instance = None + + def __new__(cls, *args): + if SingletonModel.__instance is None: + QgsMessageLog.logMessage(f'CREATE OBJECT OF CLASS: {cls.__name__}', + "giap_layout", + Qgis.Info) + SingletonModel.__instance = object.__new__(cls, *args) + return SingletonModel.__instance + + +def identify_layer(ls, layer_to_find): + for layer in list(ls.values()): + if layer.name() == layer_to_find: + return layer + + +def identify_layer_by_id(layerid_to_find): + for layerid, layer in project.mapLayers().items(): + if layerid == layerid_to_find: + return layer + + +def identify_layer_in_group(group_name, layer_to_find): + for tree_layer in project.layerTreeRoot().findLayers(): + if tree_layer.parent().name() == group_name and \ + tree_layer.layer().name() == layer_to_find: + return tree_layer.layer() + + +def identify_layer_in_group_by_parts(group_name, layer_to_find): + """ + Identyfikuje warstwę gdy nie mamy jej pełnej nazwy. + + :param group_name: string + :param layer_to_find: string, początek nazwy warstwy + :return: QgsVectorLayer + """ + for lr in project.layerTreeRoot().findLayers(): + if lr.parent().name() == group_name \ + and lr.name().startswith(layer_to_find): + return lr.layer() + + +def set_project_config(parameter, key, value): + if isinstance(project, QgsProject): + return project.writeEntry(parameter, key, value) + + +class ConfigSaveThread(QThread): + def __init__(self, parent): + super(ConfigSaveThread, self).__init__(parent) + + def run(self): + project.write() + + +class ConfigSaveProgressDialog(QProgressDialog): + def __init__(self, parent=None): + super(ConfigSaveProgressDialog, self).__init__(parent) + self.setWindowTitle('Zapisywanie ustawień') + self.setLabelText('Proszę czekać...') + self.setMaximum(0) + self.setCancelButton(None) + self.children()[0].setStyleSheet(''' + QLabel { + background-color: rgb(53, 85, 109); + color: rgb(255, 255, 255); + font: 10pt "Segoe UI"; + } + ''') + + QApplication.processEvents() + + self.thread = ConfigSaveThread(self) + self.thread.finished.connect(self.finished) + self.thread.start() + + def finished(self): + self.thread.quit() + self.thread.wait() + self.thread.deleteLater() + self.close() + + +def get_project_config(parameter, key, default=''): + value = project.readEntry(parameter, key, default)[0] + return value + + +# oba poniższe słowniki powinny być spójne +WMS_SERVERS = { + 'ORTOFOTOMAPA - WMTS': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=0&featureCount=10&format=image/jpeg&layers=ORTOFOTOMAPA&styles=default&tileMatrixSet=EPSG:2180&url=https://mapy.geoportal.gov.pl/wss/service/PZGIK/ORTO/WMTS/StandardResolution?service%3DWMTS%26request%3DgetCapabilities', + 'Wizualizacja BDOT10k - WMS': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/png8&layers=RZab&layers=TPrz&layers=SOd2&layers=SOd1&layers=GNu2&layers=GNu1&layers=TKa2&layers=TKa1&layers=TPi2&layers=TPi1&layers=UTrw&layers=TLes&layers=RKr&layers=RTr&layers=ku7&layers=ku6&layers=ku5&layers=ku4&layers=ku3&layers=ku2&layers=ku1&layers=Mo&layers=Szu&layers=Pl3&layers=Pl2&layers=Pl1&layers=kanOkr&layers=rzOk&layers=row&layers=kan&layers=rz&layers=RowEt&layers=kanEt&layers=rzEt&layers=WPow&layers=LBrzN&layers=LBrz&layers=WPowEt&layers=GrPol&layers=Rez&layers=GrPK&layers=GrPN&layers=GrDz&layers=GrGm&layers=GrPo&layers=GrWo&layers=GrPns&layers=PRur&layers=ZbTA&layers=BudCm&layers=TerCm&layers=BudSp&layers=Szkl&layers=Kap&layers=SwNch&layers=SwCh&layers=BudZr&layers=BudGo&layers=BudPWy&layers=BudP2&layers=BudP1&layers=BudUWy&layers=BudU&layers=BudMWy&layers=BudMJ&layers=BudMW&layers=Bzn&layers=BHydA&layers=BHydL&layers=wyk&layers=wa6&layers=wa5&layers=wa4&layers=wa3&layers=wa2&layers=wa1&layers=IUTA&layers=ObOrA&layers=ObPL&layers=Prom&layers=PomL&layers=MurH&layers=PerA&layers=PerL&layers=Tryb&layers=UTrL&layers=LTra&layers=LKNc&layers=LKBu&layers=LKWs&layers=TSt&layers=LKNelJ&layers=LKNelD&layers=LKNelW&layers=LKZelJ&layers=LKZelD&layers=LKZelW&layers=Scz&layers=Al&layers=AlEt&layers=Sch2&layers=Sch1&layers=DrDGr&layers=DrLGr&layers=JDrLNUt&layers=JDLNTw&layers=JDrZTw&layers=JDrG&layers=DrEk&layers=JDrEk&layers=AuBud&layers=JAu&layers=NazDr&layers=NrDr&layers=Umo&layers=PPdz&layers=Prze&layers=TunK&layers=TunD&layers=Klad&layers=MosK&layers=MosD&layers=UTrP&layers=ObKom&layers=InUTP&layers=ZbTP&layers=NazUl&layers=ObOrP&layers=WyBT&layers=LTel&layers=LEle&layers=ObPP&layers=DrzPomP&layers=e13&layers=e12&layers=e11&layers=e10&layers=e9&layers=e8&layers=e7&layers=e6&layers=e5&layers=e4&layers=e3&layers=e2&layers=e1&layers=s19&layers=s18&layers=s17&layers=s16&layers=s15&layers=s14&layers=s13&layers=s12&layers=s11&layers=s10&layers=s9&layers=s8&layers=s7&layers=s6&layers=s5&layers=s4&layers=s3&layers=s2&layers=s1&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&url=http://mapy.geoportal.gov.pl/wss/service/pub/guest/kompozycja_BDOT10k_WMS/MapServer/WMSServer', + 'Mapa topograficzna - WMTS': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/jpeg&layers=MAPA%20TOPOGRAFICZNA&styles=default&tileMatrixSet=EPSG:2180&url=http://mapy.geoportal.gov.pl/wss/service/WMTS/guest/wmts/TOPO?SERVICE%3DWMTS%26REQUEST%3DGetCapabilities', + 'Krajowa Integracja Ewidencji Gruntów - WMS': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/png&layers=dzialki&layers=geoportal&layers=powiaty&layers=ekw&layers=zsin&layers=obreby&layers=numery_dzialek&layers=budynki&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&url=http://integracja.gugik.gov.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow', + 'Bank Danych o Lasach - WMS': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/jpeg&layers=0&layers=1&layers=2&layers=3&layers=4&layers=5&styles=&styles=&styles=&styles=&styles=&styles=&url=http://mapserver.bdl.lasy.gov.pl/ArcGIS/services/WMS_BDL/mapserver/WMSServer', + 'Wody Polskie - mapa zagrożenia powodziowego': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/png&layers=OSZP1m&layers=OSZP1&layers=OSZP10&styles=&styles=&styles=&url=http://integracja.gugik.gov.pl/cgi-bin/MapaZagrozeniaPowodziowego?', + 'Monitoring Warunków Glebowych': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/png&layers=smois_2019_10_28_12_00_00&layers=smois_2019_10_29_12_00_00&layers=smois_2019_10_30_12_00_00&layers=smois_2019_10_31_12_00_00&layers=smois_2019_11_01_12_00_00&layers=punkty&layers=wojewodztwa&styles=&styles=&styles=&styles=&styles=&styles=&styles=&url=http://integracja.gugik.gov.pl/cgi-bin/MonitoringWarunkowGlebowych?', + 'Uzbrojenie terenu': 'contextualWMSLegend=0&crs=EPSG:2180&dpiMode=7&featureCount=10&format=image/png&layers=gesut&layers=kgesut&layers=kgesut_dane&layers=przewod_elektroenergetyczny&layers=przewod_telekomunikacyjny&layers=przewod_wodociagowy&layers=przewod_kanalizacyjny&layers=przewod_gazowy&layers=przewod_cieplowniczy&layers=przewod_specjalny&layers=przewod_inny&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&styles=&url=http://integracja.gugik.gov.pl/cgi-bin/KrajowaIntegracjaUzbrojeniaTerenu?' +} + + +WMS_SERVERS_GROUPS = { + 'ORTOFOTOMAPA - WMTS': 'ORTOFOTOMAPA', + 'Wizualizacja BDOT10k - WMS': 'DANE DODATKOWE', + 'Mapa topograficzna - WMTS': 'DANE DODATKOWE', + 'Krajowa Integracja Ewidencji Gruntów - WMS': 'DANE DODATKOWE', + 'Bank Danych o Lasach - WMS': 'DANE DODATKOWE', + 'Wody Polskie - mapa zagrożenia powodziowego': 'DANE DODATKOWE', + 'Monitoring Warunków Glebowych': 'DANE DODATKOWE', + 'Uzbrojenie terenu': 'DANE DODATKOWE' } + +STANDARD_TOOLS = [ + { + "label": "Project", + "id": "Project", + "btn_size": 30, + "btns": [ + ["mActionOpenProject", 0, 0], + ["mActionNewProject", 0, 1], + ["mActionSaveProject", 1, 0], + ["mActionSaveProjectAs", 1, 1] + ] + }, + + { + "label": "Navigation", + "id": "Navigation", + "btn_size": 30, + "btns": [ + ["mActionPan", 0, 0], + ["mActionZoomIn", 0, 1], + ["mActionZoomOut", 0, 2], + ["mActionZoomFullExtent", 0, 3], + + ["mActionZoomToLayer", 1, 0], + ["mActionZoomToSelected", 1, 1], + ["mActionZoomLast", 1, 2], + ["mActionZoomNext", 1, 3] + ] + }, + + { + 'label': 'Attributes', + 'id': 'Attributes', + 'btn_size': 30, + 'btns': [ + ['mActionIdentify', 0, 0], + ['mActionSelectFeatures', 0, 1], + ['mActionDeselectAll', 1, 0], + ['mActionOpenTable', 1, 1], + ], + }, + + { + 'label': 'Measures', + 'id': 'Measures', + 'btn_size': 60, + 'btns': [ + ['mActionMeasure', 0, 0], + ['mActionMeasureArea', 0, 1], + ['mActionMeasureAngle', 0, 2], + ], + }, + + { + 'label': 'Layers', + 'id': 'Layers', + 'btn_size': 30, + 'btns': [ + ['mActionAddOgrLayer', 0, 0], + ['mActionAddWmsLayer', 0, 1], + ['mActionAddPgLayer', 0, 2], + ['mActionAddMeshLayer', 0, 3], + ['mActionAddWcsLayer', 0, 4], + ['mActionAddDelimitedText', 0, 5], + + ['mActionAddRasterLayer', 1, 0], + ['mActionAddWfsLayer', 1, 1], + ['mActionAddSpatiaLiteLayer', 1, 2], + ['mActionAddVirtualLayer', 1, 3], + ['mActionNewMemoryLayer', 1, 4], + ], + }, + + { + 'label': 'Adv. Attributes', + 'id': 'Adv. Attributes', + 'btn_size': 30, + 'btns': [ + ['mActionIdentify', 0, 0], + ['mActionSelectFeatures', 0, 1], + ['mActionSelectPolygon', 0, 2], + ['mActionSelectByExpression', 0, 3], + ['mActionInvertSelection', 0, 4], + ['mActionDeselectAll', 0, 5], + + ['mActionOpenTable', 1, 0], + ['mActionStatisticalSummary', 1, 1], + ['mActionOpenFieldCalc', 1, 2], + ['mActionMapTips', 1, 3], + ['mActionNewBookmark', 1, 4], + ['mActionShowBookmarks', 1, 5], + ], + }, + + { + 'label': 'Labels', + 'id': 'Labels', + 'btn_size': 30, + 'btns': [ + ['mActionLabeling', 0, 0], + ['mActionChangeLabelProperties', 0, 1], + ['mActionPinLabels', 0, 2], + ['mActionShowPinnedLabels', 0, 3], + ['mActionShowHideLabels', 0, 4], + ['mActionMoveLabel', 1, 0], + ['mActionRotateLabel', 1, 1], + ['mActionDiagramProperties', 1, 2], + ['mActionShowUnplacedLabels', 1, 3], + ] + }, + + { + 'label': 'Vector', + 'id': 'Vector', + 'btn_size': 30, + 'btns': [ + ['mActionToggleEditing', 0, 0], + ['mActionSaveLayerEdits', 0, 1], + ['mActionVertexTool', 0, 2], + ['mActionUndo', 0, 3], + ['mActionRedo', 0, 4], + + ['mActionAddFeature', 1, 0], + ['mActionMoveFeature', 1, 1], + ['mActionDeleteSelected', 1, 2], + ['mActionCutFeatures', 1, 3], + ['mActionCopyFeatures', 1, 4], + ['mActionPasteFeatures', 1, 5], + ], + }, + + { + 'label': 'Digitalization', + 'id': 'Digitalization', + 'btn_size': 30, + 'btns': [ + ['EnableSnappingAction', 0, 0], + ['EnableTracingAction', 0, 1], + ['mActionRotateFeature', 0, 2], + ['mActionSimplifyFeature', 0, 3], + ['mActionAddRing', 0, 4], + ['mActionAddPart', 0, 5], + ['mActionFillRing', 0, 6], + ['mActionOffsetCurve', 0, 7], + ['mActionCircularStringCurvePoint', 0, 8], + + ['mActionDeleteRing', 1, 0], + ['mActionDeletePart', 1, 1], + ['mActionReshapeFeatures', 1, 2], + ['mActionSplitParts', 1, 3], + ['mActionSplitFeatures', 1, 4], + ['mActionMergeFeatureAttributes', 1, 5], + ['mActionMergeFeatures', 1, 6], + ['mActionReverseLine', 1, 7], + ['mActionTrimExtendFeature', 1, 8], + ] + }, + + { + 'label': 'Prints', + 'id': 'Prints', + 'btn_size': 30, + 'btns': [ + ['mActionNewPrintLayout', 0, 0], + ['giapMyPrints', 0, 1], + ['mActionShowLayoutManager', 1, 0], + ['giapQuickPrint', 1, 1], + ] + }, + +] diff --git a/wydruk_dialog.ui b/wydruk_dialog.ui index 429bd0f..0c03d7e 100644 --- a/wydruk_dialog.ui +++ b/wydruk_dialog.ui @@ -13,7 +13,7 @@ 0 0 550 - 518 + 526 @@ -42,6 +42,7 @@ * { background-color: rgb(255, 255, 255); font: 10pt "Segoe UI"; + color: black; }