ultimatepp/bazaar/UltimatePlayer/StreamCtrl.cpp
unodgs 0463a45fdf Added UltimatePlayer
git-svn-id: svn://ultimatepp.org/upp/trunk@1167 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2009-05-12 20:02:10 +00:00

159 lines
3.3 KiB
C++

#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#include "StreamCtrl.h"
StreamCtrl::StreamCtrl()
{
pos = 0;
info_width = 100;
progress_height = 18;
shaded = true;
immediate = false;
src = Color(255, 255, 0);
dst = Color(255, 0, 0);
noname = true;
name = "Ultimate Player";
time = 0;
bitrate = "0 kbps";
time_direction = 0;
}
void StreamCtrl::Paint(Draw &w)
{
Size sz = GetSize();
Color fill = Color(245, 245, 255);
int width = sz.cx - info_width;
int height = sz.cy - progress_height;
/* black border */
w.DrawRect(0, 0, sz.cx, 1, Black);
w.DrawRect(0, sz.cy - 1, sz.cx, 1, Black);
w.DrawRect(0, 0, 1, sz.cy, Black);
w.DrawRect(sz.cx - 1, 0, 1, sz.cy, Black);
/* progress separator */
w.DrawRect(1, progress_height, width - 1, 1, Gray);
/* info separator */
w.DrawRect(width, 1, 1, sz.cy - 2, Gray);
int t = max(1, fceil((pos * width) / 100.0f));
//if(t < 1) t = 1;
//if(t > width) t = width;
if(shaded)
{
for(int i = 1; i < t; i++)
w.DrawRect(i, 1, 1, progress_height - 1, Blend(src, dst, 256 * i / (width - 1)));
}
else
{
w.DrawRect(Rect(1, 1, t, progress_height), dst);
}
w.DrawRect(Rect(t, 1, width, progress_height), fill);
String s = Format("%s : %d %%", postext, (int) pos);
Size psz = GetTextSize(s, StdFont());
w.DrawText((width - psz.cx) / 2, 1 + (progress_height - psz.cy) / 2, s);
/* Title */
//WString text = name;
Font fnt = Arial(18);
Size nsz = GetTextSize(name, fnt);
w.DrawRect(1, progress_height + 1, width - 1, height - 2, fill);
w.Clip(5, progress_height, width - 10, height);
w.DrawText(noname ? (width - nsz.cx) / 2 : 5, progress_height + (height - nsz.cy) / 2 + 1, name, fnt);
w.End();
/* Time */
w.DrawRect(width + 1, 1, info_width - 2, sz.cy - 2, fill);
String ts;
if(time_direction > 0)
{
int tms = time_total - time;
int min = tms / 1000 / 60;
int sec = tms / 1000 % 60;
if(min == 0 && sec == 0)
ts = "00:00";
else
ts = ::Format("-%02d:%02d", min, sec);
}
else
{
int tms = time;
ts = ::Format("%02d:%02d", tms / 1000 / 60, tms / 1000 % 60);
}
Size tsz = GetTextSize(ts, fnt);
w.DrawText(width + (info_width - tsz.cx) / 2, sz.cy - (sz.cy - progress_height + tsz.cy) / 2, ts, fnt);
/* Bitrate */
fnt = Arial(11);
String inf = bitrate + " / stereo";
Size isz = GetTextSize(inf, fnt);
w.DrawText(width + (info_width - isz.cx) / 2, 3, inf, fnt);
//w.DrawText(width + 5, 3, bitrate, fnt);
//w.DrawText(width + 5 + bsz.cx + 5, 3, "stereo", fnt);
}
void StreamCtrl::LeftDown(Point p, dword keyflags)
{
Size sz = GetSize();
int width = sz.cx - info_width;
if(p.x < width && p.y < progress_height)
{
pos = (p.x * 100) / (float) (sz.cx - info_width);
Refresh();
SetCapture();
if(immediate)
WhenAction();
}
else if(p.x > width && p.y > progress_height)
{
time_direction = 1 - time_direction;
Refresh();
}
}
void StreamCtrl::LeftUp(Point p, dword keyflags)
{
if(HasCapture())
{
ReleaseCapture();
if(!immediate)
WhenAction();
}
}
void StreamCtrl::MouseMove(Point p, dword keyflags)
{
if(HasCapture())
{
pos = (p.x * 100) / (float) (GetSize().cx - info_width);
if(pos > 100) pos = 100;
if(pos < 0) pos = 0;
Refresh();
if(immediate)
WhenAction();
}
}
void StreamCtrl::SetPos(float p)
{
pos = p;
Refresh();
}
float StreamCtrl::GetPos()
{
return pos;
}