summaryrefslogtreecommitdiff
path: root/core/pim
Side-by-side diff
Diffstat (limited to 'core/pim') (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/datebook/datebook.cpp48
-rw-r--r--core/pim/datebook/datebookday.cpp236
-rw-r--r--core/pim/datebook/datebookday.h54
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
@@ -129,5 +129,5 @@ DateBook::DateBook( QWidget *parent, const char *, WFlags f )
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() ) );
@@ -174,5 +174,5 @@ DateBook::DateBook( QWidget *parent, const char *, WFlags f )
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 );
@@ -188,20 +188,20 @@ DateBook::DateBook( QWidget *parent, const char *, WFlags f )
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)
@@ -213,8 +213,8 @@ DateBook::DateBook( QWidget *parent, const char *, WFlags f )
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() );
@@ -310,5 +310,5 @@ QDate DateBook::currentDate()
{
QDate d = QDate::currentDate();
-
+
if ( dayView && views->visibleWidget() == dayView ) {
d = dayView->date();
@@ -407,5 +407,5 @@ void DateBook::editEvent( const Event &e )
if (!error.isNull()) {
if (QMessageBox::warning(this, "error box",
- error, "Fix it", "Continue",
+ error, "Fix it", "Continue",
0, 0, 1) == 0)
continue;
@@ -489,5 +489,5 @@ void DateBook::initWeek()
QDate d = QDate( yearNumber, 12, 31 );
calcWeek( d, totWeeks, yearNumber, onMonday );
-
+
while ( totWeeks == 1 ) {
d = d.addDays( -1 );
@@ -499,16 +499,16 @@ void DateBook::initWeek()
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() ),
@@ -541,5 +541,5 @@ void DateBook::loadSettings()
onMonday = config.readBoolEntry( "MONDAY" );
}
-
+
{
Config config("DateBook");
@@ -567,5 +567,5 @@ void DateBook::newDefaultView(QAction *a) {
if (a->text() == "WeekLst") val=WEEKLST;
if (a->text() == "Month") val=MONTH;
-
+
Config configDB( "DateBook" );
configDB.setGroup( "Main" );
@@ -689,5 +689,5 @@ void DateBook::timerEvent( QTimerEvent *e )
alarmCounter++;
Sound::soundAlarm();
- }
+ }
else
killTimer( e->timerId() );
@@ -977,5 +977,5 @@ Event DateBookDBHack::eventByUID(int uid) {
QValueList<Event>::ConstIterator it;
-
+
for (it = myEventList.begin(); it != myEventList.end(); it++) {
if ((*it).uid() == uid) return *it;
@@ -986,4 +986,6 @@ Event DateBookDBHack::eventByUID(int uid) {
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
@@ -18,4 +18,5 @@
**
**********************************************************************/
+#include <qmessagebox.h>
#include "datebookday.h"
@@ -37,4 +38,6 @@
#include <qpalette.h>
+#include <qtimer.h>
+
DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent,
const char *name )
@@ -58,4 +61,5 @@ DateBookDayView::DateBookDayView( bool whichClock, QWidget *parent,
tmp = new QTableItem( this, QTableItem::Never, QString::null);
setItem( row, 0, tmp );
+ setRowHeight( row, 40);
}
initHeader();
@@ -120,7 +124,11 @@ void DateBookDayView::paintCell( QPainter *p, int, int, const QRect &cr, bool )
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 );
}
@@ -175,4 +183,31 @@ DateBookDay::DateBookDay( bool ampm, bool startOnMonday,
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;
}
@@ -203,4 +238,6 @@ void DateBookDay::setDate( int y, int m, int d )
{
header->setDate( y, m, d );
+
+ selectedWidget = 0;
}
@@ -208,4 +245,6 @@ void DateBookDay::setDate( QDate d)
{
header->setDate( d.year(), d.month(), d.day() );
+
+ selectedWidget = 0;
}
@@ -222,4 +261,10 @@ void DateBookDay::dateChanged( int y, int m, int d )
ts.expandTo( startTime, 0 );
dayView()->addSelection( ts );
+
+ selectedWidget = 0;
+
+ if (this->date() == QDate::currentDate())
+ timeMarker->show(); else timeMarker->hide();
+
}
@@ -247,4 +292,5 @@ void DateBookDay::getEvents()
widgetList.append( w );
}
+
}
@@ -289,34 +335,75 @@ void DateBookDay::relayoutPage( bool 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 ) );
@@ -344,8 +431,8 @@ void DateBookDay::relayoutPage( bool fromResize )
}
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);
@@ -353,5 +440,5 @@ void DateBookDay::relayoutPage( bool fromResize )
if ( xp != -1 ) {
QRect geom = w->geometry();
- geom.setX( xp*wid );
+ geom.setX( xp*(wid+2) );
geom.setWidth( wid );
w->setGeometry( geom );
@@ -360,4 +447,7 @@ void DateBookDay::relayoutPage( bool fromResize )
view->setContentsPos( 0, startTime * view->rowHeight(0) );
}
+
+ timeMarker->setTime( QTime::currentTime() ); //display timeMarker
+ timeMarker->raise(); //on top of all widgets
setUpdatesEnabled( TRUE );
return;
@@ -497,4 +587,7 @@ DateBookDayWidget::DateBookDayWidget( const EffectiveEvent &e,
geom.setY( y );
geom.setHeight( h );
+ geom.setX( 0 );
+ geom.setWidth(dateBook->dayView()->columnWidth(0)-1);
+
}
@@ -506,8 +599,38 @@ 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;
@@ -526,9 +649,18 @@ void DateBookDayWidget::paintEvent( QPaintEvent *e )
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 );
@@ -552,2 +684,56 @@ void DateBookDayWidget::setGeometry( const QRect &r )
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
@@ -54,4 +54,5 @@ 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 );
@@ -74,5 +75,5 @@ public:
const EffectiveEvent &event() const { return ev; }
-
+
signals:
void deleteMe( const Event &e );
@@ -91,4 +92,48 @@ private:
};
+//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
{
@@ -103,4 +148,6 @@ public:
void setStartViewTime( int startHere );
int startViewTime() const;
+ void setSelectedWidget( DateBookDayWidget * );
+ DateBookDayWidget * getSelectedWidget( void );
public slots:
@@ -109,4 +156,5 @@ public slots:
void redraw();
void slotWeekChanged( bool bStartOnMonday );
+ void updateView(); //updates TimeMarker and DayWidget-colors
signals:
@@ -132,6 +180,8 @@ private:
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
};