-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmgr.py
165 lines (131 loc) · 5 KB
/
mgr.py
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
import os
from PyQt5.QtCore import *
class Repo:
def __init__(self):
self.__repo_root = ''
self.__root = ''
self.__dirs = []
self.__files = []
self.__callbacks = []
@property
def repo_root(self):
return self.__repo_root
@property
def root(self):
return self.__root
@property
def dirs(self):
return self.__dirs
@property
def files(self):
return self.__files
def reset(self, repo_root):
self.__repo_root = repo_root
self.__update(self.__repo_root)
def enter(self, index):
if len(self.__dirs) != 0:
self.__update(os.path.join(self.__root, self.__dirs[index]))
def addUpdateCallback(self, cb):
self.__callbacks.append(cb)
def __update(self, root):
self.__root, self.__dirs, self.__files = next(os.walk(root))
self.__root = os.path.abspath(self.__root)
if self.__root != self.__repo_root:
self.__dirs = ['..', ] + self.__dirs
for cb in self.__callbacks:
cb(self)
class Explorer(QAbstractListModel):
def __init__(self, repo, cwd_view, folder_view, parent=None):
QAbstractListModel.__init__(self, parent)
self.repo = repo
self.repo.addUpdateCallback(self.__onRepoUpdated)
self.cwd_view = cwd_view
folder_view.setModel(self)
folder_view.doubleClicked.connect(self.__update)
def rowCount(self, parent=None, *args, **kwargs):
return len(self.repo.dirs)
def data(self, index, role=None):
if index.isValid() and role == Qt.DisplayRole:
return QVariant(self.repo.dirs[index.row()])
return QVariant()
def __update(self, index):
self.repo.enter(index.row())
def __onRepoUpdated(self, repo):
self.cwd_view.setText(self.repo.root)
self.cwd_view.setCursorPosition(0)
self.cwd_view.repaint()
self.layoutAboutToBeChanged.emit()
self.dataChanged.emit(self.createIndex(0, 0),
self.createIndex(self.rowCount(), 0))
self.layoutChanged.emit()
class FileList(QAbstractListModel):
def __init__(self, repo, file_view, file_selector, parent=None):
QAbstractListModel.__init__(self, parent)
self.repo = repo
self.repo.addUpdateCallback(self.__onRepoUpdate)
file_view.setModel(self)
file_view.selectionModel().selectionChanged.connect(self.__onFilesSelected)
self.file_selector = file_selector
self.file_selector.setChecked(False)
self.file_selector.stateChanged.connect(self.__onFileSelectorChecked)
self.checked_indices = set()
self.selections = set()
def rowCount(self, parent=None, *args, **kwargs):
return len(self.repo.files)
def data(self, index, role=None):
if not index.isValid():
return QVariant()
if role == Qt.DisplayRole:
return QVariant(self.repo.files[index.row()])
elif role == Qt.CheckStateRole:
if index.row() in self.checked_indices:
return Qt.Checked
return Qt.Unchecked
return QVariant()
def setData(self, index, value, role=None):
if not index.isValid():
return False
if role == Qt.CheckStateRole:
if value == Qt.Checked:
self.checked_indices.add(index.row())
else:
self.checked_indices.discard(index.row())
return True
def flags(self, index):
if not index.isValid():
return Qt.ItemFlags()
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable
def __onRepoUpdate(self, repo):
self.checked_indices.clear()
self.layoutAboutToBeChanged.emit()
self.dataChanged.emit(self.createIndex(0, 0),
self.createIndex(self.rowCount(), 0))
self.layoutChanged.emit()
def __onFilesSelected(self, selected, deselected):
for idx in selected.indexes():
self.selections.add(idx.row())
for idx in deselected.indexes():
self.selections.discard(idx.row())
cnt = 0
for s in self.selections:
if s in self.checked_indices:
cnt += 1
self.file_selector.blockSignals(True)
self.file_selector.setChecked(cnt > len(self.selections) // 2)
self.file_selector.blockSignals(False)
def __onFileSelectorChecked(self, state):
if state == Qt.Checked:
for s in self.selections:
self.checked_indices.add(s)
self.dataChanged.emit(self.createIndex(s, 0),
self.createIndex(s, 0))
elif state == Qt.Unchecked:
for s in self.selections:
self.checked_indices.discard(s)
self.dataChanged.emit(self.createIndex(s, 0),
self.createIndex(s, 0))
class TagManager:
def __init__(self):
pass
def index(self):
pass