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