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