2 from PyQt4
.QtCore
import QObject
3 from PyQt4
.QtCore
import SIGNAL
4 from PyQt4
.QtGui
import QSpinBox
5 from PyQt4
.QtGui
import QPixmap
6 from PyQt4
.QtGui
import QTextEdit
7 from PyQt4
.QtGui
import QLineEdit
8 from PyQt4
.QtGui
import QListWidget
10 from observer
import Observer
12 class QObserver(Observer
, QObject
):
14 def __init__(self
, model
, view
):
15 Observer
.__init
__(self
, model
)
16 QObject
.__init
__(self
)
22 self
.__model
_to
_view
= {}
23 self
.__view
_to
_model
= {}
25 def connect(self
, obj
, signal_str
, *args
):
26 '''Convenience function so that subclasses do not have
27 to import QtCore.SIGNAL.'''
29 if type(signal
) is str:
30 signal
= SIGNAL(signal
)
31 return QObject
.connect(obj
, signal
, *args
)
33 def SLOT(self
, *args
):
34 '''Default slot to handle all Qt callbacks.
35 This method delegates to callbacks from add_signals.'''
37 widget
= self
.sender()
38 sender
= str(widget
.objectName())
40 if sender
in self
.__callbacks
:
41 self
.__callbacks
[sender
](*args
)
43 elif sender
in self
.__view
_to
_model
:
45 model_param
= self
.__view
_to
_model
[sender
]
46 if isinstance(widget
, QTextEdit
):
47 value
= str(widget
.toPlainText())
48 model
.set_param(model_param
, value
, notify
=False)
49 elif isinstance(widget
, QLineEdit
):
50 value
= str(widget
.text())
51 model
.set_param(model_param
, value
, notify
=False)
53 print("SLOT(): Unknown widget:", sender
, widget
)
55 def add_signals(self
, signal_str
, *objects
):
56 '''Connects object's signal to the QObserver.'''
58 self
.connect(obj
, signal_str
, self
.SLOT
)
60 def add_callbacks(self
, **callbacks
):
61 '''Registers callbacks that are called in response to GUI events.'''
62 for sender
, callback
in callbacks
.iteritems():
63 self
.__callbacks
[sender
] = callback
65 def model_to_view(self
, model_param
, *widget_names
):
66 '''Binds model params to qt widgets(model->view)'''
67 self
.__model
_to
_view
[model_param
] = widget_names
68 for widget_name
in widget_names
:
69 self
.__view
_to
_model
[widget_name
] = model_param
71 def add_actions(self
, model_param
, callback
):
72 '''Register view actions that are called in response to
73 view changes.(view->model)'''
74 self
.__actions
[model_param
] = callback
76 def subject_changed(self
, param
, value
):
77 '''Sends a model param to the view(model->view)'''
78 if param
in self
.__model
_to
_view
:
79 for widget_name
in self
.__model
_to
_view
[param
]:
80 widget
= getattr(self
.view
, widget_name
)
81 if isinstance(widget
, QSpinBox
):
82 widget
.setValue(value
)
83 elif isinstance(widget
, QPixmap
):
85 elif isinstance(widget
, QTextEdit
):
87 elif isinstance(widget
, QLineEdit
):
89 elif isinstance(widget
, QListWidget
):
91 for i
in value
: widget
.addItem(i
)
93 print('subject_changed(): '
97 if param
not in self
.__actions
:
100 if param
in self
.__model
_to
_view
:
101 for widget_name
in self
.__model
_to
_view
[param
]:
102 widget
= getattr(self
.view
, widget_name
)
103 widgets
.append(widget
)
104 # Call the model callback w/ the view's widgets as the args
105 self
.__actions
[param
](*widgets
)
107 def update_view(self
):
108 for param
in self
.model
.get_param_names():
109 import pprint
; pprint
.pprint(self
.__model
_to
_view
)
110 if param
in self
.__model
_to
_view
[param
]:
111 self
.model
.notify_observers(param
)