src/hbwidgets/sliders/hbslider.cpp
changeset 3 11d3954df52a
parent 2 06ff229162e9
child 6 c3690ec91ef8
--- a/src/hbwidgets/sliders/hbslider.cpp	Fri May 14 16:09:54 2010 +0300
+++ b/src/hbwidgets/sliders/hbslider.cpp	Thu May 27 13:10:59 2010 +0300
@@ -31,6 +31,7 @@
 #include "hbsliderhandle_p.h"
 
 #include "hbstyleoptionslider_p.h"
+#include "hbslidertickmarks_p.h"
 #include "hbslidertickmarkslabel_p.h"
 #include "hbabstractbutton.h"
 #include <hbwidgetfeedback.h>
@@ -243,7 +244,12 @@
 HbSliderPrivate::HbSliderPrivate( ) :
     sliderControl( 0 ),
     orientation( Qt::Vertical ),
-    pressOnIncrement( false )
+    pressOnIncrement( false ),
+    tickmarksLeft( 0 ), // slider left/top tick mark item
+    tickmarksRight( 0 ),// slider right/bottom tick mark item
+    tickmarkslabelLeft( 0 ),// slider left/above tick mark label
+    tickmarkslabelRight ( 0 )// slider right/bottom tick mark label
+
 {
     elementItemMap.clear();
 
@@ -293,6 +299,11 @@
     // repolish call is required because new elements might be added
 }
 
+QSizeF HbSliderPrivate::getHandleSize( )
+{
+   return sliderControl ->getHandleSize();
+}
+
 /*!
     This api creates widget for given element   
  */
@@ -464,6 +475,242 @@
 
 }
 
