mirror of
				https://github.com/arsenetar/dupeguru.git
				synced 2025-09-11 17:58:17 +00:00 
			
		
		
		
	[#115 state:fixed] Re-factored the data columns (and delta columns) and made the Dimensions column a delta one.
This commit is contained in:
		
							parent
							
								
									c885cb35d8
								
							
						
					
					
						commit
						da41d07dae
					
				| @ -45,6 +45,7 @@ http://www.hardcoded.net/licenses/bsd_license | ||||
| - (NSNumber *)getMarkCount; | ||||
| - (BOOL)scanWasProblematic; | ||||
| - (BOOL)resultsAreModified; | ||||
| - (NSArray *)deltaColumns; | ||||
| 
 | ||||
| //Scanning options
 | ||||
| - (void)setMinMatchPercentage:(NSNumber *)percentage; | ||||
|  | ||||
| @ -29,6 +29,7 @@ http://www.hardcoded.net/licenses/bsd_license | ||||
|     [self fillColumnsMenu]; | ||||
|     [matches setTarget:self]; | ||||
|     [matches setDoubleAction:@selector(openClicked:)]; | ||||
|     [table setDeltaColumns:[Utils array2IndexSet:[py deltaColumns]]]; | ||||
|      | ||||
|     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobCompleted:) name:JobCompletedNotification object:nil]; | ||||
|     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(jobStarted:) name:JobStarted object:nil]; | ||||
|  | ||||
| @ -14,15 +14,6 @@ http://www.hardcoded.net/licenses/bsd_license | ||||
| 
 | ||||
| @implementation ResultWindow | ||||
| /* Override */ | ||||
| - (id)initWithParentApp:(AppDelegateBase *)aApp; | ||||
| { | ||||
|     self = [super initWithParentApp:aApp]; | ||||
|     NSMutableIndexSet *deltaColumns = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(2,6)]; | ||||
|     [deltaColumns removeIndex:6]; | ||||
|     [table setDeltaColumns:deltaColumns]; | ||||
|     return self; | ||||
| } | ||||
| 
 | ||||
