1
/* ============================================================
3
* This file is part of the KDE project
6
* Description : Sane interface for KDE
8
* Copyright (C) 2009 by Kare Sars <kare dot sars at iki dot fi>
10
* This library is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU Lesser General Public
12
* License as published by the Free Software Foundation; either
13
* version 2.1 of the License, or (at your option) version 3, or any
14
* later version accepted by the membership of KDE e.V. (or its
15
* successor approved by the membership of KDE e.V.), which shall
16
* act as a proxy defined in Section 6 of version 3 of the license.
18
* This library is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
* Lesser General Public License for more details.
23
* You should have received a copy of the GNU Lesser General Public
24
* License along with this program. If not, see <http://www.gnu.org/licenses/>.
26
* ============================================================ */
28
#include "ksane_opt_fslider.h"
29
#include "ksane_opt_fslider.moc"
31
#include "labeled_fslider.h"
34
#include <QtCore/QVarLengthArray>
40
static const float FIXED_MAX = 32767.0;
41
static const float FIXED_MIN =-32768.0;
42
static const float MIN_FIXED_STEP = 0.0001;
46
KSaneOptFSlider::KSaneOptFSlider(const SANE_Handle handle, const int index)
47
: KSaneOption(handle, index), m_slider(0), m_fVal(0), m_minChange(MIN_FIXED_STEP)
51
void KSaneOptFSlider::createWidget(QWidget *parent)
55
m_widget = m_slider = new LabeledFSlider(parent, "", FIXED_MIN, FIXED_MAX, MIN_FIXED_STEP);
57
m_widget->setToolTip(i18n(m_optDesc->desc));
58
connect(m_slider, SIGNAL(valueChanged(float)), this, SLOT(sliderChanged(float)));
62
void KSaneOptFSlider::readOption()
64
KSaneOption::readOption();
66
if (!m_slider) return;
68
if (m_optDesc->constraint_type == SANE_CONSTRAINT_RANGE) {
69
m_slider->setRange(SANE_UNFIX(m_optDesc->constraint.range->min),
70
SANE_UNFIX(m_optDesc->constraint.range->max));
72
float tmpStep = SANE_UNFIX(m_optDesc->constraint.range->quant);
73
if (tmpStep < MIN_FIXED_STEP) tmpStep = MIN_FIXED_STEP;
74
m_slider->setStep(tmpStep);
77
m_slider->setRange(FIXED_MIN, FIXED_MAX);
78
m_slider->setStep(MIN_FIXED_STEP);
80
m_minChange = m_slider->step()/2;
81
m_slider->setSuffix(unitDoubleString());
82
m_slider->setLabelText(i18n(m_optDesc->title));
85
void KSaneOptFSlider::readValue()
87
if (state() == STATE_HIDDEN) return;
89
// read that current value
90
QVarLengthArray<unsigned char> data(m_optDesc->size);
93
status = sane_control_option (m_handle, m_index, SANE_ACTION_GET_VALUE, data.data(), &res);
94
if (status != SANE_STATUS_GOOD) {
98
m_fVal = SANE_UNFIX(toSANE_Word(data.data()));
100
if (((m_slider->value() - m_fVal) >= m_minChange) ||
101
((m_fVal- m_slider->value()) >= m_minChange))
103
m_slider->setValue(m_fVal);
106
emit fValueRead(m_fVal);
110
void KSaneOptFSlider::sliderChanged(float val)
112
if (((val-m_fVal) >= m_minChange) || ((m_fVal-val) >= m_minChange)) {
113
unsigned char data[4];
115
//kDebug() <<m_optDesc->name << fVal << "!=" << val;
117
fixed = SANE_FIX(val);
118
fromSANE_Word(data, fixed);
123
bool KSaneOptFSlider::getMinValue(float &val)
125
if (m_optDesc->constraint_type == SANE_CONSTRAINT_RANGE) {
126
val = SANE_UNFIX(m_optDesc->constraint.range->min);
134
bool KSaneOptFSlider::getMaxValue(float &max)
136
if (m_optDesc->constraint_type == SANE_CONSTRAINT_RANGE) {
137
max = SANE_UNFIX(m_optDesc->constraint.range->max);
145
bool KSaneOptFSlider::getValue(float &val)
147
if (state() == STATE_HIDDEN) return false;
152
bool KSaneOptFSlider::setValue(float val)
154
if (state() == STATE_HIDDEN) return false;
160
bool KSaneOptFSlider::getValue(QString &val)
162
if (state() == STATE_HIDDEN) return false;
163
val = QString::number(m_fVal, 'F', 6);
167
bool KSaneOptFSlider::setValue(const QString &val)
169
if (state() == STATE_HIDDEN) return false;
170
sliderChanged(val.toFloat());
176
} // NameSpace KSaneIface