A few more i18n fixes
[ugit.git] / ugitlibs / qobserver.py
blobbd0062edecfdd6bdc0f7c27cb71e5f365a0686b0
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_attr = self.__view_to_model[sender]
46 if isinstance(widget, QTextEdit):
47 value = str(widget.toPlainText())
48 model.set(model_attr, value, notify=False)
49 elif isinstance(widget, QLineEdit):
50 value = str(widget.text())
51 model.set(model_attr, 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_attr, *widget_names):
66 '''Binds model attributes to qt widgets(model->view)'''
67 self.add_subject(model_attr)
68 self.__model_to_view[model_attr] = widget_names
69 for widget_name in widget_names:
70 self.__view_to_model[widget_name] = model_attr
72 def add_actions(self, model_attr, callback):
73 '''Register view actions that are called in response to
74 view changes.(view->model)'''
75 self.add_subject(model_attr)
76 self.__actions[model_attr] = callback
78 def subject_changed(self, attr, value):
79 '''Sends a model attribute to the view(model->view)'''
80 if attr in self.__model_to_view:
81 for widget_name in self.__model_to_view[attr]:
82 widget = getattr(self.view, widget_name)
83 if isinstance(widget, QSpinBox):
84 widget.setValue(value)
85 elif isinstance(widget, QPixmap):
86 widget.load(value)
87 elif isinstance(widget, QTextEdit):
88 widget.setText(value)
89 elif isinstance(widget, QLineEdit):
90 widget.setText(value)
91 elif isinstance(widget, QListWidget):
92 widget.clear()
93 for i in value: widget.addItem(i)
94 else:
95 print('subject_changed(): '
96 + 'Unknown widget:',
97 widget_name, widget)
99 if attr not in self.__actions:
100 return
101 widgets = []
102 if attr in self.__model_to_view:
103 for widget_name in self.__model_to_view[attr]:
104 widget = getattr(self.view, widget_name)
105 widgets.append(widget)
106 # Call the model callback w/ the view's widgets as the args
107 self.__actions[attr](*widgets)