xref: /haiku/src/apps/haikudepot/ui_generic/LinkView.cpp (revision aa3083e086e5a929c061c72983e09d916c548a38)
1 /*
2  * Copyright 2014, Stephan Aßmus <superstippi@gmx.de>.
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "LinkView.h"
8 
9 #include <Cursor.h>
10 #include <String.h>
11 
12 
13 LinkView::LinkView(const char* name, const char* string, BMessage* message)
14 	:
15 	BStringView(name, string),
16 	BInvoker(message, NULL),
17 	fEnabled(true),
18 	fMouseInside(false)
19 {
20 	SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
21 	SetExplicitMinSize(BSize(120, B_SIZE_UNSET));
22 }
23 
24 
25 void
26 LinkView::AttachedToWindow()
27 {
28 	_UpdateLinkColor();
29 }
30 
31 
32 void
33 LinkView::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
34 {
35 	// TODO: Check that no buttons are pressed, don't indicate clickable
36 	// link if a button is held.
37 	if (transit == B_ENTERED_VIEW) {
38 		fMouseInside = true;
39 		_UpdateLinkColor();
40 	} else if (transit == B_EXITED_VIEW) {
41 		fMouseInside = false;
42 		_UpdateLinkColor();
43 	}
44 }
45 
46 
47 void
48 LinkView::MouseDown(BPoint where)
49 {
50 	if (fEnabled)
51 		Invoke(Message());
52 }
53 
54 
55 void
56 LinkView::Draw(BRect updateRect)
57 {
58 	if (Text() == NULL)
59 		return;
60 
61 	SetDrawingMode(B_OP_ALPHA);
62 
63 	font_height fontHeight;
64 	GetFontHeight(&fontHeight);
65 
66 	BRect bounds = Bounds();
67 
68 	float y = (bounds.top + bounds.bottom - ceilf(fontHeight.ascent)
69 		- ceilf(fontHeight.descent)) / 2.0 + ceilf(fontHeight.ascent);
70 	float x = 0.0f;
71 
72 	BString text(Text());
73 	TruncateString(&text, B_TRUNCATE_END, bounds.Width());
74 	DrawString(text, BPoint(x, y));
75 }
76 
77 
78 void
79 LinkView::SetEnabled(bool enabled)
80 {
81 	if (fEnabled != enabled) {
82 		fEnabled = enabled;
83 		_UpdateLinkColor();
84 	}
85 }
86 
87 
88 void
89 LinkView::MessageReceived(BMessage* message)
90 {
91 	if (message->what == B_COLORS_UPDATED)
92 		_UpdateLinkColor();
93 
94 	BStringView::MessageReceived(message);
95 }
96 
97 
98 void
99 LinkView::_UpdateLinkColor()
100 {
101 	BCursorID cursorID = B_CURSOR_ID_SYSTEM_DEFAULT;
102 
103 	float tint = B_DARKEN_1_TINT;
104 	ViewUIColor(&tint);
105 
106 	if (fEnabled) {
107 		if (fMouseInside) {
108 			cursorID = B_CURSOR_ID_FOLLOW_LINK;
109 			SetHighUIColor(B_LINK_HOVER_COLOR, tint);
110 		} else
111 			SetHighUIColor(B_LINK_TEXT_COLOR, tint);
112 	} else
113 		SetHighColor(disable_color(ui_color(B_LINK_TEXT_COLOR), ViewColor()));
114 
115 	BCursor cursor(cursorID);
116 	SetViewCursor(&cursor, true);
117 	Invalidate();
118 }
119