diff -r 000000000000 -r 16d8024aca5e src/hbwidgets/sliders/hbslidertickmarks.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbwidgets/sliders/hbslidertickmarks.cpp Mon Apr 19 14:02:13 2010 +0300 @@ -0,0 +1,332 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (developer.feedback@nokia.com) +** +** This file is part of the HbWidgets module of the UI Extensions for Mobile. +** +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at developer.feedback@nokia.com. +** +****************************************************************************/ + +#include "hbslidertickmarks_p.h" +#include "hbwidget_p.h" +#include "hbslidercontrol_p.h" +#include "hbsliderhandle_p.h" +#include +#include +#include +#include +#include +#include + + + + + + +class HbSliderTickmarksPrivate : public HbWidgetPrivate +{ + Q_DECLARE_PUBLIC( HbSliderTickmarks ) + +public: + HbSliderTickmarksPrivate(); + void createTicks( ); + void updateTickSize( ); + HbStyleOptionSlider sliderOption; + QList tickmarkmajorIcons; + QList tickmarkminorIcons; + HbSliderControl *sliderControl; + Hb::SliderTickPositions tickPosition; + bool createIcons; + int majorTickWidth; + int minorTickWidth; + int majorTickHeight; + int minorTickHeight; +}; + + + HbSliderTickmarksPrivate::HbSliderTickmarksPrivate() :HbWidgetPrivate(){ + tickmarkmajorIcons.clear(); + tickmarkminorIcons.clear(); + sliderControl = 0; + tickPosition = Hb::NoSliderTicks; + createIcons = true; + majorTickWidth = 0; + minorTickWidth = 0; + majorTickHeight = 0; + minorTickHeight = 0; +} + + +void HbSliderTickmarksPrivate::createTicks( ) +{ + Q_Q ( HbSliderTickmarks ); + if(!createIcons){ + return; + } + int minimum = sliderControl->minimum(); + int maximum = sliderControl->maximum(); + int majorTickInterval = sliderControl->majorTickInterval ( ); + int minorTickInterval = sliderControl->minorTickInterval ( ); + if (majorTickInterval) { + int totalMajorTicks = ((maximum-minimum)/majorTickInterval)+1; + int majorIconListLength = tickmarkmajorIcons.length(); + for (int i=majorIconListLength;istyle()->createPrimitive(HbStyle::P_SliderTickMark_majoricon, q); + Q_ASSERT(iconItem->isWidget()); + tickmarkmajorIcons.append(static_cast(iconItem));//add newly defind primitive + } + while ( totalMajorTicks < tickmarkmajorIcons.length() ) { + QGraphicsWidget *iconItem = tickmarkmajorIcons.at(totalMajorTicks); + tickmarkmajorIcons.removeAll(iconItem); + delete iconItem; + } + } + if ( minorTickInterval > 0) { + int totalMinorTicks = ((maximum-minimum)/minorTickInterval)+1; + if ( majorTickInterval ) { + int maximumMinorTicks = totalMinorTicks; + for (int i=0;i< maximumMinorTicks;i++ ) { + if ((i*minorTickInterval)%majorTickInterval==0) { + totalMinorTicks--; + } + } + } + int minorIconListLength = tickmarkminorIcons.length(); + for (int i=minorIconListLength;istyle()->createPrimitive(HbStyle::P_SliderTickMark_minoricon, q); + Q_ASSERT(iconItem->isWidget()); + tickmarkminorIcons.append(static_cast(iconItem));//add newly defind primitive + } + while (totalMinorTicks < tickmarkminorIcons.length() ){ + QGraphicsWidget *iconItem = tickmarkminorIcons.at(totalMinorTicks); + tickmarkminorIcons.removeAll(iconItem); + delete iconItem; + } + } else { + while (tickmarkminorIcons.length() > 0 ){ + QGraphicsWidget *iconItem = tickmarkminorIcons.at(0); + tickmarkminorIcons.removeAll(iconItem); + delete iconItem; + } + } + q->setProperty("state", "normal"); +} + +void HbSliderTickmarksPrivate::updateTickSize() +{ + for(int i=0;isetMinimumSize(majorTickWidth,majorTickHeight); + tickmarkmajorIcons.at(i)->setMaximumSize(majorTickWidth,majorTickHeight); + } + for(int i=0;isetMinimumSize(minorTickWidth,minorTickHeight); + tickmarkminorIcons.at(i)->setMaximumSize(minorTickWidth,minorTickHeight); + } + + +} + +void HbSliderTickmarks::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED (event); + HbWidget::resizeEvent( event ); + repolish(); +} + + +/*! + This class is internal to slider , + this creates ticks mark widget in slider +*/ + +/*! + constructor +*/ +HbSliderTickmarks::HbSliderTickmarks( QGraphicsItem *parent ) + : HbWidget( *new HbSliderTickmarksPrivate, parent ) +{ + Q_D( HbSliderTickmarks ); + d->q_ptr = this; + d->sliderControl=dynamic_cast( parentItem() ); + d->createTicks(); +} + +/*! + destructor +*/ +HbSliderTickmarks::~HbSliderTickmarks() +{ +} + +void HbSliderTickmarks::createIcons( bool create ) +{ + + Q_D(HbSliderTickmarks); + d->createIcons = create; + if (!create) { + while ( d->tickmarkmajorIcons.length() > 0) { + QGraphicsWidget *iconItem = d->tickmarkmajorIcons.at(0); + d->tickmarkmajorIcons.removeAll(iconItem); + delete iconItem; + } + while ( d->tickmarkminorIcons.length() > 0) { + QGraphicsWidget *iconItem = d->tickmarkminorIcons.at(0); + d->tickmarkminorIcons.removeAll(iconItem); + delete iconItem; + } + } else { + d->createTicks(); + } + } +/*! + updates the ticks whenever there is change in position or number of ticks +*/ + +void HbSliderTickmarks::updateTicks( ) +{ + Q_D ( HbSliderTickmarks ); + if(!d->createIcons) { + return; + } + d->createTicks(); + d->updateTickSize(); + int minimum = d->sliderControl->minimum(); + int maximum = d->sliderControl->maximum(); + int majorTickInterval = d->sliderControl->majorTickInterval ( ); + int minorTickInterval = d->sliderControl->minorTickInterval ( ); + qreal span = 0; + bool rtlLayout = (((d->sliderControl->orientation()!=Qt::Vertical)&& + (HbApplication::layoutDirection() == Qt::LeftToRight))?false:true); + HbSliderHandle *handle = dynamic_cast (d->sliderControl->primitive (HbStyle::P_Slider_thumb)); + if ( d->sliderControl->orientation() == Qt::Horizontal) { + span = d->sliderControl->size().width(); + span-=handle->size().width(); + } + if ( d->sliderControl->orientation() == Qt::Vertical) { + span = d->sliderControl->size().height(); + span-=handle->size().height(); + } + if (majorTickInterval) { + int totalMajorTicks = ((maximum-minimum)/majorTickInterval)+1; + for (int i=0;itickmarkmajorIcons.at ( i); + HbStyleOptionSlider opt; + initStyleOption(&opt); + opt.orientation = d->sliderControl->orientation(); + style()->updatePrimitive(iconItem,HbStyle::P_SliderTickMark_majoricon,&opt); + int pos = QStyle::sliderPositionFromValue( minimum, maximum, + minimum+majorTickInterval*i,static_cast( span ), rtlLayout ); + + if ( d->sliderControl->orientation() == Qt::Horizontal) { + qreal correctedPosX = handle->size().width()/2+pos; + qreal correctedPosY = 0; + iconItem->setPos ( correctedPosX,correctedPosY ); + iconItem->update(); + } else { + qreal correctedPosY = handle->size().height()/2+pos; + qreal correctedPosX =0; + iconItem->setPos ( correctedPosX,correctedPosY ); + iconItem->update(); + } + } + } + if (minorTickInterval) { + int totalminorTicks = ((maximum-minimum)/minorTickInterval)+1; + int minorIndex = 0; + for (int i=0;itickmarkminorIcons.at ( minorIndex); + minorIndex++; + HbStyleOptionSlider opt; + initStyleOption(&opt); + opt.orientation = d->sliderControl->orientation(); + style()->updatePrimitive(iconItem,HbStyle::P_SliderTickMark_minoricon,&opt); + int pos = QStyle::sliderPositionFromValue( minimum, maximum, + minimum+minorTickInterval*i,static_cast( span ), rtlLayout ); + + if ( d->sliderControl->orientation() == Qt::Horizontal) { + qreal correctedPosX = handle->size().width()/2+pos; + qreal correctedPosY = 0; + iconItem->setPos ( correctedPosX,correctedPosY ); + iconItem->update(); + + } else { + qreal correctedPosY = handle->size().height()/2+pos; + qreal correctedPosX =0; + iconItem->setPos ( correctedPosX,correctedPosY ); + iconItem->update(); + + } + } + } + } + +/* ! + Sets the position of current tick +*/ + +void HbSliderTickmarks::setTickPosition(Hb::SliderTickPositions position) +{ + Q_D(HbSliderTickmarks); + d->tickPosition = position; +} + + +/*! + \reimp + + This api update the primitive when ever item enable has changed + */ +QVariant HbSliderTickmarks::itemChange( GraphicsItemChange change, const QVariant &value ) +{ + switch( change ) + { + case ItemChildAddedChange: + case ItemChildRemovedChange: + repolish(); + break; + default: + break; + } + return HbWidget::itemChange( change, value ); +} + + + +void HbSliderTickmarks::polish( HbStyleParameters& params ) +{ + Q_D (HbSliderTickmarks); + params.addParameter("fixed-width-major"); + params.addParameter("fixed-height-major"); + params.addParameter("fixed-width-minor"); + params.addParameter("fixed-height-minor"); + HbWidget::polish(params); + d->majorTickWidth = params.value("fixed-width-major").toInt(); + d->majorTickHeight = params.value("fixed-height-major").toInt(); + d->minorTickWidth = params.value("fixed-width-minor").toInt(); + d->minorTickHeight = params.value("fixed-height-minor").toInt(); + updateTicks(); +} + + //end of file +