-rw-r--r-- | korganizer/calendarview.cpp | 70 | ||||
-rw-r--r-- | korganizer/calendarview.h | 2 | ||||
-rw-r--r-- | korganizer/kolistview.cpp | 13 | ||||
-rw-r--r-- | korganizer/komonthview.cpp | 116 | ||||
-rw-r--r-- | korganizer/komonthview.h | 2 | ||||
-rw-r--r-- | korganizer/koprefs.cpp | 1 | ||||
-rw-r--r-- | korganizer/koprefs.h | 1 | ||||
-rw-r--r-- | korganizer/koprefsdialog.cpp | 4 |
8 files changed, 175 insertions, 34 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index 9a114d0..e766b8f 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -2717,14 +2717,84 @@ void CalendarView::changeEventDisplay(Event *which, int action) mViewManager->currentView()->changeEventDisplay(which,action); // TODO: check, if update needed // if (which->getTodoStatus()) { mTodoList->updateView(); + if ( action != KOGlobals::EVENTDELETED ) { + mConflictingEvent = which ; + QTimer::singleShot( 1000, this, SLOT ( checkConflictForEvent() ) ); + } // } } else { mViewManager->currentView()->updateView(); } } +void CalendarView::checkConflictForEvent() +{ + if (!KOPrefs::instance()->mConfirm) + return; + if ( ! mConflictingEvent ) return; + if ( mConflictingEvent->doesFloat() ) { + mConflictingEvent = 0; + return; + } + bool all = false; + bool allday = false; + Event * ev = mConflictingEvent; + mConflictingEvent = 0; + QDate start = ev->dtStart().date(); + QDate end = ev->dtEnd().date().addDays(1); + while ( start < end ) { + QPtrList<Event> test = calendar()->events( start ); + //qDebug("found %d on %s ", eventList.count(), start.toString().latin1()); + Event * t_ev = test.first(); + QDateTime es = ev->dtStart(); + QDateTime ee = ev->dtEnd(); + if ( ev->doesFloat() ) + ee = ee.addDays( 1 ); + if ( ! all ) { + if ( ev->doesFloat() != allday ) + t_ev = 0; + } + while ( t_ev ) { + bool skip = false; + if ( ! all ) { + if ( t_ev->doesFloat() != allday ) + skip = true; + } + if ( !skip && ev != t_ev ) { + QDateTime ets = t_ev->dtStart(); + QDateTime ete = t_ev->dtEnd(); + if ( t_ev->doesFloat() ) + ete = ete.addDays( 1 ); + //qDebug("test %s -- %s -------- %s -- %s ", es.toString().latin1() , ee.toString().latin1(), ets.toString().latin1() , ete.toString().latin1() ); + if ( es < ete && ets < ee ) { + QString mess = i18n("The event\n%1\nconflicts with event\n%2\nat date\n%3.\n").arg(KGlobal::formatMessage ( ev->summary(),0 ) ).arg( KGlobal::formatMessage ( t_ev->summary(),0 )).arg(KGlobal::locale()->formatDate(start) ) ; + qApp->processEvents(); + int km = KMessageBox::warningContinueCancel(this,mess, + i18n("KO/Pi Conflict delected"),i18n("Show date"),i18n("No problem!")); + if ( km != KMessageBox::Continue ) + return; + + if ( mViewManager->currentView() != mViewManager->agendaView() || mNavigator->selectedDates().count() > 1 ) + mViewManager->showDayView(); + mNavigator->slotDaySelect( start ); + int hour = es.time().hour(); + if ( ets > es ) + hour = ets.time().hour(); + mViewManager->agendaView()->setStartHour( hour ); + topLevelWidget()->setCaption( i18n("Conflict %1 <-> %2"). arg( ev->summary().left( 20 ) ).arg( t_ev->summary().left( 20 ) ) ); + return; + } + } + t_ev = test.next(); + } + start = start.addDays( 1 ); + } + qDebug("No conflict found "); + + +} void CalendarView::updateTodoViews() { mTodoList->updateView(); diff --git a/korganizer/calendarview.h b/korganizer/calendarview.h index 51eb1d4..706d05d 100644 --- a/korganizer/calendarview.h +++ b/korganizer/calendarview.h @@ -507,8 +507,9 @@ class CalendarView : public KOrg::CalendarViewBase, public KCal::Calendar::Obser void beamDone( Ir *ir ); /** Select a view or adapt the current view to display the specified dates. */ void showDates( const KCal::DateList & ); void selectWeekNum ( int ); + void checkConflictForEvent(); public: // show a standard warning // returns KMsgBox::yesNoCancel() @@ -533,8 +534,9 @@ class CalendarView : public KOrg::CalendarViewBase, public KCal::Calendar::Obser void setBlockShowDates( bool b ) { mBlockShowDates = b ;} void setScrollBarStep(int val ); protected: + Event *mConflictingEvent; void schedule(Scheduler::Method, Incidence *incidence = 0); // returns KMsgBox::OKCandel() int msgItemDelete(const QString name); diff --git a/korganizer/kolistview.cpp b/korganizer/kolistview.cpp index 7783dd4..d25f671 100644 --- a/korganizer/kolistview.cpp +++ b/korganizer/kolistview.cpp @@ -516,11 +516,9 @@ void KOListView::setAlarm() ++count; if (kap.mAlarmButton->isChecked()) { if (inc->alarms().count() == 0) inc->newAlarm(); - QPtrList<Alarm> alarms = inc->alarms(); - Alarm *alarm; - for (alarm = alarms.first(); alarm; alarm = alarms.next() ) { + Alarm *alarm = inc->alarms().first(); alarm->setEnabled(true); int j = kap.mAlarmTimeEdit->value()* -60; if (kap.mAlarmIncrCombo->currentItem() == 1) j = j * 60; @@ -534,15 +532,12 @@ void KOListView::setAlarm() else if (!kap.mAlarmSound.isEmpty() && kap.mAlarmSoundButton->isOn()) alarm->setAudioAlarm(kap.mAlarmSound); else alarm->setType(Alarm::Invalid); - //alarm->setAudioAlarm("default"); - // TODO: Deal with multiple alarms - break; // For now, stop after the first alarm - } } else { - Alarm* alarm = inc->alarms().first(); - if ( alarm ) { + QPtrList<Alarm> alarms = inc->alarms(); + Alarm *alarm; + for (alarm = alarms.first(); alarm; alarm = alarms.next() ) { alarm->setEnabled(false); alarm->setType(Alarm::Invalid); } } diff --git a/korganizer/komonthview.cpp b/korganizer/komonthview.cpp index 2289977..53bbe28 100644 --- a/korganizer/komonthview.cpp +++ b/korganizer/komonthview.cpp @@ -1523,9 +1523,10 @@ void KOMonthView::updateConfig() mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ; if ( ! mShowWeekView ) { if ( temp != KOPrefs::instance()->mMonthViewSatSunTog ) computeLayout(); - } + } else + doComputeLayoutWeek(); updateDayLabels(); //qDebug("KOMonthView::updateConfig() %d %d %d ",height(), mDayLabels[0]->sizeHint().height() ,mNumWeeks); //int cellHeight = (height() - mDayLabels[0]->sizeHint().height()) /mNumWeeks; //resizeEvent( 0 ); @@ -1814,8 +1815,9 @@ void KOMonthView::resizeEvent(QResizeEvent * e) //qDebug("KOMonthView::isVisible "); slotComputeLayout(); } else mComputeLayoutTimer->start( 100 ); + if ( e ) KOEventView::resizeEvent( e ); } void KOMonthView::slotComputeLayout() @@ -1825,39 +1827,29 @@ void KOMonthView::slotComputeLayout() computeLayout(); clPending = true; setKeyBFocus(); } -void KOMonthView::computeLayoutWeek() + +void KOMonthView::doComputeLayoutWeek() { - static int lastWid = 0; - static int lastHei = 0; + int daysToShow; bool combinedSatSun = false; if (mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ) { daysToShow = 6; combinedSatSun = true; } - int tWid = topLevelWidget()->size().width(); - int tHei = topLevelWidget()->size().height(); - int wid = width();//e int hei = height()-1-mNavigatorBar->height(); - - if ( ((wid *3)/2) < tWid && (( hei *3) /2) < tHei ) - return; - - if ( lastWid == width() && lastHei == height() ) { - //qDebug("KOListWeekView::No compute layout needed "); - return; - } - lastWid = width(); - lastHei = height(); - - + if ( !KOPrefs::instance()->mMonthViewWeekRowlayout ) { + daysToShow = 2; + } else { if ( wid < hei ) daysToShow = 2; else daysToShow = 3; + } + bool landscape = (daysToShow == 3); mShowSatSunComp = true; combinedSatSun = true; //qDebug("KOMonthView::computeLayout() WWW ------------------------------------ "); @@ -1885,24 +1877,37 @@ void KOMonthView::computeLayoutWeek() } if ( ((i) % daysToShow) >= daysToShow-colModulo ) { ++w; } + int xC,yC,wC,hC; if ( i >= 5 ) { int wi = width() - x - weeklabelwid; if ( i == 5 ) { - mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,wi/2+wi%2,h); + xC = x+weeklabelwid; + yC = y; + wC = wi/2+wi%2; + hC = h; } else { - mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,wi,h); + xC = x+weeklabelwid; + yC = y; + wC = wi; + hC = h; } x = x - w + wi - (wi/2 ); } else { int wi = w; if ( !(( i+1) % daysToShow)) { wi = width() - x - weeklabelwid; } - mDayLabelsW[i]->setGeometry( x+weeklabelwid,y,wi,h); + xC = x+weeklabelwid; + yC = y; + wC = wi; + hC = h; } + mDayLabelsW[mapWeekLayout(i,landscape)]->setGeometry( xC,yC,wC,hC); + + x += w; } x= 0; y= dayLabelHei; @@ -1922,25 +1927,36 @@ void KOMonthView::computeLayoutWeek() } if ( i == (daysToShow-1-rowModulo)*7) ++h; + int xC,yC,wC,hC; if ( i >= 5 ) { if ( i ==5 ) { max = h/2; - mCellsW[i]->setGeometry ( x+weeklabelwid,y,w,max ); + xC = x+weeklabelwid; + yC = y; + wC = w; + hC = max; x -= w ;y += h/2; } else { if ( ((i-1) % daysToShow) >= daysToShow-colModulo ) { ++w; } max = h-h/2; - mCellsW[i]->setGeometry ( x+weeklabelwid,y,w,max ); + xC = x+weeklabelwid; + yC = y; + wC = w; + hC = max; y -= h/2; } } else { max = h; - mCellsW[i]->setGeometry ( x+weeklabelwid,y,w,h ); + xC = x+weeklabelwid; + yC = y; + wC = w; + hC = h; } + mCellsW[mapWeekLayout(i,landscape)]->setGeometry ( xC,yC,wC,hC ); x += w; if ( x + w/2 > wid ) { @@ -1962,8 +1978,58 @@ void KOMonthView::computeLayoutWeek() //mWeekLabels[mNumWeeks]->setText( i18n("M")); //if ( forceUpdate ) // updateView(); } +void KOMonthView::computeLayoutWeek() +{ + static int lastWid = 0; + static int lastHei = 0; + int tWid = topLevelWidget()->size().width(); + int tHei = topLevelWidget()->size().height(); + int wid = width();//e + int hei = height()-1-mNavigatorBar->height(); + if ( ((wid *3)/2) < tWid && (( hei *3) /2) < tHei ) + return; + + if ( lastWid == width() && lastHei == height() ) { + //qDebug("KOListWeekView::No compute layout needed "); + return; + } + lastWid = width(); + lastHei = height(); + doComputeLayoutWeek(); +} +int KOMonthView::mapWeekLayout( int index, bool landscape ) +{ + if ( KOPrefs::instance()->mMonthViewWeekRowlayout ) + return index; + int diff = 0; + if ( !landscape ) diff = 1; + switch( index ) { + case 0: + case 5: + case 6: + return index; + break; + case 1: + return 2+diff; + break; + case 2: + return 4-(3*diff); + break; + case 3: + return 1+(3*diff); + break; + case 4: + return 3-diff; + break; + default: + qDebug("KO: Error in mapping week layout "); + return index; + break; + } + return index; +} void KOMonthView::computeLayout() { diff --git a/korganizer/komonthview.h b/korganizer/komonthview.h index 4d62e9b..61a141a 100644 --- a/korganizer/komonthview.h +++ b/korganizer/komonthview.h @@ -301,8 +301,9 @@ class KOMonthView: public KOEventView protected: void resizeEvent(QResizeEvent *); void viewChanged(); void updateDayLabels(); + int mapWeekLayout( int, bool ); private: int mKBFcounter; QTimer* mComputeLayoutTimer; @@ -320,8 +321,9 @@ class KOMonthView: public KOEventView //bool mWeekStartsMonday; bool mShowSatSunComp; void computeLayout(); void computeLayoutWeek(); + void doComputeLayoutWeek(); QPtrVector<MonthViewCell> mCells; QPtrVector<QLabel> mDayLabels; QPtrVector<KOWeekButton> mWeekLabels; diff --git a/korganizer/koprefs.cpp b/korganizer/koprefs.cpp index a63297e..9e7f18c 100644 --- a/korganizer/koprefs.cpp +++ b/korganizer/koprefs.cpp @@ -263,8 +263,9 @@ KOPrefs::KOPrefs() : addItemBool("TodoViewUsesCatColors",&mTodoViewUsesCatColors,false); addItemBool("TodoViewShowsPercentage",&mTodoViewShowsPercentage,false); addItemBool("TodoViewUsesSmallFont",&mTodoViewUsesSmallFont,true); addItemBool("MonthViewUsesBigFont",&mMonthViewUsesBigFont,true); + addItemBool("MonthViewWeekRowlayout",&mMonthViewWeekRowlayout,true); addItemBool("TodoViewUsesForegroundColor",&mTodoViewUsesForegroundColor,false); addItemBool("MonthViewUsesForegroundColor",&mMonthViewUsesForegroundColor,false); #ifdef DESKTOP_VERSION addItemBool("UseInternalAlarmNotification",&mUseInternalAlarmNotification,true); diff --git a/korganizer/koprefs.h b/korganizer/koprefs.h index 392360d..2ff03fa 100644 --- a/korganizer/koprefs.h +++ b/korganizer/koprefs.h @@ -182,8 +182,9 @@ class KOPrefs : public KPimPrefs QColor mMonthViewHolidayColor; bool mMonthViewUsesDayColors; bool mMonthViewSatSunTog; bool mMonthViewWeek; + bool mMonthViewWeekRowlayout; QColor mAppColor1; QColor mAppColor2; bool mUseAppColors; diff --git a/korganizer/koprefsdialog.cpp b/korganizer/koprefsdialog.cpp index ebcff33..05bd73f 100644 --- a/korganizer/koprefsdialog.cpp +++ b/korganizer/koprefsdialog.cpp @@ -702,8 +702,12 @@ void KOPrefsDialog::setupViewsTab() addWidBool(i18n("Week view mode uses bigger font"), &(KOPrefs::instance()->mMonthViewUsesBigFont),topFrame); topLayout->addWidget(dummy->checkBox(),ii++,0); dummy = + addWidBool(i18n("Week view mode uses row layout"), + &(KOPrefs::instance()->mMonthViewWeekRowlayout),topFrame); + topLayout->addWidget(dummy->checkBox(),ii++,0); + dummy = addWidBool(i18n("Show Sat/Sun together"), &(KOPrefs::instance()->mMonthViewSatSunTog),topFrame); topLayout->addWidget(dummy->checkBox(),ii++,0); |