1/*
2 * Copyright 2016 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		John Scipione, jscipione@gmail.com
7 */
8
9
10#include "RainbowItem.h"
11
12#include <math.h>
13
14#include <ControlLook.h>
15#include <GradientLinear.h>
16#include <InterfaceDefs.h>
17#include <View.h>
18
19
20// golden ratio
21#ifdef M_PHI
22#	undef M_PHI
23#endif
24#define M_PHI 1.61803398874989484820
25
26
27//	#pragma mark - RainbowItem
28
29
30RainbowItem::RainbowItem(const char* string)
31	:
32	BStringItem(string, 0, false)
33{
34}
35
36
37void
38RainbowItem::DrawItem(BView* owner, BRect frame, bool complete)
39{
40	rgb_color highColor = owner->HighColor();
41	rgb_color lowColor = owner->LowColor();
42
43	if (IsSelected() || complete) {
44		if (IsSelected()) {
45			owner->SetHighUIColor(B_LIST_SELECTED_BACKGROUND_COLOR);
46			owner->SetLowColor(owner->HighColor());
47		} else
48			owner->SetHighColor(lowColor);
49
50		owner->FillRect(frame);
51	}
52
53	float spacer = ceilf(be_control_look->DefaultItemSpacing() / 2);
54
55	BRect colorRect(frame);
56	colorRect.InsetBy(2.0f, 2.0f);
57	colorRect.left += spacer;
58	colorRect.right = colorRect.left + floorf(colorRect.Height() * M_PHI);
59
60	// draw the rainbow
61	BGradientLinear gradient;
62	gradient.AddColor((rgb_color){ 255, 65,  54  }, 0);   // red
63	gradient.AddColor((rgb_color){ 255, 133, 27  }, 60);  // orange
64	gradient.AddColor((rgb_color){ 255, 220, 0   }, 102); // yellow
65	gradient.AddColor((rgb_color){ 46,  204, 64  }, 153); // green
66	gradient.AddColor((rgb_color){ 0,   116, 217 }, 195); // blue
67	// indigo ;)
68	gradient.AddColor((rgb_color){ 177, 13,  201 }, 255); // violet
69	gradient.SetStart(colorRect.LeftTop());
70	gradient.SetEnd(colorRect.RightBottom());
71	owner->FillRect(colorRect, gradient);
72
73	// draw the border
74	owner->SetHighUIColor(B_CONTROL_BORDER_COLOR);
75	owner->StrokeRect(colorRect);
76
77	// draw the string
78	owner->MovePenTo(colorRect.right + spacer, frame.top + BaselineOffset());
79
80	if (!IsEnabled()) {
81		rgb_color textColor = ui_color(B_LIST_ITEM_TEXT_COLOR);
82		if (textColor.red + textColor.green + textColor.blue > 128 * 3)
83			owner->SetHighColor(tint_color(textColor, B_DARKEN_2_TINT));
84		else
85			owner->SetHighColor(tint_color(textColor, B_LIGHTEN_2_TINT));
86	} else {
87		if (IsSelected())
88			owner->SetHighUIColor(B_LIST_SELECTED_ITEM_TEXT_COLOR);
89		else
90			owner->SetHighUIColor(B_LIST_ITEM_TEXT_COLOR);
91	}
92
93	owner->DrawString(Text());
94
95	owner->SetHighColor(highColor);
96	owner->SetLowColor(lowColor);
97}
98