Skip to content

Commit 418de4b

Browse files
committed
Merge #357 [stable-3.16] nmc/2025/2278-Welcome_Popup_Wizard
2 parents a38f20d + b93b9c5 commit 418de4b

File tree

4 files changed

+410
-3
lines changed

4 files changed

+410
-3
lines changed

src/gui/nmcgui/nmcadvertwidget.cpp

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
/*
2+
* Copyright (C) by Eugen Fischer
3+
*
4+
* This program is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation; either version 2 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but
10+
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11+
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* for more details.
13+
*/
14+
15+
#include "nmcadvertwidget.h"
16+
#include <QDebug>
17+
#include <QBoxLayout>
18+
#include <QIcon>
19+
#include <QCoreApplication>
20+
#include <QGraphicsView>
21+
#include <QMouseEvent>
22+
#include <QDebug>
23+
24+
NMCAdvertWidget::NMCAdvertWidget(QWidget *parent)
25+
: QWidget(parent),
26+
m_graphicsView(new NMCCustomGraphicsView(this))
27+
{
28+
setFixedSize(698, 474);
29+
auto *layout = new QHBoxLayout(this);
30+
setLayout(layout);
31+
32+
m_graphicsView->setScene(&m_graphicsScene);
33+
layout->addWidget(m_graphicsView);
34+
layout->setContentsMargins(0, 0, 0, 0);
35+
36+
m_graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
37+
m_graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
38+
39+
generatePixmapList(QStringLiteral(":/client/theme/NMCIcons/configuration1.png"));
40+
generatePixmapList(QStringLiteral(":/client/theme/NMCIcons/configuration2.png"));
41+
generatePixmapList(QStringLiteral(":/client/theme/NMCIcons/configuration3.png"));
42+
43+
initStartButton();
44+
45+
m_arrow_left = new NMCClickableLabel(m_graphicsView);
46+
m_arrow_left->setPixmap(QIcon(QStringLiteral(":/client/theme/NMCIcons/navigation-left.svg")).pixmap(32, 32));
47+
connect(m_arrow_left, &NMCClickableLabel::clicked, this, &NMCAdvertWidget::onArrowLeftClicked);
48+
49+
m_arrow_right = new NMCClickableLabel(m_graphicsView);
50+
m_arrow_right->setPixmap(QIcon(QStringLiteral(":/client/theme/NMCIcons/navigation-right.svg")).pixmap(32, 32));
51+
connect(m_arrow_right, &NMCClickableLabel::clicked, this, &NMCAdvertWidget::onArrowRightClicked);
52+
53+
if (!m_pixmapList.empty()) {
54+
loadPNG(m_pixmapList.first());
55+
m_currentImageId = 0;
56+
}
57+
58+
m_animationTimer.setInterval(5000);
59+
connect(&m_animationTimer, &QTimer::timeout, this, [this]() {
60+
++m_currentImageId;
61+
if (m_currentImageId >= m_pixmapList.size()) {
62+
m_currentImageId = 0;
63+
}
64+
selectTextByID();
65+
});
66+
67+
m_animationTimer.start();
68+
setStartButton();
69+
setDetailText(QCoreApplication::translate("", "ADVERT_DETAIL_TEXT_1"));
70+
setHeaderText(QCoreApplication::translate("", "ADVERT_HEADER_TEXT_1"));
71+
setHeader(QCoreApplication::translate("", "ADVERT_HEADER_1"));
72+
setArrows();
73+
}
74+
75+
void NMCAdvertWidget::resizeEvent(QResizeEvent *event)
76+
{
77+
QWidget::resizeEvent(event);
78+
if (m_currentImageId < m_pixmapList.size())
79+
loadPNG(m_pixmapList.at(m_currentImageId));
80+
81+
setStartButton();
82+
setDetailText(m_detailText ? m_detailText->text() : QString());
83+
setHeaderText(m_headerText ? m_headerText->text() : QString());
84+
setHeader(m_header ? m_header->text() : QString());
85+
setArrows();
86+
}
87+
88+
void NMCAdvertWidget::clearScene()
89+
{
90+
m_graphicsScene.clear();
91+
}
92+
93+
void NMCAdvertWidget::loadPNG(const QPixmap &pixmap)
94+
{
95+
clearScene();
96+
auto *pixmapItem = m_graphicsScene.addPixmap(pixmap.scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
97+
if (pixmapItem) {
98+
m_graphicsView->setFixedSize(pixmapItem->pixmap().size());
99+
m_graphicsView->update();
100+
}
101+
}
102+
103+
void NMCAdvertWidget::generatePixmapList(const QString &name)
104+
{
105+
QPixmap pixmap(name);
106+
m_pixmapList.append(pixmap.scaled(size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
107+
}
108+
109+
void NMCAdvertWidget::initStartButton()
110+
{
111+
if (!m_pushButton) {
112+
m_pushButton = new QPushButton(QCoreApplication::translate("", "START_NOW"), m_graphicsView);
113+
m_pushButton->setStyleSheet(QStringLiteral(
114+
"QPushButton { font-size: 15px; border: 0px solid black; border-radius: 4px; background-color: white; color: black; }"
115+
"QPushButton:hover { background-color: #ededed; }"
116+
));
117+
// m_pushButton->setFixedSize(kButtonWidth, kButtonHeight);
118+
m_pushButton->setFixedSize(140, 36);
119+
connect(m_pushButton, &QPushButton::clicked, this, &NMCAdvertWidget::close);
120+
}
121+
}
122+
123+
void NMCAdvertWidget::setStartButton()
124+
{
125+
if (m_pushButton && m_graphicsView) {
126+
m_graphicsScene.addWidget(m_pushButton);
127+
int buttonWidth = 140;
128+
int buttonHeight = 36;
129+
int x = (width() - buttonWidth) / 2;
130+
int y = height() - 60;
131+
m_pushButton->setGeometry(x, y, buttonWidth, buttonHeight);
132+
}
133+
}
134+
135+
void NMCAdvertWidget::setDetailText(const QString &p_text)
136+
{
137+
if (!m_detailText) {
138+
m_detailText = new QLabel(p_text, m_graphicsView);
139+
m_detailText->setWordWrap(true);
140+
m_detailText->setAlignment(Qt::AlignCenter);
141+
m_detailText->setStyleSheet(QStringLiteral("font-size: 15px; color: white"));
142+
m_graphicsScene.addWidget(m_detailText);
143+
} else {
144+
m_detailText->setText(p_text);
145+
}
146+
147+
m_detailText->setFixedWidth(420);
148+
149+
int y = height() - 88 - m_detailText->sizeHint().height();
150+
int x = width() / 2 - m_detailText->sizeHint().width() / 2;
151+
152+
m_detailText->setGeometry(x, y, m_detailText->sizeHint().width(), m_detailText->sizeHint().height());
153+
}
154+
155+
void NMCAdvertWidget::setHeaderText(const QString &p_text)
156+
{
157+
if (!m_headerText) {
158+
m_headerText = new QLabel(p_text, m_graphicsView);
159+
m_headerText->setWordWrap(true);
160+
m_headerText->setAlignment(Qt::AlignCenter);
161+
m_headerText->setStyleSheet(QStringLiteral("font-size: 26px; color: white"));
162+
m_graphicsScene.addWidget(m_headerText);
163+
} else {
164+
m_headerText->setText(p_text);
165+
}
166+
167+
m_headerText->setFixedWidth(420);
168+
169+
int y = height() - 100 - m_detailText->sizeHint().height() - m_headerText->sizeHint().height();
170+
int x = width() / 2 - m_headerText->sizeHint().width() / 2;
171+
172+
m_headerText->setGeometry(x, y, m_headerText->sizeHint().width(), m_headerText->sizeHint().height());
173+
}
174+
175+
void NMCAdvertWidget::setHeader(const QString &p_text)
176+
{
177+
if (!m_header) {
178+
m_header = new QLabel(p_text, m_graphicsView);
179+
m_header->setAlignment(Qt::AlignCenter);
180+
m_header->setStyleSheet(QStringLiteral("font-size: 22px; color: white; font-weight: bold;"));
181+
m_graphicsScene.addWidget(m_header);
182+
} else {
183+
m_header->setText(p_text);
184+
}
185+
186+
int y = height() - 142 - m_detailText->sizeHint().height() - m_headerText->sizeHint().height();
187+
int x = width() / 2 - m_header->sizeHint().width() / 2;
188+
189+
m_header->setGeometry(x, y, m_header->sizeHint().width(), m_header->sizeHint().height());
190+
}
191+
192+
void NMCAdvertWidget::setArrows()
193+
{
194+
int y = height() - kArrowOffset;
195+
m_arrow_left->move(qMax(112, 20), y);
196+
m_arrow_right->move(qMin(width() - 130, width() - 50), y);
197+
}
198+
199+
void NMCAdvertWidget::loadPicture(bool next)
200+
{
201+
m_currentImageId = (m_currentImageId + (next ? 1 : -1) + 3) % 3;
202+
selectTextByID();
203+
}
204+
205+
void NMCAdvertWidget::selectTextByID()
206+
{
207+
loadPNG(m_pixmapList.at(m_currentImageId));
208+
209+
switch (m_currentImageId) {
210+
case 0:
211+
setDetailText(QCoreApplication::translate("", "ADVERT_DETAIL_TEXT_1"));
212+
setHeaderText(QCoreApplication::translate("", "ADVERT_HEADER_TEXT_1"));
213+
break;
214+
case 1:
215+
setDetailText(QCoreApplication::translate("", "ADVERT_DETAIL_TEXT_2"));
216+
setHeaderText(QCoreApplication::translate("", "ADVERT_HEADER_TEXT_2"));
217+
break;
218+
case 2:
219+
setDetailText(QCoreApplication::translate("", "ADVERT_DETAIL_TEXT_3"));
220+
setHeaderText(QCoreApplication::translate("", "ADVERT_HEADER_TEXT_3"));
221+
break;
222+
default:
223+
break;
224+
}
225+
226+
if (m_header) {
227+
m_header->setVisible(m_currentImageId == 0);
228+
}
229+
}
230+
231+
void NMCAdvertWidget::onArrowLeftClicked()
232+
{
233+
m_animationTimer.stop();
234+
loadPicture(false);
235+
}
236+
237+
void NMCAdvertWidget::onArrowRightClicked()
238+
{
239+
m_animationTimer.stop();
240+
loadPicture(true);
241+
}
242+
243+
// Definition von NMCCustomGraphicsView
244+
NMCCustomGraphicsView::NMCCustomGraphicsView(QWidget *parent)
245+
: QGraphicsView(parent)
246+
{
247+
setStyleSheet(QStringLiteral("background: transparent"));
248+
setFrameStyle(QFrame::NoFrame);
249+
}
250+
251+
void NMCCustomGraphicsView::wheelEvent(QWheelEvent *event)
252+
{
253+
// Unterdrücke Scrollen
254+
event->ignore();
255+
}
256+
257+
// Definition von NMCClickableLabel
258+
NMCClickableLabel::NMCClickableLabel(QWidget *parent)
259+
: QLabel(parent)
260+
{
261+
setCursor(Qt::PointingHandCursor);
262+
}
263+
264+
void NMCClickableLabel::mousePressEvent(QMouseEvent *event)
265+
{
266+
if (event->button() == Qt::LeftButton) {
267+
emit clicked();
268+
}
269+
QLabel::mousePressEvent(event);
270+
}

src/gui/nmcgui/nmcadvertwidget.h

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*
2+
* Copyright (C) by Eugen Fischer
3+
*
4+
* This program is free software; you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation; either version 2 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but
10+
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11+
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* for more details.
13+
*/
14+
15+
#ifndef NMCADVERTWIDGET_H
16+
#define NMCADVERTWIDGET_H
17+
18+
#include <QWidget>
19+
#include <QTimer>
20+
#include <QLabel>
21+
#include <QGraphicsView>
22+
#include <QGraphicsScene>
23+
#include <QGraphicsPixmapItem>
24+
#include <QPushButton>
25+
#include <QList>
26+
#include <QResizeEvent>
27+
28+
class QWheelEvent;
29+
class QMouseEvent;
30+
31+
/**
32+
* @brief Custom QGraphicsView that disables scroll wheel interaction.
33+
*/
34+
class NMCCustomGraphicsView : public QGraphicsView
35+
{
36+
Q_OBJECT
37+
38+
public:
39+
explicit NMCCustomGraphicsView(QWidget *parent = nullptr);
40+
41+
protected:
42+
void wheelEvent(QWheelEvent *event) override;
43+
};
44+
45+
/**
46+
* @brief Clickable QLabel emitting a signal on click.
47+
*/
48+
class NMCClickableLabel : public QLabel
49+
{
50+
Q_OBJECT
51+
52+
public:
53+
explicit NMCClickableLabel(QWidget *parent = nullptr);
54+
~NMCClickableLabel() override = default;
55+
56+
signals:
57+
void clicked();
58+
59+
protected:
60+
void mousePressEvent(QMouseEvent *event) override;
61+
};
62+
63+
/**
64+
* @brief Widget displaying an image-based slideshow with controls and text.
65+
*/
66+
class NMCAdvertWidget : public QWidget
67+
{
68+
Q_OBJECT
69+
70+
public:
71+
explicit NMCAdvertWidget(QWidget *parent = nullptr);
72+
~NMCAdvertWidget() override = default;
73+
74+
private:
75+
void loadPNG(const QPixmap &pixmap);
76+
void generatePixmapList(const QString &name);
77+
void initStartButton();
78+
void setStartButton();
79+
void setDetailText(const QString &text);
80+
void setHeaderText(const QString &text);
81+
void setHeader(const QString &text);
82+
void setArrows();
83+
void loadPicture(bool next = true);
84+
void selectTextByID();
85+
void clearScene();
86+
void onArrowLeftClicked();
87+
void onArrowRightClicked();
88+
void resizeEvent(QResizeEvent *event) override;
89+
90+
private:
91+
NMCCustomGraphicsView *m_graphicsView = nullptr;
92+
QGraphicsScene m_graphicsScene;
93+
QList<QPixmap> m_pixmapList;
94+
QGraphicsPixmapItem *m_pixmapItem = nullptr;
95+
QTimer m_animationTimer;
96+
int m_currentImageId = 0;
97+
98+
QPushButton *m_pushButton = nullptr;
99+
QLabel *m_detailText = nullptr;
100+
QLabel *m_headerText = nullptr;
101+
QLabel *m_header = nullptr;
102+
NMCClickableLabel *m_arrow_left = nullptr;
103+
NMCClickableLabel *m_arrow_right = nullptr;
104+
105+
static constexpr int kButtonWidth = 200;
106+
static constexpr int kButtonHeight = 40;
107+
static constexpr int kArrowOffset = 60;
108+
};
109+
110+
#endif // NMCADVERTWIDGET_H
111+

0 commit comments

Comments
 (0)