diff --git a/qt/base/dg.qrc b/qt/base/dg.qrc index a70fb45b..121db2cc 100644 --- a/qt/base/dg.qrc +++ b/qt/base/dg.qrc @@ -11,5 +11,6 @@ ../../images/dgse_logo_128.png ../../images/plus_8.png ../../images/minus_8.png + ../../qtlib/images/search_clear_13.png \ No newline at end of file diff --git a/qt/base/result_window.py b/qt/base/result_window.py index 52ed2e64..b3691c91 100644 --- a/qt/base/result_window.py +++ b/qt/base/result_window.py @@ -9,12 +9,13 @@ from PyQt4.QtCore import Qt, QUrl, QRect from PyQt4.QtGui import (QMainWindow, QMenu, QLabel, QMessageBox, QInputDialog, QLineEdit, QDesktopServices, QFileDialog, QMenuBar, QWidget, QVBoxLayout, QAbstractItemView, QStatusBar, - QDialog, QAction) + QDialog, QAction, QPushButton, QCheckBox) from hscommon.plat import ISOSX, ISLINUX from hscommon.trans import trget from hscommon.util import nonone -from qtlib.util import moveToScreenCenter +from qtlib.util import moveToScreenCenter, horizontalWrap +from qtlib.search_edit import SearchEdit from .results_model import ResultsView from .stats_label import StatsLabel @@ -27,7 +28,6 @@ class ResultWindow(QMainWindow): def __init__(self, app): QMainWindow.__init__(self, None) self.app = app - self._last_filter = None self._setupUi() self.resultsModel = app.RESULT_MODEL_CLASS(self.app, self.resultsView) self.stats = StatsLabel(app.model.stats_label, self.statusLabel) @@ -36,6 +36,10 @@ class ResultWindow(QMainWindow): self.menuColumns.triggered[QAction].connect(self.columnToggled) self.resultsView.doubleClicked.connect(self.resultsDoubleClicked) self.resultsView.spacePressed.connect(self.resultsSpacePressed) + self.detailsButton.clicked.connect(self.actionDetails.triggered) + self.dupesOnlyCheckBox.stateChanged.connect(self.powerMarkerTriggered) + self.deltaValuesCheckBox.stateChanged.connect(self.deltaTriggered) + self.searchEdit.searchChanged.connect(self.searchChanged) self.app.willSavePrefs.connect(self.appWillSavePrefs) def _setupActions(self): @@ -62,8 +66,6 @@ class ResultWindow(QMainWindow): ('actionInvertMarking', 'Ctrl+Alt+A', '', tr("Invert Marking"), self.markInvertTriggered), ('actionMarkSelected', '', '', tr("Mark Selected"), self.markSelectedTriggered), ('actionClearIgnoreList', '', '', tr("Clear Ignore List"), self.clearIgnoreListTriggered), - ('actionApplyFilter', 'Ctrl+F', '', tr("Apply Filter"), self.applyFilterTriggered), - ('actionCancelFilter', 'Ctrl+Shift+F', '', tr("Cancel Filter"), self.cancelFilterTriggered), ('actionExport', '', '', tr("Export To HTML"), self.exportTriggered), ('actionSaveResults', 'Ctrl+S', '', tr("Save Results..."), self.saveResultsTriggered), ('actionInvokeCustomCommand', 'Ctrl+Alt+I', '', tr("Invoke Custom Command"), self.app.invokeCustomCommand), @@ -107,9 +109,6 @@ class ResultWindow(QMainWindow): self.menuActions.addAction(self.actionRevealSelected) self.menuActions.addAction(self.actionInvokeCustomCommand) self.menuActions.addAction(self.actionRenameSelected) - self.menuActions.addSeparator() - self.menuActions.addAction(self.actionApplyFilter) - self.menuActions.addAction(self.actionCancelFilter) self.menuMark.addAction(self.actionMarkAll) self.menuMark.addAction(self.actionMarkNone) self.menuMark.addAction(self.actionInvertMarking) @@ -167,13 +166,25 @@ class ResultWindow(QMainWindow): actionMenu.addAction(self.actionInvokeCustomCommand) actionMenu.addAction(self.actionRenameSelected) self.actionActions.setMenu(actionMenu) + self.actionsButton.setMenu(self.actionActions.menu()) def _setupUi(self): self.setWindowTitle(tr("{} Results").format(self.app.NAME)) self.resize(630, 514) self.centralwidget = QWidget(self) - self.verticalLayout_2 = QVBoxLayout(self.centralwidget) - self.verticalLayout_2.setMargin(0) + self.verticalLayout = QVBoxLayout(self.centralwidget) + self.verticalLayout.setMargin(0) + self.verticalLayout.setSpacing(0) + self.actionsButton = QPushButton(tr("Actions")) + self.detailsButton = QPushButton(tr("Details")) + self.dupesOnlyCheckBox = QCheckBox(tr("Dupes Only")) + self.deltaValuesCheckBox = QCheckBox(tr("Delta Values")) + self.searchEdit = SearchEdit() + self.searchEdit.setMaximumWidth(300) + self.horizontalLayout = horizontalWrap([self.actionsButton, self.detailsButton, + self.dupesOnlyCheckBox, self.deltaValuesCheckBox, None, self.searchEdit, 8]) + self.horizontalLayout.setSpacing(8) + self.verticalLayout.addLayout(self.horizontalLayout) self.resultsView = ResultsView(self.centralwidget) self.resultsView.setSelectionMode(QAbstractItemView.ExtendedSelection) self.resultsView.setSelectionBehavior(QAbstractItemView.SelectRows) @@ -184,7 +195,7 @@ class ResultWindow(QMainWindow): h.setMovable(True) h.setStretchLastSection(False) h.setDefaultAlignment(Qt.AlignLeft) - self.verticalLayout_2.addWidget(self.resultsView) + self.verticalLayout.addWidget(self.resultsView) self.setCentralWidget(self.centralwidget) self._setupActions() self._setupMenu() @@ -216,20 +227,6 @@ class ResultWindow(QMainWindow): def addToIgnoreListTriggered(self): self.app.model.add_selected_to_ignore_list() - def applyFilterTriggered(self): - title = tr("Apply Filter") - msg = tr("Type the filter you want to apply on your results. See help for details.") - text = nonone(self._last_filter, '[*]') - answer, ok = QInputDialog.getText(self, title, msg, QLineEdit.Normal, text) - if not ok: - return - answer = str(answer) - self.app.model.apply_filter(answer) - self._last_filter = answer - - def cancelFilterTriggered(self): - self.app.model.apply_filter('') - def clearIgnoreListTriggered(self): title = tr("Clear Ignore List") count = len(self.app.model.scanner.ignore_list) @@ -253,8 +250,11 @@ class ResultWindow(QMainWindow): if self.app.confirm(title, msg): self.app.model.delete_marked() - def deltaTriggered(self): - self.resultsModel.delta_values = self.actionDelta.isChecked() + def deltaTriggered(self, state=None): + # The sender can be either the action or the checkbox, but both have a isChecked() method. + self.resultsModel.delta_values = self.sender().isChecked() + self.actionDelta.setChecked(self.resultsModel.delta_values) + self.deltaValuesCheckBox.setChecked(self.resultsModel.delta_values) def detailsTriggered(self): self.app.show_details() @@ -294,8 +294,11 @@ class ResultWindow(QMainWindow): def openTriggered(self): self.app.model.open_selected() - def powerMarkerTriggered(self): - self.resultsModel.power_marker = self.actionPowerMarker.isChecked() + def powerMarkerTriggered(self, state=None): + # see deltaTriggered + self.resultsModel.power_marker = self.sender().isChecked() + self.actionPowerMarker.setChecked(self.resultsModel.power_marker) + self.dupesOnlyCheckBox.setChecked(self.resultsModel.power_marker) def preferencesTriggered(self): self.app.show_preferences() @@ -358,3 +361,6 @@ class ResultWindow(QMainWindow): def resultsSpacePressed(self): self.app.model.toggle_selected_mark_state() + def searchChanged(self): + self.app.model.apply_filter(self.searchEdit.text()) +