-
Notifications
You must be signed in to change notification settings - Fork 0
/
mouseclient.cpp
123 lines (98 loc) · 4.17 KB
/
mouseclient.cpp
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
/************************************************************************
* This file is part of IntelliCon. *
* *
* IntelliCon 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 3 of the License, or *
* (at your option) any later version. *
* *
* IntelliCon 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with IntelliCon. If not, see <http://www.gnu.org/licenses/>. *
************************************************************************/
#include "mouseclient.h"
#include <QPainter>
#include <QGraphicsSceneMouseEvent>
#include <QtCore/qmath.h>
// Public:
MouseClient::MouseClient(const int& squareSize)
: squareSize(squareSize), highlightColumn(-1), state(None)
{
setAcceptHoverEvents(true);
}
QRectF MouseClient::boundingRect() const
{ return QRectF(0, 0, 7 * squareSize, 6 * squareSize); }
void MouseClient::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*)
{
// If the mouse isn't hovering or active, nothing should be shown
if(state == None || state == Disabled || highlightColumn == -1) return;
// Determine what color we need to show (hover: #ddd, active: #aaa) and create a brush
const int color = state == Hover ? 0xdd : 0xaa;
QBrush brush(QColor::fromRgb(color, color, color, 102)); // Alpha = 0.4
// Draw the rectangle
painter->fillRect(squareSize * highlightColumn, 0, squareSize, squareSize * 6, brush);
}
void MouseClient::setState(const State& newState)
{
if(state == Disabled) return;
if(state == newState) return;
state = newState;
update();
}
void MouseClient::disable()
{
state = Disabled;
update();
}
void MouseClient::enable()
{ state = None; }
// Protected:
void MouseClient::hoverEnterEvent(QGraphicsSceneHoverEvent* event)
{
if(state == Disabled) return;
const QPointF pos = event->scenePos();
highlightColumn = qFloor(pos.x() / squareSize);
setState(Hover);
}
void MouseClient::hoverMoveEvent(QGraphicsSceneHoverEvent* event)
{
if(state == Disabled) return;
const QPointF pos = event->scenePos();
highlightColumn = qFloor(pos.x() / squareSize);
update();
}
void MouseClient::hoverLeaveEvent(QGraphicsSceneHoverEvent* event)
{
if(state == Disabled) return;
setState(None);
highlightColumn = -1;
}
void MouseClient::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
if(state == Disabled) return;
const QPointF pos = event->scenePos();
highlightColumn = qFloor(pos.x() / squareSize);
setState(Active);
}
void MouseClient::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
if(state == Disabled) return;
const QPointF pos = event->scenePos();
if(highlightColumn != qFloor(pos.x() / squareSize))
setState(None);
else if(highlightColumn == qFloor(pos.x() / squareSize))
setState(Active);
}
void MouseClient::mouseReleaseEvent(QGraphicsSceneMouseEvent* event)
{
if(state == Disabled) return;
const QPointF pos = event->scenePos();
// Only if the state was still Active we send a click event
if(state == Active)
clicked(pos.x(), pos.y());
setState(Hover);
}