PrimeWorldEditor/src/Editor/UICommon.h

166 lines
5.0 KiB
C++

#ifndef UICOMMON
#define UICOMMON
#include "CEditorApplication.h"
#include <Common/TString.h>
#include <QDialogButtonBox>
#include <QFileDialog>
#include <QMap>
#include <QMessageBox>
#include <QString>
// App string variable handling - automatically fill in application name/version
#define UI_APPVAR_NAME "%APP_NAME%"
#define UI_APPVAR_FULLNAME "%APP_FULL_NAME%"
#define UI_APPVAR_VERSION "%APP_VERSION%"
#define REPLACE_APPVARS(InQString) \
InQString.replace(UI_APPVAR_NAME, APP_NAME); \
InQString.replace(UI_APPVAR_FULLNAME, APP_FULL_NAME); \
InQString.replace(UI_APPVAR_VERSION, APP_VERSION);
#define SET_WINDOWTITLE_APPVARS(InString) \
{ \
QString APPVAR_MACRO_NEWTITLE = InString; \
REPLACE_APPVARS(APPVAR_MACRO_NEWTITLE) \
setWindowTitle(APPVAR_MACRO_NEWTITLE); \
}
#define REPLACE_WINDOWTITLE_APPVARS \
SET_WINDOWTITLE_APPVARS(windowTitle());
// Common conversion functions
#define TO_QSTRING(Str) UICommon::ToQString(Str)
#define TO_TSTRING(Str) UICommon::ToTString(Str)
#define TO_CCOLOR(Clr) CColor::Integral(Clr.red(), Clr.green(), Clr.blue(), Clr.alpha())
#define TO_QCOLOR(Clr) QColor(Clr.R * 255, Clr.G * 255, Clr.B * 255, Clr.A * 255)
//@todo This name isn't ideal, too similar to ToWChar and so might cause confusion
#define TO_WCHAR(Str) ToWChar( UICommon::ToT16String(Str) )
#include <nod/Util.hpp>
#if NOD_UCS2
#define QStringToNodString(string) TO_WCHAR(string)
#else
#define QStringToNodString(string) string.toUtf8().data()
#endif
namespace UICommon
{
// Utility
QWindow* FindWidgetWindowHandle(QWidget* pWidget);
void OpenContainingFolder(QWidget* parent, const QString& pathIn);
bool OpenInExternalApplication(const QString& rkPath);
// Searches the widget's ancestry tree to find an ancestor of type ObjectT.
// ObjectT must be a QObject subclass.
template<typename ObjectT>
ObjectT* FindAncestor(QObject* pObject)
{
for (QObject* pParent = pObject->parent(); pParent; pParent = pParent->parent())
{
ObjectT* pCasted = qobject_cast<ObjectT*>(pParent);
if (pCasted)
{
return pCasted;
}
}
return nullptr;
}
// TString/TWideString <-> QString
inline QString ToQString(const TString& rkStr)
{
return QString::fromUtf8(*rkStr);
}
inline QString ToQString(const T16String& rkStr)
{
return QString::fromUtf16(*rkStr);
}
inline TString ToTString(const QString& rkStr)
{
return TString(rkStr.toStdString());
}
inline T16String ToT16String(const QString& rkStr)
{
return T16String(rkStr.toStdU16String());
}
// QFileDialog wrappers
// Note: pause editor ticks while file dialogs are open because otherwise there's a bug that makes it really difficult to tab out and back in
#define PUSH_TICKS_ENABLED \
bool TicksEnabled = gpEdApp->AreEditorTicksEnabled(); \
gpEdApp->SetEditorTicksEnabled(false);
#define POP_TICKS_ENABLED \
gpEdApp->SetEditorTicksEnabled(TicksEnabled);
inline QString OpenFileDialog(QWidget *pParent, const QString& rkCaption, const QString& rkFilter, const QString& rkStartingDir = "")
{
PUSH_TICKS_ENABLED;
QString Result = QFileDialog::getOpenFileName(pParent, rkCaption, rkStartingDir, rkFilter);
POP_TICKS_ENABLED;
return Result;
}
inline QStringList OpenFilesDialog(QWidget *pParent, const QString& rkCaption, const QString& rkFilter, const QString& rkStartingDir = "")
{
PUSH_TICKS_ENABLED;
QStringList Result = QFileDialog::getOpenFileNames(pParent, rkCaption, rkStartingDir, rkFilter);
POP_TICKS_ENABLED;
return Result;
}
inline QString SaveFileDialog(QWidget *pParent, const QString& rkCaption, const QString& rkFilter, const QString& rkStartingDir = "")
{
PUSH_TICKS_ENABLED;
QString Result = QFileDialog::getSaveFileName(pParent, rkCaption, rkStartingDir, rkFilter);
POP_TICKS_ENABLED;
return Result;
}
inline QString OpenDirDialog(QWidget *pParent, const QString& rkCaption, const QString& rkStartingDir = "")
{
PUSH_TICKS_ENABLED;
QString Result = QFileDialog::getExistingDirectory(pParent, rkCaption, rkStartingDir);
POP_TICKS_ENABLED;
return Result;
}
// QMessageBox wrappers
inline void InfoMsg(QWidget *pParent, QString InfoBoxTitle, QString InfoText)
{
QMessageBox::information(pParent, InfoBoxTitle, InfoText);
}
inline void ErrorMsg(QWidget *pParent, QString ErrorText)
{
QMessageBox::warning(pParent, "Error", ErrorText);
}
inline bool YesNoQuestion(QWidget *pParent, QString InfoBoxTitle, QString Question)
{
QMessageBox::StandardButton Button = QMessageBox::question(pParent, InfoBoxTitle, Question, QMessageBox::Yes | QMessageBox::No);
return Button == QMessageBox::Yes;
}
inline bool OpenProject()
{
QWidget* pMainWindow = (QWidget*) gpEdApp->WorldEditor();
QString ProjPath = UICommon::OpenFileDialog(pMainWindow, "Open Project", "Game Project (*.prj)");
return ProjPath.isEmpty() ? false : gpEdApp->OpenProject(ProjPath);
}
// Constants
const QColor kImportantButtonColor(36, 100, 100);
} // UICommon Namespace End
#endif // UICOMMON