summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/kodaymatrix.cpp118
-rw-r--r--korganizer/kodaymatrix.h5
2 files changed, 111 insertions, 12 deletions
diff --git a/korganizer/kodaymatrix.cpp b/korganizer/kodaymatrix.cpp
index 17a8546..1cde616 100644
--- a/korganizer/kodaymatrix.cpp
+++ b/korganizer/kodaymatrix.cpp
@@ -21,16 +21,17 @@
21 with any edition of Qt, and distribute the resulting executable, 21 with any edition of Qt, and distribute the resulting executable,
22 without including the source ode for Qt in the source distribution. 22 without including the source ode for Qt in the source distribution.
23*/ 23*/
24 24
25#include <qevent.h> 25#include <qevent.h>
26#include <qpainter.h> 26#include <qpainter.h>
27#include <qptrlist.h> 27#include <qptrlist.h>
28#include <qtimer.h> 28#include <qtimer.h>
29#include <qwhatsthis.h>
29 30
30#include <kglobal.h> 31#include <kglobal.h>
31#include <kdebug.h> 32#include <kdebug.h>
32#include <klocale.h> 33#include <klocale.h>
33 34
34#include <libkcal/vcaldrag.h> 35#include <libkcal/vcaldrag.h>
35#include <libkcal/icaldrag.h> 36#include <libkcal/icaldrag.h>
36#include <libkcal/dndfactory.h> 37#include <libkcal/dndfactory.h>
@@ -53,16 +54,29 @@
53// ============================================================================ 54// ============================================================================
54 55
55DynamicTip::DynamicTip( QWidget * parent ) 56DynamicTip::DynamicTip( QWidget * parent )
56 : QToolTip( parent ) 57 : QToolTip( parent )
57{ 58{
58 matrix = (KODayMatrix*)parent; 59 matrix = (KODayMatrix*)parent;
59} 60}
60 61
62class KODaymatrixWhatsThis :public QWhatsThis
63{
64public:
65 KODaymatrixWhatsThis( KODayMatrix* view ) : QWhatsThis( view ),_view (view) { };
66
67protected:
68 virtual QString text( const QPoint& p )
69 {
70 return _view->getWhatsThisText( p ) ;
71 }
72private:
73 KODayMatrix * _view;
74};
61 75
62void DynamicTip::maybeTip( const QPoint &pos ) 76void DynamicTip::maybeTip( const QPoint &pos )
63{ 77{
64 //calculate which cell of the matrix the mouse is in 78 //calculate which cell of the matrix the mouse is in
65 QRect sz = matrix->frameRect(); 79 QRect sz = matrix->frameRect();
66 int dheight = sz.height()*7 / 42; 80 int dheight = sz.height()*7 / 42;
67 int dwidth = sz.width() / 7; 81 int dwidth = sz.width() / 7;
68 int row = pos.y()/dheight; 82 int row = pos.y()/dheight;
@@ -90,20 +104,21 @@ const int KODayMatrix::NUMDAYS = 42;
90KODayMatrix::KODayMatrix( QWidget *parent, const char *name ) 104KODayMatrix::KODayMatrix( QWidget *parent, const char *name )
91 : QFrame( parent, name ), mCalendar( 0 ) 105 : QFrame( parent, name ), mCalendar( 0 )
92 106
93#if 0 107#if 0
94KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) : 108KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) :
95 QFrame(parent, name) 109 QFrame(parent, name)
96#endif 110#endif
97{ 111{
98 112 new KODaymatrixWhatsThis(this);
99 mPendingUpdateBeforeRepaint = false; 113 mPendingUpdateBeforeRepaint = false;
100 114 mouseDown = false;
101 // initialize dynamic arrays 115 // initialize dynamic arrays
116 bDays.resize ( NUMDAYS );
102 days = new QDate[NUMDAYS]; 117 days = new QDate[NUMDAYS];
103 daylbls = new QString[NUMDAYS]; 118 daylbls = new QString[NUMDAYS];
104 events = new int[NUMDAYS]; 119 events = new int[NUMDAYS];
105 mToolTip = new DynamicTip(this); 120 mToolTip = new DynamicTip(this);
106 121
107 // set default values used for drawing the matrix 122 // set default values used for drawing the matrix
108 mDefaultBackColor = palette().active().base(); 123 mDefaultBackColor = palette().active().base();
109 mDefaultTextColor = palette().active().foreground(); 124 mDefaultTextColor = palette().active().foreground();
@@ -118,16 +133,75 @@ KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const
118 133
119 mUpdateTimer = new QTimer( this ); 134 mUpdateTimer = new QTimer( this );
120 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() )); 135 connect (mUpdateTimer ,SIGNAL(timeout()), this, SLOT ( updateViewTimed() ));
121 mRepaintTimer = new QTimer( this ); 136 mRepaintTimer = new QTimer( this );
122 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() )); 137 connect (mRepaintTimer ,SIGNAL(timeout()), this, SLOT ( repaintViewTimed() ));
123 mDayChanged = false; 138 mDayChanged = false;
124 updateView(); 139 updateView();
125} 140}
141QString KODayMatrix::getWhatsThisText( QPoint p )
142{
143
144 int tmp = getDayIndexFrom(p.x(), p.y());
145 if ( tmp < 0 || tmp > NUMDAYS-1 || !mCalendar )
146 return QString();
147 QDate mDate = days[tmp];
148 QPtrList<Event> eventlist = mCalendar->events(mDate);
149 Event *event;
150 QStringList mToolTip;
151 for(event=eventlist.first();event != 0;event=eventlist.next()) {
152 QString mToolTipText;
153 QString text;
154 int multiday = 0;// 1 = start, 2 = midddle, 3 = end day
155 if (event->isMultiDay()) {
156 QString prefix = "<->";multiday = 2;
157 QString time;
158 if ( event->doesRecur() ) {
159 if ( event->recursOn( mDate) ) {
160 prefix ="->" ;multiday = 1;
161 }
162 else {
163 int days = event->dtStart().date().daysTo ( event->dtEnd().date() );
164 if ( event->recursOn( mDate.addDays( -days)) ) {
165 prefix ="<-" ;multiday = 3;
166 }
167 }
168 } else {
169 if (mDate == event->dtStart().date()) {
170 prefix ="->" ;multiday = 1;
171 } else if (mDate == event->dtEnd().date()) {
172 prefix ="<-" ;multiday = 3;
173 }
174 }
175 if ( !event->doesFloat() ) {
176 if ( mDate == event->dtStart().date () )
177 time = KGlobal::locale()->formatTime(event->dtStart().time())+" ";
178 else if ( mDate == event->dtEnd().date () )
179 time = KGlobal::locale()->formatTime(event->dtEnd().time())+" ";
180
181 }
182 text = time + event->summary();
183 mToolTipText += prefix + text;
184 } else {
185 if (event->doesFloat()) {
186 text = event->summary();
187 mToolTipText += text;
188 }
189 else {
190 text = KGlobal::locale()->formatTime(event->dtStart().time());
191 text += " " + event->summary();
192 mToolTipText += KGlobal::locale()->formatTime(event->dtStart().time()) +"-"+KGlobal::locale()->formatTime(event->dtEnd().time())+" " + event->summary();
193 }
194 }
195 mToolTip.append( mToolTipText );
196 }
197 mToolTip.sort();
198 return "<b>"+KGlobal::locale()->formatDate(days[tmp]) + "</b><br>" + mToolTip.join("<br>");
199}
126void KODayMatrix::setCalendar( Calendar *cal ) 200void KODayMatrix::setCalendar( Calendar *cal )
127{ 201{
128 mCalendar = cal; 202 mCalendar = cal;
129 203
130 setAcceptDrops( mCalendar ); 204 setAcceptDrops( mCalendar );
131 205
132 updateEvents(); 206 updateEvents();
133} 207}
@@ -241,27 +315,34 @@ void KODayMatrix::updateViewTimed()
241 } 315 }
242 //qDebug("KODayMatrix::updateViewTimed "); 316 //qDebug("KODayMatrix::updateViewTimed ");
243 for(int i = 0; i < NUMDAYS; i++) { 317 for(int i = 0; i < NUMDAYS; i++) {
244 // if events are set for the day then remember to draw it bold 318 // if events are set for the day then remember to draw it bold
245 QPtrList<Event> eventlist = mCalendar->events(days[i]); 319 QPtrList<Event> eventlist = mCalendar->events(days[i]);
246 Event *event; 320 Event *event;
247 int numEvents = eventlist.count(); 321 int numEvents = eventlist.count();
248 QString holiStr = ""; 322 QString holiStr = "";
323 bDays.clearBit(i);
249 for(event=eventlist.first();event != 0;event=eventlist.next()) { 324 for(event=eventlist.first();event != 0;event=eventlist.next()) {
250 ushort recurType = event->recurrence()->doesRecur(); 325 ushort recurType = event->recurrence()->doesRecur();
251 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) || 326 if ((recurType == Recurrence::rDaily && !KOPrefs::instance()->mDailyRecur) ||
252 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) { 327 (recurType == Recurrence::rWeekly && !KOPrefs::instance()->mWeeklyRecur)) {
253 numEvents--; 328 numEvents--;
254 } 329 }
255 if ( event->categories().contains( i18n("Holiday") ) || event->categories().contains( "Holiday" )) { 330 if ( event->categories().contains( i18n("Holiday") ) || event->categories().contains( "Holiday" )) {
256 if ( !holiStr.isEmpty() ) 331 if ( !holiStr.isEmpty() )
257 holiStr += "\n"; 332 holiStr += "\n";
258 holiStr += event->summary(); 333 holiStr += event->summary();
259 } 334 }
335 if ( event->categories().contains( i18n("Birthday") ) || event->categories().contains( "Birthday" )) {
336 if ( !holiStr.isEmpty() )
337 holiStr += "\n";
338 holiStr += event->summary();
339 bDays.setBit(i);
340 }
260 } 341 }
261 events[i] = numEvents; 342 events[i] = numEvents;
262 //if it is a holy day then draw it red. Sundays are consider holidays, too 343 //if it is a holy day then draw it red. Sundays are consider holidays, too
263 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) || 344 if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) ||
264 !holiStr.isEmpty()) { 345 !holiStr.isEmpty()) {
265 mHolidays[i] = holiStr; 346 mHolidays[i] = holiStr;
266 } else { 347 } else {
267 mHolidays[i] = QString::null; 348 mHolidays[i] = QString::null;
@@ -302,21 +383,21 @@ void KODayMatrix::updateView(QDate actdate)
302 mDayChanged = true; 383 mDayChanged = true;
303 recalculateToday(); 384 recalculateToday();
304 } 385 }
305 //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() ); 386 //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() );
306 if ( !isVisible() ) { 387 if ( !isVisible() ) {
307 mPendingUpdateBeforeRepaint = true; 388 mPendingUpdateBeforeRepaint = true;
308 } else { 389 } else {
309#ifdef DESKTOP_VERSION 390#ifdef DESKTOP_VERSION
310 //mRepaintTimer->start( 250 ); 391 //mRepaintTimer->start( 150 );
311 mUpdateTimer->start( 250 ); 392 mUpdateTimer->start( 150 );
312#else 393#else
313 mRepaintTimer->start( 350 ); 394 mRepaintTimer->start( 350 );
314 mUpdateTimer->start( 2000 ); 395 mUpdateTimer->start( 1200 );
315#endif 396#endif
316 } 397 }
317} 398}
318void KODayMatrix::updateEvents() 399void KODayMatrix::updateEvents()
319{ 400{
320 if ( !mCalendar ) return; 401 if ( !mCalendar ) return;
321 402
322 for( int i = 0; i < NUMDAYS; i++ ) { 403 for( int i = 0; i < NUMDAYS; i++ ) {
@@ -363,24 +444,32 @@ int KODayMatrix::getDayIndexFrom(int x, int y)
363} 444}
364 445
365// ---------------------------------------------------------------------------- 446// ----------------------------------------------------------------------------
366// M O U S E E V E N T H A N D L I N G 447// M O U S E E V E N T H A N D L I N G
367// ---------------------------------------------------------------------------- 448// ----------------------------------------------------------------------------
368 449
369void KODayMatrix::mousePressEvent (QMouseEvent* e) 450void KODayMatrix::mousePressEvent (QMouseEvent* e)
370{ 451{
452
453 if ( e->button() == LeftButton )
454 mouseDown = true;
371 mSelStart = getDayIndexFrom(e->x(), e->y()); 455 mSelStart = getDayIndexFrom(e->x(), e->y());
372 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1; 456 if (mSelStart > NUMDAYS-1) mSelStart=NUMDAYS-1;
373 mSelInit = mSelStart; 457 mSelInit = mSelStart;
374} 458}
375 459
376void KODayMatrix::mouseReleaseEvent (QMouseEvent* e) 460void KODayMatrix::mouseReleaseEvent (QMouseEvent* e)
377{ 461{
378 462 if ( e->button() == LeftButton )
463 if ( ! mouseDown ) {
464 return;
465 }
466 else
467 mouseDown = false;
379 int tmp = getDayIndexFrom(e->x(), e->y()); 468 int tmp = getDayIndexFrom(e->x(), e->y());
380 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 469 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
381 470
382 if (mSelInit > tmp) { 471 if (mSelInit > tmp) {
383 mSelEnd = mSelInit; 472 mSelEnd = mSelInit;
384 if (tmp != mSelStart) { 473 if (tmp != mSelStart) {
385 mSelStart = tmp; 474 mSelStart = tmp;
386 repaint(false); 475 repaint(false);
@@ -401,17 +490,20 @@ void KODayMatrix::mouseReleaseEvent (QMouseEvent* e)
401 for (int i = mSelStart; i <= mSelEnd; i++) { 490 for (int i = mSelStart; i <= mSelEnd; i++) {
402 daylist.append(days[i]); 491 daylist.append(days[i]);
403 } 492 }
404 emit selected((const DateList)daylist); 493 emit selected((const DateList)daylist);
405 494
406} 495}
407 496
408void KODayMatrix::mouseMoveEvent (QMouseEvent* e) 497void KODayMatrix::mouseMoveEvent (QMouseEvent* e)
409{ 498{
499 if ( ! mouseDown ) {
500 return;
501 }
410 int tmp = getDayIndexFrom(e->x(), e->y()); 502 int tmp = getDayIndexFrom(e->x(), e->y());
411 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1; 503 if (tmp > NUMDAYS-1) tmp=NUMDAYS-1;
412 504
413 if (mSelInit > tmp) { 505 if (mSelInit > tmp) {
414 mSelEnd = mSelInit; 506 mSelEnd = mSelInit;
415 if (tmp != mSelStart) { 507 if (tmp != mSelStart) {
416 mSelStart = tmp; 508 mSelStart = tmp;
417 repaint(false); 509 repaint(false);
@@ -625,27 +717,31 @@ void KODayMatrix::paintEvent(QPaintEvent * pevent)
625 if (events[i] > 0) { 717 if (events[i] > 0) {
626 QFont myFont = font(); 718 QFont myFont = font();
627 myFont.setBold(true); 719 myFont.setBold(true);
628 p.setFont(myFont); 720 p.setFont(myFont);
629 } 721 }
630 722
631 // if it is a holiday then use the default holiday color 723 // if it is a holiday then use the default holiday color
632 if (!mHolidays[i].isNull()) { 724 if (!mHolidays[i].isNull()) {
633 if (actcol == mDefaultTextColor) { 725 if ( bDays.testBit(i) ) {
634 p.setPen(KOPrefs::instance()->mHolidayColor); 726 p.setPen(Qt::green);
635 } else { 727 } else {
636 p.setPen(mHolidayColorShaded); 728 if (actcol == mDefaultTextColor) {
729 p.setPen(KOPrefs::instance()->mHolidayColor);
730 } else {
731 p.setPen(mHolidayColorShaded);
732 }
637 } 733 }
638 } 734 }
639 735
640 // draw selected days with special color 736 // draw selected days with special color
641 // DO NOT specially highlight holidays in selection ! 737 // DO NOT specially highlight holidays in selection !
642 if (i >= mSelStart && i <= mSelEnd) { 738 if (i >= mSelStart && i <= mSelEnd) {
643 p.setPen(mSelectedDaysColor); 739 ;//p.setPen(mSelectedDaysColor);
644 } 740 }
645 741
646 p.drawText(col*dwidth, row*dheight, dwidth, dheight, 742 p.drawText(col*dwidth, row*dheight, dwidth, dheight,
647 Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]); 743 Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]);
648 744
649 // reset color to actual color 745 // reset color to actual color
650 if (!mHolidays[i].isNull()) { 746 if (!mHolidays[i].isNull()) {
651 p.setPen(actcol); 747 p.setPen(actcol);
diff --git a/korganizer/kodaymatrix.h b/korganizer/kodaymatrix.h
index ba4853f..c049942 100644
--- a/korganizer/kodaymatrix.h
+++ b/korganizer/kodaymatrix.h
@@ -27,17 +27,17 @@
27 27
28#include <qstring.h> 28#include <qstring.h>
29#include <qframe.h> 29#include <qframe.h>
30#include <qcolor.h> 30#include <qcolor.h>
31#include <qpen.h> 31#include <qpen.h>
32#include <qdatetime.h> 32#include <qdatetime.h>
33#include <qtooltip.h> 33#include <qtooltip.h>
34#include <qpixmap.h> 34#include <qpixmap.h>
35 35#include <qbitarray.h>
36#include <qmap.h> 36#include <qmap.h>
37 37
38class QDragEnterEvent; 38class QDragEnterEvent;
39class QDragMoveEvent; 39class QDragMoveEvent;
40class QDragLeaveEvent; 40class QDragLeaveEvent;
41class QDropEvent; 41class QDropEvent;
42 42
43class KODayMatrix; 43class KODayMatrix;
@@ -164,16 +164,17 @@ public:
164 /** If today is visible, then we can find out if today is 164 /** If today is visible, then we can find out if today is
165 * near the beginning or the end of the month. 165 * near the beginning or the end of the month.
166 * This is dependent on today remaining the index 166 * This is dependent on today remaining the index
167 * in the array of visible dates and going from 167 * in the array of visible dates and going from
168 * top left (0) to bottom right (41). 168 * top left (0) to bottom right (41).
169 */ 169 */
170 bool isBeginningOfMonth() const { return today<=8; } ; 170 bool isBeginningOfMonth() const { return today<=8; } ;
171 bool isEndOfMonth() const { return today>=27; } ; 171 bool isEndOfMonth() const { return today>=27; } ;
172 QString getWhatsThisText( QPoint ) ;
172 173
173public slots: 174public slots:
174 /** Recalculates all the flags of the days in the matrix like holidays or events 175 /** Recalculates all the flags of the days in the matrix like holidays or events
175 * on a day (Actually calls above method with the actual startdate). 176 * on a day (Actually calls above method with the actual startdate).
176 */ 177 */
177 void updateView(); 178 void updateView();
178 void updateViewTimed(); 179 void updateViewTimed();
179 void repaintViewTimed(); 180 void repaintViewTimed();
@@ -219,16 +220,18 @@ protected:
219 220
220 void dragLeaveEvent(QDragLeaveEvent *); 221 void dragLeaveEvent(QDragLeaveEvent *);
221 222
222 void dropEvent(QDropEvent *); 223 void dropEvent(QDropEvent *);
223 224
224 void resizeEvent(QResizeEvent *); 225 void resizeEvent(QResizeEvent *);
225 226
226private: 227private:
228 bool mouseDown;
229 QBitArray bDays;
227 QPixmap myPix; 230 QPixmap myPix;
228 QTimer* mUpdateTimer; 231 QTimer* mUpdateTimer;
229 QTimer* mRepaintTimer; 232 QTimer* mRepaintTimer;
230 bool mDayChanged; 233 bool mDayChanged;
231 bool mPendingUpdateBeforeRepaint; 234 bool mPendingUpdateBeforeRepaint;
232 235
233 /** returns the index of the day located at the matrix's widget (x,y) position. 236 /** returns the index of the day located at the matrix's widget (x,y) position.
234 * 237 *