calendarui/views/src/calenmonthgrid.cpp
changeset 75 7ac58b2aae6f
parent 70 a5ed90760192
child 81 ce92091cbd61
--- a/calendarui/views/src/calenmonthgrid.cpp	Mon Sep 06 15:58:44 2010 +0530
+++ b/calendarui/views/src/calenmonthgrid.cpp	Mon Sep 20 12:44:39 2010 +0530
@@ -67,14 +67,14 @@
 	mIgnoreItemActivated(false),
 	mGridLineColor(HbColorScheme::color("qtc_cal_grid_line")),
     mActiveDatesSet(false),
-    mIsGridAdjusting(false)
+    mIsGridAdjusting(false),
+    mEventIndicatorNotSet(false)
 {
     OstTraceFunctionEntry0( CALENMONTHGRID_CALENMONTHGRID_ENTRY );
     
 	setScrollDirections(Qt::Vertical);
 	setRowCount(KNumOfVisibleRows);
 	setColumnCount(KCalenDaysInWeek);
-	setLongPressEnabled(false);
 	setItemRecycling(false);
 	setSelectionMode(HbGridView::NoSelection);
 	setUniformItemSizes(true);
@@ -84,6 +84,9 @@
 	setFrictionEnabled(false);
 	setFlag(QGraphicsItem::ItemHasNoContents, false);
 	
+	// Enable the pixmap cache for better scrolling performance
+	setItemPixmapCacheEnabled(true);
+	
 	// Disable the rows and columns swapping on orientation change
 	setSwapDimensionsOnOrientationChange(false);
 	
@@ -234,15 +237,16 @@
 	    connect(
 	            HbTheme::instance(), SIGNAL(changed()),
 	            gridItemPrototype, SLOT(handleThemeChange()));
-	    
-		// Set the mode and the prototype
-		setModel(mModel,gridItemPrototype);
 		
 		// Register the widgetml and css files
 		HbStyleLoader::registerFilePath(":/");
 		
 		// Set the layout name
 		setLayoutName("calendarCustomGridItem");
+		
+		// Set the mode and the prototypec --> set it after setting layout name and 
+		// other things as it will avoid unnecessary polish calls
+        setModel(mModel,gridItemPrototype);
 	} else {
 		// Since, we have finished setData, Now unblock the signals
 		mModel->blockSignals(false);
@@ -309,6 +313,11 @@
 	connect(this, SIGNAL(activated(const QModelIndex &)), this,
 						SLOT(itemActivated(const QModelIndex &)));
 	
+	// Check if we need to set the event indicators
+	if(mEventIndicatorNotSet) {
+	    mEventIndicatorNotSet = false;
+	    updateMonthGridWithEventIndicators(monthDataArray);
+	}
 	OstTraceFunctionExit0( CALENMONTHGRID_UPDATEMONTHGRIDWITHINACTIVEMONTHS_EXIT );
 }
 
@@ -321,15 +330,22 @@
     OstTraceFunctionEntry0( CALENMONTHGRID_UPDATEMONTHGRIDWITHEVENTINDICATORS_ENTRY );
     
 	int count(monthDataArray.count());
