examples/graphicsview/diagramscene/mainwindow.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the examples of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include <QtGui>
       
    43 #include <QLabel>
       
    44 
       
    45 #include "mainwindow.h"
       
    46 #include "diagramitem.h"
       
    47 #include "diagramscene.h"
       
    48 #include "diagramtextitem.h"
       
    49 
       
    50 const int InsertTextButton = 10;
       
    51 
       
    52 //! [0]
       
    53 MainWindow::MainWindow()
       
    54 {
       
    55     createActions();
       
    56     createToolBox();
       
    57     createMenus();
       
    58 
       
    59     scene = new DiagramScene(itemMenu);
       
    60     scene->setSceneRect(QRectF(0, 0, 5000, 5000));
       
    61     connect(scene, SIGNAL(itemInserted(DiagramItem *)),
       
    62             this, SLOT(itemInserted(DiagramItem *)));
       
    63     connect(scene, SIGNAL(textInserted(QGraphicsTextItem *)),
       
    64         this, SLOT(textInserted(QGraphicsTextItem *)));
       
    65     connect(scene, SIGNAL(itemSelected(QGraphicsItem *)),
       
    66         this, SLOT(itemSelected(QGraphicsItem *)));
       
    67     createToolbars();
       
    68 
       
    69     QHBoxLayout *layout = new QHBoxLayout;
       
    70     layout->addWidget(toolBox);
       
    71     view = new QGraphicsView(scene);
       
    72     layout->addWidget(view);
       
    73 
       
    74     QWidget *widget = new QWidget;
       
    75     widget->setLayout(layout);
       
    76 
       
    77     setCentralWidget(widget);
       
    78     setWindowTitle(tr("Diagramscene"));
       
    79     setUnifiedTitleAndToolBarOnMac(true);
       
    80 }
       
    81 //! [0]
       
    82 
       
    83 //! [1]
       
    84 void MainWindow::backgroundButtonGroupClicked(QAbstractButton *button)
       
    85 {
       
    86     QList<QAbstractButton *> buttons = backgroundButtonGroup->buttons();
       
    87     foreach (QAbstractButton *myButton, buttons) {
       
    88     if (myButton != button)
       
    89         button->setChecked(false);
       
    90     }
       
    91     QString text = button->text();
       
    92     if (text == tr("Blue Grid"))
       
    93         scene->setBackgroundBrush(QPixmap(":/images/background1.png"));
       
    94     else if (text == tr("White Grid"))
       
    95         scene->setBackgroundBrush(QPixmap(":/images/background2.png"));
       
    96     else if (text == tr("Gray Grid"))
       
    97         scene->setBackgroundBrush(QPixmap(":/images/background3.png"));
       
    98     else
       
    99         scene->setBackgroundBrush(QPixmap(":/images/background4.png"));
       
   100 
       
   101     scene->update();
       
   102     view->update();
       
   103 }
       
   104 //! [1]
       
   105 
       
   106 //! [2]
       
   107 void MainWindow::buttonGroupClicked(int id)
       
   108 {
       
   109     QList<QAbstractButton *> buttons = buttonGroup->buttons();
       
   110     foreach (QAbstractButton *button, buttons) {
       
   111     if (buttonGroup->button(id) != button)
       
   112         button->setChecked(false);
       
   113     }
       
   114     if (id == InsertTextButton) {
       
   115         scene->setMode(DiagramScene::InsertText);
       
   116     } else {
       
   117         scene->setItemType(DiagramItem::DiagramType(id));
       
   118         scene->setMode(DiagramScene::InsertItem);
       
   119     }
       
   120 }
       
   121 //! [2]
       
   122 
       
   123 //! [3]
       
   124 void MainWindow::deleteItem()
       
   125 {
       
   126     foreach (QGraphicsItem *item, scene->selectedItems()) {
       
   127         if (item->type() == DiagramItem::Type) {
       
   128             qgraphicsitem_cast<DiagramItem *>(item)->removeArrows();
       
   129         }
       
   130         scene->removeItem(item);
       
   131     }
       
   132 }
       
   133 //! [3]
       
   134 
       
   135 //! [4]
       
   136 void MainWindow::pointerGroupClicked(int)
       
   137 {
       
   138     scene->setMode(DiagramScene::Mode(pointerTypeGroup->checkedId()));
       
   139 }
       
   140 //! [4]
       
   141 
       
   142 //! [5]
       
   143 void MainWindow::bringToFront()
       
   144 {
       
   145     if (scene->selectedItems().isEmpty())
       
   146         return;
       
   147 
       
   148     QGraphicsItem *selectedItem = scene->selectedItems().first();
       
   149     QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
       
   150 
       
   151     qreal zValue = 0;
       
   152     foreach (QGraphicsItem *item, overlapItems) {
       
   153         if (item->zValue() >= zValue &&
       
   154             item->type() == DiagramItem::Type)
       
   155             zValue = item->zValue() + 0.1;
       
   156     }
       
   157     selectedItem->setZValue(zValue);
       
   158 }
       
   159 //! [5]
       
   160 
       
   161 //! [6]
       
   162 void MainWindow::sendToBack()
       
   163 {
       
   164     if (scene->selectedItems().isEmpty())
       
   165         return;
       
   166 
       
   167     QGraphicsItem *selectedItem = scene->selectedItems().first();
       
   168     QList<QGraphicsItem *> overlapItems = selectedItem->collidingItems();
       
   169 
       
   170     qreal zValue = 0;
       
   171     foreach (QGraphicsItem *item, overlapItems) {
       
   172         if (item->zValue() <= zValue &&
       
   173             item->type() == DiagramItem::Type)
       
   174             zValue = item->zValue() - 0.1;
       
   175     }
       
   176     selectedItem->setZValue(zValue);
       
   177 }
       
   178 //! [6]
       
   179 
       
   180 //! [7]
       
   181 void MainWindow::itemInserted(DiagramItem *item)
       
   182 {
       
   183     pointerTypeGroup->button(int(DiagramScene::MoveItem))->setChecked(true);
       
   184     scene->setMode(DiagramScene::Mode(pointerTypeGroup->checkedId()));
       
   185     buttonGroup->button(int(item->diagramType()))->setChecked(false);
       
   186 }
       
   187 //! [7]
       
   188 
       
   189 //! [8]
       
   190 void MainWindow::textInserted(QGraphicsTextItem *)
       
   191 {
       
   192     buttonGroup->button(InsertTextButton)->setChecked(false);
       
   193     scene->setMode(DiagramScene::Mode(pointerTypeGroup->checkedId()));
       
   194 }
       
   195 //! [8]
       
   196 
       
   197 //! [9]
       
   198 void MainWindow::currentFontChanged(const QFont &)
       
   199 {
       
   200     handleFontChange();
       
   201 }
       
   202 //! [9]
       
   203 
       
   204 //! [10]
       
   205 void MainWindow::fontSizeChanged(const QString &)
       
   206 {
       
   207     handleFontChange();
       
   208 }
       
   209 //! [10]
       
   210 
       
   211 //! [11]
       
   212 void MainWindow::sceneScaleChanged(const QString &scale)
       
   213 {
       
   214     double newScale = scale.left(scale.indexOf(tr("%"))).toDouble() / 100.0;
       
   215     QMatrix oldMatrix = view->matrix();
       
   216     view->resetMatrix();
       
   217     view->translate(oldMatrix.dx(), oldMatrix.dy());
       
   218     view->scale(newScale, newScale);
       
   219 }
       
   220 //! [11]
       
   221 
       
   222 //! [12]
       
   223 void MainWindow::textColorChanged()
       
   224 {
       
   225     textAction = qobject_cast<QAction *>(sender());
       
   226     fontColorToolButton->setIcon(createColorToolButtonIcon(
       
   227                 ":/images/textpointer.png",
       
   228                 qVariantValue<QColor>(textAction->data())));
       
   229     textButtonTriggered();
       
   230 }
       
   231 //! [12]
       
   232 
       
   233 //! [13]
       
   234 void MainWindow::itemColorChanged()
       
   235 {
       
   236     fillAction = qobject_cast<QAction *>(sender());
       
   237     fillColorToolButton->setIcon(createColorToolButtonIcon(
       
   238                  ":/images/floodfill.png",
       
   239                  qVariantValue<QColor>(fillAction->data())));
       
   240     fillButtonTriggered();
       
   241 }
       
   242 //! [13]
       
   243 
       
   244 //! [14]
       
   245 void MainWindow::lineColorChanged()
       
   246 {
       
   247     lineAction = qobject_cast<QAction *>(sender());
       
   248     lineColorToolButton->setIcon(createColorToolButtonIcon(
       
   249                  ":/images/linecolor.png",
       
   250                  qVariantValue<QColor>(lineAction->data())));
       
   251     lineButtonTriggered();
       
   252 }
       
   253 //! [14]
       
   254 
       
   255 //! [15]
       
   256 void MainWindow::textButtonTriggered()
       
   257 {
       
   258     scene->setTextColor(qVariantValue<QColor>(textAction->data()));
       
   259 }
       
   260 //! [15]
       
   261 
       
   262 //! [16]
       
   263 void MainWindow::fillButtonTriggered()
       
   264 {
       
   265     scene->setItemColor(qVariantValue<QColor>(fillAction->data()));
       
   266 }
       
   267 //! [16]
       
   268 
       
   269 //! [17]
       
   270 void MainWindow::lineButtonTriggered()
       
   271 {
       
   272     scene->setLineColor(qVariantValue<QColor>(lineAction->data()));
       
   273 }
       
   274 //! [17]
       
   275 
       
   276 //! [18]
       
   277 void MainWindow::handleFontChange()
       
   278 {
       
   279     QFont font = fontCombo->currentFont();
       
   280     font.setPointSize(fontSizeCombo->currentText().toInt());
       
   281     font.setWeight(boldAction->isChecked() ? QFont::Bold : QFont::Normal);
       
   282     font.setItalic(italicAction->isChecked());
       
   283     font.setUnderline(underlineAction->isChecked());
       
   284 
       
   285     scene->setFont(font);
       
   286 }
       
   287 //! [18]
       
   288 
       
   289 //! [19]
       
   290 void MainWindow::itemSelected(QGraphicsItem *item)
       
   291 {
       
   292     DiagramTextItem *textItem =
       
   293     qgraphicsitem_cast<DiagramTextItem *>(item);
       
   294 
       
   295     QFont font = textItem->font();
       
   296     QColor color = textItem->defaultTextColor();
       
   297     fontCombo->setCurrentFont(font);
       
   298     fontSizeCombo->setEditText(QString().setNum(font.pointSize()));
       
   299     boldAction->setChecked(font.weight() == QFont::Bold);
       
   300     italicAction->setChecked(font.italic());
       
   301     underlineAction->setChecked(font.underline());
       
   302 }
       
   303 //! [19]
       
   304 
       
   305 //! [20]
       
   306 void MainWindow::about()
       
   307 {
       
   308     QMessageBox::about(this, tr("About Diagram Scene"),
       
   309                        tr("The <b>Diagram Scene</b> example shows "
       
   310                           "use of the graphics framework."));
       
   311 }
       
   312 //! [20]
       
   313 
       
   314 //! [21]
       
   315 void MainWindow::createToolBox()
       
   316 {
       
   317     buttonGroup = new QButtonGroup;
       
   318     buttonGroup->setExclusive(false);
       
   319     connect(buttonGroup, SIGNAL(buttonClicked(int)),
       
   320             this, SLOT(buttonGroupClicked(int)));
       
   321     QGridLayout *layout = new QGridLayout;
       
   322     layout->addWidget(createCellWidget(tr("Conditional"),
       
   323                                DiagramItem::Conditional), 0, 0);
       
   324     layout->addWidget(createCellWidget(tr("Process"),
       
   325                       DiagramItem::Step),0, 1);
       
   326     layout->addWidget(createCellWidget(tr("Input/Output"),
       
   327                       DiagramItem::Io), 1, 0);
       
   328 //! [21]
       
   329 
       
   330     QToolButton *textButton = new QToolButton;
       
   331     textButton->setCheckable(true);
       
   332     buttonGroup->addButton(textButton, InsertTextButton);
       
   333     textButton->setIcon(QIcon(QPixmap(":/images/textpointer.png")
       
   334                         .scaled(30, 30)));
       
   335     textButton->setIconSize(QSize(50, 50));
       
   336     QGridLayout *textLayout = new QGridLayout;
       
   337     textLayout->addWidget(textButton, 0, 0, Qt::AlignHCenter);
       
   338     textLayout->addWidget(new QLabel(tr("Text")), 1, 0, Qt::AlignCenter);
       
   339     QWidget *textWidget = new QWidget;
       
   340     textWidget->setLayout(textLayout);
       
   341     layout->addWidget(textWidget, 1, 1);
       
   342 
       
   343     layout->setRowStretch(3, 10);
       
   344     layout->setColumnStretch(2, 10);
       
   345 
       
   346     QWidget *itemWidget = new QWidget;
       
   347     itemWidget->setLayout(layout);
       
   348 
       
   349     backgroundButtonGroup = new QButtonGroup;
       
   350     connect(backgroundButtonGroup, SIGNAL(buttonClicked(QAbstractButton *)),
       
   351             this, SLOT(backgroundButtonGroupClicked(QAbstractButton *)));
       
   352 
       
   353     QGridLayout *backgroundLayout = new QGridLayout;
       
   354     backgroundLayout->addWidget(createBackgroundCellWidget(tr("Blue Grid"),
       
   355                 ":/images/background1.png"), 0, 0);
       
   356     backgroundLayout->addWidget(createBackgroundCellWidget(tr("White Grid"),
       
   357                 ":/images/background2.png"), 0, 1);
       
   358     backgroundLayout->addWidget(createBackgroundCellWidget(tr("Gray Grid"),
       
   359                     ":/images/background3.png"), 1, 0);
       
   360     backgroundLayout->addWidget(createBackgroundCellWidget(tr("No Grid"),
       
   361                 ":/images/background4.png"), 1, 1);
       
   362 
       
   363     backgroundLayout->setRowStretch(2, 10);
       
   364     backgroundLayout->setColumnStretch(2, 10);
       
   365 
       
   366     QWidget *backgroundWidget = new QWidget;
       
   367     backgroundWidget->setLayout(backgroundLayout);
       
   368 
       
   369 
       
   370 //! [22]
       
   371     toolBox = new QToolBox;
       
   372     toolBox->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Ignored));
       
   373     toolBox->setMinimumWidth(itemWidget->sizeHint().width());
       
   374     toolBox->addItem(itemWidget, tr("Basic Flowchart Shapes"));
       
   375     toolBox->addItem(backgroundWidget, tr("Backgrounds"));
       
   376 }
       
   377 //! [22]
       
   378 
       
   379 //! [23]
       
   380 void MainWindow::createActions()
       
   381 {
       
   382     toFrontAction = new QAction(QIcon(":/images/bringtofront.png"),
       
   383                                 tr("Bring to &Front"), this);
       
   384     toFrontAction->setShortcut(tr("Ctrl+F"));
       
   385     toFrontAction->setStatusTip(tr("Bring item to front"));
       
   386     connect(toFrontAction, SIGNAL(triggered()),
       
   387             this, SLOT(bringToFront()));
       
   388 //! [23]
       
   389 
       
   390     sendBackAction = new QAction(QIcon(":/images/sendtoback.png"),
       
   391                                  tr("Send to &Back"), this);
       
   392     sendBackAction->setShortcut(tr("Ctrl+B"));
       
   393     sendBackAction->setStatusTip(tr("Send item to back"));
       
   394     connect(sendBackAction, SIGNAL(triggered()),
       
   395         this, SLOT(sendToBack()));
       
   396 
       
   397     deleteAction = new QAction(QIcon(":/images/delete.png"),
       
   398                                tr("&Delete"), this);
       
   399     deleteAction->setShortcut(tr("Delete"));
       
   400     deleteAction->setStatusTip(tr("Delete item from diagram"));
       
   401     connect(deleteAction, SIGNAL(triggered()),
       
   402         this, SLOT(deleteItem()));
       
   403 
       
   404     exitAction = new QAction(tr("E&xit"), this);
       
   405     exitAction->setShortcuts(QKeySequence::Quit);
       
   406     exitAction->setStatusTip(tr("Quit Scenediagram example"));
       
   407     connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
       
   408 
       
   409     boldAction = new QAction(tr("Bold"), this);
       
   410     boldAction->setCheckable(true);
       
   411     QPixmap pixmap(":/images/bold.png");
       
   412     boldAction->setIcon(QIcon(pixmap));
       
   413     boldAction->setShortcut(tr("Ctrl+B"));
       
   414     connect(boldAction, SIGNAL(triggered()),
       
   415             this, SLOT(handleFontChange()));
       
   416 
       
   417     italicAction = new QAction(QIcon(":/images/italic.png"),
       
   418                                tr("Italic"), this);
       
   419     italicAction->setCheckable(true);
       
   420     italicAction->setShortcut(tr("Ctrl+I"));
       
   421     connect(italicAction, SIGNAL(triggered()),
       
   422             this, SLOT(handleFontChange()));
       
   423 
       
   424     underlineAction = new QAction(QIcon(":/images/underline.png"),
       
   425                                   tr("Underline"), this);
       
   426     underlineAction->setCheckable(true);
       
   427     underlineAction->setShortcut(tr("Ctrl+U"));
       
   428     connect(underlineAction, SIGNAL(triggered()),
       
   429             this, SLOT(handleFontChange()));
       
   430 
       
   431     aboutAction = new QAction(tr("A&bout"), this);
       
   432     aboutAction->setShortcut(tr("Ctrl+B"));
       
   433     connect(aboutAction, SIGNAL(triggered()),
       
   434             this, SLOT(about()));
       
   435 }
       
   436 
       
   437 //! [24]
       
   438 void MainWindow::createMenus()
       
   439 {
       
   440     fileMenu = menuBar()->addMenu(tr("&File"));
       
   441     fileMenu->addAction(exitAction);
       
   442 
       
   443     itemMenu = menuBar()->addMenu(tr("&Item"));
       
   444     itemMenu->addAction(deleteAction);
       
   445     itemMenu->addSeparator();
       
   446     itemMenu->addAction(toFrontAction);
       
   447     itemMenu->addAction(sendBackAction);
       
   448 
       
   449     aboutMenu = menuBar()->addMenu(tr("&Help"));
       
   450     aboutMenu->addAction(aboutAction);
       
   451 }
       
   452 //! [24]
       
   453 
       
   454 //! [25]
       
   455 void MainWindow::createToolbars()
       
   456 {
       
   457 //! [25]
       
   458     editToolBar = addToolBar(tr("Edit"));
       
   459     editToolBar->addAction(deleteAction);
       
   460     editToolBar->addAction(toFrontAction);
       
   461     editToolBar->addAction(sendBackAction);
       
   462 
       
   463     fontCombo = new QFontComboBox();
       
   464     fontSizeCombo = new QComboBox();
       
   465     connect(fontCombo, SIGNAL(currentFontChanged(const QFont &)),
       
   466             this, SLOT(currentFontChanged(const QFont &)));
       
   467 
       
   468     fontSizeCombo = new QComboBox;
       
   469     fontSizeCombo->setEditable(true);
       
   470     for (int i = 8; i < 30; i = i + 2)
       
   471         fontSizeCombo->addItem(QString().setNum(i));
       
   472     QIntValidator *validator = new QIntValidator(2, 64, this);
       
   473     fontSizeCombo->setValidator(validator);
       
   474     connect(fontSizeCombo, SIGNAL(currentIndexChanged(const QString &)),
       
   475             this, SLOT(fontSizeChanged(const QString &)));
       
   476 
       
   477     fontColorToolButton = new QToolButton;
       
   478     fontColorToolButton->setPopupMode(QToolButton::MenuButtonPopup);
       
   479     fontColorToolButton->setMenu(createColorMenu(SLOT(textColorChanged()),
       
   480                                                  Qt::black));
       
   481     textAction = fontColorToolButton->menu()->defaultAction();
       
   482     fontColorToolButton->setIcon(createColorToolButtonIcon(
       
   483     ":/images/textpointer.png", Qt::black));
       
   484     fontColorToolButton->setAutoFillBackground(true);
       
   485     connect(fontColorToolButton, SIGNAL(clicked()),
       
   486             this, SLOT(textButtonTriggered()));
       
   487 
       
   488 //! [26]
       
   489     fillColorToolButton = new QToolButton;
       
   490     fillColorToolButton->setPopupMode(QToolButton::MenuButtonPopup);
       
   491     fillColorToolButton->setMenu(createColorMenu(SLOT(itemColorChanged()),
       
   492                          Qt::white));
       
   493     fillAction = fillColorToolButton->menu()->defaultAction();
       
   494     fillColorToolButton->setIcon(createColorToolButtonIcon(
       
   495     ":/images/floodfill.png", Qt::white));
       
   496     connect(fillColorToolButton, SIGNAL(clicked()),
       
   497             this, SLOT(fillButtonTriggered()));
       
   498 //! [26]
       
   499 
       
   500     lineColorToolButton = new QToolButton;
       
   501     lineColorToolButton->setPopupMode(QToolButton::MenuButtonPopup);
       
   502     lineColorToolButton->setMenu(createColorMenu(SLOT(lineColorChanged()),
       
   503                                  Qt::black));
       
   504     lineAction = lineColorToolButton->menu()->defaultAction();
       
   505     lineColorToolButton->setIcon(createColorToolButtonIcon(
       
   506         ":/images/linecolor.png", Qt::black));
       
   507     connect(lineColorToolButton, SIGNAL(clicked()),
       
   508             this, SLOT(lineButtonTriggered()));
       
   509 
       
   510     textToolBar = addToolBar(tr("Font"));
       
   511     textToolBar->addWidget(fontCombo);
       
   512     textToolBar->addWidget(fontSizeCombo);
       
   513     textToolBar->addAction(boldAction);
       
   514     textToolBar->addAction(italicAction);
       
   515     textToolBar->addAction(underlineAction);
       
   516 
       
   517     colorToolBar = addToolBar(tr("Color"));
       
   518     colorToolBar->addWidget(fontColorToolButton);
       
   519     colorToolBar->addWidget(fillColorToolButton);
       
   520     colorToolBar->addWidget(lineColorToolButton);
       
   521 
       
   522     QToolButton *pointerButton = new QToolButton;
       
   523     pointerButton->setCheckable(true);
       
   524     pointerButton->setChecked(true);
       
   525     pointerButton->setIcon(QIcon(":/images/pointer.png"));
       
   526     QToolButton *linePointerButton = new QToolButton;
       
   527     linePointerButton->setCheckable(true);
       
   528     linePointerButton->setIcon(QIcon(":/images/linepointer.png"));
       
   529 
       
   530     pointerTypeGroup = new QButtonGroup;
       
   531     pointerTypeGroup->addButton(pointerButton, int(DiagramScene::MoveItem));
       
   532     pointerTypeGroup->addButton(linePointerButton,
       
   533                                 int(DiagramScene::InsertLine));
       
   534     connect(pointerTypeGroup, SIGNAL(buttonClicked(int)),
       
   535             this, SLOT(pointerGroupClicked(int)));
       
   536 
       
   537     sceneScaleCombo = new QComboBox;
       
   538     QStringList scales;
       
   539     scales << tr("50%") << tr("75%") << tr("100%") << tr("125%") << tr("150%");
       
   540     sceneScaleCombo->addItems(scales);
       
   541     sceneScaleCombo->setCurrentIndex(2);
       
   542     connect(sceneScaleCombo, SIGNAL(currentIndexChanged(const QString &)),
       
   543             this, SLOT(sceneScaleChanged(const QString &)));
       
   544 
       
   545     pointerToolbar = addToolBar(tr("Pointer type"));
       
   546     pointerToolbar->addWidget(pointerButton);
       
   547     pointerToolbar->addWidget(linePointerButton);
       
   548     pointerToolbar->addWidget(sceneScaleCombo);
       
   549 //! [27]
       
   550 }
       
   551 //! [27]
       
   552 
       
   553 //! [28]
       
   554 QWidget *MainWindow::createBackgroundCellWidget(const QString &text,
       
   555                         const QString &image)
       
   556 {
       
   557     QToolButton *button = new QToolButton;
       
   558     button->setText(text);
       
   559     button->setIcon(QIcon(image));
       
   560     button->setIconSize(QSize(50, 50));
       
   561     button->setCheckable(true);
       
   562     backgroundButtonGroup->addButton(button);
       
   563 
       
   564     QGridLayout *layout = new QGridLayout;
       
   565     layout->addWidget(button, 0, 0, Qt::AlignHCenter);
       
   566     layout->addWidget(new QLabel(text), 1, 0, Qt::AlignCenter);
       
   567 
       
   568     QWidget *widget = new QWidget;
       
   569     widget->setLayout(layout);
       
   570 
       
   571     return widget;
       
   572 }
       
   573 //! [28]
       
   574 
       
   575 //! [29]
       
   576 QWidget *MainWindow::createCellWidget(const QString &text,
       
   577                       DiagramItem::DiagramType type)
       
   578 {
       
   579 
       
   580     DiagramItem item(type, itemMenu);
       
   581     QIcon icon(item.image());
       
   582 
       
   583     QToolButton *button = new QToolButton;
       
   584     button->setIcon(icon);
       
   585     button->setIconSize(QSize(50, 50));
       
   586     button->setCheckable(true);
       
   587     buttonGroup->addButton(button, int(type));
       
   588 
       
   589     QGridLayout *layout = new QGridLayout;
       
   590     layout->addWidget(button, 0, 0, Qt::AlignHCenter);
       
   591     layout->addWidget(new QLabel(text), 1, 0, Qt::AlignCenter);
       
   592 
       
   593     QWidget *widget = new QWidget;
       
   594     widget->setLayout(layout);
       
   595 
       
   596     return widget;
       
   597 }
       
   598 //! [29]
       
   599 
       
   600 //! [30]
       
   601 QMenu *MainWindow::createColorMenu(const char *slot, QColor defaultColor)
       
   602 {
       
   603     QList<QColor> colors;
       
   604     colors << Qt::black << Qt::white << Qt::red << Qt::blue << Qt::yellow;
       
   605     QStringList names;
       
   606     names << tr("black") << tr("white") << tr("red") << tr("blue")
       
   607           << tr("yellow");
       
   608 
       
   609     QMenu *colorMenu = new QMenu;
       
   610     for (int i = 0; i < colors.count(); ++i) {
       
   611         QAction *action = new QAction(names.at(i), this);
       
   612         action->setData(colors.at(i));
       
   613         action->setIcon(createColorIcon(colors.at(i)));
       
   614         connect(action, SIGNAL(triggered()),
       
   615                 this, slot);
       
   616         colorMenu->addAction(action);
       
   617         if (colors.at(i) == defaultColor) {
       
   618             colorMenu->setDefaultAction(action);
       
   619         }
       
   620     }
       
   621     return colorMenu;
       
   622 }
       
   623 //! [30]
       
   624 
       
   625 //! [31]
       
   626 QIcon MainWindow::createColorToolButtonIcon(const QString &imageFile,
       
   627                         QColor color)
       
   628 {
       
   629     QPixmap pixmap(50, 80);
       
   630     pixmap.fill(Qt::transparent);
       
   631     QPainter painter(&pixmap);
       
   632     QPixmap image(imageFile);
       
   633     QRect target(0, 0, 50, 60);
       
   634     QRect source(0, 0, 42, 42);
       
   635     painter.fillRect(QRect(0, 60, 50, 80), color);
       
   636     painter.drawPixmap(target, image, source);
       
   637 
       
   638     return QIcon(pixmap);
       
   639 }
       
   640 //! [31]
       
   641 
       
   642 //! [32]
       
   643 QIcon MainWindow::createColorIcon(QColor color)
       
   644 {
       
   645     QPixmap pixmap(20, 20);
       
   646     QPainter painter(&pixmap);
       
   647     painter.setPen(Qt::NoPen);
       
   648     painter.fillRect(QRect(0, 0, 20, 20), color);
       
   649 
       
   650     return QIcon(pixmap);
       
   651 }
       
   652 //! [32]