mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-26 16:36:31 +00:00
Move common Qt utility functions & JSON I/O together in a single place
This commit is contained in:
@@ -25,7 +25,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDebug>
|
||||
#include <QFileDialog>
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
#include <QMessageBox>
|
||||
@@ -194,163 +193,3 @@ private:
|
||||
QProgressDialog *m_Progress;
|
||||
MainWindow *m_MainWindow;
|
||||
};
|
||||
|
||||
// implementation of QOverload, to avoid depending on 5.7.
|
||||
// From: http://stackoverflow.com/a/16795664/4070143
|
||||
template <typename... Args>
|
||||
struct OverloadedSlot
|
||||
{
|
||||
template <typename C, typename R>
|
||||
static constexpr auto of(R (C::*pmf)(Args...)) -> decltype(pmf)
|
||||
{
|
||||
return pmf;
|
||||
}
|
||||
};
|
||||
|
||||
// Utility class for invoking a lambda on the GUI thread.
|
||||
// This is supported by QTimer::singleShot on Qt 5.4 but it's probably
|
||||
// wise not to require a higher version that necessary.
|
||||
#include <functional>
|
||||
|
||||
class GUIInvoke : public QObject
|
||||
{
|
||||
private:
|
||||
Q_OBJECT
|
||||
GUIInvoke(const std::function<void()> &f) : func(f) {}
|
||||
std::function<void()> func;
|
||||
|
||||
public:
|
||||
static void call(const std::function<void()> &f);
|
||||
static void blockcall(const std::function<void()> &f);
|
||||
|
||||
protected slots:
|
||||
void doInvoke()
|
||||
{
|
||||
func();
|
||||
deleteLater();
|
||||
}
|
||||
};
|
||||
|
||||
// Utility class for calling a lambda on a new thread.
|
||||
#include <QThread>
|
||||
|
||||
class LambdaThread : public QObject
|
||||
{
|
||||
private:
|
||||
Q_OBJECT
|
||||
|
||||
std::function<void()> m_func;
|
||||
QThread *m_Thread;
|
||||
QSemaphore completed;
|
||||
bool m_SelfDelete = false;
|
||||
|
||||
public slots:
|
||||
void process()
|
||||
{
|
||||
m_func();
|
||||
m_Thread->quit();
|
||||
m_Thread->deleteLater();
|
||||
m_Thread = NULL;
|
||||
if(m_SelfDelete)
|
||||
deleteLater();
|
||||
completed.acquire();
|
||||
}
|
||||
|
||||
void selfDelete(bool d) { m_SelfDelete = d; }
|
||||
public:
|
||||
explicit LambdaThread(std::function<void()> f)
|
||||
{
|
||||
completed.release();
|
||||
m_Thread = new QThread();
|
||||
m_func = f;
|
||||
moveToThread(m_Thread);
|
||||
QObject::connect(m_Thread, &QThread::started, this, &LambdaThread::process);
|
||||
}
|
||||
|
||||
void start(QThread::Priority prio = QThread::InheritPriority) { m_Thread->start(prio); }
|
||||
bool isRunning() { return completed.available(); }
|
||||
bool wait(unsigned long time = ULONG_MAX)
|
||||
{
|
||||
if(m_Thread)
|
||||
return m_Thread->wait(time);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class QMenu;
|
||||
|
||||
// helper for doing a manual blocking invoke of a dialog
|
||||
struct RDDialog
|
||||
{
|
||||
static void show(QMenu *menu, QPoint pos);
|
||||
static int show(QDialog *dialog);
|
||||
static QMessageBox::StandardButton messageBox(
|
||||
QMessageBox::Icon, QWidget *parent, const QString &title, const QString &text,
|
||||
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
||||
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton);
|
||||
|
||||
static QMessageBox::StandardButton information(
|
||||
QWidget *parent, const QString &title, const QString &text,
|
||||
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
||||
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)
|
||||
{
|
||||
return messageBox(QMessageBox::Information, parent, title, text, buttons, defaultButton);
|
||||
}
|
||||
|
||||
static QMessageBox::StandardButton question(
|
||||
QWidget *parent, const QString &title, const QString &text,
|
||||
QMessageBox::StandardButtons buttons = QMessageBox::StandardButtons(QMessageBox::Yes |
|
||||
QMessageBox::No),
|
||||
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)
|
||||
{
|
||||
return messageBox(QMessageBox::Question, parent, title, text, buttons, defaultButton);
|
||||
}
|
||||
|
||||
static QMessageBox::StandardButton warning(
|
||||
QWidget *parent, const QString &title, const QString &text,
|
||||
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
||||
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)
|
||||
{
|
||||
return messageBox(QMessageBox::Warning, parent, title, text, buttons, defaultButton);
|
||||
}
|
||||
|
||||
static QMessageBox::StandardButton critical(
|
||||
QWidget *parent, const QString &title, const QString &text,
|
||||
QMessageBox::StandardButtons buttons = QMessageBox::Ok,
|
||||
QMessageBox::StandardButton defaultButton = QMessageBox::NoButton)
|
||||
{
|
||||
return messageBox(QMessageBox::Critical, parent, title, text, buttons, defaultButton);
|
||||
}
|
||||
|
||||
static QString getExistingDirectory(QWidget *parent = NULL, const QString &caption = QString(),
|
||||
const QString &dir = QString(),
|
||||
QFileDialog::Options options = QFileDialog::ShowDirsOnly);
|
||||
|
||||
static QString getOpenFileName(QWidget *parent = NULL, const QString &caption = QString(),
|
||||
const QString &dir = QString(), const QString &filter = QString(),
|
||||
QString *selectedFilter = NULL,
|
||||
QFileDialog::Options options = QFileDialog::Options());
|
||||
|
||||
static QString getSaveFileName(QWidget *parent = NULL, const QString &caption = QString(),
|
||||
const QString &dir = QString(), const QString &filter = QString(),
|
||||
QString *selectedFilter = NULL,
|
||||
QFileDialog::Options options = QFileDialog::Options());
|
||||
};
|
||||
|
||||
// useful delegate for enforcing a given size
|
||||
#include <QItemDelegate>
|
||||
|
||||
class SizeDelegate : public QItemDelegate
|
||||
{
|
||||
private:
|
||||
Q_OBJECT
|
||||
|
||||
QSize m_Size;
|
||||
|
||||
public:
|
||||
SizeDelegate(QSize size) : m_Size(size) {}
|
||||
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||
{
|
||||
return m_Size;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user