Git commit 2e7cb6a55710fa7dae74163cdbf49d239afe07e4 by Stefan Böhmann. Pushed by sboehmann into branch 'master'. move DateEdit and DatePickerPopup from gui/ to core/widgets M +2 -2 CMakeLists.txt M +17 -4 core/CMakeLists.txt A +1 -0 core/include/Knipptasch/DateEdit [License: Trivial file] A +1 -0 core/include/Knipptasch/DateValidator [License: Trivial file] A +614 -0 core/widgets/dateedit.cpp [License: LGPL (v2.1+)] A +247 -0 core/widgets/dateedit.h [License: LGPL (v2.1+)] A +258 -0 core/widgets/datepickerpopup.cpp [License: LGPL (v2.1+)] A +113 -0 core/widgets/datepickerpopup.h [License: LGPL (v2.1+)] A +140 -0 core/widgets/datevalidator.cpp [License: GPL (v2+)] A +65 -0 core/widgets/datevalidator.h [License: GPL (v2+)] M +0 -4 gui/CMakeLists.txt D +0 -623 gui/dateedit.cpp D +0 -236 gui/dateedit.h D +0 -258 gui/datepickerpopup.cpp D +0 -113 gui/datepickerpopup.h M +2 -2 gui/delegate/datedelegate.cpp http://commits.kde.org/knipptasch/2e7cb6a55710fa7dae74163cdbf49d239afe07e4 diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d8dada..3bb967c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -143,10 +143,10 @@ macro_optional_add_subdirectory( cmake ) macro_optional_add_subdirectory( strigi-analyzer ) add_subdirectory( 3rdparty ) add_subdirectory( data ) -add_subdirectory( core ) add_subdirectory( compat ) +add_subdirectory( core ) add_subdirectory( gui ) -add_subdirectory( plugins ) +#add_subdirectory( plugins ) macro_display_feature_log() diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index ee11e65..891b642 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -17,6 +17,10 @@ set( knipptasch_core_SOURCES exportplugin.cpp importplugin.cpp + widgets/dateedit.cpp + widgets/datevalidator.cpp + widgets/datepickerpopup.cpp + backend/object.cpp backend/category.cpp backend/account.cpp @@ -34,6 +38,10 @@ set( knipptasch_core_HEADERS exportplugin.h importplugin.h + widgets/dateedit.h + widgets/datevalidator.h + widgets/datepickerpopup.h + backend/object.h backend/category.h backend/account.h @@ -46,10 +54,14 @@ set( knipptasch_core_HEADERS ) -qt4_wrap_cpp( knipptasch_core_SOURCES ${knipptasch_core_HEADERS} ) -add_library( knipptasch SHARED ${knipptasch_core_SOURCES} ) - -target_link_libraries( knipptasch ${QT_LIBRARIES} modeltest ) +if( HAVE_KDE ) + kde4_add_library( knipptasch SHARED ${knipptasch_core_SOURCES} ) + target_link_libraries( knipptasch ${QT_LIBRARIES} modeltest compat ) +else( HAVE_KDE ) + qt4_wrap_cpp( knipptasch_core_SOURCES ${knipptasch_core_HEADERS} ) + add_library( knipptasch SHARED ${knipptasch_core_SOURCES} ) + target_link_libraries( knipptasch ${QT_LIBRARIES} ${KDE4_KDECORE_LIBS} ${KDE4_KDEUI_LIBS} modeltest compat ) +endif( HAVE_KDE ) set_target_properties( knipptasch @@ -58,4 +70,5 @@ set_target_properties( SOVERSION "${knipptasch_core_MAJOR_VERSION}.${knipptasch_core_MINOR_VERSION}" ) + install( TARGETS knipptasch DESTINATION ${INSTALL_TARGETS_DEFAULT_ARGS} ) diff --git a/core/include/Knipptasch/DateEdit b/core/include/Knipptasch/DateEdit new file mode 100644 index 0000000..fe90ef3 --- /dev/null +++ b/core/include/Knipptasch/DateEdit @@ -0,0 +1 @@ +#include diff --git a/core/include/Knipptasch/DateValidator b/core/include/Knipptasch/DateValidator new file mode 100644 index 0000000..7565ac8 --- /dev/null +++ b/core/include/Knipptasch/DateValidator @@ -0,0 +1 @@ +#include diff --git a/core/widgets/dateedit.cpp b/core/widgets/dateedit.cpp new file mode 100644 index 0000000..fc58109 --- /dev/null +++ b/core/widgets/dateedit.cpp @@ -0,0 +1,614 @@ +/* + * Copyright 2010 by Stefan Böhmann + * + * Based on KDateEdit (part of libkdepim) + * Copyright (c) 2002 Cornelius Schumacher + * Copyright (c) 2002,2010 David Jarvie + * Copyright (c) 2003-2004 Reinhold Kainhofer + * Copyright (c) 2004 Tobias Koenig + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#include "dateedit.h" + +#include "datevalidator.h" +#include "datepickerpopup.h" + +#include "compat/utils.h" + +#if defined(HAVE_KDE) +#include +#include +#include +#include +#include +#include +#else +#include +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include + + + +class DateEdit::Private +{ + public: + Private(DateEdit *qq) + : q( qq ), + mPopup( 0 ), + mReadOnly( false ), + mDiscardNextMousePress( false ) + { + } + + QDate parseDate(bool *replaced = 0) const; + void updateView(); + void setupKeywords(); + bool newDateEntered(const QDate &newDate); + + public: + // slots + void lineEnterPressed(); + void slotTextChanged(const QString &str); + void dateSelected(const QDate &dt); + + DateEdit *q; + DatePickerPopup *mPopup; + + QDate mDate; + QDate mMinDate; // minimum allowed date, or invalid for no minimum + QDate mMaxDate; // maximum allowed date, or invalid for no maximum + QString mMinDateErrString; // error message when entered date < mMinDate + QString mMaxDateErrString; // error message when entered date > mMaxDate + bool mReadOnly; + bool mTextChanged; + bool mDiscardNextMousePress; + + QMap mKeywordMap; +}; + + +QDate DateEdit::Private::parseDate(bool *replaced) const +{ + const QString text = q->currentText(); + + if( replaced ) { + (*replaced) = false; + } + + QDate result; + if( text.isEmpty() ) { + result = QDate(); + } + else if( mKeywordMap.contains( text.toLower() ) ) { + const QDate today = QDate::currentDate(); + int i = mKeywordMap[ text.toLower() ]; + + if ( i >= 100 ) { + /* A day name has been entered. Convert to offset from today. + * This uses some math tricks to figure out the offset in days + * to the next date the given day of the week occurs. There + * are two cases, that the new day is >= the current day, which means + * the new day has not occurred yet or that the new day < the current day, + * which means the new day is already passed (so we need to find the + * day in the next week). + */ + i -= 100; + + const int currentDay = today.dayOfWeek(); + if( i >= currentDay ) { + i -= currentDay; + } + else { + i += 7 - currentDay; + } + } + + result = today.addDays( i ); + if( replaced ) { + (*replaced) = true; + } + } + else { + result = readDate( text ); + } + + return result; +} + + +void DateEdit::Private::updateView() +{ + QString dateString; + if( mDate.isValid() ) { + dateString = formatShortDate( mDate ); + } + + // We do not want to generate a signal here, + // since we explicitly setting the date + const bool blocked = q->signalsBlocked(); + q->blockSignals( true ); + q->removeItem( 0 ); + q->insertItem( 0, dateString ); + q->blockSignals( blocked ); +} + + +void DateEdit::Private::setupKeywords() +{ + // Create the keyword list. This will be used to match against when the user + // enters information. + mKeywordMap.insert( tr( "tomorrow" ), 1 ); + mKeywordMap.insert( tr( "today" ), 0 ); + mKeywordMap.insert( tr( "yesterday" ), -1 ); + + QString dayName; + for ( int i = 1; i <= 7; ++i ) { +#if defined(HAVE_KDE) + dayName = KGlobal::locale()->calendar()->weekDayName( i ).toLower(); +#else + dayName = QDate::longDayName( i ).toLower(); +#endif + mKeywordMap.insert( dayName, i + 100 ); + } +} + + +// Check a new date against any minimum or maximum date. +bool DateEdit::Private::newDateEntered(const QDate &newDate) +{ + QDate date = newDate; + if( newDate.isValid() ) { + QString errString; + QString message; + if( mMinDate.isValid() && newDate < mMinDate ) { + message = tr( "Date cannot be earlier than %1" ) + .arg( mMinDate == QDate::currentDate() + ? tr( "today" ) + : formatShortDate( mMinDate ) ); + + errString = mMinDateErrString; + date = mMinDate; + } + else if( mMaxDate.isValid() && newDate > mMaxDate ) { + message = tr( "Date cannot be later than %1" ) + .arg( mMinDate == QDate::currentDate() + ? tr( "today" ) + : formatShortDate( mMinDate ) ); + + errString = mMaxDateErrString; + date = mMaxDate; + } + + if( !message.isEmpty() ) { + q->assignDate( date ); + updateView(); + +#if defined(HAVE_KDE) + KMessageBox::sorry( q, errString ); +#else + QMessageBox::information( q, tr( "Sorry" ), errString ); +#endif + } + } + + emit q->dateChanged( date ); + emit q->dateEdited( date ); + emit q->dateEntered( date ); + + return date.isValid(); +} + + +void DateEdit::Private::lineEnterPressed() +{ + bool replaced = false; + const QDate date = parseDate( &replaced ); + + if( q->assignDate( date ) ) { + if( replaced ) { + updateView(); + } + + newDateEntered( date ); + } +} + + +void DateEdit::Private::slotTextChanged(const QString &str) +{ + Q_UNUSED( str ); + const QDate date = parseDate(); + + if( q->assignDate( date ) ) { + emit q->dateEdited( date ); + emit q->dateChanged( date ); + } + + mTextChanged = true; +} + + +void DateEdit::Private::dateSelected(const QDate &date) +{ + if( q->assignDate( date ) ) { + updateView(); + if( newDateEntered( date ) ) { + mPopup->hide(); + } + } +} + + +DateEdit::DateEdit(QWidget *parent) +#if defined( HAVE_KDE ) + : KComboBox( parent ), +#else + : QComboBox( parent ), +#endif + d( new Private( this ) ) +{ + // need at least one entry for popup to work + setMaxCount( 1 ); + setEditable( true ); + + const QString today = formatShortDate( d->mDate ); + + addItem( today ); + setCurrentIndex( 0 ); + + connect( lineEdit(), SIGNAL( returnPressed() ), + this, SLOT( lineEnterPressed() ) ); + connect( this, SIGNAL( editTextChanged( const QString& ) ), + this, SLOT( slotTextChanged( const QString& ) ) ); + + d->mPopup = new DatePickerPopup( + DatePickerPopup::NoDate + | DatePickerPopup::DatePicker + | DatePickerPopup::Words, + QDate::currentDate(), this ); + + d->mPopup->hide(); + d->mPopup->installEventFilter( this ); + + connect( d->mPopup, SIGNAL( dateChanged(const QDate&) ), this, SLOT( dateSelected(const QDate&) ) ); + + // handle keyword entry + d->setupKeywords(); + lineEdit()->installEventFilter( this ); + + setValidator( new DateValidator( QString(), d->mKeywordMap.keys(), this ) ); + + d->mTextChanged = false; +} + + +DateEdit::DateEdit(const QString &dateFormat, QWidget *parent) +#if defined( HAVE_KDE ) + : KComboBox( parent ), +#else + : QComboBox( parent ), +#endif + d( new Private( this ) ) +{ + // need at least one entry for popup to work + setMaxCount( 1 ); + setEditable( true ); + + const QString today = formatShortDate( d->mDate ); + + addItem( today ); + setCurrentIndex( 0 ); + + connect( lineEdit(), SIGNAL( returnPressed() ), + this, SLOT( lineEnterPressed() ) ); + connect( this, SIGNAL( editTextChanged( const QString& ) ), + this, SLOT( slotTextChanged( const QString& ) ) ); + + d->mPopup = new DatePickerPopup( + DatePickerPopup::NoDate + | DatePickerPopup::DatePicker + | DatePickerPopup::Words, + QDate::currentDate(), this ); + + d->mPopup->hide(); + d->mPopup->installEventFilter( this ); + + connect( d->mPopup, SIGNAL( dateChanged(const QDate&) ), this, SLOT( dateSelected(const QDate&) ) ); + + // handle keyword entry + d->setupKeywords(); + lineEdit()->installEventFilter( this ); + + setValidator( new DateValidator( dateFormat, d->mKeywordMap.keys(), this ) ); + + d->mTextChanged = false; +} + + +DateEdit::~DateEdit() +{ + delete d; +} + + +void DateEdit::setDate(const QDate &date) +{ + assignDate( date ); + d->updateView(); + + if( date.isValid() ) { + emit dateChanged( date ); + } +} + + +QDate DateEdit::date() const +{ + return d->mDate; +} + + +void DateEdit::setMinimumDate(const QDate &minDate, const QString &errorMsg) +{ + d->mMinDate = minDate; + + if( d->mMinDate.isValid() && date().isValid() && date() < d->mMinDate ) { + setDate( d->mMinDate ); + } + + d->mMinDateErrString = errorMsg; +} + + +QDate DateEdit::minimumDate() const +{ + return d->mMinDate; +} + + +void DateEdit::setMaximumDate(const QDate& maxDate, const QString& errorMsg) +{ + d->mMaxDate = maxDate; + + if( d->mMaxDate.isValid() && date().isValid() && date() > d->mMaxDate ) { + setDate( d->mMaxDate ); + } + + d->mMaxDateErrString = errorMsg; +} + + +QDate DateEdit::maximumDate() const +{ + return d->mMaxDate; +} + + +void DateEdit::setDateRange(const QDate& earliest, const QDate& latest, + const QString& earlyErrorMsg, const QString& lateErrorMsg) +{ + setMinimumDate( earliest, earlyErrorMsg ); + setMaximumDate( latest, lateErrorMsg ); +} + + +void DateEdit::setReadOnly(bool readOnly) +{ + d->mReadOnly = readOnly; + lineEdit()->setReadOnly( readOnly ); +} + + +bool DateEdit::isReadOnly() const +{ + return d->mReadOnly; +} + + +void DateEdit::showPopup() +{ + if( d->mReadOnly ) { + return; + } + + const QRect desk = +#if defined(HAVE_KDE) + KGlobalSettings::desktopGeometry( this ); +#else + QApplication::desktop()->screenGeometry( this ); +#endif + + QPoint popupPoint = mapToGlobal( QPoint( 0, 0 ) ); + + const int dateFrameHeight = d->mPopup->sizeHint().height(); + + if( popupPoint.y() + height() + dateFrameHeight > desk.bottom() ) { + popupPoint.setY( popupPoint.y() - dateFrameHeight ); + } + else { + popupPoint.setY( popupPoint.y() + height() ); + } + + const int dateFrameWidth = d->mPopup->sizeHint().width(); + if( popupPoint.x() + dateFrameWidth > desk.right() ) { + popupPoint.setX( desk.right() - dateFrameWidth ); + } + + if( popupPoint.x() < desk.left() ) { + popupPoint.setX( desk.left() ); + } + + if( popupPoint.y() < desk.top() ) { + popupPoint.setY( desk.top() ); + } + + if( d->mDate.isValid() ) { + d->mPopup->setDate( d->mDate ); + } + else { + d->mPopup->setDate( QDate::currentDate() ); + } + + d->mPopup->popup( popupPoint ); + + // The combo box is now shown pressed. Make it show not pressed again + // by causing its (invisible) list box to emit a 'selected' signal. + // First, ensure that the list box contains the date currently displayed. + const QDate date = d->parseDate(); + assignDate( date ); + d->updateView(); + + // Now, simulate an Enter to unpress it + QAbstractItemView *lb = view(); + if( lb ) { + lb->setCurrentIndex( lb->model()->index( 0, 0 ) ); + QKeyEvent *keyEvent = new QKeyEvent( QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier ); + QApplication::postEvent( lb, keyEvent ); + } +} + + +void DateEdit::focusOutEvent(QFocusEvent *event) +{ + if( d->mTextChanged ) { + d->lineEnterPressed(); + d->mTextChanged = false; + } + + QComboBox::focusOutEvent( event ); +} + + +void DateEdit::keyPressEvent(QKeyEvent *event) +{ + int step = 0; + + if( event->key() == Qt::Key_Up ) { + step = 1; + } + else if( event->key() == Qt::Key_Down ) { + step = -1; + } + + if( step && !d->mReadOnly ) { + QDate date = d->parseDate(); + if( date.isValid() ) { + date = date.addDays( step ); + if( assignDate( date ) ) { + d->updateView(); + d->newDateEntered( date ); + } + } + } + + QComboBox::keyPressEvent( event ); +} + + +bool DateEdit::eventFilter(QObject *object, QEvent *event) +{ + if( object == lineEdit() ) { + // We only process the focus out event if the text has changed + // since we got focus + if( (event->type() == QEvent::FocusOut) && d->mTextChanged ) { + d->lineEnterPressed(); + d->mTextChanged = false; + } + else if ( event->type() == QEvent::KeyPress ) { + // Up and down arrow keys step the date + QKeyEvent *keyEvent = (QKeyEvent *)event; + + if( keyEvent->key() == Qt::Key_Return ) { + d->lineEnterPressed(); + return true; + } + } + } + else { + // It's a date picker event + switch( event->type() ) { + case QEvent::MouseButtonDblClick: + case QEvent::MouseButtonPress: + { + QMouseEvent *mouseEvent = (QMouseEvent*)event; + if( !d->mPopup->rect().contains( mouseEvent->pos() ) ) { + const QPoint globalPos = d->mPopup->mapToGlobal( mouseEvent->pos() ); + + if( QApplication::widgetAt( globalPos ) == this ) { + // The date picker is being closed by a click on the + // DateEdit widget. Avoid popping it up again immediately. + d->mDiscardNextMousePress = true; + } + } + } + default: + break; + } + } + + return false; +} + + +void DateEdit::mousePressEvent(QMouseEvent *event) +{ + if( event->button() == Qt::LeftButton && d->mDiscardNextMousePress ) { + d->mDiscardNextMousePress = false; + return; + } + + QComboBox::mousePressEvent( event ); +} + + +bool DateEdit::assignDate(const QDate &date) +{ + d->mDate = date; + d->mTextChanged = false; + + return true; +} + + +void DateEdit::lineEnterPressed() +{ + d->lineEnterPressed(); +} + + +void DateEdit::slotTextChanged(const QString &str) +{ + d->slotTextChanged( str ); +} + + +void DateEdit::dateSelected(const QDate &dt) +{ + d->dateSelected( dt ); +} + + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/core/widgets/dateedit.h b/core/widgets/dateedit.h new file mode 100644 index 0000000..3af3b08 --- /dev/null +++ b/core/widgets/dateedit.h @@ -0,0 +1,247 @@ +/* + * Copyright 2010 by Stefan Böhmann + * + * Based on KDateEdit (part of libkdepim) + * Copyright (c) 2002 Cornelius Schumacher + * Copyright (c) 2002,2010 David Jarvie + * Copyright (c) 2004 Tobias Koenig + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#ifndef KNIPPTASCH_KDEPIM_KDATEEDIT_H +#define KNIPPTASCH_KDEPIM_KDATEEDIT_H + +#include "knipptasch_core_export.h" + +#include + + +#if defined( HAVE_KDE ) +#include +#else +#include +#endif + + +class QEvent; +class QMouseEvent; +class QStatusBar; + + +/** + @short A date editing widget that consists of an editable combo box. + + The combo box contains the date in text form, and clicking the combo + box arrow will display a 'popup' style date picker. + + This widget also supports advanced features like allowing the user + to type in the day name to get the date. The following keywords + are supported (in the native language): tomorrow, yesterday, today, + monday, tuesday, wednesday, thursday, friday, saturday, sunday. + The user may also use the up and down arrow on the keyboard to + increment and decrement the date. + + Upper and/or lower limits may be set on the range of dates which the + user is allowed to enter. + + @image html kdateedit.png "This is how it looks" + + @author Cornelius Schumacher + @author Mike Pilone + @author David Jarvie + @author Tobias Koenig + @author Stefan Böhmann +*/ + +#if defined( HAVE_KDE ) +class KNIPPTASCH_CORE_EXPORT DateEdit : public KComboBox +#else +class KNIPPTASCH_CORE_EXPORT DateEdit : public QComboBox +#endif +{ + Q_OBJECT + Q_PROPERTY(QDate date READ date WRITE setDate USER true) + + public: + /** + * Creates a new date edit. + * + * @param parent The parent widget. + */ + explicit DateEdit(QWidget *parent = 0); + + /** + * Creates a new date edit. + * + * @param dateFormat own date format string + * @param parent The parent widget. + */ + explicit DateEdit(const QString &dateFormat, QWidget *parent = 0); + + /** + * Destroys the date edit. + */ + virtual ~DateEdit(); + + /** + * Returns the date entered. + * + * @note This date could be invalid, you have to check validity yourself. + */ + QDate date() const; + + /** + * Sets the earliest date which can be entered. + * + * @param date Earliest date allowed, or invalid to remove the minimum limit. + * @param errorMsg Error message to be displayed when a date earlier than + * @p date is entered. Set to QString() to use the default + * error message. + * + * @see setDateRange() + */ + void setMinimumDate(const QDate &date, const QString &errorMsg = QString()); + + /** + * Returns the earliest date which can be entered. + * If there is no minimum date, returns an invalid date. + */ + QDate minimumDate() const; + + /** + * Sets the latest date which can be entered. + * + * @param date Latest date allowed, or invalid to remove the maximum limit. + * @param errorMsg Error message to be displayed when a date later than + * @p date is entered. Set to QString() to use the default + * error message. + * + * @see setDateRange() + */ + void setMaximumDate(const QDate& date, const QString& errorMsg = QString()); + + /** + * Returns the latest date which can be entered. + * If there is no maximum date, returns an invalid date. + */ + QDate maximumDate() const; + + /** + * Sets the range of dates which can be entered. + * + * @param earliest Earliest date allowed, or invalid to remove the minimum limit. + * @param latest Latest date allowed, or invalid to remove the maximum limit. + * @param earlyErrorMsg Error message to be displayed when a date earlier than + * @p earliest is entered. Set to QString() to use the default + * error message. + * @param lateErrorMsg Error message to be displayed when a date later than + * @p latest is entered. Set to QString() to use the default + * error message. + * + * @see setMinimumDate(), setMaximumDate() + */ + void setDateRange(const QDate &earliest, const QDate &latest, + const QString &earlyErrorMsg = QString(), + const QString &lateErrorMsg = QString()); + + /** + * Sets whether the widget is read-only for the user. If read-only, the + * date pop-up is inactive, and the displayed date cannot be edited. + * + * @param readOnly True to set the widget read-only, false to set it read-write. + */ + void setReadOnly(bool readOnly); + + /** + * Returns whether the widget is read-only. + */ + bool isReadOnly() const; + + /** + * Shows the date picker popup menu. + */ + virtual void showPopup(); + + Q_SIGNALS: + /** + * This signal is emitted whenever the user has entered a new date. + * When the user changes the date by editing the line edit field, + * the signal is not emitted until focus leaves the line edit field. + * The passed date can be invalid. + */ + void dateEntered(const QDate &date); + + /** + * This signal is emitted whenever date is changed. + * Unlike dateEdited(), this signal is also emitted when the date is changed + * programmatically. + * + * The passed date can be invalid. + */ + void dateChanged(const QDate &date); + + /** + * This signal is emitted whenever the date is edited by the user. + * Unlike dateChanged(), this signal is not emitted when the date is changed + * programmatically. + * + * The passed date can be invalid. + */ + void dateEdited(const QDate &date); + + public Q_SLOTS: + /** + * Sets the date. + * + * @param date The new date to display. This date must be valid or + * it will not be set + */ + void setDate(const QDate &date); + + protected: + virtual bool eventFilter(QObject *obj, QEvent *ev); + virtual void mousePressEvent(QMouseEvent *ev); + virtual void focusOutEvent(QFocusEvent *ev); + virtual void keyPressEvent(QKeyEvent *ev); + + /** + * Sets the date, without altering the display. + * This method is used internally to set the widget's date value. + * As a virtual method, it allows derived classes to perform additional + * validation on the date value before it is set. Derived classes should + * return true if QDate::isValid(@p date) returns false. + * + * @param date The new date to set. + * @return True if the date was set, false if it was considered invalid + * and remains unchanged. + */ + virtual bool assignDate(const QDate &date); + + private slots: + void lineEnterPressed(); + void slotTextChanged(const QString &str); + void dateSelected(const QDate &dt); + + private: + //@cond PRIVATE + class Private; + Private* const d; + //@endcond +}; + + +#endif + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/core/widgets/datepickerpopup.cpp b/core/widgets/datepickerpopup.cpp new file mode 100644 index 0000000..fbec80c --- /dev/null +++ b/core/widgets/datepickerpopup.cpp @@ -0,0 +1,258 @@ +/* + * Copyright 2010 by Stefan Böhmann + * + * Based on KDateEdit (part of libkdepim) + * Copyright (c) 2004 Bram Schoenmakers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#include "datepickerpopup.h" + +#if defined(HAVE_KDE) +#include +#include +#else +#include +#endif + +#include +#include + + + +class DatePickerAction : public QWidgetAction +{ + public: +#if defined(HAVE_KDE) + DatePickerAction(KDatePicker *widget, QObject *parent) +#else + DatePickerAction(QCalendarWidget *widget, QObject *parent) +#endif + : QWidgetAction( parent ), + mDatePicker( widget ), + mOriginalParent( widget->parentWidget() ) + { + } + + protected: + QWidget *createWidget(QWidget *parent) + { + mDatePicker->setParent( parent ); + return mDatePicker; + } + + void deleteWidget(QWidget *widget) + { + if( widget != mDatePicker ) { + return; + } + + mDatePicker->setParent( mOriginalParent ); + } + + private: +#if defined(HAVE_KDE) + KDatePicker *mDatePicker; +#else + QCalendarWidget *mDatePicker; +#endif + + QWidget *mOriginalParent; +}; + + +class DatePickerPopup::Private +{ + public: + Private(DatePickerPopup *qq) + : q( qq ), + mDatePicker( 0 ) + { + } + + void buildMenu(); + + void slotDateChanged(const QDate &dt); + void slotToday(); + void slotTomorrow(); + void slotNextWeek(); + void slotNextMonth(); + void slotNoDate(); + + DatePickerPopup *q; + +#if defined(HAVE_KDE) + KDatePicker *mDatePicker; +#else + QCalendarWidget *mDatePicker; +#endif + Modes mModes; +}; + + +void DatePickerPopup::Private::buildMenu() +{ + if( q->isVisible() ) { + return; + } + + q->clear(); + + if( mModes & DatePicker ) { + q->addAction( new DatePickerAction( mDatePicker, q ) ); + + if( (mModes & NoDate) || (mModes & Words) ) { + q->addSeparator(); + } + } + + if( mModes & Words ) { + q->addAction( tr( "&Today" ), q, SLOT( slotToday() ) ); + q->addAction( tr( "To&morrow" ), q, SLOT( slotTomorrow() ) ); + q->addAction( tr( "Next &Week" ), q, SLOT( slotNextWeek() ) ); + q->addAction( tr( "Next M&onth" ), q, SLOT( slotNextMonth() ) ); + + if( mModes & NoDate ) { + q->addSeparator(); + } + } + + if( mModes & NoDate ) { + q->addAction( tr( "No Date" ), q, SLOT( slotNoDate() ) ); + } +} + + +void DatePickerPopup::Private::slotDateChanged(const QDate &date) +{ + emit q->dateChanged( date ); + q->hide(); +} + + +void DatePickerPopup::Private::slotToday() +{ + emit q->dateChanged( QDate::currentDate() ); +} + + +void DatePickerPopup::Private::slotTomorrow() +{ + emit q->dateChanged( QDate::currentDate().addDays( 1 ) ); +} + + +void DatePickerPopup::Private::slotNoDate() +{ + emit q->dateChanged( QDate() ); +} + + +void DatePickerPopup::Private::slotNextWeek() +{ + emit q->dateChanged( QDate::currentDate().addDays( 7 ) ); +} + + +void DatePickerPopup::Private::slotNextMonth() +{ + emit q->dateChanged( QDate::currentDate().addMonths( 1 ) ); +} + + + +DatePickerPopup::DatePickerPopup(Modes modes, const QDate &date, QWidget *parent) + : QMenu( parent ), + d( new Private( this ) ) +{ + d->mModes = modes; + +#if defined(HAVE_KDE) + d->mDatePicker = new KDatePicker( this ); + d->mDatePicker->setCloseButton( false ); + + connect( d->mDatePicker, SIGNAL( dateEntered( const QDate& ) ), + this, SLOT( slotDateChanged( const QDate& ) ) ); + connect( d->mDatePicker, SIGNAL( dateSelected( const QDate& ) ), + this, SLOT( slotDateChanged( const QDate& ) ) ); +#else + d->mDatePicker = new QCalendarWidget( this ); + + connect( d->mDatePicker, SIGNAL( activated( const QDate& ) ), + this, SLOT( slotDateChanged( const QDate& ) ) ); + connect( d->mDatePicker, SIGNAL( clicked( const QDate& ) ), + this, SLOT( slotDateChanged( const QDate& ) ) ); +#endif + + setDate( date ); + d->buildMenu(); +} + + +DatePickerPopup::~DatePickerPopup() +{ + delete d; +} + + +void DatePickerPopup::setDate(const QDate &date) +{ +#if defined(HAVE_KDE) + d->mDatePicker->setDate( date ); +#else + d->mDatePicker->setSelectedDate( date ); +#endif +} + + +void DatePickerPopup::slotDateChanged(const QDate &date) +{ + d->slotDateChanged( date ); +} + + +void DatePickerPopup::slotToday() +{ + d->slotToday(); +} + + +void DatePickerPopup::slotTomorrow() +{ + d->slotTomorrow(); +} + + +void DatePickerPopup::slotNextWeek() +{ + d->slotNextWeek(); +} + + +void DatePickerPopup::slotNextMonth() +{ + d->slotNextMonth(); +} + + +void DatePickerPopup::slotNoDate() +{ + d->slotNoDate(); +} + + +//#include "datepickerpopup.moc" + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/core/widgets/datepickerpopup.h b/core/widgets/datepickerpopup.h new file mode 100644 index 0000000..ccea129 --- /dev/null +++ b/core/widgets/datepickerpopup.h @@ -0,0 +1,113 @@ +/* + * Copyright 2010 by Stefan Böhmann + * + * Based on KDateEdit (part of libkdepim) + * Copyright (c) 2004 Bram Schoenmakers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ +#ifndef KNIPPTASCH_CORE_DATEPICKERPOPUP_H +#define KNIPPTASCH_CORE_DATEPICKERPOPUP_H + +#include +#include + + +/** + * @short This menu helps the user to select a date quickly. + * + * This menu helps the user to select a date quickly. It offers various + * modes of selecting, e.g. with a DatePicker or with words like "Tomorrow". + * + * The available modes are: + * + * @li NoDate: A menu-item with "No Date". If chosen, the datepicker will emit + * a null QDate. + * @li DatePicker: Shows a DatePicker-widget. + * @li Words: Shows items like "Today", "Tomorrow" or "Next Week". + * + * @author Bram Schoenmakers + */ +class DatePickerPopup: public QMenu +{ + Q_OBJECT + + public: + /** + * Describes the available selection modes. + */ + enum Mode + { + NoDate = 1, ///< A menu-item with "No Date". Will always return an invalid date. + DatePicker = 2, ///< A menu-item with a DatePicker. + Words = 4 ///< A menu-item with list of words that describe a date. + }; + + /** + * Describes the a set of combined modes. + */ + Q_DECLARE_FLAGS( Modes, Mode ) + + /** + * Creates a new date picker popup. + * + * @param modes The selection modes that shall be offered + * @param date The initial date of date picker widget. + * @param parent The parent object. + */ + explicit DatePickerPopup(Modes modes = DatePicker, + const QDate &date = QDate::currentDate(), + QWidget *parent = 0); + + /** + * Destroys the date picker popup. + */ + ~DatePickerPopup(); + + public Q_SLOTS: + /** + * Sets the current @p date. + */ + void setDate(const QDate &date); + + Q_SIGNALS: + /** + * This signal is emitted whenever the user has selected a new date. + * + * @param date The new date. + */ + void dateChanged(const QDate &date); + + private slots: + void slotDateChanged(const QDate &dt); + void slotToday(); + void slotTomorrow(); + void slotNextWeek(); + void slotNextMonth(); + void slotNoDate(); + + private: + //@cond PRIVATE + class Private; + Private* const d; + //@endcond +}; + + +Q_DECLARE_OPERATORS_FOR_FLAGS( DatePickerPopup::Modes ) + +#endif + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/core/widgets/datevalidator.cpp b/core/widgets/datevalidator.cpp new file mode 100644 index 0000000..03d15ba --- /dev/null +++ b/core/widgets/datevalidator.cpp @@ -0,0 +1,140 @@ +/* + * Copyright 2011 by Stefan Böhmann + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include "datevalidator.h" + +#include "compat/utils.h" + +#include +#include +#include +#include + + + +DateValidator::DateValidator(QWidget *parent) + : QValidator( parent ), + m_statusTipEnabled( true ) +{ +} + + +DateValidator::DateValidator(const QString &dateFormat, QWidget *parent) + : QValidator( parent ), + m_dateFormat( dateFormat ), + m_statusTipEnabled( true ) +{ +} + + +DateValidator::DateValidator(const QString &dateFormat, const QStringList &keywords, QWidget *parent) + : QValidator( parent ), + m_keywords( keywords ), + m_dateFormat( dateFormat ), + m_statusTipEnabled( true ) +{ +} + + +DateValidator::~DateValidator() +{ + if( m_statusTipEnabled ) { + QStatusTipEvent *event = new QStatusTipEvent( "" ); + qApp->sendEvent( parent(), event ); + } +} + + +QValidator::State DateValidator::validate(QString &str, int &value) const +{ + Q_UNUSED( value ); + + if( m_statusTipEnabled ) { + QStatusTipEvent *event = new QStatusTipEvent( "" ); + qApp->sendEvent( parent(), event ); + } + + // empty string is intermediate so one can clear the + // edit line and start from scratch + if( str.isEmpty() ) { + return Intermediate; + } + + if( m_keywords.contains( str.toLower() ) ) { + return Acceptable; + } + + bool ok = false; + QDate date = readDate( str, m_dateFormat, &ok ); + + if( ok ) { + if( m_statusTipEnabled ) { + QStatusTipEvent *event = new QStatusTipEvent( formatLongDate( date ) ); + qApp->sendEvent( parent(), event ); + } + + return Acceptable; + } + + return Intermediate; +} + + +QStringList DateValidator::keywordList() const +{ + return m_keywords; +} + + +void DateValidator::setKeywordList(const QStringList &list) +{ + m_keywords = list; +} + + +QString DateValidator::dateFormat() const +{ + return m_dateFormat; +} + + +void DateValidator::setDateFormat(const QString &dateFormat) +{ + m_dateFormat = dateFormat; +} + + +bool DateValidator::statusTipEnabled() const +{ + return m_statusTipEnabled; +} + + +void DateValidator::setStatusTipEnabled(bool enabled) +{ + if( m_statusTipEnabled != enabled ) { + if( m_statusTipEnabled ) { + QStatusTipEvent *event = new QStatusTipEvent( "" ); + qApp->sendEvent( parent(), event ); + } + + m_statusTipEnabled = enabled; + } +} + + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/core/widgets/datevalidator.h b/core/widgets/datevalidator.h new file mode 100644 index 0000000..aa1c4a7 --- /dev/null +++ b/core/widgets/datevalidator.h @@ -0,0 +1,65 @@ +/* + * Copyright 2011 by Stefan Böhmann + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef KNIPPTASCH_DATEVALIDATOR_H +#define KNIPPTASCH_DATEVALIDATOR_H + +#include "knipptasch_core_export.h" + +#include +#include + + +/** + * @class DateValidator + * @brief + * + * @author Stefan Böhmann + */ +class KNIPPTASCH_CORE_EXPORT DateValidator : public QValidator +{ + Q_OBJECT + + public: + explicit DateValidator(QWidget *parent = 0); + explicit DateValidator(const QString &dateFormat, QWidget *parent = 0); + DateValidator(const QString &dateFormat, const QStringList &keywords, QWidget *parent = 0); + + ~DateValidator(); + + State validate(QString &str, int &value) const; + + QStringList keywordList() const; + QString dateFormat() const; + + bool statusTipEnabled() const; + + public slots: + void setKeywordList(const QStringList &list); + void setDateFormat(const QString &dateFormat); + void setStatusTipEnabled(bool enabled); + + private: + QStringList m_keywords; + QString m_dateFormat; + bool m_statusTipEnabled; +}; + + +#endif + +// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; +// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index 41991ef..2f33598 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -11,10 +11,8 @@ set(knipptasch_SOURCES quickreportpopup.cpp quickreportwidget.cpp passworddialog.cpp - datepickerpopup.cpp categorycombobox.cpp categorymodel.cpp - dateedit.cpp main.cpp config/configdialog.cpp @@ -56,10 +54,8 @@ set( knipptasch_HEADERS quickreportpopup.h quickreportwidget.h passworddialog.h - datepickerpopup.h categorycombobox.h categorymodel.h - dateedit.h config/configdialog.h config/configwidget.h diff --git a/gui/dateedit.cpp b/gui/dateedit.cpp deleted file mode 100644 index 02ad300..0000000 --- a/gui/dateedit.cpp +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright 2010 by Stefan Böhmann - * - * Based on KDateEdit (part of libkdepim) - * Copyright (c) 2002 Cornelius Schumacher - * Copyright (c) 2002,2010 David Jarvie - * Copyright (c) 2003-2004 Reinhold Kainhofer - * Copyright (c) 2004 Tobias Koenig - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ -#include "dateedit.h" - -#include "datepickerpopup.h" - -#include "preferences.h" - -#include "compat/utils.h" - -#if defined(HAVE_KDE) -#include -#include -#include -#include -#include -#include -#else -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include - - -class DateValidator : public QValidator -{ - public: - DateValidator(const QStringList &keywords, QWidget *parent) - : QValidator( parent ), - mKeywords( keywords ) - { - } - - ~DateValidator() - { - QStatusTipEvent *event = new QStatusTipEvent( "" ); - qApp->sendEvent( parent(), event ); - } - - - virtual State validate(QString &str, int &value) const - { - Q_UNUSED( value ); - - QStatusTipEvent *event = new QStatusTipEvent( "" ); - qApp->sendEvent( parent(), event ); - - // empty string is intermediate so one can clear the - // edit line and start from scratch - if( str.isEmpty() ) { - return Intermediate; - } - - if( mKeywords.contains( str.toLower() ) ) { - return Acceptable; - } - - bool ok = false; - QDate date = readDate( str, Preferences::self()->userDefinedDateFormat(), &ok ); - - if( ok ) { - QStatusTipEvent *event = new QStatusTipEvent( formatLongDate( date ) ); - qApp->sendEvent( parent(), event ); - - return Acceptable; - } - - return Intermediate; - } - - private: - QStringList mKeywords; -}; - - -class DateEdit::Private -{ - public: - Private(DateEdit *qq) - : q( qq ), - mPopup( 0 ), - mReadOnly( false ), - mDiscardNextMousePress( false ) - { - } - - QDate parseDate(bool *replaced = 0) const; - void updateView(); - void setupKeywords(); - bool newDateEntered(const QDate &newDate); - - public: - // slots - void lineEnterPressed(); - void slotTextChanged(const QString &str); - void dateSelected(const QDate &dt); - - DateEdit *q; - DatePickerPopup *mPopup; - - QDate mDate; - QDate mMinDate; // minimum allowed date, or invalid for no minimum - QDate mMaxDate; // maximum allowed date, or invalid for no maximum - QString mMinDateErrString; // error message when entered date < mMinDate - QString mMaxDateErrString; // error message when entered date > mMaxDate - bool mReadOnly; - bool mTextChanged; - bool mDiscardNextMousePress; - - QMap mKeywordMap; -}; - - -QDate DateEdit::Private::parseDate(bool *replaced) const -{ - const QString text = q->currentText(); - - if( replaced ) { - (*replaced) = false; - } - - QDate result; - if( text.isEmpty() ) { - result = QDate(); - } - else if( mKeywordMap.contains( text.toLower() ) ) { - const QDate today = QDate::currentDate(); - int i = mKeywordMap[ text.toLower() ]; - - if ( i >= 100 ) { - /* A day name has been entered. Convert to offset from today. - * This uses some math tricks to figure out the offset in days - * to the next date the given day of the week occurs. There - * are two cases, that the new day is >= the current day, which means - * the new day has not occurred yet or that the new day < the current day, - * which means the new day is already passed (so we need to find the - * day in the next week). - */ - i -= 100; - - const int currentDay = today.dayOfWeek(); - if( i >= currentDay ) { - i -= currentDay; - } - else { - i += 7 - currentDay; - } - } - - result = today.addDays( i ); - if( replaced ) { - (*replaced) = true; - } - } - else { - result = readDate( text ); - } - - return result; -} - - -void DateEdit::Private::updateView() -{ - QString dateString; - if( mDate.isValid() ) { - dateString = formatShortDate( mDate ); - } - - // We do not want to generate a signal here, - // since we explicitly setting the date - const bool blocked = q->signalsBlocked(); - q->blockSignals( true ); - q->removeItem( 0 ); - q->insertItem( 0, dateString ); - q->blockSignals( blocked ); -} - - -void DateEdit::Private::setupKeywords() -{ - // Create the keyword list. This will be used to match against when the user - // enters information. - mKeywordMap.insert( tr( "tomorrow" ), 1 ); - mKeywordMap.insert( tr( "today" ), 0 ); - mKeywordMap.insert( tr( "yesterday" ), -1 ); - - QString dayName; - for ( int i = 1; i <= 7; ++i ) { -#if defined(HAVE_KDE) - dayName = KGlobal::locale()->calendar()->weekDayName( i ).toLower(); -#else - dayName = QDate::longDayName( i ).toLower(); -#endif - mKeywordMap.insert( dayName, i + 100 ); - } -} - - -// Check a new date against any minimum or maximum date. -bool DateEdit::Private::newDateEntered(const QDate &newDate) -{ - QDate date = newDate; - if( newDate.isValid() ) { - QString errString; - QString message; - if( mMinDate.isValid() && newDate < mMinDate ) { - message = tr( "Date cannot be earlier than %1" ) - .arg( mMinDate == QDate::currentDate() - ? tr( "today" ) - : formatShortDate( mMinDate ) ); - - errString = mMinDateErrString; - date = mMinDate; - } - else if( mMaxDate.isValid() && newDate > mMaxDate ) { - message = tr( "Date cannot be later than %1" ) - .arg( mMinDate == QDate::currentDate() - ? tr( "today" ) - : formatShortDate( mMinDate ) ); - - errString = mMaxDateErrString; - date = mMaxDate; - } - - if( !message.isEmpty() ) { - q->assignDate( date ); - updateView(); - -#if defined(HAVE_KDE) - KMessageBox::sorry( q, errString ); -#else - QMessageBox::information( q, tr( "Sorry" ), errString ); -#endif - } - } - - emit q->dateChanged( date ); - emit q->dateEdited( date ); - emit q->dateEntered( date ); - - return date.isValid(); -} - - -void DateEdit::Private::lineEnterPressed() -{ - bool replaced = false; - const QDate date = parseDate( &replaced ); - - if( q->assignDate( date ) ) { - if( replaced ) { - updateView(); - } - - newDateEntered( date ); - } -} - - -void DateEdit::Private::slotTextChanged(const QString &str) -{ - Q_UNUSED( str ); - const QDate date = parseDate(); - - if( q->assignDate( date ) ) { - emit q->dateEdited( date ); - emit q->dateChanged( date ); - } - - mTextChanged = true; -} - - -void DateEdit::Private::dateSelected(const QDate &date) -{ - if( q->assignDate( date ) ) { - updateView(); - if( newDateEntered( date ) ) { - mPopup->hide(); - } - } -} - - -DateEdit::DateEdit(QWidget *parent) -#if defined( HAVE_KDE ) - : KComboBox( parent ), -#else - : QComboBox( parent ), -#endif - d( new Private( this ) ) -{ - - // need at least one entry for popup to work - setMaxCount( 1 ); - setEditable( true ); - - const QString today = formatShortDate( d->mDate ); - - addItem( today ); - setCurrentIndex( 0 ); - - connect( lineEdit(), SIGNAL( returnPressed() ), - this, SLOT( lineEnterPressed() ) ); - connect( this, SIGNAL( editTextChanged( const QString& ) ), - this, SLOT( slotTextChanged( const QString& ) ) ); - - d->mPopup = new DatePickerPopup( - DatePickerPopup::NoDate - | DatePickerPopup::DatePicker - | DatePickerPopup::Words, - QDate::currentDate(), this ); - - d->mPopup->hide(); - d->mPopup->installEventFilter( this ); - - connect( d->mPopup, SIGNAL( dateChanged(const QDate&) ), this, SLOT( dateSelected(const QDate&) ) ); - - // handle keyword entry - d->setupKeywords(); - lineEdit()->installEventFilter( this ); - - setValidator( new DateValidator( d->mKeywordMap.keys(), this ) ); - - d->mTextChanged = false; -} - - -DateEdit::~DateEdit() -{ - delete d; -} - - -void DateEdit::setDate(const QDate &date) -{ - assignDate( date ); - d->updateView(); - - if( date.isValid() ) { - emit dateChanged( date ); - } -} - - -QDate DateEdit::date() const -{ - return d->mDate; -} - - -void DateEdit::setMinimumDate(const QDate &minDate, const QString &errorMsg) -{ - d->mMinDate = minDate; - - if( d->mMinDate.isValid() && date().isValid() && date() < d->mMinDate ) { - setDate( d->mMinDate ); - } - - d->mMinDateErrString = errorMsg; -} - - -QDate DateEdit::minimumDate() const -{ - return d->mMinDate; -} - - -void DateEdit::setMaximumDate(const QDate& maxDate, const QString& errorMsg) -{ - d->mMaxDate = maxDate; - - if( d->mMaxDate.isValid() && date().isValid() && date() > d->mMaxDate ) { - setDate( d->mMaxDate ); - } - - d->mMaxDateErrString = errorMsg; -} - - -QDate DateEdit::maximumDate() const -{ - return d->mMaxDate; -} - - -void DateEdit::setDateRange(const QDate& earliest, const QDate& latest, - const QString& earlyErrorMsg, const QString& lateErrorMsg) -{ - setMinimumDate( earliest, earlyErrorMsg ); - setMaximumDate( latest, lateErrorMsg ); -} - - -void DateEdit::setReadOnly(bool readOnly) -{ - d->mReadOnly = readOnly; - lineEdit()->setReadOnly( readOnly ); -} - - -bool DateEdit::isReadOnly() const -{ - return d->mReadOnly; -} - - -void DateEdit::showPopup() -{ - if( d->mReadOnly ) { - return; - } - - const QRect desk = -#if defined(HAVE_KDE) - KGlobalSettings::desktopGeometry( this ); -#else - QApplication::desktop()->screenGeometry( this ); -#endif - - QPoint popupPoint = mapToGlobal( QPoint( 0, 0 ) ); - - const int dateFrameHeight = d->mPopup->sizeHint().height(); - - if( popupPoint.y() + height() + dateFrameHeight > desk.bottom() ) { - popupPoint.setY( popupPoint.y() - dateFrameHeight ); - } - else { - popupPoint.setY( popupPoint.y() + height() ); - } - - const int dateFrameWidth = d->mPopup->sizeHint().width(); - if( popupPoint.x() + dateFrameWidth > desk.right() ) { - popupPoint.setX( desk.right() - dateFrameWidth ); - } - - if( popupPoint.x() < desk.left() ) { - popupPoint.setX( desk.left() ); - } - - if( popupPoint.y() < desk.top() ) { - popupPoint.setY( desk.top() ); - } - - if( d->mDate.isValid() ) { - d->mPopup->setDate( d->mDate ); - } - else { - d->mPopup->setDate( QDate::currentDate() ); - } - - d->mPopup->popup( popupPoint ); - - // The combo box is now shown pressed. Make it show not pressed again - // by causing its (invisible) list box to emit a 'selected' signal. - // First, ensure that the list box contains the date currently displayed. - const QDate date = d->parseDate(); - assignDate( date ); - d->updateView(); - - // Now, simulate an Enter to unpress it - QAbstractItemView *lb = view(); - if( lb ) { - lb->setCurrentIndex( lb->model()->index( 0, 0 ) ); - QKeyEvent *keyEvent = new QKeyEvent( QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier ); - QApplication::postEvent( lb, keyEvent ); - } -} - - -void DateEdit::focusOutEvent(QFocusEvent *event) -{ - if( d->mTextChanged ) { - d->lineEnterPressed(); - d->mTextChanged = false; - } - - QComboBox::focusOutEvent( event ); -} - - -void DateEdit::keyPressEvent(QKeyEvent *event) -{ - int step = 0; - - if( event->key() == Qt::Key_Up ) { - step = 1; - } - else if( event->key() == Qt::Key_Down ) { - step = -1; - } - - if( step && !d->mReadOnly ) { - QDate date = d->parseDate(); - if( date.isValid() ) { - date = date.addDays( step ); - if( assignDate( date ) ) { - d->updateView(); - d->newDateEntered( date ); - } - } - } - - QComboBox::keyPressEvent( event ); -} - - -bool DateEdit::eventFilter(QObject *object, QEvent *event) -{ - if( object == lineEdit() ) { - // We only process the focus out event if the text has changed - // since we got focus - if( (event->type() == QEvent::FocusOut) && d->mTextChanged ) { - d->lineEnterPressed(); - d->mTextChanged = false; - } - else if ( event->type() == QEvent::KeyPress ) { - // Up and down arrow keys step the date - QKeyEvent *keyEvent = (QKeyEvent *)event; - - if( keyEvent->key() == Qt::Key_Return ) { - d->lineEnterPressed(); - return true; - } - } - } - else { - // It's a date picker event - switch( event->type() ) { - case QEvent::MouseButtonDblClick: - case QEvent::MouseButtonPress: - { - QMouseEvent *mouseEvent = (QMouseEvent*)event; - if( !d->mPopup->rect().contains( mouseEvent->pos() ) ) { - const QPoint globalPos = d->mPopup->mapToGlobal( mouseEvent->pos() ); - - if( QApplication::widgetAt( globalPos ) == this ) { - // The date picker is being closed by a click on the - // DateEdit widget. Avoid popping it up again immediately. - d->mDiscardNextMousePress = true; - } - } - } - default: - break; - } - } - - return false; -} - - -void DateEdit::mousePressEvent(QMouseEvent *event) -{ - if( event->button() == Qt::LeftButton && d->mDiscardNextMousePress ) { - d->mDiscardNextMousePress = false; - return; - } - - QComboBox::mousePressEvent( event ); -} - - -bool DateEdit::assignDate(const QDate &date) -{ - d->mDate = date; - d->mTextChanged = false; - - return true; -} - - -void DateEdit::lineEnterPressed() -{ - d->lineEnterPressed(); -} - - -void DateEdit::slotTextChanged(const QString &str) -{ - d->slotTextChanged( str ); -} - - -void DateEdit::dateSelected(const QDate &dt) -{ - d->dateSelected( dt ); -} - - -// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; -// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/dateedit.h b/gui/dateedit.h deleted file mode 100644 index d37a7f4..0000000 --- a/gui/dateedit.h +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright 2010 by Stefan Böhmann - * - * Based on KDateEdit (part of libkdepim) - * Copyright (c) 2002 Cornelius Schumacher - * Copyright (c) 2002,2010 David Jarvie - * Copyright (c) 2004 Tobias Koenig - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ -#ifndef KNIPPTASCH_KDEPIM_KDATEEDIT_H -#define KNIPPTASCH_KDEPIM_KDATEEDIT_H - -#include - -#if defined( HAVE_KDE ) -#include -#else -#include -#endif - - -class QEvent; -class QMouseEvent; -class QStatusBar; - - -/** - @short A date editing widget that consists of an editable combo box. - - The combo box contains the date in text form, and clicking the combo - box arrow will display a 'popup' style date picker. - - This widget also supports advanced features like allowing the user - to type in the day name to get the date. The following keywords - are supported (in the native language): tomorrow, yesterday, today, - monday, tuesday, wednesday, thursday, friday, saturday, sunday. - The user may also use the up and down arrow on the keyboard to - increment and decrement the date. - - Upper and/or lower limits may be set on the range of dates which the - user is allowed to enter. - - @image html kdateedit.png "This is how it looks" - - @author Cornelius Schumacher - @author Mike Pilone - @author David Jarvie - @author Tobias Koenig - @author Stefan Böhmann -*/ - -#if defined( HAVE_KDE ) -class DateEdit : public KComboBox -#else -class DateEdit : public QComboBox -#endif -{ - Q_OBJECT - Q_PROPERTY(QDate date READ date WRITE setDate USER true) - - public: - /** - * Creates a new date edit. - * - * @param parent The parent widget. - */ - explicit DateEdit(QWidget *parent = 0); - - /** - * Destroys the date edit. - */ - virtual ~DateEdit(); - - /** - * Returns the date entered. - * - * @note This date could be invalid, you have to check validity yourself. - */ - QDate date() const; - - /** - * Sets the earliest date which can be entered. - * - * @param date Earliest date allowed, or invalid to remove the minimum limit. - * @param errorMsg Error message to be displayed when a date earlier than - * @p date is entered. Set to QString() to use the default - * error message. - * - * @see setDateRange() - */ - void setMinimumDate(const QDate &date, const QString &errorMsg = QString()); - - /** - * Returns the earliest date which can be entered. - * If there is no minimum date, returns an invalid date. - */ - QDate minimumDate() const; - - /** - * Sets the latest date which can be entered. - * - * @param date Latest date allowed, or invalid to remove the maximum limit. - * @param errorMsg Error message to be displayed when a date later than - * @p date is entered. Set to QString() to use the default - * error message. - * - * @see setDateRange() - */ - void setMaximumDate(const QDate& date, const QString& errorMsg = QString()); - - /** - * Returns the latest date which can be entered. - * If there is no maximum date, returns an invalid date. - */ - QDate maximumDate() const; - - /** - * Sets the range of dates which can be entered. - * - * @param earliest Earliest date allowed, or invalid to remove the minimum limit. - * @param latest Latest date allowed, or invalid to remove the maximum limit. - * @param earlyErrorMsg Error message to be displayed when a date earlier than - * @p earliest is entered. Set to QString() to use the default - * error message. - * @param lateErrorMsg Error message to be displayed when a date later than - * @p latest is entered. Set to QString() to use the default - * error message. - * - * @see setMinimumDate(), setMaximumDate() - */ - void setDateRange(const QDate &earliest, const QDate &latest, - const QString &earlyErrorMsg = QString(), - const QString &lateErrorMsg = QString()); - - /** - * Sets whether the widget is read-only for the user. If read-only, the - * date pop-up is inactive, and the displayed date cannot be edited. - * - * @param readOnly True to set the widget read-only, false to set it read-write. - */ - void setReadOnly(bool readOnly); - - /** - * Returns whether the widget is read-only. - */ - bool isReadOnly() const; - - /** - * Shows the date picker popup menu. - */ - virtual void showPopup(); - - Q_SIGNALS: - /** - * This signal is emitted whenever the user has entered a new date. - * When the user changes the date by editing the line edit field, - * the signal is not emitted until focus leaves the line edit field. - * The passed date can be invalid. - */ - void dateEntered(const QDate &date); - - /** - * This signal is emitted whenever date is changed. - * Unlike dateEdited(), this signal is also emitted when the date is changed - * programmatically. - * - * The passed date can be invalid. - */ - void dateChanged(const QDate &date); - - /** - * This signal is emitted whenever the date is edited by the user. - * Unlike dateChanged(), this signal is not emitted when the date is changed - * programmatically. - * - * The passed date can be invalid. - */ - void dateEdited(const QDate &date); - - public Q_SLOTS: - /** - * Sets the date. - * - * @param date The new date to display. This date must be valid or - * it will not be set - */ - void setDate(const QDate &date); - - protected: - virtual bool eventFilter(QObject *obj, QEvent *ev); - virtual void mousePressEvent(QMouseEvent *ev); - virtual void focusOutEvent(QFocusEvent *ev); - virtual void keyPressEvent(QKeyEvent *ev); - - /** - * Sets the date, without altering the display. - * This method is used internally to set the widget's date value. - * As a virtual method, it allows derived classes to perform additional - * validation on the date value before it is set. Derived classes should - * return true if QDate::isValid(@p date) returns false. - * - * @param date The new date to set. - * @return True if the date was set, false if it was considered invalid - * and remains unchanged. - */ - virtual bool assignDate(const QDate &date); - - private slots: - void lineEnterPressed(); - void slotTextChanged(const QString &str); - void dateSelected(const QDate &dt); - - private: - //@cond PRIVATE - class Private; - Private* const d; - //@endcond -}; - - -#endif - -// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; -// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/datepickerpopup.cpp b/gui/datepickerpopup.cpp deleted file mode 100644 index fbec80c..0000000 --- a/gui/datepickerpopup.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright 2010 by Stefan Böhmann - * - * Based on KDateEdit (part of libkdepim) - * Copyright (c) 2004 Bram Schoenmakers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ -#include "datepickerpopup.h" - -#if defined(HAVE_KDE) -#include -#include -#else -#include -#endif - -#include -#include - - - -class DatePickerAction : public QWidgetAction -{ - public: -#if defined(HAVE_KDE) - DatePickerAction(KDatePicker *widget, QObject *parent) -#else - DatePickerAction(QCalendarWidget *widget, QObject *parent) -#endif - : QWidgetAction( parent ), - mDatePicker( widget ), - mOriginalParent( widget->parentWidget() ) - { - } - - protected: - QWidget *createWidget(QWidget *parent) - { - mDatePicker->setParent( parent ); - return mDatePicker; - } - - void deleteWidget(QWidget *widget) - { - if( widget != mDatePicker ) { - return; - } - - mDatePicker->setParent( mOriginalParent ); - } - - private: -#if defined(HAVE_KDE) - KDatePicker *mDatePicker; -#else - QCalendarWidget *mDatePicker; -#endif - - QWidget *mOriginalParent; -}; - - -class DatePickerPopup::Private -{ - public: - Private(DatePickerPopup *qq) - : q( qq ), - mDatePicker( 0 ) - { - } - - void buildMenu(); - - void slotDateChanged(const QDate &dt); - void slotToday(); - void slotTomorrow(); - void slotNextWeek(); - void slotNextMonth(); - void slotNoDate(); - - DatePickerPopup *q; - -#if defined(HAVE_KDE) - KDatePicker *mDatePicker; -#else - QCalendarWidget *mDatePicker; -#endif - Modes mModes; -}; - - -void DatePickerPopup::Private::buildMenu() -{ - if( q->isVisible() ) { - return; - } - - q->clear(); - - if( mModes & DatePicker ) { - q->addAction( new DatePickerAction( mDatePicker, q ) ); - - if( (mModes & NoDate) || (mModes & Words) ) { - q->addSeparator(); - } - } - - if( mModes & Words ) { - q->addAction( tr( "&Today" ), q, SLOT( slotToday() ) ); - q->addAction( tr( "To&morrow" ), q, SLOT( slotTomorrow() ) ); - q->addAction( tr( "Next &Week" ), q, SLOT( slotNextWeek() ) ); - q->addAction( tr( "Next M&onth" ), q, SLOT( slotNextMonth() ) ); - - if( mModes & NoDate ) { - q->addSeparator(); - } - } - - if( mModes & NoDate ) { - q->addAction( tr( "No Date" ), q, SLOT( slotNoDate() ) ); - } -} - - -void DatePickerPopup::Private::slotDateChanged(const QDate &date) -{ - emit q->dateChanged( date ); - q->hide(); -} - - -void DatePickerPopup::Private::slotToday() -{ - emit q->dateChanged( QDate::currentDate() ); -} - - -void DatePickerPopup::Private::slotTomorrow() -{ - emit q->dateChanged( QDate::currentDate().addDays( 1 ) ); -} - - -void DatePickerPopup::Private::slotNoDate() -{ - emit q->dateChanged( QDate() ); -} - - -void DatePickerPopup::Private::slotNextWeek() -{ - emit q->dateChanged( QDate::currentDate().addDays( 7 ) ); -} - - -void DatePickerPopup::Private::slotNextMonth() -{ - emit q->dateChanged( QDate::currentDate().addMonths( 1 ) ); -} - - - -DatePickerPopup::DatePickerPopup(Modes modes, const QDate &date, QWidget *parent) - : QMenu( parent ), - d( new Private( this ) ) -{ - d->mModes = modes; - -#if defined(HAVE_KDE) - d->mDatePicker = new KDatePicker( this ); - d->mDatePicker->setCloseButton( false ); - - connect( d->mDatePicker, SIGNAL( dateEntered( const QDate& ) ), - this, SLOT( slotDateChanged( const QDate& ) ) ); - connect( d->mDatePicker, SIGNAL( dateSelected( const QDate& ) ), - this, SLOT( slotDateChanged( const QDate& ) ) ); -#else - d->mDatePicker = new QCalendarWidget( this ); - - connect( d->mDatePicker, SIGNAL( activated( const QDate& ) ), - this, SLOT( slotDateChanged( const QDate& ) ) ); - connect( d->mDatePicker, SIGNAL( clicked( const QDate& ) ), - this, SLOT( slotDateChanged( const QDate& ) ) ); -#endif - - setDate( date ); - d->buildMenu(); -} - - -DatePickerPopup::~DatePickerPopup() -{ - delete d; -} - - -void DatePickerPopup::setDate(const QDate &date) -{ -#if defined(HAVE_KDE) - d->mDatePicker->setDate( date ); -#else - d->mDatePicker->setSelectedDate( date ); -#endif -} - - -void DatePickerPopup::slotDateChanged(const QDate &date) -{ - d->slotDateChanged( date ); -} - - -void DatePickerPopup::slotToday() -{ - d->slotToday(); -} - - -void DatePickerPopup::slotTomorrow() -{ - d->slotTomorrow(); -} - - -void DatePickerPopup::slotNextWeek() -{ - d->slotNextWeek(); -} - - -void DatePickerPopup::slotNextMonth() -{ - d->slotNextMonth(); -} - - -void DatePickerPopup::slotNoDate() -{ - d->slotNoDate(); -} - - -//#include "datepickerpopup.moc" - -// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; -// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/datepickerpopup.h b/gui/datepickerpopup.h deleted file mode 100644 index dc50c1e..0000000 --- a/gui/datepickerpopup.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2010 by Stefan Böhmann - * - * Based on KDateEdit (part of libkdepim) - * Copyright (c) 2004 Bram Schoenmakers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - */ -#ifndef KNIPPTASCH_DATEPICKERPOPUP_H -#define KNIPPTASCH_DATEPICKERPOPUP_H - -#include -#include - - -/** - * @short This menu helps the user to select a date quickly. - * - * This menu helps the user to select a date quickly. It offers various - * modes of selecting, e.g. with a DatePicker or with words like "Tomorrow". - * - * The available modes are: - * - * @li NoDate: A menu-item with "No Date". If chosen, the datepicker will emit - * a null QDate. - * @li DatePicker: Shows a DatePicker-widget. - * @li Words: Shows items like "Today", "Tomorrow" or "Next Week". - * - * @author Bram Schoenmakers - */ -class DatePickerPopup: public QMenu -{ - Q_OBJECT - - public: - /** - * Describes the available selection modes. - */ - enum Mode - { - NoDate = 1, ///< A menu-item with "No Date". Will always return an invalid date. - DatePicker = 2, ///< A menu-item with a DatePicker. - Words = 4 ///< A menu-item with list of words that describe a date. - }; - - /** - * Describes the a set of combined modes. - */ - Q_DECLARE_FLAGS( Modes, Mode ) - - /** - * Creates a new date picker popup. - * - * @param modes The selection modes that shall be offered - * @param date The initial date of date picker widget. - * @param parent The parent object. - */ - explicit DatePickerPopup(Modes modes = DatePicker, - const QDate &date = QDate::currentDate(), - QWidget *parent = 0); - - /** - * Destroys the date picker popup. - */ - ~DatePickerPopup(); - - public Q_SLOTS: - /** - * Sets the current @p date. - */ - void setDate(const QDate &date); - - Q_SIGNALS: - /** - * This signal is emitted whenever the user has selected a new date. - * - * @param date The new date. - */ - void dateChanged(const QDate &date); - - private slots: - void slotDateChanged(const QDate &dt); - void slotToday(); - void slotTomorrow(); - void slotNextWeek(); - void slotNextMonth(); - void slotNoDate(); - - private: - //@cond PRIVATE - class Private; - Private* const d; - //@endcond -}; - - -Q_DECLARE_OPERATORS_FOR_FLAGS( DatePickerPopup::Modes ) - -#endif - -// kate: word-wrap off; encoding utf-8; indent-width 4; tab-width 4; line-numbers on; mixed-indent off; remove-trailing-space-save on; replace-tabs-save on; replace-tabs on; space-indent on; -// vim:set spell et sw=4 ts=4 nowrap cino=l1,cs,U1: diff --git a/gui/delegate/datedelegate.cpp b/gui/delegate/datedelegate.cpp index 36fa459..138399e 100644 --- a/gui/delegate/datedelegate.cpp +++ b/gui/delegate/datedelegate.cpp @@ -19,7 +19,7 @@ #include "accountmodel.h" #include "preferences.h" -#include "dateedit.h" +#include #include @@ -44,7 +44,7 @@ QWidget* DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem return QStyledItemDelegate::createEditor( parent, option, index ); } - DateEdit *input = new DateEdit( parent ); + DateEdit *input = new DateEdit( Preferences::self()->userDefinedDateFormat(), parent ); // input->setCalendarPopup( true ); // input->setCorrectionMode( DateEdit::CorrectToNearestValue ); input->setFrame( false );