From 3d43b9e40e562957e1a3fcbe9268634db45951ce Mon Sep 17 00:00:00 2001 From: alwin Date: Wed, 16 Mar 2005 13:14:26 +0000 Subject: ho. in dayview a holiday will displayed (if plugin found) generated a straight forward dummy-holiday-plugin for testing the stuff. --- (limited to 'core/pim/datebook/datebookday.cpp') diff --git a/core/pim/datebook/datebookday.cpp b/core/pim/datebook/datebookday.cpp index ca63dc5..dfe39e5 100644 --- a/core/pim/datebook/datebookday.cpp +++ b/core/pim/datebook/datebookday.cpp @@ -22,6 +22,7 @@ #include "datebookdayheaderimpl.h" #include "datebookdayallday.h" +#include #include #include #include @@ -35,109 +36,109 @@ DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent, const char *name ) : QTable( 24, 1, parent, name ), ampm( whichClock ), currDate( QDate::currentDate() ) { - enableClipper(TRUE); - setTopMargin( 0 ); - horizontalHeader()->hide(); - setLeftMargin(38); - setColumnStretchable( 0, TRUE ); - setHScrollBarMode( QScrollView::AlwaysOff ); - verticalHeader()->setPalette(white); - verticalHeader()->setResizeEnabled(FALSE); - setSelectionMode( Single ); - - // get rid of being able to edit things... - QTableItem *tmp; - int row; - for ( row = 0; row < numRows(); row++ ) { - tmp = new QTableItem( this, QTableItem::Never, QString::null); - setItem( row, 0, tmp ); - //setRowHeight( row, 40); - } - - initHeader(); - QObject::connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(slotChangeClock(bool)) ); + enableClipper(TRUE); + setTopMargin( 0 ); + horizontalHeader()->hide(); + setLeftMargin(38); + setColumnStretchable( 0, TRUE ); + setHScrollBarMode( QScrollView::AlwaysOff ); + verticalHeader()->setPalette(white); + verticalHeader()->setResizeEnabled(FALSE); + setSelectionMode( Single ); + + // get rid of being able to edit things... + QTableItem *tmp; + int row; + for ( row = 0; row < numRows(); row++ ) { + tmp = new QTableItem( this, QTableItem::Never, QString::null); + setItem( row, 0, tmp ); + //setRowHeight( row, 40); + } + + initHeader(); + QObject::connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(slotChangeClock(bool)) ); } void DateBookDayView::initHeader() { - QString strTmp; - int preferredWidth = 0; - for ( int i = 0; i < 24; ++i ) { - if ( ampm ) { - if ( i == 0 ) - strTmp = QString::number(12) + ":00"; - else if ( i == 12 ) - strTmp = QString::number(12) + tr(":00p"); - else if ( i > 12 ) - strTmp = QString::number( i - 12 ) + tr(":00p"); - else - strTmp = QString::number(i) + ":00"; - } else { - if ( i < 10 ) - strTmp = "0" + QString::number(i) + ":00"; - else - strTmp = QString::number(i) + ":00"; - } - strTmp = strTmp.rightJustify( 6, ' ' ); - verticalHeader()->setLabel( i, strTmp ); - - // Compute correct width for current Font (Add some space right) - int actWidth = QFontMetrics( QFont::defaultFont() ).width( strTmp + QString(" ") ); - if ( preferredWidth < actWidth ) - preferredWidth = actWidth; - setRowStretchable( i, FALSE ); - } - - // It seems as if the header has a bug. It does not resize - // correct horizontally if it is used vertical.. - // Thus, we do it manually.. - setLeftMargin( preferredWidth ); + QString strTmp; + int preferredWidth = 0; + for ( int i = 0; i < 24; ++i ) { + if ( ampm ) { + if ( i == 0 ) + strTmp = QString::number(12) + ":00"; + else if ( i == 12 ) + strTmp = QString::number(12) + tr(":00p"); + else if ( i > 12 ) + strTmp = QString::number( i - 12 ) + tr(":00p"); + else + strTmp = QString::number(i) + ":00"; + } else { + if ( i < 10 ) + strTmp = "0" + QString::number(i) + ":00"; + else + strTmp = QString::number(i) + ":00"; + } + strTmp = strTmp.rightJustify( 6, ' ' ); + verticalHeader()->setLabel( i, strTmp ); + + // Compute correct width for current Font (Add some space right) + int actWidth = QFontMetrics( QFont::defaultFont() ).width( strTmp + QString(" ") ); + if ( preferredWidth < actWidth ) + preferredWidth = actWidth; + setRowStretchable( i, FALSE ); + } + + // It seems as if the header has a bug. It does not resize + // correct horizontally if it is used vertical.. + // Thus, we do it manually.. + setLeftMargin( preferredWidth ); } void DateBookDayView::slotDateChanged( int y, int m, int d ) { - currDate.setYMD(y,m,d); + currDate.setYMD(y,m,d); } void DateBookDayView::slotChangeClock( bool newClock ) { - ampm = newClock; - initHeader(); + ampm = newClock; + initHeader(); } bool DateBookDayView::whichClock() const { - return ampm; + return ampm; } void DateBookDayView::moveUp() { - scrollBy(0, -20); + scrollBy(0, -20); } void DateBookDayView::moveDown() { - scrollBy(0, 20); + scrollBy(0, 20); } void DateBookDayView::paintCell( QPainter *p, int, int, const QRect &cr, bool ) { - int w = cr.width(); - int h = cr.height(); - p->fillRect( 0, 0, w, h, colorGroup().brush( QColorGroup::Base ) ); - if ( showGrid() ) { - // Draw our lines - int x2 = w - 1; - int y2 = h - 1; - QPen pen( p->pen() ); - p->setPen( colorGroup().dark() ); - p->drawLine( x2, 0, x2, y2 ); - p->drawLine( 0, y2, x2, y2 ); - - p->setPen( colorGroup().midlight() ); - p->drawLine( 0, y2 - h/2, x2, y2 - h/2); - - p->setPen( pen ); + int w = cr.width(); + int h = cr.height(); + p->fillRect( 0, 0, w, h, colorGroup().brush( QColorGroup::Base ) ); + if ( showGrid() ) { + // Draw our lines + int x2 = w - 1; + int y2 = h - 1; + QPen pen( p->pen() ); + p->setPen( colorGroup().dark() ); + p->drawLine( x2, 0, x2, y2 ); + p->drawLine( 0, y2, x2, y2 ); + + p->setPen( colorGroup().midlight() ); + p->drawLine( 0, y2 - h/2, x2, y2 - h/2); + + p->setPen( pen ); } } @@ -147,73 +148,73 @@ void DateBookDayView::paintFocus( QPainter *, const QRect & ) void DateBookDayView::resizeEvent( QResizeEvent *e ) { - QTable::resizeEvent( e ); - columnWidthChanged( 0 ); - emit sigColWidthChanged(); + QTable::resizeEvent( e ); + columnWidthChanged( 0 ); + emit sigColWidthChanged(); } void DateBookDayView::keyPressEvent( QKeyEvent *e ) { - QString txt = e->text(); - if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) { - // we this is some sort of thing we know about... - e->accept(); - emit sigCapturedKey( txt ); + QString txt = e->text(); + if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) { + // we this is some sort of thing we know about... + e->accept(); + emit sigCapturedKey( txt ); } else { - // I don't know what this key is, do you? - e->ignore(); - } + // I don't know what this key is, do you? + e->ignore(); + } } void DateBookDayView::setRowStyle( int style ) { - if (style<0) style = 0; + if (style<0) style = 0; - for (int i=0; inumSelections();i++) { - QTableSelection sel = this->selection( i ); - sh = QMIN(sh,sel.topRow()); - eh = QMAX(sh,sel.bottomRow()+1); - } - if (sh > 23 || eh < 1) { - sh=8; - eh=9; - } + for(int i=0;inumSelections();i++) { + QTableSelection sel = this->selection( i ); + sh = QMIN(sh,sel.topRow()); + eh = QMAX(sh,sel.bottomRow()+1); + } + if (sh > 23 || eh < 1) { + sh=8; + eh=9; + } - quickLineEdit=new DateBookDayViewQuickLineEdit(QDateTime(currDate,QTime(sh,0,0,0)),QDateTime(currDate,QTime(eh,0,0,0)),this->viewport(),"quickedit"); - quickLineEdit->setGeometry(0,0,this->columnWidth(0)-1,this->rowHeight(0)); - this->moveChild(quickLineEdit,0,sh*this->rowHeight(0)); - quickLineEdit->setFocus(); - quickLineEdit->show(); + quickLineEdit=new DateBookDayViewQuickLineEdit(QDateTime(currDate,QTime(sh,0,0,0)),QDateTime(currDate,QTime(eh,0,0,0)),this->viewport(),"quickedit"); + quickLineEdit->setGeometry(0,0,this->columnWidth(0)-1,this->rowHeight(0)); + this->moveChild(quickLineEdit,0,sh*this->rowHeight(0)); + quickLineEdit->setFocus(); + quickLineEdit->show(); } //=========================================================================== DateBookDayViewQuickLineEdit::DateBookDayViewQuickLineEdit(const QDateTime &start, const QDateTime &end,QWidget * parent, const char *name) : QLineEdit(parent,name) { - active=1; - quickEvent.setStart(start); - quickEvent.setEnd(end); - connect(this,SIGNAL(returnPressed()),this,SLOT(slotReturnPressed())); + active=1; + quickEvent.setStart(start); + quickEvent.setEnd(end); + connect(this,SIGNAL(returnPressed()),this,SLOT(slotReturnPressed())); } void DateBookDayViewQuickLineEdit::slotReturnPressed() { - if(active && (!this->text().isEmpty())) { // Fix to avoid having this event beeing added multiple times. - quickEvent.setDescription(this->text()); - connect(this,SIGNAL(insertEvent(const Event&)),this->topLevelWidget(),SLOT(insertEvent(const Event&))); - emit(insertEvent(quickEvent)); - active=0; - } + if(active && (!this->text().isEmpty())) { // Fix to avoid having this event beeing added multiple times. + quickEvent.setDescription(this->text()); + connect(this,SIGNAL(insertEvent(const Event&)),this->topLevelWidget(),SLOT(insertEvent(const Event&))); + emit(insertEvent(quickEvent)); + active=0; + } /* we need to return to this object.. */ - QTimer::singleShot(500, this, SLOT(finallyCallClose()) ); // Close and also delete this widget + QTimer::singleShot(500, this, SLOT(finallyCallClose()) ); // Close and also delete this widget } void DateBookDayViewQuickLineEdit::finallyCallClose() { close(true); // also deletes this widget... @@ -221,154 +222,163 @@ void DateBookDayViewQuickLineEdit::finallyCallClose() { void DateBookDayViewQuickLineEdit::focusOutEvent ( QFocusEvent* /* e */) { - slotReturnPressed(); // Reuse code to add event and close this widget. + slotReturnPressed(); // Reuse code to add event and close this widget. } //=========================================================================== -DateBookDay::DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, QWidget *parent, const char *name ) +DateBookDay::DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, DateBookHoliday*newHdb, QWidget *parent, const char *name ) : QVBox( parent, name ), currDate( QDate::currentDate() ), db( newDb ), startTime( 0 ) { - widgetList.setAutoDelete( true ); - header = new DateBookDayHeader( startOnMonday, this, "day header" ); - header->setDate( currDate.year(), currDate.month(), currDate.day() ); + widgetList.setAutoDelete( true ); + _holiday_db = newHdb; + header = new DateBookDayHeader( startOnMonday, this, "day header" ); + header->setDate( currDate.year(), currDate.month(), currDate.day() ); - m_allDays = new DatebookdayAllday(newDb, this, "all day event list" ); - m_allDays->hide(); + m_allDays = new DatebookdayAllday(newDb, this, "all day event list" ); + m_allDays->hide(); - view = new DateBookDayView( ampm, this, "day view" ); + view = new DateBookDayView( ampm, this, "day view" ); - connect( header, SIGNAL( dateChanged(int,int,int) ), this, SLOT( dateChanged(int,int,int) ) ); - connect( header, SIGNAL( dateChanged(int,int,int) ), view, SLOT( slotDateChanged(int,int,int) ) ); - connect( view, SIGNAL( sigColWidthChanged() ), this, SLOT( slotColWidthChanged() ) ); - connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(slotWeekChanged(bool)) ); - connect( view, SIGNAL(sigCapturedKey(const QString&)), this, SIGNAL(sigNewEvent(const QString&)) ); + connect( header, SIGNAL( dateChanged(int,int,int) ), this, SLOT( dateChanged(int,int,int) ) ); + connect( header, SIGNAL( dateChanged(int,int,int) ), view, SLOT( slotDateChanged(int,int,int) ) ); + connect( view, SIGNAL( sigColWidthChanged() ), this, SLOT( slotColWidthChanged() ) ); + connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(slotWeekChanged(bool)) ); + connect( view, SIGNAL(sigCapturedKey(const QString&)), this, SIGNAL(sigNewEvent(const QString&)) ); - QTimer *timer = new QTimer( this ); + QTimer *timer = new QTimer( this ); - connect( timer, SIGNAL(timeout()), this, SLOT(updateView()) ); //connect timer for updating timeMarker & daywidgetcolors - timer->start( 1000*60*5, FALSE ); //update every 5min + connect( timer, SIGNAL(timeout()), this, SLOT(updateView()) ); //connect timer for updating timeMarker & daywidgetcolors + timer->start( 1000*60*5, FALSE ); //update every 5min - selectedWidget = 0; + selectedWidget = 0; - timeMarker = new DateBookDayTimeMarker( this ); - timeMarker->setTime( QTime::currentTime() ); - rowStyle = -1; // initialize with bogus values + timeMarker = new DateBookDayTimeMarker( this ); + timeMarker->setTime( QTime::currentTime() ); + rowStyle = -1; // initialize with bogus values jumpToCurTime = false; } void DateBookDay::setJumpToCurTime( bool bJump ) { - jumpToCurTime = bJump; + jumpToCurTime = bJump; } void DateBookDay::setRowStyle( int style ) { - if (rowStyle != style) view->setRowStyle( style ); - rowStyle = style; + if (rowStyle != style) view->setRowStyle( style ); + rowStyle = style; } void DateBookDay::updateView( void ) { - timeMarker->setTime( QTime::currentTime() ); - //need to find a way to update all DateBookDayWidgets + timeMarker->setTime( QTime::currentTime() ); + //need to find a way to update all DateBookDayWidgets } void DateBookDay::setSelectedWidget( DateBookDayWidget *w ) { - selectedWidget = w; + selectedWidget = w; } DateBookDayWidget * DateBookDay::getSelectedWidget( void ) { - return selectedWidget; + return selectedWidget; } void DateBookDay::selectedDates( QDateTime &start, QDateTime &end ) { - start.setDate( currDate ); - end.setDate( currDate ); + start.setDate( currDate ); + end.setDate( currDate ); - int sh=99,eh=-1; + int sh=99,eh=-1; - int n = dayView()->numSelections(); + int n = dayView()->numSelections(); - for (int i=0; iselection( i ); - sh = QMIN(sh,sel.topRow()); - eh = QMAX(sh,sel.bottomRow()+1); - } + for (int i=0; iselection( i ); + sh = QMIN(sh,sel.topRow()); + eh = QMAX(sh,sel.bottomRow()+1); + } - if (sh > 23 || eh < 1) { - sh=8; - eh=9; - } + if (sh > 23 || eh < 1) { + sh=8; + eh=9; + } - start.setTime( QTime( sh, 0, 0 ) ); - end.setTime( QTime( eh, 0, 0 ) ); + start.setTime( QTime( sh, 0, 0 ) ); + end.setTime( QTime( eh, 0, 0 ) ); } void DateBookDay::setDate( int y, int m, int d ) { - header->setDate( y, m, d ); - selectedWidget = 0; + header->setDate( y, m, d ); + selectedWidget = 0; } void DateBookDay::setDate( QDate d) { - header->setDate( d.year(), d.month(), d.day() ); - selectedWidget = 0; + header->setDate( d.year(), d.month(), d.day() ); + selectedWidget = 0; } void DateBookDay::dateChanged( int y, int m, int d ) { - QDate date( y, m, d ); - if ( currDate == date ) - return; - currDate.setYMD( y, m, d ); - relayoutPage(); - dayView()->clearSelection(); - QTableSelection ts; - - if (jumpToCurTime && this->date() == QDate::currentDate()) - { - ts.init( QTime::currentTime().hour(), 0); - ts.expandTo( QTime::currentTime().hour(), 0); - } else { - ts.init( startTime, 0 ); - ts.expandTo( startTime, 0 ); - } + QDate date( y, m, d ); + if ( currDate == date ) + return; + currDate.setYMD( y, m, d ); + relayoutPage(); + dayView()->clearSelection(); + QTableSelection ts; + + if (jumpToCurTime && this->date() == QDate::currentDate()) + { + ts.init( QTime::currentTime().hour(), 0); + ts.expandTo( QTime::currentTime().hour(), 0); + } else { + ts.init( startTime, 0 ); + ts.expandTo( startTime, 0 ); + } - dayView()->addSelection( ts ); - selectedWidget = 0; + dayView()->addSelection( ts ); + selectedWidget = 0; } void DateBookDay::redraw() { - if ( isUpdatesEnabled() ) - relayoutPage(); + if ( isUpdatesEnabled() ) + relayoutPage(); } void DateBookDay::getEvents() { - widgetList.clear(); + widgetList.clear(); /* clear the AllDay List */ m_allDays->hide(); // just in case m_allDays->removeAllEvents(); - QValueList eventList = db->getEffectiveEvents( currDate, currDate ); - QValueListIterator it; - QObject* object = 0; - for ( it = eventList.begin(); it != eventList.end(); ++it ) { - EffectiveEvent ev=*it; - if(!((ev.end().hour()==0) && (ev.end().minute()==0) && (ev.startDate()!=ev.date()))) { // Skip events ending at 00:00 starting at another day. + QStringList hdays = _holiday_db->holidaylist(currDate); + QStringList::Iterator sit; + QObject* object = 0; + for (sit=hdays.begin();sit!=hdays.end();++sit) { + object = m_allDays->addHoliday(*sit); + if (!object) continue; + /* not to do something with it */ + } + QValueList eventList = db->getEffectiveEvents( currDate, currDate ); + QValueListIterator it; + + for ( it = eventList.begin(); it != eventList.end(); ++it ) { + EffectiveEvent ev=*it; + if(!((ev.end().hour()==0) && (ev.end().minute()==0) && (ev.startDate()!=ev.date()))) { // Skip events ending at 00:00 starting at another day. if (ev.event().type() == Event::AllDay ) { object = m_allDays->addEvent( ev ); if (!object) continue; }else { - DateBookDayWidget* w = new DateBookDayWidget( *it, this ); + DateBookDayWidget* w = new DateBookDayWidget( *it, this ); widgetList.append( w ); object = w; } @@ -378,50 +388,50 @@ void DateBookDay::getEvents() connect( object, SIGNAL( editMe(const Event&) ), this, SIGNAL( editEvent(const Event&) ) ); connect( object, SIGNAL( beamMe(const Event&) ), this, SIGNAL( beamEvent(const Event&) ) ); - } - } + } + } } static int place( const DateBookDayWidget *item, bool *used, int maxn ) { - int place = 0; - int start = item->event().start().hour(); - QTime e = item->event().end(); - int end = e.hour(); - if ( e.minute() < 5 ) - end--; - if ( end < start ) - end = start; - while ( place < maxn ) { - bool free = TRUE; - int s = start; - while( s <= end ) { - if ( used[10*s+place] ) { - free = FALSE; - break; - } - s++; - } - if ( free ) - break; - place++; - } - if ( place == maxn ) { - return -1; - } - while( start <= end ) { - used[10*start+place] = TRUE; - start++; - } - return place; + int place = 0; + int start = item->event().start().hour(); + QTime e = item->event().end(); + int end = e.hour(); + if ( e.minute() < 5 ) + end--; + if ( end < start ) + end = start; + while ( place < maxn ) { + bool free = TRUE; + int s = start; + while( s <= end ) { + if ( used[10*s+place] ) { + free = FALSE; + break; + } + s++; + } + if ( free ) + break; + place++; + } + if ( place == maxn ) { + return -1; + } + while( start <= end ) { + used[10*start+place] = TRUE; + start++; + } + return place; } void DateBookDay::relayoutPage( bool fromResize ) { - setUpdatesEnabled( FALSE ); - if ( !fromResize ) { - getEvents(); // no need we already have them! + setUpdatesEnabled( FALSE ); + if ( !fromResize ) { + getEvents(); // no need we already have them! if (m_allDays->items() > 0 ) m_allDays->show(); @@ -430,282 +440,282 @@ void DateBookDay::relayoutPage( bool fromResize ) */ } - widgetList.sort(); - //sorts the widgetList by the heights of the widget so that the tallest widgets are at the beginning - //this is needed for the simple algo below to work correctly, otherwise some widgets would be drawn outside the view - - int wCount = widgetList.count(); - int wid = view->columnWidth(0)-1; - int wd; - int n = 1; - - QArray anzIntersect(wCount); //this stores the number of maximal intersections of each widget - - for (int i = 0; i geometries(wCount); - for (int i = 0; i < wCount; geometries[i] = widgetList.at(i)->geometry(), i++); //stores geometry for each widget in vector - - for ( int i = 0; i < wCount; i++) { - QValueList intersectedWidgets; - - //find all widgets intersecting with widgetList.at(i) - for ( int j = 0; j < wCount; j++) { - if (i != j) - if (geometries[j].intersects(geometries[i])) - intersectedWidgets.append(j); - } - - //for each of these intersecting widgets find out how many widgets are they intersecting with - for ( uint j = 0; j < intersectedWidgets.count(); j++) - { - QArray inter(wCount); - inter[j]=1; - - if (intersectedWidgets[j] != -1) - for ( uint k = j; k < intersectedWidgets.count(); k++) { - if (j != k && intersectedWidgets[k] != -1) - if (geometries[intersectedWidgets[k]].intersects(geometries[intersectedWidgets[j]])) { - inter[j]++; - intersectedWidgets[k] = -1; - } - if (inter[j] > anzIntersect[i]) anzIntersect[i] = inter[j] + 1; - } - } - if (anzIntersect[i] == 1 && intersectedWidgets.count()) anzIntersect[i]++; - } - - - for ( int i = 0; i < wCount; i++) { - DateBookDayWidget *w = widgetList.at(i); - QRect geom = w->geometry(); - geom.setX( 0 ); - wd = (view->columnWidth(0)-1) / anzIntersect[i] - (anzIntersect[i]>1?2:0); - geom.setWidth( wd ); - while ( intersects( w, geom ) ) { - geom.moveBy( wd + 2 + 1, 0 ); - } - w->setGeometry( geom ); - } - - if (jumpToCurTime && this->date() == QDate::currentDate()) { - view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour - } else { - view->setContentsPos( 0, startTime * view->rowHeight(0) ); - } - } else { - int hours[24]; - memset( hours, 0, 24*sizeof( int ) ); - bool overFlow = FALSE; - for ( int i = 0; i < wCount; i++ ) { - DateBookDayWidget *w = widgetList.at(i); - int start = w->event().start().hour(); - QTime e = w->event().end(); - int end = e.hour(); - if ( e.minute() < 5 ) - end--; - if ( end < start ) - end = start; - while( start <= end ) { - hours[start]++; - if ( hours[start] >= 10 ) - overFlow = TRUE; - ++start; - } - if ( overFlow ) - break; - } - for ( int i = 0; i < 24; i++ ) { - n = QMAX( n, hours[i] ); - } - wid = ( view->columnWidth(0)-1 ) / n; - - bool used[24*10]; - memset( used, FALSE, 24*10*sizeof( bool ) ); - - for ( int i = 0; i < wCount; i++ ) { - DateBookDayWidget *w = widgetList.at(i); - int xp = place( w, used, n ); - if ( xp != -1 ) { - QRect geom = w->geometry(); - geom.setX( xp*(wid+2) ); - geom.setWidth( wid ); - w->setGeometry( geom ); - } - } - - if (jumpToCurTime && this->date() == QDate::currentDate()) { - view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour - } else { - view->setContentsPos( 0, startTime * view->rowHeight(0) ); - } - } - - timeMarker->setTime( QTime::currentTime() ); //display timeMarker - timeMarker->raise(); //on top of all widgets - if (this->date() == QDate::currentDate()) { //only show timeMarker on current day - timeMarker->show(); - } else { - timeMarker->hide(); - } - setUpdatesEnabled( TRUE ); - return; + widgetList.sort(); + //sorts the widgetList by the heights of the widget so that the tallest widgets are at the beginning + //this is needed for the simple algo below to work correctly, otherwise some widgets would be drawn outside the view + + int wCount = widgetList.count(); + int wid = view->columnWidth(0)-1; + int wd; + int n = 1; + + QArray anzIntersect(wCount); //this stores the number of maximal intersections of each widget + + for (int i = 0; i geometries(wCount); + for (int i = 0; i < wCount; geometries[i] = widgetList.at(i)->geometry(), i++); //stores geometry for each widget in vector + + for ( int i = 0; i < wCount; i++) { + QValueList intersectedWidgets; + + //find all widgets intersecting with widgetList.at(i) + for ( int j = 0; j < wCount; j++) { + if (i != j) + if (geometries[j].intersects(geometries[i])) + intersectedWidgets.append(j); + } + + //for each of these intersecting widgets find out how many widgets are they intersecting with + for ( uint j = 0; j < intersectedWidgets.count(); j++) + { + QArray inter(wCount); + inter[j]=1; + + if (intersectedWidgets[j] != -1) + for ( uint k = j; k < intersectedWidgets.count(); k++) { + if (j != k && intersectedWidgets[k] != -1) + if (geometries[intersectedWidgets[k]].intersects(geometries[intersectedWidgets[j]])) { + inter[j]++; + intersectedWidgets[k] = -1; + } + if (inter[j] > anzIntersect[i]) anzIntersect[i] = inter[j] + 1; + } + } + if (anzIntersect[i] == 1 && intersectedWidgets.count()) anzIntersect[i]++; + } + + + for ( int i = 0; i < wCount; i++) { + DateBookDayWidget *w = widgetList.at(i); + QRect geom = w->geometry(); + geom.setX( 0 ); + wd = (view->columnWidth(0)-1) / anzIntersect[i] - (anzIntersect[i]>1?2:0); + geom.setWidth( wd ); + while ( intersects( w, geom ) ) { + geom.moveBy( wd + 2 + 1, 0 ); + } + w->setGeometry( geom ); + } + + if (jumpToCurTime && this->date() == QDate::currentDate()) { + view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour + } else { + view->setContentsPos( 0, startTime * view->rowHeight(0) ); + } + } else { + int hours[24]; + memset( hours, 0, 24*sizeof( int ) ); + bool overFlow = FALSE; + for ( int i = 0; i < wCount; i++ ) { + DateBookDayWidget *w = widgetList.at(i); + int start = w->event().start().hour(); + QTime e = w->event().end(); + int end = e.hour(); + if ( e.minute() < 5 ) + end--; + if ( end < start ) + end = start; + while( start <= end ) { + hours[start]++; + if ( hours[start] >= 10 ) + overFlow = TRUE; + ++start; + } + if ( overFlow ) + break; + } + for ( int i = 0; i < 24; i++ ) { + n = QMAX( n, hours[i] ); + } + wid = ( view->columnWidth(0)-1 ) / n; + + bool used[24*10]; + memset( used, FALSE, 24*10*sizeof( bool ) ); + + for ( int i = 0; i < wCount; i++ ) { + DateBookDayWidget *w = widgetList.at(i); + int xp = place( w, used, n ); + if ( xp != -1 ) { + QRect geom = w->geometry(); + geom.setX( xp*(wid+2) ); + geom.setWidth( wid ); + w->setGeometry( geom ); + } + } + + if (jumpToCurTime && this->date() == QDate::currentDate()) { + view->setContentsPos( 0, QTime::currentTime().hour() * view->rowHeight(0) ); //set listview to current hour + } else { + view->setContentsPos( 0, startTime * view->rowHeight(0) ); + } + } + + timeMarker->setTime( QTime::currentTime() ); //display timeMarker + timeMarker->raise(); //on top of all widgets + if (this->date() == QDate::currentDate()) { //only show timeMarker on current day + timeMarker->show(); + } else { + timeMarker->hide(); + } + setUpdatesEnabled( TRUE ); + return; } DateBookDayWidget *DateBookDay::intersects( const DateBookDayWidget *item, const QRect &geom ) { - int i = 0; - DateBookDayWidget *w = widgetList.at(i); - int wCount = widgetList.count(); - while ( i < wCount && w != item ) { - if ( w->geometry().intersects( geom ) ) { - return w; - } - w = widgetList.at(++i); - } + int i = 0; + DateBookDayWidget *w = widgetList.at(i); + int wCount = widgetList.count(); + while ( i < wCount && w != item ) { + if ( w->geometry().intersects( geom ) ) { + return w; + } + w = widgetList.at(++i); + } - return 0; + return 0; } QDate DateBookDay::date() const { - return currDate; + return currDate; } void DateBookDay::setStartViewTime( int startHere ) { - startTime = startHere; - dayView()->clearSelection(); - QTableSelection ts; + startTime = startHere; + dayView()->clearSelection(); + QTableSelection ts; - if (jumpToCurTime && this->date() == QDate::currentDate()) { //this should probably be in datebook.cpp where it's called? - ts.init( QTime::currentTime().hour(), 0); - ts.expandTo( QTime::currentTime().hour(), 0); + if (jumpToCurTime && this->date() == QDate::currentDate()) { //this should probably be in datebook.cpp where it's called? + ts.init( QTime::currentTime().hour(), 0); + ts.expandTo( QTime::currentTime().hour(), 0); } else { - ts.init( startTime, 0 ); - ts.expandTo( startTime, 0 ); - } + ts.init( startTime, 0 ); + ts.expandTo( startTime, 0 ); + } - dayView()->addSelection( ts ); + dayView()->addSelection( ts ); } int DateBookDay::startViewTime() const { - return startTime; + return startTime; } void DateBookDay::slotWeekChanged( bool bStartOnMonday ) { - header->setStartOfWeek( bStartOnMonday ); -// redraw(); + header->setStartOfWeek( bStartOnMonday ); +// redraw(); } void DateBookDay::keyPressEvent(QKeyEvent *e) { - switch(e->key()) { - case Key_Up: - view->moveUp(); - break; - case Key_Down: - view->moveDown(); - break; - case Key_Left: - setDate(QDate(currDate).addDays(-1)); - break; - case Key_Right: - setDate(QDate(currDate).addDays(1)); - break; - default: - e->ignore(); - } + switch(e->key()) { + case Key_Up: + view->moveUp(); + break; + case Key_Down: + view->moveDown(); + break; + case Key_Left: + setDate(QDate(currDate).addDays(-1)); + break; + case Key_Right: + setDate(QDate(currDate).addDays(1)); + break; + default: + e->ignore(); + } } //=========================================================================== DateBookDayWidget::DateBookDayWidget( const EffectiveEvent &e, DateBookDay *db ) - : QWidget( db->dayView()->viewport() ), ev( e ), dateBook( db ) + : QWidget( db->dayView()->viewport() ), ev( e ), dateBook( db ) { // why would someone use "<"? Oh well, fix it up... // I wonder what other things may be messed up... - QString strDesc = ev.description(); - int where = strDesc.find( "<" ); - while ( where != -1 ) { - strDesc.remove( where, 1 ); - strDesc.insert( where, "<" ); - where = strDesc.find( "<", where ); - } - - QString strCat; + QString strDesc = ev.description(); + int where = strDesc.find( "<" ); + while ( where != -1 ) { + strDesc.remove( where, 1 ); + strDesc.insert( where, "<" ); + where = strDesc.find( "<", where ); + } + + QString strCat; // ### Fix later... // QString strCat = ev.category(); // where = strCat.find( "<" ); // while ( where != -1 ) { -// strCat.remove( where, 1 ); -// strCat.insert( where, "<" ); -// where = strCat.find( "<", where ); +// strCat.remove( where, 1 ); +// strCat.insert( where, "<" ); +// where = strCat.find( "<", where ); // } - QString strNote = ev.notes(); - where = strNote.find( "<" ); - while ( where != -1 ) { - strNote.remove( where, 1 ); - strNote.insert( where, "<" ); - where = strNote.find( "<", where ); - } - - text = "" + strDesc + "
" + ""; - if ( !strCat.isEmpty() ) { - text += strCat + "
"; - } - if (ev.event().type() == Event::Normal ) { - setEventText( text ); - } else { - setAllDayText( text ); - } - - text += "

