Add spinner to hide uninitialized layout after login

This commit is contained in:
Konstantinos Sideris 2017-04-26 02:23:12 +03:00
parent 58936cd67b
commit 415ef7e9c7
9 changed files with 494 additions and 9 deletions

View file

@ -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_;
};

View file

@ -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

60
include/ui/OverlayModal.h Normal file
View file

@ -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

View file

@ -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;