0
0
mirror of https://github.com/yse/easy_profiler.git synced 2024-12-26 08:01:51 +08:00

[ui] Use RoundProgressDialog instead of QProgressDialog

This commit is contained in:
Victor Zarubkin 2019-10-22 09:58:25 +03:00
parent abcfa4ac47
commit f547c62182
10 changed files with 289 additions and 72 deletions

View File

@ -61,7 +61,6 @@
* : limitations under the License.
************************************************************************/
#include <QMenu>
#include <QAction>
#include <QActionGroup>
#include <QApplication>
@ -72,14 +71,15 @@
#include <QHeaderView>
#include <QLabel>
#include <QLineEdit>
#include <QMenu>
#include <QMoveEvent>
#include <QProgressDialog>
#include <QResizeEvent>
#include <QScrollBar>
#include <QSettings>
#include <QSignalBlocker>
#include <QToolBar>
#include <QVBoxLayout>
#include "blocks_tree_widget.h"
#include "arbitrary_value_tooltip.h"
#include "round_progress_widget.h"
@ -370,8 +370,8 @@ BlocksTreeWidget::BlocksTreeWidget(QWidget* _parent)
}
m_hintLabel = new QLabel("Use Right Mouse Button on the Diagram to build a hierarchy...\n"
"1. Press the button >> Move mouse >> Release the button\n"
"2. Or just click the right mouse button on any block", this);
"Way 1: Press the button >> Move mouse >> Release the button\n"
"Way 2: Just click the right mouse button on any block", this);
m_hintLabel->setObjectName(QStringLiteral("BlocksTreeWidget_HintLabel"));
m_hintLabel->setProperty("hovered", false);
m_hintLabel->setAlignment(Qt::AlignCenter);
@ -464,13 +464,7 @@ bool BlocksTreeWidget::eventFilter(QObject* _object, QEvent* _event)
void BlocksTreeWidget::updateHintLabelOnHover(bool hover)
{
m_hintLabel->setProperty("hovered", hover);
m_hintLabel->style()->unpolish(m_hintLabel);
m_hintLabel->style()->polish(m_hintLabel);
if (m_hintLabel->isVisible())
{
m_hintLabel->update();
}
profiler_gui::updateProperty(m_hintLabel, "hovered", hover);
}
void BlocksTreeWidget::onHeaderSectionResized(int logicalIndex, int /*oldSize*/, int newSize)
@ -1153,9 +1147,7 @@ void BlocksTreeWidget::createProgressDialog()
{
destroyProgressDialog();
m_progress = new RoundProgressDialog("Building tree...", this);
m_progress->setWindowFlags(Qt::FramelessWindowHint);
m_progress->setAttribute(Qt::WA_TranslucentBackground);
m_progress = new RoundProgressDialog(QStringLiteral("Building tree..."), this);
m_progress->setValue(0);
m_progress->show();

View File

@ -55,11 +55,15 @@
#ifndef EASY_PROFILER_GUI_COMMON_FUNCTIONS_H
#define EASY_PROFILER_GUI_COMMON_FUNCTIONS_H
#include <QRgb>
#include <QString>
#include <QFont>
#include <stdlib.h>
#include <type_traits>
#include <QFont>
#include <QRgb>
#include <QString>
#include <QStyle>
#include <QWidget>
#include "common_types.h"
//////////////////////////////////////////////////////////////////////////
@ -220,6 +224,19 @@ double value2real(const ::profiler::ArbitraryValue& _serializedValue, int _index
//////////////////////////////////////////////////////////////////////////
template <class T>
void updateProperty(QWidget* widget, const char* name, T&& property)
{
widget->setProperty(name, std::forward<T>(property));
widget->style()->unpolish(widget);
widget->style()->polish(widget);
if (widget->isVisible())
{
widget->update();
}
}
} // END of namespace profiler_gui.
//////////////////////////////////////////////////////////////////////////

View File

@ -70,6 +70,7 @@
namespace profiler_gui {
const QString ORGANAZATION_NAME = "EasyProfiler";
const QString DEFAULT_WINDOW_TITLE = "EasyProfiler";
const QString APPLICATION_NAME = "Easy profiler gui application";
const QColor RULER_COLOR = QColor::fromRgba(0x40000000 | (::profiler::colors::RichBlue & 0x00ffffff));// 0x402020c0);

View File

@ -85,7 +85,6 @@
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QProgressDialog>
#include <QTextCodec>
#include <QPlainTextEdit>
#include <QTextStream>
@ -99,14 +98,16 @@
#include <QVBoxLayout>
#include <QWidgetAction>
#include "main_window.h"
#include "arbitrary_value_inspector.h"
#include "blocks_tree_widget.h"
#include "blocks_graphics_view.h"
#include "blocks_tree_widget.h"
#include "descriptors_tree_widget.h"
#include "fps_widget.h"
#include "globals.h"
#include "dialog.h"
#include "globals.h"
#include "fps_widget.h"
#include "round_progress_widget.h"
#include "main_window.h"
#include <easy/easy_net.h>
#include <easy/profiler.h>
@ -122,8 +123,6 @@
//////////////////////////////////////////////////////////////////////////
#define EASY_DEFAULT_WINDOW_TITLE "EasyProfiler"
const int LOADER_TIMER_INTERVAL = 40;
const auto NETWORK_CACHE_FILE = "easy_profiler_stream.cache";
@ -280,10 +279,7 @@ void DockWidget::toggleState()
void DockWidget::onTopLevelChanged()
{
m_floatingButton->setProperty("floating", isFloating());
m_floatingButton->style()->unpolish(m_floatingButton);
m_floatingButton->style()->polish(m_floatingButton);
m_floatingButton->update();
profiler_gui::updateProperty(m_floatingButton, "floating", isFloating());
}
void MainWindow::configureSizes()
@ -347,7 +343,7 @@ MainWindow::MainWindow() : Parent(), m_theme("default"), m_lastAddress("localhos
{ QIcon icon(":/images/logo"); if (!icon.isNull()) QApplication::setWindowIcon(icon); }
setObjectName("ProfilerGUI_MainWindow");
setWindowTitle(EASY_DEFAULT_WINDOW_TITLE);
setWindowTitle(profiler_gui::DEFAULT_WINDOW_TITLE);
setDockNestingEnabled(true);
setAcceptDrops(true);
setStatusBar(nullptr);
@ -1093,9 +1089,9 @@ void MainWindow::addFileToList(const QString& filename, bool changeWindowTitle)
if (changeWindowTitle)
{
if (m_bOpenedCacheFile)
setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1] - UNSAVED network cache file").arg(filename));
setWindowTitle(QString("%1 - [%2] - UNSAVED network cache file").arg(profiler_gui::DEFAULT_WINDOW_TITLE).arg(filename));
else
setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1]").arg(filename));
setWindowTitle(QString("%1 - [%2]").arg(profiler_gui::DEFAULT_WINDOW_TITLE).arg(filename));
}
return;
@ -1125,9 +1121,9 @@ void MainWindow::addFileToList(const QString& filename, bool changeWindowTitle)
if (changeWindowTitle)
{
if (m_bOpenedCacheFile)
setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1] - UNSAVED network cache file").arg(m_lastFiles.front()));
setWindowTitle(QString("%1 - [%2] - UNSAVED network cache file").arg(profiler_gui::DEFAULT_WINDOW_TITLE).arg(m_lastFiles.front()));
else
setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1]").arg(m_lastFiles.front()));
setWindowTitle(QString("%1 - [%2]").arg(profiler_gui::DEFAULT_WINDOW_TITLE).arg(m_lastFiles.front()));
}
}
@ -1325,7 +1321,7 @@ void MainWindow::clear()
m_bNetworkFileRegime = false;
m_bOpenedCacheFile = false;
setWindowTitle(EASY_DEFAULT_WINDOW_TITLE);
setWindowTitle(profiler_gui::DEFAULT_WINDOW_TITLE);
}
//////////////////////////////////////////////////////////////////////////
@ -1567,6 +1563,16 @@ void MainWindow::showEvent(QShowEvent* show_event)
configureSizes();
}
void MainWindow::resizeEvent(QResizeEvent* event)
{
Parent::resizeEvent(event);
if (m_progress != nullptr)
{
const auto pos = rect().center();
m_progress->move(pos.x() - (m_progress->width() >> 1), pos.y() - (m_progress->height() >> 1));
}
}
void MainWindow::closeEvent(QCloseEvent* close_event)
{
if (!m_bCloseAfterSave && (m_bNetworkFileRegime || EASY_GLOBALS.has_local_changes))
@ -1875,14 +1881,16 @@ void MainWindow::createProgressDialog(const QString& text)
{
destroyProgressDialog();
m_progress = new QProgressDialog(text, QStringLiteral("Cancel"), 0, 100, this);
connect(m_progress, &QProgressDialog::canceled, this, &This::onFileReaderCancel);
m_progress = new RoundProgressDialog(text, this);
m_progress->setCancelButtonEnabled(true);
connect(m_progress, &RoundProgressDialog::canceled, this, &This::onFileReaderCancel);
m_progress->setFixedWidth(px(300));
m_progress->setWindowTitle(EASY_DEFAULT_WINDOW_TITLE);
m_progress->setModal(true);
m_progress->setValue(0);
m_progress->show();
const auto pos = rect().center();
m_progress->move(pos.x() - (m_progress->width() >> 1), pos.y() - (m_progress->height() >> 1));
}
void MainWindow::setDisconnected(bool _showMessage)
@ -2145,7 +2153,7 @@ void MainWindow::onLoadingFinish(profiler::block_index_t& _nblocks)
else
{
m_bOpenedCacheFile = false;
setWindowTitle(EASY_DEFAULT_WINDOW_TITLE " - UNSAVED network cache");
setWindowTitle(QString("%1 - UNSAVED network cache").arg(profiler_gui::DEFAULT_WINDOW_TITLE));
}
m_serializedBlocks = std::move(serialized_blocks);
@ -2878,7 +2886,7 @@ void MainWindow::onSelectValue(profiler::thread_id_t _thread_id, uint32_t _value
void DialogWithGeometry::create(QWidget* content, QWidget* parent)
{
ptr = new Dialog(parent, EASY_DEFAULT_WINDOW_TITLE, content, WindowHeader::AllButtons, QMessageBox::NoButton);
ptr = new Dialog(parent, profiler_gui::DEFAULT_WINDOW_TITLE, content, WindowHeader::AllButtons, QMessageBox::NoButton);
ptr->setProperty("stayVisible", true);
ptr->setAttribute(Qt::WA_DeleteOnClose, true);
}

View File

@ -66,6 +66,7 @@
#include <easy/easy_socket.h>
#include <easy/reader.h>
#include "round_progress_widget.h"
#ifdef max
#undef max
@ -273,7 +274,7 @@ protected:
QDockWidget* m_descTreeWidget = nullptr;
#endif
class QProgressDialog* m_progress = nullptr;
class RoundProgressDialog* m_progress = nullptr;
class BlockDescriptorsWidget* m_dialogDescTree = nullptr;
class Dialog* m_listenerDialog = nullptr;
QTimer m_readerTimer;
@ -312,6 +313,7 @@ public:
// Public virtual methods
void showEvent(QShowEvent* event) override;
void resizeEvent(QResizeEvent* event) override;
void closeEvent(QCloseEvent* close_event) override;
void changeEvent(QEvent* event) override;
void dragEnterEvent(QDragEnterEvent* drag_event) override;

View File

@ -48,15 +48,23 @@
* : limitations under the License.
************************************************************************/
#include "round_progress_widget.h"
#include <math.h>
#include <easy/utility.h>
#include <QFontMetrics>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QLabel>
#include <QPainter>
#include <QStyle>
#include <QVariant>
#include <QVBoxLayout>
#include <easy/utility.h>
#include "common_functions.h"
#include "globals.h"
#include "round_progress_widget.h"
#ifdef max
# undef max
#endif
@ -67,9 +75,13 @@ RoundProgressIndicator::RoundProgressIndicator(QWidget* parent)
, m_background(Qt::transparent)
, m_color(Qt::green)
, m_value(0)
, m_pressed(false)
, m_cancelButtonEnabled(false)
{
setWindowFlags(Qt::FramelessWindowHint);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
setAutoFillBackground(false);
setProperty("hover", false);
}
RoundProgressIndicator::~RoundProgressIndicator()
@ -77,6 +89,17 @@ RoundProgressIndicator::~RoundProgressIndicator()
}
bool RoundProgressIndicator::cancelButtonEnabled() const
{
return m_cancelButtonEnabled;
}
void RoundProgressIndicator::setCancelButtonEnabled(bool enabled)
{
m_cancelButtonEnabled = enabled;
update();
}
int RoundProgressIndicator::value() const
{
return m_value;
@ -136,7 +159,7 @@ void RoundProgressIndicator::showEvent(QShowEvent* event)
const QFontMetrics fm(font());
const QString text = QStringLiteral("100%");
const int size = std::max(fm.width(text), fm.height()) + 4 * 4;
const int size = std::max(fm.width(text), fm.height()) + px(4 * 4);
setFixedSize(size, size);
}
@ -147,11 +170,12 @@ void RoundProgressIndicator::paintEvent(QPaintEvent* /*event*/)
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(Qt::NoBrush);
const auto r = rect().adjusted(4, 4, -4, -4);
const auto px4 = px(4);
auto r = rect().adjusted(px4, px4, -px4, -px4);
auto p = painter.pen();
// Draw circle
p.setWidth(4);
p.setWidth(px4);
p.setColor(m_background);
painter.setPen(p);
painter.drawArc(r, 0, 360 * 16);
@ -160,11 +184,87 @@ void RoundProgressIndicator::paintEvent(QPaintEvent* /*event*/)
painter.setPen(p);
painter.drawArc(r, 90 * 16, -1 * static_cast<int>(m_value) * 16 * 360 / 100);
// Draw text
p.setWidth(1);
p.setColor(palette().foreground().color());
painter.setPen(p);
painter.drawText(r, Qt::AlignCenter, m_text);
const bool hover = property("hover").toBool();
if (hover && m_cancelButtonEnabled)
{
// Draw cancel button (red cross)
const auto hquarter = px4 + (r.width() >> 2);
const auto vquarter = px4 + (r.height() >> 2);
r.adjust(hquarter, vquarter, -hquarter, -vquarter);
p.setWidth(px(2));
p.setColor(QColor::fromRgb(m_pressed ? profiler::colors::Red900 : profiler::colors::Red500));
p.setCapStyle(Qt::SquareCap);
painter.setPen(p);
painter.setBrush(Qt::NoBrush);
painter.drawLine(r.topLeft(), r.bottomRight());
painter.drawLine(r.bottomLeft(), r.topRight());
}
else
{
// Draw text
p.setWidth(px(1));
p.setColor(palette().foreground().color());
painter.setPen(p);
painter.drawText(r, Qt::AlignCenter, m_text);
}
}
void RoundProgressIndicator::enterEvent(QEvent* event) {
Parent::enterEvent(event);
profiler_gui::updateProperty(this, "hover", true);
}
void RoundProgressIndicator::leaveEvent(QEvent* event) {
Parent::leaveEvent(event);
profiler_gui::updateProperty(this, "hover", false);
}
void RoundProgressIndicator::mousePressEvent(QMouseEvent* event)
{
Parent::mousePressEvent(event);
m_pressed = true;
update();
}
void RoundProgressIndicator::mouseReleaseEvent(QMouseEvent* event)
{
Parent::mouseReleaseEvent(event);
const bool hover = property("hover").toBool();
const bool pressed = m_pressed;
m_pressed = false;
update();
if (pressed && hover && m_cancelButtonEnabled)
{
emit cancelButtonClicked();
}
}
void RoundProgressIndicator::mouseMoveEvent(QMouseEvent* event)
{
if (m_pressed)
{
const bool hover = property("hover").toBool();
if (rect().contains(event->pos()))
{
if (!hover)
{
profiler_gui::updateProperty(this, "hover", true);
}
}
else if (hover)
{
profiler_gui::updateProperty(this, "hover", false);
}
}
Parent::mouseMoveEvent(event);
}
RoundProgressWidget::RoundProgressWidget(QWidget* parent)
@ -179,11 +279,9 @@ RoundProgressWidget::RoundProgressWidget(const QString& title, QWidget* parent)
, m_indicator(new RoundProgressIndicator(this))
, m_titlePosition(RoundProgressWidget::Top)
{
setWindowFlags(Qt::FramelessWindowHint);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
m_indicatorWrapper->setWindowFlags(Qt::FramelessWindowHint);
m_indicatorWrapper->setAttribute(Qt::WA_TranslucentBackground);
setAutoFillBackground(false);
auto wlay = new QHBoxLayout(m_indicatorWrapper);
wlay->setContentsMargins(0, 0, 0, 0);
@ -192,6 +290,8 @@ RoundProgressWidget::RoundProgressWidget(const QString& title, QWidget* parent)
auto lay = new QVBoxLayout(this);
lay->addWidget(m_title);
lay->addWidget(m_indicatorWrapper);
connect(m_indicator, &RoundProgressIndicator::cancelButtonClicked, this, &RoundProgressWidget::canceled);
}
RoundProgressWidget::~RoundProgressWidget()
@ -262,6 +362,8 @@ void RoundProgressWidget::setTitlePosition(TitlePosition pos)
}
emit titlePositionChanged();
update();
}
bool RoundProgressWidget::isTopTitlePosition() const
@ -274,12 +376,32 @@ void RoundProgressWidget::setTopTitlePosition(bool isTop)
setTitlePosition(isTop ? RoundProgressWidget::Top : RoundProgressWidget::Bottom);
}
bool RoundProgressWidget::cancelButtonEnabled() const
{
return m_indicator->cancelButtonEnabled();
}
void RoundProgressWidget::setCancelButtonEnabled(bool enabled)
{
m_indicator->setCancelButtonEnabled(enabled);
}
RoundProgressDialog::RoundProgressDialog(const QString& title, QWidget* parent)
: Parent(parent)
, m_progress(new RoundProgressWidget(title, this))
, m_background(Qt::transparent)
{
setWindowTitle(profiler_gui::DEFAULT_WINDOW_TITLE);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
setAutoFillBackground(false);
auto lay = new QVBoxLayout(this);
lay->addWidget(m_progress);
connect(m_progress, &RoundProgressWidget::valueChanged, this, &RoundProgressDialog::valueChanged);
connect(m_progress, &RoundProgressWidget::finished, this, &RoundProgressDialog::finished);
connect(m_progress, &RoundProgressWidget::canceled, this, &RoundProgressDialog::canceled);
}
RoundProgressDialog::~RoundProgressDialog()
@ -287,6 +409,33 @@ RoundProgressDialog::~RoundProgressDialog()
}
QColor RoundProgressDialog::background() const
{
return m_background;
}
void RoundProgressDialog::setBackground(QColor color)
{
m_background = std::move(color);
update();
}
void RoundProgressDialog::setBackground(QString color)
{
m_background.setNamedColor(color);
update();
}
bool RoundProgressDialog::cancelButtonEnabled() const
{
return m_progress->cancelButtonEnabled();
}
void RoundProgressDialog::setCancelButtonEnabled(bool enabled)
{
m_progress->setCancelButtonEnabled(enabled);
}
void RoundProgressDialog::showEvent(QShowEvent* event)
{
Parent::showEvent(event);
@ -299,3 +448,12 @@ void RoundProgressDialog::setValue(int value)
if (value == 100)
hide();
}
void RoundProgressDialog::paintEvent(QPaintEvent*)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(m_background);
painter.drawRect(0, 0, width(), height());
}

