reimplement QDateTimeEdit

no date/time parsing and it has different look based on what is being
edited:
https://ibb.co/w6hTwCk

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2023-08-01 10:15:32 +03:00
parent 9688b3520f
commit 24690f5507
5 changed files with 247 additions and 2196 deletions

View file

@ -267,7 +267,7 @@ endfunction()
# depend on KtNetwork depend on plugins that depend on it too
add_custom_target(plugins_dependant_tests)
function(KATIE_SETUP_PLUGIN FORPLUGIN)
add_dependencies(plugins_dependant_tests ${FORPLUGIN})
# add_dependencies(plugins_dependant_tests ${FORPLUGIN})
endfunction()
# a macro to remove conditional code from headers which is only relevant to the

View file

@ -199,15 +199,12 @@ QWidget *QDefaultItemEditorFactory::createEditor(QVariant::Type type, QWidget *p
#ifndef QT_NO_DATETIMEEDIT
case QVariant::Date: {
QDateTimeEdit *ed = new QDateEdit(parent);
ed->setFrame(false);
return ed; }
case QVariant::Time: {
QDateTimeEdit *ed = new QTimeEdit(parent);
ed->setFrame(false);
return ed; }
case QVariant::DateTime: {
QDateTimeEdit *ed = new QDateTimeEdit(parent);
ed->setFrame(false);
return ed; }
#endif
case QVariant::Pixmap:

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Copyright (C) 2016 Ivailo Monev
** Copyright (C) 2023 Ivailo Monev
**
** This file is part of the QtGui module of the Katie Toolkit.
**
@ -23,57 +22,28 @@
#define QDATETIMEEDIT_H
#include <QtCore/qdatetime.h>
#include <QtCore/qvariant.h>
#include <QtGui/qabstractspinbox.h>
#include <QtGui/qcalendarwidget.h>
QT_BEGIN_NAMESPACE
#ifndef QT_NO_DATETIMEEDIT
class QDateTimeEditPrivate;
class QStyleOptionSpinBox;
class QCalendarWidget;
class Q_GUI_EXPORT QDateTimeEdit : public QAbstractSpinBox
class Q_GUI_EXPORT QDateTimeEdit : public QWidget
{
Q_OBJECT
Q_ENUMS(Section)
Q_FLAGS(Sections)
Q_PROPERTY(QDateTime dateTime READ dateTime WRITE setDateTime NOTIFY dateTimeChanged USER true)
Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY dateChanged)
Q_PROPERTY(QTime time READ time WRITE setTime NOTIFY timeChanged)
Q_PROPERTY(QDateTime maximumDateTime READ maximumDateTime WRITE setMaximumDateTime RESET clearMaximumDateTime)
Q_PROPERTY(QDateTime minimumDateTime READ minimumDateTime WRITE setMinimumDateTime RESET clearMinimumDateTime)
Q_PROPERTY(QDate maximumDate READ maximumDate WRITE setMaximumDate RESET clearMaximumDate)
Q_PROPERTY(QDate minimumDate READ minimumDate WRITE setMinimumDate RESET clearMinimumDate)
Q_PROPERTY(QTime maximumTime READ maximumTime WRITE setMaximumTime RESET clearMaximumTime)
Q_PROPERTY(QTime minimumTime READ minimumTime WRITE setMinimumTime RESET clearMinimumTime)
Q_PROPERTY(Section currentSection READ currentSection WRITE setCurrentSection)
Q_PROPERTY(Sections displayedSections READ displayedSections)
Q_PROPERTY(QString displayFormat READ displayFormat WRITE setDisplayFormat)
Q_PROPERTY(bool calendarPopup READ calendarPopup WRITE setCalendarPopup)
Q_PROPERTY(int currentSectionIndex READ currentSectionIndex WRITE setCurrentSectionIndex)
Q_PROPERTY(int sectionCount READ sectionCount)
Q_PROPERTY(Qt::TimeSpec timeSpec READ timeSpec WRITE setTimeSpec)
public:
enum Section {
NoSection = 0x0000,
AmPmSection = 0x0001,
MSecSection = 0x0002,
SecondSection = 0x0004,
MinuteSection = 0x0008,
HourSection = 0x0010,
DaySection = 0x0100,
MonthSection = 0x0200,
YearSection = 0x0400,
TimeSections_Mask = AmPmSection|MSecSection|SecondSection|MinuteSection|HourSection,
DateSections_Mask = DaySection|MonthSection|YearSection
};
Q_PROPERTY(QDateTime maximumDateTime READ maximumDateTime)
Q_PROPERTY(QDateTime minimumDateTime READ minimumDateTime)
Q_PROPERTY(QDate maximumDate READ maximumDate)
Q_PROPERTY(QDate minimumDate READ minimumDate)
Q_PROPERTY(QTime maximumTime READ maximumTime)
Q_PROPERTY(QTime minimumTime READ minimumTime)
Q_DECLARE_FLAGS(Sections, Section)
public:
explicit QDateTimeEdit(QWidget *parent = nullptr);
explicit QDateTimeEdit(const QDateTime &dt, QWidget *parent = nullptr);
@ -85,67 +55,20 @@ public:
QTime time() const;
QDateTime minimumDateTime() const;
void clearMinimumDateTime();
void setMinimumDateTime(const QDateTime &dt);
QDateTime maximumDateTime() const;
void clearMaximumDateTime();
void setMaximumDateTime(const QDateTime &dt);
void setDateTimeRange(const QDateTime &min, const QDateTime &max);
QDate minimumDate() const;
void setMinimumDate(const QDate &min);
void clearMinimumDate();
QDate maximumDate() const;
void setMaximumDate(const QDate &max);
void clearMaximumDate();
void setDateRange(const QDate &min, const QDate &max);
QTime minimumTime() const;
void setMinimumTime(const QTime &min);
void clearMinimumTime();
QTime maximumTime() const;
void setMaximumTime(const QTime &max);
void clearMaximumTime();
void setTimeRange(const QTime &min, const QTime &max);
Sections displayedSections() const;
Section currentSection() const;
Section sectionAt(int index) const;
void setCurrentSection(Section section);
int currentSectionIndex() const;
void setCurrentSectionIndex(int index);
QCalendarWidget *calendarWidget() const;
QCalendarWidget* calendarWidget() const;
void setCalendarWidget(QCalendarWidget *calendarWidget);
int sectionCount() const;
void setSelectedSection(Section section);
QString sectionText(Section section) const;
QString displayFormat() const;
void setDisplayFormat(const QString &format);
bool calendarPopup() const;
void setCalendarPopup(bool enable);
Qt::TimeSpec timeSpec() const;
void setTimeSpec(Qt::TimeSpec spec);
QSize sizeHint() const;
virtual void clear();
virtual void stepBy(int steps);
bool event(QEvent *event);
Q_SIGNALS:
void dateTimeChanged(const QDateTime &date);
void timeChanged(const QTime &date);
@ -156,26 +79,13 @@ public Q_SLOTS:
void setDate(const QDate &date);
void setTime(const QTime &time);
protected:
virtual void keyPressEvent(QKeyEvent *event);
virtual void focusInEvent(QFocusEvent *event);
virtual bool focusNextPrevChild(bool next);
virtual QValidator::State validate(QString &input, int &pos) const;
virtual void fixup(QString &input) const;
virtual QDateTime dateTimeFromText(const QString &text) const;
virtual QString textFromDateTime(const QDateTime &dt) const;
virtual StepEnabled stepEnabled() const;
virtual void mousePressEvent(QMouseEvent *event);
virtual void paintEvent(QPaintEvent *event);
void initStyleOption(QStyleOptionSpinBox *option) const;
QDateTimeEdit(const QVariant &val, QVariant::Type parserType, QWidget *parent = nullptr);
private:
Q_DECLARE_PRIVATE(QDateTimeEdit)
Q_DISABLE_COPY(QDateTimeEdit)
Q_PRIVATE_SLOT(d_func(), void _q_resetButton())
Q_PRIVATE_SLOT(d_func(), void _q_dateChanged())
Q_PRIVATE_SLOT(d_func(), void _q_timeChanged())
Q_PRIVATE_SLOT(d_func(), void _q_selectDate())
};
class Q_GUI_EXPORT QTimeEdit : public QDateTimeEdit
@ -194,8 +104,6 @@ public:
QDateEdit(const QDate &date, QWidget *parent = nullptr);
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QDateTimeEdit::Sections)
#endif // QT_NO_DATETIMEEDIT
QT_END_NAMESPACE

View file

@ -1,7 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Copyright (C) 2016 Ivailo Monev
** Copyright (C) 2023 Ivailo Monev
**
** This file is part of the QtGui module of the Katie Toolkit.
**
@ -33,124 +32,48 @@
// We mean it.
//
#include "qcombobox.h"
#include "qcalendarwidget.h"
#include "qwidget_p.h"
#include "qdatetimeedit.h"
#include "qboxlayout.h"
#include "qspinbox.h"
#include "qtoolbutton.h"
#include "qmenu.h"
#include "qlabel.h"
#include "qdatetimeedit.h"
#include "qabstractspinbox_p.h"
#include "qdatetime_p.h"
#include "qwidgetaction.h"
#include "qdebug.h"
#ifndef QT_NO_DATETIMEEDIT
QT_BEGIN_NAMESPACE
class QCalendarPopup;
class QDateTimeEditPrivate : public QAbstractSpinBoxPrivate, public QDateTimeParser
class QDateTimeEditPrivate : public QWidgetPrivate
{
Q_DECLARE_PUBLIC(QDateTimeEdit)
public:
QDateTimeEditPrivate();
void init(const QVariant &var);
void readLocaleSettings();
QDateTime minimumdate;
QDateTime maximumdate;
QCalendarWidget *calendarwidget;
void emitSignals(EmitPolicy ep, const QVariant &old);
QString textFromValue(const QVariant &f) const;
QVariant valueFromText(const QString &f) const;
virtual void _q_editorCursorPositionChanged(int oldpos, int newpos);
virtual void interpret(EmitPolicy ep);
virtual void clearCache() const;
void init(const QDateTime &datetime, const bool showdate, const bool showtime);
void updateWidgets(const QDateTime &datetime);
void setCalendar(QCalendarWidget *calendar);
QDateTime currentDateTime() const;
QDateTime validateAndInterpret(QString &input, int &, QValidator::State &state,
bool fixup = false) const;
void clearSection(int index);
virtual QString displayText() const { return edit->text(); } // this is from QDateTimeParser
int absoluteIndex(QDateTimeEdit::Section s, int index) const;
int absoluteIndex(const SectionNode &s) const;
void updateEdit();
QDateTime stepBy(int index, int steps, bool test = false) const;
int sectionAt(int pos) const;
int closestSection(int index, bool forward) const;
int nextPrevSection(int index, bool forward) const;
void setSelected(int index, bool forward = false);
void updateCache(const QVariant &val, const QString &str) const;
void updateTimeSpec();
virtual QDateTime getMinimum() const { return minimum.toDateTime(); }
virtual QDateTime getMaximum() const { return maximum.toDateTime(); }
virtual QLocale locale() const { return q_func()->locale(); }
QString valueToText(const QVariant &var) const { return textFromValue(var); }
QString getAmPmText(AmPm ap, Case cs) const;
int cursorPosition() const { return edit ? edit->cursorPosition() : -1; }
virtual QStyle::SubControl newHoverControl(const QPoint &pos);
virtual void updateEditFieldGeometry();
virtual QVariant getZeroVariant() const;
virtual void setRange(const QVariant &min, const QVariant &max);
void _q_resetButton();
void updateArrow(QStyle::StateFlag state);
bool calendarPopupEnabled() const;
void syncCalendarWidget();
bool isSeparatorKey(const QKeyEvent *k) const;
static QDateTimeEdit::Sections convertSections(QDateTimeParser::Sections s);
static QDateTimeEdit::Section convertToPublic(QDateTimeParser::Section s);
void initCalendarPopup(QCalendarWidget *cw = 0);
void positionCalendarPopup();
QDateTimeEdit::Sections sections;
mutable bool cacheGuard;
QString defaultDateFormat, defaultTimeFormat, defaultDateTimeFormat, unreversedFormat;
mutable QVariant conflictGuard;
bool hasHadFocus, formatExplicitlySet, calendarPopup;
QStyle::StateFlag arrowState;
QCalendarPopup *monthCalendar;
};
class QCalendarPopup : public QWidget
{
Q_OBJECT
public:
QCalendarPopup(QWidget *parent = nullptr, QCalendarWidget *cw = 0);
QDate selectedDate() { return verifyCalendarInstance()->selectedDate(); }
void setDate(const QDate &date);
void setDateRange(const QDate &min, const QDate &max);
QCalendarWidget *calendarWidget() const { return const_cast<QCalendarPopup*>(this)->verifyCalendarInstance(); }
void setCalendarWidget(QCalendarWidget *cw);
Q_SIGNALS:
void activated(const QDate &date);
void newDateSelected(const QDate &newDate);
void hidingCalendar(const QDate &oldDate);
void resetButton();
private Q_SLOTS:
void dateSelected(const QDate &date);
void dateSelectionChanged();
protected:
void hideEvent(QHideEvent *);
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *);
bool event(QEvent *e);
void _q_dateChanged();
void _q_timeChanged();
void _q_selectDate();
private:
QCalendarWidget *verifyCalendarInstance();
QWeakPointer<QCalendarWidget> calendar;
QDate oldDate;
bool dateChanged;
bool m_showdate;
bool m_showtime;
QHBoxLayout *m_layout;
QSpinBox *m_hourbox;
QSpinBox *m_minutebox;
QSpinBox *m_secondbox;
QToolButton *m_datebutton;
QMenu* m_datemenu;
QWidgetAction* m_dateaction;
};
QT_END_NAMESPACE