| Home · All Namespaces · All Classes |
00001 /*************************************************************************** 00002 ** 00003 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 00004 ** All rights reserved. 00005 ** Contact: Nokia Corporation (directui@nokia.com) 00006 ** 00007 ** This file is part of mhome. 00008 ** 00009 ** If you have questions regarding the use of this file, please contact 00010 ** Nokia at directui@nokia.com. 00011 ** 00012 ** This library is free software; you can redistribute it and/or 00013 ** modify it under the terms of the GNU Lesser General Public 00014 ** License version 2.1 as published by the Free Software Foundation 00015 ** and appearing in the file LICENSE.LGPL included in the packaging 00016 ** of this file. 00017 ** 00018 ****************************************************************************/ 00019 #include <mwidgetview.h> 00020 #include "pagedviewport.h" 00021 #include "pagedpanning.h" 00022 #include "pagedviewportstyle.h" 00023 #include "mpositionindicator.h" 00024 #include "pagepositionindicator.h" 00025 #include <QGraphicsLinearLayout> 00026 00027 #include <MWidgetCreator> 00028 M_REGISTER_WIDGET(PagedViewport) 00029 00030 PagedViewport::PagedViewport(QGraphicsItem *parent) : 00031 MPannableViewport(parent), 00032 previousPage(0), 00033 layoutVisualizationWrapper(NULL) 00034 { 00035 // The strategy will be deleted by the pannable viewport 00036 pagedPanning = new PagedPanning(this); 00037 setPhysics(pagedPanning); 00038 connect(pagedPanning, SIGNAL(pageChanged(int)), this, SIGNAL(pageChanged(int))); 00039 setPanDirection(Qt::Horizontal); 00040 00041 PagePositionIndicator *positionIndicator = new PagePositionIndicator(); 00042 connect(this, SIGNAL(pageCountChanged(int)), positionIndicator, SLOT(setPageCount(int))); 00043 connect(this, SIGNAL(pageChanged(int)), positionIndicator, SLOT(setFocusedPage(int))); 00044 setPositionIndicator(positionIndicator); 00045 00046 connect(pagedPanning, SIGNAL(pageIsPanning(bool)), positionIndicator, SIGNAL(pageIsPanning(bool))); 00047 00048 emit pageChanged(0); 00049 } 00050 00051 PagedViewport::~PagedViewport() 00052 { 00053 } 00054 00055 void PagedViewport::setPanDirection(const Qt::Orientations &) 00056 { 00057 MPannableViewport::setPanDirection(Qt::Horizontal); 00058 } 00059 00060 void PagedViewport::panToPage(uint page) 00061 { 00062 pagedPanning->panToPage(page); 00063 } 00064 00065 void PagedViewport::setPage(uint page) 00066 { 00067 pagedPanning->setPage(page); 00068 previousPage = pagedPanning->activePage(); 00069 } 00070 00071 void PagedViewport::focusFirstPage() 00072 { 00073 //TODO: add support for setting position to the right-most page 00074 // when using right-to-left layout 00075 pagedPanning->setPage(0); 00076 } 00077 00078 void PagedViewport::updatePageCount(int pages) 00079 { 00080 pagedPanning->setPageCount(pages); 00081 emit pageCountChanged(pages); 00082 } 00083 00084 int PagedViewport::currentPage() const 00085 { 00086 return pagedPanning->activePage(); 00087 } 00088 00089 int PagedViewport::targetPage() const 00090 { 00091 return pagedPanning->targetPage(); 00092 } 00093 00094 float PagedViewport::pageWidth() const 00095 { 00096 return pagedPanning->pageWidth(); 00097 } 00098 00099 void PagedViewport::setPageWrapMode(bool enable) 00100 { 00101 pagedPanning->setPageWrapMode(enable); 00102 00103 if (enable) { 00104 QGraphicsWidget *pannableWidget = widget(); 00105 if (pannableWidget) { 00106 QGraphicsLinearLayout *pannableLayout = dynamic_cast<QGraphicsLinearLayout*>(pannableWidget->layout()); 00107 if (pannableLayout) { 00108 layoutVisualizationWrapper = QSharedPointer<LayoutVisualizationWrapper>(new LayoutVisualizationWrapper(*pannableLayout)); 00109 updateVisualizationWrapper(); 00110 // Multiple signals are monitored to control the visualization wrapper 00111 // - panningStopped signal when rotation happens while panning 00112 connect(this, SIGNAL(panningStopped()), SLOT(updateVisualizationWrapper())); 00113 // - pageChanged signal when panning between pages without wrapping 00114 connect(this, SIGNAL(pageChanged(int)), SLOT(newPageSet(int))); 00115 // - pageWrapped signal when panning from first page to last or vice-versa via page wrapping 00116 connect(physics(), SIGNAL(pageWrapped()), SLOT(updateVisualizationWrapper())); 00117 } 00118 } 00119 } else { 00120 layoutVisualizationWrapper = QSharedPointer<LayoutVisualizationWrapper>(NULL); 00121 disconnect(SIGNAL(panningStopped()), this, SLOT(updateVisualizationWrapper())); 00122 disconnect(SIGNAL(pageChanged(int)), this, SLOT(newPageSet(int))); 00123 disconnect(physics(), SIGNAL(pageWrapped()), this, SLOT(updateVisualizationWrapper())); 00124 } 00125 } 00126 00127 void PagedViewport::newPageSet(int newPage) 00128 { 00129 const int firstPageIndex = 0; 00130 const int lastPageIndex = pagedPanning->pageCount() - 1; 00131 if (!((previousPage == firstPageIndex && newPage == lastPageIndex) || 00132 (previousPage == lastPageIndex && newPage == firstPageIndex))) { 00133 updateVisualizationWrapper(); 00134 } 00135 00136 previousPage = newPage; 00137 } 00138 00139 void PagedViewport::updateVisualizationWrapper() 00140 { 00141 if (layoutVisualizationWrapper.isNull()) { 00142 return; 00143 } 00144 00145 int currentTargetPage = targetPage(); 00146 00147 if (currentTargetPage == 0) { 00148 // First page 00149 layoutVisualizationWrapper->setWrappingMode(LayoutVisualizationWrapper::WrapRightEdgeToLeft); 00150 } else if (currentTargetPage == pagedPanning->pageCount() - 1) { 00151 // Last page 00152 layoutVisualizationWrapper->setWrappingMode(LayoutVisualizationWrapper::WrapLeftEdgeToRight); 00153 } else { 00154 // Middle page 00155 layoutVisualizationWrapper->setWrappingMode(LayoutVisualizationWrapper::NoWrap); 00156 } 00157 }
| Copyright © 2010 Nokia Corporation | Generated on Thu Nov 4 2010 18:20:42 Doxygen 1.7.1 |
MeeGo Touch |