1 /*
2 * Copyright 2015 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Axel Dörfler, <axeld@pinc-software.de>
7 */
8
9
10 #include "ServiceListItem.h"
11
12 #include <Catalog.h>
13 #include <ControlLook.h>
14
15
16 #undef B_TRANSLATION_CONTEXT
17 #define B_TRANSLATION_CONTEXT "ServiceListItem"
18
19
20 static const char* kEnabledState = B_TRANSLATE_MARK("on");
21 static const char* kDisabledState = B_TRANSLATE_MARK("off");
22
23
ServiceListItem(const char * name,const char * label,const BNetworkSettings & settings)24 ServiceListItem::ServiceListItem(const char* name, const char* label,
25 const BNetworkSettings& settings)
26 :
27 fName(name),
28 fLabel(label),
29 fSettings(settings),
30 fOwner(NULL),
31 fLineOffset(0),
32 fEnabled(false)
33 {
34 }
35
36
~ServiceListItem()37 ServiceListItem::~ServiceListItem()
38 {
39 }
40
41
42 void
DrawItem(BView * owner,BRect bounds,bool complete)43 ServiceListItem::DrawItem(BView* owner, BRect bounds, bool complete)
44 {
45 owner->PushState();
46
47 rgb_color lowColor = owner->LowColor();
48
49 if (IsSelected() || complete) {
50 if (IsSelected()) {
51 owner->SetHighColor(ui_color(B_LIST_SELECTED_BACKGROUND_COLOR));
52 owner->SetLowColor(owner->HighColor());
53 } else
54 owner->SetHighColor(lowColor);
55
56 owner->FillRect(bounds);
57 }
58
59 const char* stateText = fEnabled ? B_TRANSLATE(kEnabledState)
60 : B_TRANSLATE(kDisabledState);
61
62 // Set the initial bounds of item contents
63 BPoint statePoint = bounds.RightTop() + BPoint(0, fLineOffset)
64 - BPoint(be_plain_font->StringWidth(stateText)
65 + be_control_look->DefaultLabelSpacing(), 0);
66 BPoint namePoint = bounds.LeftTop()
67 + BPoint(be_control_look->DefaultLabelSpacing(), fLineOffset);
68
69 owner->SetDrawingMode(B_OP_OVER);
70
71 rgb_color textColor;
72 if (IsSelected())
73 textColor = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR);
74 else
75 textColor = ui_color(B_LIST_ITEM_TEXT_COLOR);
76
77 owner->SetHighColor(textColor);
78 owner->DrawString(fLabel, namePoint);
79
80 if (!fEnabled) {
81 if (textColor.red + textColor.green + textColor.blue > 128 * 3)
82 owner->SetHighColor(tint_color(textColor, B_DARKEN_1_TINT));
83 else
84 owner->SetHighColor(tint_color(textColor, B_LIGHTEN_1_TINT));
85 }
86 owner->DrawString(stateText, statePoint);
87
88 owner->PopState();
89 }
90
91
92 void
Update(BView * owner,const BFont * font)93 ServiceListItem::Update(BView* owner, const BFont* font)
94 {
95 fOwner = owner;
96 fEnabled = IsEnabled();
97
98 BListItem::Update(owner, font);
99 font_height height;
100 font->GetHeight(&height);
101
102 fLineOffset = 2 + ceilf(height.ascent + height.leading / 2);
103
104 float maxStateWidth = std::max(font->StringWidth(B_TRANSLATE(kEnabledState)),
105 font->StringWidth(B_TRANSLATE(kDisabledState)));
106 SetWidth(font->StringWidth(fLabel)
107 + 3 * be_control_look->DefaultLabelSpacing() + maxStateWidth);
108 SetHeight(4 + ceilf(height.ascent + height.leading + height.descent));
109 }
110
111
112 void
SettingsUpdated(uint32 type)113 ServiceListItem::SettingsUpdated(uint32 type)
114 {
115 if (type == BNetworkSettings::kMsgServiceSettingsUpdated) {
116 bool wasEnabled = fEnabled;
117 fEnabled = IsEnabled();
118 if (wasEnabled != fEnabled)
119 fOwner->Invalidate();
120 }
121 }
122
123
124 bool
IsEnabled()125 ServiceListItem::IsEnabled()
126 {
127 return fSettings.Service(fName).IsRunning();
128 }
129