1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-09-03 00:59:47 +02:00
openrw/rwviewer/ViewerWindow.cpp

171 lines
4.5 KiB
C++
Raw Normal View History

2014-02-10 13:41:05 +01:00
#include "ViewerWindow.hpp"
2014-02-11 06:46:29 +01:00
#include <engine/GameWorld.hpp>
2014-02-10 13:41:05 +01:00
#include "ViewerWidget.hpp"
2014-06-08 02:58:49 +02:00
#include "ItemListWidget.hpp"
2014-02-12 07:42:07 +01:00
#include "ModelFramesWidget.hpp"
2014-03-01 12:19:33 +01:00
#include "AnimationListWidget.hpp"
2014-02-10 16:34:09 +01:00
#include <QMenuBar>
#include <QFileDialog>
2014-02-10 17:15:22 +01:00
#include <QApplication>
#include <QSettings>
2014-03-01 12:19:33 +01:00
#include <fstream>
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
2014-02-10 13:41:05 +01:00
ViewerWindow::ViewerWindow(QWidget* parent, Qt::WindowFlags flags): QMainWindow(parent, flags)
{
2014-02-10 16:34:09 +01:00
setMinimumSize(640, 480);
2014-02-10 13:41:05 +01:00
viewer = new ViewerWidget();
this->setCentralWidget(viewer);
2014-02-10 16:34:09 +01:00
2014-06-08 02:58:49 +02:00
itemsWidget = new ItemListWidget;
itemsWidget->setObjectName("archivewidget");
this->addDockWidget(Qt::LeftDockWidgetArea, itemsWidget);
2014-02-10 16:34:09 +01:00
2014-02-12 07:42:07 +01:00
frameswidget = new ModelFramesWidget;
frameswidget->setObjectName("frameswidget");
this->addDockWidget(Qt::RightDockWidgetArea, frameswidget);
2014-03-01 12:19:33 +01:00
animationswidget = new AnimationListWidget;
animationswidget->setObjectName("animationswidget");
this->addDockWidget(Qt::RightDockWidgetArea, animationswidget);
2014-02-12 07:42:07 +01:00
2014-02-10 16:34:09 +01:00
QMenuBar* mb = this->menuBar();
QMenu* file = mb->addMenu("&File");
2014-06-08 02:58:49 +02:00
file->addAction("Open &Game", this, SLOT(loadGame()));
2014-02-10 17:15:22 +01:00
file->addSeparator();
2014-06-08 02:58:49 +02:00
for(int i = 0; i < MaxRecentGames; ++i) {
2014-02-11 15:41:46 +01:00
QAction* r = file->addAction("");
2014-06-08 02:58:49 +02:00
recentGames.append(r);
2014-02-11 15:41:46 +01:00
connect(r, SIGNAL(triggered()), SLOT(openRecent()));
}
2014-06-08 02:58:49 +02:00
2014-02-11 15:41:46 +01:00
recentSep = file->addSeparator();
2014-02-12 08:12:40 +01:00
auto ex = file->addAction("E&xit");
ex->setShortcut(QKeySequence::Quit);
connect(ex, SIGNAL(triggered()), QApplication::instance(), SLOT(closeAllWindows()));
2014-03-01 12:19:33 +01:00
2014-06-10 01:46:48 +02:00
QMenu* data = mb->addMenu("&Data");
data->addAction("Export &Model", viewer, SLOT(exportModel()));
2014-03-01 12:19:33 +01:00
QMenu* anim = mb->addMenu("&Animation");
anim->addAction("Load &Animations", this, SLOT(openAnimations()));
2014-02-10 17:15:22 +01:00
2014-06-08 02:58:49 +02:00
connect(itemsWidget, SIGNAL(selectedItemChanged(qint16)), viewer, SLOT(showItem(qint16)));
connect(viewer, SIGNAL(dataLoaded(GameWorld*)), itemsWidget, SLOT(worldLoaded(GameWorld*)));
2014-06-10 17:47:44 +02:00
connect(viewer, SIGNAL(modelChanged(Model*)), frameswidget, SLOT(setModel(Model*)));
2014-03-01 12:19:33 +01:00
connect(animationswidget, SIGNAL(selectedAnimationChanged(Animation*)), viewer, SLOT(showAnimation(Animation*)));
2014-02-11 15:41:46 +01:00
2014-06-08 02:58:49 +02:00
updateRecentGames();
2014-02-10 16:34:09 +01:00
}
2014-02-12 08:12:40 +01: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-10 17:15:22 +01:00
void ViewerWindow::closeEvent(QCloseEvent* event)
{
QSettings settings("OpenRW", "rwviewer");
2014-02-12 08:12:40 +01:00
settings.setValue("window/geometry", saveGeometry());
settings.setValue("window/windowState", saveState());
2014-02-10 17:15:22 +01:00
QMainWindow::closeEvent(event);
}
2014-03-01 12:19:33 +01:00
void ViewerWindow::openAnimations()
{
QFileDialog dialog(this, "Open Animations", QDir::homePath(), "IFP Animations (*.ifp)");
if(dialog.exec()) {
std::ifstream dfile(dialog.selectedFiles().at(0).toStdString().c_str());
AnimationList anims;
if(dfile.is_open())
{
dfile.seekg(0, std::ios_base::end);
size_t length = dfile.tellg();
dfile.seekg(0);
char *file = new char[length];
dfile.read(file, length);
LoaderIFP loader;
if( loader.loadFromMemory(file) ) {
for(auto& f : loader.animations) {
anims.push_back(f);
}
}
delete[] file;
}
animationswidget->setAnimations(anims);
}
}
2014-06-08 02:58:49 +02:00
void ViewerWindow::loadGame()
2014-02-11 06:46:29 +01:00
{
2014-06-08 02:58:49 +02:00
QString dir = QFileDialog::getExistingDirectory(
this, tr("Open Directory"),
QDir::homePath(),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
if( dir.size() > 0 ) loadGame( dir );
}
void ViewerWindow::loadGame(const QString &path)
{
QDir gameDir( path );
if( gameDir.exists() && path.size() > 0 ) {
viewer->setGamePath( gameDir.absolutePath().toStdString() );
2014-02-12 07:42:07 +01:00
}
2014-06-08 02:58:49 +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);
updateRecentGames();
2014-02-11 06:46:29 +01:00
}
2014-02-11 15:41:46 +01:00
void ViewerWindow::openRecent()
{
QAction* r = qobject_cast< QAction* >(sender());
if(r) {
2014-06-08 02:58:49 +02:00
loadGame( r->data().toString() );
2014-02-11 15:41:46 +01:00
}
}
2014-06-08 02:58:49 +02:00
void ViewerWindow::updateRecentGames()
2014-02-11 15:41:46 +01:00
{
QSettings settings("OpenRW", "rwviewer");
2014-06-08 02:58:49 +02:00
QStringList recent = settings.value("recentGames").toStringList();
2014-02-11 15:41:46 +01:00
2014-06-08 02:58:49 +02:00
for(int i = 0; i < MaxRecentGames; ++i) {
2014-02-11 15:41:46 +01:00
if(i < recent.size()) {
QString fnm(QFileInfo(recent[i]).fileName());
2014-06-08 02:58:49 +02:00
recentGames[i]->setText(tr("&%1 - %2").arg(i).arg(fnm));
recentGames[i]->setData(recent[i]);
recentGames[i]->setVisible(true);
2014-02-11 15:41:46 +01:00
}
else {
2014-06-08 02:58:49 +02:00
recentGames[i]->setVisible(false);
2014-02-11 15:41:46 +01:00
}
}
recentSep->setVisible(recent.size() > 0);
}