camerauis/cameraxui/cxui/src/cxuisettingslider.cpp
changeset 19 d9aefe59d544
child 21 fa6d9f75d6a6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraxui/cxui/src/cxuisettingslider.cpp	Fri Apr 16 14:51:30 2010 +0300
@@ -0,0 +1,182 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "cxuisettingslider.h"
+#include "cxeengine.h"
+#include "cxesettings.h"
+#include "cxutils.h"
+
+CxuiSettingSlider::CxuiSettingSlider(QGraphicsItem *parent, CxeEngine *engine) :
+HbSlider(parent),
+mSettingId(),
+mEngine(engine),
+mSettings(NULL),
+mOriginalValue(0),
+mSliderScaleValue(1)
+{
+    connect(this, SIGNAL(valueChanged(int)), this, SLOT(handleValueChanged(int)));
+}
+
+/*!
+    Initialises slider according to SliderParams data
+*/
+void CxuiSettingSlider::init(CxUiSettings::SliderParams *data)
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    // initialise engine side settings
+    if (mEngine) {
+        mSettings = &mEngine->settings();
+        CX_ASSERT_ALWAYS(mSettings);
+    }
+
+    // initialise data
+    if (data) {
+
+        // scale value is needed because slider doesn't show all ticks and
+        // labels correctly if step is something else than 1
+        int step = 1;
+        mSliderScaleValue = 1;
+        if (data->mStep != 0) {
+            mSliderScaleValue = step / data->mStep;
+        }
+
+        // scale min and max values as step has been set to 1
+        int minvalue = data->mRange.first * mSliderScaleValue;
+        int maxvalue = data->mRange.second * mSliderScaleValue;
+        CX_DEBUG(("Setting slider range [%d..%d]", minvalue, maxvalue));
+        setRange(minvalue,maxvalue);
+        setSingleStep(step);
+
+        setSnappingMode(HbSlider::MajorTickSnapping);
+
+        // don't show labels and tickmarks if there are no strings to be shown
+        if (!data->mSettingStrings.isEmpty()) {
+            setMajorTickLabels(data->mSettingStrings);
+            setMajorTickInterval(step);
+            setTickPosition(Hb::SliderTicksLeft);
+        } else {
+            setTickPosition(Hb::NoSliderTicks);
+        }
+
+        setSettingId(data->mSettingId);
+
+    }
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+    Returns settingId
+*/
+QString CxuiSettingSlider::settingId() const
+{
+    return mSettingId;
+}
+
+/*!
+    Sets the setting identification string. Setting id corresponds to specific setting
+    defined in cxenamespace.h. A value that corresponds the id is got from engine and
+    stored as original value. Also slider value is updated.
+*/
+void CxuiSettingSlider::setSettingId(const QString &id)
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    mSettingId = id;
+
+    // once the settingid is set, we can get the current value for the slider from the engine
+    qreal value = 0;
+
+    int err = mSettings->get(mSettingId, value);
+    CX_DEBUG((("err: %d value: %d"),err,value));
+
+    // engine value has to be scaled when set to slider
+    setValue(value * mSliderScaleValue);
+    mOriginalValue = value;
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+    This slot is called when slider's value is changed.
+    Value is stored to engine.
+*/
+void CxuiSettingSlider::handleValueChanged(int value)
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    qreal realValue = 0.0;
+    if (mSliderScaleValue != 0) {
+        realValue = value / mSliderScaleValue;
+    }
+
+    CX_DEBUG(("id: %s", mSettingId.toAscii().data()));
+    CX_DEBUG(("changing value to: %f ", realValue));
+
+    // check added because when the slider is created (or ui appearance changed)
+    // handlevaluechanged function is called before the mSettingId is set
+    if (!mSettingId.isEmpty()){
+        mSettings->set(mSettingId, realValue);
+    }
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+    This slot should be called when slider is closed. Original value will always be given
+    to engine. Original value is the value that slider had when it was initialised unless
+    slider value is changed and handleSelectionAccepted() function is called before coming here
+*/
+void CxuiSettingSlider::handleClose()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    setValue(mOriginalValue * mSliderScaleValue);
+    // value selected from slider not accepted, revert back
+    // the value to original value.
+    CX_DEBUG(("id: %s", mSettingId.toAscii().data()));
+    CX_DEBUG(("changing value back to original value: %f ", mOriginalValue));
+
+    // when the slider is created, handlevaluechanged function is
+    // called before the mSettingId is set
+    if (mSettings && !mSettingId.isEmpty()){
+        mSettings->set(mSettingId, mOriginalValue);
+    }
+
+    // clear settings id so that setting value doesn't get updated by accident
+    // when updating slider's ui appearance
+    mSettingId.clear();
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
+    Accepts the current selection.
+*/
+void CxuiSettingSlider::handleSelectionAccepted()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    // sets the curren slider value to be original value. mOriginal value
+    // is given to engine whenever handleClose() function is called
+    if (mSliderScaleValue != 0) {
+        mOriginalValue = value() / mSliderScaleValue;
+    }
+
+    emit selectionCommitted();
+
+    CX_DEBUG_EXIT_FUNCTION();
+}