Skip to content
Snippets Groups Projects
Commit 86a68c22 authored by Pospelov, Gennady's avatar Pospelov, Gennady
Browse files

ItemStackPresenter now can use same widget for item presentation.

parent 5fddc794
No related branches found
No related tags found
No related merge requests found
...@@ -26,84 +26,106 @@ class SessionItem; ...@@ -26,84 +26,106 @@ class SessionItem;
//! The ItemStackPresenter templated class extends ItemStackWidget so it could operate with //! The ItemStackPresenter templated class extends ItemStackWidget so it could operate with
//! SesionItem editor's of specified type, while still keeping signal/slots alive. //! SesionItem editor's of specified type, while still keeping signal/slots alive.
template<class T> template <class T> class BA_CORE_API_ ItemStackPresenter : public ItemStackWidget
class BA_CORE_API_ ItemStackPresenter : public ItemStackWidget
{ {
public: public:
ItemStackPresenter(bool single_widget = false) : m_single_widget(single_widget){}
virtual void setItem(SessionItem *item, bool &isNew) { virtual void setItem(SessionItem* item, bool& isNew);
validateItem(item);
isNew = false; T* currentWidget();
if(!item) { T* itemWidget(SessionItem* item);
hideWidgets(); void hideWidgets();
return;
}
T *widget = m_itemToWidget[item]; protected:
void removeWidgetForItem(SessionItem* item);
void removeWidgets();
if(!widget) { private:
widget = new T(); QMap<SessionItem*, T*> m_itemToWidget;
isNew = true; bool m_single_widget; //!< Different items will be served by same widget
m_stackedWidget->addWidget(widget); };
m_itemToWidget[item] = widget;
}
Q_ASSERT(widget);
m_stackedWidget->setCurrentWidget(widget);
if(widget->isHidden())
widget->show();
} template <class T>
void ItemStackPresenter<T>::setItem(SessionItem* item, bool& isNew)
{
validateItem(item);
T *currentWidget() { isNew = false;
return dynamic_cast<T *>(m_stackedWidget->currentWidget()); if (!item) {
hideWidgets();
return;
} }
T *itemWidget(SessionItem *item) { T* widget = itemWidget(item);
return m_itemToWidget[item];
}
void hideWidgets() { if (!widget) {
if(m_stackedWidget->currentWidget()) { widget = new T();
m_stackedWidget->currentWidget()->hide(); isNew = true;
} m_stackedWidget->addWidget(widget);
m_itemToWidget[item] = widget;
} }
protected: m_stackedWidget->setCurrentWidget(widget);
void removeWidgetForItem(SessionItem *item) { if (widget->isHidden())
Q_ASSERT(item); widget->show();
}
template <class T>
T* ItemStackPresenter<T>::currentWidget() {
return dynamic_cast<T*>(m_stackedWidget->currentWidget());
}
T *widget = m_itemToWidget[item]; template <class T>
if(!widget) return; T* ItemStackPresenter<T>::itemWidget(SessionItem* item)
{
if(m_single_widget) {
if(m_itemToWidget.size())
return m_itemToWidget.first();
} else {
return m_itemToWidget[item];
}
typename QMap<SessionItem *, T *>::iterator it = m_itemToWidget.begin(); return nullptr;
while(it!=m_itemToWidget.end()) { }
if(it.value() == widget) {
it = m_itemToWidget.erase(it);
} else {
++it;
}
}
m_stackedWidget->removeWidget(widget); template <class T>
delete widget; void ItemStackPresenter<T>::hideWidgets() {
if (m_stackedWidget->currentWidget())
m_stackedWidget->currentWidget()->hide();
}
template <class T>
void ItemStackPresenter<T>::removeWidgetForItem(SessionItem* item)
{
Q_ASSERT(item);
} T* widget = m_itemToWidget[item];
if (!widget)
return;
void removeWidgets() { typename QMap<SessionItem*, T*>::iterator it = m_itemToWidget.begin();
typename QMap<SessionItem *, T *>::iterator it = m_itemToWidget.begin(); while (it != m_itemToWidget.end()) {
while(it!=m_itemToWidget.end()) { if (it.value() == widget)
m_stackedWidget->removeWidget(it.value()); it = m_itemToWidget.erase(it);
delete it.value(); else
++it; ++it;
}
m_itemToWidget.clear();
} }
private: m_stackedWidget->removeWidget(widget);
QMap<SessionItem *, T *> m_itemToWidget; delete widget;
}; }
template <class T>
void ItemStackPresenter<T>::removeWidgets()
{
typename QMap<SessionItem*, T*>::iterator it = m_itemToWidget.begin();
while (it != m_itemToWidget.end()) {
m_stackedWidget->removeWidget(it.value());
delete it.value();
++it;
}
m_itemToWidget.clear();
}
#endif // ITEMSTACKPRESENTER_H #endif // ITEMSTACKPRESENTER_H
...@@ -20,27 +20,26 @@ ...@@ -20,27 +20,26 @@
#include <QStackedWidget> #include <QStackedWidget>
#include <QVBoxLayout> #include <QVBoxLayout>
ItemStackWidget::ItemStackWidget(QWidget* parent)
ItemStackWidget::ItemStackWidget(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, m_stackedWidget(new QStackedWidget) , m_stackedWidget(new QStackedWidget)
, m_model(0) , m_model(nullptr)
, m_size_hint(QSize(1024, 1024)) , m_size_hint(QSize(1024, 1024))
{ {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_stackedWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QVBoxLayout *layout = new QVBoxLayout; QVBoxLayout* layout = new QVBoxLayout;
layout->setMargin(0); layout->setMargin(0);
layout->setSpacing(0); layout->setSpacing(0);
layout->setContentsMargins(0,0,0,0); layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(m_stackedWidget); layout->addWidget(m_stackedWidget);
setLayout(layout); setLayout(layout);
} }
void ItemStackWidget::setModel(SessionModel *model) void ItemStackWidget::setModel(SessionModel* model)
{ {
if(model == m_model) if (model == m_model)
return; return;
disconnectModel(); disconnectModel();
...@@ -58,7 +57,7 @@ QSize ItemStackWidget::minimumSizeHint() const ...@@ -58,7 +57,7 @@ QSize ItemStackWidget::minimumSizeHint() const
return QSize(25, 25); return QSize(25, 25);
} }
void ItemStackWidget::setSizeHint(const QSize &size_hint) void ItemStackWidget::setSizeHint(const QSize& size_hint)
{ {
m_size_hint = size_hint; m_size_hint = size_hint;
} }
...@@ -68,55 +67,53 @@ void ItemStackWidget::onModelAboutToBeReset() ...@@ -68,55 +67,53 @@ void ItemStackWidget::onModelAboutToBeReset()
removeWidgets(); removeWidgets();
} }
void ItemStackWidget::onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int) void ItemStackWidget::onRowsAboutToBeRemoved(const QModelIndex& parent, int first, int)
{ {
SessionItem *item = m_model->itemForIndex(m_model->index(first, 0, parent)); SessionItem* item = m_model->itemForIndex(m_model->index(first, 0, parent));
removeWidgetForItem(item); removeWidgetForItem(item);
} }
void ItemStackWidget::onSelectionChanged(SessionItem *item) void ItemStackWidget::onSelectionChanged(SessionItem* item)
{ {
bool isNew(false); bool isNew(false);
setItem(item, isNew); setItem(item, isNew);
} }
void ItemStackWidget::connectModel() void ItemStackWidget::connectModel()
{ {
if(!m_model) return; if (!m_model)
return;
connect(m_model, SIGNAL(modelAboutToBeReset()), connect(m_model, SIGNAL(modelAboutToBeReset()), this, SLOT(onModelAboutToBeReset()),
this, SLOT(onModelAboutToBeReset()),
Qt::UniqueConnection); Qt::UniqueConnection);
connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)), connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this,
this, SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int)), SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int)), Qt::UniqueConnection);
Qt::UniqueConnection);
} }
void ItemStackWidget::disconnectModel() void ItemStackWidget::disconnectModel()
{ {
if(!m_model) return; if (!m_model)
return;
disconnect(m_model, SIGNAL(modelAboutToBeReset()), disconnect(m_model, SIGNAL(modelAboutToBeReset()), this, SLOT(onModelAboutToBeReset()));
this, SLOT(onModelAboutToBeReset()));
disconnect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int,int)), disconnect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex, int, int)), this,
this, SLOT(onRowsAboutToBeRemoved(QModelIndex,int,int))); SLOT(onRowsAboutToBeRemoved(QModelIndex, int, int)));
} }
//! Checks if model was set correctly. //! Checks if model was set correctly.
void ItemStackWidget::validateItem(SessionItem *item) void ItemStackWidget::validateItem(SessionItem* item)
{ {
if(!item) return; if (!item)
return;
if(m_model) { if (m_model) {
if(m_model != item->model()) { if (m_model != item->model())
// in principle it should be possible, but should be tested // in principle it should be possible, but should be tested
throw GUIHelpers::Error("ItemStackWidget::validateItem() -> Error. " throw GUIHelpers::Error("ItemStackWidget::validateItem() -> Error. "
"Attempt to use items from different models."); "Attempt to use items from different models.");
}
} else { } else {
setModel(item->model()); setModel(item->model());
} }
......
...@@ -35,33 +35,33 @@ class BA_CORE_API_ ItemStackWidget : public QWidget ...@@ -35,33 +35,33 @@ class BA_CORE_API_ ItemStackWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
ItemStackWidget(QWidget *parent = 0); ItemStackWidget(QWidget* parent = 0);
void setModel(SessionModel *model); void setModel(SessionModel* model);
//! Shows the widget for given item (and hides previous one). //! Shows the widget for given item (and hides previous one).
//! If no widget yet exists, it will be created (flag isNew will become 'true' in this case). //! If no widget yet exists, it will be created (flag isNew will become 'true' in this case).
virtual void setItem(SessionItem *item, bool &isNew) = 0; virtual void setItem(SessionItem* item, bool& isNew) = 0;
QSize sizeHint() const; QSize sizeHint() const;
QSize minimumSizeHint() const; QSize minimumSizeHint() const;
void setSizeHint(const QSize &size_hint); void setSizeHint(const QSize& size_hint);
public slots: public slots:
virtual void onModelAboutToBeReset(); virtual void onModelAboutToBeReset();
virtual void onRowsAboutToBeRemoved(const QModelIndex &parent,int first,int); virtual void onRowsAboutToBeRemoved(const QModelIndex& parent, int first, int);
virtual void onSelectionChanged(SessionItem *item); virtual void onSelectionChanged(SessionItem* item);
protected: protected:
void connectModel(); void connectModel();
void disconnectModel(); void disconnectModel();
void validateItem(SessionItem *item); void validateItem(SessionItem* item);
virtual void removeWidgetForItem(SessionItem *item) = 0; virtual void removeWidgetForItem(SessionItem* item) = 0;
virtual void removeWidgets() = 0; virtual void removeWidgets() = 0;
class QStackedWidget *m_stackedWidget; class QStackedWidget* m_stackedWidget;
SessionModel *m_model; SessionModel* m_model;
QSize m_size_hint; QSize m_size_hint;
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment