Fix drag and drop jitter
This commit is contained in:
parent
53f1f1802d
commit
abba02d59e
1 changed files with 33 additions and 16 deletions
|
@ -24,8 +24,8 @@ extra_wrapper_regex = {
|
||||||
class WrapperWidget(QFrame):
|
class WrapperWidget(QFrame):
|
||||||
delete_wrapper = pyqtSignal(str)
|
delete_wrapper = pyqtSignal(str)
|
||||||
|
|
||||||
def __init__(self, text: str):
|
def __init__(self, text: str, parent=None):
|
||||||
super(WrapperWidget, self).__init__()
|
super(WrapperWidget, self).__init__(parent=parent)
|
||||||
self.setLayout(QHBoxLayout())
|
self.setLayout(QHBoxLayout())
|
||||||
self.text = text
|
self.text = text
|
||||||
self.image_lbl = QLabel()
|
self.image_lbl = QLabel()
|
||||||
|
@ -57,7 +57,6 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||||
wrappers: Dict[str, WrapperWidget] = dict()
|
wrappers: Dict[str, WrapperWidget] = dict()
|
||||||
extra_wrappers: Dict[str, str] = dict()
|
extra_wrappers: Dict[str, str] = dict()
|
||||||
app_name: str
|
app_name: str
|
||||||
drag_widget: QWidget
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(WrapperSettings, self).__init__()
|
super(WrapperSettings, self).__init__()
|
||||||
|
@ -65,8 +64,11 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||||
self.setProperty("frameShape", 6)
|
self.setProperty("frameShape", 6)
|
||||||
self.widget_stack.insertWidget(0, self.scroll_area)
|
self.widget_stack.insertWidget(0, self.scroll_area)
|
||||||
self.placeholder.deleteLater()
|
self.placeholder.deleteLater()
|
||||||
|
self.scroll_content.deleteLater()
|
||||||
|
self.scroll_content = WrapperContainer(
|
||||||
|
save_cb=self.save, parent=self.scroll_area)
|
||||||
|
self.scroll_area.setWidget(self.scroll_content)
|
||||||
self.scroll_area.setProperty("noBorder", 1)
|
self.scroll_area.setProperty("noBorder", 1)
|
||||||
self.scroll_content.layout().setAlignment(Qt.AlignLeft)
|
|
||||||
|
|
||||||
self.core = shared.LegendaryCoreSingleton()
|
self.core = shared.LegendaryCoreSingleton()
|
||||||
|
|
||||||
|
@ -75,8 +77,6 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||||
|
|
||||||
self.setStyleSheet("""QFrame{padding: 0px}""")
|
self.setStyleSheet("""QFrame{padding: 0px}""")
|
||||||
|
|
||||||
self.setAcceptDrops(True)
|
|
||||||
|
|
||||||
def get_wrapper_string(self):
|
def get_wrapper_string(self):
|
||||||
return " ".join(self.get_wrapper_list())
|
return " ".join(self.get_wrapper_list())
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||||
|
|
||||||
self.widget_stack.setCurrentIndex(0)
|
self.widget_stack.setCurrentIndex(0)
|
||||||
|
|
||||||
widget = WrapperWidget(text)
|
widget = WrapperWidget(text, self.scroll_content)
|
||||||
self.scroll_content.layout().addWidget(widget)
|
self.scroll_content.layout().addWidget(widget)
|
||||||
widget.delete_wrapper.connect(self.delete_wrapper)
|
widget.delete_wrapper.connect(self.delete_wrapper)
|
||||||
self.scroll_content.layout().addWidget(widget)
|
self.scroll_content.layout().addWidget(widget)
|
||||||
|
@ -174,29 +174,46 @@ class WrapperSettings(QFrame, Ui_WrapperSettings):
|
||||||
self.widget_stack.setCurrentIndex(0)
|
self.widget_stack.setCurrentIndex(0)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
|
|
||||||
|
class WrapperContainer(QWidget):
|
||||||
|
drag_widget: 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
|
||||||
|
|
||||||
def dragEnterEvent(self, e: QDragEnterEvent):
|
def dragEnterEvent(self, e: QDragEnterEvent):
|
||||||
widget = e.source()
|
widget = e.source()
|
||||||
self.drag_widget = widget
|
self.drag_widget = widget
|
||||||
e.accept()
|
e.accept()
|
||||||
|
|
||||||
def _get_drop_index(self, x):
|
def _get_drop_index(self, x):
|
||||||
for n in range(self.scroll_content.layout().count()):
|
drag_idx = self.layout().indexOf(self.drag_widget)
|
||||||
# Get the widget at each index in turn.
|
|
||||||
w = self.scroll_content.layout().itemAt(n).widget()
|
if drag_idx > 0:
|
||||||
if x < w.x() + w.size().width() // 2:
|
prev_widget = self.layout().itemAt(drag_idx - 1).widget()
|
||||||
return n
|
if x < self.drag_widget.x() - prev_widget.width() // 2:
|
||||||
return self.scroll_content.layout().count()
|
return drag_idx - 1
|
||||||
|
if drag_idx < self.layout().count() - 1:
|
||||||
|
next_widget = self.layout().itemAt(drag_idx + 1).widget()
|
||||||
|
if x > self.drag_widget.x() + self.drag_widget.width() + next_widget.width() // 2:
|
||||||
|
return drag_idx + 1
|
||||||
|
|
||||||
|
return drag_idx
|
||||||
|
|
||||||
def dragMoveEvent(self, e: QDragMoveEvent) -> None:
|
def dragMoveEvent(self, e: QDragMoveEvent) -> None:
|
||||||
i = self._get_drop_index(e.pos().x())
|
i = self._get_drop_index(e.pos().x())
|
||||||
|
self.layout().insertWidget(i, self.drag_widget)
|
||||||
self.scroll_content.layout().insertWidget(i, self.drag_widget)
|
|
||||||
|
|
||||||
def dropEvent(self, e: QDropEvent):
|
def dropEvent(self, e: QDropEvent):
|
||||||
pos = e.pos()
|
pos = e.pos()
|
||||||
widget = e.source()
|
widget = e.source()
|
||||||
index = self._get_drop_index(pos.x())
|
index = self._get_drop_index(pos.x())
|
||||||
self.scroll_content.layout().insertWidget(index, widget)
|
self.layout().insertWidget(index, widget)
|
||||||
self.drag_widget = None
|
self.drag_widget = None
|
||||||
e.accept()
|
e.accept()
|
||||||
self.save()
|
self.save()
|
||||||
|
|
Loading…
Reference in a new issue