You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/arts/gui/kde/kfader_impl.cpp

205 lines
4.0 KiB

/*
Copyright (C) 2000 Stefan Westerfeld
stefan@space.twc.de
2001, 2002 Matthias Kretz
kretz@kde.org
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kfader_impl.h"
#include "kfader_impl.moc"
#include "anyref.h"
#include "stdio.h"
#include <math.h>
using namespace Arts;
using namespace std;
FaderIntMapper::FaderIntMapper(KFader_impl *impl, KFader *kp) :impl(impl)
{
connect(kp, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(valueChanged(int)));
}
void FaderIntMapper::valueChanged(int pos)
{
impl->valueChanged(pos);
}
KFader_impl::KFader_impl( KFader * widget )
: KWidget_impl( widget ? widget : new KFader( 0, 100, 1, 0 ) )
{
_min = 0; _max = 1; _value = 0;
_factor = 1;
_logarithmic = 0;
_range = 100;
_kfader = static_cast<KFader*>( _qwidget );
_kfader->setMinimumWidth( 40 );
_kfader->setMinimumHeight( 100 );
new FaderIntMapper( this, _kfader );
}
string KFader_impl::caption()
{
return _caption.utf8().data();
}
void KFader_impl::caption(const string& newText)
{
_caption = TQString::fromUtf8(newText.c_str());
_kfader->setName(_caption.utf8().data());
}
string KFader_impl::color()
{
return _color;
}
void KFader_impl::color(const string& newColor)
{
_color = newColor;
if(strlen(_color.c_str()))
{
TQColor qc(_color.c_str());
_kfader->setColor(qc);
}
}
float KFader_impl::min()
{
return _min;
}
void KFader_impl::min(float newMin)
{
if(_min != newMin)
{
_min = newMin;
applyValue();
}
}
float KFader_impl::max()
{
return _max;
}
void KFader_impl::max(float newMax)
{
if(_max != newMax)
{
_max = newMax;
applyValue();
}
}
float KFader_impl::value()
{
//float ret = ( _max + _min - float(_kfader->value()) ) / _factor;
//if(_logarithmic > 0)
//ret = convertFromLog(ret);
float ret = _value;
if(ret < _min)
ret = _min;
else if(ret > _max)
ret = _max;
return ret;
}
void KFader_impl::value(float newValue)
{
if(newValue != _value)
{
_value = newValue;
applyValue();
if(visible())
value_changed(value());
}
}
long KFader_impl::range()
{
return _range;
}
void KFader_impl::range(long newRange)
{
if(_range != newRange)
{
_range = newRange;
applyValue();
}
}
void KFader_impl::valueChanged(int newvalue)
{
_value = float(newvalue) / _factor;
if(_logarithmic > 0)
_value = convertFromLog(_value);
_value = _max + _min - _value;
if(visible())
value_changed(value());
}
float KFader_impl::convertToLog(float val)
{
return log(val) / log(_logarithmic);
}
float KFader_impl::convertFromLog(float val)
{
return pow(_logarithmic, val);
}
void KFader_impl::applyValue()
{
double dmin = _min;
double dmax = _max;
double dvalue = _value;
if(_logarithmic > 0)
{
dmin = convertToLog(_min);
dmax = convertToLog(_max);
dvalue = convertToLog(_value);
}
_factor = _range / (dmax - dmin);
int imin = int(_factor * dmin);
int imax = int(_factor * dmax);
int ivalue = int(_factor * (dmax + dmin - dvalue));
_kfader->setRange(imin, imax);
_kfader->setValue(ivalue);
}
void KFader_impl::logarithmic(float newLogarithmic)
{
if(_logarithmic != newLogarithmic)
{
_logarithmic = newLogarithmic;
applyValue();
}
}
float KFader_impl::logarithmic()
{
return _logarithmic;
}
REGISTER_IMPLEMENTATION(KFader_impl);