1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-07-19 11:18:00 +02:00
openrw/rwviewer/ViewerWindow.cpp

209 lines
6.0 KiB
C++
Raw Normal View History

2014-02-10 13:41:05 +01:00
#include "ViewerWindow.hpp"
2016-09-09 22:13:21 +02:00
#include <ViewerWidget.hpp>
2015-04-13 02:48:29 +02:00
#include "views/ModelViewer.hpp"
2016-09-09 22:13:21 +02:00
#include "views/ObjectViewer.hpp"
#include "views/WorldViewer.hpp"
2017-09-07 19:03:18 +02:00
#include "views/TextViewer.hpp"
#include <engine/GameState.hpp>
2014-02-11 06:46:29 +01:00
#include <engine/GameWorld.hpp>
2015-04-13 02:48:29 +02:00
#include <render/GameRenderer.hpp>
2014-02-10 17:15:22 +01:00
#include <QApplication>
2016-09-09 22:13:21 +02:00
#include <QFileDialog>
#include <QMenuBar>
#include <QPushButton>
2016-09-09 22:13:21 +02:00
#include <QSettings>
#include <QWindow>
#include <QMessageBox>
2014-02-10 13:41:05 +01:00
2014-06-08 02:58:49 +02:00
static int MaxRecentGames = 5;
2014-02-11 15:41:46 +01:00
ViewerWindow::ViewerWindow(QWidget* parent, Qt::WindowFlags flags)
2016-09-09 22:13:21 +02:00
: QMainWindow(parent, flags)
2018-08-10 02:40:23 +02:00
, m_context(this)
2016-09-09 22:13:21 +02:00
, gameData(nullptr)
, gameWorld(nullptr)
, renderer(nullptr) {
show();
2016-09-09 22:13:21 +02:00
setMinimumSize(640, 480);
createMenus();
if (!setupEngine()) {
return;
}
createDefaultViews();
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::createMenus() {
2016-09-09 22:13:21 +02:00
QMenuBar* mb = this->menuBar();
QMenu* file = mb->addMenu("&File");
file->addAction("Open &Game", this, SLOT(loadGame()));
file->addSeparator();
for (int i = 0; i < MaxRecentGames; ++i) {
QAction* r = file->addAction("");
recentGames.append(r);
2017-09-07 19:03:18 +02:00
connect(r, &QAction::triggered, this, [r, this]() {
QString recentGame = r->data().toString();
loadGame(recentGame);
});
2016-09-09 22:13:21 +02:00
}
recentSep = file->addSeparator();
auto ex = file->addAction("E&xit");
ex->setShortcut(QKeySequence::Quit);
2017-09-07 19:03:18 +02:00
connect(ex, &QAction::triggered,
QApplication::instance(), &QApplication::closeAllWindows);
2016-09-09 22:13:21 +02:00
mb->addMenu("&Data");
updateRecentGames();
}
bool ViewerWindow::setupEngine() {
QSurfaceFormat format = windowHandle()->format();
format.setProfile(QSurfaceFormat::CoreProfile);
format.setVersion(3,3);
2018-08-10 02:40:23 +02:00
m_context.setup(format);
hiddenSurface = new QOffscreenSurface(windowHandle()->screen());
hiddenSurface->setFormat(format);
hiddenSurface->create();
2018-08-10 02:40:23 +02:00
if (!m_context.create()) {
QMessageBox::critical(this, "OpenGL Failure",
"Failed to create OpenGL context");
QApplication::exit(1);
return false;
2016-09-09 22:13:21 +02:00
}
return true;
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::createDefaultViews() {
views = new QTabWidget(this);
2016-09-09 22:13:21 +02:00
auto objectView = new ObjectViewer(this);
views->addTab(objectView, "Objects");
connect(this, &ViewerWindow::gameLoaded, objectView, &ObjectViewer::showData);
2016-09-09 22:13:21 +02:00
auto modelView = new ModelViewer(this);
views->addTab(modelView, "Model");
connect(this, &ViewerWindow::gameLoaded, modelView, &ModelViewer::showData);
connect(objectView, &ObjectViewer::showObjectModel, modelView, &ModelViewer::showObject);
2016-09-09 22:13:21 +02:00
auto worldView = new WorldViewer(this);
views->addTab(worldView, "World");
connect(this, &ViewerWindow::gameLoaded, worldView, &WorldViewer::showData);
2017-09-07 19:03:18 +02:00
auto textView = new TextViewer(this);
views->addTab(textView, "Texts");
connect(this, &ViewerWindow::gameLoaded, textView, &TextViewer::showData);
setCentralWidget(views);
2014-02-10 16:34:09 +01:00
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::showEvent(QShowEvent*) {
static bool first = true;
if (first) {
QSettings settings("OpenRW", "rwviewer");
restoreGeometry(settings.value("window/geometry").toByteArray());
restoreState(settings.value("window/windowState").toByteArray());
first = false;
}
2014-02-12 08:12:40 +01:00
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::closeEvent(QCloseEvent* event) {
QSettings settings("OpenRW", "rwviewer");
settings.setValue("window/geometry", saveGeometry());
settings.setValue("window/windowState", saveState());
QMainWindow::closeEvent(event);
2014-02-10 17:15:22 +01:00
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::loadGame() {
QString dir = QFileDialog::getExistingDirectory(
this, tr("Open Directory"), QDir::homePath(),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
2014-06-08 02:58:49 +02:00
2016-09-09 22:13:21 +02:00
if (dir.size() > 0) loadGame(dir);
2014-06-08 02:58:49 +02:00
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::loadGame(const QString& path) {
QDir gameDir(path);
if (path.isEmpty()) {
return;
}
if (!gameDir.exists()) {
QMessageBox::critical(this, "Error", "The requested path doesn't exist");
return;
}
if (!makeCurrent()) {
return;
}
2014-06-08 02:58:49 +02:00
gameData = std::make_unique<GameData>(&engineLog, gameDir.absolutePath().toStdString());
gameData->load();
gameWorld = std::make_unique<GameWorld>(&engineLog, gameData.get());
renderer = std::make_unique<GameRenderer>(&engineLog, gameData.get());
gameWorld->state = new GameState;
2015-04-13 02:48:29 +02:00
2017-09-07 19:03:18 +02:00
renderer->text.setFontTexture(FONT_PAGER, "pager");
renderer->text.setFontTexture(FONT_PRICEDOWN, "font1");
renderer->text.setFontTexture(FONT_ARIAL, "font2");
gameLoaded(gameWorld.get(), renderer.get());
2014-06-08 02:58:49 +02:00
2016-09-09 22:13:21 +02:00
QSettings settings("OpenRW", "rwviewer");
QStringList recent = settings.value("recentGames").toStringList();
recent.removeAll(path);
recent.prepend(path);
while (recent.size() > MaxRecentGames) recent.removeLast();
settings.setValue("recentGames", recent);
2014-06-08 02:58:49 +02:00
2016-09-09 22:13:21 +02:00
updateRecentGames();
2014-02-11 06:46:29 +01:00
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::showObjectModel(uint16_t) {
RW_MESSAGE("showObjectModel unimplemented"); // FIXME: unimplemented
}
2016-09-09 22:13:21 +02:00
void ViewerWindow::updateRecentGames() {
QSettings settings("OpenRW", "rwviewer");
QStringList recent = settings.value("recentGames").toStringList();
for (int i = 0; i < MaxRecentGames; ++i) {
if (i < recent.size()) {
QString fnm(QFileInfo(recent[i]).fileName());
recentGames[i]->setText(tr("&%1 - %2").arg(i).arg(fnm));
recentGames[i]->setData(recent[i]);
recentGames[i]->setVisible(true);
} else {
recentGames[i]->setVisible(false);
}
}
recentSep->setVisible(recent.size() > 0);
2014-02-11 15:41:46 +01:00
}
ViewerWindow::~ViewerWindow() {
}
bool ViewerWindow::makeCurrent() {
2018-08-10 02:40:23 +02:00
if (!m_context.makeCurrent(hiddenSurface)) {
QMessageBox::critical(this, "OpenGL", "makeCurrent failed");
QApplication::exit(1);
return false;
}
2018-08-10 02:40:23 +02:00
return true;
}
ViewerWidget *ViewerWindow::createViewer() {
2018-08-10 02:40:23 +02:00
auto view = new ViewerWidget(&m_context, windowHandle());
connect(this, &ViewerWindow::gameLoaded, view, &ViewerWidget::gameLoaded);
return view;
}