14e57cee5SStephan Aßmus /*
24e57cee5SStephan Aßmus * Copyright 2010, Stephan Aßmus <superstippi@gmx.de>.
34e57cee5SStephan Aßmus * Distributed under the terms of the MIT License.
44e57cee5SStephan Aßmus */
54e57cee5SStephan Aßmus
64e57cee5SStephan Aßmus
74e57cee5SStephan Aßmus #include "DurationView.h"
84e57cee5SStephan Aßmus
94e57cee5SStephan Aßmus #include <LayoutUtils.h>
104e57cee5SStephan Aßmus
114e57cee5SStephan Aßmus #include "DurationToString.h"
124e57cee5SStephan Aßmus
134e57cee5SStephan Aßmus
DurationView(const char * name)144e57cee5SStephan Aßmus DurationView::DurationView(const char* name)
154e57cee5SStephan Aßmus :
164e57cee5SStephan Aßmus BStringView(name, ""),
174e57cee5SStephan Aßmus fMode(kTimeToFinish),
184e57cee5SStephan Aßmus fPosition(0),
194e57cee5SStephan Aßmus fDuration(0),
204e57cee5SStephan Aßmus fDisplayDuration(0)
214e57cee5SStephan Aßmus {
22341ea11eSStephan Aßmus SetSymbolScale(1.0f);
234e57cee5SStephan Aßmus
244e57cee5SStephan Aßmus SetAlignment(B_ALIGN_RIGHT);
254e57cee5SStephan Aßmus
264e57cee5SStephan Aßmus _Update();
274e57cee5SStephan Aßmus }
284e57cee5SStephan Aßmus
294e57cee5SStephan Aßmus
304e57cee5SStephan Aßmus void
AttachedToWindow()314e57cee5SStephan Aßmus DurationView::AttachedToWindow()
324e57cee5SStephan Aßmus {
334e57cee5SStephan Aßmus BStringView::AttachedToWindow();
34*fa19dd44Slooncraz _UpdateTextColor();
354e57cee5SStephan Aßmus }
364e57cee5SStephan Aßmus
374e57cee5SStephan Aßmus
384e57cee5SStephan Aßmus void
MouseDown(BPoint where)394e57cee5SStephan Aßmus DurationView::MouseDown(BPoint where)
404e57cee5SStephan Aßmus {
414e57cee5SStephan Aßmus // Switch through the modes
424e57cee5SStephan Aßmus uint32 mode = fMode + 1;
434e57cee5SStephan Aßmus if (mode == kLastMode)
444e57cee5SStephan Aßmus mode = 0;
454e57cee5SStephan Aßmus SetMode(mode);
464e57cee5SStephan Aßmus }
474e57cee5SStephan Aßmus
484e57cee5SStephan Aßmus
49*fa19dd44Slooncraz void
MessageReceived(BMessage * message)50*fa19dd44Slooncraz DurationView::MessageReceived(BMessage* message)
51*fa19dd44Slooncraz {
52*fa19dd44Slooncraz if (message->what == B_COLORS_UPDATED
53*fa19dd44Slooncraz && message->HasColor(ui_color_name(B_PANEL_TEXT_COLOR)))
54*fa19dd44Slooncraz _UpdateTextColor();
55*fa19dd44Slooncraz
56*fa19dd44Slooncraz BStringView::MessageReceived(message);
57*fa19dd44Slooncraz }
58*fa19dd44Slooncraz
59*fa19dd44Slooncraz
604e57cee5SStephan Aßmus BSize
MinSize()614e57cee5SStephan Aßmus DurationView::MinSize()
624e57cee5SStephan Aßmus {
63004b420bSStephan Aßmus BSize size;
64004b420bSStephan Aßmus char string[64];
65004b420bSStephan Aßmus duration_to_string(int32(fDuration / -1000000LL), string, sizeof(string));
66004b420bSStephan Aßmus size.width = StringWidth(string);
67004b420bSStephan Aßmus font_height fontHeight;
68004b420bSStephan Aßmus GetFontHeight(&fontHeight);
69004b420bSStephan Aßmus size.height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
70004b420bSStephan Aßmus return BLayoutUtils::ComposeSize(ExplicitMinSize(), size);
714e57cee5SStephan Aßmus }
724e57cee5SStephan Aßmus
734e57cee5SStephan Aßmus
744e57cee5SStephan Aßmus BSize
MaxSize()754e57cee5SStephan Aßmus DurationView::MaxSize()
764e57cee5SStephan Aßmus {
774e57cee5SStephan Aßmus return BLayoutUtils::ComposeSize(ExplicitMaxSize(), MinSize());
784e57cee5SStephan Aßmus }
794e57cee5SStephan Aßmus
804e57cee5SStephan Aßmus
814e57cee5SStephan Aßmus // #pragma mark -
824e57cee5SStephan Aßmus
834e57cee5SStephan Aßmus
844e57cee5SStephan Aßmus void
Update(bigtime_t position,bigtime_t duration)854e57cee5SStephan Aßmus DurationView::Update(bigtime_t position, bigtime_t duration)
864e57cee5SStephan Aßmus {
874e57cee5SStephan Aßmus if (position == fPosition && duration == fDuration)
884e57cee5SStephan Aßmus return;
894e57cee5SStephan Aßmus
904e57cee5SStephan Aßmus fPosition = position;
91004b420bSStephan Aßmus if (fDuration != duration) {
924e57cee5SStephan Aßmus fDuration = duration;
93004b420bSStephan Aßmus InvalidateLayout();
94004b420bSStephan Aßmus }
954e57cee5SStephan Aßmus _Update();
964e57cee5SStephan Aßmus }
974e57cee5SStephan Aßmus
984e57cee5SStephan Aßmus
994e57cee5SStephan Aßmus void
SetMode(uint32 mode)1004e57cee5SStephan Aßmus DurationView::SetMode(uint32 mode)
1014e57cee5SStephan Aßmus {
1024e57cee5SStephan Aßmus if (mode == fMode)
1034e57cee5SStephan Aßmus return;
1044e57cee5SStephan Aßmus
1054e57cee5SStephan Aßmus fMode = mode;
1064e57cee5SStephan Aßmus _Update();
1074e57cee5SStephan Aßmus }
1084e57cee5SStephan Aßmus
1094e57cee5SStephan Aßmus
1104e57cee5SStephan Aßmus void
SetSymbolScale(float scale)111341ea11eSStephan Aßmus DurationView::SetSymbolScale(float scale)
112341ea11eSStephan Aßmus {
113c2eee6f5SAxel Dörfler if (scale != 1.0f) {
114341ea11eSStephan Aßmus BFont font(be_bold_font);
115341ea11eSStephan Aßmus font.SetSize(font.Size() * scale * 1.2);
116341ea11eSStephan Aßmus SetFont(&font);
117c2eee6f5SAxel Dörfler } else
118c2eee6f5SAxel Dörfler SetFont(be_plain_font);
119c2eee6f5SAxel Dörfler
120341ea11eSStephan Aßmus InvalidateLayout();
121341ea11eSStephan Aßmus }
122341ea11eSStephan Aßmus
123341ea11eSStephan Aßmus
124341ea11eSStephan Aßmus void
_Update()1254e57cee5SStephan Aßmus DurationView::_Update()
1264e57cee5SStephan Aßmus {
1274e57cee5SStephan Aßmus switch (fMode) {
1284e57cee5SStephan Aßmus case kTimeElapsed:
1294e57cee5SStephan Aßmus _GenerateString(fPosition);
1304e57cee5SStephan Aßmus break;
1314e57cee5SStephan Aßmus default:
1324e57cee5SStephan Aßmus case kTimeToFinish:
1334e57cee5SStephan Aßmus _GenerateString(fPosition - fDuration);
1344e57cee5SStephan Aßmus break;
1354e57cee5SStephan Aßmus case kDuration:
1364e57cee5SStephan Aßmus _GenerateString(fDuration);
1374e57cee5SStephan Aßmus break;
1384e57cee5SStephan Aßmus }
1394e57cee5SStephan Aßmus }
1404e57cee5SStephan Aßmus
1414e57cee5SStephan Aßmus
1424e57cee5SStephan Aßmus void
_UpdateTextColor()143*fa19dd44Slooncraz DurationView::_UpdateTextColor()
144*fa19dd44Slooncraz {
145*fa19dd44Slooncraz SetHighColor(mix_color(ViewColor(), ui_color(B_PANEL_TEXT_COLOR), 128));
146*fa19dd44Slooncraz }
147*fa19dd44Slooncraz
148*fa19dd44Slooncraz
149*fa19dd44Slooncraz void
_GenerateString(bigtime_t duration)1504e57cee5SStephan Aßmus DurationView::_GenerateString(bigtime_t duration)
1514e57cee5SStephan Aßmus {
1524e57cee5SStephan Aßmus duration /= 1000000;
1534e57cee5SStephan Aßmus if (fDisplayDuration == duration)
1544e57cee5SStephan Aßmus return;
1554e57cee5SStephan Aßmus
1564e57cee5SStephan Aßmus fDisplayDuration = duration;
1574e57cee5SStephan Aßmus
1584e57cee5SStephan Aßmus char string[64];
1594e57cee5SStephan Aßmus duration_to_string(duration, string, sizeof(string));
1604e57cee5SStephan Aßmus
1614e57cee5SStephan Aßmus SetText(string);
1624e57cee5SStephan Aßmus }
1634e57cee5SStephan Aßmus
164