/*
QAD - Qt ADvanced
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef TOUCHBUTTON_H
#define TOUCHBUTTON_H
#include "qad_touch_widgets_export.h"
#include
#include
#include
#include
#include
class QAD_TOUCH_WIDGETS_EXPORT TouchButton: public QToolButton {
Q_OBJECT
Q_ENUMS(State)
Q_PROPERTY(QColor downColor READ downColor WRITE setDownColor)
Q_PROPERTY(QColor upColor READ upColor WRITE setUpColor)
Q_PROPERTY(QColor grayColor READ grayColor WRITE setGrayColor)
Q_PROPERTY(QColor yesColor READ yesColor WRITE setYesColor)
Q_PROPERTY(QColor noColor READ noColor WRITE setNoColor)
Q_PROPERTY(QColor currentColor READ currentColor WRITE setCurrentColor DESIGNABLE false)
Q_PROPERTY(State state READ state WRITE setState)
Q_PROPERTY(bool autoGray READ autoGray WRITE setAutoGray)
Q_PROPERTY(bool animated READ animated WRITE setAnimated)
Q_PROPERTY(int animationDuration READ animationDuration WRITE setAnimationDuration)
Q_PROPERTY(QEasingCurve::Type animationCurve READ animationCurve WRITE setAnimationCurve)
Q_PROPERTY(int blinkDelay READ blinkDelay WRITE setBlinkDelay)
Q_PROPERTY(int clickID READ clickID WRITE setClickID)
Q_PROPERTY(int yesID READ yesID WRITE setYesID)
Q_PROPERTY(int noID READ noID WRITE setNoID)
public:
explicit TouchButton(QWidget * parent = 0);
TouchButton(int id, const QString & text = QString());
~TouchButton();
enum State {
Gray,
Yes,
No
};
int clickID() const { return id_click; }
int yesID() const { return id_yes; }
int noID() const { return id_no; }
QColor downColor() const { return col_down; }
QColor upColor() const { return col_up; }
QColor grayColor() const { return col_gray; }
QColor yesColor() const { return col_yes; }
QColor noColor() const { return col_no; }
QColor currentColor() const { return col_cur; }
State state() const { return state_; }
bool autoGray() const { return auto_gray; }
bool animated() const { return anim; }
int animationDuration() const { return animation.duration(); }
QEasingCurve::Type animationCurve() const { return animation.easingCurve().type(); }
int blinkDelay() const { return delay_blink; }
void blink(const QColor & tc);
private:
void timerEvent(QTimerEvent * e);
void mousePressEvent(QMouseEvent * e);
void mouseReleaseEvent(QMouseEvent * e);
void init();
void animateColor(const QColor & tc);
void applyColor() {
pal.setColor(QPalette::Button, col_cur);
setPalette(pal);
}
void applyState(State s);
QPalette pal;
QColor col_down, col_up, col_gray, col_yes, col_no, col_cur, col_dst, col_blink;
QPropertyAnimation animation;
State state_;
int id_click, id_yes, id_no, delay_blink, timer;
bool anim, auto_gray;
private slots:
void _clicked() { emit clickedID(id_click); }
void _toggled(bool on) {
if (!on && auto_gray) setStateGray();
emit toggledID(id_click, on);
}
public slots:
void enable() { setEnabled(true); }
void disable() {
setStateGray();
setEnabled(false);
}
void setClickID(int id) { id_click = id; }
void setYesID(int id) { id_yes = id; }
void setNoID(int id) { id_no = id; }
void setDownColor(const QColor & col) { col_down = col; }
void setUpColor(const QColor & col) { col_up = col; }
void setGrayColor(const QColor & col) { col_gray = col; }
void setYesColor(const QColor & col) { col_yes = col; }
void setNoColor(const QColor & col) { col_no = col; }
void setState(State s);
void setStateGray() {
col_dst = col_gray;
applyState(Gray);
animateColor(col_dst);
}
void setStateYes() {
col_dst = col_yes;
applyState(Yes);
animateColor(col_dst);
}
void setStateNo() {
col_dst = col_no;
applyState(No);
animateColor(col_dst);
}
void setStateYesOrNo(bool yes) {
if (yes)
setStateYes();
else
setStateNo();
}
void setStateYesOrGray(bool yes) {
if (yes)
setStateYes();
else
setStateGray();
}
void setStateNoOrYes(bool no) {
if (no)
setStateNo();
else
setStateYes();
}
void setStateNoOrGray(bool no) {
if (no)
setStateNo();
else
setStateGray();
}
void blinkYes() { blink(col_yes); }
void blinkNo() { blink(col_no); }
void blinkYesOrNo(bool yes) { blink(yes ? col_yes : col_no); }
void blinkNoOrYes(bool no) { blink(no ? col_no : col_yes); }
void enableID(int yes_id) {
if (yes_id == id_yes) enable();
}
void disableID(int yes_id) {
if (yes_id == id_yes) disable();
}
void setStateID(int yes_id, State s) {
if (yes_id == id_yes) setState(s);
}
void setStateGrayID(int yes_id) {
if (yes_id == id_yes) setStateGray();
}
void setStateYesID(int yes_id) {
if (yes_id == id_yes) setStateYes();
}
void setStateNoID(int no_id) {
if (no_id == id_no) setStateNo();
}
void setStateYesOrNoID(int yes_id, bool yes) {
if (yes_id == id_yes) setStateYesOrNo(yes);
}
void setStateYesOrGrayID(int yes_id, bool yes) {
if (yes_id == id_yes) setStateYesOrGray(yes);
}
void setStateNoOrYesID(int no_id, bool no) {
if (no_id == id_no) setStateNoOrYes(no);
}
void setStateNoOrGrayID(int no_id, bool no) {
if (no_id == id_no) setStateNoOrGray(no);
}
void blinkYesID(int yes_id) {
if (yes_id == id_yes) blinkYes();
}
void blinkNoID(int no_id) {
if (no_id == id_no) blinkNo();
}
void blinkYesOrNoID(int yes_id, bool yes) {
if (yes_id == id_yes) blinkYesOrNo(yes);
}
void blinkNoOrYesID(int no_id, bool no) {
if (no_id == id_no) blinkNoOrYes(no);
}
void setColor(const QColor & col) {
col_dst = col;
animateColor(col_dst);
}
void setCurrentColor(const QColor & col) {
col_cur = col;
applyColor();
}
void setAutoGray(bool yes) { auto_gray = yes; }
void setAnimated(bool yes) { anim = yes; }
void setAnimationDuration(int dur) { animation.setDuration(dur); }
void setAnimationCurve(QEasingCurve::Type curve) { animation.setEasingCurve(QEasingCurve(curve)); }
void setBlinkDelay(int dur) { delay_blink = dur; }
void delayedClick() { QMetaObject::invokeMethod(this, "click", Qt::QueuedConnection); }
void delayedToggle() { QMetaObject::invokeMethod(this, "toggle", Qt::QueuedConnection); }
void delayedClickID(int yes_id) {
if (yes_id == id_yes) delayedClick();
}
void delayedToggleID(int yes_id) {
if (yes_id == id_yes) delayedToggle();
}
signals:
void clickedID(int id);
void pressedID(int id);
void releasedID(int id);
void toggledID(int id, bool on);
void stateChanged(State state, State prev_state);
void stateChangedID(int id, State state, State prev_state);
};
#endif // TOUCHBUTTON_H