1
0
Fork 0
mirror of synced 2024-06-22 04:20:25 +12:00

Add drag and drop to reorder wrappers

This commit is contained in:
Dummerle 2022-03-09 20:47:52 +01:00
parent 3beef49705
commit 53f1f1802d
No known key found for this signature in database
GPG key ID: AB68CC59CA39F2F1
4 changed files with 151 additions and 40 deletions

View file

@ -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

View file

@ -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,30 +97,36 @@ 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
self.save()
if not from_load:
self.save()
return
if self.wrappers.get(text):
QMessageBox.warning(self, "Warning", self.tr("Wrapper is already in the list"))
# 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()
self.save()
if not from_load:
self.save()
def delete_wrapper(self, text: str):
widget = self.wrappers.get(text, None)
@ -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()

View file

@ -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()

View file

@ -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>