mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-05-08 09:49:51 +00:00
[#139 state:fixed] Make "mark selected" behave in a more standard way.
This commit is contained in:
parent
01731a8277
commit
48e2acf0a2
13
core/app.py
13
core/app.py
@ -20,7 +20,7 @@ from hscommon.reg import RegistrableApplication
|
|||||||
from hscommon.notify import Broadcaster
|
from hscommon.notify import Broadcaster
|
||||||
from hscommon.path import Path
|
from hscommon.path import Path
|
||||||
from hscommon.conflict import smart_move, smart_copy
|
from hscommon.conflict import smart_move, smart_copy
|
||||||
from hscommon.util import delete_if_empty, first, escape, nonone, format_time_decimal
|
from hscommon.util import delete_if_empty, first, escape, nonone, format_time_decimal, allsame
|
||||||
from hscommon.trans import tr, trmsg
|
from hscommon.trans import tr, trmsg
|
||||||
|
|
||||||
from . import directories, results, scanner, export, fs
|
from . import directories, results, scanner, export, fs
|
||||||
@ -422,8 +422,15 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
self.view.start_job(JobType.Scan, do)
|
self.view.start_job(JobType.Scan, do)
|
||||||
|
|
||||||
def toggle_selected_mark_state(self):
|
def toggle_selected_mark_state(self):
|
||||||
for dupe in self.selected_dupes:
|
selected = self.without_ref(self.selected_dupes)
|
||||||
self.results.mark_toggle(dupe)
|
if not selected:
|
||||||
|
return
|
||||||
|
if allsame(self.results.is_marked(d) for d in selected):
|
||||||
|
markfunc = self.results.mark_toggle
|
||||||
|
else:
|
||||||
|
markfunc = self.results.mark
|
||||||
|
for dupe in selected:
|
||||||
|
markfunc(dupe)
|
||||||
self.notify('marking_changed')
|
self.notify('marking_changed')
|
||||||
|
|
||||||
def without_ref(self, dupes):
|
def without_ref(self, dupes):
|
||||||
|
@ -11,13 +11,6 @@ class Markable:
|
|||||||
self.__marked = set()
|
self.__marked = set()
|
||||||
self.__inverted = False
|
self.__inverted = False
|
||||||
|
|
||||||
#---Private
|
|
||||||
def __get_mark_count(self):
|
|
||||||
if self.__inverted:
|
|
||||||
return self._get_markable_count() - len(self.__marked)
|
|
||||||
else:
|
|
||||||
return len(self.__marked)
|
|
||||||
|
|
||||||
#---Virtual
|
#---Virtual
|
||||||
#About did_mark and did_unmark: They only happen what an object is actually added/removed
|
#About did_mark and did_unmark: They only happen what an object is actually added/removed
|
||||||
# in self.__marked, and is not affected by __inverted. Thus, self.mark while __inverted
|
# in self.__marked, and is not affected by __inverted. Thus, self.mark while __inverted
|
||||||
@ -87,8 +80,17 @@ class Markable:
|
|||||||
return False
|
return False
|
||||||
return self.mark_toggle(o)
|
return self.mark_toggle(o)
|
||||||
|
|
||||||
mark_count = property(__get_mark_count)
|
#--- Properties
|
||||||
mark_inverted = property(lambda self :self.__inverted)
|
@property
|
||||||
|
def mark_count(self):
|
||||||
|
if self.__inverted:
|
||||||
|
return self._get_markable_count() - len(self.__marked)
|
||||||
|
else:
|
||||||
|
return len(self.__marked)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mark_inverted(self):
|
||||||
|
return self.__inverted
|
||||||
|
|
||||||
class MarkableList(list, Markable):
|
class MarkableList(list, Markable):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -267,7 +267,7 @@ class TestCaseDupeGuruWithResults:
|
|||||||
assert app.selected_dupes[1] is objects[2]
|
assert app.selected_dupes[1] is objects[2]
|
||||||
assert app.selected_dupes[2] is objects[1]
|
assert app.selected_dupes[2] is objects[1]
|
||||||
|
|
||||||
def test_toggleSelectedMark(self, do_setup):
|
def test_toggle_selected_mark_state(self, do_setup):
|
||||||
app = self.app
|
app = self.app
|
||||||
objects = self.objects
|
objects = self.objects
|
||||||
app.toggle_selected_mark_state()
|
app.toggle_selected_mark_state()
|
||||||
@ -281,6 +281,21 @@ class TestCaseDupeGuruWithResults:
|
|||||||
assert not app.results.is_marked(objects[3])
|
assert not app.results.is_marked(objects[3])
|
||||||
assert app.results.is_marked(objects[4])
|
assert app.results.is_marked(objects[4])
|
||||||
|
|
||||||
|
def test_toggle_selected_mark_state_with_different_selected_state(self, do_setup):
|
||||||
|
# When marking selected dupes with a heterogenous selection, mark all selected dupes. When
|
||||||
|
# it's homogenous, simply toggle.
|
||||||
|
app = self.app
|
||||||
|
objects = self.objects
|
||||||
|
self.rtable.select([1])
|
||||||
|
app.toggle_selected_mark_state()
|
||||||
|
# index 0 is unmarkable, but we throw it in the bunch to be sure that it doesn't make the
|
||||||
|
# selection heterogenoug when it shouldn't.
|
||||||
|
self.rtable.select([0, 1, 4])
|
||||||
|
app.toggle_selected_mark_state()
|
||||||
|
eq_(app.results.mark_count, 2)
|
||||||
|
app.toggle_selected_mark_state()
|
||||||
|
eq_(app.results.mark_count, 0)
|
||||||
|
|
||||||
def test_refreshDetailsWithSelected(self, do_setup):
|
def test_refreshDetailsWithSelected(self, do_setup):
|
||||||
self.rtable.select([1, 4])
|
self.rtable.select([1, 4])
|
||||||
eq_(self.dpanel.row(0), ('Filename', 'bar bleh', 'foo bar'))
|
eq_(self.dpanel.row(0), ('Filename', 'bar bleh', 'foo bar'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user