ultimatepp/bazaar/Media/VolumeCtrl.cpp
koldo 8a16fa8788 Media: Update.
git-svn-id: svn://ultimatepp.org/upp/trunk@3785 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-08-25 21:18:55 +00:00

124 lines
3 KiB
C++

#include "VolumeCtrl.h"
SliderVolume::SliderVolume() {
moving = false;
Jump();
}
void SliderVolume::LeftDown(Point pos, dword keyflags) {
SliderCtrl::LeftDown(pos, keyflags);
moving = true;
}
void SliderVolume::LeftUp(Point pos, dword keyflags) {
SliderCtrl::LeftUp(pos, keyflags);
moving = false;
}
void SliderVolume::SetData(const Value& v) {
Size sz = GetSize();
bool horiz = sz.cx > sz.cy;
if (horiz)
SliderCtrl::SetData(v);
else
SliderCtrl::SetData(GetMax() - int(v));
}
Value SliderVolume::GetData() const {
Size sz = GetSize();
bool horiz = sz.cx > sz.cy;
Value val = SliderCtrl::GetData();
if (horiz)
return val;
else
return GetMax() - int(val);
}
VolumeCtrl::VolumeCtrl() {
Add(sliderL);
Add(sliderR);
sliderL.MinMax(0, MAX_MAINVOLUME);
sliderR.MinMax(0, MAX_MAINVOLUME);
sliderL.WhenAction = THISBACK(Action);
sliderR.WhenAction = THISBACK(Action);
Add(labelL);
Add(labelR);
labelL.SetLabel("L");
labelR.SetLabel("R");
SetTimeCallback(-100, THISBACK(TimerAction));
stereo = false;
showLR = true;
TimerAction();
}
void VolumeCtrl::Action() {
if (stereo) {
int left, right;
if (!GetMainVolume(left, right))
return;
int valL = sliderL.GetData();
int valR = sliderR.GetData();
if (valL != left || valR != right)
SetMainVolume(valL, valR);
} else {
int val = sliderL.GetData();
if (val != GetMainVolume())
SetMainVolume(val);
}
}
void VolumeCtrl::TimerAction() {
if(sliderL.IsMoving() && (sliderR.IsMoving() || !stereo))
return;
if (stereo) {
int left, right;
if (!GetMainVolume(left, right))
return;
if (left != sliderL.GetData())
sliderL.SetData(left);
if (right != sliderR.GetData())
sliderR.SetData(right);
} else {
int val = GetMainVolume();
if ((val != -1) && (val != sliderL.GetData()))
sliderL.SetData(val);
}
}
void VolumeCtrl::Layout() {
Rect r = GetRect();
Size sz = GetSize();
if (stereo) {
sliderR.Show();
labelL.Show(showLR);
labelR.Show(showLR);
if (sz.cx < sz.cy) {
Font f = Arial(sz.cx/4);
Size fontSize = GetTextSize("X", f);
if (showLR)
labelL.SetFont(f).BottomPosZ(0, fontSize.cy).LeftPosZ(int(0.15*sz.cx), 2*fontSize.cx);
sliderL.VSizePosZ(0, (showLR ? fontSize.cy : 0)).LeftPosZ(0, sz.cx/2);
if (showLR)
labelR.SetFont(f).BottomPosZ(0, fontSize.cy).LeftPosZ(int(0.65*sz.cx), 2*fontSize.cx);
sliderR.VSizePosZ(0, (showLR ? fontSize.cy : 0)).LeftPosZ(sz.cx/2, sz.cx/2);
} else {
Font f = Arial(sz.cy/4);
Size fontSize = GetTextSize("X", f);
if (showLR)
labelL.SetFont(f).HSizePosZ(0, 0).TopPosZ(int(0.1*sz.cy), fontSize.cy);
sliderL.HSizePosZ((showLR ? int(1.5*fontSize.cx) : 0), 0).TopPosZ(0, sz.cy/2);
if (showLR)
labelR.SetFont(f).HSizePosZ(0, 0).TopPosZ(int(0.6*sz.cy), fontSize.cy);
sliderR.HSizePosZ((showLR ? int(1.5*fontSize.cx) : 0), 0).TopPosZ(sz.cy/2, sz.cy/2);
}
} else {
sliderL.SizePos();
sliderR.Hide();
labelL.Hide();
labelR.Hide();
}
}