|  | Home · Examples

# Code for 40000 Chips

    /****************************************************************************
    **
    ** Copyright (C) 1992-2008 Nokia. All rights reserved.
    **
    ** This file is part of Qt Jambi.
    **
    ** * Commercial Usage
    * Licensees holding valid Qt Commercial licenses may use this file in
    * accordance with the Qt Commercial License Agreement provided with the
    * Software or, alternatively, in accordance with the terms contained in
    * a written agreement between you and Nokia.
    *
    *
    * GNU General Public License Usage
    * Alternatively, this file may be used under the terms of the GNU
    * General Public License versions 2.0 or 3.0 as published by the Free
    * Software Foundation and appearing in the file LICENSE.GPL included in
    * the packaging of this file.  Please review the following information
    * to ensure GNU General Public Licensing requirements will be met:
    * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
    * http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
    * exception, Nokia gives you certain additional rights. These rights
    * are described in the Nokia Qt GPL Exception version 1.2, included in
    * the file GPL_EXCEPTION.txt in this package.
    *
    * Qt for Windows(R) Licensees
    * As a special exception, Nokia, as the sole copyright holder for Qt
    * Designer, grants users of the Qt/Eclipse Integration plug-in the
    * right for the Qt/Eclipse Integration to link to functionality
    * provided by Qt Designer and its related libraries.
    *
    *
    * If you are unsure which license is appropriate for your use, please
    * contact the sales department at qt-sales@nokia.com.

    **
    ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
    ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    **
    ****************************************************************************/

    package com.trolltech.demos;

    import java.util.List;
    import java.util.Vector;

    import com.trolltech.examples.QtJambiExample;
    import com.trolltech.qt.core.*;
    import com.trolltech.qt.core.Qt.ConnectionType;
    import com.trolltech.qt.gui.*;
    import com.trolltech.qt.opengl.*;

    @QtJambiExample(name = "40000 Chips")
    public class Chips extends QWidget {

        QGraphicsScene scene;
        QSplitter h1Splitter;
        QSplitter h2Splitter;
        Signal0 populateScene = new Signal0();

        public Chips(QWidget parent) {
            scene = new QGraphicsScene();

            h1Splitter = new QSplitter();
            h2Splitter = new QSplitter();

            QSplitter vSplitter = new QSplitter();
            vSplitter.setOrientation(Qt.Orientation.Vertical);
            vSplitter.addWidget(h1Splitter);
            vSplitter.addWidget(h2Splitter);

            View view = new View("Top left view");
            view.view().setScene(scene);
            h1Splitter.addWidget(view);

            view = new View("Top right view");
            view.view().setScene(scene);
            h1Splitter.addWidget(view);

            view = new View("Bottom left view");
            view.view().setScene(scene);
            h2Splitter.addWidget(view);

            view = new View("Bottom right view");
            view.view().setScene(scene);
            h2Splitter.addWidget(view);

            QHBoxLayout layout = new QHBoxLayout();
            layout.addWidget(vSplitter);
            setLayout(layout);

            setWindowTitle(tr("Chip Demo"));
            setWindowIcon(new QIcon("classpath:com/trolltech/images/qt-logo.png"));

            populateScene.connect(this, "populateScene()", ConnectionType.QueuedConnection);
            populateScene.emit();
        }

        private void populateScene() {
            QImage image = new QImage("classpath:/com/trolltech/images/qt4logo.png");

            // Populate scene
            int xx = 0;
            int nitems = 0;
            for (int i = -11000; i < 11000; i += 110) {
                ++xx;
                int yy = 0;
                for (int j = -7000; j < 7000; j += 70) {
                    ++yy;
                    double x = (i + 11000) / 22000.0;
                    double y = (j + 7000) / 14000.0;

                    QColor color = new QColor(image.pixel((int) (image.width() * x), (int) (image.height() * y)));
                    QGraphicsItem item = new Chip(color, xx, yy);
                    item.setPos(new QPointF(i, j));
                    scene.addItem(item);

                    ++nitems;
                }
                QApplication.processEvents();
            }
        }

        public static void main(String args[]) {
            QApplication.initialize(args);

            Chips w = new Chips(null);
            w.show();

            QApplication.exec();
        }

        class Chip extends QGraphicsItem {

            int x, y;
            QColor color;
            List<QPointF> stuff = new Vector<QPointF>();

            Chip(final QColor color, int x, int y) {
                this.x = x;
                this.y = y;
                this.color = color;
                setZValue((x + y) % 2);

                setFlags(new GraphicsItemFlags(GraphicsItemFlag.ItemIsSelectable, GraphicsItemFlag.ItemIsMovable));
                setAcceptsHoverEvents(true);
            }

            @Override
            public QRectF boundingRect() {
                return new QRectF(0, 0, 110, 70);
            }

            @Override
            public QPainterPath shape() {
                QPainterPath path = new QPainterPath();
                path.addRect(14, 14, 82, 42);
                return path;
            }

            @Override
            public void paint(QPainter painter, final QStyleOptionGraphicsItem option, QWidget widget) {

                QColor fillColor = (option.state().isSet(QStyle.StateFlag.State_Selected)) ? color.darker(150) : color;
                if (option.state().isSet(QStyle.StateFlag.State_MouseOver))
                    fillColor = fillColor.lighter(125);

                if (option.levelOfDetail() < 0.2) {
                    if (option.levelOfDetail() < 0.125) {
                        painter.fillRect(new QRectF(0, 0, 110, 70), new QBrush(fillColor));
                        return;
                    }

                    painter.setPen(new QPen(QColor.black, 0));
                    painter.setBrush(fillColor);
                    painter.drawRect(13, 13, 97, 57);
                    return;
                }

                QPen oldPen = painter.pen();
                QPen pen = oldPen;
                int width = 0;
                if (option.state().isSet(QStyle.StateFlag.State_Selected))
                    width += 2;

                pen.setWidth(width);
                painter.setBrush(new QBrush(fillColor.darker(option.state().isSet(QStyle.StateFlag.State_Sunken) ? 120 : 100)));

                painter.drawRect(new QRect(14, 14, 79, 39));
                if (option.levelOfDetail() >= 1) {
                    painter.setPen(new QPen(QColor.gray, 1));
                    painter.drawLine(15, 54, 94, 54);
                    painter.drawLine(94, 53, 94, 15);
                    painter.setPen(new QPen(QColor.black, 0));
                }

                // Draw text
                if (option.levelOfDetail() >= 2) {
                    QFont font = new QFont("Times", 10);
                    font.setStyleStrategy(QFont.StyleStrategy.ForceOutline);
                    painter.setFont(font);
                    painter.setRenderHint(QPainter.RenderHint.TextAntialiasing, false);
                    painter.save();
                    painter.scale(0.1, 0.1);
                    painter.drawText(170, 180, String.format("Model: VSC-2000 (Very Small Chip) at %1$s %2$s", x, y));
                    painter.drawText(170, 200, String.format("Serial number: DLWR-WEER-123L-ZZ33-SDSJ", x, y));
                    painter.drawText(170, 220, String.format("Manufacturer: Chip Manufacturer", x, y));
                    painter.restore();
                }

                // Draw lines
                List<QLineF> lines = new Vector<QLineF>(36);
                if (option.levelOfDetail() >= 0.5) {
                    for (int i = 0; i <= 10; i += (option.levelOfDetail() > 0.5 ? 1 : 2)) {
                        lines.add(new QLineF(18 + 7 * i, 13, 18 + 7 * i, 5));
                        lines.add(new QLineF(18 + 7 * i, 54, 18 + 7 * i, 62));
                    }
                    for (int i = 0; i <= 6; i += (option.levelOfDetail() > 0.5 ? 1 : 2)) {
                        lines.add(new QLineF(5, 18 + i * 5, 13, 18 + i * 5));
                        lines.add(new QLineF(94, 18 + i * 5, 102, 18 + i * 5));
                    }
                }
                if (option.levelOfDetail() >= 0.4) {
                    lines.add(new QLineF(25, 35, 35, 35));
                    lines.add(new QLineF(35, 30, 35, 40));
                    lines.add(new QLineF(35, 30, 45, 35));
                    lines.add(new QLineF(35, 40, 45, 35));
                    lines.add(new QLineF(45, 30, 45, 40));
                    lines.add(new QLineF(45, 35, 55, 35));
                }
                painter.drawLinesF(lines);

                // Draw red ink
                if (stuff.size() > 1) {
                    painter.setPen(new QPen(QColor.red, 1, Qt.PenStyle.SolidLine, Qt.PenCapStyle.RoundCap, Qt.PenJoinStyle.RoundJoin));
                    painter.setBrush(QBrush.NoBrush);
                    QPainterPath path = new QPainterPath();
                    path.moveTo(stuff.get(0));
                    for (int i = 1; i < stuff.size(); ++i)
                        path.lineTo(stuff.get(i));
                    painter.drawPath(path);
                }
            }

            @Override
            public void mousePressEvent(QGraphicsSceneMouseEvent event) {
                super.mousePressEvent(event);
                update();
            }

            @Override
            public void mouseMoveEvent(QGraphicsSceneMouseEvent event) {
                if (event.modifiers().isSet(Qt.KeyboardModifier.ShiftModifier)) {
                    stuff.add(event.pos());
                    update();
                    return;
                }
                super.mouseMoveEvent(event);
            }

            @Override
            public void mouseReleaseEvent(QGraphicsSceneMouseEvent event) {
                super.mouseReleaseEvent(event);
                update();
            }
        }

        class View extends QFrame {

            QGraphicsView graphicsView;
            QLabel label;
            QToolButton openGlButton;
            QToolButton antialiasButton;
            QToolButton printButton;
            QToolButton resetButton;
            QSlider zoomSlider;
            QSlider rotateSlider;

            View(final String name) {
                this(name, null);
            }

            View(final String name, QWidget parent)

            {
                super(parent);
                setFrameStyle(QFrame.Shadow.Sunken.value() | QFrame.Shape.StyledPanel.value());
                graphicsView = new QGraphicsView();
                graphicsView.setRenderHint(QPainter.RenderHint.Antialiasing, false);
                graphicsView.setDragMode(QGraphicsView.DragMode.RubberBandDrag);
                graphicsView.setViewportUpdateMode(QGraphicsView.ViewportUpdateMode.SmartViewportUpdate);

                int size = style().pixelMetric(QStyle.PixelMetric.PM_ToolBarIconSize);
                QSize iconSize = new QSize(size, size);

                QToolButton zoomInIcon = new QToolButton();
                zoomInIcon.setAutoRepeat(true);
                zoomInIcon.setAutoRepeatInterval(33);
                zoomInIcon.setAutoRepeatDelay(0);
                zoomInIcon.setIcon(new QIcon(new QPixmap("classpath:/com/trolltech/images/zoomin.png")));
                zoomInIcon.setIconSize(iconSize);
                QToolButton zoomOutIcon = new QToolButton();
                zoomOutIcon.setAutoRepeat(true);
                zoomOutIcon.setAutoRepeatInterval(33);
                zoomOutIcon.setAutoRepeatDelay(0);
                zoomOutIcon.setIcon(new QIcon(new QPixmap("classpath:/com/trolltech/images/zoomout.png")));
                zoomOutIcon.setIconSize(iconSize);
                zoomSlider = new QSlider();
                zoomSlider.setMinimum(0);
                zoomSlider.setMaximum(500);
                zoomSlider.setValue(250);
                zoomSlider.setTickPosition(QSlider.TickPosition.TicksBelow);

                // Zoom slider layout
                QVBoxLayout zoomSliderLayout = new QVBoxLayout();
                zoomSliderLayout.addWidget(zoomInIcon);
                zoomSliderLayout.addWidget(zoomSlider);
                zoomSliderLayout.addWidget(zoomOutIcon);

                QToolButton rotateLeftIcon = new QToolButton();
                rotateLeftIcon.setIcon(new QIcon(new QPixmap("classpath:/com/trolltech/images/rotateleft.png")));
                rotateLeftIcon.setIconSize(iconSize);
                QToolButton rotateRightIcon = new QToolButton();
                rotateRightIcon.setIcon(new QIcon(new QPixmap("classpath:/com/trolltech/images/rotateright.png")));
                rotateRightIcon.setIconSize(iconSize);
                rotateSlider = new QSlider();
                rotateSlider.setOrientation(Qt.Orientation.Horizontal);
                rotateSlider.setMinimum(-360);
                rotateSlider.setMaximum(360);
                rotateSlider.setValue(0);
                rotateSlider.setTickPosition(QSlider.TickPosition.TicksBelow);

                // Rotate slider layout
                QHBoxLayout rotateSliderLayout = new QHBoxLayout();
                rotateSliderLayout.addWidget(rotateLeftIcon);
                rotateSliderLayout.addWidget(rotateSlider);
                rotateSliderLayout.addWidget(rotateRightIcon);

                resetButton = new QToolButton();
                resetButton.setText(tr("0"));
                resetButton.setEnabled(false);

                // Label layout
                QHBoxLayout labelLayout = new QHBoxLayout();
                label = new QLabel(name);
                antialiasButton = new QToolButton();
                antialiasButton.setText(tr("Antialiasing"));
                antialiasButton.setCheckable(true);
                antialiasButton.setChecked(false);
                openGlButton = new QToolButton();
                openGlButton.setText(tr("OpenGL"));
                openGlButton.setCheckable(true);
                openGlButton.setEnabled(QGLFormat.hasOpenGL());

                printButton = new QToolButton();
                printButton.setIcon(new QIcon(new QPixmap("classpath:/com/trolltech/images/" + "fileprint.png")));

                labelLayout.addWidget(label);
                labelLayout.addStretch();
                labelLayout.addWidget(antialiasButton);
                labelLayout.addWidget(openGlButton);
                labelLayout.addWidget(printButton);

                QGridLayout topLayout = new QGridLayout();
                topLayout.addLayout(labelLayout, 0, 0);
                topLayout.addWidget(graphicsView, 1, 0);
                topLayout.addLayout(zoomSliderLayout, 1, 1);
                topLayout.addLayout(rotateSliderLayout, 2, 0);
                topLayout.addWidget(resetButton, 2, 1);
                setLayout(topLayout);

                resetButton.clicked.connect(this, "resetView()");
                zoomSlider.valueChanged.connect(this, "setupMatrix()");
                rotateSlider.valueChanged.connect(this, "setupMatrix()");
                graphicsView.verticalScrollBar().valueChanged.connect(this, "setResetButtonEnabled()");
                graphicsView.horizontalScrollBar().valueChanged.connect(this, "setResetButtonEnabled()");
                antialiasButton.toggled.connect(this, "toggleAntialiasing()");
                openGlButton.toggled.connect(this, "toggleOpenGL()");
                rotateLeftIcon.clicked.connect(this, "rotateLeft()");
                rotateRightIcon.clicked.connect(this, "rotateRight()");
                zoomInIcon.clicked.connect(this, "zoomIn()");
                zoomOutIcon.clicked.connect(this, "zoomOut()");
                printButton.clicked.connect(this, "print()");

                setupMatrix();
            }

            QGraphicsView view() {
                return graphicsView;
            }

            void resetView() {
                zoomSlider.setValue(250);
                rotateSlider.setValue(0);
                setupMatrix();
                graphicsView.ensureVisible(new QRectF(0, 0, 0, 0));

                resetButton.setEnabled(false);
            }

            void setResetButtonEnabled() {
                resetButton.setEnabled(true);
            }

            void setupMatrix() {
                double scale = Math.pow(2.0, (zoomSlider.value() - 250) / 50.0);

                QMatrix matrix = new QMatrix();
                matrix.scale(scale, scale);
                matrix.rotate(rotateSlider.value());

                graphicsView.setMatrix(matrix);
                setResetButtonEnabled();
            }

            void toggleOpenGL() {
                graphicsView.setViewport(openGlButton.isChecked() ? new QGLWidget(new QGLFormat(new QGL.FormatOptions(QGL.FormatOption.SampleBuffers)))
                        : new QWidget());

            }

            void toggleAntialiasing() {
                graphicsView.setRenderHint(QPainter.RenderHint.Antialiasing, antialiasButton.isChecked());
            }

            void print() {
                QPrinter printer = new QPrinter();
                QPrintDialog dialog = new QPrintDialog(printer, this);
                if (dialog.exec() == QDialog.DialogCode.Accepted.value()) {
                    QPainter painter = new QPainter(printer);
                    graphicsView.render(painter);
                    painter.end();
                }
            }

            void zoomIn() {
                zoomSlider.setValue(zoomSlider.value() + 1);
            }

            void zoomOut() {
                zoomSlider.setValue(zoomSlider.value() - 1);
            }

            void rotateLeft() {
                rotateSlider.setValue(rotateSlider.value() - 10);
            }

            void rotateRight() {
                rotateSlider.setValue(rotateSlider.value() + 10);
            }
        }
    }