Home · All Classes · Main Classes · Deprecated

mgriditemview.cpp

Go to the documentation of this file.
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 libmeegotouch.
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 
00020 #include "mgriditemview.h"
00021 #include "mgriditemview_p.h"
00022 #include "mgriditem.h"
00023 
00024 #include "mscalableimage.h"
00025 #include "mtheme.h"
00026 #include "mimagewidget.h"
00027 #include "mlabel.h"
00028 #include "mviewcreator.h"
00029 
00030 #include <MButton>
00031 
00032 #include <QGraphicsGridLayout>
00033 #include <QDebug>
00034 
00035 MGridItemViewPrivate::MGridItemViewPrivate()
00036     : q_ptr(0), controller(0), layout(0), title(0), subtitle(0), image(0), layoutDirty(false)
00037 {
00038 }
00039 
00040 MGridItemViewPrivate::~MGridItemViewPrivate()
00041 {
00042 }
00043 
00044 // Use lazy initialize to reduce useless widget and get better performance
00045 void MGridItemViewPrivate::init()
00046 {
00047     layout = new QGraphicsGridLayout();
00048     layout->setContentsMargins(0, 0, 0, 0);
00049     layout->setSpacing(0);
00050     controller->setLayout(layout);
00051 
00052     iconAlign = Qt::AlignLeft;
00053 }
00054 
00055 void MGridItemViewPrivate::initLayout() const
00056 {
00057     int count = layout->count();
00058     for (int i = count - 1; i >= 0; --i)
00059         layout->removeAt(i);
00060 
00061     MGridItemModel *model = (MGridItemModel *)controller->model();
00062     if (!model->imageVisible()) {
00063         // Label
00064         initTitle();
00065         layout->addItem(title, 0, 0);
00066         layout->setAlignment(title,  Qt::AlignVCenter | Qt::AlignHCenter);
00067     } else {
00068         if (!model->titleVisible() && !model->subtitleVisible()) {
00069             // Image
00070             initImage();
00071             layout->addItem(image, 0, 0);
00072             layout->setAlignment(image,  Qt::AlignVCenter | Qt::AlignHCenter);
00073         } else if (!model->subtitleVisible()) {
00074             // ImageLabel
00075             initTitle();
00076             initImage();
00077 
00078             if (iconAlign == Qt::AlignLeft) {
00079                 layout->addItem(image, 0, 0);
00080                 layout->addItem(title, 0, 1);
00081             } else {
00082                 layout->addItem(title, 0, 0);
00083                 layout->addItem(image, 0, 1);
00084             }
00085         } else {
00086             // Grid Item
00087             initTitle();
00088             initSubtitle();
00089             initImage();
00090 
00091             if (iconAlign == Qt::AlignLeft) {
00092                 layout->addItem(image, 0, 0, 2, 1);
00093                 layout->addItem(title, 0, 1);
00094                 layout->addItem(subtitle, 1, 1);
00095             } else {
00096                 layout->addItem(image, 0, 1, 2, 1);
00097                 layout->addItem(title, 0, 0);
00098                 layout->addItem(subtitle, 1, 0);
00099             }
00100         }
00101     }
00102 
00103     layoutDirty = false;
00104 }
00105 
00106 void MGridItemViewPrivate::initTitle() const
00107 {
00108     if (title == 0) {
00109         title = new MLabel();
00110         title->setObjectName("MGridItemTitle");
00111     }
00112 }
00113 
00114 void MGridItemViewPrivate::initSubtitle() const
00115 {
00116     if (subtitle == 0) {
00117         subtitle = new MLabel();
00118         subtitle->setObjectName("MGridItemSubtitle");
00119     }
00120 }
00121 
00122 void MGridItemViewPrivate::initImage() const
00123 {
00124     if (image == 0) {
00125         image = new MImageWidget();
00126         image->setObjectName("MGridItemImage");
00127     }
00128 }
00129 
00130 void MGridItemViewPrivate::setTitle(const QString &text)
00131 {
00132     if (text.isEmpty()) return;
00133     initTitle();
00134     title->setText(text);
00135 }
00136 
00137 void MGridItemViewPrivate::setSubtitle(const QString &text)
00138 {
00139     if (text.isEmpty()) return;
00140     initSubtitle();
00141     subtitle->setText(text);
00142 }
00143 
00144 void MGridItemViewPrivate::setImage(const QString &name)
00145 {
00146     if (name.isEmpty() && controller->pixmap().isNull()) return;
00147 
00148     Q_Q(MGridItemView);
00149     initImage();
00150 
00151     if (name.isEmpty())
00152         image->setPixmap(controller->pixmap());
00153     else
00154         image->setImage(name, q->style()->iconSize());
00155 }
00156 
00157 void MGridItemViewPrivate::_q_updateImage()
00158 {
00159     initImage();
00160     image->setPixmap(controller->pixmap());
00161 }
00162 
00163 MGridItemView::MGridItemView(MGridItem *controller) :
00164     MWidgetView(controller),
00165     d_ptr(new MGridItemViewPrivate)
00166 {
00167     Q_D(MGridItemView);
00168     d->q_ptr = this;
00169     d->controller = controller;
00170     d->init();
00171 
00172     connect(controller, SIGNAL(pixmapChanged()), this, SLOT(_q_updateImage()));
00173 }
00174 
00175 MGridItemView::MGridItemView(MGridItemViewPrivate &dd, MGridItem *controller) :
00176     MWidgetView(controller),
00177     d_ptr(&dd)
00178 {
00179     Q_D(MGridItemView);
00180     d->q_ptr = this;
00181     d->controller = controller;
00182     d->init();
00183 
00184     connect(controller, SIGNAL(pixmapChanged()), this, SLOT(_q_updateImage()));
00185 }
00186 
00187 MGridItemView::~MGridItemView()
00188 {
00189     delete d_ptr;
00190 }
00191 
00192 void MGridItemView::applyStyle()
00193 {
00194     Q_D(MGridItemView);
00195 
00196     MWidgetView::applyStyle();
00197 
00198     // change the icon Alignment
00199     if (d->iconAlign != style()->iconAlign()) {
00200         d->iconAlign = style()->iconAlign();
00201         d->layoutDirty = true;
00202     }
00203 }
00204 
00205 void MGridItemView::drawContents(QPainter *painter, const QStyleOptionGraphicsItem *option) const
00206 {
00207     Q_D(const MGridItemView);
00208     if (d->layoutDirty)
00209         d->initLayout();
00210 
00211     MWidgetView::drawContents(painter, option);
00212 }
00213 
00214 void MGridItemView::updateData(const QList<const char *>& modifications)
00215 {
00216     Q_D(MGridItemView);
00217 
00218     MWidgetView::updateData(modifications);
00219 
00220     const char *member;
00221     const int count = modifications.count();
00222     for (int i = 0; i < count; ++i) {
00223         member = modifications[i];
00224 
00225         if (member == MGridItemModel::Image) {
00226             d->setImage(model()->image());
00227         } else if (member == MGridItemModel::Title) {
00228             d->setTitle(model()->title());
00229         } else if (member == MGridItemModel::Subtitle) {
00230             d->setSubtitle(model()->subtitle());
00231         } else if (member == MGridItemModel::ImageVisible || member == MGridItemModel::TitleVisible ||
00232                    member == MGridItemModel::SubtitleVisible) {
00233             d->layoutDirty = true;
00234         }
00235     }
00236 }
00237 
00238 void MGridItemView::setupModel()
00239 {
00240     Q_D(MGridItemView);
00241     MWidgetView::setupModel();
00242 
00243     d->setTitle(model()->title());
00244     d->setSubtitle(model()->subtitle());
00245     d->setImage(model()->image());
00246     d->layoutDirty = true;
00247 }
00248 
00249 M_REGISTER_VIEW_NEW(MGridItemView, MGridItem)
00250 
00251 #include "moc_mgriditemview.cpp"
00252 

Copyright © 2010 Nokia Corporation Generated on Thu Nov 4 2010 18:14:20 (PDT)
Doxygen 1.7.1
MeeGo Touch