| - (void)setScanOptions | ||||
| { | ||||
|     NSUserDefaults *ud = [NSUserDefaults standardUserDefaults]; | ||||
|  | ||||
| @ -14,15 +14,6 @@ http://www.hardcoded.net/licenses/bsd_license | ||||
| 
 | ||||
| @implementation ResultWindow | ||||
| /* Override */ | ||||
| - (id)initWithParentApp:(AppDelegateBase *)aApp; | ||||
| { | ||||
|     self = [super initWithParentApp:aApp]; | ||||
|     NSMutableIndexSet *deltaColumns = [NSMutableIndexSet indexSetWithIndex:2]; | ||||
|     [deltaColumns addIndex:5]; | ||||
|     [table setDeltaColumns:deltaColumns]; | ||||
|     return self; | ||||
| } | ||||
| 
 | ||||
| - (void)initResultColumns | ||||
| { | ||||
|     NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"]; | ||||
|  | ||||
| @ -13,15 +13,6 @@ http://www.hardcoded.net/licenses/bsd_license | ||||
| 
 | ||||
| @implementation ResultWindow | ||||
| /* Override */ | ||||
| - (id)initWithParentApp:(AppDelegateBase *)aApp; | ||||
| { | ||||
|     self = [super initWithParentApp:aApp]; | ||||
|     NSMutableIndexSet *deltaColumns = [NSMutableIndexSet indexSetWithIndex:2]; | ||||
|     [deltaColumns addIndex:4]; | ||||
|     [table setDeltaColumns:deltaColumns]; | ||||
|     return self; | ||||
| } | ||||
| 
 | ||||
| - (void)initResultColumns | ||||
| { | ||||
|     NSTableColumn *refCol = [matches tableColumnWithIdentifier:@"0"]; | ||||
|  | ||||
| @ -221,7 +221,7 @@ class DupeGuru(RegistrableApplication, Broadcaster): | ||||
|         column_ids = [colid for colid in column_ids if colid.isdigit()] | ||||
|         column_ids = list(map(int, column_ids)) | ||||
|         column_ids.sort() | ||||
|         colnames = [col['display'] for i, col in enumerate(self.data.COLUMNS) if i in column_ids] | ||||
|         colnames = [col.display for i, col in enumerate(self.data.COLUMNS) if i in column_ids] | ||||
|         rows = [] | ||||
|         for group in self.results.groups: | ||||
|             for dupe in group: | ||||
|  | ||||
| @ -112,6 +112,9 @@ class PyDupeGuruBase(PyFairware): | ||||
|     def resultsAreModified(self): | ||||
|         return self.py.results.is_modified | ||||
|      | ||||
|     def deltaColumns(self): | ||||
|         return list(self.py.data.DELTA_COLUMNS) | ||||
|      | ||||
|     #---Properties | ||||
|     @signature('v@:c') | ||||
|     def setMixFileKind_(self, mix_file_kind): | ||||
|  | ||||
| @ -6,10 +6,14 @@ | ||||
| # which should be included with this package. The terms are also available at  | ||||
| # http://www.hardcoded.net/licenses/bsd_license | ||||
| 
 | ||||
| from collections import namedtuple | ||||
| 
 | ||||
| from hscommon.util import format_time_decimal, format_size | ||||
| 
 | ||||
| import time | ||||
| 
 | ||||
| Column = namedtuple('Column', 'attr display') | ||||
| 
 | ||||
| def format_path(p): | ||||
|     return str(p[:-1]) | ||||
| 
 | ||||
|  | ||||
| @ -31,7 +31,7 @@ class DetailsPanel(GUIObject): | ||||
|         # we don't want the two sides of the table to display the stats for the same file | ||||
|         ref = group.ref if group is not None and group.ref is not dupe else None | ||||
|         l2 = self.app._get_display_info(ref, group, False) | ||||
|         names = [c['display'] for c in self.app.data.COLUMNS] | ||||
|         names = [c.display for c in self.app.data.COLUMNS] | ||||
|         self._table = list(zip(names, l1, l2)) | ||||
|      | ||||
|     #--- Public | ||||
|  | ||||
| @ -1,4 +1,3 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
| # Created By: Virgil Dupras | ||||
| # Created On: 2009-10-23 | ||||
| # Copyright 2010 Hardcoded Software (http://www.hardcoded.net) | ||||
| @ -10,16 +9,17 @@ | ||||
| # data module for tests | ||||
| 
 | ||||
| from hscommon.util import format_size | ||||
| from ..data import format_path, cmp_value | ||||
| from ..data import format_path, cmp_value, Column | ||||
| 
 | ||||
| COLUMNS = [ | ||||
|     {'attr':'name','display':'Filename'}, | ||||
|     {'attr':'path','display':'Directory'}, | ||||
|     {'attr':'size','display':'Size (KB)'}, | ||||
|     {'attr':'extension','display':'Kind'}, | ||||
|     Column('name', 'Filename'), | ||||
|     Column('path', 'Directory'), | ||||
|     Column('size', 'Size (KB)'), | ||||
|     Column('extension', 'Kind'), | ||||
| ] | ||||
| 
 | ||||
| METADATA_TO_READ = ['size'] | ||||
| DELTA_COLUMNS = {2,} | ||||
| 
 | ||||
| def GetDisplayInfo(dupe, group, delta): | ||||
|     size = dupe.size | ||||
| @ -35,10 +35,10 @@ def GetDisplayInfo(dupe, group, delta): | ||||
|     ] | ||||
| 
 | ||||
| def GetDupeSortKey(dupe, get_group, key, delta): | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key]['attr'])) | ||||
|     if delta and (key == 2): | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key]['attr'])) | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key].attr)) | ||||
|     if delta and (key in DELTA_COLUMNS): | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key].attr)) | ||||
|     return r | ||||
| 
 | ||||
| def GetGroupSortKey(group, key): | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key]['attr'])) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key].attr)) | ||||
| @ -9,33 +9,34 @@ | ||||
| from hscommon.util import format_time, format_size | ||||
| from hscommon.trans import tr as trbase | ||||
| from core.data import (format_path, format_timestamp, format_words, format_perc,  | ||||
|     format_dupe_count, cmp_value) | ||||
|     format_dupe_count, cmp_value, Column) | ||||
| 
 | ||||
| tr = lambda s: trbase(s, 'columns') | ||||
| 
 | ||||
| COLUMNS = [ | ||||
|     {'attr': 'name', 'display': tr("Filename")}, | ||||
|     {'attr': 'path', 'display': tr("Folder")}, | ||||
|     {'attr': 'size', 'display': tr("Size (MB)")}, | ||||
|     {'attr': 'duration', 'display': tr("Time")}, | ||||
|     {'attr': 'bitrate', 'display': tr("Bitrate")}, | ||||
|     {'attr': 'samplerate', 'display': tr("Sample Rate")}, | ||||
|     {'attr': 'extension', 'display': tr("Kind")}, | ||||
|     {'attr': 'mtime', 'display': tr("Modification")}, | ||||
|     {'attr': 'title', 'display': tr("Title")}, | ||||
|     {'attr': 'artist', 'display': tr("Artist")}, | ||||
|     {'attr': 'album', 'display': tr("Album")}, | ||||
|     {'attr': 'genre', 'display': tr("Genre")}, | ||||
|     {'attr': 'year', 'display': tr("Year")}, | ||||
|     {'attr': 'track', 'display': tr("Track Number")}, | ||||
|     {'attr': 'comment', 'display': tr("Comment")}, | ||||
|     {'attr': 'percentage', 'display': tr("Match %")}, | ||||
|     {'attr': 'words', 'display': tr("Words Used")}, | ||||
|     {'attr': 'dupe_count', 'display': tr("Dupe Count")}, | ||||
|     Column('name', tr("Filename")), | ||||
|     Column('path', tr("Folder")), | ||||
|     Column('size', tr("Size (MB)")), | ||||
|     Column('duration', tr("Time")), | ||||
|     Column('bitrate', tr("Bitrate")), | ||||
|     Column('samplerate', tr("Sample Rate")), | ||||
|     Column('extension', tr("Kind")), | ||||
|     Column('mtime', tr("Modification")), | ||||
|     Column('title', tr("Title")), | ||||
|     Column('artist', tr("Artist")), | ||||
|     Column('album', tr("Album")), | ||||
|     Column('genre', tr("Genre")), | ||||
|     Column('year', tr("Year")), | ||||
|     Column('track', tr("Track Number")), | ||||
|     Column('comment', tr("Comment")), | ||||
|     Column('percentage', tr("Match %")), | ||||
|     Column('words', tr("Words Used")), | ||||
|     Column('dupe_count', tr("Dupe Count")), | ||||
| ] | ||||
| 
 | ||||
| MATCHPERC_COL = 15 | ||||
| DUPECOUNT_COL = 17 | ||||
| DELTA_COLUMNS = {2, 3, 4, 5, 7} | ||||
| 
 | ||||
| METADATA_TO_READ = ['size', 'mtime', 'duration', 'bitrate', 'samplerate', 'title', 'artist', | ||||
|     'album', 'genre', 'year', 'track', 'comment'] | ||||
| @ -87,9 +88,9 @@ def GetDupeSortKey(dupe, get_group, key, delta): | ||||
|         return m.percentage | ||||
|     if key == DUPECOUNT_COL: | ||||
|         return 0 | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key]['attr'], '')) | ||||
|     if delta and (key in {2, 3, 4, 7}): | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key]['attr'], '')) | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key].attr, '')) | ||||
|     if delta and (key in DELTA_COLUMNS): | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key].attr, '')) | ||||
|     return r | ||||
| 
 | ||||
| def GetGroupSortKey(group, key): | ||||
| @ -97,4 +98,4 @@ def GetGroupSortKey(group, key): | ||||
|         return group.percentage | ||||
|     if key == DUPECOUNT_COL: | ||||
|         return len(group) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key]['attr'], '')) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key].attr, '')) | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
| 
 | ||||
| from hscommon.util import format_size | ||||
| from hscommon.trans import tr as trbase | ||||
| from core.data import format_path, format_timestamp, format_perc, format_dupe_count, cmp_value | ||||
| from core.data import format_path, format_timestamp, format_perc, format_dupe_count, cmp_value, Column | ||||
| 
 | ||||
| tr = lambda s: trbase(s, 'columns') | ||||
| 
 | ||||
| @ -16,26 +16,31 @@ def format_dimensions(dimensions): | ||||
|     return '%d x %d' % (dimensions[0], dimensions[1]) | ||||
| 
 | ||||
| COLUMNS = [ | ||||
|     {'attr':'name', 'display': tr("Filename")}, | ||||
|     {'attr':'path', 'display': tr("Folder")}, | ||||
|     {'attr':'size', 'display': tr("Size (KB)")}, | ||||
|     {'attr':'extension', 'display': tr("Kind")}, | ||||
|     {'attr':'dimensions', 'display': tr("Dimensions")}, | ||||
|     {'attr':'mtime', 'display': tr("Modification")}, | ||||
|     {'attr':'percentage', 'display': tr("Match %")}, | ||||
|     {'attr':'dupe_count', 'display': tr("Dupe Count")}, | ||||
|     Column('name', tr("Filename")), | ||||
|     Column('path', tr("Folder")), | ||||
|     Column('size', tr("Size (KB)")), | ||||
|     Column('extension', tr("Kind")), | ||||
|     Column('dimensions', tr("Dimensions")), | ||||
|     Column('mtime', tr("Modification")), | ||||
|     Column('percentage', tr("Match %")), | ||||
|     Column('dupe_count', tr("Dupe Count")), | ||||
| ] | ||||
| 
 | ||||
| MATCHPERC_COL = 6 | ||||
| DUPECOUNT_COL = 7 | ||||
| DELTA_COLUMNS = {2, 4, 5} | ||||
| 
 | ||||
| METADATA_TO_READ = ['size', 'mtime', 'dimensions'] | ||||
| 
 | ||||
| def get_delta_dimensions(value, ref_value): | ||||
|     return (value[0]-ref_value[0], value[1]-ref_value[1]) | ||||
| 
 | ||||
| def GetDisplayInfo(dupe,group,delta=False): | ||||
|     if (dupe is None) or (group is None): | ||||
|         return ['---'] * len(COLUMNS) | ||||
|     size = dupe.size | ||||
|     mtime = dupe.mtime | ||||
|     dimensions = dupe.dimensions | ||||
|     m = group.get_match_of(dupe) | ||||
|     if m: | ||||
|         percentage = m.percentage | ||||
| @ -44,6 +49,7 @@ def GetDisplayInfo(dupe,group,delta=False): | ||||
|             r = group.ref | ||||
|             size -= r.size | ||||
|             mtime -= r.mtime | ||||
|             dimensions = get_delta_dimensions(dimensions, r.dimensions) | ||||
|     else: | ||||
|         percentage = group.percentage | ||||
|         dupe_count = len(group.dupes) | ||||
| @ -53,7 +59,7 @@ def GetDisplayInfo(dupe,group,delta=False): | ||||
|         format_path(dupe_path), | ||||
|         format_size(size, 0, 1, False), | ||||
|         dupe.extension, | ||||
|         format_dimensions(dupe.dimensions), | ||||
|         format_dimensions(dimensions), | ||||
|         format_timestamp(mtime, delta and m), | ||||
|         format_perc(percentage), | ||||
|         format_dupe_count(dupe_count) | ||||
| @ -65,9 +71,13 @@ def GetDupeSortKey(dupe, get_group, key, delta): | ||||
|         return m.percentage | ||||
|     if key == DUPECOUNT_COL: | ||||
|         return 0 | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key]['attr'], '')) | ||||
|     if delta and (key in {2, 5}): | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key]['attr'], '')) | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key].attr, '')) | ||||
|     if delta and (key in DELTA_COLUMNS): | ||||
|         ref_value = cmp_value(getattr(get_group().ref, COLUMNS[key].attr, '')) | ||||
|         if key == 4: # dimensions | ||||
|             r = get_delta_dimensions(r, ref_value) | ||||
|         else: | ||||
|             r -= ref_value | ||||
|     return r | ||||
| 
 | ||||
| def GetGroupSortKey(group, key): | ||||
| @ -75,5 +85,5 @@ def GetGroupSortKey(group, key): | ||||
|         return group.percentage | ||||
|     if key == DUPECOUNT_COL: | ||||
|         return len(group) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key]['attr'], '')) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key].attr, '')) | ||||
| 
 | ||||
|  | ||||
| @ -9,23 +9,24 @@ | ||||
| from hscommon.util import format_size | ||||
| from hscommon.trans import tr as trbase | ||||
| from core.data import (format_path, format_timestamp, format_words, format_perc,  | ||||
|     format_dupe_count, cmp_value) | ||||
|     format_dupe_count, cmp_value, Column) | ||||
| 
 | ||||
| tr = lambda s: trbase(s, 'columns') | ||||
| 
 | ||||
| COLUMNS = [ | ||||
|     {'attr':'name', 'display': tr("Filename")}, | ||||
|     {'attr':'path', 'display': tr("Folder")}, | ||||
|     {'attr':'size', 'display': tr("Size (KB)")}, | ||||
|     {'attr':'extension', 'display': tr("Kind")}, | ||||
|     {'attr':'mtime', 'display': tr("Modification")}, | ||||
|     {'attr':'percentage', 'display': tr("Match %")}, | ||||
|     {'attr':'words', 'display': tr("Words Used")}, | ||||
|     {'attr':'dupe_count', 'display': tr("Dupe Count")}, | ||||
|     Column('name', tr("Filename")), | ||||
|     Column('path', tr("Folder")), | ||||
|     Column('size', tr("Size (KB)")), | ||||
|     Column('extension', tr("Kind")), | ||||
|     Column('mtime', tr("Modification")), | ||||
|     Column('percentage', tr("Match %")), | ||||
|     Column('words', tr("Words Used")), | ||||
|     Column('dupe_count', tr("Dupe Count")), | ||||
| ] | ||||
| 
 | ||||
