mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-03-10 05:34:36 +00:00
[#140 state:fixed] Fixed a crash on showing details panel in PE right after a mark-based removal (selection wasn't refreshed).
This commit is contained in:
parent
c524a85897
commit
084068852e
15
core/app.py
15
core/app.py
@ -98,12 +98,17 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
except EnvironmentError:
|
except EnvironmentError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _results_changed(self):
|
||||||
|
self.selected_dupes = [d for d in self.selected_dupes
|
||||||
|
if self.results.get_group_of_duplicate(d) is not None]
|
||||||
|
self.notify('results_changed')
|
||||||
|
|
||||||
def _job_completed(self, jobid):
|
def _job_completed(self, jobid):
|
||||||
# Must be called by subclasses when they detect that an async job is completed.
|
# Must be called by subclasses when they detect that an async job is completed.
|
||||||
if jobid == JOB_SCAN:
|
if jobid == JOB_SCAN:
|
||||||
self.notify('results_changed')
|
self._results_changed()
|
||||||
elif jobid in (JOB_LOAD, JOB_MOVE, JOB_DELETE):
|
elif jobid in (JOB_LOAD, JOB_MOVE, JOB_DELETE):
|
||||||
self.notify('results_changed')
|
self._results_changed()
|
||||||
self.notify('problems_changed')
|
self.notify('problems_changed')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -171,7 +176,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
filter = escape(filter, set('()[]\\.|+?^'))
|
filter = escape(filter, set('()[]\\.|+?^'))
|
||||||
filter = escape(filter, '*', '.')
|
filter = escape(filter, '*', '.')
|
||||||
self.results.apply_filter(filter)
|
self.results.apply_filter(filter)
|
||||||
self.notify('results_changed')
|
self._results_changed()
|
||||||
|
|
||||||
def clean_empty_dirs(self, path):
|
def clean_empty_dirs(self, path):
|
||||||
if self.options['clean_empty_dirs']:
|
if self.options['clean_empty_dirs']:
|
||||||
@ -316,7 +321,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
|
|
||||||
def remove_marked(self):
|
def remove_marked(self):
|
||||||
self.results.perform_on_marked(lambda x:None, True)
|
self.results.perform_on_marked(lambda x:None, True)
|
||||||
self.notify('results_changed')
|
self._results_changed()
|
||||||
|
|
||||||
def remove_selected(self):
|
def remove_selected(self):
|
||||||
self.remove_duplicates(self.selected_dupes)
|
self.remove_duplicates(self.selected_dupes)
|
||||||
@ -356,7 +361,7 @@ class DupeGuru(RegistrableApplication, Broadcaster):
|
|||||||
if not self.directories.has_any_file():
|
if not self.directories.has_any_file():
|
||||||
raise NoScannableFileError()
|
raise NoScannableFileError()
|
||||||
self.results.groups = []
|
self.results.groups = []
|
||||||
self.notify('results_changed')
|
self._results_changed()
|
||||||
self._start_job(JOB_SCAN, do)
|
self._start_job(JOB_SCAN, do)
|
||||||
|
|
||||||
def toggle_selected_mark_state(self):
|
def toggle_selected_mark_state(self):
|
||||||
|
@ -259,11 +259,14 @@ class Results(Markable):
|
|||||||
group = self.get_group_of_duplicate(dupe)
|
group = self.get_group_of_duplicate(dupe)
|
||||||
if dupe not in group.dupes:
|
if dupe not in group.dupes:
|
||||||
return
|
return
|
||||||
|
ref = group.ref
|
||||||
group.remove_dupe(dupe, False)
|
group.remove_dupe(dupe, False)
|
||||||
|
del self.__group_of_duplicate[dupe]
|
||||||
self._remove_mark_flag(dupe)
|
self._remove_mark_flag(dupe)
|
||||||
self.__total_count -= 1
|
self.__total_count -= 1
|
||||||
self.__total_size -= dupe.size
|
self.__total_size -= dupe.size
|
||||||
if not group:
|
if not group:
|
||||||
|
del self.__group_of_duplicate[ref]
|
||||||
self.__groups.remove(group)
|
self.__groups.remove(group)
|
||||||
if self.__filtered_groups:
|
if self.__filtered_groups:
|
||||||
self.__filtered_groups.remove(group)
|
self.__filtered_groups.remove(group)
|
||||||
|
@ -391,6 +391,16 @@ class TestCaseDupeGuruWithResults:
|
|||||||
app.start_scanning() # will be cancelled immediately
|
app.start_scanning() # will be cancelled immediately
|
||||||
eq_(len(self.rtable), 0)
|
eq_(len(self.rtable), 0)
|
||||||
|
|
||||||
|
def test_selected_dupes_after_removal(self, do_setup):
|
||||||
|
# Purge the app's `selected_dupes` attribute when removing dupes, or else it might cause a
|
||||||
|
# crash later with None refs.
|
||||||
|
app = self.app
|
||||||
|
app.results.mark_all()
|
||||||
|
self.rtable.select([0, 1, 2, 3, 4])
|
||||||
|
app.remove_marked()
|
||||||
|
eq_(len(self.rtable), 0)
|
||||||
|
eq_(app.selected_dupes, [])
|
||||||
|
|
||||||
class TestCaseDupeGuru_renameSelected:
|
class TestCaseDupeGuru_renameSelected:
|
||||||
def pytest_funcarg__do_setup(self, request):
|
def pytest_funcarg__do_setup(self, request):
|
||||||
tmpdir = request.getfuncargvalue('tmpdir')
|
tmpdir = request.getfuncargvalue('tmpdir')
|
||||||
|
@ -231,6 +231,15 @@ class TestCaseResultsWithSomeGroups:
|
|||||||
self.results.perform_on_marked(lambda x:None, True)
|
self.results.perform_on_marked(lambda x:None, True)
|
||||||
assert not self.results.is_modified
|
assert not self.results.is_modified
|
||||||
|
|
||||||
|
def test_group_of_duplicate_after_removal(self):
|
||||||
|
# removing a duplicate also removes it from the dupe:group map.
|
||||||
|
dupe = self.results.groups[1].dupes[0]
|
||||||
|
ref = self.results.groups[1].ref
|
||||||
|
self.results.remove_duplicates([dupe])
|
||||||
|
assert self.results.get_group_of_duplicate(dupe) is None
|
||||||
|
# also remove group ref
|
||||||
|
assert self.results.get_group_of_duplicate(ref) is None
|
||||||
|
|
||||||
|
|
||||||
class TestCaseResultsWithSavedResults:
|
class TestCaseResultsWithSavedResults:
|
||||||
def setup_method(self, method):
|
def setup_method(self, method):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user