-rw-r--r-- | korganizer/komonthview.cpp | 199 | ||||
-rw-r--r-- | korganizer/komonthview.h | 10 |
2 files changed, 162 insertions, 47 deletions
diff --git a/korganizer/komonthview.cpp b/korganizer/komonthview.cpp index 9c1e4c3..daa37fd 100644 --- a/korganizer/komonthview.cpp +++ b/korganizer/komonthview.cpp @@ -23,6 +23,7 @@ #include <qkeycode.h> #include <qhbox.h> #include <qvbox.h> +#include <qwidgetstack.h> #include <qpushbutton.h> #include <qtooltip.h> #include <qpainter.h> @@ -268,8 +269,8 @@ int MonthViewItem::width(const QListBox *lb) const } -MonthViewCell::MonthViewCell( KOMonthView *parent) - : QWidget( parent ), +MonthViewCell::MonthViewCell( KOMonthView *parent,QWidget* par ) + : QWidget( par ), mMonthView( parent ) { @@ -766,6 +767,20 @@ KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) mDaysPerWeek( 7 ), mNumWeeks( 6 ), mNumCells( mDaysPerWeek * mNumWeeks ), mShortDayLabels( false ), mWidthLongDayLabel( 0 ), mSelectedCell( 0 ) { + + clPending = true; + mWidStack = new QWidgetStack( this ); + QHBoxLayout* hb = new QHBoxLayout( this ); + mMonthView = new QWidget( mWidStack ); + mWeekView = new QWidget( mWidStack ); +#if QT_VERSION >= 0x030000 + mWidStack->addWidget(mMonthView ); + mWidStack->addWidget(mWeekView ); +#else + mWidStack->addWidget( mMonthView, 1 ); + mWidStack->addWidget( mWeekView , 1 ); +#endif + hb->addWidget( mWidStack ); mWeekStartsMonday = KGlobal::locale()->weekStartsMonday(); mShowWeekView = KOPrefs::instance()->mMonthViewWeek; if ( mShowWeekView ) @@ -773,10 +788,8 @@ KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) updatePossible = false; mCells.setAutoDelete( true ); mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ; - // mDayLayout = new QGridLayout( this ); - // create the day of the week labels (Sun, Mon, etc) and add them to - // the layout. mDayLabels.resize( mDaysPerWeek ); + mDayLabelsW.resize( mDaysPerWeek ); QFont bfont = font(); if ( QApplication::desktop()->width() < 650 ) { bfont.setPointSize( bfont.pointSize() - 2 ); @@ -785,18 +798,25 @@ KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) int i; for( i = 0; i < mDaysPerWeek; i++ ) { - QLabel *label = new QLabel( this ); + QLabel *label = new QLabel( mMonthView ); label->setFont(bfont); label->setFrameStyle(QFrame::Panel|QFrame::Raised); label->setLineWidth(1); label->setAlignment(AlignCenter); mDayLabels.insert( i, label ); + label = new QLabel( mWeekView ); + label->setFont(bfont); + label->setFrameStyle(QFrame::Panel|QFrame::Raised); + label->setLineWidth(1); + label->setAlignment(AlignCenter); + mDayLabelsW.insert( i, label ); } bfont.setBold( false ); mWeekLabels.resize( mNumWeeks+1 ); + mWeekLabelsW.resize( 2 ); for( i = 0; i < mNumWeeks+1; i++ ) { - KOWeekButton *label = new KOWeekButton( this ); + KOWeekButton *label = new KOWeekButton( mMonthView ); label->setFont(bfont); connect( label, SIGNAL( selectWeekNum ( int )),this, SLOT( selectInternalWeekNum ( int )) ); label->setFlat(true); @@ -806,13 +826,28 @@ KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) //label->setAlignment(AlignCenter); mWeekLabels.insert( i, label ); } - mWeekLabels[mNumWeeks]->setText( i18n("")); + mWeekLabels[mNumWeeks]->setText( i18n("W")); QWhatsThis::add(mWeekLabels[mNumWeeks],i18n("Click on this to\nselect week number")); + + for( i = 0; i < 1+1; i++ ) { + KOWeekButton *label = new KOWeekButton( mWeekView ); + label->setFont(bfont); + connect( label, SIGNAL( selectWeekNum ( int )),this, SLOT( selectInternalWeekNum ( int )) ); + label->setFlat(true); + QWhatsThis::add(label,i18n("Click on the week number to\nshow week zoomed")); + //label->setFrameStyle(QFrame::Panel|QFrame::Raised); + //label->setLineWidth(1); + //label->setAlignment(AlignCenter); + mWeekLabelsW.insert( i, label ); + } + mWeekLabelsW[1]->setText( i18n("W")); + + int row, col; mCells.resize( mNumCells ); for( row = 0; row < mNumWeeks; ++row ) { for( col = 0; col < mDaysPerWeek; ++col ) { - MonthViewCell *cell = new MonthViewCell( this ); + MonthViewCell *cell = new MonthViewCell( this, mMonthView ); mCells.insert( row * mDaysPerWeek + col, cell ); connect( cell, SIGNAL( defaultAction( Incidence * ) ), @@ -823,12 +858,34 @@ KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) SIGNAL( showDaySignal( QDate ) ) ); } } + mCellsW.resize( mDaysPerWeek ); + for( col = 0; col < mDaysPerWeek; ++col ) { + MonthViewCell *cell = new MonthViewCell( this, mWeekView ); + mCellsW.insert( col, cell ); + + connect( cell, SIGNAL( defaultAction( Incidence * ) ), + SLOT( defaultAction( Incidence * ) ) ); + connect( cell, SIGNAL( newEventSignal( QDateTime ) ), + SIGNAL( newEventSignal( QDateTime ) ) ); + connect( cell, SIGNAL( showDaySignal( QDate ) ), + SIGNAL( showDaySignal( QDate ) ) ); + } //connect( mWeekLabels[mNumWeeks], SIGNAL( clicked() ), SLOT( switchView() ) ); mContextMenu = eventPopup(); // updateConfig(); //useless here - mWeekLabels[mNumWeeks]->setText( i18n("W")); + //mWeekLabels[mNumWeeks]->setText( i18n("W")); +#if 0 + mWidStack = new QWidgetStack( this ); + mMonthView = new QWidget( mWidStack ); + mWeekView = new QWidget( mWidStack ); +#endif + if ( mShowWeekView ) + mWidStack->raiseWidget( mWeekView ); + else + mWidStack->raiseWidget( mMonthView ); + emit incidenceSelected( 0 ); } @@ -842,20 +899,28 @@ void KOMonthView::selectDateWeekNum ( int ) } void KOMonthView::selectInternalWeekNum ( int n ) { - emit selectWeekNum ( n ); switchView(); + emit selectWeekNum ( n ); } void KOMonthView::switchView() { + if ( selectedCell( ) ) selectedCell()->deselect(); mShowWeekView = !mShowWeekView; KOPrefs::instance()->mMonthViewWeek = mShowWeekView; //emit showNavigator( !mShowWeekView ); + if ( clPending ) { computeLayout(); updateConfig(); } + if ( mShowWeekView ) + mWidStack->raiseWidget( mWeekView ); + else + mWidStack->raiseWidget( mMonthView ); + clPending = false; +} int KOMonthView::maxDatesHint() { @@ -936,24 +1001,61 @@ void KOMonthView::updateConfig() void KOMonthView::updateDayLabels() { + QPtrVector<QLabel> *mDayLabelsT; +#if 0 + if (mShowWeekView ) + mDayLabelsT = &mDayLabelsW; + else + mDayLabelsT = &mDayLabels; +#endif + + mDayLabelsT = &mDayLabelsW; for (int i = 0; i < 7; i++) { if (mWeekStartsMonday) { bool show = mShortDayLabels; - if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > mDayLabels[i]->width() ) + if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() ) show = true; - mDayLabels[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); + (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); } else { - if (i==0) mDayLabels[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabels)); - else mDayLabels[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabels)); + if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabels)); + else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabels)); } } + mDayLabelsT = &mDayLabels; + for (int i = 0; i < 7; i++) { + if (mWeekStartsMonday) { + bool show = mShortDayLabels; + if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > (*mDayLabelsT)[i]->width() ) + show = true; + (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); + } else { + if (i==0) (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabels)); + else (*mDayLabelsT)[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabels)); + + } + } + } void KOMonthView::showDates(const QDate &start, const QDate &) { // kdDebug() << "KOMonthView::showDates(): " << start.toString() << endl; + QPtrVector<MonthViewCell> *cells; + QPtrVector<QLabel> *dayLabels; + QPtrVector<KOWeekButton> *weekLabels; + int weekNum = 6; + if ( mShowWeekView ) { + weekNum = 1; + cells = &mCellsW; + dayLabels = &mDayLabelsW; + weekLabels = &mWeekLabelsW; + } else { + cells = &mCells; + dayLabels = &mDayLabels; + weekLabels = &mWeekLabels; + } mStartDate = start; @@ -965,19 +1067,19 @@ void KOMonthView::showDates(const QDate &start, const QDate &) bool primary = false; uint i; - for( i = 0; i < mCells.size(); ++i ) { + for( i = 0; i < (*cells).size(); ++i ) { QDate date = mStartDate.addDays( i ); - mCells[i]->setDate( date ); + (*cells)[i]->setDate( date ); #ifndef KORG_NOPLUGINS // add holiday, if present QString hstring(KOCore::self()->holiday(date)); - mCells[i]->setHoliday( hstring ); + (*cells)[i]->setHoliday( hstring ); #endif } QDate date = mStartDate.addDays( mWeekStartsMonday ? 3 : 4 ); - for( i = 0; i < 6; ++i ) { + for( i = 0; i < weekNum; ++i ) { int wno; // remember, according to ISO 8601, the first week of the year is the // first week that contains a thursday. Thus we must subtract off 4, @@ -987,7 +1089,7 @@ void KOMonthView::showDates(const QDate &start, const QDate &) wno = dayOfYear / 7 + 1; else wno =dayOfYear / 7; - mWeekLabels[i]->setWeekNum( wno ); + (*weekLabels)[i]->setWeekNum( wno ); date = date.addDays( 7 ); } updateView(); @@ -1012,13 +1114,19 @@ void KOMonthView::updateView() return; //QTime ti; //ti.start(); + QPtrVector<MonthViewCell> *cells; + if ( mShowWeekView ) { + cells = &mCellsW; + } else { + cells = &mCells; + } #if 1 int i; - int timeSpan = mCells.size()-1; + int timeSpan = (*cells).size()-1; if ( KOPrefs::instance()->mMonthViewWeek ) timeSpan = 6; for( i = 0; i < timeSpan + 1; ++i ) { - mCells[i]->startUpdateCell(); + (*cells)[i]->startUpdateCell(); } QPtrList<Event> events = calendar()->events(); @@ -1047,7 +1155,7 @@ void KOMonthView::updateView() int iii; //qDebug("found %s %d %d ",event->summary().latin1(), st, end ); for ( iii = st;iii<= end;++iii) - mCells[iii]->insertEvent( event ); + (*cells)[iii]->insertEvent( event ); } } } else { @@ -1077,7 +1185,7 @@ void KOMonthView::updateView() if ( end > timeSpan ) end = timeSpan; int iii; for ( iii = st;iii<= end;++iii) - mCells[iii]->insertEvent( event ); + (*cells)[iii]->insertEvent( event ); } } } @@ -1090,30 +1198,30 @@ void KOMonthView::updateView() if ( todo->hasDueDate() ) { int day = mStartDate.daysTo( todo->dtDue().date() ); if ( day >= 0 && day < timeSpan + 1) { - mCells[day]->insertTodo( todo ); + (*cells)[day]->insertTodo( todo ); } } } for( i = 0; i < timeSpan+1; ++i ) { - mCells[i]->finishUpdateCell(); + (*cells)[i]->finishUpdateCell(); } processSelectionChange(); - mCells[0]->setFocus(); + (*cells)[0]->setFocus(); #else // old code //qDebug("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ "); int i; - for( i = 0; i < mCells.count(); ++i ) { - mCells[i]->updateCell(); + for( i = 0; i < (*cells).count(); ++i ) { + (*cells)[i]->updateCell(); } //qDebug("KOMonthView::updateView() "); processSelectionChange(); // qDebug("---------------------------------------------------------------------+ "); - mCells[0]->setFocus(); + (*cells)[0]->setFocus(); #endif //qDebug("update time %d ", ti.elapsed()); @@ -1122,6 +1230,10 @@ void KOMonthView::updateView() void KOMonthView::resizeEvent(QResizeEvent * e) { computeLayout(); + clPending = true; + if ( mShowWeekView ) + mCellsW[0]->setFocus(); + else mCells[0]->setFocus(); } void KOMonthView::computeLayoutWeek() @@ -1156,7 +1268,7 @@ void KOMonthView::computeLayoutWeek() int colWid = wid / daysToShow; int lastCol = wid - ( colWid*6 ); - int dayLabelHei = mDayLabels[0]->sizeHint().height(); + int dayLabelHei = mDayLabelsW[0]->sizeHint().height(); int cellHei = (hei - (5- daysToShow )*dayLabelHei) /(5- daysToShow ); int colModulo = wid % daysToShow; int rowModulo = (hei- (5- daysToShow )*dayLabelHei) % daysToShow-1; @@ -1177,20 +1289,20 @@ void KOMonthView::computeLayoutWeek() ++w; } if ( i >= 5 ) { - mDayLabels[i]->setGeometry( x+weeklabelwid,y,w/2+w%2,h); + mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,w/2+w%2,h); x -= (w/2 ); } else - mDayLabels[i]->setGeometry( x+weeklabelwid,y,w,h); + mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,w,h); x += w; } x= 0; y= dayLabelHei; w = colWid; h = cellHei; - for ( i = 0; i < mCells.count(); ++i) { + for ( i = 0; i < mCellsW.count(); ++i) { if ( i > 6 ) { - mCells[i]->hide(); + mCellsW[i]->hide(); continue; } @@ -1203,17 +1315,17 @@ void KOMonthView::computeLayoutWeek() if ( i >= 5 ) { if ( i ==5 ) { - mCells[i]->setGeometry ( x+weeklabelwid,y,w,h/2 ); + mCellsW[i]->setGeometry ( x+weeklabelwid,y,w,h/2 ); x -= w ;y += h/2; } else { if ( ((i-1) % daysToShow) >= daysToShow-colModulo ) { ++w; } - mCells[i]->setGeometry ( x+weeklabelwid,y,w,h-h/2 ); + mCellsW[i]->setGeometry ( x+weeklabelwid,y,w,h-h/2 ); y -= h/2; } } else - mCells[i]->setGeometry ( x+weeklabelwid,y,w,h ); + mCellsW[i]->setGeometry ( x+weeklabelwid,y,w,h ); x += w; @@ -1224,14 +1336,11 @@ void KOMonthView::computeLayoutWeek() } y= dayLabelHei; h = cellHei ; - mWeekLabels[0]->setGeometry( 0,y,weeklabelwid,hei-dayLabelHei); - for ( i = 1; i < 6; i++) { - mWeekLabels[i]->hide(); - } - mWeekLabels[6]->setGeometry( 0,0,weeklabelwid,dayLabelHei); + mWeekLabelsW[0]->setGeometry( 0,y,weeklabelwid,hei-dayLabelHei); + mWeekLabelsW[1]->setGeometry( 0,0,weeklabelwid,dayLabelHei); // qDebug("RRRRRRRRRRRRR %d %d old %d %d", e->size().width(),e->size().height() , e->oldSize().width(),e->oldSize().height()); //qDebug("parent %d %d ", topLevelWidget()->size().width(), topLevelWidget()->size().height()); - mShortDayLabels = mDayLabels[0]->width() < mWidthLongDayLabel ; + mShortDayLabels = mDayLabelsW[0]->width() < mWidthLongDayLabel ; updateDayLabels(); bool forceUpdate = !updatePossible; updatePossible = true; @@ -1300,7 +1409,6 @@ void KOMonthView::computeLayout() w = colWid; h = cellHei ; for ( i = 0; i < mCells.count(); ++i) { - mCells[i]->show(); w = colWid; if ( ((i) % 7) >= 7-colModulo ) { ++w; @@ -1331,7 +1439,6 @@ void KOMonthView::computeLayout() y= dayLabelHei; h = cellHei ; for ( i = 0; i < 6; i++) { - mWeekLabels[i]->show(); if ( i == (6-rowModulo)) ++h; mWeekLabels[i]->setGeometry( 0,y,weeklabelwid,h); diff --git a/korganizer/komonthview.h b/korganizer/komonthview.h index 1ed200b..b89b2bc 100644 --- a/korganizer/komonthview.h +++ b/korganizer/komonthview.h @@ -25,6 +25,7 @@ #include <qdatetime.h> #include <qlistbox.h> #include <qpoint.h> +#include <qwidgetstack.h> #include <qlayout.h> #include <qintdict.h> #include <qpushbutton.h> @@ -125,7 +126,7 @@ class MonthViewCell : public QWidget { Q_OBJECT public: - MonthViewCell( KOMonthView * ); + MonthViewCell(KOMonthView *,QWidget* ); void setDate( const QDate & ); QDate date() const; @@ -256,6 +257,10 @@ class KOMonthView: public KOEventView void updateDayLabels(); private: + bool clPending; + QWidgetStack * mWidStack; + QWidget* mMonthView; + QWidget* mWeekView; bool mShowWeekView; bool updatePossible; int mDaysPerWeek; @@ -269,6 +274,9 @@ class KOMonthView: public KOEventView QPtrVector<MonthViewCell> mCells; QPtrVector<QLabel> mDayLabels; QPtrVector<KOWeekButton> mWeekLabels; + QPtrVector<MonthViewCell> mCellsW; + QPtrVector<QLabel> mDayLabelsW; + QPtrVector<KOWeekButton> mWeekLabelsW; bool mShortDayLabels; int mWidthLongDayLabel; |