View File

@ -53,8 +53,8 @@
#include <stdint.h>
#include <QColor>
#include <QWidget>
#include <QDialog>
#include <QWidget>
class RoundProgressIndicator : public QWidget
{
@ -63,10 +63,12 @@ Q_OBJECT
using Parent = QWidget;
using This = RoundProgressIndicator;
QString m_text;
QColor m_background;
QColor m_color;
int8_t m_value;
QString m_text;
QColor m_background;
QColor m_color;
int8_t m_value;
bool m_pressed;
bool m_cancelButtonEnabled;
public:
@ -83,6 +85,13 @@ public:
QColor background() const;
QColor color() const;
bool cancelButtonEnabled() const;
void setCancelButtonEnabled(bool enabled);
signals:
void cancelButtonClicked();
public slots:
void setBackground(QColor color);
@ -94,6 +103,11 @@ protected:
void showEvent(QShowEvent* event) override;
void paintEvent(QPaintEvent* event) override;
void enterEvent(QEvent* event) override;
void leaveEvent(QEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
}; // end of class RoundProgressIndicator.
@ -132,6 +146,9 @@ public:
TitlePosition titlePosition() const;
bool isTopTitlePosition() const;
bool cancelButtonEnabled() const;
void setCancelButtonEnabled(bool enabled);
public slots:
void setValue(int value);
@ -144,6 +161,7 @@ signals:
void valueChanged(int value);
void finished();
void titlePositionChanged();
void canceled();
}; // end of class RoundProgressWidget.
@ -155,20 +173,37 @@ class RoundProgressDialog : public QDialog
using This = RoundProgressDialog;
RoundProgressWidget* m_progress;
QColor m_background;
public:
Q_PROPERTY(QColor background READ background WRITE setBackground);
explicit RoundProgressDialog(const QString& title, QWidget* parent = nullptr);
~RoundProgressDialog() override;
QColor background() const;
bool cancelButtonEnabled() const;
void setCancelButtonEnabled(bool enabled);
protected:
void showEvent(QShowEvent* event) override;
void paintEvent(QPaintEvent* event) override;
public slots:
void setBackground(QColor color);
void setBackground(QString color);
void setValue(int value);
signals:
void valueChanged(int value);
void finished();
void canceled();
}; // end of RoundProgressDialog.
#endif // ROUND_PROGRESS_WIDGET_H

