author | zecke <zecke> | 2002-06-17 15:57:13 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-06-17 15:57:13 (UTC) |
commit | 97aca0c9f5f483d01c685d0d0f126ca554d3b199 (patch) (side-by-side diff) | |
tree | 839929bc17e8e86e1a8d35e2b14e02f6343a8823 /core/pim/datebook/datebookday.cpp | |
parent | 02e724757f13f40d85136c3a14e0a3788d28236e (diff) | |
download | opie-97aca0c9f5f483d01c685d0d0f126ca554d3b199.zip opie-97aca0c9f5f483d01c685d0d0f126ca554d3b199.tar.gz opie-97aca0c9f5f483d01c685d0d0f126ca554d3b199.tar.bz2 |
tboc <tboc@gmx.de> provided a cute patch to show a red time mark
in the current day view
Diffstat (limited to 'core/pim/datebook/datebookday.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | core/pim/datebook/datebookday.cpp | 226 |
1 files changed, 206 insertions, 20 deletions
diff --git a/core/pim/datebook/datebookday.cpp b/core/pim/datebook/datebookday.cpp index 67a88e9..c15ccef 100644 --- a/core/pim/datebook/datebookday.cpp +++ b/core/pim/datebook/datebookday.cpp @@ -19,2 +19,3 @@ **********************************************************************/ +#include <qmessagebox.h> @@ -38,2 +39,4 @@ +#include <qtimer.h> + DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent, @@ -59,2 +62,3 @@ DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent, setItem( row, 0, tmp ); + setRowHeight( row, 40); } @@ -121,5 +125,9 @@ void DateBookDayView::paintCell( QPainter *p, int, int, const QRect &cr, bool ) QPen pen( p->pen() ); - p->setPen( colorGroup().mid() ); + 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 ); @@ -176,2 +184,29 @@ DateBookDay::DateBookDay( bool ampm, bool startOnMonday, this, SIGNAL(sigNewEvent(const QString&)) ); + + 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 + + selectedWidget = 0; + + timeMarker = new DateBookDayTimeMarker( this ); + timeMarker->setTime( QTime::currentTime() ); +} + +void DateBookDay::updateView( void ) +{ + timeMarker->setTime( QTime::currentTime() ); + //need to find a way to update all DateBookDayWidgets +} + +void DateBookDay::setSelectedWidget( DateBookDayWidget *w ) +{ + selectedWidget = w; +} + +DateBookDayWidget * DateBookDay::getSelectedWidget( void ) +{ + return selectedWidget; } @@ -204,2 +239,4 @@ void DateBookDay::setDate( int y, int m, int d ) header->setDate( y, m, d ); + + selectedWidget = 0; } @@ -209,2 +246,4 @@ void DateBookDay::setDate( QDate d) header->setDate( d.year(), d.month(), d.day() ); + + selectedWidget = 0; } @@ -223,2 +262,8 @@ void DateBookDay::dateChanged( int y, int m, int d ) dayView()->addSelection( ts ); + + selectedWidget = 0; + + if (this->date() == QDate::currentDate()) + timeMarker->show(); else timeMarker->hide(); + } @@ -248,2 +293,3 @@ void DateBookDay::getEvents() } + } @@ -290,29 +336,70 @@ 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<int> anzIntersect(wCount); //this stores the number of maximal intersections of each widget + + for (int i = 0; i<wCount; anzIntersect[i] = 1, i++); + if ( wCount < 20 ) { - for ( int i = 0; i < wCount; ) { + + QArray<QRect> 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<int> 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<int> 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); - int x = 0; - int xp = 0; QRect geom = w->geometry(); - geom.setX( x ); - geom.setWidth( wid ); - while ( xp < n && intersects( w, geom ) ) { - x += wid; - xp++; - geom.moveBy( wid, 0 ); + + 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 ); } - if ( xp >= n ) { - n++; - wid = ( view->columnWidth(0)-1 ) / n; - i = 0; - } else { w->setGeometry( geom ); - i++; - } } + view->setContentsPos( 0, startTime * view->rowHeight(0) ); + + } else { @@ -354,3 +441,3 @@ void DateBookDay::relayoutPage( bool fromResize ) QRect geom = w->geometry(); - geom.setX( xp*wid ); + geom.setX( xp*(wid+2) ); geom.setWidth( wid ); @@ -361,2 +448,5 @@ void DateBookDay::relayoutPage( bool fromResize ) } + + timeMarker->setTime( QTime::currentTime() ); //display timeMarker + timeMarker->raise(); //on top of all widgets setUpdatesEnabled( TRUE ); @@ -498,2 +588,5 @@ DateBookDayWidget::DateBookDayWidget( const EffectiveEvent &e, geom.setHeight( h ); + geom.setX( 0 ); + geom.setWidth(dateBook->dayView()->columnWidth(0)-1); + } @@ -507,6 +600,36 @@ 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.setBrush( QColor( 255, 240, 230 ) ); // based on priority? p.drawRect(rect()); + // p.drawRect(0,0, 5, height()); + int y = 0; @@ -527,3 +650,3 @@ void DateBookDayWidget::paintEvent( QPaintEvent *e ) rt.setWidth( geom.width() - d - 6 ); - rt.draw( &p, 3, 0, e->region(), colorGroup() ); + rt.draw( &p, 7, 0, e->region(), colorGroup() ); } @@ -532,2 +655,11 @@ void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) { + DateBookDayWidget *item; + + item = dateBook->getSelectedWidget(); + if (item) item->update(); + + dateBook->setSelectedWidget(this); + update(); + dateBook->repaint(); + QPopupMenu m; @@ -553 +685,55 @@ void DateBookDayWidget::setGeometry( const QRect &r ) } + + +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- + + +DateBookDayTimeMarker::DateBookDayTimeMarker( DateBookDay *db ) + : QWidget( db->dayView()->viewport() ), dateBook( db ) +{ + setBackgroundMode( PaletteBase ); +} + +DateBookDayTimeMarker::~DateBookDayTimeMarker() +{ +} + +void DateBookDayTimeMarker::paintEvent( QPaintEvent */*e*/ ) +{ + QPainter p( this ); + p.setBrush( QColor( 255, 0, 0 ) ); + + QPen pen; + pen.setStyle(NoPen); + + 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; + + geom.setX( 0 ); + + int x = dateBook->dayView()->columnWidth(0)-1; + geom.setWidth( x ); + + geom.setY( y ); + geom.setHeight( 1 ); + + setGeometry( geom ); + + 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(); +} |