Add drag and drop to reorder wrappers
This commit is contained in:
parent
3beef49705
commit
53f1f1802d
|
@ -4,14 +4,14 @@ from logging import getLogger
|
|||
from pathlib import Path
|
||||
from typing import Tuple
|
||||
|
||||
from PyQt5.QtCore import QSettings, QThreadPool, Qt
|
||||
from PyQt5.QtCore import QSettings, QThreadPool, Qt, QSize
|
||||
from PyQt5.QtWidgets import (
|
||||
QWidget,
|
||||
QFileDialog,
|
||||
QMessageBox,
|
||||
QLabel,
|
||||
QPushButton,
|
||||
QSizePolicy,
|
||||
QSizePolicy, QHBoxLayout,
|
||||
)
|
||||
from legendary.core import LegendaryCore
|
||||
from legendary.models.game import InstalledGame, Game
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
import re
|
||||
import shutil
|
||||
from logging import getLogger
|
||||
from typing import Dict
|
||||
|
||||
from PyQt5.QtCore import pyqtSignal, QSettings
|
||||
from PyQt5.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QInputDialog, QFrame, QMessageBox, QSizePolicy
|
||||
from PyQt5.QtCore import pyqtSignal, QSettings, QSize, Qt, QMimeData
|
||||
from PyQt5.QtGui import QDrag, QPixmap, QDropEvent, QMouseEvent, QDragEnterEvent, QDragMoveEvent, QFont
|
||||
from PyQt5.QtWidgets import QGroupBox, QHBoxLayout, QLabel, QPushButton, QInputDialog, QFrame, QMessageBox, QSizePolicy, \
|
||||
QWidget
|
||||
|
||||
from rare import shared
|
||||
from rare.ui.components.tabs.settings.wrapper import Ui_WrapperSettings
|
||||
from rare.utils import config_helper
|
||||
from rare.utils.extra_widgets import FlowLayout
|
||||
from rare.utils.utils import icon
|
||||
|
||||
logger = getLogger("Wrapper Settings")
|
||||
|
@ -26,36 +28,68 @@ class WrapperWidget(QFrame):
|
|||
super(WrapperWidget, self).__init__()
|
||||
self.setLayout(QHBoxLayout())
|
||||
self.text = text
|
||||
self.layout().addWidget(QLabel(text))
|
||||
self.image_lbl = QLabel()
|
||||
self.text_lbl = QLabel(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.delete_button = QPushButton(icon("ei.remove"), "")
|
||||
self.layout().addWidget(self.delete_button)
|
||||
self.delete_button.clicked.connect(self.delete)
|
||||
|
||||
self.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
|
||||
|
||||
def delete(self):
|
||||
self.delete_wrapper.emit(self.text)
|
||||
|
||||
def mouseMoveEvent(self, e):
|
||||
if e.buttons() == Qt.LeftButton:
|
||||
drag = QDrag(self)
|
||||
mime = QMimeData()
|
||||
drag.setMimeData(mime)
|
||||
drag.exec_(Qt.MoveAction)
|
||||
|
||||
class WrapperSettings(QGroupBox, Ui_WrapperSettings):
|
||||
|
||||
class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||
wrappers: Dict[str, WrapperWidget] = dict()
|
||||
extra_wrappers: Dict[str, str] = dict()
|
||||
app_name: str
|
||||
drag_widget: QWidget
|
||||
|
||||
def __init__(self):
|
||||
super(WrapperSettings, self).__init__("Wrapper")
|
||||
super(WrapperSettings, self).__init__()
|
||||
self.setupUi(self)
|
||||
self.widgets.setLayout(FlowLayout())
|
||||
self.setProperty("frameShape", 6)
|
||||
self.widget_stack.insertWidget(0, self.scroll_area)
|
||||
self.placeholder.deleteLater()
|
||||
self.scroll_area.setProperty("noBorder", 1)
|
||||
self.scroll_content.layout().setAlignment(Qt.AlignLeft)
|
||||
|
||||
self.core = shared.LegendaryCoreSingleton()
|
||||
|
||||
self.add_button.clicked.connect(self.add_button_pressed)
|
||||
self.settings = QSettings()
|
||||
|
||||
self.setStyleSheet("""QFrame{padding: 0px}""")
|
||||
|
||||
self.setAcceptDrops(True)
|
||||
|
||||
def get_wrapper_string(self):
|
||||
return " ".join(self.get_wrapper_list())
|
||||
|
||||
def get_wrapper_list(self):
|
||||
return list(self.extra_wrappers.values()) + list(self.wrappers.keys())
|
||||
data = list(self.extra_wrappers.values())
|
||||
for n in range(self.scroll_content.layout().count()):
|
||||
# Get the widget at each index in turn.
|
||||
w = self.scroll_content.layout().itemAt(n).widget()
|
||||
try:
|
||||
data.append(w.text)
|
||||
except AttributeError:
|
||||
pass
|
||||
return data
|
||||
|
||||
def add_button_pressed(self):
|
||||
wrapper, done = QInputDialog.getText(self, "Input Dialog", self.tr("Insert name of wrapper"))
|
||||
|
@ -63,29 +97,35 @@ class WrapperSettings(QGroupBox, Ui_WrapperSettings):
|
|||
return
|
||||
self.add_wrapper(wrapper)
|
||||
|
||||
def add_wrapper(self, text: str):
|
||||
def add_wrapper(self, text: str, from_load=False):
|
||||
for key, extra_wrapper in extra_wrapper_regex.items():
|
||||
if re.match(extra_wrapper, text):
|
||||
self.extra_wrappers[key] = text
|
||||
if not from_load:
|
||||
self.save()
|
||||
return
|
||||
|
||||
# validate
|
||||
if not text.strip(): # is empty
|
||||
return
|
||||
if not from_load:
|
||||
if self.wrappers.get(text):
|
||||
QMessageBox.warning(self, "Warning", self.tr("Wrapper is already in the list"))
|
||||
return
|
||||
|
||||
if not shutil.which(text.split()[0]):
|
||||
if QMessageBox.question(self, "Warning", self.tr("Wrapper is not in $PATH. Ignore? "),
|
||||
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.No:
|
||||
return
|
||||
|
||||
self.widget_stack.setCurrentIndex(0)
|
||||
|
||||
widget = WrapperWidget(text)
|
||||
self.widgets.layout().addWidget(widget)
|
||||
self.scroll_content.layout().addWidget(widget)
|
||||
widget.delete_wrapper.connect(self.delete_wrapper)
|
||||
self.widgets.layout().addWidget(widget)
|
||||
self.scroll_content.layout().addWidget(widget)
|
||||
self.wrappers[text] = widget
|
||||
|
||||
# flow layout bug: Workaround
|
||||
lbl = QLabel("")
|
||||
self.widgets.layout().addWidget(lbl)
|
||||
lbl.deleteLater()
|
||||
|
||||
if not from_load:
|
||||
self.save()
|
||||
|
||||
def delete_wrapper(self, text: str):
|
||||
|
@ -126,10 +166,37 @@ class WrapperSettings(QGroupBox, Ui_WrapperSettings):
|
|||
wrappers = pattern.split(cfg)[1::2]
|
||||
|
||||
for wrapper in wrappers:
|
||||
self.add_wrapper(wrapper)
|
||||
self.add_wrapper(wrapper, True)
|
||||
|
||||
if not self.wrappers:
|
||||
self.widget_stack.setCurrentIndex(1)
|
||||
return
|
||||
else:
|
||||
self.widget_stack.setCurrentIndex(0)
|
||||
self.save()
|
||||
|
||||
def dragEnterEvent(self, e: QDragEnterEvent):
|
||||
widget = e.source()
|
||||
self.drag_widget = widget
|
||||
e.accept()
|
||||
|
||||
def _get_drop_index(self, x):
|
||||
for n in range(self.scroll_content.layout().count()):
|
||||
# Get the widget at each index in turn.
|
||||
w = self.scroll_content.layout().itemAt(n).widget()
|
||||
if x < w.x() + w.size().width() // 2:
|
||||
return n
|
||||
return self.scroll_content.layout().count()
|
||||
|
||||
def dragMoveEvent(self, e: QDragMoveEvent) -> None:
|
||||
i = self._get_drop_index(e.pos().x())
|
||||
|
||||
self.scroll_content.layout().insertWidget(i, self.drag_widget)
|
||||
|
||||
def dropEvent(self, e: QDropEvent):
|
||||
pos = e.pos()
|
||||
widget = e.source()
|
||||
index = self._get_drop_index(pos.x())
|
||||
self.scroll_content.layout().insertWidget(index, widget)
|
||||
self.drag_widget = None
|
||||
e.accept()
|
||||
self.save()
|
||||
|
|
|
@ -14,15 +14,32 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
|||
class Ui_WrapperSettings(object):
|
||||
def setupUi(self, WrapperSettings):
|
||||
WrapperSettings.setObjectName("WrapperSettings")
|
||||
WrapperSettings.resize(435, 123)
|
||||
WrapperSettings.setWindowTitle("GroupBox")
|
||||
WrapperSettings.resize(413, 106)
|
||||
self.horizontalLayout = QtWidgets.QHBoxLayout(WrapperSettings)
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.widget_stack = QtWidgets.QStackedWidget(WrapperSettings)
|
||||
self.widget_stack.setObjectName("widget_stack")
|
||||
self.widgets = QtWidgets.QWidget()
|
||||
self.widgets.setObjectName("widgets")
|
||||
self.widget_stack.addWidget(self.widgets)
|
||||
self.placeholder = QtWidgets.QWidget()
|
||||
self.placeholder.setObjectName("placeholder")
|
||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.placeholder)
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.scroll_area = QtWidgets.QScrollArea(self.placeholder)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.scroll_area.sizePolicy().hasHeightForWidth())
|
||||
self.scroll_area.setSizePolicy(sizePolicy)
|
||||
self.scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.scroll_area.setWidgetResizable(True)
|
||||
self.scroll_area.setObjectName("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.scroll_area.setWidget(self.scroll_content)
|
||||
self.horizontalLayout_2.addWidget(self.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)
|
||||
|
@ -47,7 +64,7 @@ class Ui_WrapperSettings(object):
|
|||
|
||||
def retranslateUi(self, WrapperSettings):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
WrapperSettings.setTitle(_translate("WrapperSettings", "Wrapper"))
|
||||
WrapperSettings.setWindowTitle(_translate("WrapperSettings", "Frame"))
|
||||
self.no_wrapper_label.setText(_translate("WrapperSettings", "No wrapper added"))
|
||||
self.add_button.setText(_translate("WrapperSettings", "Add Wrapper"))
|
||||
|
||||
|
@ -55,7 +72,7 @@ class Ui_WrapperSettings(object):
|
|||
if __name__ == "__main__":
|
||||
import sys
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
WrapperSettings = QtWidgets.QGroupBox()
|
||||
WrapperSettings = QtWidgets.QFrame()
|
||||
ui = Ui_WrapperSettings()
|
||||
ui.setupUi(WrapperSettings)
|
||||
WrapperSettings.show()
|
||||
|
|
|
@ -1,20 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>WrapperSettings</class>
|
||||
<widget class="QGroupBox" name="WrapperSettings">
|
||||
<widget class="QFrame" name="WrapperSettings">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>435</width>
|
||||
<height>123</height>
|
||||
<width>413</width>
|
||||
<height>106</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">GroupBox</string>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Wrapper</string>
|
||||
<string>Frame</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
|
@ -22,7 +19,37 @@
|
|||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="widgets"/>
|
||||
<widget class="QWidget" name="placeholder">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QScrollArea" name="scroll_area">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="verticalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||
</property>
|
||||
<property name="widgetResizable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="scroll_content">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>286</width>
|
||||
<height>68</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3"/>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="label_page">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
|
|
Loading…
Reference in a new issue