" + strNote; - - setBackgroundMode( PaletteBase ); - - QTime start = ev.start(); - QTime end = ev.end(); - int y = start.hour()*60+start.minute(); - int h = end.hour()*60+end.minute()-y; - int rh = dateBook->dayView()->rowHeight(0); - y = y*rh/60; - h = h*rh/60; - - if ( h < 12 ) h = 12; // Make sure the widget is no smaller than 12 pixels high, so that it's possible to read atleast the first line. - if ( y > ((24*rh)-12) ) y=(24*rh)-12; // Make sure the widget fits inside the dayview. - geom.setY( y ); - geom.setHeight( h ); - geom.setX( 0 ); - geom.setWidth(dateBook->dayView()->columnWidth(0)-1); + QString strNote = ev.notes(); + where = strNote.find( "<" ); + while ( where != -1 ) { + strNote.remove( where, 1 ); + strNote.insert( where, "<" ); + where = strNote.find( "<", where ); + } + + text = "" + strDesc + "
" + ""; + if ( !strCat.isEmpty() ) { + text += strCat + "
"; + } + if (ev.event().type() == Event::Normal ) { + setEventText( text ); + } else { + setAllDayText( text ); + } + + text += "

" + strNote; + + setBackgroundMode( PaletteBase ); + + QTime start = ev.start(); + QTime end = ev.end(); + int y = start.hour()*60+start.minute(); + int h = end.hour()*60+end.minute()-y; + int rh = dateBook->dayView()->rowHeight(0); + y = y*rh/60; + h = h*rh/60; + + if ( h < 12 ) h = 12; // Make sure the widget is no smaller than 12 pixels high, so that it's possible to read atleast the first line. + if ( y > ((24*rh)-12) ) y=(24*rh)-12; // Make sure the widget fits inside the dayview. + geom.setY( y ); + geom.setHeight( h ); + geom.setX( 0 ); + geom.setWidth(dateBook->dayView()->columnWidth(0)-1); } void DateBookDayWidget::setAllDayText( QString &text ) { - text += "" + tr("This is an all day event.") + ""; + text += "" + tr("This is an all day event.") + ""; } void DateBookDayWidget::setEventText( QString& text ) { - bool whichClock = dateBook->dayView()->whichClock(); - if ( ev.startDate() != ev.endDate() ) { - text += "" + tr("Start") + ": "; - text += TimeString::timeString( ev.event().start().time(), whichClock, FALSE ); - text += " - " + TimeString::longDateString( ev.startDate() ) + "
"; - text += "" + tr("End") + ": "; - text += TimeString::timeString( ev.event().end().time(), whichClock, FALSE ); - text += " - " + TimeString::longDateString( ev.endDate() ); - } else { - text += "" + tr("Time") + ": "; - text += TimeString::timeString( ev.start(), whichClock, FALSE ); - text += "" + tr(" - ") + ""; - text += TimeString::timeString( ev.end(), whichClock, FALSE ); - } + bool whichClock = dateBook->dayView()->whichClock(); + if ( ev.startDate() != ev.endDate() ) { + text += "" + tr("Start") + ": "; + text += TimeString::timeString( ev.event().start().time(), whichClock, FALSE ); + text += " - " + TimeString::longDateString( ev.startDate() ) + "
"; + text += "" + tr("End") + ": "; + text += TimeString::timeString( ev.event().end().time(), whichClock, FALSE ); + text += " - " + TimeString::longDateString( ev.endDate() ); + } else { + text += "" + tr("Time") + ": "; + text += TimeString::timeString( ev.start(), whichClock, FALSE ); + text += "" + tr(" - ") + ""; + text += TimeString::timeString( ev.end(), whichClock, FALSE ); + } } DateBookDayWidget::~DateBookDayWidget() @@ -714,51 +724,51 @@ DateBookDayWidget::~DateBookDayWidget() void DateBookDayWidget::paintEvent( QPaintEvent *e ) { - QPainter p( this ); - - if (dateBook->getSelectedWidget() == this) { - p.setBrush( QColor( 155, 240, 230 ) ); // selected item - } else { - if (dateBook->date() == QDate::currentDate()) { - QTime curTime = QTime::currentTime(); - if (ev.end() < curTime) { - p.setBrush( QColor( 180, 180, 180 ) ); // grey, inactive - } else { - //change color in dependence of the time till the event starts - int duration = curTime.secsTo(ev.start()); - if (duration < 0) duration = 0; - int colChange = duration*160/86400; //86400: secs per day, 160: max color shift - p.setBrush( QColor( 200-colChange, 200-colChange, 255 ) ); //blue - } - } else { - p.setBrush( QColor( 220, 220, 220 ) ); //light grey, inactive (not current date) - //perhaps make a distinction between future/past dates - } - } - - p.setPen( QColor(100, 100, 100) ); - p.drawRect(rect()); + QPainter p( this ); + + if (dateBook->getSelectedWidget() == this) { + p.setBrush( QColor( 155, 240, 230 ) ); // selected item + } else { + if (dateBook->date() == QDate::currentDate()) { + QTime curTime = QTime::currentTime(); + if (ev.end() < curTime) { + p.setBrush( QColor( 180, 180, 180 ) ); // grey, inactive + } else { + //change color in dependence of the time till the event starts + int duration = curTime.secsTo(ev.start()); + if (duration < 0) duration = 0; + int colChange = duration*160/86400; //86400: secs per day, 160: max color shift + p.setBrush( QColor( 200-colChange, 200-colChange, 255 ) ); //blue + } + } else { + p.setBrush( QColor( 220, 220, 220 ) ); //light grey, inactive (not current date) + //perhaps make a distinction between future/past dates + } + } + + p.setPen( QColor(100, 100, 100) ); + p.drawRect(rect()); // p.drawRect(0,0, 5, height()); - int y = 0; - int d = 0; + int y = 0; + int d = 0; - if ( ev.event().hasAlarm() ) { - p.drawPixmap( width() - 16, 0, Resource::loadPixmap( "bell" ) ); - y = 20; - d = 20; - } + if ( ev.event().hasAlarm() ) { + p.drawPixmap( width() - 16, 0, Resource::loadPixmap( "bell" ) ); + y = 20; + d = 20; + } - if ( ev.event().hasRepeat() ) { - p.drawPixmap( width() - 16, y, Resource::loadPixmap( "repeat" ) ); - d = 20; - y += 20; - } + if ( ev.event().hasRepeat() ) { + p.drawPixmap( width() - 16, y, Resource::loadPixmap( "repeat" ) ); + d = 20; + y += 20; + } - QSimpleRichText rt( text, font() ); - rt.setWidth( geom.width() - d - 6 ); - rt.draw( &p, 7, 0, e->region(), colorGroup() ); + QSimpleRichText rt( text, font() ); + rt.setWidth( geom.width() - d - 6 ); + rt.draw( &p, 7, 0, e->region(), colorGroup() ); } /* @@ -785,34 +795,34 @@ QDate DateBookDay::findRealStart( int uid, const QDate& isIncluded , DateBookDB void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) { - DateBookDayWidget *item; + DateBookDayWidget *item; - item = dateBook->getSelectedWidget(); - if (item) - item->update(); + item = dateBook->getSelectedWidget(); + if (item) + item->update(); - dateBook->setSelectedWidget(this); - update(); - dateBook->repaint(); + dateBook->setSelectedWidget(this); + update(); + dateBook->repaint(); Event eve = ev.event(); - QPopupMenu m; - m.insertItem( tr( "Edit" ), 1 ); - m.insertItem( tr( "Duplicate" ), 4 ); - m.insertItem( tr( "Delete" ), 2 ); - if(Ir::supported()) m.insertItem( tr( "Beam" ), 3 ); + QPopupMenu m; + m.insertItem( tr( "Edit" ), 1 ); + m.insertItem( tr( "Duplicate" ), 4 ); + m.insertItem( tr( "Delete" ), 2 ); + if(Ir::supported()) m.insertItem( tr( "Beam" ), 3 ); if(Ir::supported() && ev.event().doRepeat() ) m.insertItem( tr( "Beam this occurence"), 5 ); - int r = m.exec( e->globalPos() ); - if ( r == 1 ) { - emit editMe( eve ); - } else if ( r == 2 ) { - emit deleteMe( eve ); - } else if ( r == 3 ) { - emit beamMe( eve ); - } else if ( r == 4 ) { - emit duplicateMe( eve ); - } else if ( r == 5 ) { + int r = m.exec( e->globalPos() ); + if ( r == 1 ) { + emit editMe( eve ); + } else if ( r == 2 ) { + emit deleteMe( eve ); + } else if ( r == 3 ) { + emit beamMe( eve ); + } else if ( r == 4 ) { + emit duplicateMe( eve ); + } else if ( r == 5 ) { // create an Event and beam it... /* * Start with the easy stuff. If start and end date is the same we can just use @@ -874,10 +884,10 @@ void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) void DateBookDayWidget::setGeometry( const QRect &r ) { - geom = r; - setFixedSize( r.width()+1, r.height()+1 ); - dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); - show(); + geom = r; + setFixedSize( r.width()+1, r.height()+1 ); + dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); + show(); } @@ -886,9 +896,9 @@ void DateBookDayWidget::setGeometry( const QRect &r ) DateBookDayTimeMarker::DateBookDayTimeMarker( DateBookDay *db ) - : QWidget( db->dayView()->viewport() ), dateBook( db ) + : QWidget( db->dayView()->viewport() ), dateBook( db ) { - setBackgroundMode( PaletteBase ); + setBackgroundMode( PaletteBase ); } DateBookDayTimeMarker::~DateBookDayTimeMarker() @@ -897,39 +907,39 @@ DateBookDayTimeMarker::~DateBookDayTimeMarker() void DateBookDayTimeMarker::paintEvent( QPaintEvent */*e*/ ) { - QPainter p( this ); - p.setBrush( QColor( 255, 0, 0 ) ); + QPainter p( this ); + p.setBrush( QColor( 255, 0, 0 ) ); - QPen pen; - pen.setStyle(NoPen); + QPen pen; + pen.setStyle(NoPen); - p.setPen( pen ); - p.drawRect(rect()); + p.setPen( pen ); + p.drawRect(rect()); } void DateBookDayTimeMarker::setTime( const QTime &t ) { - int y = t.hour()*60+t.minute(); - int rh = dateBook->dayView()->rowHeight(0); - y = y*rh/60; + int y = t.hour()*60+t.minute(); + int rh = dateBook->dayView()->rowHeight(0); + y = y*rh/60; - geom.setX( 0 ); + geom.setX( 0 ); - int x = dateBook->dayView()->columnWidth(0)-1; - geom.setWidth( x ); + int x = dateBook->dayView()->columnWidth(0)-1; + geom.setWidth( x ); - geom.setY( y ); - geom.setHeight( 1 ); + geom.setY( y ); + geom.setHeight( 1 ); - setGeometry( geom ); + setGeometry( geom ); - time = t; + time = t; } void DateBookDayTimeMarker::setGeometry( const QRect &r ) { - geom = r; - setFixedSize( r.width()+1, r.height()+1 ); - dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); - show(); + geom = r; + setFixedSize( r.width()+1, r.height()+1 ); + dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); + show(); } -- cgit v0.9.0.2