Model improvements for config load/save
[ugit.git] / ugitlibs / qobserver.py
blob6c52b958dfa71e20a606465b48fa0dd0b8e7716d
1 #!/usr/bin/env python
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)
18 self.view = view
20 self.__actions = {}
21 self.__callbacks = {}
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.'''
28 signal = signal_str
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:
44 model = self.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)
52 else:
53 print("SLOT(): Unknown widget:", sender, widget)
55 def add_signals(self, signal_str, *objects):
56 '''Connects object's signal to the QObserver.'''
57 for obj in objects:
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):
84 widget.load(value)
85 elif isinstance(widget, QTextEdit):
86 widget.setText(value)
87 elif isinstance(widget, QLineEdit):
88 widget.setText(value)
89 elif isinstance(widget, QListWidget):
90 widget.clear()
91 for i in value: widget.addItem(i)
92 else:
93 print('subject_changed(): '
94 + 'Unknown widget:',
95 widget_name, widget)
97 if param not in self.__actions:
98 return
99 widgets = []
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)