diff --git a/include/MainWindow.h b/include/MainWindow.h
index 89d1df45..f1582f85 100644
--- a/include/MainWindow.h
+++ b/include/MainWindow.h
@@ -22,8 +22,10 @@
#include <QSharedPointer>
#include "ChatPage.h"
+#include "CircularProgress.h"
#include "LoginPage.h"
#include "MatrixClient.h"
+#include "OverlayModal.h"
#include "RegisterPage.h"
#include "SlidingStackWidget.h"
#include "WelcomePage.h"
@@ -41,7 +43,7 @@ public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
-public slots:
+private slots:
// Show the welcome page in the main window.
void showWelcomePage();
@@ -54,6 +56,8 @@ public slots:
// Show the chat page and start communicating with the given access token.
void showChatPage(QString user_id, QString home_server, QString token);
+ void removeOverlayProgressBar();
+
private:
// The UI component of the main window.
Ui::MainWindow *ui_;
@@ -73,6 +77,10 @@ private:
// The main chat area.
ChatPage *chat_page_;
+ // Used to hide undefined states between page transitions.
+ OverlayModal *progress_modal_;
+ CircularProgress *spinner_;
+
// Matrix Client API provider.
QSharedPointer<MatrixClient> client_;
};
diff --git a/include/ui/CircularProgress.h b/include/ui/CircularProgress.h
new file mode 100644
index 00000000..bb8156ae
--- /dev/null
+++ b/include/ui/CircularProgress.h
@@ -0,0 +1,114 @@
+#ifndef UI_CIRCULAR_PROGRESS_H
+#define UI_CIRCULAR_PROGRESS_H
+
+#include <QObject>
+#include <QProgressBar>
+
+#include "Theme.h"
+
+class CircularProgressDelegate;
+
+class CircularProgress : public QProgressBar
+{
+ Q_OBJECT
+
+ Q_PROPERTY(qreal lineWidth WRITE setLineWidth READ lineWidth)
+ Q_PROPERTY(qreal size WRITE setSize READ size)
+ Q_PROPERTY(QColor color WRITE setColor READ color)
+
+public:
+ explicit CircularProgress(QWidget *parent = nullptr);
+ ~CircularProgress();
+
+ void setProgressType(ui::ProgressType type);
+ void setLineWidth(qreal width);
+ void setSize(int size);
+ void setColor(const QColor &color);
+
+ ui::ProgressType progressType() const;
+ qreal lineWidth() const;
+ int size() const;
+ QColor color() const;
+
+ QSize sizeHint() const override;
+
+protected:
+ void paintEvent(QPaintEvent *event) override;
+
+private:
+ CircularProgressDelegate *delegate_;
+
+ ui::ProgressType progress_type_;
+
+ QColor color_;
+
+ // Circle width.
+ qreal width_;
+
+ // Circle radius.
+ int size_;
+};
+
+class CircularProgressDelegate : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(qreal dashOffset WRITE setDashOffset READ dashOffset)
+ Q_PROPERTY(qreal dashLength WRITE setDashLength READ dashLength)
+ Q_PROPERTY(int angle WRITE setAngle READ angle)
+
+public:
+ explicit CircularProgressDelegate(CircularProgress *parent);
+ ~CircularProgressDelegate();
+
+ inline void setDashOffset(qreal offset);
+ inline void setDashLength(qreal length);
+ inline void setAngle(int angle);
+
+ inline qreal dashOffset() const;
+ inline qreal dashLength() const;
+ inline int angle() const;
+
+private:
+ CircularProgress *const progress_;
+
+ qreal dash_offset_;
+ qreal dash_length_;
+
+ int angle_;
+};
+
+inline void CircularProgressDelegate::setDashOffset(qreal offset)
+{
+ dash_offset_ = offset;
+ progress_->update();
+}
+
+inline void CircularProgressDelegate::setDashLength(qreal length)
+{
+ dash_length_ = length;
+ progress_->update();
+}
+
+inline void CircularProgressDelegate::setAngle(int angle)
+{
+ angle_ = angle;
+ progress_->update();
+}
+
+inline qreal CircularProgressDelegate::dashOffset() const
+{
+ return dash_offset_;
+}
+
+inline qreal CircularProgressDelegate::dashLength() const
+{
+ return dash_length_;
+}
+
+inline int CircularProgressDelegate::angle() const
+{
+ return angle_;
+}
+
+#endif // UI_CIRCULAR_PROGRESS_H
diff --git a/include/ui/OverlayModal.h b/include/ui/OverlayModal.h
new file mode 100644
index 00000000..aff93d02
--- /dev/null
+++ b/include/ui/OverlayModal.h
@@ -0,0 +1,60 @@
+/*
+ * nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * 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 3 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef UI_OVERLAY_MODAL_H
+#define UI_OVERLAY_MODAL_H
+
+#include <QGraphicsOpacityEffect>
+#include <QPaintEvent>
+#include <QPropertyAnimation>
+
+#include "OverlayWidget.h"
+
+class OverlayModal : public OverlayWidget
+{
+public:
+ explicit OverlayModal(QWidget *parent, QWidget *content);
+
+ void fadeIn();
+ void fadeOut();
+
+public:
+ inline void setDuration(int duration);
+ inline void setColor(QColor color);
+
+protected:
+ void paintEvent(QPaintEvent *event) override;
+
+private:
+ int duration_;
+ QColor color_;
+
+ QGraphicsOpacityEffect *opacity_;
+ QPropertyAnimation *animation_;
+};
+
+inline void OverlayModal::setDuration(int duration)
+{
+ duration_ = duration;
+}
+
+inline void OverlayModal::setColor(QColor color)
+{
+ color_ = color;
+}
+
+#endif // UI_OVERLAY_MODAL_H
diff --git a/include/ui/OverlayWidget.h b/include/ui/OverlayWidget.h
index 020393ad..36b42dc9 100644
--- a/include/ui/OverlayWidget.h
+++ b/include/ui/OverlayWidget.h
@@ -2,7 +2,6 @@
#define UI_OVERLAY_WIDGET_H
#include <QEvent>
-#include <QObject>
#include <QWidget>
class OverlayWidget : public QWidget
@@ -10,8 +9,7 @@ class OverlayWidget : public QWidget
Q_OBJECT
public:
- explicit OverlayWidget(QWidget *parent = 0);
- ~OverlayWidget();
+ explicit OverlayWidget(QWidget *parent = nullptr);
protected:
bool event(QEvent *event) override;
|