diff options
-rw-r--r-- | gui.py | 52 | ||||
-rw-r--r-- | muddle.ui | 35 |
2 files changed, 57 insertions, 30 deletions
@@ -15,18 +15,30 @@ import tempfile from PyQt5 import uic from PyQt5.QtGui import QFont from PyQt5.Qt import QStyle -from PyQt5.QtCore import Qt, QThread, pyqtSlot, pyqtSignal, QObject + +from PyQt5.QtCore import ( + Qt, + QThread, + pyqtSlot, + pyqtSignal, + QObject, + QSortFilterProxyModel, +) + from PyQt5.QtWidgets import ( QApplication, QMainWindow, QWidget, + QTreeView, QTreeWidget, QTreeWidgetItem, QTreeWidgetItemIterator, + QHeaderView, QGridLayout, QHBoxLayout, QPushButton, QToolButton, + QLineEdit, QProgressBar, QTabWidget, QPlainTextEdit @@ -94,6 +106,7 @@ class MoodleItem(QTreeWidgetItem): self.setChildIndicatorPolicy(QTreeWidgetItem.DontShowIndicatorWhenChildless) self.setText(0, html.unescape(self.metadata.title)) + class MoodleFetcher(QThread): loadedItem = pyqtSignal(MoodleItem.Type, object) @@ -146,17 +159,28 @@ class MoodleFetcher(QThread): return [] +class MoodleTreeFilterModel(QSortFilterProxyModel): + def __init__(self): + super().__init__() + + class MoodleTreeWidget(QTreeWidget): def __init__(self, parent): super().__init__(parent) self.itemDoubleClicked.connect(self.onItemDoubleClicked, Qt.QueuedConnection) + self.setHeaderLabels(["Item", "Size"]) + self.sortByColumn(0, Qt.AscendingOrder) + self.lastInsertedItem = None self.worker = None @pyqtSlot(str, str) def refresh(self, instance_url, token): - if not self.worker or not self.worker.isFinished(): + if not self.worker or self.worker.isFinished(): + self.setSortingEnabled(False) + # TODO: remove elements if present + self.worker = MoodleFetcher(self, instance_url, token) self.worker.loadedItem.connect(self.onWorkerLoadedItem) self.worker.finished.connect(self.onWorkerDone) @@ -222,7 +246,6 @@ class MoodleTreeWidget(QTreeWidget): @pyqtSlot() def onWorkerDone(self): log.debug("worker done") - self.sortByColumn(0, Qt.AscendingOrder) self.setSortingEnabled(True) @@ -249,13 +272,34 @@ class MuddleWindow(QMainWindow): self.loghandler.newLogMessage.connect(self.onNewLogMessage) logging.getLogger("muddle").addHandler(self.loghandler) + # set up proxymodel for moodle treeview + moodleTreeWidget = MoodleTreeWidget(None) + self.filter = MoodleTreeFilterModel() + self.filter.setRecursiveFilteringEnabled(True) + + moodleTreeView = self.findChild(QTreeView, "moodleTree") + self.filter.setSourceModel(moodleTreeWidget.model()) + moodleTreeView.setModel(self.filter) + moodleTreeView.setColumnWidth(0, 420) + + # refresh moodle treeview refreshBtn = self.findChild(QToolButton, "refreshBtn") - moodleTreeWidget = self.findChild(MoodleTreeWidget, "moodleTree") refreshBtn.clicked.connect(lambda b: moodleTreeWidget.refresh(instance_url, token)) + # searchbar + searchBar = self.findChild(QLineEdit, "searchBar") + searchBar.textChanged.connect(self.onSearchBarTextChanged) + self.show() @pyqtSlot(str) + def onSearchBarTextChanged(self, text): + if not text: + self.filter.invalidateFilter() + else: + self.filter.setFilterRegExp(text) + + @pyqtSlot(str) def onNewLogMessage(self, msg): self.findChild(QPlainTextEdit, "logsTab").appendPlainText(msg) @@ -57,13 +57,13 @@ <item row="0" column="0"> <widget class="QLineEdit" name="searchBar"> <property name="enabled"> - <bool>false</bool> + <bool>true</bool> </property> <property name="inputMask"> <string/> </property> <property name="placeholderText"> - <string>Search</string> + <string>Search (regexp)</string> </property> </widget> </item> @@ -77,23 +77,6 @@ </property> </widget> </item> - <item row="1" column="0" colspan="2"> - <widget class="MoodleTreeWidget" name="moodleTree"> - <property name="headerHidden"> - <bool>false</bool> - </property> - <column> - <property name="text"> - <string notr="true">Item</string> - </property> - </column> - <column> - <property name="text"> - <string>Size</string> - </property> - </column> - </widget> - </item> <item row="0" column="1"> <widget class="QToolButton" name="refreshBtn"> <property name="text"> @@ -111,6 +94,13 @@ </property> </widget> </item> + <item row="1" column="0" colspan="2"> + <widget class="QTreeView" name="moodleTree"> + <property name="headerHidden"> + <bool>false</bool> + </property> + </widget> + </item> </layout> </widget> <widget class="QTreeWidget" name="localTab"> @@ -223,13 +213,6 @@ </widget> <widget class="QStatusBar" name="statusbar"/> </widget> - <customwidgets> - <customwidget> - <class>MoodleTreeWidget</class> - <extends>QTreeWidget</extends> - <header>gui</header> - </customwidget> - </customwidgets> <resources/> <connections/> </ui> |