mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-03-10 05:34:36 +00:00
Updated the qt part of dupeguru to adjust to the latest column reorganization.
This commit is contained in:
parent
9226a4fb7c
commit
d9ae967439
@ -1,4 +1,3 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Created By: Virgil Dupras
|
# Created By: Virgil Dupras
|
||||||
# Created On: 2010-04-12
|
# Created On: 2010-04-12
|
||||||
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
|
# Copyright 2011 Hardcoded Software (http://www.hardcoded.net)
|
||||||
@ -9,11 +8,21 @@
|
|||||||
|
|
||||||
from hscommon.notify import Listener
|
from hscommon.notify import Listener
|
||||||
from hscommon.gui.table import GUITable, Row
|
from hscommon.gui.table import GUITable, Row
|
||||||
|
from hscommon.gui.column import Column, Columns
|
||||||
|
from hscommon.trans import trget
|
||||||
|
|
||||||
|
coltr = trget('columns')
|
||||||
|
|
||||||
class ProblemTable(GUITable, Listener):
|
class ProblemTable(GUITable, Listener):
|
||||||
|
COLUMNS = [
|
||||||
|
Column('path', coltr("File Path")),
|
||||||
|
Column('msg', coltr("Error Message")),
|
||||||
|
]
|
||||||
|
|
||||||
def __init__(self, view, problem_dialog):
|
def __init__(self, view, problem_dialog):
|
||||||
GUITable.__init__(self)
|
GUITable.__init__(self)
|
||||||
Listener.__init__(self, problem_dialog)
|
Listener.__init__(self, problem_dialog)
|
||||||
|
self.columns = Columns(self)
|
||||||
self.view = view
|
self.view = view
|
||||||
self.dialog = problem_dialog
|
self.dialog = problem_dialog
|
||||||
|
|
||||||
|
@ -53,6 +53,12 @@ class DupeGuru(QObject):
|
|||||||
LOGO_NAME = '<replace this>'
|
LOGO_NAME = '<replace this>'
|
||||||
NAME = '<replace this>'
|
NAME = '<replace this>'
|
||||||
|
|
||||||
|
DETAILS_DIALOG_CLASS = None
|
||||||
|
RESULT_WINDOW_CLASS = ResultWindow
|
||||||
|
RESULT_MODEL_CLASS = None
|
||||||
|
PREFERENCES_CLASS = None
|
||||||
|
PREFERENCES_DIALOG_CLASS = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
QObject.__init__(self)
|
QObject.__init__(self)
|
||||||
appdata = str(QDesktopServices.storageLocation(QDesktopServices.DataLocation))
|
appdata = str(QDesktopServices.storageLocation(QDesktopServices.DataLocation))
|
||||||
@ -65,7 +71,7 @@ class DupeGuru(QObject):
|
|||||||
sys.stderr = SysWrapper()
|
sys.stderr = SysWrapper()
|
||||||
if sys.stdout is None:
|
if sys.stdout is None:
|
||||||
sys.stdout = SysWrapper()
|
sys.stdout = SysWrapper()
|
||||||
self.prefs = self._create_preferences()
|
self.prefs = self.PREFERENCES_CLASS()
|
||||||
self.prefs.load()
|
self.prefs.load()
|
||||||
self.model = self.MODELCLASS(view=self, appdata=appdata)
|
self.model = self.MODELCLASS(view=self, appdata=appdata)
|
||||||
self._setup()
|
self._setup()
|
||||||
@ -77,12 +83,12 @@ class DupeGuru(QObject):
|
|||||||
self._update_options()
|
self._update_options()
|
||||||
self.recentResults = Recent(self, 'recentResults')
|
self.recentResults = Recent(self, 'recentResults')
|
||||||
self.recentResults.mustOpenItem.connect(self.model.load_from)
|
self.recentResults.mustOpenItem.connect(self.model.load_from)
|
||||||
self.resultWindow = self._create_result_window()
|
self.resultWindow = self.RESULT_WINDOW_CLASS(self)
|
||||||
self._progress = Progress(self.resultWindow)
|
self._progress = Progress(self.resultWindow)
|
||||||
self.directories_dialog = DirectoriesDialog(self.resultWindow, self)
|
self.directories_dialog = DirectoriesDialog(self.resultWindow, self)
|
||||||
self.details_dialog = self._create_details_dialog(self.resultWindow)
|
self.details_dialog = self.DETAILS_DIALOG_CLASS(self.resultWindow, self)
|
||||||
self.problemDialog = ProblemDialog(parent=self.resultWindow, app=self)
|
self.problemDialog = ProblemDialog(parent=self.resultWindow, app=self)
|
||||||
self.preferences_dialog = self._create_preferences_dialog(self.resultWindow)
|
self.preferences_dialog = self.PREFERENCES_DIALOG_CLASS(self.resultWindow, self)
|
||||||
self.about_box = AboutBox(self.resultWindow, self)
|
self.about_box = AboutBox(self.resultWindow, self)
|
||||||
|
|
||||||
self.directories_dialog.show()
|
self.directories_dialog.show()
|
||||||
@ -119,19 +125,6 @@ class DupeGuru(QObject):
|
|||||||
self.model.options['clean_empty_dirs'] = self.prefs.remove_empty_folders
|
self.model.options['clean_empty_dirs'] = self.prefs.remove_empty_folders
|
||||||
self.model.options['ignore_hardlink_matches'] = self.prefs.ignore_hardlink_matches
|
self.model.options['ignore_hardlink_matches'] = self.prefs.ignore_hardlink_matches
|
||||||
|
|
||||||
#--- Virtual
|
|
||||||
def _create_details_dialog(self, parent):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
def _create_result_window(self):
|
|
||||||
return ResultWindow(app=self)
|
|
||||||
|
|
||||||
def _create_preferences(self):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
def _create_preferences_dialog(self, parent):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
#--- Public
|
#--- Public
|
||||||
def add_selected_to_ignore_list(self):
|
def add_selected_to_ignore_list(self):
|
||||||
dupes = self.model.without_ref(self.model.selected_dupes)
|
dupes = self.model.without_ref(self.model.selected_dupes)
|
||||||
|
@ -11,13 +11,6 @@ from PyQt4.QtGui import QApplication
|
|||||||
from qtlib.preferences import Preferences as PreferencesBase
|
from qtlib.preferences import Preferences as PreferencesBase
|
||||||
|
|
||||||
class Preferences(PreferencesBase):
|
class Preferences(PreferencesBase):
|
||||||
# (width, is_visible)
|
|
||||||
COLUMNS_DEFAULT_ATTRS = []
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
PreferencesBase.__init__(self)
|
|
||||||
self.reset_columns()
|
|
||||||
|
|
||||||
def _load_specific(self, settings):
|
def _load_specific(self, settings):
|
||||||
# load prefs specific to the dg edition
|
# load prefs specific to the dg edition
|
||||||
pass
|
pass
|
||||||
@ -34,13 +27,6 @@ class Preferences(PreferencesBase):
|
|||||||
self.custom_command = get('CustomCommand', self.custom_command)
|
self.custom_command = get('CustomCommand', self.custom_command)
|
||||||
self.language = get('Language', self.language)
|
self.language = get('Language', self.language)
|
||||||
|
|
||||||
widths = get('ColumnsWidth', self.columns_width)
|
|
||||||
# only set nonzero values
|
|
||||||
for index, width in enumerate(widths[:len(self.columns_width)]):
|
|
||||||
if width > 0:
|
|
||||||
self.columns_width[index] = width
|
|
||||||
self.columns_visible = get('ColumnsVisible', self.columns_visible)
|
|
||||||
|
|
||||||
self.tableFontSize = get('TableFontSize', self.tableFontSize)
|
self.tableFontSize = get('TableFontSize', self.tableFontSize)
|
||||||
self.resultWindowIsMaximized = get('ResultWindowIsMaximized', self.resultWindowIsMaximized)
|
self.resultWindowIsMaximized = get('ResultWindowIsMaximized', self.resultWindowIsMaximized)
|
||||||
self.resultWindowRect = self.get_rect('ResultWindowRect', self.resultWindowRect)
|
self.resultWindowRect = self.get_rect('ResultWindowRect', self.resultWindowRect)
|
||||||
@ -76,10 +62,6 @@ class Preferences(PreferencesBase):
|
|||||||
|
|
||||||
self._reset_specific()
|
self._reset_specific()
|
||||||
|
|
||||||
def reset_columns(self):
|
|
||||||
self.columns_width = [width for width, _ in self.COLUMNS_DEFAULT_ATTRS]
|
|
||||||
self.columns_visible = [visible for _, visible in self.COLUMNS_DEFAULT_ATTRS]
|
|
||||||
|
|
||||||
def _save_specific(self, settings):
|
def _save_specific(self, settings):
|
||||||
# save prefs specific to the dg edition
|
# save prefs specific to the dg edition
|
||||||
pass
|
pass
|
||||||
@ -94,8 +76,6 @@ class Preferences(PreferencesBase):
|
|||||||
set_('DebugMode', self.debug_mode)
|
set_('DebugMode', self.debug_mode)
|
||||||
set_('DestinationType', self.destination_type)
|
set_('DestinationType', self.destination_type)
|
||||||
set_('CustomCommand', self.custom_command)
|
set_('CustomCommand', self.custom_command)
|
||||||
set_('ColumnsWidth', self.columns_width)
|
|
||||||
set_('ColumnsVisible', self.columns_visible)
|
|
||||||
set_('Language', self.language)
|
set_('Language', self.language)
|
||||||
|
|
||||||
set_('TableFontSize', self.tableFontSize)
|
set_('TableFontSize', self.tableFontSize)
|
||||||
|
@ -6,17 +6,14 @@
|
|||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.hardcoded.net/licenses/bsd_license
|
# http://www.hardcoded.net/licenses/bsd_license
|
||||||
|
|
||||||
from hscommon.trans import trget
|
|
||||||
from qtlib.column import Column
|
from qtlib.column import Column
|
||||||
from qtlib.table import Table
|
from qtlib.table import Table
|
||||||
from core.gui.problem_table import ProblemTable as ProblemTableModel
|
from core.gui.problem_table import ProblemTable as ProblemTableModel
|
||||||
|
|
||||||
tr = trget('ui')
|
|
||||||
|
|
||||||
class ProblemTable(Table):
|
class ProblemTable(Table):
|
||||||
COLUMNS = [
|
COLUMNS = [
|
||||||
Column('path', tr("File Path"), 150),
|
Column('path', defaultWidth=150),
|
||||||
Column('msg', tr("Error Message"), 150),
|
Column('msg', defaultWidth=150),
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, problem_dialog, view):
|
def __init__(self, problem_dialog, view):
|
||||||
|
@ -7,16 +7,16 @@
|
|||||||
# http://www.hardcoded.net/licenses/bsd_license
|
# http://www.hardcoded.net/licenses/bsd_license
|
||||||
|
|
||||||
from PyQt4.QtCore import Qt, SIGNAL, QUrl, QRect
|
from PyQt4.QtCore import Qt, SIGNAL, QUrl, QRect
|
||||||
from PyQt4.QtGui import (QMainWindow, QMenu, QLabel, QHeaderView, QMessageBox, QInputDialog,
|
from PyQt4.QtGui import (QMainWindow, QMenu, QLabel, QMessageBox, QInputDialog, QLineEdit,
|
||||||
QLineEdit, QDesktopServices, QFileDialog, QMenuBar, QWidget, QVBoxLayout, QAbstractItemView,
|
QDesktopServices, QFileDialog, QMenuBar, QWidget, QVBoxLayout, QAbstractItemView, QStatusBar,
|
||||||
QStatusBar, QDialog)
|
QDialog)
|
||||||
|
|
||||||
from hscommon.plat import ISOSX, ISLINUX
|
from hscommon.plat import ISOSX, ISLINUX
|
||||||
from hscommon.trans import trget
|
from hscommon.trans import trget
|
||||||
from hscommon.util import nonone
|
from hscommon.util import nonone
|
||||||
from qtlib.util import moveToScreenCenter
|
from qtlib.util import moveToScreenCenter
|
||||||
|
|
||||||
from .results_model import ResultsModel, ResultsView
|
from .results_model import ResultsView
|
||||||
from .stats_label import StatsLabel
|
from .stats_label import StatsLabel
|
||||||
from .util import createActions
|
from .util import createActions
|
||||||
from .prioritize_dialog import PrioritizeDialog
|
from .prioritize_dialog import PrioritizeDialog
|
||||||
@ -29,9 +29,8 @@ class ResultWindow(QMainWindow):
|
|||||||
self.app = app
|
self.app = app
|
||||||
self._last_filter = None
|
self._last_filter = None
|
||||||
self._setupUi()
|
self._setupUi()
|
||||||
self.resultsModel = ResultsModel(self.app, self.resultsView)
|
self.resultsModel = app.RESULT_MODEL_CLASS(self.app, self.resultsView)
|
||||||
self.stats = StatsLabel(app, self.statusLabel)
|
self.stats = StatsLabel(app, self.statusLabel)
|
||||||
self._load_columns()
|
|
||||||
self._update_column_actions_status()
|
self._update_column_actions_status()
|
||||||
|
|
||||||
self.connect(self.menuColumns, SIGNAL('triggered(QAction*)'), self.columnToggled)
|
self.connect(self.menuColumns, SIGNAL('triggered(QAction*)'), self.columnToggled)
|
||||||
@ -141,14 +140,15 @@ class ResultWindow(QMainWindow):
|
|||||||
# Columns menu
|
# Columns menu
|
||||||
menu = self.menuColumns
|
menu = self.menuColumns
|
||||||
self._column_actions = []
|
self._column_actions = []
|
||||||
for index, column in enumerate(self.app.model.COLUMNS):
|
for index, (display, visible) in enumerate(self.app.model.result_table.columns.menu_items()):
|
||||||
action = menu.addAction(column.display)
|
action = menu.addAction(display)
|
||||||
action.setCheckable(True)
|
action.setCheckable(True)
|
||||||
action.column_index = index
|
action.setChecked(visible)
|
||||||
|
action.item_index = index
|
||||||
self._column_actions.append(action)
|
self._column_actions.append(action)
|
||||||
menu.addSeparator()
|
menu.addSeparator()
|
||||||
action = menu.addAction(tr("Reset to Defaults"))
|
action = menu.addAction(tr("Reset to Defaults"))
|
||||||
action.column_index = -1
|
action.item_index = -1
|
||||||
|
|
||||||
# Action menu
|
# Action menu
|
||||||
actionMenu = QMenu(tr("Actions"), self.menubar)
|
actionMenu = QMenu(tr("Actions"), self.menubar)
|
||||||
@ -203,21 +203,11 @@ class ResultWindow(QMainWindow):
|
|||||||
moveToScreenCenter(self)
|
moveToScreenCenter(self)
|
||||||
|
|
||||||
#--- Private
|
#--- Private
|
||||||
def _load_columns(self):
|
|
||||||
h = self.resultsView.horizontalHeader()
|
|
||||||
h.setResizeMode(QHeaderView.Interactive)
|
|
||||||
prefs = self.app.prefs
|
|
||||||
attrs = list(zip(prefs.columns_width, prefs.columns_visible))
|
|
||||||
for index, (width, visible) in enumerate(attrs):
|
|
||||||
h.resizeSection(index, width)
|
|
||||||
h.setSectionHidden(index, not visible)
|
|
||||||
h.setResizeMode(0, QHeaderView.Stretch)
|
|
||||||
|
|
||||||
def _update_column_actions_status(self):
|
def _update_column_actions_status(self):
|
||||||
h = self.resultsView.horizontalHeader()
|
# Update menu checked state
|
||||||
for action in self._column_actions:
|
menu_items = self.app.model.result_table.columns.menu_items()
|
||||||
colid = action.column_index
|
for action, (display, visible) in zip(self._column_actions, menu_items):
|
||||||
action.setChecked(not h.isSectionHidden(colid))
|
action.setChecked(visible)
|
||||||
|
|
||||||
#--- Actions
|
#--- Actions
|
||||||
def actionsTriggered(self):
|
def actionsTriggered(self):
|
||||||
@ -352,26 +342,17 @@ class ResultWindow(QMainWindow):
|
|||||||
#--- Events
|
#--- Events
|
||||||
def appWillSavePrefs(self):
|
def appWillSavePrefs(self):
|
||||||
prefs = self.app.prefs
|
prefs = self.app.prefs
|
||||||
h = self.resultsView.horizontalHeader()
|
|
||||||
widths = []
|
|
||||||
visible = []
|
|
||||||
for i in range(len(self.app.model.COLUMNS)):
|
|
||||||
widths.append(h.sectionSize(i))
|
|
||||||
visible.append(not h.isSectionHidden(i))
|
|
||||||
prefs.columns_width = widths
|
|
||||||
prefs.columns_visible = visible
|
|
||||||
prefs.resultWindowIsMaximized = self.isMaximized()
|
prefs.resultWindowIsMaximized = self.isMaximized()
|
||||||
prefs.resultWindowRect = self.geometry()
|
prefs.resultWindowRect = self.geometry()
|
||||||
|
|
||||||
def columnToggled(self, action):
|
def columnToggled(self, action):
|
||||||
colid = action.column_index
|
index = action.item_index
|
||||||
if colid == -1:
|
if index == -1:
|
||||||
self.app.prefs.reset_columns()
|
self.app.model.result_table.columns.reset_to_defaults()
|
||||||
self._load_columns()
|
|
||||||
else:
|
|
||||||
h = self.resultsView.horizontalHeader()
|
|
||||||
h.setSectionHidden(colid, not h.isSectionHidden(colid))
|
|
||||||
self._update_column_actions_status()
|
self._update_column_actions_status()
|
||||||
|
else:
|
||||||
|
visible = self.app.model.result_table.columns.toggle_menu_item(index)
|
||||||
|
action.setChecked(visible)
|
||||||
|
|
||||||
def contextMenuEvent(self, event):
|
def contextMenuEvent(self, event):
|
||||||
self.actionActions.menu().exec_(event.globalPos())
|
self.actionActions.menu().exec_(event.globalPos())
|
||||||
|
@ -15,31 +15,31 @@ from core.gui.result_table import ResultTable as ResultTableModel
|
|||||||
|
|
||||||
class ResultsModel(Table):
|
class ResultsModel(Table):
|
||||||
def __init__(self, app, view):
|
def __init__(self, app, view):
|
||||||
model = ResultTableModel(self, app.model)
|
model = app.model.result_table
|
||||||
self._app = app.model
|
|
||||||
self._delta_columns = app.model.DELTA_COLUMNS
|
|
||||||
Table.__init__(self, model, view)
|
Table.__init__(self, model, view)
|
||||||
self.model.connect()
|
self.model.connect()
|
||||||
|
|
||||||
app.prefsChanged.connect(self.appPrefsChanged)
|
app.prefsChanged.connect(self.appPrefsChanged)
|
||||||
|
app.willSavePrefs.connect(self.appWillSavePrefs)
|
||||||
|
|
||||||
def columnCount(self, parent):
|
def columnCount(self, parent):
|
||||||
return len(self._app.COLUMNS)
|
return len(self.model.COLUMNS)
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if not index.isValid():
|
if not index.isValid():
|
||||||
return None
|
return None
|
||||||
row = self.model[index.row()]
|
row = self.model[index.row()]
|
||||||
|
column = self.model.COLUMNS[index.column()]
|
||||||
if role == Qt.DisplayRole:
|
if role == Qt.DisplayRole:
|
||||||
data = row.data_delta if self.model.delta_values else row.data
|
data = row.data_delta if self.model.delta_values else row.data
|
||||||
return data[index.column()]
|
return data[column.name]
|
||||||
elif role == Qt.CheckStateRole:
|
elif role == Qt.CheckStateRole:
|
||||||
if index.column() == 0 and row.markable:
|
if index.column() == 0 and row.markable:
|
||||||
return Qt.Checked if row.marked else Qt.Unchecked
|
return Qt.Checked if row.marked else Qt.Unchecked
|
||||||
elif role == Qt.ForegroundRole:
|
elif role == Qt.ForegroundRole:
|
||||||
if row.isref:
|
if row.isref:
|
||||||
return QBrush(Qt.blue)
|
return QBrush(Qt.blue)
|
||||||
elif self.model.delta_values and index.column() in self._delta_columns:
|
elif self.model.delta_values and column.name in self.model.DELTA_COLUMNS:
|
||||||
return QBrush(QColor(255, 142, 40)) # orange
|
return QBrush(QColor(255, 142, 40)) # orange
|
||||||
elif role == Qt.FontRole:
|
elif role == Qt.FontRole:
|
||||||
isBold = row.isref
|
isBold = row.isref
|
||||||
@ -47,8 +47,8 @@ class ResultsModel(Table):
|
|||||||
font.setBold(isBold)
|
font.setBold(isBold)
|
||||||
return font
|
return font
|
||||||
elif role == Qt.EditRole:
|
elif role == Qt.EditRole:
|
||||||
if index.column() == 0:
|
if column.name == 'name':
|
||||||
return row.data[index.column()]
|
return row.data[column.name]
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def flags(self, index):
|
def flags(self, index):
|
||||||
@ -64,26 +64,28 @@ class ResultsModel(Table):
|
|||||||
|
|
||||||
def headerData(self, section, orientation, role):
|
def headerData(self, section, orientation, role):
|
||||||
if role == Qt.DisplayRole:
|
if role == Qt.DisplayRole:
|
||||||
if orientation == Qt.Horizontal and section < len(self._app.COLUMNS):
|
if orientation == Qt.Horizontal and section < len(self.model.COLUMNS):
|
||||||
return self._app.COLUMNS[section].display
|
return self.model.COLUMNS[section].display
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def setData(self, index, value, role):
|
def setData(self, index, value, role):
|
||||||
if not index.isValid():
|
if not index.isValid():
|
||||||
return False
|
return False
|
||||||
row = self.model[index.row()]
|
row = self.model[index.row()]
|
||||||
|
column = self.model.COLUMNS[index.column()]
|
||||||
if role == Qt.CheckStateRole:
|
if role == Qt.CheckStateRole:
|
||||||
if index.column() == 0:
|
if column.name == 'name':
|
||||||
self._app.mark_dupe(row._dupe, value.toBool())
|
self.model.app.mark_dupe(row._dupe, value.toBool())
|
||||||
return True
|
return True
|
||||||
elif role == Qt.EditRole:
|
elif role == Qt.EditRole:
|
||||||
if index.column() == 0:
|
if column.name == 'name':
|
||||||
value = str(value.toString())
|
value = str(value.toString())
|
||||||
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):
|
||||||
self.model.sort(column, order == Qt.AscendingOrder)
|
column = self.model.COLUMNS[column]
|
||||||
|
self.model.sort(column.name, order == Qt.AscendingOrder)
|
||||||
|
|
||||||
#--- Properties
|
#--- Properties
|
||||||
@property
|
@property
|
||||||
@ -110,6 +112,9 @@ class ResultsModel(Table):
|
|||||||
fm = QFontMetrics(font)
|
fm = QFontMetrics(font)
|
||||||
self.view.verticalHeader().setDefaultSectionSize(fm.height()+2)
|
self.view.verticalHeader().setDefaultSectionSize(fm.height()+2)
|
||||||
|
|
||||||
|
def appWillSavePrefs(self):
|
||||||
|
self.model.columns.save_columns()
|
||||||
|
|
||||||
#--- model --> view
|
#--- model --> view
|
||||||
def invalidate_markings(self):
|
def invalidate_markings(self):
|
||||||
# redraw view
|
# redraw view
|
||||||
|
15
qt/me/app.py
15
qt/me/app.py
@ -11,6 +11,7 @@ from core_me.app import DupeGuru as DupeGuruModel
|
|||||||
|
|
||||||
from ..base.app import DupeGuru as DupeGuruBase
|
from ..base.app import DupeGuru as DupeGuruBase
|
||||||
from .details_dialog import DetailsDialog
|
from .details_dialog import DetailsDialog
|
||||||
|
from .results_model import ResultsModel
|
||||||
from .preferences import Preferences
|
from .preferences import Preferences
|
||||||
from .preferences_dialog import PreferencesDialog
|
from .preferences_dialog import PreferencesDialog
|
||||||
|
|
||||||
@ -20,6 +21,11 @@ class DupeGuru(DupeGuruBase):
|
|||||||
LOGO_NAME = 'logo_me'
|
LOGO_NAME = 'logo_me'
|
||||||
NAME = __appname__
|
NAME = __appname__
|
||||||
|
|
||||||
|
DETAILS_DIALOG_CLASS = DetailsDialog
|
||||||
|
RESULT_MODEL_CLASS = ResultsModel
|
||||||
|
PREFERENCES_CLASS = Preferences
|
||||||
|
PREFERENCES_DIALOG_CLASS = PreferencesDialog
|
||||||
|
|
||||||
def _update_options(self):
|
def _update_options(self):
|
||||||
DupeGuruBase._update_options(self)
|
DupeGuruBase._update_options(self)
|
||||||
self.model.scanner.min_match_percentage = self.prefs.filter_hardness
|
self.model.scanner.min_match_percentage = self.prefs.filter_hardness
|
||||||
@ -41,12 +47,3 @@ class DupeGuru(DupeGuruBase):
|
|||||||
scanned_tags.add('year')
|
scanned_tags.add('year')
|
||||||
self.model.scanner.scanned_tags = scanned_tags
|
self.model.scanner.scanned_tags = scanned_tags
|
||||||
|
|
||||||
def _create_details_dialog(self, parent):
|
|
||||||
return DetailsDialog(parent, self)
|
|
||||||
|
|
||||||
def _create_preferences(self):
|
|
||||||
return Preferences()
|
|
||||||
|
|
||||||
def _create_preferences_dialog(self, parent):
|
|
||||||
return PreferencesDialog(parent, self)
|
|
||||||
|
|
||||||
|
@ -11,28 +11,6 @@ from core.scanner import ScanType
|
|||||||
from ..base.preferences import Preferences as PreferencesBase
|
from ..base.preferences import Preferences as PreferencesBase
|
||||||
|
|
||||||
class Preferences(PreferencesBase):
|
class Preferences(PreferencesBase):
|
||||||
# (width, is_visible)
|
|
||||||
COLUMNS_DEFAULT_ATTRS = [
|
|
||||||
(200, True), # name
|
|
||||||
(180, True), # path
|
|
||||||
(60, True), # size
|
|
||||||
(60, True), # Time
|
|
||||||
(50, True), # Bitrate
|
|
||||||
(60, False), # Sample Rate
|
|
||||||
(40, False), # Kind
|
|
||||||
(120, False), # modification
|
|
||||||
(120, False), # Title
|
|
||||||
(120, False), # Artist
|
|
||||||
(120, False), # Album
|
|
||||||
(80, False), # Genre
|
|
||||||
(40, False), # Year
|
|
||||||
(40, False), # Track Number
|
|
||||||
(120, False), # Comment
|
|
||||||
(60, True), # match %
|
|
||||||
(120, False), # Words Used
|
|
||||||
(80, False), # dupe count
|
|
||||||
]
|
|
||||||
|
|
||||||
def _load_specific(self, settings):
|
def _load_specific(self, settings):
|
||||||
get = self.get_value
|
get = self.get_value
|
||||||
self.scan_type = get('ScanType', self.scan_type)
|
self.scan_type = get('ScanType', self.scan_type)
|
||||||
|
19
qt/pe/app.py
19
qt/pe/app.py
@ -18,6 +18,7 @@ from ..base.app import DupeGuru as DupeGuruBase
|
|||||||
from .block import getblocks
|
from .block import getblocks
|
||||||
from .details_dialog import DetailsDialog
|
from .details_dialog import DetailsDialog
|
||||||
from .result_window import ResultWindow
|
from .result_window import ResultWindow
|
||||||
|
from .results_model import ResultsModel
|
||||||
from .preferences import Preferences
|
from .preferences import Preferences
|
||||||
from .preferences_dialog import PreferencesDialog
|
from .preferences_dialog import PreferencesDialog
|
||||||
|
|
||||||
@ -70,6 +71,12 @@ class DupeGuru(DupeGuruBase):
|
|||||||
LOGO_NAME = 'logo_pe'
|
LOGO_NAME = 'logo_pe'
|
||||||
NAME = __appname__
|
NAME = __appname__
|
||||||
|
|
||||||
|
DETAILS_DIALOG_CLASS = DetailsDialog
|
||||||
|
RESULT_WINDOW_CLASS = ResultWindow
|
||||||
|
RESULT_MODEL_CLASS = ResultsModel
|
||||||
|
PREFERENCES_CLASS = Preferences
|
||||||
|
PREFERENCES_DIALOG_CLASS = PreferencesDialog
|
||||||
|
|
||||||
def _setup(self):
|
def _setup(self):
|
||||||
self.model.directories.fileclasses = [File]
|
self.model.directories.fileclasses = [File]
|
||||||
DupeGuruBase._setup(self)
|
DupeGuruBase._setup(self)
|
||||||
@ -80,15 +87,3 @@ class DupeGuru(DupeGuruBase):
|
|||||||
self.model.scanner.match_scaled = self.prefs.match_scaled
|
self.model.scanner.match_scaled = self.prefs.match_scaled
|
||||||
self.model.scanner.threshold = self.prefs.filter_hardness
|
self.model.scanner.threshold = self.prefs.filter_hardness
|
||||||
|
|
||||||
def _create_details_dialog(self, parent):
|
|
||||||
return DetailsDialog(parent, self)
|
|
||||||
|
|
||||||
def _create_result_window(self):
|
|
||||||
return ResultWindow(app=self)
|
|
||||||
|
|
||||||
def _create_preferences(self):
|
|
||||||
return Preferences()
|
|
||||||
|
|
||||||
def _create_preferences_dialog(self, parent):
|
|
||||||
return PreferencesDialog(parent, self)
|
|
||||||
|
|
||||||
|
@ -11,18 +11,6 @@ from core.scanner import ScanType
|
|||||||
from ..base.preferences import Preferences as PreferencesBase
|
from ..base.preferences import Preferences as PreferencesBase
|
||||||
|
|
||||||
class Preferences(PreferencesBase):
|
class Preferences(PreferencesBase):
|
||||||
# (width, is_visible)
|
|
||||||
COLUMNS_DEFAULT_ATTRS = [
|
|
||||||
(200, True), # name
|
|
||||||
(180, True), # path
|
|
||||||
(60, True), # size
|
|
||||||
(40, False), # kind
|
|
||||||
(100, True), # dimensions
|
|
||||||
(120, False), # modification
|
|
||||||
(60, True), # match %
|
|
||||||
(80, False), # dupe count
|
|
||||||
]
|
|
||||||
|
|
||||||
def _load_specific(self, settings):
|
def _load_specific(self, settings):
|
||||||
get = self.get_value
|
get = self.get_value
|
||||||
self.scan_type = get('ScanType', self.scan_type)
|
self.scan_type = get('ScanType', self.scan_type)
|
||||||
|
15
qt/se/app.py
15
qt/se/app.py
@ -12,6 +12,7 @@ from core.directories import Directories as DirectoriesBase, DirectoryState
|
|||||||
|
|
||||||
from ..base.app import DupeGuru as DupeGuruBase
|
from ..base.app import DupeGuru as DupeGuruBase
|
||||||
from .details_dialog import DetailsDialog
|
from .details_dialog import DetailsDialog
|
||||||
|
from .results_model import ResultsModel
|
||||||
from .preferences import Preferences
|
from .preferences import Preferences
|
||||||
from .preferences_dialog import PreferencesDialog
|
from .preferences_dialog import PreferencesDialog
|
||||||
|
|
||||||
@ -30,6 +31,11 @@ class DupeGuru(DupeGuruBase):
|
|||||||
LOGO_NAME = 'logo_se'
|
LOGO_NAME = 'logo_se'
|
||||||
NAME = __appname__
|
NAME = __appname__
|
||||||
|
|
||||||
|
DETAILS_DIALOG_CLASS = DetailsDialog
|
||||||
|
RESULT_MODEL_CLASS = ResultsModel
|
||||||
|
PREFERENCES_CLASS = Preferences
|
||||||
|
PREFERENCES_DIALOG_CLASS = PreferencesDialog
|
||||||
|
|
||||||
def _setup(self):
|
def _setup(self):
|
||||||
self.directories = Directories()
|
self.directories = Directories()
|
||||||
DupeGuruBase._setup(self)
|
DupeGuruBase._setup(self)
|
||||||
@ -43,12 +49,3 @@ class DupeGuru(DupeGuruBase):
|
|||||||
threshold = self.prefs.small_file_threshold if self.prefs.ignore_small_files else 0
|
threshold = self.prefs.small_file_threshold if self.prefs.ignore_small_files else 0
|
||||||
self.model.scanner.size_threshold = threshold * 1024 # threshold is in KB. the scanner wants bytes
|
self.model.scanner.size_threshold = threshold * 1024 # threshold is in KB. the scanner wants bytes
|
||||||
|
|
||||||
def _create_details_dialog(self, parent):
|
|
||||||
return DetailsDialog(parent, self)
|
|
||||||
|
|
||||||
def _create_preferences(self):
|
|
||||||
return Preferences()
|
|
||||||
|
|
||||||
def _create_preferences_dialog(self, parent):
|
|
||||||
return PreferencesDialog(parent, self)
|
|
||||||
|
|
||||||
|
@ -11,18 +11,6 @@ from core.scanner import ScanType
|
|||||||
from ..base.preferences import Preferences as PreferencesBase
|
from ..base.preferences import Preferences as PreferencesBase
|
||||||
|
|
||||||
class Preferences(PreferencesBase):
|
class Preferences(PreferencesBase):
|
||||||
# (width, is_visible)
|
|
||||||
COLUMNS_DEFAULT_ATTRS = [
|
|
||||||
(200, True), # name
|
|
||||||
(180, True), # path
|
|
||||||
(60, True), # size
|
|
||||||
(40, False), # Kind
|
|
||||||
(120, False), # modification
|
|
||||||
(60, True), # match %
|
|
||||||
(120, False), # Words Used
|
|
||||||
(80, False), # dupe count
|
|
||||||
]
|
|
||||||
|
|
||||||
def _load_specific(self, settings):
|
def _load_specific(self, settings):
|
||||||
get = self.get_value
|
get = self.get_value
|
||||||
self.scan_type = get('ScanType', self.scan_type)
|
self.scan_type = get('ScanType', self.scan_type)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user