xref: /haiku/src/apps/mediaplayer/interface/DurationView.cpp (revision bab64f65bb775dc23060e276f1f1c4498ab7af6c)
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