-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwidgets.py
More file actions
139 lines (118 loc) · 4.64 KB
/
widgets.py
File metadata and controls
139 lines (118 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
"""
This file contains modified widgets used by various windows.
"""
import globalstuff
from PyQt5 import QtWidgets, QtGui
from PyQt5.Qt import Qt
class ModdedTreeWidget(QtWidgets.QTreeWidget):
"""
This modded tree widget lets me move codes between subwindows without losing data
"""
def __init__(self):
super().__init__()
# Hide header, enable multiple selection and reordering, add space to the right and set edit trigger to select+click
self.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
self.setHeaderHidden(True)
self.setSelectionMode(QtWidgets.QTreeWidget.ExtendedSelection)
self.setEditTriggers(QtWidgets.QAbstractItemView.SelectedClicked)
header = self.header()
header.setStretchLastSection(False)
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
def dragEnterEvent(self, e: QtGui.QDragEnterEvent):
"""
This forces the widget to accept drops, which would otherwise be rejected due to the InternalMove flag.
"""
src = e.source()
if isinstance(src, QtWidgets.QTreeWidget):
e.accept()
def dropEvent(self, e: QtGui.QDropEvent):
"""
This bad hack adds a copy of the source widget's selected items in the destination widget. This is due to PyQt
clearing the hidden columns, which we don't want.
"""
src = e.source()
if src is not self:
for item in src.selectedItems():
clone = item.clone()
clone.setFlags(clone.flags() | Qt.ItemIsEditable)
self.addTopLevelItem(clone)
super().dropEvent(e) # Call the original function
class ModdedTreeWidgetItem(QtWidgets.QTreeWidgetItem):
"""
Basically a glorified QTreeWidgetItem, with a couple of improvements that should make them less annoying to use.
"""
def __init__(self, text: str, iscategory: bool, iseditable: bool):
super().__init__()
# Set check state
self.setCheckState(0, Qt.Unchecked)
# Set default text
if text:
self.setText(0, text)
elif iscategory:
self.setText(0, 'New Category')
else:
self.setText(0, 'New Code')
# Set flags based on the given directives
self.setAsCategory(iscategory)
self.setAsEditable(iseditable)
def setAsCategory(self, iscategory: bool):
if iscategory:
self.setChildIndicatorPolicy(QtWidgets.QTreeWidgetItem.ShowIndicator)
self.setFlags(self.flags() | Qt.ItemIsAutoTristate | Qt.ItemIsDropEnabled)
else:
self.setChildIndicatorPolicy(QtWidgets.QTreeWidgetItem.DontShowIndicator)
self.setFlags(self.flags() ^ Qt.ItemIsDropEnabled ^ Qt.ItemIsAutoTristate)
def setAsEditable(self, iseditable: bool):
if iseditable:
self.setFlags(self.flags() | Qt.ItemIsEditable)
elif self.flags() & Qt.ItemIsEditable:
self.setFlags(self.flags() ^ Qt.ItemIsEditable)
class ModdedSubWindow(QtWidgets.QMdiSubWindow):
"""
Dark mode and box updating functionality.
"""
def __init__(self, islist: bool):
super().__init__()
self.islist = islist
self.setWindowIcon(globalstuff.empty)
self.setAttribute(Qt.WA_DeleteOnClose)
def setWidget(self, widget: QtWidgets.QWidget):
"""
Adds a fix for dark theme if it's enabled
"""
super().setWidget(widget)
if globalstuff.theme == 'dark':
w = self.widget()
w.setPalette(globalstuff.textpal)
if hasattr(w, 'TreeWidget'):
w.TreeWidget.setStyleSheet(globalstuff.treeqss)
def closeEvent(self, e: QtGui.QCloseEvent):
super().closeEvent(e)
if self.islist:
globalstuff.mainWindow.updateboxes()
class ModdedMdiArea(QtWidgets.QMdiArea):
"""
Modded MdiArea to accept file drops
"""
def __init__(self):
super().__init__()
self.setAcceptDrops(True)
def dragEnterEvent(self, e: QtGui.QDragEnterEvent):
if e.mimeData().hasUrls:
e.accept()
else:
e.ignore()
def dragMoveEvent(self, e: QtGui.QDragMoveEvent):
if e.mimeData().hasUrls:
e.setDropAction(Qt.CopyAction)
e.accept()
else:
e.ignore()
def dropEvent(self, e: QtGui.QDropEvent):
if e.mimeData().hasUrls():
e.setDropAction(Qt.CopyAction)
e.accept()
links = [str(url.toLocalFile()) for url in e.mimeData().urls()]
globalstuff.mainWindow.openCodelist(None, links)
else:
e.ignore()