diff options
Diffstat (limited to 'examples/embedded/flickable')
-rw-r--r-- | examples/embedded/flickable/CMakeLists.txt | 34 | ||||
-rw-r--r-- | examples/embedded/flickable/flickable.cpp | 293 | ||||
-rw-r--r-- | examples/embedded/flickable/flickable.h | 87 | ||||
-rw-r--r-- | examples/embedded/flickable/flickable.pro | 7 | ||||
-rw-r--r-- | examples/embedded/flickable/main.cpp | 237 |
5 files changed, 0 insertions, 658 deletions
diff --git a/examples/embedded/flickable/CMakeLists.txt b/examples/embedded/flickable/CMakeLists.txt deleted file mode 100644 index 0dc5051eec..0000000000 --- a/examples/embedded/flickable/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(flickable LANGUAGES CXX) - -set(CMAKE_AUTOMOC ON) - -if(NOT DEFINED INSTALL_EXAMPLESDIR) - set(INSTALL_EXAMPLESDIR "examples") -endif() - -set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/embedded/flickable") - -find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) - -qt_add_executable(flickable - flickable.cpp flickable.h - main.cpp -) - -set_target_properties(flickable PROPERTIES - WIN32_EXECUTABLE TRUE - MACOSX_BUNDLE TRUE -) - -target_link_libraries(flickable PUBLIC - Qt::Core - Qt::Gui - Qt::Widgets -) - -install(TARGETS flickable - RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" - BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" - LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" -) diff --git a/examples/embedded/flickable/flickable.cpp b/examples/embedded/flickable/flickable.cpp deleted file mode 100644 index 8cf7a28cde..0000000000 --- a/examples/embedded/flickable/flickable.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the demonstration applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "flickable.h" - -#include <QtCore> -#include <QtWidgets> - -class FlickableTicker: QObject -{ -public: - FlickableTicker(Flickable *scroller) { - m_scroller = scroller; - } - - void start(int interval) { - if (!m_timer.isActive()) - m_timer.start(interval, this); - } - - void stop() { - m_timer.stop(); - } - -protected: - void timerEvent(QTimerEvent *event) { - Q_UNUSED(event); - m_scroller->tick(); - } - -private: - Flickable *m_scroller; - QBasicTimer m_timer; -}; - -class FlickablePrivate -{ -public: - typedef enum { - Steady, - Pressed, - ManualScroll, - AutoScroll, - Stop - } State; - - State state; - int threshold; - QPoint pressPos; - QPoint offset; - QPoint delta; - QPoint speed; - FlickableTicker *ticker; - QElapsedTimer timeStamp; - QWidget *target; - QList<QEvent*> ignoreList; -}; - -Flickable::Flickable() -{ - d = new FlickablePrivate; - d->state = FlickablePrivate::Steady; - d->threshold = 10; - d->ticker = new FlickableTicker(this); - d->timeStamp.start(); - d->target = 0; -} - -Flickable::~Flickable() -{ - delete d; -} - -void Flickable::setThreshold(int th) -{ - if (th >= 0) - d->threshold = th; -} - -int Flickable::threshold() const -{ - return d->threshold; -} - -void Flickable::setAcceptMouseClick(QWidget *target) -{ - d->target = target; -} - -static QPoint deaccelerate(const QPoint &speed, int a = 1, int max = 64) -{ - int x = qBound(-max, speed.x(), max); - int y = qBound(-max, speed.y(), max); - x = (x == 0) ? x : (x > 0) ? qMax(0, x - a) : qMin(0, x + a); - y = (y == 0) ? y : (y > 0) ? qMax(0, y - a) : qMin(0, y + a); - return QPoint(x, y); -} - -void Flickable::handleMousePress(QMouseEvent *event) -{ - event->ignore(); - - if (event->button() != Qt::LeftButton) - return; - - if (d->ignoreList.removeAll(event)) - return; - - switch (d->state) { - - case FlickablePrivate::Steady: - event->accept(); - d->state = FlickablePrivate::Pressed; - d->pressPos = event->position().toPoint(); - break; - - case FlickablePrivate::AutoScroll: - event->accept(); - d->state = FlickablePrivate::Stop; - d->speed = QPoint(0, 0); - d->pressPos = event->position().toPoint(); - d->offset = scrollOffset(); - d->ticker->stop(); - break; - - default: - break; - } -} - -void Flickable::handleMouseRelease(QMouseEvent *event) -{ - event->ignore(); - - if (event->button() != Qt::LeftButton) - return; - - if (d->ignoreList.removeAll(event)) - return; - - QPoint delta; - - switch (d->state) { - - case FlickablePrivate::Pressed: - event->accept(); - d->state = FlickablePrivate::Steady; - if (d->target) { - QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress, - d->pressPos, Qt::LeftButton, - Qt::LeftButton, Qt::NoModifier); - QMouseEvent *event2 = event->clone(); - d->ignoreList << event1; - d->ignoreList << event2; - QApplication::postEvent(d->target, event1); - QApplication::postEvent(d->target, event2); - } - break; - - case FlickablePrivate::ManualScroll: - event->accept(); - delta = event->position().toPoint() - d->pressPos; - if (d->timeStamp.elapsed() > 100) { - d->timeStamp.start(); - d->speed = delta - d->delta; - d->delta = delta; - } - d->offset = scrollOffset(); - d->pressPos = event->position().toPoint(); - if (d->speed == QPoint(0, 0)) { - d->state = FlickablePrivate::Steady; - } else { - d->speed /= 4; - d->state = FlickablePrivate::AutoScroll; - d->ticker->start(20); - } - break; - - case FlickablePrivate::Stop: - event->accept(); - d->state = FlickablePrivate::Steady; - d->offset = scrollOffset(); - break; - - default: - break; - } -} - -void Flickable::handleMouseMove(QMouseEvent *event) -{ - event->ignore(); - - if (!(event->buttons() & Qt::LeftButton)) - return; - - if (d->ignoreList.removeAll(event)) - return; - - QPoint delta; - - switch (d->state) { - - case FlickablePrivate::Pressed: - case FlickablePrivate::Stop: - delta = event->position().toPoint() - d->pressPos; - if (delta.x() > d->threshold || delta.x() < -d->threshold || - delta.y() > d->threshold || delta.y() < -d->threshold) { - d->timeStamp.start(); - d->state = FlickablePrivate::ManualScroll; - d->delta = QPoint(0, 0); - d->pressPos = event->position().toPoint(); - event->accept(); - } - break; - - case FlickablePrivate::ManualScroll: - event->accept(); - delta = event->position().toPoint() - d->pressPos; - setScrollOffset(d->offset - delta); - if (d->timeStamp.elapsed() > 100) { - d->timeStamp.start(); - d->speed = delta - d->delta; - d->delta = delta; - } - break; - - default: - break; - } -} - -void Flickable::tick() -{ - if (d->state == FlickablePrivate:: AutoScroll) { - d->speed = deaccelerate(d->speed); - setScrollOffset(d->offset - d->speed); - d->offset = scrollOffset(); - if (d->speed == QPoint(0, 0)) { - d->state = FlickablePrivate::Steady; - d->ticker->stop(); - } - } else { - d->ticker->stop(); - } -} diff --git a/examples/embedded/flickable/flickable.h b/examples/embedded/flickable/flickable.h deleted file mode 100644 index 276510a849..0000000000 --- a/examples/embedded/flickable/flickable.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the demonstration applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef FLICKABLE_H -#define FLICKABLE_H - -#include <QWidget> - -class FlickableTicker; -class FlickablePrivate; - -class Flickable -{ -public: - - Flickable(); - virtual ~Flickable(); - - void setThreshold(int threshold); - int threshold() const; - - void setAcceptMouseClick(QWidget *target); - - void handleMousePress(QMouseEvent *event); - void handleMouseMove(QMouseEvent *event); - void handleMouseRelease(QMouseEvent *event); - -protected: - virtual QPoint scrollOffset() const = 0; - virtual void setScrollOffset(const QPoint &offset) = 0; - -private: - void tick(); - -private: - FlickablePrivate *d; - friend class FlickableTicker; -}; - -#endif // FLICKABLE_H diff --git a/examples/embedded/flickable/flickable.pro b/examples/embedded/flickable/flickable.pro deleted file mode 100644 index 5929207414..0000000000 --- a/examples/embedded/flickable/flickable.pro +++ /dev/null @@ -1,7 +0,0 @@ -QT += widgets - -SOURCES = flickable.cpp main.cpp -HEADERS = flickable.h - -target.path = $$[QT_INSTALL_EXAMPLES]/embedded/flickable -INSTALLS += target diff --git a/examples/embedded/flickable/main.cpp b/examples/embedded/flickable/main.cpp deleted file mode 100644 index 139baa6ba7..0000000000 --- a/examples/embedded/flickable/main.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the demonstration applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore> -#include <QtWidgets> - -#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 = QRandomGenerator::global()->bounded(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 = nullptr) - : 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) { - const QString c = colors[i]; - const QString str = QString::asprintf("%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->position().toPoint().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<QColor> m_firstColor; - QList<QColor> m_secondColor; -}; - -#include "main.moc" - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - ColorList list; - list.setWindowTitle("Kinetic Scrolling"); - list.resize(320, 320); - list.show(); - - return app.exec(); -} |