First pass code cleanup in qt/qtlib

This commit is contained in:
Andrew Senetar 2021-08-24 00:12:23 -05:00
parent d576a7043c
commit f9085386a6
Signed by: arsenetar
GPG Key ID: C63300DCE48AB2F1
25 changed files with 195 additions and 233 deletions

View File

@ -68,7 +68,7 @@ except ImportError:
try: try:
from PyQt5.QtCore import QUrl, QStandardPaths from PyQt5.QtCore import QUrl, QStandardPaths
from PyQt5.QtGui import QDesktopServices from PyQt5.QtGui import QDesktopServices
from qtlib.util import getAppData from qtlib.util import get_appdata
from core.util import executable_folder from core.util import executable_folder
from hscommon.plat import ISWINDOWS, ISOSX from hscommon.plat import ISWINDOWS, ISOSX
import subprocess import subprocess
@ -95,7 +95,7 @@ except ImportError:
else: else:
folder = QStandardPaths.standardLocations(QStandardPaths.CacheLocation)[0] folder = QStandardPaths.standardLocations(QStandardPaths.CacheLocation)[0]
else: else:
folder = getAppData(portable) folder = get_appdata(portable)
return folder return folder
except ImportError: except ImportError:

View File

@ -16,7 +16,7 @@ from hscommon import desktop
from qtlib.about_box import AboutBox from qtlib.about_box import AboutBox
from qtlib.recent import Recent from qtlib.recent import Recent
from qtlib.util import createActions from qtlib.util import create_actions
from qtlib.progress_window import ProgressWindow from qtlib.progress_window import ProgressWindow
from core.app import AppMode, DupeGuru as DupeGuruModel from core.app import AppMode, DupeGuru as DupeGuruModel
@ -152,7 +152,7 @@ class DupeGuru(QObject):
self.openDebugLogTriggered, self.openDebugLogTriggered,
), ),
] ]
createActions(ACTIONS, self) create_actions(ACTIONS, self)
def _update_options(self): def _update_options(self):
self.model.options["mix_file_kind"] = self.prefs.mix_file_kind self.model.options["mix_file_kind"] = self.prefs.mix_file_kind
@ -314,8 +314,8 @@ class DupeGuru(QObject):
self.main_window.setCurrentIndex(index) self.main_window.setCurrentIndex(index)
def openDebugLogTriggered(self): def openDebugLogTriggered(self):
debugLogPath = op.join(self.model.appdata, "debug.log") debug_log_path = op.join(self.model.appdata, "debug.log")
desktop.open_path(debugLogPath) desktop.open_path(debug_log_path)
def preferencesTriggered(self): def preferencesTriggered(self):
preferences_dialog = self._get_preferences_dialog_class()( preferences_dialog = self._get_preferences_dialog_class()(

View File

@ -28,7 +28,7 @@ from hscommon.trans import trget
from core.app import AppMode from core.app import AppMode
from qtlib.radio_box import RadioBox from qtlib.radio_box import RadioBox
from qtlib.recent import Recent from qtlib.recent import Recent
from qtlib.util import moveToScreenCenter, createActions from qtlib.util import move_to_screen_center, create_actions
from . import platform from . import platform
from .directories_model import DirectoriesModel, DirectoriesDelegate from .directories_model import DirectoriesModel, DirectoriesDelegate
@ -93,7 +93,7 @@ class DirectoriesDialog(QMainWindow):
("actionLoadDirectories", "", "", tr("Load Directories..."), self.loadDirectoriesTriggered), ("actionLoadDirectories", "", "", tr("Load Directories..."), self.loadDirectoriesTriggered),
("actionSaveDirectories", "", "", tr("Save Directories..."), self.saveDirectoriesTriggered), ("actionSaveDirectories", "", "", tr("Save Directories..."), self.saveDirectoriesTriggered),
] ]
createActions(ACTIONS, self) create_actions(ACTIONS, self)
if self.app.use_tabs: if self.app.use_tabs:
# Keep track of actions which should only be accessible from this window # Keep track of actions which should only be accessible from this window
self.specific_actions.add(self.actionLoadDirectories) self.specific_actions.add(self.actionLoadDirectories)
@ -206,8 +206,8 @@ class DirectoriesDialog(QMainWindow):
self.addFolderButton = QPushButton(self.centralwidget) self.addFolderButton = QPushButton(self.centralwidget)
self.addFolderButton.setIcon(QIcon(QPixmap(":/plus"))) self.addFolderButton.setIcon(QIcon(QPixmap(":/plus")))
self.horizontalLayout.addWidget(self.addFolderButton) self.horizontalLayout.addWidget(self.addFolderButton)
spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spacer_item = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem1) self.horizontalLayout.addItem(spacer_item)
self.loadResultsButton = QPushButton(self.centralwidget) self.loadResultsButton = QPushButton(self.centralwidget)
self.loadResultsButton.setText(tr("Load Results")) self.loadResultsButton.setText(tr("Load Results"))
self.horizontalLayout.addWidget(self.loadResultsButton) self.horizontalLayout.addWidget(self.loadResultsButton)
@ -224,7 +224,7 @@ class DirectoriesDialog(QMainWindow):
if self.app.prefs.directoriesWindowRect is not None: if self.app.prefs.directoriesWindowRect is not None:
self.setGeometry(self.app.prefs.directoriesWindowRect) self.setGeometry(self.app.prefs.directoriesWindowRect)
else: else:
moveToScreenCenter(self) move_to_screen_center(self)
def _setupColumns(self): def _setupColumns(self):
header = self.treeView.header() header = self.treeView.header()

View File

@ -104,12 +104,12 @@ class DirectoriesModel(TreeModel):
return QBrush(Qt.red) return QBrush(Qt.red)
return None return None
def dropMimeData(self, mimeData, action, row, column, parentIndex): def dropMimeData(self, mime_data, action, row, column, parent_index):
# the data in mimeData is urlencoded **in utf-8**!!! What we do is to decode, the mime data # the data in mimeData is urlencoded **in utf-8**!!! What we do is to decode, the mime data
# with 'ascii', which works since it's urlencoded. Then, we pass that to urllib. # with 'ascii', which works since it's urlencoded. Then, we pass that to urllib.
if not mimeData.hasFormat("text/uri-list"): if not mime_data.hasFormat("text/uri-list"):
return False return False
data = bytes(mimeData.data("text/uri-list")).decode("ascii") data = bytes(mime_data.data("text/uri-list")).decode("ascii")
unquoted = urllib.parse.unquote(data) unquoted = urllib.parse.unquote(data)
urls = unquoted.split("\r\n") urls = unquoted.split("\r\n")
paths = [QUrl(url).toLocalFile() for url in urls if url] paths = [QUrl(url).toLocalFile() for url in urls if url]
@ -128,9 +128,8 @@ class DirectoriesModel(TreeModel):
return result return result
def headerData(self, section, orientation, role): def headerData(self, section, orientation, role):
if orientation == Qt.Horizontal: if orientation == Qt.Horizontal and role == Qt.DisplayRole and section < len(HEADERS):
if role == Qt.DisplayRole and section < len(HEADERS): return HEADERS[section]
return HEADERS[section]
return None return None
def mimeTypes(self): def mimeTypes(self):
@ -151,8 +150,8 @@ class DirectoriesModel(TreeModel):
# --- Events # --- Events
def selectionChanged(self, selected, deselected): def selectionChanged(self, selected, deselected):
newNodes = [modelIndex.internalPointer().ref for modelIndex in self.view.selectionModel().selectedRows()] new_nodes = [modelIndex.internalPointer().ref for modelIndex in self.view.selectionModel().selectedRows()]
self.model.selected_nodes = newNodes self.model.selected_nodes = new_nodes
# --- Signals # --- Signals
foldersAdded = pyqtSignal(list) foldersAdded = pyqtSignal(list)

View File

