BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
ModelView::ViewModelController Class Reference

Propagates changes from SessionModel to its ViewModelBase. More...

Inheritance diagram for ModelView::ViewModelController:
[legend]
Collaboration diagram for ModelView::ViewModelController:
[legend]

Classes

struct  ViewModelControllerImpl
 

Public Member Functions

 ViewModelController (SessionModel *session_model, ViewModelBase *view_model=nullptr)
 
 ~ViewModelController ()
 
std::vector< ViewItem * > findViews (const ModelView::SessionItem *item) const
 Returns all ViewItem's displaying given SessionItem. More...
 
QStringList horizontalHeaderLabels () const
 
SessionModelmodel () const
 
SessionItemrootSessionItem () const
 
SessionModelsessionModel () const
 Returns SessionModel handled by this controller. More...
 
void setChildrenStrategy (std::unique_ptr< ChildrenStrategyInterface > children_strategy)
 
void setOnAboutToRemoveItem (Callbacks::item_tagrow_t f, Callbacks::slot_t client={}) override
 Sets callback to be notified when the item is about to be removed. More...
 
void setOnDataChange (Callbacks::item_int_t f, Callbacks::slot_t client={}) override
 Sets callback to be notified on item's data change. More...
 
void setOnItemInserted (Callbacks::item_tagrow_t f, Callbacks::slot_t client={}) override
 Sets callback to be notified on item insert. More...
 
void setOnItemRemoved (Callbacks::item_tagrow_t f, Callbacks::slot_t client={}) override
 Sets callback to be notified on item remove. More...
 
void setOnModelAboutToBeReset (Callbacks::model_t f, Callbacks::slot_t client={}) override
 Sets the callback to be notified before model's full reset (root item recreated). More...
 
void setOnModelDestroyed (Callbacks::model_t f, Callbacks::slot_t client={}) override
 Sets the callback for notifications on model destruction. More...
 
void setOnModelReset (Callbacks::model_t f, Callbacks::slot_t client={}) override
 Sets the callback to be notified after model was fully reset (root item recreated). More...
 
void setRootSessionItem (SessionItem *item)
 
void setRowStrategy (std::unique_ptr< RowStrategyInterface > row_strategy)
 
void setViewModel (ViewModelBase *view_model)
 
void unsubscribe (Callbacks::slot_t client={}) override
 Removes given client from all subscriptions. More...
 

Protected Member Functions

virtual void onAboutToRemoveItem (SessionItem *parent, TagRow tagrow)
 
virtual void onDataChange (SessionItem *item, int role)
 
virtual void onItemInserted (SessionItem *parent, TagRow tagrow)
 
virtual void onItemRemoved (SessionItem *parent, TagRow tagrow)
 
void update_branch (const SessionItem *item)
 

Protected Attributes

SessionModelm_model {nullptr}
 

Private Attributes

std::unique_ptr< ViewModelControllerImplp_impl
 

Detailed Description

Propagates changes from SessionModel to its ViewModelBase.

Definition at line 38 of file viewmodelcontroller.h.

Constructor & Destructor Documentation

◆ ViewModelController()

ViewModelController::ViewModelController ( SessionModel session_model,
ViewModelBase view_model = nullptr 
)

Definition at line 168 of file viewmodelcontroller.cpp.