| MATCHPERC_COL = 5 | ||||
| DUPECOUNT_COL = 7 | ||||
| DELTA_COLUMNS = {2, 4} | ||||
| 
 | ||||
| METADATA_TO_READ = ['size', 'mtime'] | ||||
| 
 | ||||
| @ -60,9 +61,9 @@ def GetDupeSortKey(dupe, get_group, key, delta): | ||||
|         return m.percentage | ||||
|     if key == DUPECOUNT_COL: | ||||
|         return 0 | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key]['attr'], '')) | ||||
|     r = cmp_value(getattr(dupe, COLUMNS[key].attr, '')) | ||||
|     if delta and (key in {2, 4}): | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key]['attr'], '')) | ||||
|         r -= cmp_value(getattr(get_group().ref, COLUMNS[key].attr, '')) | ||||
|     return r | ||||
| 
 | ||||
| def GetGroupSortKey(group, key): | ||||
| @ -70,4 +71,4 @@ def GetGroupSortKey(group, key): | ||||
|         return group.percentage | ||||
|     if key == DUPECOUNT_COL: | ||||
|         return len(group) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key]['attr'], '')) | ||||
|     return cmp_value(getattr(group.ref, COLUMNS[key].attr, '')) | ||||
|  | ||||
| @ -41,7 +41,6 @@ JOBID2TITLE = { | ||||
| class DupeGuru(DupeGuruBase, QObject): | ||||
|     LOGO_NAME = '<replace this>' | ||||
|     NAME = '<replace this>' | ||||
|     DELTA_COLUMNS = frozenset() | ||||
|      | ||||
|     def __init__(self, data_module): | ||||
|         appdata = str(QDesktopServices.storageLocation(QDesktopServices.DataLocation)) | ||||
|  | ||||
| @ -137,7 +137,7 @@ class ResultWindow(QMainWindow): | ||||
|         menu = self.menuColumns | ||||
|         self._column_actions = [] | ||||
|         for index, column in enumerate(self.app.data.COLUMNS): | ||||
|             action = menu.addAction(column['display']) | ||||
|             action = menu.addAction(column.display) | ||||
|             action.setCheckable(True) | ||||
|             action.column_index = index | ||||
|             self._column_actions.append(action) | ||||
|  | ||||
| @ -18,7 +18,7 @@ class ResultsModel(Table): | ||||
|         model = ResultTableModel(self, app) | ||||
|         self._app = app | ||||
|         self._data = app.data | ||||
|         self._delta_columns = app.DELTA_COLUMNS | ||||
|         self._delta_columns = app.data.DELTA_COLUMNS | ||||
|         Table.__init__(self, model, view) | ||||
|         self.model.connect() | ||||
|      | ||||
| @ -63,7 +63,7 @@ class ResultsModel(Table): | ||||
|      | ||||
|     def headerData(self, section, orientation, role): | ||||
|         if orientation == Qt.Horizontal and role == Qt.DisplayRole and section < len(self._data.COLUMNS): | ||||
|             return self._data.COLUMNS[section]['display'] | ||||
|             return self._data.COLUMNS[section].display | ||||
|         return None | ||||
|      | ||||
|     def setData(self, index, value, role): | ||||
|  | ||||
| @ -17,7 +17,6 @@ class DupeGuru(DupeGuruBase): | ||||
|     EDITION = 'me' | ||||
|     LOGO_NAME = 'logo_me' | ||||
|     NAME = __appname__ | ||||
|     DELTA_COLUMNS = frozenset([2, 3, 4, 5, 7]) | ||||
|      | ||||
|     def __init__(self): | ||||
|         DupeGuruBase.__init__(self, data) | ||||
|  | ||||
| @ -59,7 +59,6 @@ class DupeGuru(DupeGuruBase): | ||||
|     EDITION = 'pe' | ||||
|     LOGO_NAME = 'logo_pe' | ||||
|     NAME = __appname__ | ||||
|     DELTA_COLUMNS = frozenset([2, 5]) | ||||
|      | ||||
|     def __init__(self): | ||||
|         DupeGuruBase.__init__(self, data_pe) | ||||
|  | ||||
| @ -27,7 +27,6 @@ class DupeGuru(DupeGuruBase): | ||||
|     EDITION = 'se' | ||||
|     LOGO_NAME = 'logo_se' | ||||
|     NAME = __appname__ | ||||
|     DELTA_COLUMNS = frozenset([2, 4]) | ||||
|      | ||||
|     def __init__(self): | ||||
|         DupeGuruBase.__init__(self, data) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user