File indexing completed on 2024-12-08 04:27:22
0001 /* 0002 SPDX-FileCopyrightText: 2006 Peter Penz <peter.penz@gmx.at> 0003 SPDX-FileCopyrightText: 2008 Jean-Baptiste Mardelle <jb@kdenlive.org> 0004 SPDX-FileCopyrightText: 2012 Simon A. Eugster <simon.eu@gmail.com> 0005 0006 Some code borrowed from Dolphin, adapted (2008) to Kdenlive 0007 0008 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0009 */ 0010 0011 #pragma once 0012 0013 #include <QColor> 0014 #include <QLabel> 0015 #include <QList> 0016 #include <QSemaphore> 0017 #include <QTimer> 0018 #include <QWidget> 0019 #include <definitions.h> 0020 #include <utility> 0021 0022 #include "lib/qtimerWithTime.h" 0023 0024 class QPaintEvent; 0025 class QResizeEvent; 0026 class QProgressBar; 0027 0028 class FlashLabel : public QWidget 0029 { 0030 Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged) 0031 Q_OBJECT 0032 public: 0033 explicit FlashLabel(QWidget *parent = nullptr); 0034 ~FlashLabel() override; 0035 QColor color() const; 0036 void setColor(const QColor &); 0037 Q_SIGNALS: 0038 void colorChanged(); 0039 }; 0040 0041 /** 0042 Queue-able message item holding all important information 0043 */ 0044 struct StatusBarMessageItem 0045 { 0046 0047 QString text; 0048 MessageType type; 0049 int timeoutMillis; 0050 bool confirmed{false}; ///< MLT errors need to be confirmed. 0051 0052 /// @return true if the error still needs to be confirmed 0053 bool needsConfirmation() const { return (type == MltError && !confirmed); } 0054 0055 StatusBarMessageItem(QString messageText = QString(), MessageType messageType = DefaultMessage, int timeoutMS = 0) 0056 : text(std::move(messageText)) 0057 , type(messageType) 0058 , timeoutMillis(timeoutMS) 0059 { 0060 } 0061 0062 bool operator==(const StatusBarMessageItem &other) const { return type == other.type && text == other.text; } 0063 }; 0064 0065 /** 0066 * @brief Represents a message text label as part of the status bar. 0067 * 0068 * Dependent from the given type automatically a corresponding icon 0069 * is shown in front of the text. For message texts having the type 0070 * DolphinStatusBar::Error a dynamic color blending is done to get the 0071 * attention from the user. 0072 */ 0073 class StatusBarMessageLabel : public QWidget 0074 { 0075 Q_OBJECT 0076 0077 public: 0078 explicit StatusBarMessageLabel(QWidget *parent); 0079 ~StatusBarMessageLabel() override; 0080 0081 protected: 0082 // void paintEvent(QPaintEvent* event); 0083 void mousePressEvent(QMouseEvent *) override; 0084 0085 /** @see QWidget::resizeEvent() */ 0086 void resizeEvent(QResizeEvent *event) override; 0087 0088 public Q_SLOTS: 0089 void setProgressMessage(const QString &text, MessageType type = ProcessingJobMessage, int progress = 100, bool allowInterrupt = false); 0090 void setMessage(const QString &text, MessageType type = DefaultMessage, int timeoutMS = 0); 0091 void setSelectionMessage(const QString &text); 0092 /** @brief Display a key binding info in status bar */ 0093 void setKeyMap(const QString &text); 0094 /** @brief Display a temporary key binding info in status bar, revert to default one if text is empty */ 0095 void setTmpKeyMap(const QString &text); 0096 0097 private Q_SLOTS: 0098 0099 /** 0100 * Closes the currently shown error message and replaces it 0101 * by the next pending message. 0102 */ 0103 void confirmErrorMessage(); 0104 0105 /** 0106 * Shows the next pending error message. If no pending message 0107 * was in the queue, false is returned. 0108 */ 0109 bool slotMessageTimeout(); 0110 void slotShowJobLog(const QString &text); 0111 0112 private: 0113 enum { GeometryTimeout = 100 }; 0114 enum { BorderGap = 2 }; 0115 0116 int m_minTextHeight; 0117 FlashLabel *m_container; 0118 QLabel *m_selectionLabel; 0119 QLabel *m_pixmap; 0120 QLabel *m_label; 0121 QLabel *m_keyMap; 0122 QString m_keymapText; 0123 QString m_tooltipText; 0124 QProgressBar *m_progress; 0125 QTimerWithTime m_queueTimer; 0126 QSemaphore m_queueSemaphore; 0127 QList<StatusBarMessageItem> m_messageQueue; 0128 StatusBarMessageItem m_currentMessage; 0129 bool m_progressCanBeAborted{false}; 0130 };