1/*
2 * Copyright 2019, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Author:
6 *		Preetpal Kaur <preetpalok123@gmail.com>
7 */
8
9
10#include "InputDeviceView.h"
11
12
13#include <Catalog.h>
14#include <DateFormat.h>
15#include <Input.h>
16#include <LayoutBuilder.h>
17#include <ListView.h>
18#include <Locale.h>
19#include <ScrollView.h>
20#include <String.h>
21#include <StringItem.h>
22
23
24#undef B_TRANSLATION_CONTEXT
25#define B_TRANSLATION_CONTEXT "DeviceList"
26
27
28InputIcons* DeviceListItemView::sIcons = NULL;
29
30
31DeviceListItemView::DeviceListItemView(BString title, input_type type)
32	:
33	BListItem((uint32)0),
34	fTitle(title),
35	fInputType(type)
36{
37}
38
39struct DeviceListItemView::Renderer {
40	Renderer()
41		:
42		fTitle(NULL),
43		fPrimaryIcon(NULL),
44		fSelected(false)
45	{
46	}
47
48	void AddIcon(BBitmap* icon)
49	{
50		if (!fPrimaryIcon)
51			fPrimaryIcon = icon;
52	}
53
54	void SetTitle(const char* title)
55	{
56		fTitle = title;
57	}
58
59	void SetSelected(bool selected)
60	{
61		fSelected = selected;
62	}
63
64	void Render(BView* onto, BRect frame, bool complete = false)
65	{
66		const rgb_color lowColor = onto->LowColor();
67		const rgb_color highColor = onto->HighColor();
68
69		if (fSelected || complete) {
70			if (fSelected)
71				onto->SetLowColor(ui_color(B_LIST_SELECTED_BACKGROUND_COLOR));
72			onto->FillRect(frame, B_SOLID_LOW);
73		}
74
75		BPoint point(frame.left + 4.0f,
76			frame.top + (frame.Height() - InputIcons::sBounds.Height()) / 2.0f);
77
78		BRect iconFrame(InputIcons::IconRectAt(point + BPoint(1, 0)));
79
80		onto->SetDrawingMode(B_OP_OVER);
81		if (fPrimaryIcon) {
82			onto->DrawBitmap(fPrimaryIcon, iconFrame);
83			point.x = iconFrame.right + 1;
84		}
85
86		onto->SetDrawingMode(B_OP_COPY);
87
88		BFont font = be_plain_font;
89		font_height fontInfo;
90		font.GetHeight(&fontInfo);
91
92		onto->SetFont(&font);
93		onto->MovePenTo(point.x + 8,
94			frame.top + fontInfo.ascent
95				+ (frame.Height() - ceilf(fontInfo.ascent + fontInfo.descent))
96					/ 2.0f);
97		onto->DrawString(fTitle);
98
99		onto->SetHighColor(highColor);
100		onto->SetLowColor(lowColor);
101	}
102
103	float ItemWidth()
104	{
105		float width = 4.0f;
106		width += be_plain_font->StringWidth(fTitle) +
107			(fPrimaryIcon != NULL ? fPrimaryIcon->Bounds().Width() : 16.0f);
108		return width;
109	}
110
111private:
112
113	BString		fTitle;
114	BBitmap*	fPrimaryIcon;
115	bool		fSelected;
116};
117
118
119void
120DeviceListItemView::Update(BView* owner, const BFont* font)
121{
122	BListItem::Update(owner, font);
123
124	float iconHeight = InputIcons::sBounds.Height() + 1;
125	if ((Height() < iconHeight + kITEM_MARGIN * 2))
126		SetHeight(iconHeight + kITEM_MARGIN * 2);
127
128	Renderer renderer;
129	renderer.SetTitle(Label());
130	renderer.SetTitle(fTitle);
131	SetRenderParameters(renderer);
132	SetWidth(renderer.ItemWidth());
133}
134
135
136void
137DeviceListItemView::DrawItem(BView* owner, BRect frame, bool complete)
138{
139	Renderer renderer;
140	renderer.SetSelected(IsSelected());
141	renderer.SetTitle(Label());
142	SetRenderParameters(renderer);
143	renderer.Render(owner, frame, complete);
144}
145
146
147void
148DeviceListItemView::SetRenderParameters(Renderer& renderer)
149{
150	if (Icons() != NULL) {
151		if (fInputType == MOUSE_TYPE)
152			renderer.AddIcon(&Icons()->mouseIcon);
153		else if (fInputType == TOUCHPAD_TYPE)
154			renderer.AddIcon(&Icons()->touchpadIcon);
155		else if (fInputType == KEYBOARD_TYPE)
156			renderer.AddIcon(&Icons()->keyboardIcon);
157	}
158}
159