| 39 | | class FormView( AbstractView ): |
| 40 | | |
| 41 | | def __init__( self, title, admin, model, index ): |
| 42 | | AbstractView.__init__( self ) |
| 43 | | self.title_prefix = title |
| 44 | | self.admin = admin |
| 45 | | self.model = model |
| 46 | | self.index = index |
| 47 | | self.change_title(title) |
| 48 | | self.widget_mapper = QtGui.QDataWidgetMapper() |
| 49 | | self.widget_layout = QtGui.QHBoxLayout() |
| 50 | | self.widget_layout.setSpacing( 0 ) |
| 51 | | self.widget_layout.setMargin( 0 ) |
| 52 | | |
| 53 | | self.closeAfterValidation = QtCore.SIGNAL( 'closeAfterValidation()' ) |
| | 39 | class FormWidget( QtGui.QWidget ): |
| | 40 | |
| | 41 | changed_signal = QtCore.SIGNAL( 'changed()' ) |
| | 42 | |
| | 43 | def __init__(self, admin): |
| | 44 | QtGui.QWidget.__init__(self) |
| | 45 | self._admin = admin |
| | 46 | self._widget_mapper = QtGui.QDataWidgetMapper() |
| | 47 | self._widget_layout = QtGui.QHBoxLayout() |
| | 48 | self._widget_layout.setSpacing( 0 ) |
| | 49 | self._widget_layout.setMargin( 0 ) |
| | 50 | self._index = 0 |
| | 51 | self._model = None |
| | 52 | self._form = None |
| | 53 | self._columns = None |
| | 54 | self._delegate = None |
| | 55 | self.setLayout( self._widget_layout ) |
| | 56 | |
| | 57 | def set_model(self, model): |
| | 58 | self._model = model |
| 55 | | self.connect( self.model, QtCore.SIGNAL( sig ), self.dataChanged ) |
| 56 | | self.connect( self.model, QtCore.SIGNAL( 'layoutChanged()' ), self.layout_changed ) |
| 57 | | self.connect( self.model, self.model.item_delegate_changed_signal, self.item_delegate_changed ) |
| 58 | | |
| 59 | | self.widget_mapper.setModel( model ) |
| 60 | | self.setLayout( self.widget_layout ) |
| 61 | | |
| 62 | | if hasattr( admin, 'form_size' ) and admin.form_size: |
| 63 | | self.setMinimumSize( admin.form_size[0], admin.form_size[1] ) |
| 64 | | |
| 65 | | self.validator = admin.create_validator( model ) |
| 66 | | self.validate_before_close = True |
| 67 | | self.form = None |
| 68 | | self.columns = None |
| 69 | | self.delegate = None |
| 70 | | |
| 71 | | def getColumnsAndForm(): |
| 72 | | return ( self.model.getColumns(), self.admin.get_form_display() ) |
| 73 | | |
| 74 | | post( getColumnsAndForm, self.handleGetColumnsAndForm ) |
| 75 | | |
| 76 | | def getActions(): |
| 77 | | return admin.get_form_actions( None ) |
| 78 | | |
| 79 | | post( getActions, self.setActions ) |
| 80 | | self.update_title() |
| 81 | | |
| 82 | | def update_title( self ): |
| 83 | | |
| 84 | | def get_title(): |
| 85 | | obj = self.getEntity() |
| 86 | | return u'%s %s' % ( self.title_prefix, self.admin.get_verbose_identifier( obj ) ) |
| 87 | | |
| 88 | | post( get_title, self.change_title ) |
| 89 | | |
| 90 | | def dataChanged( self, index_from, index_to ): |
| | 60 | self.connect( self._model, QtCore.SIGNAL( sig ), self._data_changed ) |
| | 61 | self.connect( self._model, QtCore.SIGNAL( 'layoutChanged()' ), self._layout_changed ) |
| | 62 | self.connect( self._model, self._model.item_delegate_changed_signal, self._item_delegate_changed ) |
| | 63 | self._widget_mapper.setModel( model ) |
| | 64 | |
| | 65 | def get_columns_and_form(): |
| | 66 | return ( self._model.getColumns(), self._admin.get_form_display() ) |
| | 67 | |
| | 68 | post( get_columns_and_form, self._set_columns_and_form ) |
| | 69 | |
| | 70 | def clear_mapping(self): |
| | 71 | self._widget_mapper.clearMapping() |
| | 72 | |
| | 73 | def _data_changed( self, index_from, index_to ): |
| 92 | | self.widget_mapper.revert() |
| 93 | | self.update_title() |
| 94 | | |
| 95 | | def layout_changed(self): |
| 96 | | self.widget_mapper.revert() |
| 97 | | self.update_title() |
| 98 | | |
| 99 | | def handleGetColumnsAndForm( self, columns_and_form ): |
| 100 | | self.columns, self.form = columns_and_form |
| 101 | | self.setColumnsFormAndDelegate() |
| 102 | | |
| 103 | | def item_delegate_changed(self): |
| | 75 | self._widget_mapper.revert() |
| | 76 | self.emit(self.changed_signal) |
| | 77 | |
| | 78 | def _layout_changed(self): |
| | 79 | self._widget_mapper.revert() |
| | 80 | self.emit(self.changed_signal) |
| | 81 | |
| | 82 | def _item_delegate_changed(self): |
| 105 | | self.delegate = self.model.getItemDelegate() |
| 106 | | assert self.delegate |
| 107 | | assert isinstance(self.delegate, DelegateManager) |
| 108 | | self.setColumnsFormAndDelegate() |
| 109 | | |
| 110 | | def setColumnsFormAndDelegate( self ): |
| | 84 | self._delegate = self._model.getItemDelegate() |
| | 85 | assert self._delegate |
| | 86 | assert isinstance(self._delegate, DelegateManager) |
| | 87 | self._create_widgets() |
| | 88 | |
| | 89 | def set_index(self, index): |
| | 90 | self._index = index |
| | 91 | self._widget_mapper.setCurrentIndex( self._index ) |
| | 92 | |
| | 93 | def get_index(self): |
| | 94 | return self._widget_mapper.currentIndex() |
| | 95 | |
| | 96 | def submit(self): |
| | 97 | self._widget_mapper.submit() |
| | 98 | |
| | 99 | def to_first(self): |
| | 100 | self._widget_mapper.toFirst() |
| | 101 | |
| | 102 | def to_last(self): |
| | 103 | self._widget_mapper.toLast() |
| | 104 | |
| | 105 | def to_next(self): |
| | 106 | self._widget_mapper.toNext() |
| | 107 | |
| | 108 | def to_previous(self): |
| | 109 | self._widget_mapper.toPrevious() |
| | 110 | |
| | 111 | def _set_columns_and_form(self, columns_and_form ): |
| | 112 | self._columns, self._form = columns_and_form |
| | 113 | self._create_widgets() |
| | 114 | |
| | 115 | def _create_widgets( self ): |
| 159 | | self.widget_mapper.setCurrentIndex( self.index ) |
| 160 | | self.widget_layout.insertWidget( 0, self.form.render( widgets, self ) ) |
| 161 | | self.widget_layout.setContentsMargins( 7, 7, 7, 7 ) |
| | 164 | self._widget_mapper.setCurrentIndex( self._index ) |
| | 165 | self._widget_layout.insertWidget( 0, self._form.render( widgets, self ) ) |
| | 166 | self._widget_layout.setContentsMargins( 7, 7, 7, 7 ) |
| | 167 | |
| | 168 | class FormView( AbstractView ): |
| | 169 | """A FormView is the combination of a FormWidget, possible actions and menu items |
| | 170 | |
| | 171 | .. form_widget: The class to be used as a the form widget inside the form view |
| | 172 | |
| | 173 | """ |
| | 174 | |
| | 175 | form_widget = FormWidget |
| | 176 | |
| | 177 | def __init__( self, title, admin, model, index ): |
| | 178 | AbstractView.__init__( self ) |
| | 179 | layout = QtGui.QVBoxLayout() |
| | 180 | self._form = FormWidget(admin) |
| | 181 | self.model = model |
| | 182 | self.title_prefix = title |
| | 183 | self.admin = admin |
| | 184 | self.connect(self._form, FormWidget.changed_signal, self.update_title) |
| | 185 | self._form.set_model(model) |
| | 186 | self._form.set_index(index) |
| | 187 | layout.addWidget(self._form) |
| | 188 | self.change_title(title) |
| | 189 | self.closeAfterValidation = QtCore.SIGNAL( 'closeAfterValidation()' ) |
| | 190 | self.setLayout( layout ) |
| | 191 | |
| | 192 | if hasattr( admin, 'form_size' ) and admin.form_size: |
| | 193 | self.setMinimumSize( admin.form_size[0], admin.form_size[1] ) |
| | 194 | |
| | 195 | self.validator = admin.create_validator( model ) |
| | 196 | self.validate_before_close = True |
| | 197 | |
| | 198 | def getActions(): |
| | 199 | return admin.get_form_actions( None ) |
| | 200 | |
| | 201 | post( getActions, self.setActions ) |
| | 202 | self.update_title() |
| | 203 | |
| | 204 | def update_title( self ): |
| | 205 | |
| | 206 | def get_title(): |
| | 207 | obj = self.getEntity() |
| | 208 | return u'%s %s' % ( self.title_prefix, self.admin.get_verbose_identifier( obj ) ) |
| | 209 | |
| | 210 | post( get_title, self.change_title ) |