From c17c696c1a31f029bfb2f46780ef0424a68dea07 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Thu, 15 Jun 2023 15:28:37 +0200 Subject: Spinner: Add an example Change-Id: Ie10fcc1aa6e31c663296610391d5453792c46a6f Reviewed-by: Reviewed-by: Alessandro Portale --- tests/manual/CMakeLists.txt | 1 + tests/manual/manual.qbs | 1 + tests/manual/spinner/CMakeLists.txt | 6 ++ tests/manual/spinner/main.cpp | 167 ++++++++++++++++++++++++++++++++++++ tests/manual/spinner/spinner.qbs | 13 +++ 5 files changed, 188 insertions(+) create mode 100644 tests/manual/spinner/CMakeLists.txt create mode 100644 tests/manual/spinner/main.cpp create mode 100644 tests/manual/spinner/spinner.qbs diff --git a/tests/manual/CMakeLists.txt b/tests/manual/CMakeLists.txt index fde3cb962e..37d302c442 100644 --- a/tests/manual/CMakeLists.txt +++ b/tests/manual/CMakeLists.txt @@ -16,6 +16,7 @@ add_subdirectory(proparser) # add_subdirectory(qt4projectmanager) # add_subdirectory(search) add_subdirectory(shootout) +add_subdirectory(spinner) add_subdirectory(subdirfileiterator) add_subdirectory(tasking) add_subdirectory(widgets) diff --git a/tests/manual/manual.qbs b/tests/manual/manual.qbs index 35d08815d2..923f0fe5f0 100644 --- a/tests/manual/manual.qbs +++ b/tests/manual/manual.qbs @@ -13,6 +13,7 @@ Project { "pluginview/pluginview.qbs", "proparser/testreader.qbs", "shootout/shootout.qbs", + "spinner/spinner.qbs", "subdirfileiterator/subdirfileiterator.qbs", "tasking/demo/demo.qbs", "tasking/imagescaling/imagescaling.qbs", diff --git a/tests/manual/spinner/CMakeLists.txt b/tests/manual/spinner/CMakeLists.txt new file mode 100644 index 0000000000..ef83ee5638 --- /dev/null +++ b/tests/manual/spinner/CMakeLists.txt @@ -0,0 +1,6 @@ +add_qtc_test(tst_spinner + MANUALTEST + DEPENDS Spinner Qt::Widgets + SOURCES + main.cpp +) diff --git a/tests/manual/spinner/main.cpp b/tests/manual/spinner/main.cpp new file mode 100644 index 0000000000..918fd47b35 --- /dev/null +++ b/tests/manual/spinner/main.cpp @@ -0,0 +1,167 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace SpinnerSolution; + +enum class State { + NotRunning, + Running +}; + +static QString colorButtonStyleSheet(const QColor &bgColor) +{ + QString rc("border-width: 2px; border-radius: 2px; border-color: black; "); + rc += bgColor.isValid() ? "border-style: solid; background:" + bgColor.name() + ";" + : QString("border-style: dotted;"); + return rc; +} + +static QColor stateToColor(State state) +{ + switch (state) { + case State::NotRunning: return Qt::gray; + case State::Running: return Qt::yellow; + } + return {}; +} + +class StateIndicator : public QLabel +{ +public: + StateIndicator(QWidget *parent = nullptr) + : QLabel(parent) + { + setFixedSize(30, 30); + m_spinner = new Spinner(SpinnerSize::Small, this); + m_spinner->hide(); + updateState(); + } + + void setState(State state) + { + if (m_state == state) + return; + m_state = state; + updateState(); + } + +private: + void updateState() + { + setStyleSheet(colorButtonStyleSheet(stateToColor(m_state))); + if (m_state == State::Running) + m_spinner->show(); + else + m_spinner->hide(); + } + State m_state = State::NotRunning; + Spinner *m_spinner = nullptr; +}; + +class StateWidget : public QWidget +{ +public: + StateWidget() : m_stateIndicator(new StateIndicator(this)) { + QBoxLayout *layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_stateIndicator); + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + } + void setState(State state) { m_stateIndicator->setState(state); } + +protected: + StateIndicator *m_stateIndicator = nullptr; +}; + +QGroupBox *createGroupBox(SpinnerSize size, QWidget *widget) +{ + const QMetaEnum spinnerSize = QMetaEnum::fromType(); + QGroupBox *groupBox = new QGroupBox(spinnerSize.valueToKey(int(size))); + + StateWidget *stateWidget = new StateWidget; + QToolButton *startButton = new QToolButton; + startButton->setText("Start"); + QToolButton *stopButton = new QToolButton; + stopButton->setText("Stop"); + + QVBoxLayout *mainLayout = new QVBoxLayout(groupBox); + QHBoxLayout *topLayout = new QHBoxLayout(); + topLayout->addWidget(stateWidget); + topLayout->addWidget(startButton); + topLayout->addWidget(stopButton); + topLayout->addStretch(); + mainLayout->addLayout(topLayout); + mainLayout->addWidget(widget); + + Spinner *spinner = new Spinner(size, widget); + spinner->hide(); // TODO: make the default hidden? + + QObject::connect(startButton, &QAbstractButton::clicked, groupBox, [=] { + stateWidget->setState(State::Running); + spinner->show(); + widget->setEnabled(false); + }); + QObject::connect(stopButton, &QAbstractButton::clicked, groupBox, [=] { + stateWidget->setState(State::NotRunning); + spinner->hide(); + widget->setEnabled(true); + }); + return groupBox; +} + +static QWidget *hr() +{ + auto frame = new QFrame; + frame->setFrameShape(QFrame::HLine); + frame->setFrameShadow(QFrame::Sunken); + return frame; +} + +static QString pangram(int count) +{ + return QStringList(count, "The quick brown fox jumps over the lazy dog.").join(' '); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QWidget mainWidget; + mainWidget.setWindowTitle("Spinner Example"); + + QVBoxLayout *mainLayout = new QVBoxLayout(&mainWidget); + + QLabel *smallWidget = new QLabel; + smallWidget->setFixedWidth(30); + QGroupBox *smallGroupBox = createGroupBox(SpinnerSize::Small, smallWidget); + mainLayout->addWidget(smallGroupBox); + + mainLayout->addWidget(hr()); + + QCalendarWidget *mediumWidget = new QCalendarWidget; + mediumWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + QGroupBox *mediumGroupBox = createGroupBox(SpinnerSize::Medium, mediumWidget); + mainLayout->addWidget(mediumGroupBox); + + mainLayout->addWidget(hr()); + + QTextEdit *largeWidget = new QTextEdit; + largeWidget->setText(pangram(25)); + QGroupBox *largeGroupBox = createGroupBox(SpinnerSize::Large, largeWidget); + mainLayout->addWidget(largeGroupBox); + + mainWidget.show(); + + return app.exec(); +} diff --git a/tests/manual/spinner/spinner.qbs b/tests/manual/spinner/spinner.qbs new file mode 100644 index 0000000000..39b644da06 --- /dev/null +++ b/tests/manual/spinner/spinner.qbs @@ -0,0 +1,13 @@ +import qbs.FileInfo + +QtcManualtest { + name: "Spinner example" + type: ["application"] + + Depends { name: "Qt"; submodules: ["widgets"] } + Depends { name: "Spinner" } + + files: [ + "main.cpp", + ] +} -- cgit v1.2.3