⛏️ index : haiku.git

/*
 * Copyright 2010, Stephan Aßmus <superstippi@gmx.de>.
 * Distributed under the terms of the MIT License.
 */


#include "DurationView.h"

#include <LayoutUtils.h>

#include "DurationToString.h"


DurationView::DurationView(const char* name)
	:
	BStringView(name, ""),
	fMode(kTimeToFinish),
	fPosition(0),
	fDuration(0),
	fDisplayDuration(0)
{
	SetSymbolScale(1.0f);

	SetAlignment(B_ALIGN_RIGHT);

	_Update();
}


void
DurationView::AttachedToWindow()
{
	BStringView::AttachedToWindow();
	_UpdateTextColor();
}


void
DurationView::MouseDown(BPoint where)
{
	// Switch through the modes
	uint32 mode = fMode + 1;
	if (mode == kLastMode)
		mode = 0;
	SetMode(mode);
}


void
DurationView::MessageReceived(BMessage* message)
{
	if (message->what == B_COLORS_UPDATED
		&& message->HasColor(ui_color_name(B_PANEL_TEXT_COLOR)))
			_UpdateTextColor();

	BStringView::MessageReceived(message);
}


BSize
DurationView::MinSize()
{
	BSize size;
	char string[64];
	duration_to_string(int32(fDuration / -1000000LL), string, sizeof(string));
	size.width = StringWidth(string);
	font_height fontHeight;
	GetFontHeight(&fontHeight);
	size.height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
	return BLayoutUtils::ComposeSize(ExplicitMinSize(), size);
}


BSize
DurationView::MaxSize()
{
	return BLayoutUtils::ComposeSize(ExplicitMaxSize(), MinSize());
}


bigtime_t
DurationView::TimeDuration()
{
	return fDuration;
}


// #pragma mark -


void
DurationView::Update(bigtime_t position, bigtime_t duration)
{
	if (position == fPosition && duration == fDuration)
		return;

	fPosition = position;
	if (fDuration != duration) {
		fDuration = duration;
		InvalidateLayout();
	}
	_Update();
}


void
DurationView::SetMode(uint32 mode)
{
	if (mode == fMode)
		return;

	fMode = mode;
	_Update();
}


void
DurationView::SetSymbolScale(float scale)
{
	if (scale != 1.0f) {
		BFont font(be_bold_font);
		font.SetSize(font.Size() * scale * 1.2);
		SetFont(&font);
	} else
		SetFont(be_plain_font);

	InvalidateLayout();
}


void
DurationView::_Update()
{
	switch (fMode) {
		case kTimeElapsed:
			_GenerateString(fPosition);
			break;
		default:
		case kTimeToFinish:
			_GenerateString(fPosition - fDuration);
			break;
		case kDuration:
			_GenerateString(fDuration);
			break;
	}
}


void
DurationView::_UpdateTextColor()
{
	SetHighColor(mix_color(ViewColor(), ui_color(B_PANEL_TEXT_COLOR), 128));
}


void
DurationView::_GenerateString(bigtime_t duration)
{
	duration /= 1000000;
	if (fDisplayDuration == duration)
		return;

	fDisplayDuration = duration;

	char string[64];
	duration_to_string(duration, string, sizeof(string));

	SetText(string);
}