@ -25,7 +25,6 @@ class ExcludeListTable(Table):
view.setFont(font) view.setFont(font)
fm = QFontMetrics(font) fm = QFontMetrics(font)
view.verticalHeader().setDefaultSectionSize(fm.height() + 2) view.verticalHeader().setDefaultSectionSize(fm.height() + 2)
# app.willSavePrefs.connect(self.appWillSavePrefs)
def _getData(self, row, column, role): def _getData(self, row, column, role):
if column.name == "marked": if column.name == "marked":
@ -43,9 +42,8 @@ class ExcludeListTable(Table):
elif role == Qt.BackgroundRole and column.name == "regex": elif role == Qt.BackgroundRole and column.name == "regex":
if row.highlight: if row.highlight:
return QColor(10, 200, 10) # green return QColor(10, 200, 10) # green
elif role == Qt.EditRole: elif role == Qt.EditRole and column.name == "regex":
if column.name == "regex": return row.data[column.name]
return row.data[column.name]
return None return None
def _getFlags(self, row, column): def _getFlags(self, row, column):
@ -62,15 +60,6 @@ class ExcludeListTable(Table):
if column.name == "marked": if column.name == "marked":
row.marked = bool(value) row.marked = bool(value)
return True return True
elif role == Qt.EditRole: elif role == Qt.EditRole and column.name == "regex":
if column.name == "regex": return self.model.rename_selected(value)
return self.model.rename_selected(value)
return False return False
# def sort(self, column, order):
# column = self.model.COLUMNS[column]
# self.model.sort(column.name, order == Qt.AscendingOrder)
# # --- Events
# def appWillSavePrefs(self):
# self.model.columns.save_columns()

View File

@ -16,7 +16,7 @@ from PyQt5.QtWidgets import (
) )
from hscommon.trans import trget from hscommon.trans import trget
from qtlib.util import horizontalWrap from qtlib.util import horizontal_wrap
from .ignore_list_table import IgnoreListTable from .ignore_list_table import IgnoreListTable
tr = trget("ui") tr = trget("ui")
@ -56,7 +56,7 @@ class IgnoreListDialog(QDialog):
self.clearButton = QPushButton(tr("Clear")) self.clearButton = QPushButton(tr("Clear"))
self.closeButton = QPushButton(tr("Close")) self.closeButton = QPushButton(tr("Close"))
self.verticalLayout.addLayout( self.verticalLayout.addLayout(
horizontalWrap([self.removeSelectedButton, self.clearButton, None, self.closeButton]) horizontal_wrap([self.removeSelectedButton, self.clearButton, None, self.closeButton])
) )
# --- model --> view # --- model --> view

View File

@ -37,8 +37,8 @@ class PreferencesDialog(PreferencesDialogBase):
self.verticalLayout_4.addWidget(self.label_6) self.verticalLayout_4.addWidget(self.label_6)
self.horizontalLayout_2 = QHBoxLayout() self.horizontalLayout_2 = QHBoxLayout()
self.horizontalLayout_2.setSpacing(0) self.horizontalLayout_2.setSpacing(0)
spacerItem1 = QSpacerItem(15, 20, QSizePolicy.Fixed, QSizePolicy.Minimum) spacer_item = QSpacerItem(15, 20, QSizePolicy.Fixed, QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem1) self.horizontalLayout_2.addItem(spacer_item)
self._setupAddCheckbox("tagTrackBox", tr("Track"), self.widget) self._setupAddCheckbox("tagTrackBox", tr("Track"), self.widget)
self.horizontalLayout_2.addWidget(self.tagTrackBox) self.horizontalLayout_2.addWidget(self.tagTrackBox)
self._setupAddCheckbox("tagArtistBox", tr("Artist"), self.widget) self._setupAddCheckbox("tagArtistBox", tr("Artist"), self.widget)

View File

@ -57,12 +57,10 @@ class DetailsDialog(DetailsDialogBase):
self.splitter.setStretchFactor(0, 8) self.splitter.setStretchFactor(0, 8)
self.tableView = DetailsTable(self) self.tableView = DetailsTable(self)
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0) size_policy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) size_policy.setVerticalStretch(0)
self.tableView.setSizePolicy(sizePolicy) self.tableView.setSizePolicy(size_policy)
# self.tableView.setMinimumSize(QSize(0, 190))
# self.tableView.setMaximumSize(QSize(16777215, 190))
self.tableView.setAlternatingRowColors(True) self.tableView.setAlternatingRowColors(True)
self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
self.tableView.setShowGrid(False) self.tableView.setShowGrid(False)

View File

@ -26,8 +26,8 @@ MAX_SCALE = 12.0
MIN_SCALE = 0.1 MIN_SCALE = 0.1
def createActions(actions, target): def create_actions(actions, target):
# actions = [(name, shortcut, icon, desc, func)] # actions are list of (name, shortcut, icon, desc, func)
for name, shortcut, icon, desc, func in actions: for name, shortcut, icon, desc, func in actions:
action = QAction(target) action = QAction(target)
if icon: if icon:
@ -53,7 +53,7 @@ class ViewerToolBar(QToolBar):
self.buttonBestFit.setEnabled(False) self.buttonBestFit.setEnabled(False)
def setupActions(self, controller): def setupActions(self, controller):
# actions = [(name, shortcut, icon, desc, func)] # actions are list of (name, shortcut, icon, desc, func)
ACTIONS = [ ACTIONS = [
( (
"actionZoomIn", "actionZoomIn",
@ -94,7 +94,7 @@ class ViewerToolBar(QToolBar):
] ]
# TODO try with QWidgetAction() instead in order to have # TODO try with QWidgetAction() instead in order to have
# the popup menu work in the toolbar (if resized below minimum height) # the popup menu work in the toolbar (if resized below minimum height)
createActions(ACTIONS, self) create_actions(ACTIONS, self)
def createButtons(self): def createButtons(self):
self.buttonImgSwap = QToolButton(self) self.buttonImgSwap = QToolButton(self)
@ -112,29 +112,21 @@ class ViewerToolBar(QToolBar):
self.buttonZoomIn = QToolButton(self) self.buttonZoomIn = QToolButton(self)
self.buttonZoomIn.setToolButtonStyle(Qt.ToolButtonIconOnly) self.buttonZoomIn.setToolButtonStyle(Qt.ToolButtonIconOnly)
self.buttonZoomIn.setDefaultAction(self.actionZoomIn) self.buttonZoomIn.setDefaultAction(self.actionZoomIn)
# self.buttonZoomIn.setText('ZoomIn')
# self.buttonZoomIn.setIcon(QIcon.fromTheme('zoom-in'))
self.buttonZoomIn.setEnabled(False) self.buttonZoomIn.setEnabled(False)
self.buttonZoomOut = QToolButton(self) self.buttonZoomOut = QToolButton(self)
self.buttonZoomOut.setToolButtonStyle(Qt.ToolButtonIconOnly) self.buttonZoomOut.setToolButtonStyle(Qt.ToolButtonIconOnly)
self.buttonZoomOut.setDefaultAction(self.actionZoomOut) self.buttonZoomOut.setDefaultAction(self.actionZoomOut)
# self.buttonZoomOut.setText('ZoomOut')
# self.buttonZoomOut.setIcon(QIcon.fromTheme('zoom-out'))
self.buttonZoomOut.setEnabled(False) self.buttonZoomOut.setEnabled(False)
self.buttonNormalSize = QToolButton(self) self.buttonNormalSize = QToolButton(self)
self.buttonNormalSize.setToolButtonStyle(Qt.ToolButtonIconOnly) self.buttonNormalSize.setToolButtonStyle(Qt.ToolButtonIconOnly)
self.buttonNormalSize.setDefaultAction(self.actionNormalSize) self.buttonNormalSize.setDefaultAction(self.actionNormalSize)
# self.buttonNormalSize.setText('Normal Size')
# self.buttonNormalSize.setIcon(QIcon.fromTheme('zoom-original'))
self.buttonNormalSize.setEnabled(True) self.buttonNormalSize.setEnabled(True)
self.buttonBestFit = QToolButton(self) self.buttonBestFit = QToolButton(self)
self.buttonBestFit.setToolButtonStyle(Qt.ToolButtonIconOnly) self.buttonBestFit.setToolButtonStyle(Qt.ToolButtonIconOnly)
self.buttonBestFit.setDefaultAction(self.actionBestFit) self.buttonBestFit.setDefaultAction(self.actionBestFit)
# self.buttonBestFit.setText('BestFit')
# self.buttonBestFit.setIcon(QIcon.fromTheme('zoom-best-fit'))
self.buttonBestFit.setEnabled(False) self.buttonBestFit.setEnabled(False)
self.addWidget(self.buttonImgSwap) self.addWidget(self.buttonImgSwap)
@ -164,9 +156,9 @@ class BaseController(QObject):
self.cached_group = None self.cached_group = None
self.same_dimensions = True self.same_dimensions = True
def setupViewers(self, selectedViewer, referenceViewer): def setupViewers(self, selected_viewer, reference_viewer):
self.selectedViewer = selectedViewer self.selectedViewer = selected_viewer
self.referenceViewer = referenceViewer self.referenceViewer = reference_viewer
self.selectedViewer.controller = self self.selectedViewer.controller = self
self.referenceViewer.controller = self self.referenceViewer.controller = self
self._setupConnections() self._setupConnections()
@ -187,7 +179,6 @@ class BaseController(QObject):
self.selectedPixmap = QPixmap(str(dupe.path)) self.selectedPixmap = QPixmap(str(dupe.path))
if ref is dupe: # currently selected file is the actual reference file if ref is dupe: # currently selected file is the actual reference file
# self.same_dimensions = False
self.referencePixmap = QPixmap() self.referencePixmap = QPixmap()
self.scaledReferencePixmap = QPixmap() self.scaledReferencePixmap = QPixmap()
self.parent.verticalToolBar.buttonImgSwap.setEnabled(False) self.parent.verticalToolBar.buttonImgSwap.setEnabled(False)
@ -536,14 +527,14 @@ class GraphicsViewController(BaseController):
self.referenceViewer.setCenter(self.selectedViewer._centerPoint) self.referenceViewer.setCenter(self.selectedViewer._centerPoint)
@pyqtSlot(float, QPointF) @pyqtSlot(float, QPointF)
def onMouseWheel(self, factor, newCenter): def onMouseWheel(self, factor, new_center):
self.current_scale *= factor self.current_scale *= factor
if self.sender() is self.referenceViewer: if self.sender() is self.referenceViewer:
self.selectedViewer.scaleBy(factor) self.selectedViewer.scaleBy(factor)
self.selectedViewer.setCenter(newCenter) self.selectedViewer.setCenter(new_center)
else: else:
self.referenceViewer.scaleBy(factor) self.referenceViewer.scaleBy(factor)
self.referenceViewer.setCenter(newCenter) self.referenceViewer.setCenter(new_center)
@pyqtSlot(int) @pyqtSlot(int)
def onVScrollBarChanged(self, value): def onVScrollBarChanged(self, value):
@ -613,8 +604,6 @@ class GraphicsViewController(BaseController):
if ref.dimensions != dupe.dimensions: if ref.dimensions != dupe.dimensions:
self.same_dimensions = False self.same_dimensions = False
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True) self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
# self.selectedViewer.setImage(self.selectedPixmap)
# self.referenceViewer.setImage(self.referencePixmap)
self.updateButtonsAsPerDimensions(previous_same_dimensions) self.updateButtonsAsPerDimensions(previous_same_dimensions)
self.updateBothImages(same_group) self.updateBothImages(same_group)
@ -634,7 +623,6 @@ class GraphicsViewController(BaseController):
# If not same_group, we need full update""" # If not same_group, we need full update"""
viewer.setImage(pixmap) viewer.setImage(pixmap)
if pixmap.isNull(): if pixmap.isNull():
# viewer._item = None
return return
if viewer.bestFit: if viewer.bestFit:
viewer.fitScale() viewer.fitScale()
@ -920,12 +908,12 @@ class ScrollAreaImageViewer(QScrollArea):
def __repr__(self): def __repr__(self):
return f"{self._instance_name}" return f"{self._instance_name}"
def toggleScrollBars(self, forceOn=False): def toggleScrollBars(self, force_on=False):
if not self.prefs.details_dialog_viewers_show_scrollbars: if not self.prefs.details_dialog_viewers_show_scrollbars:
return return
# Ensure that it's off on the first run # Ensure that it's off on the first run
if self.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded: if self.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded:
if forceOn: if force_on:
return return
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
@ -998,18 +986,18 @@ class ScrollAreaImageViewer(QScrollArea):
if self.bestFit or not self.controller.same_dimensions: if self.bestFit or not self.controller.same_dimensions:
event.ignore() event.ignore()
return return
oldScale = self.current_scale old_scale = self.current_scale
if event.angleDelta().y() > 0: # zoom-in if event.angleDelta().y() > 0: # zoom-in
if oldScale < MAX_SCALE: if old_scale < MAX_SCALE:
self.current_scale *= 1.25 self.current_scale *= 1.25
else: else:
if oldScale > MIN_SCALE: # zoom-out if old_scale > MIN_SCALE: # zoom-out
self.current_scale *= 0.8 self.current_scale *= 0.8
if oldScale == self.current_scale: if old_scale == self.current_scale:
return return
deltaToPos = (event.position() / oldScale) - (self.label.pos() / oldScale) delta_to_pos = (event.position() / old_scale) - (self.label.pos() / old_scale)
delta = (deltaToPos * self.current_scale) - (deltaToPos * oldScale) delta = (delta_to_pos * self.current_scale) - (delta_to_pos * old_scale)
self.mouseWheeled.emit(self.current_scale, delta) self.mouseWheeled.emit(self.current_scale, delta)
def setImage(self, pixmap): def setImage(self, pixmap):
@ -1104,13 +1092,6 @@ class ScrollAreaImageViewer(QScrollArea):
# Signal from scrollbars had already synced the values here # Signal from scrollbars had already synced the values here
self.adjustScrollBarsAuto() self.adjustScrollBarsAuto()
# def viewportSizeHint(self):
# return self.viewport().rect().size()
# def changeEvent(self, event):
# if event.type() == QEvent.EnabledChange:
# print(f"{self} is now {'enabled' if self.isEnabled() else 'disabled'}")
class GraphicsViewViewer(QGraphicsView): class GraphicsViewViewer(QGraphicsView):
"""Re-Implementation a full-fledged GraphicsView but is a bit buggy.""" """Re-Implementation a full-fledged GraphicsView but is a bit buggy."""
@ -1148,7 +1129,6 @@ class GraphicsViewViewer(QGraphicsView):
self.setScene(self._scene) self.setScene(self._scene)
self._scene.addItem(self._item) self._scene.addItem(self._item)
self.setDragMode(QGraphicsView.DragMode.ScrollHandDrag) self.setDragMode(QGraphicsView.DragMode.ScrollHandDrag)
# self.matrix = QTransform()
self._horizontalScrollBar = self.horizontalScrollBar() self._horizontalScrollBar = self.horizontalScrollBar()
self._verticalScrollBar = self.verticalScrollBar() self._verticalScrollBar = self.verticalScrollBar()
self.ignore_signal = False self.ignore_signal = False
@ -1184,12 +1164,12 @@ class GraphicsViewViewer(QGraphicsView):
self._verticalScrollBar.valueChanged.connect(self.controller.onVScrollBarChanged, Qt.UniqueConnection) self._verticalScrollBar.valueChanged.connect(self.controller.onVScrollBarChanged, Qt.UniqueConnection)
self._horizontalScrollBar.valueChanged.connect(self.controller.onHScrollBarChanged, Qt.UniqueConnection) self._horizontalScrollBar.valueChanged.connect(self.controller.onHScrollBarChanged, Qt.UniqueConnection)
def toggleScrollBars(self, forceOn=False): def toggleScrollBars(self, force_on=False):
if not self.prefs.details_dialog_viewers_show_scrollbars: if not self.prefs.details_dialog_viewers_show_scrollbars:
return return
# Ensure that it's off on the first run # Ensure that it's off on the first run
if self.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded: if self.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded:
if forceOn: if force_on:
return return
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
@ -1245,9 +1225,9 @@ class GraphicsViewViewer(QGraphicsView):
if self.bestFit or MIN_SCALE > self.current_scale > MAX_SCALE or not self.controller.same_dimensions: if self.bestFit or MIN_SCALE > self.current_scale > MAX_SCALE or not self.controller.same_dimensions:
event.ignore() event.ignore()
return return
pointBeforeScale = QPointF(self.mapToScene(self.mapFromGlobal(QCursor.pos()))) point_before_scale = QPointF(self.mapToScene(self.mapFromGlobal(QCursor.pos())))
# Get the original screen centerpoint # Get the original screen centerpoint
screenCenter = QPointF(self.mapToScene(self.rect().center())) screen_center = QPointF(self.mapToScene(self.rect().center()))
if event.angleDelta().y() > 0: if event.angleDelta().y() > 0:
factor = self.zoomInFactor factor = self.zoomInFactor
else: else:
@ -1255,13 +1235,13 @@ class GraphicsViewViewer(QGraphicsView):
# Avoid scrollbars conflict: # Avoid scrollbars conflict:
self.other_viewer.ignore_signal = True self.other_viewer.ignore_signal = True
self.scaleBy(factor) self.scaleBy(factor)
pointAfterScale = QPointF(self.mapToScene(self.mapFromGlobal(QCursor.pos()))) point_after_scale = QPointF(self.mapToScene(self.mapFromGlobal(QCursor.pos())))
# Get the offset of how the screen moved # Get the offset of how the screen moved
offset = pointBeforeScale - pointAfterScale offset = point_before_scale - point_after_scale
# Adjust to the new center for correct zooming # Adjust to the new center for correct zooming
newCenter = screenCenter + offset new_center = screen_center + offset
self.setCenter(newCenter) self.setCenter(new_center)
self.mouseWheeled.emit(factor, newCenter) self.mouseWheeled.emit(factor, new_center)
self.other_viewer.ignore_signal = False self.other_viewer.ignore_signal = False
def setImage(self, pixmap): def setImage(self, pixmap):
@ -1296,7 +1276,6 @@ class GraphicsViewViewer(QGraphicsView):
self._item.update() self._item.update()
def scaleAt(self, scale): def scaleAt(self, scale):
# self.current_scale = scale
if scale == 1.0: if scale == 1.0:
self.resetScale() self.resetScale()
# self.setTransform( QTransform() ) # self.setTransform( QTransform() )

View File

@ -32,7 +32,7 @@ from PyQt5.QtGui import QPixmap, QIcon
from hscommon.trans import trget from hscommon.trans import trget
from hscommon.plat import ISLINUX from hscommon.plat import ISLINUX
from qtlib.util import horizontalWrap from qtlib.util import horizontal_wrap
from qtlib.preferences import get_langnames from qtlib.preferences import get_langnames
from enum import Flag, auto from enum import Flag, auto
@ -95,11 +95,11 @@ class PreferencesDialogBase(QDialog):
self.filterHardnessHLayoutSub1 = QHBoxLayout() self.filterHardnessHLayoutSub1 = QHBoxLayout()
self.filterHardnessHLayoutSub1.setSpacing(12) self.filterHardnessHLayoutSub1.setSpacing(12)
self.filterHardnessSlider = QSlider(self) self.filterHardnessSlider = QSlider(self)
sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) size_policy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) size_policy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) size_policy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.filterHardnessSlider.sizePolicy().hasHeightForWidth()) size_policy.setHeightForWidth(self.filterHardnessSlider.sizePolicy().hasHeightForWidth())
self.filterHardnessSlider.setSizePolicy(sizePolicy) self.filterHardnessSlider.setSizePolicy(size_policy)
self.filterHardnessSlider.setMinimum(1) self.filterHardnessSlider.setMinimum(1)
self.filterHardnessSlider.setMaximum(100) self.filterHardnessSlider.setMaximum(100)
self.filterHardnessSlider.setTracking(True) self.filterHardnessSlider.setTracking(True)
@ -115,8 +115,8 @@ class PreferencesDialogBase(QDialog):
self.moreResultsLabel = QLabel(self) self.moreResultsLabel = QLabel(self)
self.moreResultsLabel.setText(tr("More Results")) self.moreResultsLabel.setText(tr("More Results"))
self.filterHardnessHLayoutSub2.addWidget(self.moreResultsLabel) self.filterHardnessHLayoutSub2.addWidget(self.moreResultsLabel)
spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spacer_item = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.filterHardnessHLayoutSub2.addItem(spacerItem) self.filterHardnessHLayoutSub2.addItem(spacer_item)
self.fewerResultsLabel = QLabel(self) self.fewerResultsLabel = QLabel(self)
self.fewerResultsLabel.setText(tr("Fewer Results")) self.fewerResultsLabel.setText(tr("Fewer Results"))
self.filterHardnessHLayoutSub2.addWidget(self.fewerResultsLabel) self.filterHardnessHLayoutSub2.addWidget(self.fewerResultsLabel)
@ -146,7 +146,7 @@ class PreferencesDialogBase(QDialog):
self.languageComboBox = QComboBox(self) self.languageComboBox = QComboBox(self)
for lang in self.supportedLanguages: for lang in self.supportedLanguages:
self.languageComboBox.addItem(get_langnames()[lang]) self.languageComboBox.addItem(get_langnames()[lang])
layout.addLayout(horizontalWrap([self.languageLabel, self.languageComboBox, None])) layout.addLayout(horizontal_wrap([self.languageLabel, self.languageComboBox, None]))
self._setupAddCheckbox( self._setupAddCheckbox(
"tabs_default_pos", "tabs_default_pos",
tr("Use default position for tab bar (requires restart)"), tr("Use default position for tab bar (requires restart)"),

View File

@ -25,7 +25,7 @@ from PyQt5.QtWidgets import (
from hscommon.trans import trget from hscommon.trans import trget
from qtlib.selectable_list import ComboboxModel, ListviewModel from qtlib.selectable_list import ComboboxModel, ListviewModel
from qtlib.util import verticalSpacer from qtlib.util import vertical_spacer
from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel from core.gui.prioritize_dialog import PrioritizeDialog as PrioritizeDialogModel
tr = trget("ui") tr = trget("ui")
@ -40,12 +40,12 @@ class PrioritizationList(ListviewModel):
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsDragEnabled
# --- Drag & Drop # --- Drag & Drop
def dropMimeData(self, mimeData, action, row, column, parentIndex): def dropMimeData(self, mime_data, action, row, column, parent_index):
if not mimeData.hasFormat(MIME_INDEXES): if not mime_data.hasFormat(MIME_INDEXES):
return False return False
# Since we only drop in between items, parentIndex must be invalid, and we use the row arg # Since we only drop in between items, parentIndex must be invalid, and we use the row arg
# to know where the drop took place. # to know where the drop took place.
if parentIndex.isValid(): if parent_index.isValid():
return False return False
# "When row and column are -1 it means that the dropped data should be considered as # "When row and column are -1 it means that the dropped data should be considered as
# dropped directly on parent." # dropped directly on parent."
@ -53,8 +53,8 @@ class PrioritizationList(ListviewModel):
# dragged items after the last item. # dragged items after the last item.
if row < 0: if row < 0:
row = len(self.model) - 1 row = len(self.model) - 1
strMimeData = bytes(mimeData.data(MIME_INDEXES)).decode() str_mime_data = bytes(mime_data.data(MIME_INDEXES)).decode()
indexes = list(map(int, strMimeData.split(","))) indexes = list(map(int, str_mime_data.split(",")))
self.model.move_indexes(indexes, row) self.model.move_indexes(indexes, row)
self.view.selectionModel().clearSelection() self.view.selectionModel().clearSelection()
return True return True
@ -62,9 +62,9 @@ class PrioritizationList(ListviewModel):
def mimeData(self, indexes): def mimeData(self, indexes):
rows = {str(index.row()) for index in indexes} rows = {str(index.row()) for index in indexes}
data = ",".join(rows) data = ",".join(rows)
mimeData = QMimeData() mime_data = QMimeData()
mimeData.setData(MIME_INDEXES, QByteArray(data.encode())) mime_data.setData(MIME_INDEXES, QByteArray(data.encode()))
return mimeData return mime_data
def mimeTypes(self): def mimeTypes(self):
return [MIME_INDEXES] return [MIME_INDEXES]
@ -135,10 +135,10 @@ class PrioritizeDialog(QDialog):
self.rightSide = QWidget() self.rightSide = QWidget()
self.rightWidgetsLayout = QHBoxLayout() self.rightWidgetsLayout = QHBoxLayout()
self.addRemoveButtonsLayout = QVBoxLayout() self.addRemoveButtonsLayout = QVBoxLayout()
self.addRemoveButtonsLayout.addItem(verticalSpacer()) self.addRemoveButtonsLayout.addItem(vertical_spacer())
self.addRemoveButtonsLayout.addWidget(self.addCriteriaButton) self.addRemoveButtonsLayout.addWidget(self.addCriteriaButton)
self.addRemoveButtonsLayout.addWidget(self.removeCriteriaButton) self.addRemoveButtonsLayout.addWidget(self.removeCriteriaButton)
self.addRemoveButtonsLayout.addItem(verticalSpacer()) self.addRemoveButtonsLayout.addItem(vertical_spacer())
self.rightWidgetsLayout.addLayout(self.addRemoveButtonsLayout) self.rightWidgetsLayout.addLayout(self.addRemoveButtonsLayout)
self.rightWidgetsLayout.addWidget(self.prioritizationListView) self.rightWidgetsLayout.addWidget(self.prioritizationListView)
self.rightSide.setLayout(self.rightWidgetsLayout) self.rightSide.setLayout(self.rightWidgetsLayout)

View File

@ -63,8 +63,8 @@ class ProblemDialog(QDialog):
self.revealButton = QPushButton(self) self.revealButton = QPushButton(self)
self.revealButton.setText(tr("Reveal Selected")) self.revealButton.setText(tr("Reveal Selected"))
self.horizontalLayout.addWidget(self.revealButton) self.horizontalLayout.addWidget(self.revealButton)
spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spacer_item = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem) self.horizontalLayout.addItem(spacer_item)
self.closeButton = QPushButton(self) self.closeButton = QPushButton(self)
self.closeButton.setText(tr("Close")) self.closeButton.setText(tr("Close"))
self.closeButton.setDefault(True) self.closeButton.setDefault(True)

View File

@ -24,7 +24,7 @@ from PyQt5.QtWidgets import (
) )
from hscommon.trans import trget from hscommon.trans import trget
from qtlib.util import moveToScreenCenter, horizontalWrap, createActions from qtlib.util import move_to_screen_center, horizontal_wrap, create_actions
from qtlib.search_edit import SearchEdit from qtlib.search_edit import SearchEdit
from core.app import AppMode from core.app import AppMode
@ -204,7 +204,7 @@ class ResultWindow(QMainWindow):
self.app.invokeCustomCommand, self.app.invokeCustomCommand,
), ),
] ]
createActions(ACTIONS, self) create_actions(ACTIONS, self)
self.actionDelta.setCheckable(True) self.actionDelta.setCheckable(True)
self.actionPowerMarker.setCheckable(True) self.actionPowerMarker.setCheckable(True)
@ -306,21 +306,21 @@ class ResultWindow(QMainWindow):
action.item_index = -1 action.item_index = -1
# Action menu # Action menu
actionMenu = QMenu(tr("Actions"), menubar) action_menu = QMenu(tr("Actions"), menubar)
actionMenu.addAction(self.actionDeleteMarked) action_menu.addAction(self.actionDeleteMarked)
actionMenu.addAction(self.actionMoveMarked) action_menu.addAction(self.actionMoveMarked)
actionMenu.addAction(self.actionCopyMarked) action_menu.addAction(self.actionCopyMarked)
actionMenu.addAction(self.actionRemoveMarked) action_menu.addAction(self.actionRemoveMarked)
actionMenu.addSeparator() action_menu.addSeparator()
actionMenu.addAction(self.actionRemoveSelected) action_menu.addAction(self.actionRemoveSelected)
actionMenu.addAction(self.actionIgnoreSelected) action_menu.addAction(self.actionIgnoreSelected)
actionMenu.addAction(self.actionMakeSelectedReference) action_menu.addAction(self.actionMakeSelectedReference)
actionMenu.addSeparator() action_menu.addSeparator()
actionMenu.addAction(self.actionOpenSelected) action_menu.addAction(self.actionOpenSelected)
actionMenu.addAction(self.actionRevealSelected) action_menu.addAction(self.actionRevealSelected)
actionMenu.addAction(self.actionInvokeCustomCommand) action_menu.addAction(self.actionInvokeCustomCommand)
actionMenu.addAction(self.actionRenameSelected) action_menu.addAction(self.actionRenameSelected)
self.actionActions.setMenu(actionMenu) self.actionActions.setMenu(action_menu)
self.actionsButton.setMenu(self.actionActions.menu()) self.actionsButton.setMenu(self.actionActions.menu())
def _setupUi(self): def _setupUi(self):
@ -336,7 +336,7 @@ class ResultWindow(QMainWindow):
self.deltaValuesCheckBox = QCheckBox(tr("Delta Values")) self.deltaValuesCheckBox = QCheckBox(tr("Delta Values"))
self.searchEdit = SearchEdit() self.searchEdit = SearchEdit()
self.searchEdit.setMaximumWidth(300) self.searchEdit.setMaximumWidth(300)
self.horizontalLayout = horizontalWrap( self.horizontalLayout = horizontal_wrap(
[ [
self.actionsButton, self.actionsButton,
self.detailsButton, self.detailsButton,
@ -379,12 +379,12 @@ class ResultWindow(QMainWindow):
# moves to center of closest screen if partially off screen # moves to center of closest screen if partially off screen
frame = self.frameGeometry() frame = self.frameGeometry()
if QDesktopWidget().screenNumber(self) == -1: if QDesktopWidget().screenNumber(self) == -1:
moveToScreenCenter(self) move_to_screen_center(self)
elif QDesktopWidget().availableGeometry(self).contains(frame) is False: elif QDesktopWidget().availableGeometry(self).contains(frame) is False:
frame.moveCenter(QDesktopWidget().availableGeometry(self).center()) frame.moveCenter(QDesktopWidget().availableGeometry(self).center())
self.move(frame.topLeft()) self.move(frame.topLeft())
else: else:
moveToScreenCenter(self) move_to_screen_center(self)
# --- Private # --- Private
def _update_column_actions_status(self): def _update_column_actions_status(self):

View File

@ -50,9 +50,8 @@ class ResultsModel(Table):
if self.prefs.reference_bold_font: if self.prefs.reference_bold_font:
font.setBold(row.isref) font.setBold(row.isref)
return font return font
elif role == Qt.EditRole: elif role == Qt.EditRole and column.name == "name":
if column.name == "name": return row.data[column.name]
return row.data[column.name]
return None return None
def _getFlags(self, row, column): def _getFlags(self, row, column):
@ -69,9 +68,8 @@ class ResultsModel(Table):
if column.name == "marked": if column.name == "marked":
row.marked = bool(value) row.marked = bool(value)
return True return True
elif role == Qt.EditRole: elif role == Qt.EditRole and column.name == "name":
if column.name == "name": return self.model.rename_selected(value)
return self.model.rename_selected(value)
return False return False
def sort(self, column, order): def sort(self, column, order):

View File

@ -50,19 +50,19 @@ class PreferencesDialog(PreferencesDialogBase):
self._setupAddCheckbox("ignoreSmallFilesBox", tr("Ignore files smaller than"), self.widget) self._setupAddCheckbox("ignoreSmallFilesBox", tr("Ignore files smaller than"), self.widget)
self.horizontalLayout_2.addWidget(self.ignoreSmallFilesBox) self.horizontalLayout_2.addWidget(self.ignoreSmallFilesBox)
self.sizeThresholdSpinBox = QSpinBox(self.widget) self.sizeThresholdSpinBox = QSpinBox(self.widget)
sizePolicy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed) size_policy = QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) size_policy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) size_policy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.sizeThresholdSpinBox.sizePolicy().hasHeightForWidth()) size_policy.setHeightForWidth(self.sizeThresholdSpinBox.sizePolicy().hasHeightForWidth())
self.sizeThresholdSpinBox.setSizePolicy(sizePolicy) self.sizeThresholdSpinBox.setSizePolicy(size_policy)
self.sizeThresholdSpinBox.setMaximumSize(QSize(100, 16777215)) self.sizeThresholdSpinBox.setMaximumSize(QSize(100, 16777215))
self.sizeThresholdSpinBox.setRange(0, 1000000) self.sizeThresholdSpinBox.setRange(0, 1000000)
self.horizontalLayout_2.addWidget(self.sizeThresholdSpinBox) self.horizontalLayout_2.addWidget(self.sizeThresholdSpinBox)
self.label_6 = QLabel(self.widget) self.label_6 = QLabel(self.widget)
self.label_6.setText(tr("KB")) self.label_6.setText(tr("KB"))
self.horizontalLayout_2.addWidget(self.label_6) self.horizontalLayout_2.addWidget(self.label_6)
spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spacer_item1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout_2.addItem(spacerItem1) self.horizontalLayout_2.addItem(spacer_item1)
self.verticalLayout_4.addLayout(self.horizontalLayout_2) self.verticalLayout_4.addLayout(self.horizontalLayout_2)
self.horizontalLayout_2b = QHBoxLayout() self.horizontalLayout_2b = QHBoxLayout()
self._setupAddCheckbox( self._setupAddCheckbox(
@ -72,15 +72,15 @@ class PreferencesDialog(PreferencesDialogBase):
) )
self.horizontalLayout_2b.addWidget(self.bigFilePartialHashesBox) self.horizontalLayout_2b.addWidget(self.bigFilePartialHashesBox)
self.bigSizeThresholdSpinBox = QSpinBox(self.widget) self.bigSizeThresholdSpinBox = QSpinBox(self.widget)
self.bigSizeThresholdSpinBox.setSizePolicy(sizePolicy) self.bigSizeThresholdSpinBox.setSizePolicy(size_policy)
self.bigSizeThresholdSpinBox.setMaximumSize(QSize(100, 16777215)) self.bigSizeThresholdSpinBox.setMaximumSize(QSize(100, 16777215))
self.bigSizeThresholdSpinBox.setRange(0, 1000000) self.bigSizeThresholdSpinBox.setRange(0, 1000000)
self.horizontalLayout_2b.addWidget(self.bigSizeThresholdSpinBox) self.horizontalLayout_2b.addWidget(self.bigSizeThresholdSpinBox)
self.label_6b = QLabel(self.widget) self.label_6b = QLabel(self.widget)
self.label_6b.setText(tr("MB")) self.label_6b.setText(tr("MB"))
self.horizontalLayout_2b.addWidget(self.label_6b) self.horizontalLayout_2b.addWidget(self.label_6b)
spacerItem2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) spacer_item2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.horizontalLayout_2b.addItem(spacerItem2) self.horizontalLayout_2b.addItem(spacer_item2)
self.verticalLayout_4.addLayout(self.horizontalLayout_2b) self.verticalLayout_4.addLayout(self.horizontalLayout_2b)
self._setupAddCheckbox( self._setupAddCheckbox(
"ignoreHardlinkMatches", "ignoreHardlinkMatches",

View File

@ -14,7 +14,7 @@ from PyQt5.QtWidgets import (
QStackedWidget, QStackedWidget,
) )
from hscommon.trans import trget from hscommon.trans import trget
from qtlib.util import moveToScreenCenter, createActions from qtlib.util import move_to_screen_center, create_actions
from .directories_dialog import DirectoriesDialog from .directories_dialog import DirectoriesDialog
from .result_window import ResultWindow from .result_window import ResultWindow
from .ignore_list_dialog import IgnoreListDialog from .ignore_list_dialog import IgnoreListDialog
@ -46,7 +46,7 @@ class TabWindow(QMainWindow):
self.toggleTabBar, self.toggleTabBar,
), ),
] ]
createActions(ACTIONS, self) create_actions(ACTIONS, self)
self.actionToggleTabs.setCheckable(True) self.actionToggleTabs.setCheckable(True)
self.actionToggleTabs.setChecked(True) self.actionToggleTabs.setChecked(True)
@ -78,7 +78,7 @@ class TabWindow(QMainWindow):
if self.app.prefs.mainWindowRect is not None: if self.app.prefs.mainWindowRect is not None:
self.setGeometry(self.app.prefs.mainWindowRect) self.setGeometry(self.app.prefs.mainWindowRect)
else: else:
moveToScreenCenter(self) move_to_screen_center(self)
def _setupMenu(self): def _setupMenu(self):
"""Setup the menubar boiler plates which will be filled by the underlying """Setup the menubar boiler plates which will be filled by the underlying
@ -174,7 +174,6 @@ class TabWindow(QMainWindow):
def addTab(self, page, title, switch=False): def addTab(self, page, title, switch=False):
# Warning: this supposedly takes ownership of the page # Warning: this supposedly takes ownership of the page
index = self.tabWidget.addTab(page, title) index = self.tabWidget.addTab(page, title)
# index = self.tabWidget.insertTab(-1, page, title)
if isinstance(page, DirectoriesDialog): if isinstance(page, DirectoriesDialog):
self.tabWidget.tabBar().setTabButton(index, QTabBar.RightSide, None) self.tabWidget.tabBar().setTabButton(index, QTabBar.RightSide, None)
if switch: if switch:

View File

@ -36,11 +36,11 @@ class AboutBox(QDialog):
def _setupUi(self): def _setupUi(self):
self.setWindowTitle(tr("About {}").format(QCoreApplication.instance().applicationName())) self.setWindowTitle(tr("About {}").format(QCoreApplication.instance().applicationName()))
self.resize(400, 290) self.resize(400, 290)
sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) size_policy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0) size_policy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) size_policy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) size_policy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
self.setSizePolicy(sizePolicy) self.setSizePolicy(size_policy)
self.horizontalLayout = QHBoxLayout(self) self.horizontalLayout = QHBoxLayout(self)
self.logoLabel = QLabel(self) self.logoLabel = QLabel(self)
self.logoLabel.setPixmap(QPixmap(":/%s_big" % self.app.LOGO_NAME)) self.logoLabel.setPixmap(QPixmap(":/%s_big" % self.app.LOGO_NAME))

View File

@ -22,7 +22,7 @@ from PyQt5.QtWidgets import (
from hscommon.trans import trget from hscommon.trans import trget
from hscommon.desktop import open_url from hscommon.desktop import open_url
from .util import horizontalSpacer from .util import horizontal_spacer
tr = trget("qtlib") tr = trget("qtlib")
@ -34,10 +34,10 @@ class ErrorReportDialog(QDialog):
self._setupUi() self._setupUi()
name = QCoreApplication.applicationName() name = QCoreApplication.applicationName()
version = QCoreApplication.applicationVersion() version = QCoreApplication.applicationVersion()
errorText = "Application Name: {}\nVersion: {}\n\n{}".format(name, version, error) error_text = "Application Name: {}\nVersion: {}\n\n{}".format(name, version, error)
# Under windows, we end up with an error report without linesep if we don't mangle it # Under windows, we end up with an error report without linesep if we don't mangle it
errorText = errorText.replace("\n", os.linesep) error_text = error_text.replace("\n", os.linesep)
self.errorTextEdit.setPlainText(errorText) self.errorTextEdit.setPlainText(error_text)
self.github_url = github_url self.github_url = github_url
self.sendButton.clicked.connect(self.goToGithub) self.sendButton.clicked.connect(self.goToGithub)
@ -68,7 +68,7 @@ class ErrorReportDialog(QDialog):
self.label2.setWordWrap(True) self.label2.setWordWrap(True)
self.verticalLayout.addWidget(self.label2) self.verticalLayout.addWidget(self.label2)
self.horizontalLayout = QHBoxLayout() self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.addItem(horizontalSpacer()) self.horizontalLayout.addItem(horizontal_spacer())
self.dontSendButton = QPushButton(self) self.dontSendButton = QPushButton(self)
self.dontSendButton.setText(tr("Close")) self.dontSendButton.setText(tr("Close"))
self.dontSendButton.setMinimumSize(QSize(110, 0)) self.dontSendButton.setMinimumSize(QSize(110, 0))

View File

@ -8,7 +8,7 @@
from PyQt5.QtCore import pyqtSignal from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QRadioButton from PyQt5.QtWidgets import QWidget, QHBoxLayout, QRadioButton
from .util import horizontalSpacer from .util import horizontal_spacer
class RadioBox(QWidget): class RadioBox(QWidget):
@ -21,7 +21,7 @@ class RadioBox(QWidget):
self._buttons = [] self._buttons = []
self._labels = items self._labels = items
self._selected_index = 0 self._selected_index = 0
self._spacer = horizontalSpacer() if not spread else None self._spacer = horizontal_spacer() if not spread else None
self._layout = QHBoxLayout(self) self._layout = QHBoxLayout(self)
self._update_buttons() self._update_buttons()

View File

@ -20,12 +20,12 @@ MenuEntry = namedtuple("MenuEntry", "menu fixedItemCount")
class Recent(QObject): class Recent(QObject):
def __init__(self, app, prefName, maxItemCount=10, **kwargs): def __init__(self, app, pref_name, max_item_count=10, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)
self._app = app self._app = app
self._menuEntries = [] self._menuEntries = []
self._prefName = prefName self._prefName = pref_name
self._maxItemCount = maxItemCount self._maxItemCount = max_item_count
self._items = [] self._items = []
self._loadFromPrefs() self._loadFromPrefs()
@ -41,9 +41,9 @@ class Recent(QObject):
def _insertItem(self, item): def _insertItem(self, item):
self._items = dedupe([item] + self._items)[: self._maxItemCount] self._items = dedupe([item] + self._items)[: self._maxItemCount]
def _refreshMenu(self, menuEntry): def _refreshMenu(self, menu_entry):
menu, fixedItemCount = menuEntry menu, fixed_item_count = menu_entry
for action in menu.actions()[fixedItemCount:]: for action in menu.actions()[fixed_item_count:]:
menu.removeAction(action) menu.removeAction(action)
for item in self._items: for item in self._items:
action = QAction(item, menu) action = QAction(item, menu)
@ -56,17 +56,17 @@ class Recent(QObject):
menu.addAction(action) menu.addAction(action)
def _refreshAllMenus(self): def _refreshAllMenus(self):
for menuEntry in self._menuEntries: for menu_entry in self._menuEntries:
self._refreshMenu(menuEntry) self._refreshMenu(menu_entry)
def _saveToPrefs(self): def _saveToPrefs(self):
setattr(self._app.prefs, self._prefName, self._items) setattr(self._app.prefs, self._prefName, self._items)
# --- Public # --- Public
def addMenu(self, menu): def addMenu(self, menu):
menuEntry = MenuEntry(menu, len(menu.actions())) menu_entry = MenuEntry(menu, len(menu.actions()))
self._menuEntries.append(menuEntry) self._menuEntries.append(menu_entry)
self._refreshMenu(menuEntry) self._refreshMenu(menu_entry)
def clear(self): def clear(self):
self._items = [] self._items = []

View File

@ -36,9 +36,9 @@ class ClearableEdit(QLineEdit):
self._is_clearable = is_clearable self._is_clearable = is_clearable
if is_clearable: if is_clearable:
self._clearButton = LineEditButton(self) self._clearButton = LineEditButton(self)
frameWidth = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) frame_width = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth)
paddingRight = self._clearButton.sizeHint().width() + frameWidth + 1 padding_right = self._clearButton.sizeHint().width() + frame_width + 1
stylesheet = "QLineEdit {{ padding-right:{0}px; }}".format(paddingRight) stylesheet = "QLineEdit {{ padding-right:{0}px; }}".format(padding_right)
self.setStyleSheet(stylesheet) self.setStyleSheet(stylesheet)
self._updateClearButton() self._updateClearButton()
@ -58,12 +58,12 @@ class ClearableEdit(QLineEdit):
# --- QLineEdit overrides # --- QLineEdit overrides
def resizeEvent(self, event): def resizeEvent(self, event):
if self._is_clearable: if self._is_clearable:
frameWidth = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) frame_width = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth)
rect = self.rect() rect = self.rect()
rightHint = self._clearButton.sizeHint() right_hint = self._clearButton.sizeHint()
rightX = rect.right() - frameWidth - rightHint.width() right_x = rect.right() - frame_width - right_hint.width()
rightY = (rect.bottom() - rightHint.height()) // 2 right_y = (rect.bottom() - right_hint.height()) // 2
self._clearButton.move(rightX, rightY) self._clearButton.move(right_x, right_y)
# --- Event Handlers # --- Event Handlers
def _textChanged(self, text): def _textChanged(self, text):
@ -102,14 +102,14 @@ class SearchEdit(ClearableEdit):
if not bool(self.text()) and self.inactiveText and not self.hasFocus(): if not bool(self.text()) and self.inactiveText and not self.hasFocus():
panel = QStyleOptionFrame() panel = QStyleOptionFrame()
self.initStyleOption(panel) self.initStyleOption(panel)
textRect = self.style().subElementRect(QStyle.SE_LineEditContents, panel, self) text_rect = self.style().subElementRect(QStyle.SE_LineEditContents, panel, self)
leftMargin = 2 left_margin = 2
rightMargin = self._clearButton.iconSize().width() right_margin = self._clearButton.iconSize().width()
textRect.adjust(leftMargin, 0, -rightMargin, 0) text_rect.adjust(left_margin, 0, -right_margin, 0)
painter = QPainter(self) painter = QPainter(self)
disabledColor = self.palette().brush(QPalette.Disabled, QPalette.Text).color() disabled_color = self.palette().brush(QPalette.Disabled, QPalette.Text).color()
painter.setPen(disabledColor) painter.setPen(disabled_color)
painter.drawText(textRect, Qt.AlignLeft | Qt.AlignVCenter, self.inactiveText) painter.drawText(text_rect, Qt.AlignLeft | Qt.AlignVCenter, self.inactiveText)
# --- Event Handlers # --- Event Handlers
def _returnPressed(self): def _returnPressed(self):

