/**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/ ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** GNU Lesser General Public License Usage ** This file may be used under the terms of the GNU Lesser General Public ** License version 2.1 as published by the Free Software Foundation and ** appearing in the file LICENSE.LGPL included in the packaging of this ** file. Please review the following information to ensure the GNU Lesser ** General Public License version 2.1 requirements will be met: ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU General ** Public License version 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 the GNU General ** Public License version 3.0 requirements will be met: ** http://www.gnu.org/copyleft/gpl.html. ** ** Other Usage ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include "flickable.h" // Returns a list of two-word color names static QStringList colorPairs(int max) { // capitalize the first letter QStringList colors = QColor::colorNames(); colors.removeAll("transparent"); int num = colors.count(); for (int c = 0; c < num; ++c) colors[c] = colors[c][0].toUpper() + colors[c].mid(1); // combine two colors, e.g. "lime skyblue" QStringList combinedColors; for (int i = 0; i < num; ++i) for (int j = 0; j < num; ++j) combinedColors << QString("%1 %2").arg(colors[i]).arg(colors[j]); // randomize it colors.clear(); while (combinedColors.count()) { int i = qrand() % combinedColors.count(); colors << combinedColors[i]; combinedColors.removeAt(i); if (colors.count() == max) break; } return colors; } class ColorList : public QWidget, public Flickable { Q_OBJECT public: ColorList(QWidget *parent = 0) : QWidget(parent) { m_offset = 0; m_height = QFontMetrics(font()).height() + 5; m_highlight = -1; m_selected = -1; QStringList colors = colorPairs(999); for (int i = 0; i < colors.count(); ++i) { QString c = colors[i]; QString str; str.sprintf("%4d", i + 1); m_colorNames << (str + " " + c); QStringList duet = c.split(' '); m_firstColor << duet[0]; m_secondColor << duet[1]; } setAttribute(Qt::WA_OpaquePaintEvent, true); setAttribute(Qt::WA_NoSystemBackground, true); setMouseTracking(true); Flickable::setAcceptMouseClick(this); } protected: // reimplement from Flickable virtual QPoint scrollOffset() const { return QPoint(0, m_offset); } // reimplement from Flickable virtual void setScrollOffset(const QPoint &offset) { int yy = offset.y(); if (yy != m_offset) { m_offset = qBound(0, yy, m_height * m_colorNames.count() - height()); update(); } } protected: void paintEvent(QPaintEvent *event) { QPainter p(this); p.fillRect(event->rect(), Qt::white); int start = m_offset / m_height; int y = start * m_height - m_offset; if (m_offset <= 0) { start = 0; y = -m_offset; } int end = start + height() / m_height + 1; if (end > m_colorNames.count() - 1) end = m_colorNames.count() - 1; for (int i = start; i <= end; ++i, y += m_height) { p.setBrush(Qt::NoBrush); p.setPen(Qt::black); if (i == m_highlight) { p.fillRect(0, y, width(), m_height, QColor(0, 64, 128)); p.setPen(Qt::white); } if (i == m_selected) { p.fillRect(0, y, width(), m_height, QColor(0, 128, 240)); p.setPen(Qt::white); } p.drawText(m_height + 2, y, width(), m_height, Qt::AlignVCenter, m_colorNames[i]); p.setPen(Qt::NoPen); p.setBrush(m_firstColor[i]); p.drawRect(1, y + 1, m_height - 2, m_height - 2); p.setBrush(m_secondColor[i]); p.drawRect(5, y + 5, m_height - 11, m_height - 11); } p.end(); } void keyReleaseEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Down) { m_offset += 20; event->accept(); update(); return; } if (event->key() == Qt::Key_Up) { m_offset -= 20; event->accept(); update(); return; } } void mousePressEvent(QMouseEvent *event) { Flickable::handleMousePress(event); if (event->isAccepted()) return; if (event->button() == Qt::LeftButton) { int y = event->pos().y() + m_offset; int i = y / m_height; if (i != m_highlight) { m_highlight = i; m_selected = -1; update(); } event->accept(); } } void mouseMoveEvent(QMouseEvent *event) { Flickable::handleMouseMove(event); } void mouseReleaseEvent(QMouseEvent *event) { Flickable::handleMouseRelease(event); if (event->isAccepted()) return; if (event->button() == Qt::LeftButton) { m_selected = m_highlight; event->accept(); update(); } } private: int m_offset; int m_height; int m_highlight; int m_selected; QStringList m_colorNames; QList m_firstColor; QList m_secondColor; }; #include "main.moc" int main(int argc, char *argv[]) { QApplication app(argc, argv); ColorList list; list.setWindowTitle("Kinetic Scrolling"); #if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM) list.showMaximized(); #else list.resize(320, 320); list.show(); #endif return app.exec(); }