[PATCH] datebook: show events on all days in month view

Paul Eggleton <[email protected]>
Newsgroups gmane.comp.handhelds.opie.devel
Message-ID <[email protected]>
Hi there,

The attached patch makes the datebook month view show events on all days 
including the extra days from the previous/next month. It also prevents the 
events from being refreshed twice.

This fixes bug #1351 (http://opie-bugs.oszine.de/view.php?id=1351).

Cheers,
Paul

_______________________________________________

http://opie.handhelds.org/cgi-bin/moin.cgi/DeveloperWikiIndex

Opie-devel mailing list
[email protected]
https://handhelds.org/mailman/listinfo/opie-devel
datebook_full_event_table.patch (text/x-diff, 5 KB)
Index: odatebookmonth.cpp
===================================================================
RCS file: /cvs/opie/core/pim/datebook/modules/monthview/odatebookmonth.cpp,v
retrieving revision 1.2
diff -u -r1.2 odatebookmonth.cpp
--- odatebookmonth.cpp	15 Jun 2005 19:45:55 -0000	1.2
+++ odatebookmonth.cpp	29 Dec 2006 08:32:25 -0000
@@ -177,6 +177,22 @@
     col = effective_day % 7;
 }
 
+bool ODateBookMonthTable::findDate( QDate date, int &row, int &col )
+{
+	int rows = numRows();
+	int cols = numCols();
+	for(int r=0;r<rows;r++) {
+		for(int c=0;c<cols;c++) {
+			if(getDateAt(r, c) == date) {
+				row = r;
+				col = c;
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
 void ODateBookMonthTable::dayClicked( int row, int col )
 {
     changeDaySelection( row, col );
@@ -190,32 +206,43 @@
 
 void ODateBookMonthTable::changeDaySelection( int row, int col )
 {
-    DayItemMonth *i = (DayItemMonth*)item( row, col );
-    if ( !i )
-    return;
-    switch ( i->type() ) {
-    case Calendar::Day::ThisMonth:
-        selMonth = month;
-        break;
-    case Calendar::Day::PrevMonth:
-        selMonth = month-1;
-        break;
-    default:
-        selMonth = month+1;
-    }
-
-    selYear = year;
-    if ( selMonth <= 0 ) {
-    selMonth = 12;
-    selYear--;
-    } else if ( selMonth > 12 ) {
-    selMonth = 1;
-    selYear++;
-    }
-    selDay = i->day();
+	QDate selDate = getDateAt( row, col );
+	selYear = selDate.year();
+	selMonth = selDate.month();
+	selDay = selDate.day();
+}
+
+QDate ODateBookMonthTable::getDateAt( int row, int col ) 
+{
+	int itemMonth, itemYear;
+	
+	DayItemMonth *i = (DayItemMonth*)item( row, col );
+	if ( !i )
+		return QDate(1900, 1, 1);
+	switch ( i->type() ) {
+		case Calendar::Day::ThisMonth:
+			itemMonth = month;
+			break;
+		case Calendar::Day::PrevMonth:
+			itemMonth = month-1;
+			break;
+		default:
+			itemMonth = month+1;
+	}
+	
+	itemYear = year;
+	if ( itemMonth <= 0 ) {
+		itemMonth = 12;
+		itemYear--;
+	}
+	else if ( itemMonth > 12 ) {
+		itemMonth = 1;
+		itemYear++;
+	}
+	
+	return QDate( itemYear, itemMonth, i->day());
 }
 
-
 void ODateBookMonthTable::viewportMouseReleaseEvent( QMouseEvent * )
 {
     dayClicked( currentRow(), currentColumn() );
@@ -223,34 +250,33 @@
 
 void ODateBookMonthTable::getEvents()
 {
-    if ( !db )
-    return;
-
-    QDate dtStart( year, month, 1 );
-    d->mMonthEvents = db->getEffectiveEvents( dtStart,
-                          QDate( year, month,
-                             dtStart.daysInMonth() ) );
-    QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin();
-    // now that the events are sorted, basically go through the list, make
-    // a small list for every day and set it for each item...
-    // clear all the items...
-    while ( it != d->mMonthEvents.end() ) {
-    QValueList<EffectiveEvent> dayEvent;
-    EffectiveEvent e = *it;
-    ++it;
-    dayEvent.append( e );
-    while ( it != d->mMonthEvents.end()
-            && e.date() == (*it).date() ) {
-        dayEvent.append( *it );
-        ++it;
-    }
-    int row, col;
-    findDay( e.date().day(), row, col );
-    DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) );
-    w->setEvents( dayEvent );
-    updateCell( row, col );
-    dayEvent.clear();
-    }
+	if ( !db )
+		return;
+	
+	QDate dtStart = getDateAt(0,0);
+	QDate dtEnd = getDateAt(numRows()-1, numCols()-1);
+	d->mMonthEvents = db->getEffectiveEvents( dtStart, dtEnd);
+	QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin();
+	// now that the events are sorted, basically go through the list, make
+	// a small list for every day and set it for each item...
+	// clear all the items...
+	while ( it != d->mMonthEvents.end() ) {
+		QValueList<EffectiveEvent> dayEvent;
+		EffectiveEvent e = *it;
+		++it;
+		dayEvent.append( e );
+		while ( it != d->mMonthEvents.end()
+						&& e.date() == (*it).date() ) {
+			dayEvent.append( *it );
+			++it;
+		}
+		int row, col;
+		findDate( e.date(), row, col );
+		DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) );
+		w->setEvents( dayEvent );
+		updateCell( row, col );
+		dayEvent.clear();
+	}
 }
 
 
@@ -345,7 +371,9 @@
 void ODateBookMonth::redraw()
 {
     table->setDate( year, month, day );
-    table->redraw();
+    // table->setDate already calls setupTable, which is all that
+    // redraw will do here that's useful - bluelightning
+    //table->redraw();
 }
 
 QDate  ODateBookMonth::selectedDate() const
Index: odatebookmonth.h
===================================================================
RCS file: /cvs/opie/core/pim/datebook/modules/monthview/odatebookmonth.h,v
retrieving revision 1.1
diff -u -r1.1 odatebookmonth.h
--- odatebookmonth.h	20 Mar 2005 10:51:55 -0000	1.1
+++ odatebookmonth.h	29 Dec 2006 08:32:26 -0000
@@ -81,8 +81,10 @@
     void setupLabels();
 
     void findDay( int day, int &row, int &col );
+    bool findDate( QDate date, int &row, int &col );
     void getEvents();
     void changeDaySelection( int row, int col );
+    QDate getDateAt( int row, int col );
 
     int year, month, day;
     int selYear, selMonth, selDay;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.