169  : ModelListener(session_model)
170  , p_impl(std::make_unique<ViewModelControllerImpl>(this, view_model))
171 {
172  auto on_data_change = [this](SessionItem* item, int role) { onDataChange(item, role); };
173  setOnDataChange(on_data_change);
174 
175  auto on_item_inserted = [this](SessionItem* item, TagRow tagrow) {
176  onItemInserted(item, std::move(tagrow));
177  };
178  setOnItemInserted(on_item_inserted);
179 
180  auto on_item_removed = [this](SessionItem* item, TagRow tagrow) {
181  onItemRemoved(item, std::move(tagrow));
182  };
183  setOnItemRemoved(on_item_removed);
184 
185  auto on_about_to_remove = [this](SessionItem* item, TagRow tagrow) {
186  onAboutToRemoveItem(item, std::move(tagrow));
187  };
188  setOnAboutToRemoveItem(on_about_to_remove);
189 
190  auto on_model_destroyed = [this](auto) {
191  p_impl->m_viewModel->setRootViewItem(std::make_unique<RootViewItem>(nullptr));
192  };
193  setOnModelDestroyed(on_model_destroyed);
194 
195  auto on_model_reset = [this](auto) {
196  auto root_item = Utils::ItemFromPath(*model(), p_impl->m_rootItemPath);
197  p_impl->setRootSessionItemIntern(root_item ? root_item : model()->rootItem());
198  p_impl->m_viewModel->endResetModel();
199  };
200  setOnModelReset(on_model_reset);
201 
202  auto on_model_about_to_be_reset = [this](auto) { p_impl->m_viewModel->beginResetModel(); };
203  setOnModelAboutToBeReset(on_model_about_to_be_reset);
204 }
void setOnItemRemoved(Callbacks::item_tagrow_t f, Callbacks::slot_t client={}) override
Sets callback to be notified on item remove.
void setOnItemInserted(Callbacks::item_tagrow_t f, Callbacks::slot_t client={}) override
Sets callback to be notified on item insert.
void setOnModelDestroyed(Callbacks::model_t f, Callbacks::slot_t client={}) override
Sets the callback for notifications on model destruction.
void setOnAboutToRemoveItem(Callbacks::item_tagrow_t f, Callbacks::slot_t client={}) override
Sets callback to be notified when the item is about to be removed.
void setOnModelAboutToBeReset(Callbacks::model_t f, Callbacks::slot_t client={}) override
Sets the callback to be notified before model's full reset (root item recreated).
void setOnDataChange(Callbacks::item_int_t f, Callbacks::slot_t client={}) override
Sets callback to be notified on item's data change.
void setOnModelReset(Callbacks::model_t f, Callbacks::slot_t client={}) override
Sets the callback to be notified after model was fully reset (root item recreated).
ModelListener(SessionModel *session_model)
Definition: modellistener.h:28
The main object representing an editable/displayable/serializable entity.
Definition: sessionitem.h:38
Aggregate to hold (tag, row) information for SessionModel.
Definition: tagrow.h:25
std::unique_ptr< ViewModelControllerImpl > p_impl
virtual void onAboutToRemoveItem(SessionItem *parent, TagRow tagrow)
virtual void onItemRemoved(SessionItem *parent, TagRow tagrow)
virtual void onDataChange(SessionItem *item, int role)
virtual void onItemInserted(SessionItem *parent, TagRow tagrow)
MVVM_MODEL_EXPORT SessionItem * ItemFromPath(const SessionModel &moodel, const Path &path)
Returns item found in the model following given Path.
Definition: modelutils.cpp:36

References ModelView::Utils::ItemFromPath(), ModelView::ModelListener< SessionModel >::model(), onAboutToRemoveItem(), onDataChange(), onItemInserted(), onItemRemoved(), p_impl, ModelView::ModelListenerBase::setOnAboutToRemoveItem(), ModelView::ModelListenerBase::setOnDataChange(), ModelView::ModelListenerBase::setOnItemInserted(), ModelView::ModelListenerBase::setOnItemRemoved(), ModelView::ModelListenerBase::setOnModelAboutToBeReset(), ModelView::ModelListenerBase::setOnModelDestroyed(), and ModelView::ModelListenerBase::setOnModelReset().

Here is the call graph for this function:

◆ ~ViewModelController()

ViewModelController::~ViewModelController ( )
default

Member Function Documentation

◆ findViews()

std::vector< ViewItem * > ViewModelController::findViews ( const ModelView::SessionItem item) const

Returns all ViewItem's displaying given SessionItem.

Definition at line 253 of file viewmodelcontroller.cpp.

254 {
255  return p_impl->findViews(item);
256 }

References p_impl.

Referenced by onDataChange(), and update_branch().

◆ horizontalHeaderLabels()

QStringList ViewModelController::horizontalHeaderLabels ( ) const

Definition at line 258 of file viewmodelcontroller.cpp.

259 {
260  return p_impl->m_rowStrategy->horizontalHeaderLabels();
261 }

References p_impl.

◆ model()

SessionModel * ModelView::ModelListener< SessionModel >::model ( ) const
inlineinherited

Definition at line 30 of file modellistener.h.

30 { return static_cast<T*>(m_model); }

◆ onAboutToRemoveItem()

void ViewModelController::onAboutToRemoveItem ( SessionItem parent,
TagRow  tagrow 
)
protectedvirtual

Definition at line 281 of file viewmodelcontroller.cpp.

282 {
283  auto item_to_remove = parent->getItem(tagrow.tag, tagrow.row);
284  if (item_to_remove == rootSessionItem()
285  || Utils::IsItemAncestor(rootSessionItem(), item_to_remove)) {
286  // special case when user removes SessionItem which is one of ancestors of our root item
287  // or root item iteslf
288  p_impl->m_viewModel->beginResetModel();
289  p_impl->m_viewModel->setRootViewItem(std::make_unique<RootViewItem>(nullptr));
290  p_impl->m_itemToVview.clear();
291  p_impl->m_rootItemPath = {};
292  p_impl->m_viewModel->endResetModel();
293  } else {
294  p_impl->remove_row_of_views(item_to_remove);
295  }
296 }
SessionItem * getItem(const std::string &tag, int row=0) const
Returns item at given row of given tag.
std::string tag
Definition: tagrow.h:27
MVVM_MODEL_EXPORT bool IsItemAncestor(const SessionItem *item, const SessionItem *candidate)
Returns true if 'candidate' is one of ancestor of given item.
Definition: itemutils.cpp:156

References ModelView::SessionItem::getItem(), ModelView::Utils::IsItemAncestor(), p_impl, rootSessionItem(), ModelView::TagRow::row, and ModelView::TagRow::tag.

Referenced by ViewModelController().

Here is the call graph for this function:

◆ onDataChange()

void ViewModelController::onDataChange ( SessionItem item,
int  role 
)
protectedvirtual

Reimplemented in ModelView::PropertyFlatViewModelController, and ModelView::PropertyViewModelController.

Definition at line 263 of file viewmodelcontroller.cpp.

264 {
265  for (auto view : findViews(item)) {
266  // inform corresponding LabelView and DataView
267  if (isValidItemRole(view, role)) {
268  auto index = p_impl->m_viewModel->indexFromItem(view);
269  p_impl->m_viewModel->dataChanged(index, index, Utils::ItemRoleToQtRole(role));
270  }
271  }
272 }
std::vector< ViewItem * > findViews(const ModelView::SessionItem *item) const
Returns all ViewItem's displaying given SessionItem.
MVVM_VIEWMODEL_EXPORT QVector< int > ItemRoleToQtRole(int role)
Returns vector of Qt roles corresponding to given ItemDataRole.

References findViews(), ModelView::Utils::ItemRoleToQtRole(), and p_impl.

Referenced by ViewModelController(), ModelView::PropertyViewModelController::onDataChange(), and ModelView::PropertyFlatViewModelController::onDataChange().

Here is the call graph for this function:

◆ onItemInserted()

void ViewModelController::onItemInserted ( SessionItem parent,
TagRow  tagrow 
)
protectedvirtual

Definition at line 274 of file viewmodelcontroller.cpp.

275 {
276  p_impl->insert_view(parent, tagrow);
277 }

References p_impl.

Referenced by ViewModelController().

◆ onItemRemoved()

void ViewModelController::onItemRemoved ( SessionItem parent,
TagRow  tagrow 
)
protectedvirtual

Definition at line 279 of file viewmodelcontroller.cpp.

279 {}

Referenced by ViewModelController().

◆ rootSessionItem()

SessionItem * ViewModelController::rootSessionItem ( ) const

Definition at line 246 of file viewmodelcontroller.cpp.

247 {
248  return p_impl->m_viewModel->rootItem()->item();
249 }

References p_impl.

Referenced by ModelView::ViewModelController::ViewModelControllerImpl::init_view_model(), and onAboutToRemoveItem().

◆ sessionModel()

SessionModel * ViewModelController::sessionModel ( ) const

Returns SessionModel handled by this controller.

Definition at line 226 of file viewmodelcontroller.cpp.

227 {
228  return model();
229 }

References ModelView::ModelListener< SessionModel >::model().

Here is the call graph for this function:

