diff --git a/rare/components/tabs/settings/widgets/wrapper.py b/rare/components/tabs/settings/widgets/wrapper.py index a77ebd12..ab3e0e42 100644 --- a/rare/components/tabs/settings/widgets/wrapper.py +++ b/rare/components/tabs/settings/widgets/wrapper.py @@ -3,10 +3,10 @@ import shutil from logging import getLogger from typing import Dict, List -from PyQt5.QtCore import pyqtSignal, QSettings, QSize, Qt, QMimeData +from PyQt5.QtCore import pyqtSignal, QSettings, QSize, Qt, QMimeData, pyqtSlot from PyQt5.QtGui import QDrag, QDropEvent, QDragEnterEvent, QDragMoveEvent, QFont from PyQt5.QtWidgets import QHBoxLayout, QLabel, QPushButton, QInputDialog, QFrame, QMessageBox, QSizePolicy, \ - QWidget + QWidget, QScrollArea from rare import shared from rare.ui.components.tabs.settings.widgets.wrapper import Ui_WrapperSettings @@ -29,24 +29,31 @@ class WrapperWidget(QFrame): if not show_text: show_text = text - self.setLayout(QHBoxLayout()) - self.text = text - self.image_lbl = QLabel() - self.text_lbl = QLabel(show_text) - self.text_lbl.setFont(QFont("monospace")) - self.image_lbl.setPixmap(icon("mdi.drag-vertical").pixmap(QSize(20, 20))) - self.layout().addWidget(self.image_lbl) - self.layout().addWidget(self.text_lbl) - self.setProperty("frameShape", 6) + self.setFrameShape(QFrame.StyledPanel) + self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) - self.delete_button = QPushButton(icon("ei.remove"), "") - self.layout().addWidget(self.delete_button) + self.text = text + self.text_lbl = QLabel(show_text, parent=self) + self.text_lbl.setFont(QFont("monospace")) + self.image_lbl = QLabel(parent=self) + self.image_lbl.setPixmap(icon("mdi.drag-vertical").pixmap(QSize(20, 20))) + + self.delete_button = QPushButton(icon("ei.remove"), "", parent=self) if show_text in extra_wrapper_regex.keys(): self.delete_button.setDisabled(True) self.delete_button.setToolTip(self.tr("Disable it in settings")) self.delete_button.clicked.connect(self.delete) - self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) + layout = QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.addWidget(self.image_lbl) + layout.addWidget(self.text_lbl) + layout.addWidget(self.delete_button) + self.setLayout(layout) + + # lk: set object names for the stylesheet + self.setObjectName(type(self).__name__) + self.delete_button.setObjectName(f"{self.objectName()}Button") def delete(self): self.delete_wrapper.emit(self.text) @@ -59,30 +66,59 @@ class WrapperWidget(QFrame): drag.exec_(Qt.MoveAction) -class WrapperSettings(QFrame, Ui_WrapperSettings): +class WrapperSettings(QWidget, Ui_WrapperSettings): wrappers: Dict[str, WrapperWidget] = dict() app_name: str def __init__(self): super(WrapperSettings, self).__init__() self.setupUi(self) - self.setProperty("frameShape", 6) - self.widget_stack.insertWidget(0, self.wrapper_scroll_area) - self.wrapper_scroll_area.setProperty("no_kinetic_scroll", True) - self.placeholder.deleteLater() - self.scroll_content.deleteLater() + + self.wrapper_scroll = QScrollArea(self.widget_stack) + self.wrapper_scroll.setWidgetResizable(True) + self.wrapper_scroll.setSizeAdjustPolicy(QScrollArea.AdjustToContents) + self.wrapper_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.wrapper_scroll.setProperty("no_kinetic_scroll", True) self.scroll_content = WrapperContainer( - save_cb=self.save, parent=self.wrapper_scroll_area + save_cb=self.save, parent=self.wrapper_scroll ) - self.wrapper_scroll_area.setWidget(self.scroll_content) - self.wrapper_scroll_area.setProperty("noBorder", 1) + self.wrapper_scroll.setWidget(self.scroll_content) + self.widget_stack.insertWidget(0, self.wrapper_scroll) self.core = shared.LegendaryCoreSingleton() self.add_button.clicked.connect(self.add_button_pressed) self.settings = QSettings() - self.setStyleSheet("""QFrame{padding: 0px}""") + self.wrapper_scroll.horizontalScrollBar().rangeChanged.connect(self.adjust_scrollarea) + + # lk: set object names for the stylesheet + self.setObjectName(type(self).__name__) + self.no_wrapper_label.setObjectName(f"{self.objectName()}Label") + self.wrapper_scroll.setObjectName(f"{self.objectName()}Scroll") + self.wrapper_scroll.horizontalScrollBar().setObjectName( + f"{self.wrapper_scroll.objectName()}Bar") + self.wrapper_scroll.verticalScrollBar().setObjectName( + f"{self.wrapper_scroll.objectName()}Bar") + + @pyqtSlot(int, int) + def adjust_scrollarea(self, min: int, max: int): + wrapper_widget = self.scroll_content.findChildren(WrapperWidget)[0] + # lk: when the scrollbar is not visible, min and max are 0 + if max > min: + self.wrapper_scroll.setMaximumHeight( + wrapper_widget.sizeHint().height() + + self.wrapper_scroll.rect().height() // 2 + - self.wrapper_scroll.contentsRect().height() // 2 + + self.scroll_content.layout().spacing() + + self.wrapper_scroll.horizontalScrollBar().sizeHint().height() + ) + else: + self.wrapper_scroll.setMaximumHeight( + wrapper_widget.sizeHint().height() + + self.wrapper_scroll.rect().height() + - self.wrapper_scroll.contentsRect().height() + ) def get_wrapper_string(self): return " ".join(self.get_wrapper_list()) @@ -132,8 +168,11 @@ class WrapperSettings(QFrame, Ui_WrapperSettings): widget = WrapperWidget(text, show_text, self.scroll_content) self.scroll_content.layout().addWidget(widget) + self.adjust_scrollarea( + self.wrapper_scroll.horizontalScrollBar().minimum(), + self.wrapper_scroll.horizontalScrollBar().maximum() + ) widget.delete_wrapper.connect(self.delete_wrapper) - self.scroll_content.layout().addWidget(widget) self.wrappers[show_text] = widget @@ -147,6 +186,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings): widget.deleteLater() if not self.wrappers: + self.wrapper_scroll.setMaximumHeight(self.label_page.sizeHint().height()) self.widget_stack.setCurrentIndex(1) self.save() @@ -178,6 +218,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings): self.add_wrapper(wrapper, True) if not self.wrappers: + self.wrapper_scroll.setMaximumHeight(self.label_page.sizeHint().height()) self.widget_stack.setCurrentIndex(1) else: self.widget_stack.setCurrentIndex(0) @@ -190,11 +231,15 @@ class WrapperContainer(QWidget): def __init__(self, save_cb, parent=None): super(WrapperContainer, self).__init__(parent=parent) - self.setLayout(QHBoxLayout()) - self.layout().setContentsMargins(0, 0, 0, 0) - self.layout().setAlignment(Qt.AlignLeft | Qt.AlignVCenter) self.setAcceptDrops(True) self.save = save_cb + layout = QHBoxLayout() + layout.setContentsMargins(0, 0, 0, 0) + layout.setAlignment(Qt.AlignLeft | Qt.AlignTop) + self.setLayout(layout) + + # lk: set object names for the stylesheet + self.setObjectName(type(self).__name__) def dragEnterEvent(self, e: QDragEnterEvent): widget = e.source() diff --git a/rare/resources/resources.py b/rare/resources/resources.py index e89297e8..391f9176 100644 Binary files a/rare/resources/resources.py and b/rare/resources/resources.py differ diff --git a/rare/resources/stylesheets/RareStyle/stylesheet.qss b/rare/resources/stylesheets/RareStyle/stylesheet.qss index 6eb5e92d..5683ae8d 100644 --- a/rare/resources/stylesheets/RareStyle/stylesheet.qss +++ b/rare/resources/stylesheets/RareStyle/stylesheet.qss @@ -336,11 +336,11 @@ QPushButton#menu_button:hover { } QPushButton[install="1"], QPushButton#install_button { - background-color: "#090"; + background-color: "#070"; } QPushButton[install="1"]:hover, QPushButton#install_button:hover { - background-color: "#060"; + background-color: "#050"; } QPushButton[install="1"]:disabled, QPushButton#install_button:disabled { @@ -359,7 +359,7 @@ QPushButton#uninstall_button:disabled { background-color: "#200"; } QPushButton#success{ - background-color: "lime"; + background-color: lime; } QPushButton#installed_menu_button:hover { background-color: green; @@ -461,7 +461,7 @@ QGroupBox#game_widget_icon { border-width: 0px; padding: 0px; } -QToolBox:tab, +QToolBox::tab, QGroupBox::title { subcontrol-origin: border; subcontrol-position: top left; /* position at the top left */ @@ -727,3 +727,27 @@ QBalloonTip { border-radius: 4px; padding: 1px; } + +/* Wrapper settings styling */ +QPushButton#WrapperWidgetButton { + border-color: rgba(67, 71, 77, 55%); +} +QPushButton#WrapperWidgetButton:disabled { + border-color: rgba(67, 71, 77, 25%); +} +QScrollArea#WrapperSettingsScroll { + border-color: #2f4f4f; + background-color: #282a2e; +} +QScrollBar#WrapperSettingsScrollBar { + background-color: #282a2e; +} +QLabel#WrapperSettingsLabel { + border-width: 1px; + border-style: solid; + border-radius: 2px; + padding: 2px; + color: #999; + border-color: #2f4f4f; + background-color: #282a2e; +} diff --git a/rare/ui/components/tabs/settings/widgets/wrapper.py b/rare/ui/components/tabs/settings/widgets/wrapper.py index ba7a6b9a..5e0c9d4e 100644 --- a/rare/ui/components/tabs/settings/widgets/wrapper.py +++ b/rare/ui/components/tabs/settings/widgets/wrapper.py @@ -14,41 +14,23 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_WrapperSettings(object): def setupUi(self, WrapperSettings): WrapperSettings.setObjectName("WrapperSettings") - WrapperSettings.resize(413, 106) - self.horizontalLayout = QtWidgets.QHBoxLayout(WrapperSettings) - self.horizontalLayout.setObjectName("horizontalLayout") + WrapperSettings.resize(199, 30) + WrapperSettings.setWindowTitle("WrapperSettings") + self.wrapper_settings_layout = QtWidgets.QHBoxLayout(WrapperSettings) + self.wrapper_settings_layout.setContentsMargins(0, 0, 0, 0) + self.wrapper_settings_layout.setObjectName("wrapper_settings_layout") self.widget_stack = QtWidgets.QStackedWidget(WrapperSettings) self.widget_stack.setObjectName("widget_stack") - self.placeholder = QtWidgets.QWidget() - self.placeholder.setObjectName("placeholder") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.placeholder) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.wrapper_scroll_area = QtWidgets.QScrollArea(self.placeholder) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.wrapper_scroll_area.sizePolicy().hasHeightForWidth()) - self.wrapper_scroll_area.setSizePolicy(sizePolicy) - self.wrapper_scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.wrapper_scroll_area.setWidgetResizable(True) - self.wrapper_scroll_area.setObjectName("wrapper_scroll_area") - self.scroll_content = QtWidgets.QWidget() - self.scroll_content.setGeometry(QtCore.QRect(0, 0, 286, 68)) - self.scroll_content.setObjectName("scroll_content") - self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.scroll_content) - self.horizontalLayout_3.setObjectName("horizontalLayout_3") - self.wrapper_scroll_area.setWidget(self.scroll_content) - self.horizontalLayout_2.addWidget(self.wrapper_scroll_area) - self.widget_stack.addWidget(self.placeholder) self.label_page = QtWidgets.QWidget() self.label_page.setObjectName("label_page") - self.verticalLayout = QtWidgets.QVBoxLayout(self.label_page) - self.verticalLayout.setObjectName("verticalLayout") + self.label_page_layout = QtWidgets.QVBoxLayout(self.label_page) + self.label_page_layout.setContentsMargins(0, 0, 0, 0) + self.label_page_layout.setObjectName("label_page_layout") self.no_wrapper_label = QtWidgets.QLabel(self.label_page) self.no_wrapper_label.setObjectName("no_wrapper_label") - self.verticalLayout.addWidget(self.no_wrapper_label) + self.label_page_layout.addWidget(self.no_wrapper_label) self.widget_stack.addWidget(self.label_page) - self.horizontalLayout.addWidget(self.widget_stack) + self.wrapper_settings_layout.addWidget(self.widget_stack) self.add_button = QtWidgets.QPushButton(WrapperSettings) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) @@ -56,7 +38,7 @@ class Ui_WrapperSettings(object): sizePolicy.setHeightForWidth(self.add_button.sizePolicy().hasHeightForWidth()) self.add_button.setSizePolicy(sizePolicy) self.add_button.setObjectName("add_button") - self.horizontalLayout.addWidget(self.add_button) + self.wrapper_settings_layout.addWidget(self.add_button, 0, QtCore.Qt.AlignTop) self.retranslateUi(WrapperSettings) self.widget_stack.setCurrentIndex(0) @@ -64,7 +46,6 @@ class Ui_WrapperSettings(object): def retranslateUi(self, WrapperSettings): _translate = QtCore.QCoreApplication.translate - WrapperSettings.setWindowTitle(_translate("WrapperSettings", "Frame")) self.no_wrapper_label.setText(_translate("WrapperSettings", "No wrapper added")) self.add_button.setText(_translate("WrapperSettings", "Add Wrapper")) @@ -72,7 +53,7 @@ class Ui_WrapperSettings(object): if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) - WrapperSettings = QtWidgets.QFrame() + WrapperSettings = QtWidgets.QWidget() ui = Ui_WrapperSettings() ui.setupUi(WrapperSettings) WrapperSettings.show() diff --git a/rare/ui/components/tabs/settings/widgets/wrapper.ui b/rare/ui/components/tabs/settings/widgets/wrapper.ui index 7f017f7f..165b04d3 100644 --- a/rare/ui/components/tabs/settings/widgets/wrapper.ui +++ b/rare/ui/components/tabs/settings/widgets/wrapper.ui @@ -1,57 +1,50 @@ WrapperSettings - + 0 0 - 413 - 106 + 199 + 30 - Frame + WrapperSettings - + + + 0 + + + 0 + + + 0 + + + 0 + 0 - - - - - - - 0 - 0 - - - - Qt::ScrollBarAlwaysOff - - - true - - - - - 0 - 0 - 286 - 68 - - - - - - - - - + + + 0 + + + 0 + + + 0 + + + 0 + @@ -63,7 +56,7 @@ - +