88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
import threading
|
|
|
|
import sublime
|
|
import sublime_plugin
|
|
|
|
from ..show_error import show_error
|
|
from .existing_packages_command import ExistingPackagesCommand
|
|
from ..preferences_filename import preferences_filename
|
|
from ..thread_progress import ThreadProgress
|
|
|
|
|
|
class RemovePackageCommand(sublime_plugin.WindowCommand,
|
|
ExistingPackagesCommand):
|
|
"""
|
|
A command that presents a list of installed packages, allowing the user to
|
|
select one to remove
|
|
"""
|
|
|
|
def __init__(self, window):
|
|
"""
|
|
:param window:
|
|
An instance of :class:`sublime.Window` that represents the Sublime
|
|
Text window to show the list of installed packages in.
|
|
"""
|
|
|
|
self.window = window
|
|
ExistingPackagesCommand.__init__(self)
|
|
|
|
def run(self):
|
|
self.package_list = self.make_package_list('remove')
|
|
if not self.package_list:
|
|
show_error('There are no packages that can be removed.')
|
|
return
|
|
self.window.show_quick_panel(self.package_list, self.on_done)
|
|
|
|
def on_done(self, picked):
|
|
"""
|
|
Quick panel user selection handler - deletes the selected package
|
|
|
|
:param picked:
|
|
An integer of the 0-based package name index from the presented
|
|
list. -1 means the user cancelled.
|
|
"""
|
|
|
|
if picked == -1:
|
|
return
|
|
package = self.package_list[picked][0]
|
|
|
|
settings = sublime.load_settings(preferences_filename())
|
|
ignored = settings.get('ignored_packages')
|
|
if not ignored:
|
|
ignored = []
|
|
|
|
# Don't disable Package Control so it does not get stuck disabled
|
|
if package != 'Package Control':
|
|
if not package in ignored:
|
|
ignored.append(package)
|
|
settings.set('ignored_packages', ignored)
|
|
sublime.save_settings(preferences_filename())
|
|
ignored.remove(package)
|
|
|
|
thread = RemovePackageThread(self.manager, package,
|
|
ignored)
|
|
thread.start()
|
|
ThreadProgress(thread, 'Removing package %s' % package,
|
|
'Package %s successfully removed' % package)
|
|
|
|
|
|
class RemovePackageThread(threading.Thread):
|
|
"""
|
|
A thread to run the remove package operation in so that the Sublime Text
|
|
UI does not become frozen
|
|
"""
|
|
|
|
def __init__(self, manager, package, ignored):
|
|
self.manager = manager
|
|
self.package = package
|
|
self.ignored = ignored
|
|
threading.Thread.__init__(self)
|
|
|
|
def run(self):
|
|
self.result = self.manager.remove_package(self.package)
|
|
|
|
def unignore_package():
|
|
settings = sublime.load_settings(preferences_filename())
|
|
settings.set('ignored_packages', self.ignored)
|
|
sublime.save_settings(preferences_filename())
|
|
sublime.set_timeout(unignore_package, 10)
|