-rw-r--r-- | korganizer/kodaymatrix.cpp | 493 |
1 files changed, 251 insertions, 242 deletions
diff --git a/korganizer/kodaymatrix.cpp b/korganizer/kodaymatrix.cpp index d543aaf..dfc6af7 100644 --- a/korganizer/kodaymatrix.cpp +++ b/korganizer/kodaymatrix.cpp @@ -105,16 +105,17 @@ const int KODayMatrix::NUMDAYS = 42; KODayMatrix::KODayMatrix( QWidget *parent, const char *name ) : QFrame( parent, name , Qt::WRepaintNoErase ), mCalendar( 0 ) #if 0 KODayMatrix::KODayMatrix(QWidget *parent, Calendar* calendar, QDate date, const char *name) : QFrame(parent, name) #endif { + mRedrawNeeded = true; mKODaymatrixWhatsThis = new KODaymatrixWhatsThis(this); mPendingUpdateBeforeRepaint = false; mouseDown = false; // initialize dynamic arrays bDays.resize ( NUMDAYS ); hDays.resize ( NUMDAYS );; eDays.resize ( NUMDAYS );; days = new QDate[NUMDAYS]; @@ -381,16 +382,17 @@ void KODayMatrix::updateViewTimed() //if it is a holy day then draw it red. Sundays are consider holidays, too if ( (KOGlobals::self()->calendarSystem()->dayOfWeek(days[i]) == KOGlobals::self()->calendarSystem()->weekDayOfPray()) || !holiStr.isEmpty()) { mHolidays[i] = holiStr; } else { mHolidays[i] = QString::null; } } + mRedrawNeeded = true; if ( ! mPendingUpdateBeforeRepaint ) repaint(false); } void KODayMatrix::updateView(QDate actdate) { if ( ! actdate.isValid() ) { //qDebug("date not valid "); @@ -415,25 +417,26 @@ void KODayMatrix::updateView(QDate actdate) mSelStart = mSelStart + tmp; if( mSelEnd > NUMDAYS || mSelEnd < 0 ) mSelEnd = mSelEnd + tmp; } } startdate = actdate; mDayChanged = true; recalculateToday(); + mRedrawNeeded = true; } //qDebug("restart Timer %d vis: %d", mDayChanged, isVisible() ); if ( !isVisible() ) { mPendingUpdateBeforeRepaint = true; } else { #ifdef DESKTOP_VERSION //mRepaintTimer->start( 100 ); //updateViewTimed(); - mUpdateTimer->start( 20 ); + mUpdateTimer->start( 50 ); #else mRepaintTimer->start( 350 ); mUpdateTimer->start( 1200 ); #endif } } void KODayMatrix::updateEvents() { @@ -673,268 +676,274 @@ void KODayMatrix::paintEvent(QPaintEvent * pevent) if ( width() <= 0 || height() <= 0 ) return; if ( mPendingUpdateBeforeRepaint ) { updateViewTimed(); mPendingUpdateBeforeRepaint = false; } if ( myPix.width() != width() || myPix.height()!=height() ) { myPix.resize(size() ); + mRedrawNeeded = true; } - QPainter p(&myPix); - p.setFont(font()); + if ( mRedrawNeeded ) { + //qDebug("REDRAW "); + QPainter p(&myPix); + p.setFont(font()); - int dheight = daysize.height(); - int dwidth = daysize.width(); - int row,col; - int selw, selh; - int xyOff = frameWidth(); - int colModulo = (width()-2) % 7; - int rowModulo = (height()-2) % 6; - //qDebug("col %d row %d ",colModulo,rowModulo ); + + int dheight = daysize.height(); + int dwidth = daysize.width(); + int row,col; + int selw, selh; + int xyOff = frameWidth(); + int colModulo = (width()-2) % 7; + int rowModulo = (height()-2) % 6; + //qDebug("col %d row %d ",colModulo,rowModulo ); - bool isRTL = KOGlobals::self()->reverseLayout(); - - // draw background and topleft frame - p.fillRect(0,0,width(),height(), mDefaultBackColor); - p.setPen(mDefaultTextColor); - p.drawRect(0, 0, width(), height()); - int mSelStartT = mSelStart; - int mSelEndT = mSelEnd; - if ( mSelEndT >= NUMDAYS ) - mSelEndT = NUMDAYS-1; - // draw selected days with highlighted background color - if (mSelStart != NOSELECTION) { - bool skip = false; - if ( ! mouseDown ) { - int mo = days[20].month(); - //qDebug("-- %d %d ", mSelStartT, mSelEndT); - //qDebug("%d %d %d - d %d", mo, days[mSelStartT].month() , days[mSelEndT].month(), days[mSelEndT].day() ); - int startMo = days[mSelStartT].month(); - int endMo = days[mSelEndT].month(); - if ( startMo == 12 && mo == 1 && endMo <= 2 ) - startMo = 1; - if ( endMo == 1 && mo == 12 ) - endMo = 12; - if ( mo == 12 && startMo == 1 ) - startMo = 13; - if ( (startMo > mo || endMo < mo) ) { - skip = true; - } else { - if ( days[mSelStartT].month() != mo ) { - int add = days[mSelStartT].daysInMonth ()-days[mSelStartT].day(); - mSelStartT += add +1; - } - if ( days[mSelEndT].month() != mo ) { - int sub = days[mSelEndT].day(); - mSelEndT -= sub ; - } - } - } - //qDebug("SKIP %d ", skip); - if ( ! skip ) { - row = mSelStartT/7; - col = mSelStartT -row*7; - QColor selcol = KOPrefs::instance()->mHighlightColor; - int addCol = 0; - int addRow = 0; - int addRow2 = 0; - int addCol2 = 0; - if (row == mSelEndT/7) { - if ( rowModulo ) { - if ( row >= 6 - rowModulo ) - addRow = row - 5 + rowModulo; - } - if ( colModulo ) { - int colt1 = mSelEndT%7; - //qDebug("colt1 %d ", colt1 ); - if ( colt1 >= 7 - colModulo ) - addCol = colt1 - 7 + colModulo+1; - int colt = mSelStartT%7; - if ( colt >= 7 - colModulo ) - addCol2 = colt - 7 + colModulo; - addCol -= addCol2; - //qDebug("COL %d %d %d %d ",col , colt1 ,addCol ,addCol2 ); - } - // Single row selection - if ( row == 0) - addRow = 1; - p.fillRect(isRTL ? (7 - (mSelEndT-mSelStartT+1) - col)*dwidth : col*dwidth+1+addCol2, - row*dheight+addRow, (mSelEndT-mSelStartT+1)*dwidth+addCol, dheight+1, selcol); - } else { - // draw first row to the right - if ( colModulo ) { - if ( col >= 7 - colModulo ) - addCol2 = col - 7 + colModulo; - } - if ( rowModulo ) { - if ( row >= 6 - rowModulo ) - addRow = row - 5 + rowModulo; - } - if ( row == 0) - addRow = 1; - int drawWid = width()-(col*dwidth+1+addCol2)-1; - p.fillRect(isRTL ? 0 : col*dwidth+1+addCol2, row*dheight+addRow, drawWid, - dheight+1, selcol); - // draw full block till last line - selh = mSelEndT/7-row; - addRow = 0; - if ( rowModulo ) { - if ( mSelEndT/7 >= 6 - rowModulo ) - addRow = mSelEndT/7 - 5 + rowModulo; - } - if (selh > 1) { - p.fillRect(1, (row+1)*dheight, 7*dwidth+colModulo, (selh-1)*dheight+addRow,selcol); - } - // draw last block from left to mSelEndT - selw = mSelEndT-7*(mSelEndT/7)+1; - //qDebug("esl %d ",selw ); - int add = 0; - if ( colModulo ) { - add = 7 - colModulo; - if ( selw > add ) - add = selw - add; - else - add = 0; - } - //qDebug("add %d ", add); - p.fillRect(isRTL ? (7-selw)*dwidth : 1, (row+selh)*dheight+addRow, - selw*dwidth+add, dheight+1, selcol); - } - } - } + bool isRTL = KOGlobals::self()->reverseLayout(); + + // draw background and topleft frame + p.fillRect(0,0,width(),height(), mDefaultBackColor); + p.setPen(mDefaultTextColor); + p.drawRect(0, 0, width(), height()); + int mSelStartT = mSelStart; + int mSelEndT = mSelEnd; + if ( mSelEndT >= NUMDAYS ) + mSelEndT = NUMDAYS-1; + // draw selected days with highlighted background color + if (mSelStart != NOSELECTION) { + bool skip = false; + if ( ! mouseDown ) { + int mo = days[20].month(); + //qDebug("-- %d %d ", mSelStartT, mSelEndT); + //qDebug("%d %d %d - d %d", mo, days[mSelStartT].month() , days[mSelEndT].month(), days[mSelEndT].day() ); + int startMo = days[mSelStartT].month(); + int endMo = days[mSelEndT].month(); + if ( startMo == 12 && mo == 1 && endMo <= 2 ) + startMo = 1; + if ( endMo == 1 && mo == 12 ) + endMo = 12; + if ( mo == 12 && startMo == 1 ) + startMo = 13; + if ( (startMo > mo || endMo < mo) ) { + skip = true; + } else { + if ( days[mSelStartT].month() != mo ) { + int add = days[mSelStartT].daysInMonth ()-days[mSelStartT].day(); + mSelStartT += add +1; + } + if ( days[mSelEndT].month() != mo ) { + int sub = days[mSelEndT].day(); + mSelEndT -= sub ; + } + } + } + //qDebug("SKIP %d ", skip); + if ( ! skip ) { + row = mSelStartT/7; + col = mSelStartT -row*7; + QColor selcol = KOPrefs::instance()->mHighlightColor; + int addCol = 0; + int addRow = 0; + int addRow2 = 0; + int addCol2 = 0; + if (row == mSelEndT/7) { + if ( rowModulo ) { + if ( row >= 6 - rowModulo ) + addRow = row - 5 + rowModulo; + } + if ( colModulo ) { + int colt1 = mSelEndT%7; + //qDebug("colt1 %d ", colt1 ); + if ( colt1 >= 7 - colModulo ) + addCol = colt1 - 7 + colModulo+1; + int colt = mSelStartT%7; + if ( colt >= 7 - colModulo ) + addCol2 = colt - 7 + colModulo; + addCol -= addCol2; + //qDebug("COL %d %d %d %d ",col , colt1 ,addCol ,addCol2 ); + } + // Single row selection + if ( row == 0) + addRow = 1; + p.fillRect(isRTL ? (7 - (mSelEndT-mSelStartT+1) - col)*dwidth : col*dwidth+1+addCol2, + row*dheight+addRow, (mSelEndT-mSelStartT+1)*dwidth+addCol, dheight+1, selcol); + } else { + // draw first row to the right + if ( colModulo ) { + if ( col >= 7 - colModulo ) + addCol2 = col - 7 + colModulo; + } + if ( rowModulo ) { + if ( row >= 6 - rowModulo ) + addRow = row - 5 + rowModulo; + } + if ( row == 0) + addRow = 1; + int drawWid = width()-(col*dwidth+1+addCol2)-1; + p.fillRect(isRTL ? 0 : col*dwidth+1+addCol2, row*dheight+addRow, drawWid, + dheight+1, selcol); + // draw full block till last line + selh = mSelEndT/7-row; + addRow = 0; + if ( rowModulo ) { + if ( mSelEndT/7 >= 6 - rowModulo ) + addRow = mSelEndT/7 - 5 + rowModulo; + } + if (selh > 1) { + p.fillRect(1, (row+1)*dheight, 7*dwidth+colModulo, (selh-1)*dheight+addRow,selcol); + } + // draw last block from left to mSelEndT + selw = mSelEndT-7*(mSelEndT/7)+1; + //qDebug("esl %d ",selw ); + int add = 0; + if ( colModulo ) { + add = 7 - colModulo; + if ( selw > add ) + add = selw - add; + else + add = 0; + } + //qDebug("add %d ", add); + p.fillRect(isRTL ? (7-selw)*dwidth : 1, (row+selh)*dheight+addRow, + selw*dwidth+add, dheight+1, selcol); + } + } + } - // iterate over all days in the matrix and draw the day label in appropriate colors - QColor actcol = mDefaultTextColorShaded; - p.setPen(actcol); - QPen tmppen; - for(int i = 0; i < NUMDAYS; i++) { - row = i/7; - col = isRTL ? 6-(i-row*7) : i-row*7; - - // if it is the first day of a month switch color from normal to shaded and vice versa - if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) { - if (actcol == mDefaultTextColorShaded) { - actcol = mDefaultTextColor; - } else { - actcol = mDefaultTextColorShaded; - } - p.setPen(actcol); - } - if (actcol == mDefaultTextColorShaded) { - if ( ! mouseDown ) { - continue; - } - } - //Reset pen color after selected days block - if (i == mSelEndT+1) { - p.setPen(actcol); - } + // iterate over all days in the matrix and draw the day label in appropriate colors + QColor actcol = mDefaultTextColorShaded; + p.setPen(actcol); + QPen tmppen; + for(int i = 0; i < NUMDAYS; i++) { + row = i/7; + col = isRTL ? 6-(i-row*7) : i-row*7; + + // if it is the first day of a month switch color from normal to shaded and vice versa + if ( KOGlobals::self()->calendarSystem()->day( days[i] ) == 1) { + if (actcol == mDefaultTextColorShaded) { + actcol = mDefaultTextColor; + } else { + actcol = mDefaultTextColorShaded; + } + p.setPen(actcol); + } + if (actcol == mDefaultTextColorShaded) { + if ( ! mouseDown ) { + continue; + } + } + //Reset pen color after selected days block + if (i == mSelEndT+1) { + p.setPen(actcol); + } - // if today then draw rectangle around day - if (today == i) { - tmppen = p.pen(); - QPen mTodayPen(p.pen()); - if ( daysize.width() < 20 ) - mTodayPen.setWidth(1); - else - mTodayPen.setWidth(mTodayMarginWidth); - //draw red rectangle for holidays - if (!mHolidays[i].isNull()) { - if (actcol == mDefaultTextColor) { - mTodayPen.setColor(KOPrefs::instance()->mHolidayColor); - } else { - mTodayPen.setColor(mHolidayColorShaded); - } - } - //draw gray rectangle for today if in selection - if (i >= mSelStartT && i <= mSelEndT) { - QColor grey("grey"); - mTodayPen.setColor(grey); - } - p.setPen(mTodayPen); - - - int addCol = 0; - int addRow = 0; - if (rowModulo) { - if ( row >= 6 - rowModulo ) - addRow = row - 5 + rowModulo; - } - if ( colModulo ) { - if ( col >= 7 - colModulo ) - addCol = col - 6 + colModulo-1; - } + // if today then draw rectangle around day + if (today == i) { + tmppen = p.pen(); + QPen mTodayPen(p.pen()); + if ( daysize.width() < 20 ) + mTodayPen.setWidth(1); + else + mTodayPen.setWidth(mTodayMarginWidth); + //draw red rectangle for holidays + if (!mHolidays[i].isNull()) { + if (actcol == mDefaultTextColor) { + mTodayPen.setColor(KOPrefs::instance()->mHolidayColor); + } else { + mTodayPen.setColor(mHolidayColorShaded); + } + } + //draw gray rectangle for today if in selection + if (i >= mSelStartT && i <= mSelEndT) { + QColor grey("grey"); + mTodayPen.setColor(grey); + } + p.setPen(mTodayPen); + + + int addCol = 0; + int addRow = 0; + if (rowModulo) { + if ( row >= 6 - rowModulo ) + addRow = row - 5 + rowModulo; + } + if ( colModulo ) { + if ( col >= 7 - colModulo ) + addCol = col - 6 + colModulo-1; + } - addCol += 1; - p.drawRect(col*dwidth+addCol, row*dheight+addRow, dwidth, dheight+1); - p.setPen(tmppen); - } + addCol += 1; + p.drawRect(col*dwidth+addCol, row*dheight+addRow, dwidth, dheight+1); + p.setPen(tmppen); + } - // if any events are on that day then draw it using a bold font - if ( eDays.testBit(i) ) { - QFont myFont = font(); - myFont.setBold(true); - p.setFont(myFont); - } + // if any events are on that day then draw it using a bold font + if ( eDays.testBit(i) ) { + QFont myFont = font(); + myFont.setBold(true); + p.setFont(myFont); + } - // if it is a holiday then use the default holiday color - if ( !mHolidays[i].isNull()) { - if ( bDays.testBit(i) ) { - if ( hDays.testBit(i) ) - p.setPen(QColor(Qt::green)); - else - p.setPen(QColor(Qt::green).dark()); - } else { - if (actcol == mDefaultTextColor ) { - p.setPen(KOPrefs::instance()->mHolidayColor); - } else { - p.setPen(mHolidayColorShaded); - } - } - } + // if it is a holiday then use the default holiday color + if ( !mHolidays[i].isNull()) { + if ( bDays.testBit(i) ) { + if ( hDays.testBit(i) ) + p.setPen(QColor(Qt::green)); + else + p.setPen(QColor(Qt::green).dark()); + } else { + if (actcol == mDefaultTextColor ) { + p.setPen(KOPrefs::instance()->mHolidayColor); + } else { + p.setPen(mHolidayColorShaded); + } + } + } - // draw selected days with special color - // DO NOT specially highlight holidays in selection ! - if (i >= mSelStartT && i <= mSelEndT) { - ;//p.setPen(mSelectedDaysColor); - } + // draw selected days with special color + // DO NOT specially highlight holidays in selection ! + if (i >= mSelStartT && i <= mSelEndT) { + ;//p.setPen(mSelectedDaysColor); + } - int addCol = 0; - int addRow = 0; - if ( colModulo ) { - if ( col >= 7 - colModulo ) - addCol = col - 7 + colModulo; - } - if ( rowModulo ) { - if ( row >= 6 - rowModulo ) - addRow = row - 5 + rowModulo; - } - //qDebug("add %d %d -- %d %d ", col, addCol, row, addRow); - ++addCol;//++addCol; - if ( row == 0) - addRow = 1; - p.drawText(col*dwidth+addCol, row*dheight+addRow, dwidth, dheight, - Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]); - - // reset color to actual color - if (!mHolidays[i].isNull()) { - p.setPen(actcol); - } - // reset bold font to plain font - if ( eDays.testBit(i)) { - QFont myFont = font(); - myFont.setBold(false); - p.setFont(myFont); - } - } - int off = 0;//xyOff; - bitBlt (this, off, off, &myPix, 0 ,0,width(), height() ,CopyROP); - //qDebug("ffffffffff %d ", off); + int addCol = 0; + int addRow = 0; + if ( colModulo ) { + if ( col >= 7 - colModulo ) + addCol = col - 7 + colModulo; + } + if ( rowModulo ) { + if ( row >= 6 - rowModulo ) + addRow = row - 5 + rowModulo; + } + //qDebug("add %d %d -- %d %d ", col, addCol, row, addRow); + ++addCol;//++addCol; + if ( row == 0) + addRow = 1; + p.drawText(col*dwidth+addCol, row*dheight+addRow, dwidth, dheight, + Qt::AlignHCenter | Qt::AlignVCenter, daylbls[i]); + + // reset color to actual color + if (!mHolidays[i].isNull()) { + p.setPen(actcol); + } + // reset bold font to plain font + if ( eDays.testBit(i)) { + QFont myFont = font(); + myFont.setBold(false); + p.setFont(myFont); + } + } + } else { + //qDebug("NO redraw "); + } + bitBlt (this, 0, 0, &myPix, 0 ,0,width(), height() ,CopyROP); + mRedrawNeeded = false; } // ---------------------------------------------------------------------------- // R E SI Z E E V E N T H A N D L I N G // ---------------------------------------------------------------------------- void KODayMatrix::resizeEvent(QResizeEvent *) { |