diff --git a/src/lib/utility/TimeStamp.cpp b/src/lib/utility/TimeStamp.cpp index 78bbaf87..cd92fd7a 100644 --- a/src/lib/utility/TimeStamp.cpp +++ b/src/lib/utility/TimeStamp.cpp @@ -51,12 +51,12 @@ std::string TimeStamp::getDDMMYYYYString() const size_t TimeStamp::deltaMS(const TimeStamp& other) const { - return (m_time - other.m_time).total_milliseconds(); + return abs((m_time - other.m_time).total_milliseconds()); } size_t TimeStamp::deltaS(const TimeStamp& other) const { - return (m_time - other.m_time).total_seconds(); + return abs((m_time - other.m_time).total_seconds()); } bool TimeStamp::isSameDay(const TimeStamp& other) const @@ -74,11 +74,11 @@ bool TimeStamp::isSameDay(const TimeStamp& other) const size_t TimeStamp::deltaDays(const TimeStamp& other) const { boost::gregorian::date_duration deltaDate = m_time.date() - other.m_time.date(); - return size_t(std::abs(deltaDate.days())); + return abs(deltaDate.days()); } -long TimeStamp::deltaHours(const TimeStamp& other) const +size_t TimeStamp::deltaHours(const TimeStamp& other) const { boost::posix_time::time_duration delta = m_time - other.m_time; - return delta.total_seconds() / 3600; + return abs(delta.total_seconds() / 3600); } diff --git a/src/lib/utility/TimeStamp.h b/src/lib/utility/TimeStamp.h index 4a897c24..abc50ded 100644 --- a/src/lib/utility/TimeStamp.h +++ b/src/lib/utility/TimeStamp.h @@ -31,7 +31,7 @@ public: // days are counted beginning at 00:00, so a tp of 1.1.2017 23:59 is 1 day ago if it's the 2.1.2017 00:01 size_t deltaDays(const TimeStamp& other) const; - long deltaHours(const TimeStamp& other) const; + size_t deltaHours(const TimeStamp& other) const; private: boost::posix_time::ptime m_time; diff --git a/src/lib_gui/qt/element/QtBookmark.cpp b/src/lib_gui/qt/element/QtBookmark.cpp index 319eb501..1de181a3 100644 --- a/src/lib_gui/qt/element/QtBookmark.cpp +++ b/src/lib_gui/qt/element/QtBookmark.cpp @@ -256,7 +256,7 @@ std::string QtBookmark::getDateString() const { result = "today"; } - else if (creationDate.deltaDays(now) == 1) // yesterday + else if (now.deltaDays(creationDate) == 1) // yesterday { result = "yesterday"; } diff --git a/src/lib_gui/qt/element/QtHistoryList.cpp b/src/lib_gui/qt/element/QtHistoryList.cpp index c9d85b70..e856121b 100644 --- a/src/lib_gui/qt/element/QtHistoryList.cpp +++ b/src/lib_gui/qt/element/QtHistoryList.cpp @@ -152,6 +152,11 @@ void QtHistoryList::showPopup(QPoint pos) show(); } +void QtHistoryList::closeEvent(QCloseEvent* event) +{ + emit closed(); +} + void QtHistoryList::onItemClicked(QListWidgetItem *item) { QtHistoryItem* historyItem = dynamic_cast(m_list->itemWidget(item)); diff --git a/src/lib_gui/qt/element/QtHistoryList.h b/src/lib_gui/qt/element/QtHistoryList.h index 6e471a5a..6e24347a 100644 --- a/src/lib_gui/qt/element/QtHistoryList.h +++ b/src/lib_gui/qt/element/QtHistoryList.h @@ -32,17 +32,22 @@ private: }; - class QtHistoryList : public QWidget { Q_OBJECT +signals: + void closed(); + public: QtHistoryList(const std::vector& history, size_t currentIndex); void showPopup(QPoint pos); +protected: + void closeEvent(QCloseEvent* event); + private slots: void onItemClicked(QListWidgetItem *item); diff --git a/src/lib_gui/qt/element/QtUndoRedo.cpp b/src/lib_gui/qt/element/QtUndoRedo.cpp index 9bd4ff62..212f88e6 100644 --- a/src/lib_gui/qt/element/QtUndoRedo.cpp +++ b/src/lib_gui/qt/element/QtUndoRedo.cpp @@ -15,6 +15,8 @@ QtUndoRedo::QtUndoRedo() : m_pressed(false) + , m_historyList(nullptr) + , m_historyHiddenAt(TimeStamp::now()) { setObjectName("undo_redo_bar"); @@ -62,6 +64,11 @@ QtUndoRedo::~QtUndoRedo() void QtUndoRedo::buttonPressed() { + if (TimeStamp::now().deltaMS(m_historyHiddenAt) < 250) + { + return; + } + m_pressed = true; QTimer::singleShot(250, this, &QtUndoRedo::showHistory); m_historyButton->setAttribute(Qt::WA_UnderMouse, false); @@ -91,6 +98,12 @@ void QtUndoRedo::showHistory() { m_pressed = false; + if (m_historyList) + { + m_historyList->deleteLater(); + m_historyList = nullptr; + } + m_undoButton->setDown(false); m_redoButton->setDown(false); m_historyButton->setDown(false); @@ -99,11 +112,24 @@ void QtUndoRedo::showHistory() m_redoButton->setAttribute(Qt::WA_UnderMouse, false); m_historyButton->setAttribute(Qt::WA_UnderMouse, false); - QtHistoryList* list = new QtHistoryList(m_history, m_currentIndex); + m_historyList = new QtHistoryList(m_history, m_currentIndex); QPoint pos = m_undoButton->mapToGlobal(m_undoButton->pos()); - list->showPopup(QPoint(pos.x(), pos.y() + m_undoButton->size().height() + 5)); + m_historyList->showPopup(QPoint(pos.x(), pos.y() + m_undoButton->size().height() + 5)); + + connect(m_historyList, &QtHistoryList::closed, this, &QtUndoRedo::hidHistory); + } +} + +void QtUndoRedo::hidHistory() +{ + if (m_historyList) + { + m_historyList->deleteLater(); + m_historyList = nullptr; + + m_historyHiddenAt = TimeStamp::now(); } } diff --git a/src/lib_gui/qt/element/QtUndoRedo.h b/src/lib_gui/qt/element/QtUndoRedo.h index 818d3537..c016c71d 100644 --- a/src/lib_gui/qt/element/QtUndoRedo.h +++ b/src/lib_gui/qt/element/QtUndoRedo.h @@ -5,8 +5,10 @@ #include #include "data/search/SearchMatch.h" +#include "utility/TimeStamp.h" class QPushButton; +class QtHistoryList; class QtUndoRedo : public QFrame @@ -31,6 +33,7 @@ private slots: void redoReleased(); void showHistory(); + void hidHistory(); private: QPushButton* m_undoButton; @@ -41,6 +44,9 @@ private: size_t m_currentIndex; bool m_pressed; + + QtHistoryList* m_historyList; + TimeStamp m_historyHiddenAt; }; #endif // QT_UNDO_REDO_H