mirror of
https://github.com/arsenetar/dupeguru.git
synced 2026-01-22 14:41:39 +00:00
Implement exclude list dialog on the Qt side
This commit is contained in:
@@ -10,5 +10,6 @@
|
||||
<file alias="zoom_out">../images/old_zoom_out.png</file>
|
||||
<file alias="zoom_original">../images/old_zoom_original.png</file>
|
||||
<file alias="zoom_best_fit">../images/old_zoom_best_fit.png</file>
|
||||
<file alias="error">../images/dialog-error.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -9,6 +9,7 @@ from PyQt5.QtWidgets import (
|
||||
)
|
||||
from .exclude_list_table import ExcludeListTable, ExcludeView
|
||||
|
||||
from core.exclude import AlreadyThereException
|
||||
from hscommon.trans import trget
|
||||
tr = trget("ui")
|
||||
|
||||
@@ -17,16 +18,18 @@ class ExcludeListDialog(QDialog):
|
||||
def __init__(self, app, parent, model, **kwargs):
|
||||
flags = Qt.CustomizeWindowHint | Qt.WindowTitleHint | Qt.WindowSystemMenuHint
|
||||
super().__init__(parent, flags, **kwargs)
|
||||
self.app = app
|
||||
self.specific_actions = frozenset()
|
||||
self._setupUI()
|
||||
self.model = model # ExcludeListDialogCore
|
||||
self.model.view = self
|
||||
self.table = ExcludeListTable(app, view=self.tableView)
|
||||
self.table = ExcludeListTable(app, view=self.tableView) # Qt ExcludeListTable
|
||||
|
||||
self.buttonAdd.clicked.connect(self.addItem)
|
||||
self.buttonRemove.clicked.connect(self.removeItem)
|
||||
self.buttonAdd.clicked.connect(self.addStringFromLineEdit)
|
||||
self.buttonRemove.clicked.connect(self.removeSelected)
|
||||
self.buttonRestore.clicked.connect(self.restoreDefaults)
|
||||
self.buttonClose.clicked.connect(self.accept)
|
||||
self.buttonHelp.clicked.connect(self.display_help_message)
|
||||
|
||||
def _setupUI(self):
|
||||
layout = QVBoxLayout(self)
|
||||
@@ -35,6 +38,7 @@ class ExcludeListDialog(QDialog):
|
||||
self.buttonRemove = QPushButton(tr("Remove Selected"))
|
||||
self.buttonRestore = QPushButton(tr("Restore defaults"))
|
||||
self.buttonClose = QPushButton(tr("Close"))
|
||||
self.buttonHelp = QPushButton(tr("Help"))
|
||||
self.linedit = QLineEdit()
|
||||
self.tableView = ExcludeView()
|
||||
triggers = (
|
||||
@@ -43,25 +47,26 @@ class ExcludeListDialog(QDialog):
|
||||
| QAbstractItemView.SelectedClicked
|
||||
)
|
||||
self.tableView.setEditTriggers(triggers)
|
||||
self.tableView.horizontalHeader().setVisible(True)
|
||||
self.tableView.setSelectionMode(QTableView.ExtendedSelection)
|
||||
self.tableView.setSelectionBehavior(QTableView.SelectRows)
|
||||
# vheader = self.tableView.verticalHeader()
|
||||
# vheader.setSectionsMovable(True)
|
||||
# vheader.setVisible(True)
|
||||
# vheader.setDefaultSectionSize(50)
|
||||
self.tableView.setShowGrid(False)
|
||||
vheader = self.tableView.verticalHeader()
|
||||
vheader.setSectionsMovable(True)
|
||||
vheader.setVisible(False)
|
||||
hheader = self.tableView.horizontalHeader()
|
||||
hheader.setSectionsMovable(False)
|
||||
hheader.setSectionResizeMode(QHeaderView.Fixed)
|
||||
hheader.setStretchLastSection(True)
|
||||
hheader.setHighlightSections(False)
|
||||
hheader.setVisible(True)
|
||||
gridlayout.addWidget(self.linedit, 0, 0)
|
||||
gridlayout.addWidget(self.buttonAdd, 0, 1, Qt.AlignLeft)
|
||||
gridlayout.addWidget(self.buttonRemove, 1, 1, Qt.AlignLeft)
|
||||
gridlayout.addWidget(self.buttonRestore, 2, 1, Qt.AlignLeft)
|
||||
gridlayout.addWidget(self.tableView, 1, 0, 4, 1)
|
||||
gridlayout.addItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding), 3, 1)
|
||||
gridlayout.addWidget(self.buttonClose, 4, 1)
|
||||
gridlayout.addWidget(self.buttonHelp, 3, 1, Qt.AlignLeft)
|
||||
gridlayout.addWidget(self.tableView, 1, 0, 5, 1)
|
||||
gridlayout.addItem(QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding), 4, 1)
|
||||
gridlayout.addWidget(self.buttonClose, 5, 1)
|
||||
layout.addLayout(gridlayout)
|
||||
|
||||
# --- model --> view
|
||||
@@ -69,15 +74,28 @@ class ExcludeListDialog(QDialog):
|
||||
super().show()
|
||||
|
||||
@pyqtSlot()
|
||||
def addItem(self):
|
||||
def addStringFromLineEdit(self):
|
||||
text = self.linedit.text()
|
||||
if not text:
|
||||
return
|
||||
self.model.add(text)
|
||||
try:
|
||||
self.model.add(text)
|
||||
except AlreadyThereException:
|
||||
self.app.show_message("Expression already in the list.")
|
||||
return
|
||||
except Exception as e:
|
||||
self.app.show_message(f"Expression is invalid: {e}")
|
||||
return
|
||||
self.linedit.clear()
|
||||
|
||||
def removeItem(self):
|
||||
def removeSelected(self):
|
||||
self.model.remove_selected()
|
||||
|
||||
def restoreDefaults(self):
|
||||
self.model.restore_defaults()
|
||||
|
||||
def display_help_message(self):
|
||||
self.app.show_message("""\
|
||||
These python regular expressions will filter out files and directory paths \
|
||||
specified here.\nDuring directory selection, paths filtered here will be added as \
|
||||
"Skipped" by default, but regular files will be ignored altogether during scans.""")
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# which should be included with this package. The terms are also available at
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from PyQt5.QtCore import Qt, QModelIndex, pyqtSignal
|
||||
from PyQt5.QtGui import QBrush, QFont, QFontMetrics, QColor
|
||||
from PyQt5.QtCore import Qt, QModelIndex
|
||||
from PyQt5.QtGui import QFont, QFontMetrics, QIcon
|
||||
from PyQt5.QtWidgets import QTableView
|
||||
|
||||
from qtlib.column import Column
|
||||
@@ -20,7 +20,7 @@ class ExcludeListTable(Table):
|
||||
def __init__(self, app, view, **kwargs):
|
||||
model = app.model.exclude_list_dialog.exclude_list_table # pointer to GUITable
|
||||
super().__init__(model, view, **kwargs)
|
||||
view.horizontalHeader().setSortIndicator(1, Qt.AscendingOrder)
|
||||
# view.horizontalHeader().setSortIndicator(1, Qt.AscendingOrder)
|
||||
font = view.font()
|
||||
font.setPointSize(app.prefs.tableFontSize)
|
||||
view.setFont(font)
|
||||
@@ -32,6 +32,10 @@ class ExcludeListTable(Table):
|
||||
if column.name == "marked":
|
||||
if role == Qt.CheckStateRole and row.markable:
|
||||
return Qt.Checked if row.marked else Qt.Unchecked
|
||||
if role == Qt.ToolTipRole and not row.markable:
|
||||
return "Compilation error: " + row.get_cell_value("error")
|
||||
if role == Qt.DecorationRole and not row.markable:
|
||||
return QIcon.fromTheme("dialog-error", QIcon(":/error"))
|
||||
return None
|
||||
if role == Qt.DisplayRole:
|
||||
return row.data[column.name]
|
||||
@@ -43,12 +47,12 @@ class ExcludeListTable(Table):
|
||||
return None
|
||||
|
||||
def _getFlags(self, row, column):
|
||||
flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable
|
||||
flags = Qt.ItemIsEnabled
|
||||
if column.name == "marked":
|
||||
if row.markable:
|
||||
flags |= Qt.ItemIsUserCheckable
|
||||
elif column.name == "regex":
|
||||
flags |= Qt.ItemIsEditable
|
||||
flags |= Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled
|
||||
return flags
|
||||
|
||||
def _setData(self, row, column, value, role):
|
||||
|
||||
Reference in New Issue
Block a user