summaryrefslogtreecommitdiff
path: root/libopie/oclickablelabel.cpp
blob: bc7037bf1f32e5ecfe9ab5160a5e6fe2f9783a59 (plain)
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
#include "oclickablelabel.h"
#include <stdio.h>

/**
 * This constructs the clickable ButtonLabel
 *
 * @param parent The parent of this label
 * @param name A name of this label @see QObject
 * @param fl The windowing flags
 */
OClickableLabel::OClickableLabel(QWidget* parent,
			       const char* name,
			       WFlags fl) :
  QLabel(parent,name,fl)
{
    textInverted=false;
    isToggle=false;
    isDown=false;
    showState(false);
    setFrameShadow(Sunken);
}

/**
 * This method makes the label behave as a toggle button
 *
 * @param t Whether or not to behave like a toggle button
 */
void OClickableLabel::setToggleButton(bool t) {
    isToggle=t;
}

/**
 * @internal
 */
void OClickableLabel::mousePressEvent( QMouseEvent * /*e*/ ) {
    if (isToggle && isDown) {
	showState(false);
    } else {
	showState(true);
    }
}

/**
 * @internal
 */
void OClickableLabel::mouseReleaseEvent( QMouseEvent *e ) {
    if (rect().contains(e->pos()) && isToggle) isDown=!isDown;

    if (isToggle && isDown) {
	showState(true);
    } else {
	showState(false);
    }

    if (rect().contains(e->pos())) {
	if (isToggle) {
	    emit toggled(isDown);
	}
	emit clicked();
    }
}

/**
 * @internal
 */
void OClickableLabel::mouseMoveEvent( QMouseEvent *e ) {
    if (rect().contains(e->pos())) {
	if (isToggle && isDown) {
	    showState(false);
	} else {
	    showState(true);
	}
    } else {
	if (isToggle && isDown) {
	    showState(true);
	} else {
	    showState(false);
	}
    }
}

/**
 * this toggles the label and inverts the color of
 * the label
 * @param on
 */
void OClickableLabel::showState(bool on) {
  if (on) {
    //setFrameShape(Panel);
    setInverted(true);
    setBackgroundMode(PaletteHighlight);
  } else {
    //setFrameShape(NoFrame);
    setInverted(false);
    setBackgroundMode(PaletteBackground);
  }
  repaint();
}

void OClickableLabel::setInverted(bool on) {
    if ( (!textInverted && on) || (textInverted && !on) ) {
	QPalette pal=palette();
	QColor col=pal.color(QPalette::Normal, QColorGroup::Foreground);
	col.setRgb(255-col.red(),255-col.green(),255-col.blue());
	pal.setColor(QPalette::Normal, QColorGroup::Foreground, col);
	setPalette(pal);
	textInverted=!textInverted;
    }
}

/**
 * @param on if the Label is down or up
 */
void OClickableLabel::setOn(bool on) {
  isDown=on;
  showState(isDown);
}