diff options
author | Dominik Kapusta <dominik.kapusta@teleca.com> | 2010-09-09 17:16:04 +0200 |
---|---|---|
committer | Dominik Kapusta <dominik.kapusta@teleca.com> | 2010-09-13 14:11:01 +0200 |
commit | 5f1f0f91a4e02b73ba78d5d839ba58cec543f408 (patch) | |
tree | 0d35a6cbed2ca476d5b09433eb485c06562ff64b /src | |
parent | 2d421e7624152f7a50a81391b615c7fcdca20f19 (diff) |
Changes: Clean up MApplicationPage by moving its view-related code to MApplicationPageView.
RevBy: Marcin Miklas, Daniel d'Andrada
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/widgets/mapplicationpage.cpp | 207 | ||||
-rw-r--r-- | src/corelib/widgets/mapplicationpage_p.h | 36 | ||||
-rw-r--r-- | src/corelib/widgets/mapplicationpagemodel.h | 19 | ||||
-rw-r--r-- | src/corelib/widgets/mapplicationwindow.cpp | 10 | ||||
-rw-r--r-- | src/views/mapplicationpageview.cpp | 179 | ||||
-rw-r--r-- | src/views/mapplicationpageview.h | 16 | ||||
-rw-r--r-- | src/views/mapplicationpageview_p.h | 23 |
7 files changed, 265 insertions, 225 deletions
diff --git a/src/corelib/widgets/mapplicationpage.cpp b/src/corelib/widgets/mapplicationpage.cpp index d1681fc5..bf69876b 100644 --- a/src/corelib/widgets/mapplicationpage.cpp +++ b/src/corelib/widgets/mapplicationpage.cpp @@ -19,139 +19,37 @@ #include "mapplicationpage.h" #include "mapplicationpage_p.h" -#include <mapplicationpagemodel.h> -#include <MDebug> -#include <MPannableViewport> -#include <QGraphicsLinearLayout> -#include <MTheme> -#include <MApplication> -#include <MApplicationWindow> -#include <MPannableViewport> -#include <MSceneManager> -#include <MEscapeButtonPanel> -#include <MAction> -#include <MScene> -#include <MPositionIndicator> -#include <mdockwidget.h> -#include <mapplicationwindow_p.h> - +#include "mapplicationpagemodel.h" +#include "mapplicationwindow.h" +#include "mwidgetview.h" #include "mondisplaychangeevent.h" - #include "mwidgetcreator.h" +#include "mpannableviewport.h" + +#include <QAction> +#include <QGraphicsLinearLayout> + M_REGISTER_WIDGET(MApplicationPage) MApplicationPagePrivate::MApplicationPagePrivate() : - rememberPosition(false), - topSpacer(NULL), - bottomSpacer(NULL), - mainWidget(NULL), - mainLayout(NULL), - pannableViewPort(NULL), - centralWidget(NULL), - contentCreated(false), - backEnabled(false) + pannableViewport(0), + contentCreated(false) {} void MApplicationPagePrivate::init() { Q_Q(MApplicationPage); - contentCreated = false; - backEnabled = false; - rememberPosition = true; - - QGraphicsLinearLayout *layout = createLayout(); - q->setLayout(layout); - - pannableViewPort = new MPannableViewport(q); - pannableViewPort->setClipping(false); - layout->addItem(pannableViewPort); - - mainWidget = new MWidget; - - pannableViewPort->setWidget(mainWidget); - - mainLayout = createLayout(); - mainWidget->setLayout(mainLayout); - - topSpacer = createSpacer(mainWidget); - setWidgetHeight(topSpacer, 0); - mainLayout->addItem(topSpacer); - - centralWidget = new MWidget(mainWidget); - mainLayout->addItem(centralWidget); - - bottomSpacer = createSpacer(mainWidget); - setWidgetHeight(bottomSpacer, 0); - mainLayout->addItem(bottomSpacer); -} - -QGraphicsLinearLayout *MApplicationPagePrivate::createLayout() -{ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0.0); - return layout; -} - -MWidget *MApplicationPagePrivate::createSpacer(QGraphicsItem *parent) -{ - MWidget *spacer = new MWidget(parent); - return spacer; -} - -void MApplicationPagePrivate::setWidgetHeight(MWidget *w, qreal height) -{ - w->setMinimumHeight(height); - w->setMaximumHeight(height); - w->setPreferredHeight(height); -} - -void MApplicationPagePrivate::deleteCurrentCentralWidget() -{ - if (centralWidget) { - mainLayout->removeItem(centralWidget); - delete centralWidget; - centralWidget = 0; - } -} -void MApplicationPagePrivate::placeCentralWidget(QGraphicsWidget *widget) -{ - if (widget) { - // insert the new central widget between top and bottom spacers - if (mainLayout->count() > 0) - mainLayout->insertItem(1,widget); - else - mainLayout->addItem(widget); - centralWidget = widget; - } -} - -void MApplicationPagePrivate::updatePannableViewportPosition() -{ - if (!rememberPosition) { - pannableViewPort->setPosition(QPointF(0, 0)); - } -} + pannableViewport = new MPannableViewport; + pannableViewport->setClipping(false); -void MApplicationPagePrivate::propagateOnDisplayChangeEvent(bool visible) -{ - Q_Q(MApplicationPage); + layout->addItem(pannableViewport); - if (q->scene() == 0 || q->sceneManager() == 0) - return; - - if (centralWidget) { - QRectF viewRect(QPointF(0, 0), q->sceneManager()->visibleSceneSize()); - if (visible) { - MOnDisplayChangeEvent ev(MOnDisplayChangeEvent::MustBeResolved, viewRect); - q->scene()->sendEvent(centralWidget, &ev); - } else { - MOnDisplayChangeEvent ev(false, viewRect); - q->scene()->sendEvent(centralWidget, &ev); - } - } + q->setLayout(layout); } MApplicationPage::MApplicationPage(QGraphicsItem *parent) @@ -165,22 +63,20 @@ MApplicationPage::MApplicationPage(QGraphicsItem *parent) MApplicationPage::~MApplicationPage() { + setCentralWidget(0); } void MApplicationPage::setCentralWidget(QGraphicsWidget *centralWidget) { - Q_D(MApplicationPage); + if (model()->centralWidget()) + delete model()->centralWidget(); - d->deleteCurrentCentralWidget(); - d->placeCentralWidget(centralWidget); - d->propagateOnDisplayChangeEvent(isOnDisplay()); + model()->setCentralWidget(centralWidget); } QGraphicsWidget *MApplicationPage::centralWidget() { - Q_D(MApplicationPage); - - return d->centralWidget; + return model()->centralWidget(); } MApplicationWindow *MApplicationPage::applicationWindow() @@ -227,44 +123,40 @@ bool MApplicationPage::isContentCreated() const void MApplicationPage::setRememberPosition(bool remember) { - Q_D(MApplicationPage); - - d->rememberPosition = remember; + model()->setRememberPosition(remember); } bool MApplicationPage::rememberPosition() const { - Q_D(const MApplicationPage); - - return d->rememberPosition; + return model()->rememberPosition(); } void MApplicationPage::setPannable(bool pannable) { Q_D(MApplicationPage); - d->pannableViewPort->setEnabled(pannable); + d->pannableViewport->setEnabled(pannable); } bool MApplicationPage::isPannable() const { Q_D(const MApplicationPage); - return d->pannableViewPort->isEnabled(); + return d->pannableViewport->isEnabled(); } -Qt::Orientations MApplicationPage::panningDirection() const +void MApplicationPage::setPanningDirection(Qt::Orientations directions) { - Q_D(const MApplicationPage); + Q_D(MApplicationPage); - return d->pannableViewPort->panDirection(); + d->pannableViewport->setPanDirection(directions); } -void MApplicationPage::setPanningDirection(Qt::Orientations directions) +Qt::Orientations MApplicationPage::panningDirection() const { - Q_D(MApplicationPage); + Q_D(const MApplicationPage); - d->pannableViewPort->setPanDirection(directions); + return d->pannableViewport->panDirection(); } void MApplicationPage::actionEvent(QActionEvent *e) @@ -301,8 +193,6 @@ void MApplicationPagePrivate::doEnterDisplayEvent() q->createContent(); } - updatePannableViewportPosition(); - MWidgetPrivate::doEnterDisplayEvent(); } @@ -310,45 +200,15 @@ void MApplicationPagePrivate::setExposedContentRect(const QRectF &exposedContent { Q_Q(MApplicationPage); - if (exposedContentRect != this->exposedContentRect) { - this->exposedContentRect = exposedContentRect; + if (exposedContentRect != q->model()->exposedContentRect()) { + q->model()->setExposedContentRect(exposedContentRect); emit q->exposedContentRectChanged(); - - updateAutoMarginsForComponents(); } } QRectF MApplicationPage::exposedContentRect() const { - Q_D(const MApplicationPage); - - return d->exposedContentRect; -} - -void MApplicationPagePrivate::updateAutoMarginsForComponents() -{ - Q_Q(MApplicationPage); - - qreal topMargin = 0.0; - qreal bottomMargin = 0.0; - - if (q->autoMarginsForComponentsEnabled()) { - topMargin = exposedContentRect.y(); - - qreal exposedContentRectBottomEdge = exposedContentRect.y() + exposedContentRect.height(); - bottomMargin = q->boundingRect().height() - exposedContentRectBottomEdge; - } - - pannableViewPort->positionIndicator()->setPos(exposedContentRect.topLeft()); - setWidgetHeight(pannableViewPort->positionIndicator(), exposedContentRect.height()); - - setWidgetHeight(topSpacer, topMargin); - setWidgetHeight(bottomSpacer, bottomMargin); - - // FIXME: This activation is needed so input widget relocator can correctly calculate - // positions after decorations hide. Correct place for this would be after all - // decorations have been hidden. Only one activation is required. - pannableViewPort->widget()->layout()->activate(); + return model()->exposedContentRect(); } MApplicationPageModel::ComponentDisplayMode MApplicationPage::componentDisplayMode( @@ -421,7 +281,8 @@ void MApplicationPage::setEscapeMode(MApplicationPageModel::PageEscapeMode mode) MPannableViewport * MApplicationPage::pannableViewport() { Q_D(MApplicationPage); - return d->pannableViewPort; + + return d->pannableViewport; } #include "moc_mapplicationpage.cpp" diff --git a/src/corelib/widgets/mapplicationpage_p.h b/src/corelib/widgets/mapplicationpage_p.h index 3d27c719..2af1a17d 100644 --- a/src/corelib/widgets/mapplicationpage_p.h +++ b/src/corelib/widgets/mapplicationpage_p.h @@ -22,18 +22,9 @@ #include <mapplicationpage.h> #include <mscenewindow_p.h> -#include <QList> #include <QRect> -#include <mnamespace.h> -class MScene; -class MAction; -class MWidget; -class MToolBar; class MPannableViewport; -class QGraphicsLinearLayout; -class MApplicationWindow; -class MApplicationWindowPrivate; class MApplicationPagePrivate : public MSceneWindowPrivate { @@ -42,39 +33,14 @@ class MApplicationPagePrivate : public MSceneWindowPrivate public: MApplicationPagePrivate(); - void init(); virtual void doEnterDisplayEvent(); - - void deleteCurrentCentralWidget(); - void placeCentralWidget(QGraphicsWidget *widget); - void setWidgetHeight(MWidget *w, qreal height); - void updatePannableViewportPosition(); - - void propagateOnDisplayChangeEvent(bool visible); - // Note: Called by MApplicationWindow void setExposedContentRect(const QRectF &rect); - void updateAutoMarginsForComponents(); - -private: - QGraphicsLinearLayout *createLayout(); - MWidget *createSpacer(QGraphicsItem *parent); - QRectF range; - -public: - bool rememberPosition; - MWidget *topSpacer; - MWidget *bottomSpacer; - MWidget *mainWidget; - QGraphicsLinearLayout *mainLayout; - MPannableViewport *pannableViewPort; - QGraphicsWidget *centralWidget; - QRectF exposedContentRect; + MPannableViewport *pannableViewport; bool contentCreated; - bool backEnabled; }; #endif diff --git a/src/corelib/widgets/mapplicationpagemodel.h b/src/corelib/widgets/mapplicationpagemodel.h index 6c21402a..21847d47 100644 --- a/src/corelib/widgets/mapplicationpagemodel.h +++ b/src/corelib/widgets/mapplicationpagemodel.h @@ -117,12 +117,31 @@ private: M_MODEL_PROPERTY(bool, autoMarginsForComponentsEnabled, AutoMarginsForComponentsEnabled, true, true) /*! + \property MApplicationPageModel::rememberPosition + \brief Whether the page should remember the pannable viewport position it had + on its last appearance. + */ + M_MODEL_PROPERTY(bool, rememberPosition, RememberPosition, true, true) + + /*! + \property MApplicationPageModel::exposedContentRect + \brief Area of the page whose content is not covered by any bar + */ + M_MODEL_PROPERTY(QRectF, exposedContentRect, ExposedContentRect, true, QRectF()) + + /*! \property MApplicationPageModel::title \brief Title for a page. Title appears on the navigation bar. */ M_MODEL_PROPERTY(QString, title, Title, true, QString()) + + /*! + \property MApplicationPageModel::centralWidget + \brief Central widget for the applicationPage. + */ + M_MODEL_PTR_PROPERTY(QGraphicsWidget *, centralWidget, CentralWidget, true, new MWidget) }; #endif diff --git a/src/corelib/widgets/mapplicationwindow.cpp b/src/corelib/widgets/mapplicationwindow.cpp index fe692249..d2c69916 100644 --- a/src/corelib/widgets/mapplicationwindow.cpp +++ b/src/corelib/widgets/mapplicationwindow.cpp @@ -213,6 +213,8 @@ void MApplicationWindowPrivate::init() #endif q->connect(q, SIGNAL(orientationAngleChanged(M::OrientationAngle)), SLOT(_q_updatePageExposedContentRect())); + q->connect(MTheme::instance(), SIGNAL(themeChangeCompleted()), + SLOT(_q_updatePageExposedContentRect())); } #ifdef Q_WS_X11 @@ -401,14 +403,6 @@ void MApplicationWindowPrivate::_q_handlePageModelModifications(const QList<cons if (member == MApplicationPageModel::ProgressIndicatorVisible) { navigationBar->setProgressIndicatorVisible(page->model()->progressIndicatorVisible()); - } else if (member == MApplicationPageModel::AutoMarginsForComponentsEnabled) { - - // FIXME: Fix this on the next ABI break. - // updateAutoMarginsForComponents() calls due to changes in - // MApplicationPageModel::autoMarginsForComponentsEnabled() should - // be handled in MApplicationPage::updateData(). - page->d_func()->updateAutoMarginsForComponents(); - } else if (member == MApplicationPageModel::EscapeMode) { setupPageEscape(); diff --git a/src/views/mapplicationpageview.cpp b/src/views/mapplicationpageview.cpp index a6d10fd4..b54f6565 100644 --- a/src/views/mapplicationpageview.cpp +++ b/src/views/mapplicationpageview.cpp @@ -26,9 +26,20 @@ #include "mapplicationpage.h" #include "mscenemanager.h" #include "mviewcreator.h" +#include "mpannableviewport.h" +#include "mondisplaychangeevent.h" +#include "mpositionindicator.h" + +#include <QGraphicsLinearLayout> MApplicationPageViewPrivate::MApplicationPageViewPrivate() - : q_ptr(0) + : q_ptr(0), + controller(0), + topSpacer(0), + bottomSpacer(0), + mainWidget(0), + mainLayout(0), + centralWidget(0) { } @@ -36,23 +47,183 @@ MApplicationPageViewPrivate::~MApplicationPageViewPrivate() { } +void MApplicationPageViewPrivate::init() +{ + mainWidget = new MWidget; + + controller->pannableViewport()->setWidget(mainWidget); + + mainLayout = createLayout(); + mainWidget->setLayout(mainLayout); + + topSpacer = createSpacer(mainWidget); + bottomSpacer = createSpacer(mainWidget); + + setWidgetHeight(topSpacer, 0); + setWidgetHeight(bottomSpacer, 0); + + mainLayout->addItem(topSpacer); + mainLayout->addItem(bottomSpacer); +} + + +QGraphicsLinearLayout *MApplicationPageViewPrivate::createLayout() +{ + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0.0); + return layout; +} + +MWidget *MApplicationPageViewPrivate::createSpacer(QGraphicsItem *parent) +{ + MWidget *spacer = new MWidget(parent); + return spacer; +} + +void MApplicationPageViewPrivate::setWidgetHeight(MWidget *w, qreal height) +{ + w->setMinimumHeight(height); + w->setMaximumHeight(height); + w->setPreferredHeight(height); +} + +void MApplicationPageViewPrivate::propagateOnDisplayChangeEvent(bool visible) +{ + Q_Q(MApplicationPageView); + + if (controller->scene() == 0 || controller->sceneManager() == 0) + return; + + if (q->model()->centralWidget()) { + QRectF viewRect(QPointF(0, 0), controller->sceneManager()->visibleSceneSize()); + if (visible) { + MOnDisplayChangeEvent ev(MOnDisplayChangeEvent::MustBeResolved, viewRect); + controller->scene()->sendEvent(q->model()->centralWidget(), &ev); + } else { + MOnDisplayChangeEvent ev(false, viewRect); + controller->scene()->sendEvent(q->model()->centralWidget(), &ev); + } + } +} + +void MApplicationPageViewPrivate::setCentralWidget(QGraphicsWidget *newCentralWidget) +{ + if (centralWidget) + mainLayout->removeItem(centralWidget); + + // Place the new one + if (newCentralWidget) { + mainLayout->insertItem(1, newCentralWidget); + centralWidget = newCentralWidget; + propagateOnDisplayChangeEvent(controller->isOnDisplay()); + } +} + +void MApplicationPageViewPrivate::updateAutoMarginsForComponents() +{ + Q_Q(MApplicationPageView); + + qreal topMargin = 0.0; + qreal bottomMargin = 0.0; + + QRectF exposedContentRect = q->model()->exposedContentRect(); + + if (q->model()->autoMarginsForComponentsEnabled()) { + topMargin = exposedContentRect.y(); + + qreal exposedContentRectBottomEdge = exposedContentRect.y() + exposedContentRect.height(); + bottomMargin = q->boundingRect().height() - exposedContentRectBottomEdge; + } + + controller->pannableViewport()->positionIndicator()->setPos(exposedContentRect.topLeft()); + setWidgetHeight(controller->pannableViewport()->positionIndicator(), exposedContentRect.height()); + + setWidgetHeight(topSpacer, topMargin); + setWidgetHeight(bottomSpacer, bottomMargin); + + // FIXME: This activation is needed so input widget relocator can correctly calculate + // positions after decorations hide. Correct place for this would be after all + // decorations have been hidden. Only one activation is required. + controller->pannableViewport()->widget()->layout()->activate(); +} + +void MApplicationPageViewPrivate::_q_onPageStateChanged() +{ + if (controller->sceneWindowState() == MSceneWindow::Disappeared) + resetPannableViewportPositionIfNeeded(); +} + +void MApplicationPageViewPrivate::resetPannableViewportPositionIfNeeded() +{ + Q_Q(MApplicationPageView); + + if (!q->model()->rememberPosition()) + controller->pannableViewport()->setPosition(QPointF(0, 0)); +} + MApplicationPageView::MApplicationPageView(MApplicationPage *controller) : MSceneWindowView(controller), d_ptr(new MApplicationPageViewPrivate) { Q_D(MApplicationPageView); d->q_ptr = this; + d->controller = controller; + d->init(); + connect(d->controller, SIGNAL(sceneWindowStateChanged(MSceneWindow::SceneWindowState,MSceneWindow::SceneWindowState)), + SLOT(_q_onPageStateChanged())); } MApplicationPageView::~MApplicationPageView() { + Q_D(MApplicationPageView); + + if (model()->centralWidget()) + model()->centralWidget()->setParentItem(0); + d->setCentralWidget(0); + d->controller->pannableViewport()->setWidget(0); + + delete d->mainWidget; delete d_ptr; } -/* -QRectF MApplicationPageView::boundingRect() const + +void MApplicationPageView::applyStyle() +{ + Q_D(MApplicationPageView); + + MSceneWindowView::applyStyle(); + d->updateAutoMarginsForComponents(); + d->resetPannableViewportPositionIfNeeded(); +} + +void MApplicationPageView::setupModel() { + Q_D(MApplicationPageView); + + MSceneWindowView::setupModel(); + + d->setCentralWidget(model()->centralWidget()); + d->updateAutoMarginsForComponents(); +} + +void MApplicationPageView::updateData(const QList<const char *> &modifications) +{ + Q_D(MApplicationPageView); + + MSceneWindowView::updateData(modifications); + + const char *member; + foreach(member, modifications) { + if (member == MApplicationPageModel::CentralWidget) { + d->setCentralWidget(model()->centralWidget()); + } else if (member == MApplicationPageModel::AutoMarginsForComponentsEnabled || + member == MApplicationPageModel::ExposedContentRect) + { + d->updateAutoMarginsForComponents(); + } + } } -*/ M_REGISTER_VIEW_NEW(MApplicationPageView, MApplicationPage) +#include "moc_mapplicationpageview.cpp" diff --git a/src/views/mapplicationpageview.h b/src/views/mapplicationpageview.h index 87868acb..535688f5 100644 --- a/src/views/mapplicationpageview.h +++ b/src/views/mapplicationpageview.h @@ -22,6 +22,7 @@ #include "mscenewindowview.h" #include <mapplicationpagestyle.h> +#include <mapplicationpagemodel.h> class MApplicationPage; class MApplicationPageViewPrivate; @@ -29,20 +30,25 @@ class MApplicationPageViewPrivate; class M_EXPORT MApplicationPageView : public MSceneWindowView { Q_OBJECT - M_VIEW(MWidgetModel, MApplicationPageStyle) + M_VIEW(MApplicationPageModel, MApplicationPageStyle) public: MApplicationPageView(MApplicationPage *controller); virtual ~MApplicationPageView(); - //! \reimp - //virtual QRectF boundingRect() const; - //! \reimp_end - protected: MApplicationPageViewPrivate *const d_ptr; + //! \reimp + virtual void applyStyle(); + virtual void setupModel(); + +protected slots: + virtual void updateData(const QList<const char *>& modifications); + //! \reimp_end + private: + Q_PRIVATE_SLOT(d_func(), void _q_onPageStateChanged()) Q_DECLARE_PRIVATE(MApplicationPageView) }; diff --git a/src/views/mapplicationpageview_p.h b/src/views/mapplicationpageview_p.h index d01f30db..d8a31ef7 100644 --- a/src/views/mapplicationpageview_p.h +++ b/src/views/mapplicationpageview_p.h @@ -21,6 +21,9 @@ #define MAPPLICATIONPAGEVIEW_P_H #include "mapplicationpageview.h" +#include <QPointer> + +class QGraphicsLinearLayout; class MApplicationPageViewPrivate { @@ -28,10 +31,30 @@ class MApplicationPageViewPrivate protected: MApplicationPageView *q_ptr; + MApplicationPage *controller; public: MApplicationPageViewPrivate(); virtual ~MApplicationPageViewPrivate(); + void init(); + + void setWidgetHeight(MWidget *w, qreal height); + QGraphicsLinearLayout *createLayout(); + MWidget *createSpacer(QGraphicsItem *parent); + void propagateOnDisplayChangeEvent(bool visible); + void setCentralWidget(QGraphicsWidget *newCentralWidget); + void updateAutoMarginsForComponents(); + void resetPannableViewportPositionIfNeeded(); + + void _q_onPageStateChanged(); + + MWidget *topSpacer; + MWidget *bottomSpacer; + MWidget *mainWidget; + QGraphicsLinearLayout *mainLayout; + QPointer<QGraphicsWidget> centralWidget; + + QRectF exposedContentRect; }; #endif |