View File

@ -80,19 +80,19 @@ class ListviewModel(SelectableList):
# --- Override # --- Override
def _updateSelection(self): def _updateSelection(self):
newIndexes = [modelIndex.row() for modelIndex in self.view.selectionModel().selectedRows()] new_indexes = [modelIndex.row() for modelIndex in self.view.selectionModel().selectedRows()]
if newIndexes != self.model.selected_indexes: if new_indexes != self.model.selected_indexes:
self.model.select(newIndexes) self.model.select(new_indexes)
def _restoreSelection(self): def _restoreSelection(self):
newSelection = QItemSelection() new_selection = QItemSelection()
for index in self.model.selected_indexes: for index in self.model.selected_indexes:
newSelection.select(self.createIndex(index, 0), self.createIndex(index, 0)) new_selection.select(self.createIndex(index, 0), self.createIndex(index, 0))
self.view.selectionModel().select(newSelection, QItemSelectionModel.ClearAndSelect) self.view.selectionModel().select(new_selection, QItemSelectionModel.ClearAndSelect)
if len(newSelection.indexes()): if len(new_selection.indexes()):
currentIndex = newSelection.indexes()[0] current_index = new_selection.indexes()[0]
self.view.selectionModel().setCurrentIndex(currentIndex, QItemSelectionModel.Current) self.view.selectionModel().setCurrentIndex(current_index, QItemSelectionModel.Current)
self.view.scrollTo(currentIndex) self.view.scrollTo(current_index)
# --- Events # --- Events
def selectionChanged(self, index): def selectionChanged(self, index):

View File

@ -38,21 +38,21 @@ class Table(QAbstractTableModel):
# an _updateViewSelection() call will normally result in an _updateModelSelection() call. # an _updateViewSelection() call will normally result in an _updateModelSelection() call.
# to avoid infinite loops, we check that the selection will actually change before calling # to avoid infinite loops, we check that the selection will actually change before calling
# model.select() # model.select()
newIndexes = [modelIndex.row() for modelIndex in self.view.selectionModel().selectedRows()] new_indexes = [modelIndex.row() for modelIndex in self.view.selectionModel().selectedRows()]
if newIndexes != self.model.selected_indexes: if new_indexes != self.model.selected_indexes:
self.model.select(newIndexes) self.model.select(new_indexes)
def _updateViewSelection(self): def _updateViewSelection(self):
# Takes the selection on the model's side and update the view with it. # Takes the selection on the model's side and update the view with it.
newSelection = QItemSelection() new_selection = QItemSelection()
columnCount = self.columnCount(QModelIndex()) column_count = self.columnCount(QModelIndex())
for index in self.model.selected_indexes: for index in self.model.selected_indexes:
newSelection.select(self.createIndex(index, 0), self.createIndex(index, columnCount - 1)) new_selection.select(self.createIndex(index, 0), self.createIndex(index, column_count - 1))
self.view.selectionModel().select(newSelection, QItemSelectionModel.ClearAndSelect) self.view.selectionModel().select(new_selection, QItemSelectionModel.ClearAndSelect)
if len(newSelection.indexes()): if len(new_selection.indexes()):
currentIndex = newSelection.indexes()[0] current_index = new_selection.indexes()[0]
self.view.selectionModel().setCurrentIndex(currentIndex, QItemSelectionModel.Current) self.view.selectionModel().setCurrentIndex(current_index, QItemSelectionModel.Current)
self.view.scrollTo(currentIndex) self.view.scrollTo(current_index)
# --- Data Model methods # --- Data Model methods
# Virtual # Virtual

View File

@ -26,27 +26,27 @@ from PyQt5.QtWidgets import (
) )
def moveToScreenCenter(widget): def move_to_screen_center(widget):
frame = widget.frameGeometry() frame = widget.frameGeometry()
frame.moveCenter(QDesktopWidget().availableGeometry().center()) frame.moveCenter(QDesktopWidget().availableGeometry().center())
widget.move(frame.topLeft()) widget.move(frame.topLeft())
def verticalSpacer(size=None): def vertical_spacer(size=None):
if size: if size:
return QSpacerItem(1, size, QSizePolicy.Fixed, QSizePolicy.Fixed) return QSpacerItem(1, size, QSizePolicy.Fixed, QSizePolicy.Fixed)
else: else:
return QSpacerItem(1, 1, QSizePolicy.Fixed, QSizePolicy.MinimumExpanding) return QSpacerItem(1, 1, QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)
def horizontalSpacer(size=None): def horizontal_spacer(size=None):
if size: if size:
return QSpacerItem(size, 1, QSizePolicy.Fixed, QSizePolicy.Fixed) return QSpacerItem(size, 1, QSizePolicy.Fixed, QSizePolicy.Fixed)
else: else:
return QSpacerItem(1, 1, QSizePolicy.MinimumExpanding, QSizePolicy.Fixed) return QSpacerItem(1, 1, QSizePolicy.MinimumExpanding, QSizePolicy.Fixed)
def horizontalWrap(widgets): def horizontal_wrap(widgets):
"""Wrap all widgets in `widgets` in a horizontal layout. """Wrap all widgets in `widgets` in a horizontal layout.
If, instead of placing a widget in your list, you place an int or None, an horizontal spacer If, instead of placing a widget in your list, you place an int or None, an horizontal spacer
@ -55,14 +55,14 @@ def horizontalWrap(widgets):
layout = QHBoxLayout() layout = QHBoxLayout()
for widget in widgets: for widget in widgets:
if widget is None or isinstance(widget, int): if widget is None or isinstance(widget, int):
layout.addItem(horizontalSpacer(size=widget)) layout.addItem(horizontal_spacer(size=widget))
else: else:
layout.addWidget(widget) layout.addWidget(widget)
return layout return layout
def createActions(actions, target): def create_actions(actions, target):
# actions = [(name, shortcut, icon, desc, func)] # actions are list of (name, shortcut, icon, desc, func)
for name, shortcut, icon, desc, func in actions: for name, shortcut, icon, desc, func in actions:
action = QAction(target) action = QAction(target)
if icon: if icon:
@ -74,7 +74,7 @@ def createActions(actions, target):
setattr(target, name, action) setattr(target, name, action)
def setAccelKeys(menu): def set_accel_keys(menu):
actions = menu.actions() actions = menu.actions()
titles = [a.text() for a in actions] titles = [a.text() for a in actions]
available_characters = {c.lower() for s in titles for c in s if c.isalpha()} available_characters = {c.lower() for s in titles for c in s if c.isalpha()}
@ -89,7 +89,7 @@ def setAccelKeys(menu):
action.setText(newtext) action.setText(newtext)
def getAppData(portable=False): def get_appdata(portable=False):
if portable: if portable:
return op.join(executable_folder(), "data") return op.join(executable_folder(), "data")
else: else:
@ -102,11 +102,11 @@ class SysWrapper(io.IOBase):
logging.warning(s) logging.warning(s)
def setupQtLogging(level=logging.WARNING, log_to_stdout=False): def setup_qt_logging(level=logging.WARNING, log_to_stdout=False):
# Under Qt, we log in "debug.log" in appdata. Moreover, when under cx_freeze, we have a # Under Qt, we log in "debug.log" in appdata. Moreover, when under cx_freeze, we have a
# problem because sys.stdout and sys.stderr are None, so we need to replace them with a # problem because sys.stdout and sys.stderr are None, so we need to replace them with a
# wrapper that logs with the logging module. # wrapper that logs with the logging module.
appdata = getAppData() appdata = get_appdata()
if not op.exists(appdata): if not op.exists(appdata):
os.makedirs(appdata) os.makedirs(appdata)
# Setup logging # Setup logging
@ -123,7 +123,7 @@ def setupQtLogging(level=logging.WARNING, log_to_stdout=False):
sys.stdout = SysWrapper() sys.stdout = SysWrapper()
def escapeamp(s): def escape_amp(s):
# Returns `s` with escaped ampersand (& --> &&). QAction text needs to have & escaped because # Returns `s` with escaped ampersand (& --> &&). QAction text needs to have & escaped because
# that character is used to define "accel keys". # that character is used to define "accel keys".
return s.replace("&", "&&") return s.replace("&", "&&")

16
run.py
View File

@ -15,7 +15,7 @@ from PyQt5.QtWidgets import QApplication
from hscommon.trans import install_gettext_trans_under_qt from hscommon.trans import install_gettext_trans_under_qt
from qtlib.error_report_dialog import install_excepthook from qtlib.error_report_dialog import install_excepthook
from qtlib.util import setupQtLogging from qtlib.util import setup_qt_logging
from qtlib.preferences import create_qsettings from qtlib.preferences import create_qsettings
from qt import dg_rc # noqa: F401 from qt import dg_rc # noqa: F401
from qt.platform import BASE_PATH from qt.platform import BASE_PATH
@ -33,7 +33,7 @@ global dgapp
dgapp = None dgapp = None
def signalHandler(sig, frame): def signal_handler(sig, frame):
global dgapp global dgapp
if dgapp is None: if dgapp is None:
return return
@ -41,10 +41,10 @@ def signalHandler(sig, frame):
dgapp.SIGTERM.emit() dgapp.SIGTERM.emit()
def setUpSignals(): def setup_signals():
signal(SIGINT, signalHandler) signal(SIGINT, signal_handler)
signal(SIGTERM, signalHandler) signal(SIGTERM, signal_handler)
signal(SIGQUIT, signalHandler) signal(SIGQUIT, signal_handler)
def main(): def main():
@ -52,13 +52,13 @@ def main():
QCoreApplication.setOrganizationName("Hardcoded Software") QCoreApplication.setOrganizationName("Hardcoded Software")
QCoreApplication.setApplicationName(__appname__) QCoreApplication.setApplicationName(__appname__)
QCoreApplication.setApplicationVersion(__version__) QCoreApplication.setApplicationVersion(__version__)
setupQtLogging() setup_qt_logging()
settings = create_qsettings() settings = create_qsettings()
lang = settings.value("Language") lang = settings.value("Language")
locale_folder = op.join(BASE_PATH, "locale") locale_folder = op.join(BASE_PATH, "locale")
install_gettext_trans_under_qt(locale_folder, lang) install_gettext_trans_under_qt(locale_folder, lang)
# Handle OS signals # Handle OS signals
setUpSignals() setup_signals()
# Let the Python interpreter runs every 500ms to handle signals. This is # Let the Python interpreter runs every 500ms to handle signals. This is
# required because Python cannot handle signals while the Qt event loop is # required because Python cannot handle signals while the Qt event loop is
# running. # running.