--Boundary-00=_noiD+uMexAzCIj0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline El Jueves, 26 de Diciembre de 2002 15:30, Hans Petter Bieker escribi=F3: > On Wed, 25 Dec 2002, Cornelius Schumacher wrote: > > Are you aware of the date and time selection widgets in > > kdepim/libkdepim/kdateedit.{h,cpp} and > > kdepim/korganizer/ktimeedit.{h,cpp}? > > I am now, but I wasn't. Perhaps we should try to merge kdatewidget with > kdateedit and ktimewidget with ktimeedit. I guess the reason why we have > a few such widgets laying around is the lack of features in the current > widgets. > I added some weeks ago some methods to KDateTable but didn't commit them=20 yet (but I'm using them in a new app I'm developing). I didn't had any conflict (surprisingly :) ) when updating cvs after all=20 those changes you've been doing in those classes, but anyway, I'd like to=20 commit my changes as soon as possible. They add support to specify the color in which to paint a given day, and=20 also, if you want to mark days with a filled square or circle, in order to= =20 keep those days "highlighted" in an special way. The change to KDatePicker is just an accesor to get the KDateTable object=20 that KDatePicker uses to be able to call the methods I added there. Also, I added a signal aboutToShowContextMenu( KPopupMenu * menu, const=20 QDate &date); so that you can make KDateTable open a menu when you right=20 click on a date and add entries before it's shown, depending on the date=20 the user clicked on. Should I commit the attached patch ? Greetings, and merry christmas, =2D- Antonio Larrosa Jimenez KDE developer - larrosa@kde.org http://developer.kde.org/~larrosa/ Take care of self-appointed experts. --Boundary-00=_noiD+uMexAzCIj0 Content-Type: text/x-diff; charset="iso-8859-1"; name="datechanges.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="datechanges.diff" Index: kdatepicker.h =================================================================== RCS file: /home/kde/kdelibs/kdeui/kdatepicker.h,v retrieving revision 1.30 diff -u -p -r1.30 kdatepicker.h --- kdatepicker.h 28 Sep 2002 15:16:22 -0000 1.30 +++ kdatepicker.h 28 Dec 2002 22:34:31 -0000 @@ -113,6 +113,8 @@ public: **/ void setEnabled(bool); + KDateTable *dateTable() const { return table; }; + /** * Sets the font size of the widgets elements. **/ Index: kdatetbl.cpp =================================================================== RCS file: /home/kde/kdelibs/kdeui/kdatetbl.cpp,v retrieving revision 1.52 diff -u -p -r1.52 kdatetbl.cpp --- kdatetbl.cpp 26 Sep 2002 18:42:04 -0000 1.52 +++ kdatetbl.cpp 28 Dec 2002 22:34:57 -0000 @@ -40,13 +40,43 @@ #include #include "kdatepicker.h" #include "kdatetbl.h" +#include "kpopupmenu.h" #include #include #include #include #include +#include #include + +class KDateTable::KDateTablePrivate +{ +public: + KDateTablePrivate() + { + popupMenuEnabled=false; + useCustomColors=false; + } + + ~KDateTablePrivate() + { + } + + bool popupMenuEnabled; + bool useCustomColors; + + struct DatePaintingMode + { + QColor fgColor; + QColor bgColor; + BackgroundMode bgMode; + }; + QDict customPaintingModes; + +}; + + KDateValidator::KDateValidator(QWidget* parent, const char* name) : QValidator(parent, name) { @@ -81,6 +111,7 @@ KDateValidator::fixup( QString& ) const KDateTable::KDateTable(QWidget *parent, QDate date_, const char* name, WFlags f) : QGridView(parent, name, f) { + d = new KDateTablePrivate; setFontSize(10); if(!date_.isValid()) { @@ -96,6 +127,11 @@ KDateTable::KDateTable(QWidget *parent, setDate(date_); // this initializes firstday, numdays, numDaysPrevMonth } +KDateTable::~KDateTable() +{ + delete d; +} + void KDateTable::paintCell(QPainter *painter, int row, int col) { @@ -143,6 +179,7 @@ KDateTable::paintCell(QPainter *painter, painter->lineTo(w-1, h-1); // ----- draw the weekday: } else { + bool paintRect=true; painter->setFont(font); pos=7*(row-1)+col; if ( firstWeekDay < 4 ) @@ -162,6 +199,26 @@ KDateTable::paintCell(QPainter *painter, painter->setPen(gray); } else { // paint a day of the current month text.setNum(pos-firstday+1); + if ( d->useCustomColors ) + { + const QString key=text+"-"+date.month()+"-"+date.year(); + KDateTablePrivate::DatePaintingMode *mode=d->customPaintingModes[key]; + if (mode) + { + QBrush oldbrush=painter->brush(); + painter->setBrush( mode->bgColor ); + switch(mode->bgMode) + { + case(CircleMode) : painter->drawEllipse(0,0,w,h);break; + case(RectangleMode) : painter->drawRect(0,0,w,h);break; + case(None) : + default: + } + painter->setPen( mode->fgColor ); + painter->setBrush( oldbrush ); + paintRect=false; + } else + painter->setPen(KGlobalSettings::textColor()); + } else painter->setPen(KGlobalSettings::textColor()); } @@ -191,7 +248,7 @@ KDateTable::paintCell(QPainter *painter, painter->setPen(KGlobalSettings::textColor()); } - painter->drawRect(0, 0, w, h); + if ( paintRect ) painter->drawRect(0, 0, w, h); painter->setPen(pen); painter->drawText(0, 0, w, h, AlignCenter, text, -1, &rect); } @@ -340,14 +397,23 @@ KDateTable::contentsMousePressEvent(QMou setDate(date.addDays(pos - firstday - date.day() + dayoff % 7)); return; } + + QDate clickedDate(QDate(date.year(), date.month(), pos - firstday + dayoff % 7)); temp = firstday + date.day() - dayoff % 7 - 1; - setDate(QDate(date.year(), date.month(), pos - firstday + dayoff % 7)); - + setDate( clickedDate ); updateCell(temp/7+1, temp%7); // Update the previously selected cell updateCell(row, col); // Update the selected cell // assert(QDate(date.year(), date.month(), pos-firstday+dayoff).isValid()); + emit(tableClicked()); + if ( e->button() == Qt::RightButton && d->popupMenuEnabled ) + { + KPopupMenu *menu = new KPopupMenu(); + menu->insertTitle( clickedDate.toString() ); + emit aboutToShowContextMenu( menu, clickedDate ); + menu->popup(e->globalPos()); + } } bool @@ -415,6 +481,29 @@ KDateTable::sizeHint() const kdDebug() << "KDateTable::sizeHint: obscure failure - " << endl; return QSize(-1, -1); } +} + +void KDateTable::setPopupMenuEnabled( bool enable ) +{ + d->popupMenuEnabled=enable; +} + +bool KDateTable::popupMenuEnabled() const +{ + return d->popupMenuEnabled; +} + +void KDateTable::setCustomDatePainting(const QDate &date, const QColor &fgColor, BackgroundMode bgMode, const QColor &bgColor) +{ + KDateTablePrivate::DatePaintingMode *mode=new KDateTablePrivate::DatePaintingMode; + mode->bgMode=bgMode; + mode->fgColor=fgColor; + mode->bgColor=bgColor; + const QString key=QString::number(date.day())+"-"+date.month()+"-"+date.year(); + + d->customPaintingModes.replace( key, mode ); + d->useCustomColors=true; + update(); } KDateInternalWeekSelector::KDateInternalWeekSelector Index: kdatetbl.h =================================================================== RCS file: /home/kde/kdelibs/kdeui/kdatetbl.h,v retrieving revision 1.31 diff -u -p -r1.31 kdatetbl.h --- kdatetbl.h 25 Jul 2002 13:26:37 -0000 1.31 +++ kdatetbl.h 28 Dec 2002 22:35:04 -0000 @@ -24,6 +24,9 @@ #include #include #include +#include + +class KPopupMenu; /** Week selection widget. * @internal @@ -252,6 +255,12 @@ public: KDateTable(QWidget *parent=0, QDate date=QDate::currentDate(), const char* name=0, WFlags f=0); + + /** + * The destructor. + */ + ~KDateTable(); + /** * Returns a recommended size for the widget. * To save some time, the size of the largest used cell content is @@ -270,6 +279,11 @@ public: bool setDate(const QDate&); const QDate& getDate() const; + void setPopupMenuEnabled( bool enable ); + bool popupMenuEnabled() const; + + enum BackgroundMode { None=0, RectangleMode, CircleMode }; + void setCustomDatePainting(const QDate &date, const QColor &fgColor, BackgroundMode bgMode=RectangleMode, const QColor &bgColor=QColor()); protected: /** @@ -326,6 +340,7 @@ signals: * A date has been selected by clicking on the table. */ void tableClicked(); + void aboutToShowContextMenu( KPopupMenu * menu, const QDate &date); protected: virtual void virtual_hook( int id, void* data ); --Boundary-00=_noiD+uMexAzCIj0--