* 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)
{
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;
}
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);
}