xref: /haiku/src/apps/mediaplayer/interface/DurationView.cpp (revision 004b420b08aedc3195e3313560b6fa6fe039a861)
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 // constructor
154e57cee5SStephan Aßmus DurationView::DurationView(const char* name)
164e57cee5SStephan Aßmus 	:
174e57cee5SStephan Aßmus 	BStringView(name, ""),
184e57cee5SStephan Aßmus 	fMode(kTimeToFinish),
194e57cee5SStephan Aßmus 	fPosition(0),
204e57cee5SStephan Aßmus 	fDuration(0),
214e57cee5SStephan Aßmus 	fDisplayDuration(0)
224e57cee5SStephan Aßmus {
234e57cee5SStephan Aßmus 	BFont font(be_bold_font);
244e57cee5SStephan Aßmus 	font.SetSize(font.Size() * 1.2);
254e57cee5SStephan Aßmus 	SetFont(&font);
264e57cee5SStephan Aßmus 
274e57cee5SStephan Aßmus 	SetAlignment(B_ALIGN_RIGHT);
284e57cee5SStephan Aßmus 
294e57cee5SStephan Aßmus 	_Update();
304e57cee5SStephan Aßmus }
314e57cee5SStephan Aßmus 
324e57cee5SStephan Aßmus 
334e57cee5SStephan Aßmus void
344e57cee5SStephan Aßmus DurationView::AttachedToWindow()
354e57cee5SStephan Aßmus {
364e57cee5SStephan Aßmus 	BStringView::AttachedToWindow();
374e57cee5SStephan Aßmus 	SetHighColor(tint_color(ViewColor(), B_DARKEN_4_TINT));
384e57cee5SStephan Aßmus }
394e57cee5SStephan Aßmus 
404e57cee5SStephan Aßmus 
414e57cee5SStephan Aßmus void
424e57cee5SStephan Aßmus DurationView::MouseDown(BPoint where)
434e57cee5SStephan Aßmus {
444e57cee5SStephan Aßmus 	// Switch through the modes
454e57cee5SStephan Aßmus 	uint32 mode = fMode + 1;
464e57cee5SStephan Aßmus 	if (mode == kLastMode)
474e57cee5SStephan Aßmus 		mode = 0;
484e57cee5SStephan Aßmus 	SetMode(mode);
494e57cee5SStephan Aßmus }
504e57cee5SStephan Aßmus 
514e57cee5SStephan Aßmus 
524e57cee5SStephan Aßmus BSize
534e57cee5SStephan Aßmus DurationView::MinSize()
544e57cee5SStephan Aßmus {
55*004b420bSStephan Aßmus 	BSize size;
56*004b420bSStephan Aßmus 	char string[64];
57*004b420bSStephan Aßmus 	duration_to_string(int32(fDuration / -1000000LL), string, sizeof(string));
58*004b420bSStephan Aßmus 	size.width = StringWidth(string);
59*004b420bSStephan Aßmus 	font_height fontHeight;
60*004b420bSStephan Aßmus 	GetFontHeight(&fontHeight);
61*004b420bSStephan Aßmus 	size.height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
62*004b420bSStephan Aßmus 	return BLayoutUtils::ComposeSize(ExplicitMinSize(), size);
634e57cee5SStephan Aßmus }
644e57cee5SStephan Aßmus 
654e57cee5SStephan Aßmus 
664e57cee5SStephan Aßmus BSize
674e57cee5SStephan Aßmus DurationView::MaxSize()
684e57cee5SStephan Aßmus {
694e57cee5SStephan Aßmus 	return BLayoutUtils::ComposeSize(ExplicitMaxSize(), MinSize());
704e57cee5SStephan Aßmus }
714e57cee5SStephan Aßmus 
724e57cee5SStephan Aßmus 
734e57cee5SStephan Aßmus // #pragma mark -
744e57cee5SStephan Aßmus 
754e57cee5SStephan Aßmus 
764e57cee5SStephan Aßmus void
774e57cee5SStephan Aßmus DurationView::Update(bigtime_t position, bigtime_t duration)
784e57cee5SStephan Aßmus {
794e57cee5SStephan Aßmus 	if (position == fPosition && duration == fDuration)
804e57cee5SStephan Aßmus 		return;
814e57cee5SStephan Aßmus 
824e57cee5SStephan Aßmus 	fPosition = position;
83*004b420bSStephan Aßmus 	if (fDuration != duration) {
844e57cee5SStephan Aßmus 		fDuration = duration;
85*004b420bSStephan Aßmus 		InvalidateLayout();
86*004b420bSStephan Aßmus 	}
874e57cee5SStephan Aßmus 	_Update();
884e57cee5SStephan Aßmus }
894e57cee5SStephan Aßmus 
904e57cee5SStephan Aßmus 
914e57cee5SStephan Aßmus void
924e57cee5SStephan Aßmus DurationView::SetMode(uint32 mode)
934e57cee5SStephan Aßmus {
944e57cee5SStephan Aßmus 	if (mode == fMode)
954e57cee5SStephan Aßmus 		return;
964e57cee5SStephan Aßmus 
974e57cee5SStephan Aßmus 	fMode = mode;
984e57cee5SStephan Aßmus 	_Update();
994e57cee5SStephan Aßmus }
1004e57cee5SStephan Aßmus 
1014e57cee5SStephan Aßmus 
1024e57cee5SStephan Aßmus void
1034e57cee5SStephan Aßmus DurationView::_Update()
1044e57cee5SStephan Aßmus {
1054e57cee5SStephan Aßmus 	switch (fMode) {
1064e57cee5SStephan Aßmus 		case kTimeElapsed:
1074e57cee5SStephan Aßmus 			_GenerateString(fPosition);
1084e57cee5SStephan Aßmus 			break;
1094e57cee5SStephan Aßmus 		default:
1104e57cee5SStephan Aßmus 		case kTimeToFinish:
1114e57cee5SStephan Aßmus 			_GenerateString(fPosition - fDuration);
1124e57cee5SStephan Aßmus 			break;
1134e57cee5SStephan Aßmus 		case kDuration:
1144e57cee5SStephan Aßmus 			_GenerateString(fDuration);
1154e57cee5SStephan Aßmus 			break;
1164e57cee5SStephan Aßmus 	}
1174e57cee5SStephan Aßmus }
1184e57cee5SStephan Aßmus 
1194e57cee5SStephan Aßmus 
1204e57cee5SStephan Aßmus void
1214e57cee5SStephan Aßmus DurationView::_GenerateString(bigtime_t duration)
1224e57cee5SStephan Aßmus {
1234e57cee5SStephan Aßmus 	duration /= 1000000;
1244e57cee5SStephan Aßmus 	if (fDisplayDuration == duration)
1254e57cee5SStephan Aßmus 		return;
1264e57cee5SStephan Aßmus 
1274e57cee5SStephan Aßmus 	fDisplayDuration = duration;
1284e57cee5SStephan Aßmus 
1294e57cee5SStephan Aßmus 	char string[64];
1304e57cee5SStephan Aßmus 	duration_to_string(duration, string, sizeof(string));
1314e57cee5SStephan Aßmus 
1324e57cee5SStephan Aßmus 	SetText(string);
1334e57cee5SStephan Aßmus }
1344e57cee5SStephan Aßmus 
135