1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/***************************************************************************
wpushbutton.h - description
-------------------
begin : Fri Jun 21 2002
copyright : (C) 2002 by Tue & Ken Haste Andersen
email : haste@diku.dk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef WPUSHBUTTON_H
#define WPUSHBUTTON_H
#include <QPaintEvent>
#include <QPixmap>
#include <QString>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QFocusEvent>
#include <QTimer>
#include <QVector>
#include "widget/wwidget.h"
#include "widget/wpixmapstore.h"
#include "control/controlpushbutton.h"
#include "skin/skincontext.h"
#include "widget/controlwidgetconnection.h"
#include "util/math.h"
class WPushButton : public WWidget {
Q_OBJECT
public:
explicit WPushButton(QWidget* pParent = nullptr);
// Used by WPushButtonTest.
WPushButton(QWidget* pParent, ControlPushButton::ButtonMode leftButtonMode,
ControlPushButton::ButtonMode rightButtonMode);
Q_PROPERTY(bool pressed READ isPressed);
bool isPressed() const {
return m_bPressed;
}
// #MyPushButton:hover would affect most object styles except font color
// so we use a custom property that allows to also change the font color
// with #MyPushButton[hover="true"] {}
Q_PROPERTY(bool hover READ isHovered);
bool isHovered() const {
return m_bHovered;
}
// The displayValue property is used to restyle the pushbutton with CSS.
// The declaration #MyButton[displayValue="0"] { } will define the style
// when the widget is in state 0. This allows for effects like reversing
// background and foreground colors to indicate enabled/disabled state.
Q_PROPERTY(int displayValue READ readDisplayValue NOTIFY displayValueChanged)
int readDisplayValue() const {
double value = getControlParameterDisplay();
if (!isnan(value) && m_iNoStates > 0) {
return static_cast<int>(value) % m_iNoStates;
}
return 0;
}
virtual void setup(const QDomNode& node, const SkinContext& context);
// Sets the number of states associated with this button, and removes
// associated pixmaps.
void setStates(int iStates);
signals:
void displayValueChanged(int value);
public slots:
void onConnectedControlChanged(double dParameter, double dValue) override;
protected:
bool event(QEvent* e) override;
void paintEvent(QPaintEvent* e) override;
void mousePressEvent(QMouseEvent* e) override;
void mouseReleaseEvent(QMouseEvent* e) override;
void focusOutEvent(QFocusEvent* e) override;
void fillDebugTooltip(QStringList* debug) override;
protected:
virtual void restyleAndRepaint();
// Associates a pixmap of a given state of the button with the widget
void setPixmap(int iState, bool bPressed, PixmapSource source,
Paintable::DrawMode mode, double scaleFactor);
// Associates a background pixmap with the widget. This is only needed if
// the button pixmaps contains alpha channel values.
void setPixmapBackground(
PixmapSource source,
Paintable::DrawMode mode,
double scaleFactor);
// True, if the button is currently pressed
bool m_bPressed;
// True, if the button is pointer is above button
bool m_bHovered;
// Array of associated pixmaps
int m_iNoStates;
Qt::TextElideMode m_elideMode;
QVector<QString> m_text;
QVector<PaintablePointer> m_pressedPixmaps;
QVector<PaintablePointer> m_unpressedPixmaps;
// Associated background pixmap
PaintablePointer m_pPixmapBack;
// short click toggle button long click push button
ControlPushButton::ButtonMode m_leftButtonMode;
ControlPushButton::ButtonMode m_rightButtonMode;
QTimer m_clickTimer;
QVector<int> m_align;
};
#endif
|