Skip to content
9 changes: 9 additions & 0 deletions st3/sublime_lib/settings_listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ class GlobalSettingsListener(BaseSettingsListener, sublime_plugin.EventListener)
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(sublime.load_settings(self.SETTINGS_NAME), *args, **kwargs)

def _on_settings_changed(self) -> None:
if self in sublime_plugin.all_callbacks['on_new']:
super()._on_settings_changed()
else:
self.__del__()

def on_new(self, view: sublime.View) -> None:
pass


class ViewSettingsListener(BaseSettingsListener, sublime_plugin.ViewEventListener):
def __init__(self, *args: Any, **kwargs: Any) -> None:
Expand Down
3 changes: 3 additions & 0 deletions stubs/sublime_plugin.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import sublime
from typing import Optional, Union, List, Dict, Tuple


all_callbacks: Dict[str, List['EventListener']]


class CommandInputHandler():
def name(self) -> str: ...
def next_input(self, args: dict) -> Optional[CommandInputHandler]: ...
Expand Down
18 changes: 11 additions & 7 deletions tests/settings_listener_package/settings_listener_plugin.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
from sublime_lib import ViewSettingsListener, GlobalSettingsListener, on_setting_changed
import sublime_lib
from sublime_lib import on_setting_changed, ResourcePath


__all__ = ['FooSettingListener', 'GlobalFooSettingListener']


class FooSettingListener(ViewSettingsListener):
PACKAGE_NAME = ResourcePath.from_file_path(__file__).package


class FooSettingListener(sublime_lib.ViewSettingsListener):
@on_setting_changed('foo')
def foo_changed(self, new_value: object, old_value: object):
changes = self.settings.get('changes', [])
self.settings.set('changes', changes + [[new_value, old_value]])
print('foo_changed', new_value, old_value, changes)


class GlobalFooSettingListener(GlobalSettingsListener):
SETTINGS_NAME = 'Baz.sublime-settings'
class GlobalFooSettingListener(sublime_lib.GlobalSettingsListener):
SETTINGS_NAME = PACKAGE_NAME + '.sublime-settings'

@on_setting_changed('foobar')
@on_setting_changed('foo')
def foo_changed(self, new_value: object, old_value: object):
print('foo_changed', new_value, old_value)
changes = self.settings.get('changes', [])
self.settings.set('changes', changes + [[new_value, old_value]])
41 changes: 41 additions & 0 deletions tests/test_settings_listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,48 @@ def test_view_listener(self):
self.view.settings().set('foo', 'A')
self.view.settings().set('foo', 'B')

self.temporary_package.destroy()
yield lambda: not self.temporary_package.exists()

self.view.settings().set('foo', 'C')

self.assertEqual(self.view.settings().get('changes'), [
['A', None],
['B', 'A'],
])


class TestGlobalSettingsListener(DeferrableTestCase):
def setUp(self):
name = 'TestGlobalSettingsListener:{}'.format(str(id(self)))
self.settings = sublime.load_settings(name + '.sublime-settings')
self.settings.set('changes', [])
self.settings.set('foo', None)
self.temporary_package = TemporaryPackage(
name,
ResourcePath("Packages/sublime_lib/tests/settings_listener_package")
)
self.temporary_package.create()
yield self.temporary_package.exists

def tearDown(self):
self.temporary_package.destroy()

def test_global_listener(self):
# pass
self.settings.set('foo', 'A')
self.settings.set('foo', 'B')

self.temporary_package.destroy()
yield lambda: not self.temporary_package.exists()
yield 100
import gc
gc.collect()
yield 100

self.settings.set('foo', 'C')

self.assertEqual(self.settings.get('changes'), [
['A', None],
['B', 'A'],
])