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 | |
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
-rw-r--r-- | core/pim/datebook/datebook.cpp | 48 | ||||
-rw-r--r-- | core/pim/datebook/datebookday.cpp | 236 | ||||
-rw-r--r-- | core/pim/datebook/datebookday.h | 54 |
3 files changed, 288 insertions, 50 deletions
diff --git a/core/pim/datebook/datebook.cpp b/core/pim/datebook/datebook.cpp index 2c2965e..c0d45c9 100644 --- a/core/pim/datebook/datebook.cpp +++ b/core/pim/datebook/datebook.cpp @@ -123,17 +123,17 @@ DateBook::DateBook( QWidget *parent, const char *, WFlags f ) QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); a->addTo( sub_bar ); a = new QAction( tr( "Today" ), Resource::loadPixmap( "to_day" ), QString::null, 0, g, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( slotToday() ) ); a->addTo( sub_bar ); a->addTo( view ); - + a = new QAction( tr( "Day" ), Resource::loadPixmap( "day" ), QString::null, 0, g, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( viewDay() ) ); a->addTo( sub_bar ); a->addTo( view ); a->setToggleAction( TRUE ); a->setOn( TRUE ); dayAction = a; @@ -168,59 +168,59 @@ DateBook::DateBook( QWidget *parent, const char *, WFlags f ) QPopupMenu *default_view = new QPopupMenu(this); settings->insertItem( tr( "Default View" ),default_view ); default_view->setCheckable(TRUE); Config config("DateBook"); config.setGroup("Main"); int current=config.readNumEntry("defaultview", DAY); - + QActionGroup *ag = new QActionGroup(this); a = new QAction( tr( "Day" ), QString::null, 0, 0, 0, true ); if (current==DAY) a->setOn(true), viewDay(); ag->insert(a); a = new QAction( tr( "Week" ), QString::null, 0, 0, 0, true ); if (current==WEEK) a->setOn(true), viewWeek(); ag->insert(a); a = new QAction( tr( "WeekLst" ), QString::null, 0, 0, 0, true ); if (current==WEEKLST) a->setOn(true), viewWeekLst(); ag->insert(a); a = new QAction( tr( "Month" ), QString::null, 0, 0, 0, true ); if (current==MONTH) a->setOn(true), viewMonth(); ag->insert(a); - + ag->addTo(default_view); - connect(ag, SIGNAL( selected ( QAction * ) ), - this, SLOT( newDefaultView(QAction *) ) + connect(ag, SIGNAL( selected ( QAction * ) ), + this, SLOT( newDefaultView(QAction *) ) ); - + connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(changeClock(bool)) ); connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(changeWeek(bool)) ); - + #if defined(Q_WS_QWS) && !defined(QT_NO_COP) connect( qApp, SIGNAL(appMessage(const QCString&, const QByteArray&)), this, SLOT(appMessage(const QCString&, const QByteArray&)) ); #endif - + // listen on QPE/System #if defined(Q_WS_QWS) #if !defined(QT_NO_COP) QCopChannel *channel = new QCopChannel( "QPE/System", this ); connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), this, SLOT(receive(const QCString&, const QByteArray&)) ); channel = new QCopChannel( "QPE/Datebook", this ); connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), this, SLOT(receive(const QCString&, const QByteArray&)) ); - qDebug("olle\n"); + qDebug("olle\n"); #endif #endif - + qDebug("done t=%d", t.elapsed() ); } void DateBook::receive( const QCString &msg, const QByteArray &data ) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "timeChange(QString)" ) { @@ -304,17 +304,17 @@ QString DateBook::checkEvent(const Event &e) "than interval between repeats."); return QString::null; } QDate DateBook::currentDate() { QDate d = QDate::currentDate(); - + if ( dayView && views->visibleWidget() == dayView ) { d = dayView->date(); } else if ( weekView && views->visibleWidget() == weekView ) { d = weekView->date(); } else if ( weekLstView && views->visibleWidget() == weekLstView ) { d = weekLstView->date(); } else if ( monthView && views->visibleWidget() == monthView ) { d = monthView->selectedDate(); @@ -401,17 +401,17 @@ void DateBook::editEvent( const Event &e ) editDlg.showMaximized(); #endif while (editDlg.exec() ) { Event newEv = entry->event(); newEv.setUid(e.uid()); // FIXME: Hack not to clear uid QString error = checkEvent(newEv); if (!error.isNull()) { if (QMessageBox::warning(this, "error box", - error, "Fix it", "Continue", + error, "Fix it", "Continue", 0, 0, 1) == 0) continue; } db->editEvent(e, newEv); emit newEvent(); break; } } @@ -483,38 +483,38 @@ void DateBook::initWeek() //from the year of the current date. So, first find the year //number of the current week. int yearNumber, totWeeks; calcWeek( currentDate(), totWeeks, yearNumber, onMonday ); QDate d = QDate( yearNumber, 12, 31 ); calcWeek( d, totWeeks, yearNumber, onMonday ); - + while ( totWeeks == 1 ) { d = d.addDays( -1 ); calcWeek( d, totWeeks, yearNumber, onMonday ); } if ( totWeeks != weekView->totalWeeks() ) weekView->setTotalWeeks( totWeeks ); } void DateBook::initWeekLst() { if ( !weekLstView ) { - weekLstView = new DateBookWeekLst( ampm, onMonday, db, + weekLstView = new DateBookWeekLst( ampm, onMonday, db, views, "weeklst view" ); views->addWidget( weekLstView, WEEKLST ); - + //weekLstView->setStartViewTime( startTime ); connect( weekLstView, SIGNAL( showDate( int, int, int ) ), this, SLOT( showDay( int, int, int ) ) ); - connect( weekLstView, SIGNAL( addEvent( const QDateTime &, - const QDateTime &, + connect( weekLstView, SIGNAL( addEvent( const QDateTime &, + const QDateTime &, const QString & ) ), - this, SLOT( slotNewEntry( const QDateTime &, - const QDateTime &, + this, SLOT( slotNewEntry( const QDateTime &, + const QDateTime &, const QString & ) ) ); connect( this, SIGNAL( newEvent() ), weekLstView, SLOT( redraw() ) ); connect( weekLstView, SIGNAL( editEvent( const Event & ) ), this, SLOT( editEvent( const Event & ) ) ); } } @@ -535,17 +535,17 @@ void DateBook::initMonth() void DateBook::loadSettings() { { Config config( "qpe" ); config.setGroup("Time"); ampm = config.readBoolEntry( "AMPM", TRUE ); onMonday = config.readBoolEntry( "MONDAY" ); } - + { Config config("DateBook"); config.setGroup("Main"); startTime = config.readNumEntry("startviewtime", 8); aPreset = config.readBoolEntry("alarmpreset"); presetTime = config.readNumEntry("presettime"); } } @@ -561,17 +561,17 @@ void DateBook::saveSettings() } void DateBook::newDefaultView(QAction *a) { int val=DAY; if (a->text() == "Day") val=DAY; if (a->text() == "Week") val=WEEK; if (a->text() == "WeekLst") val=WEEKLST; if (a->text() == "Month") val=MONTH; - + Config configDB( "DateBook" ); configDB.setGroup( "Main" ); configDB.writeEntry("defaultview",val); } void DateBook::appMessage(const QCString& msg, const QByteArray& data) { bool needShow = FALSE; @@ -683,17 +683,17 @@ void DateBook::flush() db->save(); } void DateBook::timerEvent( QTimerEvent *e ) { if ( alarmCounter < 10 ) { alarmCounter++; Sound::soundAlarm(); - } + } else killTimer( e->timerId() ); } void DateBook::changeClock( bool newClock ) { ampm = newClock; // repaint the affected objects... @@ -971,19 +971,21 @@ Event DateBookDBHack::eventByUID(int uid) { // FIXME: Dirty Hacks to get hold of the private event lists QDate start; QDate end=start.addDays(-1); QValueList<Event> myEventList=getNonRepeatingEvents(start,end); QValueList<Event> myRepeatEvents=getRawRepeats(); QValueList<Event>::ConstIterator it; - + for (it = myEventList.begin(); it != myEventList.end(); it++) { if ((*it).uid() == uid) return *it; } for (it = myRepeatEvents.begin(); it != myRepeatEvents.end(); it++) { if ((*it).uid() == uid) return *it; } qDebug("Event not found: uid=%d\n", uid); + Event ev; + return ev; // return at least } 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 @@ -12,16 +12,17 @@ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ +#include <qmessagebox.h> #include "datebookday.h" #include "datebookdayheaderimpl.h" #include <qpe/datebookdb.h> #include <qpe/resource.h> #include <qpe/event.h> #include <qpe/qpeapplication.h> @@ -31,16 +32,18 @@ #include <qheader.h> #include <qdatetime.h> #include <qpainter.h> #include <qsimplerichtext.h> #include <qpopupmenu.h> #include <qtextcodec.h> #include <qpalette.h> +#include <qtimer.h> + DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent, const char *name ) : QTable( 24, 1, parent, name ), ampm( whichClock ) { enableClipper(TRUE); setTopMargin( 0 ); horizontalHeader()->hide(); @@ -52,16 +55,17 @@ DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent, 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() { @@ -114,19 +118,23 @@ 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().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 ); } } void DateBookDayView::paintFocus( QPainter *, const QRect & ) { } @@ -169,16 +177,43 @@ DateBookDay::DateBookDay( bool ampm, bool startOnMonday, connect( header, SIGNAL( dateChanged( int, int, int ) ), this, SLOT( dateChanged( 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 ); + + 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; } void DateBookDay::selectedDates( QDateTime &start, QDateTime &end ) { start.setDate( currDate ); end.setDate( currDate ); int sh=99,eh=-1; @@ -197,35 +232,45 @@ void DateBookDay::selectedDates( QDateTime &start, QDateTime &end ) 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; } void DateBookDay::setDate( QDate d) { 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; ts.init( startTime, 0 ); ts.expandTo( startTime, 0 ); dayView()->addSelection( ts ); + + selectedWidget = 0; + + if (this->date() == QDate::currentDate()) + timeMarker->show(); else timeMarker->hide(); + } void DateBookDay::redraw() { if ( isUpdatesEnabled() ) relayoutPage(); } @@ -241,16 +286,17 @@ void DateBookDay::getEvents() connect( w, SIGNAL( deleteMe( const Event & ) ), this, SIGNAL( removeEvent( const Event & ) ) ); connect( w, SIGNAL( editMe( const Event & ) ), this, SIGNAL( editEvent( const Event & ) ) ); connect( w, SIGNAL( beamMe( const Event & ) ), this, SIGNAL( beamEvent( const Event & ) ) ); widgetList.append( w ); } + } 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(); @@ -283,46 +329,87 @@ static int place( const DateBookDayWidget *item, bool *used, int maxn ) void DateBookDay::relayoutPage( bool fromResize ) { setUpdatesEnabled( FALSE ); if ( !fromResize ) getEvents(); // no need we already have them! + 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 ); - } - if ( xp >= n ) { - n++; - wid = ( view->columnWidth(0)-1 ) / n; - i = 0; - } else { - w->setGeometry( geom ); - i++; + + 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 ); } + 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(); @@ -338,32 +425,35 @@ void DateBookDay::relayoutPage( bool fromResize ) } 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 ); + geom.setX( xp*(wid+2) ); geom.setWidth( wid ); w->setGeometry( geom ); } } view->setContentsPos( 0, startTime * view->rowHeight(0) ); } + + timeMarker->setTime( QTime::currentTime() ); //display timeMarker + timeMarker->raise(); //on top of all widgets setUpdatesEnabled( TRUE ); return; } DateBookDayWidget *DateBookDay::intersects( const DateBookDayWidget *item, const QRect &geom ) { int i = 0; DateBookDayWidget *w = widgetList.at(i); @@ -491,50 +581,92 @@ DateBookDayWidget::DateBookDayWidget( const EffectiveEvent &e, int h = end.hour()*60+end.minute()-y; int rh = dateBook->dayView()->rowHeight(0); y = y*rh/60; h = h*rh/60; if ( h < 3 ) h = 3; geom.setY( y ); geom.setHeight( h ); + geom.setX( 0 ); + geom.setWidth(dateBook->dayView()->columnWidth(0)-1); + } 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.setBrush( QColor( 255, 240, 230 ) ); // based on priority? p.drawRect(rect()); + // p.drawRect(0,0, 5, height()); + 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().hasRepeat() ) { p.drawPixmap( width() - 16, y, Resource::loadPixmap( "repeat" ) ); d = 20; } QSimpleRichText rt( text, font() ); rt.setWidth( geom.width() - d - 6 ); - rt.draw( &p, 3, 0, e->region(), colorGroup() ); + rt.draw( &p, 7, 0, e->region(), colorGroup() ); } void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) { + DateBookDayWidget *item; + + item = dateBook->getSelectedWidget(); + if (item) item->update(); + + dateBook->setSelectedWidget(this); + update(); + dateBook->repaint(); + QPopupMenu m; m.insertItem( tr( "Edit" ), 1 ); m.insertItem( tr( "Delete" ), 2 ); m.insertItem( tr( "Beam" ), 3 ); int r = m.exec( e->globalPos() ); if ( r == 1 ) { emit editMe( ev.event() ); } else if ( r == 2 ) { @@ -546,8 +678,62 @@ 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(); } + + +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- + + +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(); +} diff --git a/core/pim/datebook/datebookday.h b/core/pim/datebook/datebookday.h index 531fded..db0f3b6 100644 --- a/core/pim/datebook/datebookday.h +++ b/core/pim/datebook/datebookday.h @@ -48,16 +48,17 @@ public slots: signals: void sigColWidthChanged(); void sigCapturedKey( const QString &txt ); protected slots: void slotChangeClock( bool ); protected: virtual void paintCell( QPainter *p, int row, int col, const QRect &cr, bool selected ); virtual void paintFocus( QPainter *p, const QRect &cr ); + virtual void resizeEvent( QResizeEvent *e ); void keyPressEvent( QKeyEvent *e ); void initHeader(); private: bool ampm; }; class DateBookDay; @@ -68,51 +69,98 @@ class DateBookDayWidget : public QWidget public: DateBookDayWidget( const EffectiveEvent &e, DateBookDay *db ); ~DateBookDayWidget(); const QRect &geometry() { return geom; } void setGeometry( const QRect &r ); const EffectiveEvent &event() const { return ev; } - + signals: void deleteMe( const Event &e ); void editMe( const Event &e ); void beamMe( const Event &e ); protected: void paintEvent( QPaintEvent *e ); void mousePressEvent( QMouseEvent *e ); private: const EffectiveEvent ev; DateBookDay *dateBook; QString text; QRect geom; }; +//Marker for current time in the dayview +class DateBookDayTimeMarker : public QWidget +{ + Q_OBJECT + +public: + DateBookDayTimeMarker( DateBookDay *db ); + ~DateBookDayTimeMarker(); + + const QRect &geometry() { return geom; } + void setGeometry( const QRect &r ); + void setTime( const QTime &t ); + +signals: + +protected: + void paintEvent( QPaintEvent *e ); + +private: + QRect geom; + QTime time; + DateBookDay *dateBook; +}; + +//reimplemented the compareItems function so that it sorts DayWidgets by geometry heights +class WidgetListClass : public QList<DateBookDayWidget> +{ + private: + + int compareItems( QCollection::Item s1, QCollection::Item s2 ) + { + //hmm, don't punish me for that ;) + if (reinterpret_cast<DateBookDayWidget*>(s1)->geometry().height() > reinterpret_cast<DateBookDayWidget*>(s2)->geometry().height()) + { + return -1; + } else + { + return 1; + } + } + + +}; + class DateBookDay : public QVBox { Q_OBJECT public: DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, QWidget *parent, const char *name ); void selectedDates( QDateTime &start, QDateTime &end ); QDate date() const; DateBookDayView *dayView() const { return view; } void setStartViewTime( int startHere ); int startViewTime() const; + void setSelectedWidget( DateBookDayWidget * ); + DateBookDayWidget * getSelectedWidget( void ); public slots: void setDate( int y, int m, int d ); void setDate( QDate ); void redraw(); void slotWeekChanged( bool bStartOnMonday ); + void updateView(); //updates TimeMarker and DayWidget-colors signals: void removeEvent( const Event& ); void editEvent( const Event& ); void beamEvent( const Event& ); void newEvent(); void sigNewEvent( const QString & ); @@ -126,13 +174,15 @@ private slots: private: void getEvents(); void relayoutPage( bool fromResize = false ); DateBookDayWidget *intersects( const DateBookDayWidget *item, const QRect &geom ); QDate currDate; DateBookDayView *view; DateBookDayHeader *header; DateBookDB *db; - QList<DateBookDayWidget> widgetList; + WidgetListClass widgetList; //reimplemented QList for sorting widgets by height int startTime; + DateBookDayWidget *selectedWidget; //actual selected widget (obviously) + DateBookDayTimeMarker *timeMarker; //marker for current time }; #endif |