void MPannableViewportScroller::stopScrolling(QGraphicsWidget *widget) { MPannableViewport *viewport = static_cast<MPannableViewport *>(widget); // Scroll to current position. This is effectively same as stopping the animation. viewport->d_func()->scrollTo(viewport->position(), 0); }
MPannableViewport* StatusIndicatorMenuDropDownView::createPannableArea() { // Create pannable area contents statusIndicatorExtensionArea = createVerticalExtensionArea(); QGraphicsLinearLayout *contentLayout = new QGraphicsLinearLayout(Qt::Vertical); contentLayout->setContentsMargins(0, 0, 0, 0); contentLayout->setSpacing(0); contentLayout->addItem(statusIndicatorExtensionArea); MWidgetController *contentWidget = new MStylableWidget; contentWidget->setStyleName("StatusIndicatorMenuContentWidget"); contentWidget->setLayout(contentLayout); QGraphicsLinearLayout *pannableLayout = new QGraphicsLinearLayout(Qt::Vertical); pannableLayout->setContentsMargins(0, 0, 0, 0); pannableLayout->setSpacing(0); pannableLayout->addItem(contentWidget); QGraphicsWidget *closeButtonRow = createCloseButtonRow(); pannableLayout->addItem(closeButtonRow); pannableLayout->addStretch(); // Create a container widget for the pannable area PannedWidgetController *pannedWidget = new PannedWidgetController; pannedWidget->setLayout(pannableLayout); pannedWidget->setBottommostWidget(closeButtonRow); connect(pannedWidget, SIGNAL(positionOrSizeChanged()), this, SLOT(setPannabilityAndLayout())); connect(pannedWidget, SIGNAL(pressedOutSideContents()), controller, SIGNAL(hideRequested())); // Setup the pannable viewport MPannableViewport *pannableViewport = new MPannableViewport; pannableViewport->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); pannableViewport->setWidget(pannedWidget); return pannableViewport; }
StatusIndicatorMenuVerticalView::StatusIndicatorMenuVerticalView(StatusIndicatorMenu *controller) : MSceneWindowView(controller), controller(controller) { // Create an extension area for the top row plugins MApplicationExtensionArea *extensionArea = new MApplicationExtensionArea("com.meego.core.MStatusIndicatorMenuExtensionInterface/1.0"); connect(extensionArea, SIGNAL(extensionInstantiated(MApplicationExtensionInterface*)), controller, SLOT(setStatusIndicatorMenuInterface(MApplicationExtensionInterface*))); connect(extensionArea, SIGNAL(extensionInstantiated(MApplicationExtensionInterface*)), this, SLOT(setExtensionLayoutPosition(MApplicationExtensionInterface*))); extensionArea->setObjectName("StatusIndicatorMenuExtensionArea"); setSafeMode(extensionArea, QFile(CRASH_FILE).exists()); extensionArea->init(); // Add panning to the expension area MPannableViewport* viewport = new MPannableViewport(); viewport->setWidget(extensionArea); viewport->setVerticalPanningPolicy(MPannableWidget::PanningAsNeeded); viewport->setStyleName("StatusIndicatorMenuViewport"); viewport->positionIndicator()->setStyleName("CommonPositionIndicatorInverted"); // Put the extension area to a horizontal layout QGraphicsLinearLayout *vlayout = new QGraphicsLinearLayout(Qt::Vertical); vlayout->setContentsMargins(0, 0, 0, 0); vlayout->setSpacing(0); vlayout->addItem(viewport); // Add a separator line on the bottom of the menu MStylableWidget *bottomSeparator = new MStylableWidget; bottomSeparator->setStyleName("StatusIndicatorMenuBottomSeparator"); bottomSeparator->setLayoutPosition(M::VerticalTopPosition); vlayout->addItem(bottomSeparator); // Create a container widget for extension area and settings button layout containerWidget = new MStylableWidget; containerWidget->setStyleName("StatusIndicatorMenuExtensionAreaWidget"); containerWidget->setLayout(vlayout); QGraphicsLinearLayout *hlayout = new QGraphicsLinearLayout(Qt::Horizontal); hlayout->setContentsMargins(0, 0, 0, 0); hlayout->setSpacing(0); hlayout->addStretch(); hlayout->addItem(containerWidget); hlayout->addStretch(); // Add a separator line on the right of the menu MStylableWidget *rightSeparator = new MStylableWidget; rightSeparator->setStyleName("StatusIndicatorMenuRightSeparator"); rightSeparator->setLayoutPosition(M::HorizontalLeftPosition); hlayout->addItem(rightSeparator); controller->setLayout(hlayout); containerWidget->installEventFilter(this); }
void MPannableViewportScroller::applyScrolling(QGraphicsWidget *widget, const QPoint &contentsOffset, int duration, const QEasingCurve &easingCurve) { MPannableViewport *viewport = static_cast<MPannableViewport *>(widget); viewport->d_func()->scrollTo(viewport->position() - contentsOffset, duration, easingCurve); // Disables kinetic scrolling until next pointer event. viewport->physics()->stop(); //TODO: After scrolling of every widget the topmost pannable viewport should make sure its range // covers at least the sip. }
void Ut_MListView::initTestCase() { static char *app_name[1] = { (char *) "./ut_mlistview" }; static int argc = 1; app = new MApplication(argc, app_name); MPannableViewport *viewport = new MPannableViewport(); viewport->resize(50, 100); MList *controller = new MList(viewport); m_subject = new MListView(controller); MListModel *model = new MListModel(); model->setShowGroups(true); QStandardItemModel *itemModel = new QStandardItemModel(4, 2); for (int row = 0; row < itemModel->rowCount(); ++row) { for (int column = 0; column < itemModel->columnCount(); ++column) { QStandardItem *item = new QStandardItem( QString("row %0, column %1").arg(row).arg(column)); itemModel->setItem(row, column, item); } } QItemSelectionModel *selectionModel = new QItemSelectionModel(itemModel); controller->setSelectionModel(selectionModel); controller->setItemModel(itemModel); model->setSelectionModel(selectionModel); m_dummyWidget = new MDummyTestWidget(); connect(m_dummyWidget, SIGNAL(itemClickSignal()), m_subject, SLOT(itemClick())); model->setItemModel(itemModel); m_subject->setModel(model); m_subject->init(); }
void CreateEditPage::createContent(void) { MApplicationPage::createContent(); setStyleName("CommonApplicationPage"); setPannable(false); createActions(); QGraphicsAnchorLayout *anchor = new QGraphicsAnchorLayout(); anchor->setContentsMargins(0, 0, 0, 0); anchor->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); ViewHeader *header = new ViewHeader(m_tag == TagStorage::NULL_TAG ? tr("Create tag contents") : tr("Edit tag contents")); anchor->addCornerAnchors(header, Qt::TopLeftCorner, anchor, Qt::TopLeftCorner); #ifdef LABEL_SIZE m_size = new MLabel(); m_size->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); m_size->setAlignment(Qt::AlignRight); anchor->addAnchor(m_size, Qt::AnchorBottom, anchor, Qt::AnchorBottom); anchor->addAnchor(m_size, Qt::AnchorRight, anchor, Qt::AnchorRight); #endif MWidget *layoutContainer = new MWidget(); layoutContainer->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); m_layout = new QGraphicsLinearLayout(Qt::Vertical, layoutContainer); m_layout->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); m_name = new LabeledTextEdit(tr("Ok"), LabeledTextEdit::SingleLineEditAndLabel); m_name->setLabel(tr("Tag name")); m_name->setPrompt(tr("Enter tag name")); m_name->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); m_layout->addItem(m_name); m_layout->setAlignment(m_name, Qt::AlignLeft); connect(m_name, SIGNAL(contentsChanged(void)), this, SLOT(nameChanged(void))); MSeparator *sep = new MSeparator; sep->setStyleName("CommonHorizontalSeparator"); sep->setOrientation(Qt::Horizontal); layout()->addItem(sep); createPageSpecificContent(); MPannableViewport *view = new MPannableViewport(); view->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); view->setPanDirection(Qt::Vertical); view->setMinimumSize(100, 100); view->setWidget(layoutContainer); anchor->addAnchor(view, Qt::AnchorTop, header, Qt::AnchorBottom); #ifdef LABEL_SIZE anchor->addAnchor(view, Qt::AnchorBottom, m_size, Qt::AnchorTop); #else anchor->addAnchor(view, Qt::AnchorBottom, anchor, Qt::AnchorBottom); #endif anchor->addAnchor(view, Qt::AnchorLeft, anchor, Qt::AnchorLeft); anchor->addAnchor(view, Qt::AnchorRight, anchor, Qt::AnchorRight); centralWidget()->setLayout(anchor); if (m_tag == TagStorage::NULL_TAG) { setContentValidity(false); setNameValidity(false); setupNewData(); } else { load(); } }