mirror of
https://github.com/arsenetar/dupeguru.git
synced 2024-11-10 17:59:02 +00:00
59 lines
2.3 KiB
Python
59 lines
2.3 KiB
Python
# Created By: Virgil Dupras
|
|
# Created On: 2011/09/09
|
|
# Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
|
|
#
|
|
# This software is licensed under the "BSD" 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/bsd_license
|
|
|
|
def noop(*args, **kwargs):
|
|
pass
|
|
|
|
class NoopGUI:
|
|
def __getattr__(self, func_name):
|
|
return noop
|
|
|
|
# A GUIObject is a cross-toolkit "model" representation of a GUI layer object, for example, a table.
|
|
# It acts as a cross-toolkit interface to multiple what we call here a "view". That view is a
|
|
# toolkit-specific controller to the actual view (an NSTableView, a QTableView, etc.).
|
|
# In our GUIObject, we need a reference to that toolkit-specific controller because some actions,
|
|
# have effects on it (for example, prompting it to refresh its data). The GUIObject is typically
|
|
# instantiated before its "view", that is why we set it as None on init. However, the GUI
|
|
# layer is supposed to set the view as soon as its toolkit-specific controller is instantiated.
|
|
|
|
# When you subclass GUIObject, you will likely want to update its view on instantiation. That
|
|
# is why we call self.view.refresh() in _view_updated(). If you need another type of action on
|
|
# view instantiation, just override the method.
|
|
class GUIObject:
|
|
def __init__(self):
|
|
self._view = None
|
|
|
|
def _view_updated(self):
|
|
pass #virtual
|
|
|
|
def has_view(self):
|
|
return (self._view is not None) and (not isinstance(self._view, NoopGUI))
|
|
|
|
@property
|
|
def view(self):
|
|
return self._view
|
|
|
|
@view.setter
|
|
def view(self, value):
|
|
# There's two times at which we set the view property: On initialization, where we set the
|
|
# view that we'll use for your lifetime, and just before the view is deallocated. We need
|
|
# to unset our view at that time to avoid calls to a deallocated instance (which means a
|
|
# crash).
|
|
if self._view is None:
|
|
# Initial view assignment
|
|
if value is None:
|
|
return
|
|
self._view = value
|
|
self._view_updated()
|
|
else:
|
|
assert value is None
|
|
# Instead of None, we put a NoopGUI() there to avoid rogue view callback raising an
|
|
# exception.
|
|
self._view = NoopGUI()
|
|
|