xref: /haiku/src/apps/mediaplayer/interface/DurationView.cpp (revision c2eee6f55bf80b098d7f88c71a4d773f1346a463)
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 
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
314e57cee5SStephan Aßmus DurationView::AttachedToWindow()
324e57cee5SStephan Aßmus {
334e57cee5SStephan Aßmus 	BStringView::AttachedToWindow();
344e57cee5SStephan Aßmus 	SetHighColor(tint_color(ViewColor(), B_DARKEN_4_TINT));
354e57cee5SStephan Aßmus }
364e57cee5SStephan Aßmus 
374e57cee5SStephan Aßmus 
384e57cee5SStephan Aßmus void
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 
494e57cee5SStephan Aßmus BSize
504e57cee5SStephan Aßmus DurationView::MinSize()
514e57cee5SStephan Aßmus {
52004b420bSStephan Aßmus 	BSize size;
53004b420bSStephan Aßmus 	char string[64];
54004b420bSStephan Aßmus 	duration_to_string(int32(fDuration / -1000000LL), string, sizeof(string));
55004b420bSStephan Aßmus 	size.width = StringWidth(string);
56004b420bSStephan Aßmus 	font_height fontHeight;
57004b420bSStephan Aßmus 	GetFontHeight(&fontHeight);
58004b420bSStephan Aßmus 	size.height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
59004b420bSStephan Aßmus 	return BLayoutUtils::ComposeSize(ExplicitMinSize(), size);
604e57cee5SStephan Aßmus }
614e57cee5SStephan Aßmus 
624e57cee5SStephan Aßmus 
634e57cee5SStephan Aßmus BSize
644e57cee5SStephan Aßmus DurationView::MaxSize()
654e57cee5SStephan Aßmus {
664e57cee5SStephan Aßmus 	return BLayoutUtils::ComposeSize(ExplicitMaxSize(), MinSize());
674e57cee5SStephan Aßmus }
684e57cee5SStephan Aßmus 
694e57cee5SStephan Aßmus 
704e57cee5SStephan Aßmus // #pragma mark -
714e57cee5SStephan Aßmus 
724e57cee5SStephan Aßmus 
734e57cee5SStephan Aßmus void
744e57cee5SStephan Aßmus DurationView::Update(bigtime_t position, bigtime_t duration)
754e57cee5SStephan Aßmus {
764e57cee5SStephan Aßmus 	if (position == fPosition && duration == fDuration)
774e57cee5SStephan Aßmus 		return;
784e57cee5SStephan Aßmus 
794e57cee5SStephan Aßmus 	fPosition = position;
80004b420bSStephan Aßmus 	if (fDuration != duration) {
814e57cee5SStephan Aßmus 		fDuration = duration;
82004b420bSStephan Aßmus 		InvalidateLayout();
83004b420bSStephan Aßmus 	}
844e57cee5SStephan Aßmus 	_Update();
854e57cee5SStephan Aßmus }
864e57cee5SStephan Aßmus 
874e57cee5SStephan Aßmus 
884e57cee5SStephan Aßmus void
894e57cee5SStephan Aßmus DurationView::SetMode(uint32 mode)
904e57cee5SStephan Aßmus {
914e57cee5SStephan Aßmus 	if (mode == fMode)
924e57cee5SStephan Aßmus 		return;
934e57cee5SStephan Aßmus 
944e57cee5SStephan Aßmus 	fMode = mode;
954e57cee5SStephan Aßmus 	_Update();
964e57cee5SStephan Aßmus }
974e57cee5SStephan Aßmus 
984e57cee5SStephan Aßmus 
994e57cee5SStephan Aßmus void
100341ea11eSStephan Aßmus DurationView::SetSymbolScale(float scale)
101341ea11eSStephan Aßmus {
102*c2eee6f5SAxel Dörfler 	if (scale != 1.0f) {
103341ea11eSStephan Aßmus 		BFont font(be_bold_font);
104341ea11eSStephan Aßmus 		font.SetSize(font.Size() * scale * 1.2);
105341ea11eSStephan Aßmus 		SetFont(&font);
106*c2eee6f5SAxel Dörfler 	} else
107*c2eee6f5SAxel Dörfler 		SetFont(be_plain_font);
108*c2eee6f5SAxel Dörfler 
109341ea11eSStephan Aßmus 	InvalidateLayout();
110341ea11eSStephan Aßmus }
111341ea11eSStephan Aßmus 
112341ea11eSStephan Aßmus 
113341ea11eSStephan Aßmus void
1144e57cee5SStephan Aßmus DurationView::_Update()
1154e57cee5SStephan Aßmus {
1164e57cee5SStephan Aßmus 	switch (fMode) {
1174e57cee5SStephan Aßmus 		case kTimeElapsed:
1184e57cee5SStephan Aßmus 			_GenerateString(fPosition);
1194e57cee5SStephan Aßmus 			break;
1204e57cee5SStephan Aßmus 		default:
1214e57cee5SStephan Aßmus 		case kTimeToFinish:
1224e57cee5SStephan Aßmus 			_GenerateString(fPosition - fDuration);
1234e57cee5SStephan Aßmus 			break;
1244e57cee5SStephan Aßmus 		case kDuration:
1254e57cee5SStephan Aßmus 			_GenerateString(fDuration);
1264e57cee5SStephan Aßmus 			break;
1274e57cee5SStephan Aßmus 	}
1284e57cee5SStephan Aßmus }
1294e57cee5SStephan Aßmus 
1304e57cee5SStephan Aßmus 
1314e57cee5SStephan Aßmus void
1324e57cee5SStephan Aßmus DurationView::_GenerateString(bigtime_t duration)
1334e57cee5SStephan Aßmus {
1344e57cee5SStephan Aßmus 	duration /= 1000000;
1354e57cee5SStephan Aßmus 	if (fDisplayDuration == duration)
1364e57cee5SStephan Aßmus 		return;
1374e57cee5SStephan Aßmus 
1384e57cee5SStephan Aßmus 	fDisplayDuration = duration;
1394e57cee5SStephan Aßmus 
1404e57cee5SStephan Aßmus 	char string[64];
1414e57cee5SStephan Aßmus 	duration_to_string(duration, string, sizeof(string));
1424e57cee5SStephan Aßmus 
1434e57cee5SStephan Aßmus 	SetText(string);
1444e57cee5SStephan Aßmus }
1454e57cee5SStephan Aßmus 
146