+
+
+
+void HbSliderPrivate::createTickMarks( )
+{
+    Q_Q ( HbSlider);
+    bool modified = false;
+    if( q->majorTickInterval( ) <= 0) {
+        return;
+    }
+    if ( q->tickPosition( ) & Hb::SliderTicksLeft) {
+        if (!tickmarksLeft) {
+            tickmarksLeft =  new HbSliderTickmarks(q);
+            tickmarksLeft->setZValue(sliderControl->zValue()-1);
+            tickmarksLeft->setTickPosition (Hb::SliderTicksLeft);
+            modified = true;
+            if ( orientation == Qt::Vertical ) {
+                HbStyle::setItemName( tickmarksLeft, "tick-marksleft" );
+            } else {
+                HbStyle::setItemName( tickmarksLeft, "tick-marksabove" );
+            }
+        } 
+
+    } else if ( tickmarksLeft ) {
+        delete tickmarksLeft;
+        tickmarksLeft = 0;
+        modified = true;
+    }
+    if ( q->tickPosition( ) & Hb::SliderTicksRight) {
+        if (!tickmarksRight) {
+            tickmarksRight =  new HbSliderTickmarks(q);
+            tickmarksRight->setTickPosition (Hb::SliderTicksRight);
+            tickmarksRight->setZValue(sliderControl->zValue()-1);
+            modified = true;
+
+            if ( orientation == Qt::Vertical ) {
+                HbStyle::setItemName( tickmarksRight, "tick-marksright" );
+            } else {
+                HbStyle::setItemName( tickmarksRight, "tick-marksbelow" );
+            }
+        }
+    } else if ( tickmarksRight ) {
+        delete tickmarksRight;
+        tickmarksRight = 0;
+        modified = true;
+    }
+    if ( orientation == Qt::Vertical ) {
+        if ( q->tickPosition( ) & Hb::SliderTicksAbsolute)  {
+            q->setLayoutDirection (Qt::LeftToRight );
+        } else {
+            q->unsetLayoutDirection( );
+        }
+    } else {
+        q->unsetLayoutDirection( );   
+    }
+    
+    if ( modified) {
+        q->repolish( );
+    }
+}
+
+
+void HbSliderPrivate::createTickLabels( )
+{   
+    Q_Q(HbSlider);
+    bool modified = false;
+    if( q->majorTickInterval( ) <= 0 || q->majorTickLabels( ).isEmpty( ) ) {
+        return;
+    }
+    if ( q->tickPosition( ) & Hb::SliderTicksLeft) {
+        if (!tickmarkslabelLeft) {
+            modified = true;
+            tickmarkslabelLeft =  new HbSliderTickmarksLabel(q);
+            tickmarkslabelLeft->setTickPosition (Hb::SliderTicksLeft);
+            if ( orientation == Qt::Vertical ) {
+                HbStyle::setItemName( tickmarkslabelLeft, "tick-textsleft" );
+            } else {
+                HbStyle::setItemName( tickmarkslabelLeft, "tick-textsabove" );
+            }
+        }
+    } else if ( tickmarkslabelLeft ) {
+        modified = true;
+        delete tickmarkslabelLeft;
+        tickmarkslabelLeft = 0;
+    }
+    if ( q->tickPosition( ) & Hb::SliderTicksRight) {
+        if (!tickmarkslabelRight) {
+            modified = true;
+            tickmarkslabelRight =  new HbSliderTickmarksLabel(q);
+            tickmarkslabelRight->setTickPosition (Hb::SliderTicksRight);
+            if ( orientation == Qt::Vertical ) {
+                HbStyle::setItemName( tickmarkslabelRight, "tick-textsright" );
+            } else {
+                HbStyle::setItemName( tickmarkslabelRight, "tick-textsbelow" );
+            }
+        }
+    } else if ( tickmarkslabelRight ) {
+        delete tickmarkslabelRight;
+        modified = true;
+        tickmarkslabelRight = 0;
+    }
+    if ( orientation == Qt::Vertical ) {
+        if ( q->tickPosition( ) & Hb::SliderTicksAbsolute)  {
+            q->setLayoutDirection (Qt::LeftToRight );
+        }
+    }
+    if ( modified ) {
+        q->repolish( );
+    }
+}
+
+
+void HbSliderPrivate::setTickOrientation()
+{
+    Q_Q(HbSlider);
+    if ( orientation == Qt::Vertical ) {
+        if ( tickmarksLeft ) {
+            HbStyle::setItemName( tickmarksLeft, "tick-marksleft" );
+        }
+        if ( tickmarksRight) {
+            HbStyle::setItemName( tickmarksRight, "tick-marksright" );
+        }
+        if (tickmarkslabelLeft ) {
+            HbStyle::setItemName( tickmarkslabelLeft, "tick-textsleft" );
+        }
+        if (tickmarkslabelRight ) {
+            HbStyle::setItemName( tickmarkslabelRight, "tick-textsright" );
+        }
+        if ( q->tickPosition( )&Hb::SliderTicksAbsolute) {
+            q->setLayoutDirection (Qt::LeftToRight);
+        }
+    } else {
+        if ( tickmarksLeft ) {
+            HbStyle::setItemName( tickmarksLeft, "tick-marksabove" );
+        }
+        if ( tickmarksRight) {
+            HbStyle::setItemName( tickmarksRight, "tick-marksbelow" );
+        }
+        if (tickmarkslabelLeft ) {
+            HbStyle::setItemName( tickmarkslabelLeft, "tick-textsabove" );
+        }
+        if (tickmarkslabelRight ) {
+            HbStyle::setItemName( tickmarkslabelRight, "tick-textsbelow" );
+        }
+        q->unsetLayoutDirection( );
+
+
+    }
+
+}
+
+
+
+
+
+/*!
+  \internal
+  Updates tick and Label.
+  */
+void HbSliderPrivate::updateTickMarks( )
+{
+    if (tickmarksLeft) {
+        tickmarksLeft->updateTicks();
+    }
+    if (tickmarksRight) {
+        tickmarksRight->updateTicks();
+    }
+}
+
+
+/*!
+  \internal
+  Updates tick and Label.
+  */
+void HbSliderPrivate::updateTickLabels( )
+{
+    if( tickmarkslabelLeft ) {
+        tickmarkslabelLeft->updateTickLabels();
+    }
+    if( tickmarkslabelRight ) {
+        tickmarkslabelRight->updateTickLabels( );
+    }
+}
+
+
+/*!
+  \internal
+  Updates tick and Label.
+  */
+void HbSliderPrivate::deleteTickMarks( )
+{
+    Q_Q ( HbSlider );
+    bool deleted = false;
+    if (tickmarksLeft) {
+        delete tickmarksLeft;
+        tickmarksLeft = 0;
+        deleted = true;
+    }  
+    if (tickmarksRight) {
+        delete tickmarksRight;
+        tickmarksRight = 0;
+        deleted = true;
+    }
+    if ( deleted ) {
+        q->repolish( );
+    }
+
+}
+
+
+/*!
+  \internal
+  Updates tick and Label.
+  */
+void HbSliderPrivate::deleteTickLabels( )
+{
+
+    Q_Q(HbSlider);
+    bool deleted = false;
+    if (tickmarkslabelLeft) {
+        delete tickmarkslabelLeft;
+        tickmarkslabelLeft = 0;
+        deleted = true;
+
+    }  
+    if (tickmarkslabelRight) {
+        delete tickmarkslabelRight;
+        tickmarkslabelRight = 0;
+        deleted = true;
+    }
+    if (deleted) {
+        q->repolish( );
+    }
+
+ }
+
 #ifdef HB_EFFECTS
 
 /*!
@@ -551,7 +798,7 @@
 }
 
 /*!
-    @proto
+    @beta
     Returns the list of slider elements as QVariant 
     
     \note it is safe to type-cast element to HbSlider::SliderElement.  
@@ -571,7 +818,7 @@
 }
 
 /*!
-    @proto
+    @beta
     Sets the elements of the slider.
 
     \note Duplicate elements will be ignored.
@@ -603,7 +850,7 @@
 }
 
 /*!
-    @proto
+    @beta
     Sets the icons for elements
 
     key of \a elements is element name  and value is icon 
@@ -658,7 +905,7 @@
 }
 
 /*!
-    @proto
+    @beta
     Returns the map , which consist of element name as key and icon name  as value
 
     returns NULL map if none of the element has icon
@@ -963,7 +1210,8 @@
     if ( d->orientation != orientation ) {
         d->orientation = orientation;
         d->sliderControl->setOrientation( orientation );
-        repolish();
+        d->setTickOrientation( );
+        repolish( );
     }
 }
 
@@ -1290,6 +1538,8 @@
     Q_D( HbSlider );
     d->sliderControl->setTickPosition( position );
     d->setTickLabelPresentProperty( );
+    d->createTickMarks( );
+    d->createTickLabels( );
 }
 
 /*!
@@ -1346,6 +1596,16 @@
 {
     Q_D( HbSlider );
     d->sliderControl->setMajorTickInterval( interval );
+    if (interval <=0 ) {
+        d->deleteTickMarks( );
+        d->deleteTickLabels( );
+    }
+    else {
+        d->createTickMarks( );
+        d->createTickLabels( );
+        d->updateTickMarks( );
+        d->updateTickLabels( );
+    }
     d->setTickLabelPresentProperty( );
 }
 
@@ -1377,6 +1637,8 @@
 {
     Q_D( HbSlider );
     d->sliderControl->setMinorTickInterval( interval );
+    d->updateTickMarks( );
+    d->updateTickLabels( );
     d->setTickLabelPresentProperty( );
 }
 
@@ -1408,7 +1670,7 @@
 
 
 /*!
-    @proto
+    @beta
     Sets whether to display progress track or not
 
     \default value is true
@@ -1424,7 +1686,7 @@
 }
 
 /*!
-    @proto
+    @beta
     returns whether progress track is visible or not
 
     \sa setTrackFilled( )
@@ -1478,7 +1740,13 @@
 {
     Q_D( HbSlider );
     d->sliderControl->setMajorTickLabels( majorTickLabels );
-    d->setTickLabelPresentProperty( );
+    if(majorTickLabels.isEmpty( )) {
+        d->deleteTickLabels( );
+    } else {
+        d->createTickLabels( );
+        d->updateTickLabels( );
+        d->setTickLabelPresentProperty( );
+    }
 }
 
 /*!
@@ -1504,6 +1772,7 @@
 {
     Q_D( HbSlider );
     d->sliderControl->setMinorTickLabels( minorTickLabels );
+    d->updateTickLabels( );
     d->setTickLabelPresentProperty( );
 }