-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIconButtonView.cpp
More file actions
87 lines (69 loc) · 1.91 KB
/
Copy pathIconButtonView.cpp
File metadata and controls
87 lines (69 loc) · 1.91 KB
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
#include "IconButtonView.h"
#include <Cursor.h>
#include <Application.h>
#include <Window.h>
IconButtonView::IconButtonView(const char* name, BBitmap* icon, BMessage* message)
: BView(name, B_WILL_DRAW), fIcon(icon), fMessage(message), fIsHovered(false) {
SetViewColor(B_TRANSPARENT_COLOR);
}
IconButtonView::~IconButtonView() {
delete fMessage;
}
void IconButtonView::AttachedToWindow() {
BView::AttachedToWindow();
if (!fTarget.IsValid()) {
fTarget = BMessenger(Window());
}
UpdateSystemColors();
}
void IconButtonView::SetTarget(BMessenger target) {
fTarget = target;
}
void IconButtonView::SetIcon(BBitmap* icon) {
fIcon = icon;
Invalidate();
}
void IconButtonView::UpdateSystemColors() {
rgb_color bg = Parent() ? Parent()->ViewColor()
: ui_color(B_PANEL_BACKGROUND_COLOR);
SetViewColor(bg);
SetLowColor(bg);
Invalidate();
}
void IconButtonView::Draw(BRect updateRect) {
SetHighColor(ViewColor());
FillRect(updateRect);
if (fIcon) {
SetDrawingMode(B_OP_ALPHA);
BRect bounds = Bounds();
BRect iconBounds = fIcon->Bounds();
BPoint pt(
(bounds.Width() - iconBounds.Width()) / 2.0f,
(bounds.Height() - iconBounds.Height()) / 2.0f
);
DrawBitmap(fIcon, pt);
}
}
void IconButtonView::MouseDown(BPoint point) {
if (fMessage && fTarget.IsValid()) {
BMessage copy(*fMessage);
fTarget.SendMessage(©);
}
BView::MouseDown(point);
}
void IconButtonView::MouseMoved(BPoint point, uint32 transit, const BMessage* message) {
if (transit == B_ENTERED_VIEW) {
if (!fIsHovered) {
fIsHovered = true;
BCursor handCursor(B_CURSOR_ID_FOLLOW_LINK);
SetViewCursor(&handCursor);
}
} else if (transit == B_EXITED_VIEW) {
if (fIsHovered) {
fIsHovered = false;
BCursor sysCursor(B_CURSOR_ID_SYSTEM_DEFAULT);
SetViewCursor(&sysCursor);
}
}
BView::MouseMoved(point, transit, message);
}