View File

@ -18,7 +18,10 @@ RoundProgressIndicator {
qproperty-color: #3297FD;
qproperty-background: #c4c4c4;
background: transparent; }
RoundProgressDialog {
qproperty-background: rgba(255, 255, 255, 70%); }
MainWindow, QToolBar, QDialog {
background-color: white; }
@ -305,9 +308,9 @@ QMenu::indicator:exclusive:checked:disabled {
/* ****************************************************************************************************************** */
QHeaderView::section {
height: 15.3ex;
min-height: 15.3ex;
max-height: 15.3ex;
height: 15ex;
min-height: 15ex;
max-height: 15ex;
background: #eeeeee;
/*{lin}font-weight: bold;*/ }

View File

@ -64,6 +64,10 @@ RoundProgressIndicator {
background: transparent;
}
RoundProgressDialog {
qproperty-background: rgba(255, 255, 255, 70%);
}
MainWindow, QToolBar, QDialog {
background-color: $BackgroundColor;
}
@ -411,9 +415,9 @@ QMenu::indicator:exclusive:checked:disabled {
/* ****************************************************************************************************************** */
QHeaderView::section {
height: 15.3ex;
min-height: 15.3ex;
max-height: 15.3ex;
height: $InputHeight;
min-height: $InputHeight;
max-height: $InputHeight;
background: #eeeeee;
/*{lin}font-weight: bold;*/
}

View File

@ -195,10 +195,7 @@ void WindowHeader::onWindowStateChanged()
{
if (m_maximizeButton != nullptr)
{
m_maximizeButton->setProperty("max", parentWidget()->isMaximized());
m_maximizeButton->style()->unpolish(m_maximizeButton);
m_maximizeButton->style()->polish(m_maximizeButton);
m_maximizeButton->update();
profiler_gui::updateProperty(m_maximizeButton, "max", parentWidget()->isMaximized());
setButtonSize(m_maximizeButton, height());
}
}