-	for(int i = 0; i < count; i++) {
-		// Check if the day has events
-		if (monthDataArray[i].HasEvents()) {
-			QModelIndex itemIndex = mModel->index(i,0);
-			QVariant itemData = itemIndex.data(Qt::UserRole + 1);
-			QVariantList list = itemData.toList();
-			list.replace(CalendarNamespace::CalendarMonthEventRole, true);
-			mModel->itemFromIndex(itemIndex)->setData(list);
-		}
+	
+	// Check if model is updated with all the dates
+	// If not, return false for later updation
+	if(count == mModel->rowCount()) {
+        for(int i = 0; i < count; i++) {
+            // Check if the day has events
+            if (monthDataArray[i].HasEvents()) {
+                QModelIndex itemIndex = mModel->index(i,0);
+                QVariant itemData = itemIndex.data(Qt::UserRole + 1);
+                QVariantList list = itemData.toList();
+                list.replace(CalendarNamespace::CalendarMonthEventRole, true);
+                mModel->itemFromIndex(itemIndex)->setData(list);
+            }
+        }
+	} else {
+	    mEventIndicatorNotSet = true;
 	}
 	
 	OstTraceFunctionExit0( CALENMONTHGRID_UPDATEMONTHGRIDWITHEVENTINDICATORS_EXIT );
@@ -446,7 +462,7 @@
 {
     OstTraceFunctionEntry0( CALENMONTHGRID_GESTUREEVENT_ENTRY );
     
-    // Dont listem for any gesture when grid is getting adjusted as listening to those was causing
+    // Dont listen for any gesture when grid is getting adjusted as listening to those was causing
     // grid to stop abruptly i between
     if (mIsGridAdjusting) {
         // consume the event and return
@@ -468,18 +484,9 @@
                 // Use our defined threshold temporarily till scrollarea 
                 // frm orbit side is made clever enough not to scroll in other direction
                 // apart frm the registered scroll direction
-                QPointF delta = gesture->delta();
-                // Check the current orientation of the device and
-                // swap the vertical and horizontal distances in landscape
-                qreal horizontalDiff = 0.0;
-                qreal verticalDiff = 0.0;
-                if (hbInstance->allMainWindows().at(0)->orientation() == Qt::Vertical) {
-                    horizontalDiff = delta.x();
-                    verticalDiff = delta.y();
-                } else {
-                    horizontalDiff = delta.y();
-                    verticalDiff = delta.x();
-                }
+                QPointF delta = gesture->sceneOffset();
+                qreal horizontalDiff = delta.x();
+                qreal verticalDiff = delta.y();
                 if (abs(horizontalDiff) > MAX_PAN_DIRECTION_THRESHOLD) {
                     // Now see if y coord diff has crossed threshold
                     if (verticalDiff > MAX_PAN_DIRECTION_THRESHOLD) {
@@ -538,6 +545,15 @@
         }
     }
    
+   // Check if we can scroll
+   if (!checkIfWeCanScroll(mDirection)) {
+       // We cannot scroll, return back
+       mIsPanGesture = false;
+       mIgnoreItemActivated = false;
+       mDirection = invalid;
+       event->accept(Qt::PanGesture);
+   }
+   
    if (mDirection!= invalid) {
         // Call the parent class to perform the pan gesture
         // When scrolling finished, month grid will adjust to show the proper month
@@ -922,11 +938,15 @@
 {
     OstTraceFunctionEntry0( CALENMONTHGRID_ITEMACTIVATED_ENTRY );
     
-	if (mIgnoreItemActivated) {
+    QList<CalenMonthData >& monthDataList = mView->monthDataList();
+    // Chekc if we need to ignore the event or the newly tapped date is
+    // not valid date
+	if (mIgnoreItemActivated || !(CalenDateUtils::isValidDay(monthDataList[index.row()].Day()))) {
 		mIgnoreItemActivated = false;
 		OstTraceFunctionExit0( CALENMONTHGRID_ITEMACTIVATED_EXIT );
 		return;
 	}
+	
 	mIsNonActiveDayFocused = false;
 	// Check if the same item has been tapped twice
 	if (mCurrentRow == index.row()) {
@@ -956,7 +976,6 @@
 		// Check if inactive date is tapped
 		QDateTime activeMonth = mView->getActiveDay();
 		int month = activeMonth.date().month();
-		QList<CalenMonthData >& monthDataList = mView->monthDataList();
 		if(month != monthDataList[mCurrentRow].Day().date().month()){
 			// Set the flag
 			mIsNonActiveDayFocused = true;
@@ -1150,7 +1169,6 @@
 {
     OstTraceFunctionEntry0( CALENMONTHGRID_ORIENTATIONCHANGED_ENTRY );
     
-    Q_UNUSED(newOrientation)
 	// We are overriding this function to avoid the default behavior of
 	// hbgridview on orientation change as it swaps the row and column counts
 	// Calculate the proper index to be scrolled to
@@ -1271,6 +1289,34 @@
 }
 
 /*!
+ Function to check if scrolling is allowed. This function will make an effect
+ only when you are going to month that is not supported by us.
+ */
+bool CalenMonthGrid::checkIfWeCanScroll(scrollDirection direction)
+{
+    OstTraceFunctionEntry0( CALENMONTHGRID_CHECKIFWECANSCROLL_ENTRY );
+    
+    bool value = true;
+    
+    // Get the current active Date
+    QDateTime activeDate = mView->getActiveDay();
+    // if direction is up, then check if the next month is
+    // not January, 2101
+    if (direction == up) {
+        QDateTime nextMonth = activeDate.addMonths(1);
+        value = CalenDateUtils::isValidDay(nextMonth);
+    } else if (direction == down) { // if direction is up, then check if the next month is
+        // not December, 1899
+        QDateTime prevMonth = activeDate.addMonths(-1);
+        value = CalenDateUtils::isValidDay(prevMonth);
+    }
+    
+    OstTraceFunctionExit0( CALENMONTHGRID_CHECKIFWECANSCROLL_EXIT );
+    
+    return value;
+}
+
+/*!
  Slot to handle the change in theme
  */
 void CalenMonthGrid::handleThemeChange()