2009-08-05 08:59:46 +00:00
|
|
|
# Created By: Virgil Dupras
|
|
|
|
# Created On: 2006/11/11
|
2010-01-01 20:11:34 +00:00
|
|
|
# Copyright 2010 Hardcoded Software (http://www.hardcoded.net)
|
2009-08-05 08:59:46 +00:00
|
|
|
#
|
|
|
|
# This software is licensed under the "HS" License as described in the "LICENSE" file,
|
|
|
|
# which should be included with this package. The terms are also available at
|
|
|
|
# http://www.hardcoded.net/licenses/hs_license
|
|
|
|
|
2009-06-01 09:55:11 +00:00
|
|
|
import logging
|
|
|
|
import os.path as op
|
|
|
|
|
2010-01-18 07:48:44 +00:00
|
|
|
from hsutil import cocoa, job
|
2009-06-16 09:04:41 +00:00
|
|
|
from hsutil.cocoa import install_exception_hook
|
2010-02-04 16:12:58 +00:00
|
|
|
from hsutil.cocoa.objcmin import (NSNotificationCenter, NSUserDefaults,
|
|
|
|
NSSearchPathForDirectoriesInDomains, NSApplicationSupportDirectory, NSUserDomainMask,
|
|
|
|
NSWorkspace, NSWorkspaceRecycleOperation)
|
2009-06-01 09:55:11 +00:00
|
|
|
from hsutil.reg import RegistrationRequired
|
|
|
|
|
2009-10-23 12:56:52 +00:00
|
|
|
from . import app, fs
|
2009-06-01 09:55:11 +00:00
|
|
|
|
|
|
|
JOBID2TITLE = {
|
|
|
|
app.JOB_SCAN: "Scanning for duplicates",
|
|
|
|
app.JOB_LOAD: "Loading",
|
|
|
|
app.JOB_MOVE: "Moving",
|
|
|
|
app.JOB_COPY: "Copying",
|
|
|
|
app.JOB_DELETE: "Sending to Trash",
|
|
|
|
}
|
|
|
|
|
|
|
|
def demo_method(method):
|
|
|
|
def wrapper(self, *args, **kwargs):
|
|
|
|
try:
|
|
|
|
return method(self, *args, **kwargs)
|
|
|
|
except RegistrationRequired:
|
|
|
|
NSNotificationCenter.defaultCenter().postNotificationName_object_('RegistrationRequired', self)
|
|
|
|
|
|
|
|
return wrapper
|
|
|
|
|
2010-02-05 20:09:04 +00:00
|
|
|
class DupeGuru(app.DupeGuru):
|
2009-06-01 09:55:11 +00:00
|
|
|
def __init__(self, data_module, appdata_subdir, appid):
|
|
|
|
LOGGING_LEVEL = logging.DEBUG if NSUserDefaults.standardUserDefaults().boolForKey_('debug') else logging.WARNING
|
|
|
|
logging.basicConfig(level=LOGGING_LEVEL, format='%(levelname)s %(message)s')
|
|
|
|
logging.debug('started in debug mode')
|
|
|
|
install_exception_hook()
|
2009-09-29 14:07:50 +00:00
|
|
|
appsupport = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, True)[0]
|
|
|
|
appdata = op.join(appsupport, appdata_subdir)
|
2009-06-01 09:55:11 +00:00
|
|
|
app.DupeGuru.__init__(self, data_module, appdata, appid)
|
|
|
|
self.progress = cocoa.ThreadedJobPerformer()
|
|
|
|
|
|
|
|
#--- Override
|
2010-02-06 11:36:43 +00:00
|
|
|
@staticmethod
|
|
|
|
def _open_path(path):
|
|
|
|
NSWorkspace.sharedWorkspace().openFile_(unicode(path))
|
|
|
|
|
2009-06-01 09:55:11 +00:00
|
|
|
@staticmethod
|
|
|
|
def _recycle_dupe(dupe):
|
2010-01-18 07:48:44 +00:00
|
|
|
# local import because first appkit import takes a lot of memory. we want to avoid it.
|
2009-10-30 16:24:34 +00:00
|
|
|
directory = unicode(dupe.path[:-1])
|
2009-06-01 09:55:11 +00:00
|
|
|
filename = dupe.name
|
2010-02-04 16:12:58 +00:00
|
|
|
result, tag = NSWorkspace.sharedWorkspace().performFileOperation_source_destination_files_tag_(
|
|
|
|
NSWorkspaceRecycleOperation, directory, '', [filename], None)
|
2009-06-01 09:55:11 +00:00
|
|
|
|
2010-02-06 14:31:35 +00:00
|
|
|
@staticmethod
|
|
|
|
def _reveal_path(path):
|
|
|
|
NSWorkspace.sharedWorkspace().selectFile_inFileViewerRootedAtPath_(unicode(path), '')
|
|
|
|
|
2009-06-01 09:55:11 +00:00
|
|
|
def _start_job(self, jobid, func):
|
|
|
|
try:
|
|
|
|
j = self.progress.create_job()
|
|
|
|
self.progress.run_threaded(func, args=(j, ))
|
|
|
|
except job.JobInProgressError:
|
|
|
|
NSNotificationCenter.defaultCenter().postNotificationName_object_('JobInProgress', self)
|
|
|
|
else:
|
|
|
|
ud = {'desc': JOBID2TITLE[jobid], 'jobid':jobid}
|
|
|
|
NSNotificationCenter.defaultCenter().postNotificationName_object_userInfo_('JobStarted', self, ud)
|
|
|
|
|
|
|
|
#---Public
|
|
|
|
copy_or_move_marked = demo_method(app.DupeGuru.copy_or_move_marked)
|
|
|
|
delete_marked = demo_method(app.DupeGuru.delete_marked)
|
|
|
|
|
|
|
|
def start_scanning(self):
|
2010-02-05 19:32:57 +00:00
|
|
|
self._select_dupes([])
|
2009-06-01 09:55:11 +00:00
|
|
|
try:
|
|
|
|
app.DupeGuru.start_scanning(self)
|
|
|
|
return 0
|
|
|
|
except app.NoScannableFileError:
|
|
|
|
return 3
|
|
|
|
except app.AllFilesAreRefError:
|
|
|
|
return 1
|
|
|
|
|