* Added DurationView, defaulting to show the time remaining to finish.

* Added DurationToString to support code, used by the PositionToolTip
   as well now.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38588 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2010-09-08 20:59:42 +00:00
parent 737186ccb0
commit 4e57cee58b
8 changed files with 259 additions and 9 deletions
+2
View File
@@ -25,6 +25,7 @@ for sourceDir in $(sourceDirs) {
Application MediaPlayer :
# interface
DurationView.cpp
PeakView.cpp
PlayPauseButton.cpp
PositionToolTip.cpp
@@ -87,6 +88,7 @@ Application MediaPlayer :
ColorSpaceToString.cpp
Command.cpp
CommandStack.cpp
DurationToString.cpp
Event.cpp
EventQueue.cpp
FileReadWrite.cpp
@@ -0,0 +1,131 @@
/*
* Copyright 2010, Stephan Aßmus <[email protected]>.
* Distributed under the terms of the MIT License.
*/
#include "DurationView.h"
#include <LayoutUtils.h>
#include "DurationToString.h"
// constructor
DurationView::DurationView(const char* name)
:
BStringView(name, ""),
fMode(kTimeToFinish),
fPosition(0),
fDuration(0),
fDisplayDuration(0)
{
BFont font(be_bold_font);
font.SetSize(font.Size() * 1.2);
SetFont(&font);
SetAlignment(B_ALIGN_RIGHT);
_Update();
}
void
DurationView::AttachedToWindow()
{
BStringView::AttachedToWindow();
SetHighColor(tint_color(ViewColor(), B_DARKEN_4_TINT));
}
void
DurationView::MouseDown(BPoint where)
{
// Switch through the modes
uint32 mode = fMode + 1;
if (mode == kLastMode)
mode = 0;
SetMode(mode);
}
BSize
DurationView::MinSize()
{
// If we wanted to have a fixed size:
// BSize size;
// size.width = StringWidth("-00:00:00");
// font_height fontHeight;
// GetFontHeight(&fontHeight);
// size.height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
// return BLayoutUtils::ComposeSize(ExplicitMinSize(), size);
return BStringView::MinSize();
}
BSize
DurationView::MaxSize()
{
return BLayoutUtils::ComposeSize(ExplicitMaxSize(), MinSize());
}
// #pragma mark -
void
DurationView::Update(bigtime_t position, bigtime_t duration)
{
if (position == fPosition && duration == fDuration)
return;
fPosition = position;
fDuration = duration;
_Update();
}
void
DurationView::SetMode(uint32 mode)
{
if (mode == fMode)
return;
fMode = mode;
_Update();
}
void
DurationView::_Update()
{
switch (fMode) {
case kTimeElapsed:
_GenerateString(fPosition);
break;
default:
case kTimeToFinish:
_GenerateString(fPosition - fDuration);
break;
case kDuration:
_GenerateString(fDuration);
break;
}
}
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);
}
@@ -0,0 +1,50 @@
/*
* Copyright 2010, Stephan Aßmus <[email protected]>.
* Distributed under the terms of the MIT License.
*/
#ifndef DURATION_VIEW_H
#define DURATION_VIEW_H
#include <String.h>
#include <StringView.h>
class DurationView : public BStringView {
public:
DurationView(const char* name);
// BStringView interface
virtual void AttachedToWindow();
virtual void MouseDown(BPoint where);
virtual BSize MinSize();
virtual BSize MaxSize();
// DurationView
void Update(bigtime_t position, bigtime_t duration);
enum {
kTimeElapsed = 0,
kTimeToFinish,
kDuration,
kLastMode
};
void SetMode(uint32 mode);
uint32 Mode() const
{ return fMode; }
private:
void _Update();
void _GenerateString(bigtime_t duration);
private:
uint32 fMode;
bigtime_t fPosition;
bigtime_t fDuration;
bigtime_t fDisplayDuration;
};
#endif // DURATION_VIEW_H
@@ -10,6 +10,8 @@
#include <StringView.h>
#include "DurationToString.h"
class PositionToolTip::PositionView : public BStringView {
public:
@@ -48,9 +50,14 @@ public:
fDuration = duration;
}
char positionText[32];
duration_to_string(fPosition, positionText, sizeof(positionText));
char durationText[32];
duration_to_string(fDuration, durationText, sizeof(durationText));
char text[64];
snprintf(text, sizeof(text), "%02ld:%02ld / %02ld:%02ld",
fPosition / 60, fPosition % 60, fDuration / 60, fDuration % 60);
snprintf(text, sizeof(text), "%s / %s", positionText, durationText);
SetText(text);
UnlockLooper();
@@ -18,6 +18,7 @@
#include <SpaceLayoutItem.h>
#include <String.h>
#include "DurationView.h"
#include "PeakView.h"
#include "PlaybackState.h"
#include "PlayPauseButton.h"
@@ -62,14 +63,26 @@ TransportControlGroup::TransportControlGroup(BRect frame, bool useSkipButtons,
{
float symbolHeight = 9;
// Seek Slider
BGroupView* seekGroup = new BGroupView(B_HORIZONTAL, 0);
BGroupLayout* seekLayout = seekGroup->GroupLayout();
GroupLayout()->AddView(seekGroup);
// Seek slider
fSeekSlider = new SeekSlider("seek slider", new BMessage(MSG_SEEK),
0, kPositionFactor);
GroupLayout()->AddView(fSeekSlider);
seekLayout->AddView(fSeekSlider);
fPositionToolTip = new PositionToolTip();
fSeekSlider->SetToolTip(fPositionToolTip);
// Duration view
fDurationView = new DurationView("duration view");
seekLayout->AddView(fDurationView);
seekLayout->AddItem(BSpaceLayoutItem::CreateHorizontalStrut(5));
// Buttons
BGroupView* controlGroup = new BGroupView(B_HORIZONTAL, 0);
controlGroup->GroupLayout()->SetInsets(7, 5, 7, 5);
GroupLayout()->AddView(controlGroup);
@@ -82,8 +95,6 @@ TransportControlGroup::TransportControlGroup(BRect frame, bool useSkipButtons,
uint32 topBottomBorder = BControlLook::B_TOP_BORDER
| BControlLook::B_BOTTOM_BORDER;
// Buttons
if (useSkipButtons) {
// Skip Back
fSkipBack = new SymbolButton(B_EMPTY_STRING,
@@ -137,8 +148,7 @@ TransportControlGroup::TransportControlGroup(BRect frame, bool useSkipButtons,
} else
fSkipForward = NULL;
controlGroup->GroupLayout()->AddItem(
BSpaceLayoutItem::CreateHorizontalStrut(5));
controlLayout->AddItem(BSpaceLayoutItem::CreateHorizontalStrut(5));
// Mute
BShape* speakerShape = _CreateSpeakerShape(8);
@@ -461,10 +471,12 @@ void
TransportControlGroup::SetPosition(float value, bigtime_t position,
bigtime_t duration)
{
fPositionToolTip->Update(position, duration);
fDurationView->Update(position, duration);
if (fSeekSlider->IsTracking())
return;
fPositionToolTip->Update(position, duration);
fSeekSlider->SetPosition(value);
}
@@ -15,6 +15,7 @@
class BShape;
class DurationView;
class PeakView;
class PlayPauseButton;
class PositionToolTip;
@@ -104,6 +105,7 @@ private:
private:
SeekSlider* fSeekSlider;
DurationView* fDurationView;
PositionToolTip* fPositionToolTip;
PeakView* fPeakView;
VolumeSlider* fVolumeSlider;
@@ -0,0 +1,31 @@
/*
* Copyright 2010, Stephan Aßmus <superstippi@gmx.de>
* Distributed under the terms of the MIT License.
*/
#include "DurationToString.h"
#include <stdio.h>
void
duration_to_string(int32 seconds, char* string, size_t stringSize)
{
bool negative = seconds < 0;
if (negative)
seconds = -seconds;
int32 hours = seconds / 3600;
seconds -= hours * 3600;
int32 minutes = seconds / 60;
seconds = seconds % 60;
if (hours > 0) {
snprintf(string, stringSize, "%s%ld:%02ld:%02ld",
negative ? "-" : "", hours, minutes, seconds);
} else {
snprintf(string, stringSize, "%s%ld:%02ld",
negative ? "-" : "", minutes, seconds);
}
}
@@ -0,0 +1,15 @@
/*
* Copyright 2010, Stephan Aßmus <superstippi@gmx.de>
* Distributed under the terms of the MIT License.
*/
#ifndef DURATION_TO_STRING_H
#define DURATION_TO_STRING_H
#include <SupportDefs.h>
void duration_to_string(int32 seconds, char* string, size_t stringSize);
#endif // DURATION_TO_STRING_H