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