◆ setChildrenStrategy()

◆ setOnAboutToRemoveItem()

void ModelListenerBase::setOnAboutToRemoveItem ( Callbacks::item_tagrow_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets callback to be notified when the item is about to be removed.

The callback will be called with (SessionItem* parent, tagrow), where 'tagrow' denotes child position being removed.

Implements ModelView::ModelListenerInterface.

Definition at line 61 of file modellistenerbase.cpp.

63 {
65 }
void setOnAboutToRemoveItem(Callbacks::item_tagrow_t f, Callbacks::slot_t client) override
Sets callback to be notified when the item is about to be removed.
Definition: modelmapper.cpp:77
ModelMapper * mapper()
Returns model mapper. Can be used to subscribe to various model's signal.

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnAboutToRemoveItem().

Referenced by ModelView::ItemMapper::ItemMapper(), and ViewModelController().

Here is the call graph for this function:

◆ setOnDataChange()

void ModelListenerBase::setOnDataChange ( Callbacks::item_int_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets callback to be notified on item's data change.

The callback will be called with (SessionItem*, data_role).

Implements ModelView::ModelListenerInterface.

Definition at line 37 of file modellistenerbase.cpp.

38 {
39  m_model->mapper()->setOnDataChange(f, this);
40 }
void setOnDataChange(Callbacks::item_int_t f, Callbacks::slot_t client) override
Sets callback to be notified on item's data change.
Definition: modelmapper.cpp:53

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnDataChange().

Referenced by gui2::ExperimentalDataController::ExperimentalDataController(), ModelView::ItemMapper::ItemMapper(), gui2::MaterialPropertyController::MaterialPropertyController(), ModelView::ModelHasChangedController::ModelHasChangedController(), and ViewModelController().

Here is the call graph for this function:

◆ setOnItemInserted()

void ModelListenerBase::setOnItemInserted ( Callbacks::item_tagrow_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets callback to be notified on item insert.

The callback will be called with (SessionItem* parent, tagrow), where 'tagrow' denotes inserted child position.

Implements ModelView::ModelListenerInterface.

Definition at line 45 of file modellistenerbase.cpp.

46 {
47  m_model->mapper()->setOnItemInserted(f, this);
48 }
void setOnItemInserted(Callbacks::item_tagrow_t f, Callbacks::slot_t client) override
Sets callback to be notified on item insert.
Definition: modelmapper.cpp:61

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnItemInserted().

Referenced by gui2::ExperimentalDataController::ExperimentalDataController(), ModelView::ItemMapper::ItemMapper(), gui2::MaterialPropertyController::MaterialPropertyController(), ModelView::ModelHasChangedController::ModelHasChangedController(), and ViewModelController().

Here is the call graph for this function:

◆ setOnItemRemoved()

void ModelListenerBase::setOnItemRemoved ( Callbacks::item_tagrow_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets callback to be notified on item remove.

The callback will be called with (SessionItem* parent, tagrow), where 'tagrow' denotes child position before the removal.

Implements ModelView::ModelListenerInterface.

Definition at line 53 of file modellistenerbase.cpp.

54 {
55  m_model->mapper()->setOnItemRemoved(f, this);
56 }
void setOnItemRemoved(Callbacks::item_tagrow_t f, Callbacks::slot_t client) override
Sets callback to be notified on item remove.
Definition: modelmapper.cpp:69

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnItemRemoved().

Referenced by gui2::ExperimentalDataController::ExperimentalDataController(), ModelView::ItemMapper::ItemMapper(), gui2::MaterialPropertyController::MaterialPropertyController(), ModelView::ModelHasChangedController::ModelHasChangedController(), and ViewModelController().

Here is the call graph for this function:

◆ setOnModelAboutToBeReset()

void ModelListenerBase::setOnModelAboutToBeReset ( Callbacks::model_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets the callback to be notified before model's full reset (root item recreated).

Implements ModelView::ModelListenerInterface.

Definition at line 76 of file modellistenerbase.cpp.

77 {
79 }
void setOnModelAboutToBeReset(Callbacks::model_t f, Callbacks::slot_t client) override
Sets the callback to be notified just before the reset of the root item.
Definition: modelmapper.cpp:91

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnModelAboutToBeReset().

Referenced by ViewModelController().

Here is the call graph for this function:

◆ setOnModelDestroyed()

void ModelListenerBase::setOnModelDestroyed ( Callbacks::model_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets the callback for notifications on model destruction.

Implements ModelView::ModelListenerInterface.

Definition at line 69 of file modellistenerbase.cpp.

70 {
71  m_model->mapper()->setOnModelDestroyed(f, this);
72 }
void setOnModelDestroyed(Callbacks::model_t f, Callbacks::slot_t client) override
Sets the callback for notifications on model destruction.
Definition: modelmapper.cpp:84

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnModelDestroyed().

Referenced by ModelView::ModelListenerBase::ModelListenerBase(), and ViewModelController().

Here is the call graph for this function:

◆ setOnModelReset()

void ModelListenerBase::setOnModelReset ( Callbacks::model_t  f,
Callbacks::slot_t  client = {} 
)
overridevirtualinherited

Sets the callback to be notified after model was fully reset (root item recreated).

Implements ModelView::ModelListenerInterface.

Definition at line 83 of file modellistenerbase.cpp.

84 {
85  m_model->mapper()->setOnModelReset(f, this);
86 }
void setOnModelReset(Callbacks::model_t f, Callbacks::slot_t client) override
Sets the callback to be notified right after the root item recreation.
Definition: modelmapper.cpp:98

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::setOnModelReset().

Referenced by gui2::ExperimentalDataController::ExperimentalDataController(), gui2::MaterialPropertyController::MaterialPropertyController(), ModelView::ModelHasChangedController::ModelHasChangedController(), and ViewModelController().

Here is the call graph for this function:

◆ setRootSessionItem()

void ViewModelController::setRootSessionItem ( SessionItem item)

Definition at line 231 of file viewmodelcontroller.cpp.

232 {
233  if (!item)
234  throw std::runtime_error(
235  "Error in ViewModelController: atttemp to set nulptr as root item");
236 
237  if (item->model() != model())
238  throw std::runtime_error(
239  "Error in ViewModelController: atttemp to use item from alien model as new root.");
240 
241  p_impl->m_viewModel->beginResetModel();
242  p_impl->setRootSessionItemIntern(item);
243  p_impl->m_viewModel->endResetModel();
244 }
SessionModel * model() const
Returns the model to which given item belongs to.

References ModelView::SessionItem::model(), ModelView::ModelListener< SessionModel >::model(), and p_impl.

Here is the call graph for this function:

◆ setRowStrategy()

◆ setViewModel()

void ViewModelController::setViewModel ( ViewModelBase view_model)

Definition at line 206 of file viewmodelcontroller.cpp.

207 {
208  p_impl->m_viewModel = view_model;
209 }

References p_impl.

◆ unsubscribe()

void ModelListenerBase::unsubscribe ( Callbacks::slot_t  client = {})
overridevirtualinherited

Removes given client from all subscriptions.

Implements ModelView::ModelListenerInterface.

Definition at line 88 of file modellistenerbase.cpp.

89 {
90  if (m_model)
91  m_model->mapper()->unsubscribe(this);
92 }
void unsubscribe(Callbacks::slot_t client) override
Removes given client from all subscriptions.

References ModelView::ModelListenerBase::m_model, ModelView::SessionModel::mapper(), and ModelView::ModelMapper::unsubscribe().

Referenced by ModelView::ModelListenerBase::~ModelListenerBase().

Here is the call graph for this function:

◆ update_branch()

void ViewModelController::update_branch ( const SessionItem item)
protected

Definition at line 298 of file viewmodelcontroller.cpp.

299 {
300  auto views = findViews(item);
301  if (views.empty())
302  return;
303 
304  for (auto view : views)
305  p_impl->remove_children_of_view(view);
306 
307  p_impl->iterate(item, views.at(0));
308 }

References findViews(), and p_impl.

Referenced by ModelView::PropertyViewModelController::onDataChange(), and ModelView::PropertyFlatViewModelController::onDataChange().

Here is the call graph for this function:

Member Data Documentation

◆ m_model

◆ p_impl


The documentation for this class was generated from the following files: