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
 
SessionModel * model () const
 
SessionItem * rootSessionItem () const
 
SessionModel * sessionModel () 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

SessionModel * m_model {nullptr}
 

Private Attributes

std::unique_ptr< ViewModelControllerImpl > p_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: