1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-18 17:40:48 +02:00
vcmi/mapeditor/mainwindow.cpp

212 lines
4.9 KiB
C++
Raw Normal View History

2022-08-28 23:28:36 +02:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication.h>
#include <QFileDialog>
2022-08-29 20:19:05 +02:00
#include <QFile>
#include <QMessageBox>
#include <QFileInfo>
2022-08-28 23:28:36 +02:00
#include "../lib/VCMIDirs.h"
#include "../lib/VCMI_Lib.h"
#include "../lib/logging/CBasicLogConfigurator.h"
#include "../lib/CConfigHandler.h"
#include "../lib/filesystem/Filesystem.h"
#include "../lib/GameConstants.h"
2022-08-29 20:19:05 +02:00
#include "../lib/mapping/CMapService.h"
#include "../lib/mapping/CMap.h"
2022-08-28 23:28:36 +02:00
#include "CGameInfo.h"
2022-08-30 00:44:02 +02:00
#include "maphandler.h"
2022-08-30 04:38:24 +02:00
#include "graphics.h"
2022-08-30 15:08:33 +02:00
#include "windownewmap.h"
2022-08-28 23:28:36 +02:00
static CBasicLogConfigurator * logConfig;
void init()
{
loadDLLClasses();
const_cast<CGameInfo*>(CGI)->setFromLib();
logGlobal->info("Initializing VCMI_Lib");
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//configure logging
const boost::filesystem::path logPath = VCMIDirs::get().userCachePath() / "VCMI_Editor_log.txt";
console = new CConsoleHandler();
logConfig = new CBasicLogConfigurator(logPath, console);
logConfig->configureDefault();
logGlobal->info("The log file will be saved to %s", logPath);
//init
preinitDLL(::console);
settings.init();
// Initialize logging based on settings
logConfig->configure();
logGlobal->debug("settings = %s", settings.toJsonNode().toJson());
// Some basic data validation to produce better error messages in cases of incorrect install
auto testFile = [](std::string filename, std::string message) -> bool
{
if (CResourceHandler::get()->existsResource(ResourceID(filename)))
return true;
logGlobal->error("Error: %s was not found!", message);
return false;
};
if(!testFile("DATA/HELP.TXT", "Heroes III data") ||
!testFile("MODS/VCMI/MOD.JSON", "VCMI data"))
{
QApplication::quit();
}
conf.init();
logGlobal->info("Loading settings");
CGI = new CGameInfo(); //contains all global informations about game (texts, lodHandlers, map handler etc.)
init();
2022-08-30 04:38:24 +02:00
graphics = new Graphics(); // should be before curh->init()
graphics->load();//must be after Content loading but should be in main thread
2022-08-28 23:28:36 +02:00
if(!testFile("DATA/new-menu/Background.png", "Cannot find file"))
{
QApplication::quit();
}
//now let's try to draw
auto resPath = *CResourceHandler::get()->getResourceName(ResourceID("DATA/new-menu/Background.png"));
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
2022-08-30 15:08:33 +02:00
sceneMini = new QGraphicsScene(this);
ui->minimapView->setScene(sceneMini);
scene->addPixmap(QPixmap(QString::fromStdString(resPath.native())));
show();
2022-08-28 23:28:36 +02:00
}
MainWindow::~MainWindow()
{
delete ui;
}
2022-08-30 15:08:33 +02:00
void MainWindow::reloadMap()
{
MapHandler mapHandler(map.get());
for(int j = 0; j < map->height; ++j)
{
for(int i = 0; i < map->width; ++i)
{
mapHandler.drawTerrainTile(i, j, 0);
mapHandler.drawObjects(i, j, 0);
}
}
auto mapSizePx = mapHandler.surface.rect();
float ratio = std::fmin(mapSizePx.width() / 256., mapSizePx.height() / 256.);
minimap = mapHandler.surface;
minimap.setDevicePixelRatio(ratio);
scene->clear();
scene->addPixmap(mapHandler.surface);
//ui->graphicsView->setSceneRect(mapHandler.surface.rect());
sceneMini->clear();
sceneMini->addPixmap(minimap);
}
void MainWindow::setMap(std::unique_ptr<CMap> cmap)
{
map = std::move(cmap);
unsaved = true;
filename.clear();
setWindowTitle(filename + " - VCMI Map Editor");
reloadMap();
}
2022-08-28 23:28:36 +02:00
void MainWindow::on_actionOpen_triggered()
{
2022-08-30 15:08:33 +02:00
auto filenameSelect = QFileDialog::getOpenFileName(this, tr("Open Image"), QString::fromStdString(VCMIDirs::get().userCachePath().native()), tr("Homm3 Files (*.vmap *.h3m)"));
2022-08-29 20:19:05 +02:00
2022-08-30 15:08:33 +02:00
if(filenameSelect.isNull())
2022-08-29 20:19:05 +02:00
return;
2022-08-30 15:08:33 +02:00
QFileInfo fi(filenameSelect);
2022-08-29 20:19:05 +02:00
std::string fname = fi.fileName().toStdString();
std::string fdir = fi.dir().path().toStdString();
2022-08-30 02:48:44 +02:00
ResourceID resId("MAPS/" + fname, EResType::MAP);
//ResourceID resId("MAPS/SomeMap.vmap", EResType::MAP);
2022-08-29 20:19:05 +02:00
if(!CResourceHandler::get()->existsResource(resId))
{
QMessageBox::information(this, "Failed to open map", "Only map folder is supported");
return;
}
CMapService mapService;
try
{
2022-08-30 00:44:02 +02:00
map = mapService.loadMap(resId);
2022-08-29 20:19:05 +02:00
}
catch(const std::exception & e)
{
QMessageBox::critical(this, "Failed to open map", e.what());
}
2022-08-30 00:44:02 +02:00
2022-08-30 15:08:33 +02:00
unsaved = false;
filename = filenameSelect;
setWindowTitle(filename + " - VCMI Map Editor");
2022-08-30 00:44:02 +02:00
2022-08-30 15:08:33 +02:00
reloadMap();
}
void MainWindow::on_actionSave_as_triggered()
{
if(!map)
return;
auto filenameSelect = QFileDialog::getSaveFileName(this, tr("Save map"), "", tr("VCMI maps (*.vmap)"));
if(filenameSelect.isNull())
return;
if(!unsaved && filenameSelect == filename)
return;
CMapService mapService;
try
2022-08-30 00:44:02 +02:00
{
2022-08-30 15:08:33 +02:00
mapService.saveMap(map, filenameSelect.toStdString());
2022-08-30 00:44:02 +02:00
}
2022-08-30 15:08:33 +02:00
catch(const std::exception & e)
{
QMessageBox::critical(this, "Failed to save map", e.what());
}
filename = filenameSelect;
unsaved = false;
setWindowTitle(filename + " - VCMI Map Editor");
}
void MainWindow::on_actionNew_triggered()
{
auto newMapDialog = new WindowNewMap(this);
2022-08-28 23:28:36 +02:00
}