aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
committerLibravatarUnit 193 <unit193@ubuntu.com>2014-12-06 17:33:25 -0500
commit7167ce41b61d2ba2cdb526777a4233eb84a3b66a (patch)
treea35c14143716e1f2c98f808c81f89426045a946f /SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp
Imported Upstream version 2.99.6upstream/2.99.6
Diffstat (limited to 'SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp')
-rw-r--r--SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp275
1 files changed, 275 insertions, 0 deletions
diff --git a/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp
new file mode 100644
index 0000000..bd1e244
--- /dev/null
+++ b/SQLiteStudio3/guiSQLiteStudio/multieditor/multieditordatetime.cpp
@@ -0,0 +1,275 @@
+#include "multieditordatetime.h"
+#include "common/utils.h"
+#include "common/unused.h"
+#include <QDateTimeEdit>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QVariant>
+#include <QString>
+#include <QDebug>
+#include <QCalendarWidget>
+#include <QWheelEvent>
+#include <QTableView>
+#include <QLabel>
+
+QStringList MultiEditorDateTime::formats;
+
+MultiEditorDateTime::MultiEditorDateTime(QWidget *parent) :
+ MultiEditorWidget(parent)
+{
+ QVBoxLayout* vbox = new QVBoxLayout();
+ setLayout(vbox);
+ dateTimeEdit = new QDateTimeEdit();
+ dateTimeLabel = new QLabel();
+ calendar = new QCalendarWidget();
+ // Extending width, becuase day labels are truncated on some systems.
+ calendar->setFixedSize(calendar->sizeHint() + QSize(80, 0));
+
+ vbox->addWidget(dateTimeEdit);
+ vbox->addWidget(dateTimeLabel);
+ vbox->addWidget(calendar);
+
+ setDisplayFormat(formats.first());
+
+ connect(calendar, &QCalendarWidget::selectionChanged, this, &MultiEditorDateTime::calendarDateChanged);
+ connect(dateTimeEdit, &QDateTimeEdit::dateChanged, this, &MultiEditorDateTime::dateChanged);
+ connect(dateTimeEdit, &QDateTimeEdit::timeChanged, this, &MultiEditorDateTime::timeChanged);
+
+ setFocusProxy(dateTimeEdit);
+ updateCalendarDisplay();
+}
+
+void MultiEditorDateTime::staticInit()
+{
+ formats << "yyyy-MM-dd hh:mm:ss"
+ << "yyyy-MM-dd hh:mm"
+ << "yyyy-MM-dd"
+ << "yyyy-MM-dd hh:mm:ss.z"
+ << "yyyy-MM-ddThh:mm"
+ << "yyyy-MM-ddThh:mm:ss"
+ << "yyyy-MM-ddThh:mm:ss.z";
+}
+
+void MultiEditorDateTime::setDisplayFormat(const QString& format)
+{
+ dateTimeEdit->setDisplayFormat(format);
+ dateTimeEdit->setMaximumWidth(dateTimeEdit->sizeHint().width());
+}
+
+void MultiEditorDateTime::setValue(const QVariant& value)
+{
+ switch (value.userType())
+ {
+ case QVariant::DateTime:
+ dateTimeEdit->setDateTime(value.toDateTime());
+ break;
+ case QVariant::Date:
+ dateTimeEdit->setDate(value.toDate());
+ break;
+ default:
+ {
+ dateTimeEdit->setDateTime(fromString(value.toString()));
+ break;
+ }
+ }
+ updateReadOnlyDisplay();
+}
+
+QVariant MultiEditorDateTime::getValue()
+{
+ if (formatType == STRING)
+ return dateTimeEdit->dateTime().toString(originalValueFormat);
+ else if (formatType == UNIXTIME)
+ return dateTimeEdit->dateTime().toTime_t();
+ else if (formatType == JULIAN_DAY)
+ return toJulian(dateTimeEdit->dateTime());
+ else
+ return dateTimeEdit->dateTime().toString(dateTimeEdit->displayFormat());
+}
+
+QList<QWidget*> MultiEditorDateTime::getNoScrollWidgets()
+{
+ QList<QWidget*> list;
+ list << dateTimeEdit << calendar;
+
+ QObject* obj = calendar->findChild<QTableView*>("qt_calendar_calendarview");
+ if (obj)
+ {
+ QTableView* view = dynamic_cast<QTableView*>(obj);
+ if (view)
+ list << view->viewport();
+ }
+
+ return list;
+}
+
+QDateTime MultiEditorDateTime::fromString(const QString& value)
+{
+ QDateTime dateTime;
+ foreach (const QString& format, getParsingFormats())
+ {
+ dateTime = QDateTime::fromString(value, format);
+ if (dateTime.isValid())
+ {
+ formatType = STRING;
+ originalValueFormat = format;
+ return dateTime;
+ }
+ }
+
+ // Try with unixtime
+ bool ok;
+ uint unixtime = value.toUInt(&ok);
+ if (ok)
+ {
+ dateTime = QDateTime::fromTime_t(unixtime);
+ formatType = UNIXTIME;
+ return dateTime;
+ }
+
+ // Try with Julian day
+ double jd = value.toDouble(&ok);
+ if (ok)
+ {
+ dateTime = toGregorian(jd);
+ formatType = JULIAN_DAY;
+ return dateTime;
+ }
+
+ formatType = OTHER;
+ return QDateTime();
+}
+
+void MultiEditorDateTime::calendarDateChanged()
+{
+ if (updatingCalendar)
+ return;
+
+ dateTimeEdit->setDate(calendar->selectedDate());
+ emit valueModified();
+}
+
+void MultiEditorDateTime::dateChanged(const QDate& date)
+{
+ updatingCalendar = true;
+ calendar->setSelectedDate(date);
+ updatingCalendar = false;
+ emit valueModified();
+}
+
+void MultiEditorDateTime::timeChanged(const QTime& time)
+{
+ UNUSED(time);
+ emit valueModified();
+}
+
+bool MultiEditorDateTime::getReadOnly() const
+{
+ return readOnly;
+}
+
+void MultiEditorDateTime::setReadOnly(bool value)
+{
+ readOnly = value;
+ dateTimeEdit->setVisible(!readOnly);
+ dateTimeLabel->setVisible(readOnly);
+ updateReadOnlyDisplay();
+}
+
+QString MultiEditorDateTime::getTabLabel()
+{
+ return tr("Date & time");
+}
+
+void MultiEditorDateTime::focusThisWidget()
+{
+ dateTimeEdit->setFocus();
+}
+
+QStringList MultiEditorDateTime::getParsingFormats()
+{
+ return formats;
+}
+
+void MultiEditorDateTime::updateReadOnlyDisplay()
+{
+ if (!readOnly)
+ return;
+
+ dateTimeLabel->setText(getValue().toString());
+ QDate date = dateTimeEdit->date();
+ calendar->setMinimumDate(date);
+ calendar->setMaximumDate(date);
+ calendar->setSelectedDate(date);
+}
+
+void MultiEditorDateTime::updateCalendarDisplay()
+{
+ if (!showCalendars)
+ {
+ calendar->setVisible(false);
+ return;
+ }
+}
+
+MultiEditorWidget*MultiEditorDateTimePlugin::getInstance()
+{
+ return new MultiEditorDateTime();
+}
+
+bool MultiEditorDateTimePlugin::validFor(const DataType& dataType)
+{
+ switch (dataType.getType())
+ {
+ case DataType::BLOB:
+ case DataType::BOOLEAN:
+ case DataType::BIGINT:
+ case DataType::DECIMAL:
+ case DataType::DOUBLE:
+ case DataType::INTEGER:
+ case DataType::INT:
+ case DataType::NUMERIC:
+ case DataType::REAL:
+ case DataType::NONE:
+ case DataType::STRING:
+ case DataType::TEXT:
+ case DataType::CHAR:
+ case DataType::VARCHAR:
+ case DataType::TIME:
+ case DataType::unknown:
+ break;
+ case DataType::DATE:
+ case DataType::DATETIME:
+ return true;
+ }
+ return false;
+}
+
+int MultiEditorDateTimePlugin::getPriority(const DataType& dataType)
+{
+ switch (dataType.getType())
+ {
+ case DataType::BLOB:
+ case DataType::BOOLEAN:
+ case DataType::BIGINT:
+ case DataType::DECIMAL:
+ case DataType::DOUBLE:
+ case DataType::INTEGER:
+ case DataType::INT:
+ case DataType::NUMERIC:
+ case DataType::REAL:
+ case DataType::NONE:
+ case DataType::STRING:
+ case DataType::TEXT:
+ case DataType::CHAR:
+ case DataType::VARCHAR:
+ case DataType::TIME:
+ case DataType::unknown:
+ break;
+ case DataType::DATE:
+ return 2;
+ case DataType::DATETIME:
+ return 1;
+ }
+ return 10;
+}