mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-18 17:40:48 +02:00
Review and modifying object properties
This commit is contained in:
parent
2572744f00
commit
5a78703abc
@ -15,6 +15,8 @@ set(editor_SRCS
|
|||||||
mapview.cpp
|
mapview.cpp
|
||||||
radiopushbutton.cpp
|
radiopushbutton.cpp
|
||||||
objectbrowser.cpp
|
objectbrowser.cpp
|
||||||
|
inspector.cpp
|
||||||
|
mapsettings.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(editor_HEADERS
|
set(editor_HEADERS
|
||||||
@ -33,12 +35,15 @@ set(editor_HEADERS
|
|||||||
mapview.h
|
mapview.h
|
||||||
radiopushbutton.h
|
radiopushbutton.h
|
||||||
objectbrowser.h
|
objectbrowser.h
|
||||||
|
inspector.h
|
||||||
|
mapsettings.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(editor_FORMS
|
set(editor_FORMS
|
||||||
mainwindow.ui
|
mainwindow.ui
|
||||||
windownewmap.ui
|
windownewmap.ui
|
||||||
generatorprogress.ui
|
generatorprogress.ui
|
||||||
|
mapsettings.ui
|
||||||
)
|
)
|
||||||
|
|
||||||
assign_source_group(${editor_SRCS} ${editor_HEADERS} VCMI_launcher.rc)
|
assign_source_group(${editor_SRCS} ${editor_HEADERS} VCMI_launcher.rc)
|
||||||
|
185
mapeditor/inspector.cpp
Normal file
185
mapeditor/inspector.cpp
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
#include "StdInc.h"
|
||||||
|
#include "inspector.h"
|
||||||
|
#include "../lib/mapObjects/CObjectHandler.h"
|
||||||
|
#include "../lib/mapObjects/CObjectClassesHandler.h"
|
||||||
|
#include "../lib/mapObjects/CGTownInstance.h"
|
||||||
|
#include "../lib/spells/CSpellHandler.h"
|
||||||
|
|
||||||
|
void Inspector::setProperty(const QString & key, const QVariant & value)
|
||||||
|
{
|
||||||
|
if(!obj)
|
||||||
|
return;
|
||||||
|
|
||||||
|
setProperty(dynamic_cast<CGTownInstance*>(obj), key, value);
|
||||||
|
|
||||||
|
//updateProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Inspector::setProperty(CGTownInstance * object, const QString & key, const QVariant & value)
|
||||||
|
{
|
||||||
|
if(!object)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(key == "Owner")
|
||||||
|
{
|
||||||
|
PlayerColor owner(value.toString().toInt());
|
||||||
|
if(value == "NEUTRAL")
|
||||||
|
owner = PlayerColor::NEUTRAL;
|
||||||
|
if(value == "UNFLAGGABLE")
|
||||||
|
owner = PlayerColor::UNFLAGGABLE;
|
||||||
|
object->tempOwner = owner;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CGTownInstance * initialize(CGTownInstance * o)
|
||||||
|
{
|
||||||
|
if(!o)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
o->tempOwner = PlayerColor::NEUTRAL;
|
||||||
|
o->builtBuildings.insert(BuildingID::FORT);
|
||||||
|
o->builtBuildings.insert(BuildingID::DEFAULT);
|
||||||
|
|
||||||
|
for(auto spell : VLC->spellh->objects) //add all regular spells to town
|
||||||
|
{
|
||||||
|
if(!spell->isSpecial() && !spell->isCreatureAbility())
|
||||||
|
o->possibleSpells.push_back(spell->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Initializer::Initializer(CGObjectInstance * o)
|
||||||
|
{
|
||||||
|
initialize(dynamic_cast<CGTownInstance*>(o));
|
||||||
|
}
|
||||||
|
|
||||||
|
Inspector::Inspector(CGObjectInstance * o, QTableWidget * t): obj(o), table(t)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
/// Position of bottom-right corner of object on map
|
||||||
|
int3 pos;
|
||||||
|
/// Type of object, e.g. town, hero, creature.
|
||||||
|
Obj ID;
|
||||||
|
/// Subtype of object, depends on type
|
||||||
|
si32 subID;
|
||||||
|
/// Current owner of an object (when below PLAYER_LIMIT)
|
||||||
|
PlayerColor tempOwner;
|
||||||
|
/// Index of object in map's list of objects
|
||||||
|
ObjectInstanceID id;
|
||||||
|
/// Defines appearance of object on map (animation, blocked tiles, blit order, etc)
|
||||||
|
ObjectTemplate appearance;
|
||||||
|
/// If true hero can visit this object only from neighbouring tiles and can't stand on this object
|
||||||
|
bool blockVisit;
|
||||||
|
|
||||||
|
std::string instanceName;
|
||||||
|
std::string typeName;
|
||||||
|
std::string subTypeName;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void Inspector::updateProperties()
|
||||||
|
{
|
||||||
|
if(!obj)
|
||||||
|
return;
|
||||||
|
|
||||||
|
addProperty("Indentifier", obj);
|
||||||
|
addProperty("ID", obj->ID.getNum());
|
||||||
|
addProperty("SubID", obj->subID);
|
||||||
|
addProperty("InstanceName", obj->instanceName);
|
||||||
|
addProperty("TypeName", obj->typeName);
|
||||||
|
addProperty("SubTypeName", obj->subTypeName);
|
||||||
|
addProperty("Owner", obj->tempOwner, false);
|
||||||
|
|
||||||
|
auto factory = VLC->objtypeh->getHandlerFor(obj->ID, obj->subID);
|
||||||
|
addProperty("IsStatic", factory->isStaticObject());
|
||||||
|
|
||||||
|
table->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(CGObjectInstance * value)
|
||||||
|
{
|
||||||
|
using NumericPointer = unsigned long long;
|
||||||
|
static_assert(sizeof(CGObjectInstance *) == sizeof(NumericPointer),
|
||||||
|
"Compilied for 64 bit arcitecture. Use NumericPointer = unsigned int");
|
||||||
|
return new QTableWidgetItem(QString::number(reinterpret_cast<NumericPointer>(value)));
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(int value)
|
||||||
|
{
|
||||||
|
return new QTableWidgetItem(QString::number(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(bool value)
|
||||||
|
{
|
||||||
|
return new QTableWidgetItem(value ? "TRUE" : "FALSE");
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(const std::string & value)
|
||||||
|
{
|
||||||
|
return addProperty(QString::fromStdString(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(const QString & value)
|
||||||
|
{
|
||||||
|
return new QTableWidgetItem(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(const int3 & value)
|
||||||
|
{
|
||||||
|
return new QTableWidgetItem(QString("(%1, %2, %3)").arg(value.x, value.y, value.z));
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidgetItem * Inspector::addProperty(const PlayerColor & value)
|
||||||
|
{
|
||||||
|
//auto str = QString("PLAYER %1").arg(value.getNum());
|
||||||
|
auto str = QString::number(value.getNum());
|
||||||
|
if(value == PlayerColor::NEUTRAL)
|
||||||
|
str = "NEUTRAL";
|
||||||
|
if(value == PlayerColor::UNFLAGGABLE)
|
||||||
|
str = "UNFLAGGABLE";
|
||||||
|
return new QTableWidgetItem(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget * PlayerColorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.data().canConvert<int>())
|
||||||
|
{
|
||||||
|
auto *editor = new QComboBox(parent);
|
||||||
|
connect(editor, SIGNAL(activated(int)), this, SLOT(commitAndCloseEditor(int)));
|
||||||
|
return editor;
|
||||||
|
}
|
||||||
|
return QStyledItemDelegate::createEditor(parent, option, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerColorDelegate::commitAndCloseEditor(int id)
|
||||||
|
{
|
||||||
|
QComboBox *editor = qobject_cast<QComboBox *>(sender());
|
||||||
|
emit commitData(editor);
|
||||||
|
emit closeEditor(editor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerColorDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.data().canConvert<int>())
|
||||||
|
{
|
||||||
|
PlayerColor player(qvariant_cast<int>(index.data()));
|
||||||
|
QComboBox *editor = qobject_cast<QComboBox *>(editor);
|
||||||
|
editor->addItem(QString::number(player.getNum()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QStyledItemDelegate::setEditorData(editor, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerColorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.data().canConvert<int>())
|
||||||
|
{
|
||||||
|
QComboBox *editor = qobject_cast<QComboBox *>(editor);
|
||||||
|
model->setData(index, QVariant::fromValue(editor->currentText()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QStyledItemDelegate::setModelData(editor, model, index);
|
||||||
|
}
|
||||||
|
}
|
77
mapeditor/inspector.h
Normal file
77
mapeditor/inspector.h
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#ifndef INSPECTOR_H
|
||||||
|
#define INSPECTOR_H
|
||||||
|
|
||||||
|
#include <QTableWidget>
|
||||||
|
#include <QTableWidgetItem>
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
#include "../lib/int3.h"
|
||||||
|
#include "../lib/GameConstants.h"
|
||||||
|
|
||||||
|
class CGObjectInstance;
|
||||||
|
class CGTownInstance;
|
||||||
|
|
||||||
|
class Initializer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Initializer(CGObjectInstance *);
|
||||||
|
};
|
||||||
|
|
||||||
|
class Inspector
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Inspector(CGObjectInstance *, QTableWidget *);
|
||||||
|
|
||||||
|
void setProperty(const QString & key, const QVariant & value);
|
||||||
|
|
||||||
|
void updateProperties();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QTableWidgetItem * addProperty(int value);
|
||||||
|
QTableWidgetItem * addProperty(const std::string & value);
|
||||||
|
QTableWidgetItem * addProperty(const QString & value);
|
||||||
|
QTableWidgetItem * addProperty(const int3 & value);
|
||||||
|
QTableWidgetItem * addProperty(const PlayerColor & value);
|
||||||
|
QTableWidgetItem * addProperty(bool value);
|
||||||
|
QTableWidgetItem * addProperty(CGObjectInstance * value);
|
||||||
|
|
||||||
|
void setProperty(CGTownInstance * obj, const QString & key, const QVariant & value);
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void addProperty(const QString & key, const T & value, bool restricted = true)
|
||||||
|
{
|
||||||
|
auto * itemKey = new QTableWidgetItem(key);
|
||||||
|
auto * itemValue = addProperty(value);
|
||||||
|
itemKey->setFlags(Qt::NoItemFlags);
|
||||||
|
if(restricted)
|
||||||
|
itemValue->setFlags(Qt::NoItemFlags);
|
||||||
|
|
||||||
|
if(table->rowCount() < row + 1)
|
||||||
|
table->setRowCount(row + 1);
|
||||||
|
table->setItem(row, 0, itemKey);
|
||||||
|
table->setItem(row, 1, itemValue);
|
||||||
|
++row;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int row = 0;
|
||||||
|
QTableWidget * table;
|
||||||
|
CGObjectInstance * obj;
|
||||||
|
};
|
||||||
|
|
||||||
|
class PlayerColorDelegate : public QStyledItemDelegate
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
using QStyledItemDelegate::QStyledItemDelegate;
|
||||||
|
|
||||||
|
//void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||||
|
//QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||||
|
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||||
|
void setEditorData(QWidget *editor, const QModelIndex &index) const override;
|
||||||
|
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void commitAndCloseEditor(int);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INSPECTOR_H
|
@ -27,6 +27,7 @@
|
|||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
#include "windownewmap.h"
|
#include "windownewmap.h"
|
||||||
#include "objectbrowser.h"
|
#include "objectbrowser.h"
|
||||||
|
#include "inspector.h"
|
||||||
|
|
||||||
static CBasicLogConfigurator * logConfig;
|
static CBasicLogConfigurator * logConfig;
|
||||||
|
|
||||||
@ -62,6 +63,10 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
ui->mapView->setMain(this);
|
ui->mapView->setMain(this);
|
||||||
|
|
||||||
|
// Set current working dir to executable folder.
|
||||||
|
// This is important on Mac for relative paths to work inside DMG.
|
||||||
|
QDir::setCurrent(QApplication::applicationDirPath());
|
||||||
|
|
||||||
//configure logging
|
//configure logging
|
||||||
const boost::filesystem::path logPath = VCMIDirs::get().userCachePath() / "VCMI_Editor_log.txt";
|
const boost::filesystem::path logPath = VCMIDirs::get().userCachePath() / "VCMI_Editor_log.txt";
|
||||||
console = new CConsoleHandler();
|
console = new CConsoleHandler();
|
||||||
@ -172,6 +177,9 @@ MapHandler * MainWindow::getMapHandler()
|
|||||||
void MainWindow::resetMapHandler()
|
void MainWindow::resetMapHandler()
|
||||||
{
|
{
|
||||||
mapHandler.reset(new MapHandler(map.get()));
|
mapHandler.reset(new MapHandler(map.get()));
|
||||||
|
|
||||||
|
unsaved = true;
|
||||||
|
setWindowTitle(filename + "* - VCMI Map Editor");
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::setMapRaw(std::unique_ptr<CMap> cmap)
|
void MainWindow::setMapRaw(std::unique_ptr<CMap> cmap)
|
||||||
@ -701,6 +709,7 @@ void MainWindow::preparePreview(const QModelIndex &index, bool createNew)
|
|||||||
auto factory = VLC->objtypeh->getHandlerFor(objId, objSubId);
|
auto factory = VLC->objtypeh->getHandlerFor(objId, objSubId);
|
||||||
auto templ = factory->getTemplates()[templateId];
|
auto templ = factory->getTemplates()[templateId];
|
||||||
scenes[mapLevel]->selectionObjectsView.newObject = factory->create(templ);
|
scenes[mapLevel]->selectionObjectsView.newObject = factory->create(templ);
|
||||||
|
scenes[mapLevel]->selectionObjectsView.selectionMode = 2;
|
||||||
scenes[mapLevel]->selectionObjectsView.draw();
|
scenes[mapLevel]->selectionObjectsView.draw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -780,3 +789,36 @@ void MainWindow::on_actionFill_triggered()
|
|||||||
scenes[mapLevel]->updateViews();
|
scenes[mapLevel]->updateViews();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::loadInspector(CGObjectInstance * obj)
|
||||||
|
{
|
||||||
|
Inspector inspector(obj, ui->inspectorWidget);
|
||||||
|
inspector.updateProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_inspectorWidget_itemChanged(QTableWidgetItem *item)
|
||||||
|
{
|
||||||
|
if(!item->isSelected())
|
||||||
|
return;
|
||||||
|
|
||||||
|
int r = item->row();
|
||||||
|
int c = item->column();
|
||||||
|
if(c < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto * tableWidget = item->tableWidget();
|
||||||
|
|
||||||
|
//get identifier
|
||||||
|
auto identifier = tableWidget->item(0, 1)->text();
|
||||||
|
static_assert(sizeof(CGObjectInstance *) == sizeof(decltype(identifier.toLongLong())),
|
||||||
|
"Compilied for 64 bit arcitecture. Use .toInt() method");
|
||||||
|
|
||||||
|
CGObjectInstance * obj = reinterpret_cast<CGObjectInstance *>(identifier.toLongLong());
|
||||||
|
|
||||||
|
//get parameter name
|
||||||
|
auto param = tableWidget->item(r, c - 1)->text();
|
||||||
|
|
||||||
|
//set parameter
|
||||||
|
Inspector inspector(obj, tableWidget);
|
||||||
|
inspector.setProperty(param, item->text());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
class CMap;
|
class CMap;
|
||||||
class ObjectBrowser;
|
class ObjectBrowser;
|
||||||
|
class CGObjectInstance;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class MainWindow;
|
class MainWindow;
|
||||||
@ -37,6 +38,8 @@ public:
|
|||||||
|
|
||||||
void setStatusMessage(const QString & status);
|
void setStatusMessage(const QString & status);
|
||||||
|
|
||||||
|
void loadInspector(CGObjectInstance * obj);
|
||||||
|
|
||||||
MapView * getMapView();
|
MapView * getMapView();
|
||||||
|
|
||||||
int getMapLevel() const {return mapLevel;}
|
int getMapLevel() const {return mapLevel;}
|
||||||
@ -76,6 +79,8 @@ private slots:
|
|||||||
|
|
||||||
void on_toolBrush4_clicked(bool checked);
|
void on_toolBrush4_clicked(bool checked);
|
||||||
|
|
||||||
|
void on_inspectorWidget_itemChanged(QTableWidgetItem *item);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void treeViewSelected(const QModelIndex &selected, const QModelIndex &deselected);
|
void treeViewSelected(const QModelIndex &selected, const QModelIndex &deselected);
|
||||||
|
@ -213,7 +213,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>1</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="tab_2">
|
<widget class="QWidget" name="tab_2">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -223,7 +223,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Objects</string>
|
<string>Browser</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
@ -293,6 +293,59 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="tab">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Inspector</string>
|
||||||
|
</attribute>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QTableWidget" name="inspectorWidget">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked</set>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::SingleSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="columnCount">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderDefaultSectionSize">
|
||||||
|
<number>20</number>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Property</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Value</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
14
mapeditor/mapsettings.cpp
Normal file
14
mapeditor/mapsettings.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "mapsettings.h"
|
||||||
|
#include "ui_mapsettings.h"
|
||||||
|
|
||||||
|
MapSettings::MapSettings(QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::MapSettings)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
MapSettings::~MapSettings()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
22
mapeditor/mapsettings.h
Normal file
22
mapeditor/mapsettings.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
#ifndef MAPSETTINGS_H
|
||||||
|
#define MAPSETTINGS_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MapSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MapSettings : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MapSettings(QWidget *parent = nullptr);
|
||||||
|
~MapSettings();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MapSettings *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAPSETTINGS_H
|
102
mapeditor/mapsettings.ui
Normal file
102
mapeditor/mapsettings.ui
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MapSettings</class>
|
||||||
|
<widget class="QDialog" name="MapSettings">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>308</width>
|
||||||
|
<height>251</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Map settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Map description</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<widget class="QPlainTextEdit" name="plainTextEdit"/>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Map name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0" colspan="2">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Players amount</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="locale">
|
||||||
|
<locale language="English" country="UnitedStates"/>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QLineEdit" name="lineEdit"/>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>1</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>2</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>3</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>4</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>5</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>6</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>7</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>8</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -1,6 +1,7 @@
|
|||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "mapview.h"
|
#include "mapview.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
#include "inspector.h"
|
||||||
#include <QGraphicsSceneMouseEvent>
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
|
||||||
#include "../lib/mapping/CMapEditManager.h"
|
#include "../lib/mapping/CMapEditManager.h"
|
||||||
@ -99,10 +100,22 @@ void MapView::mouseMoveEvent(QMouseEvent *mouseEvent)
|
|||||||
auto sh = tile - tileStart;
|
auto sh = tile - tileStart;
|
||||||
sc->selectionObjectsView.shift = QPoint(sh.x, sh.y);
|
sc->selectionObjectsView.shift = QPoint(sh.x, sh.y);
|
||||||
|
|
||||||
if((sh.x || sh.y) && sc->selectionObjectsView.newObject)
|
if(sh.x || sh.y)
|
||||||
|
{
|
||||||
|
if(sc->selectionObjectsView.newObject)
|
||||||
{
|
{
|
||||||
sc->selectionObjectsView.shift = QPoint(tile.x, tile.y);
|
sc->selectionObjectsView.shift = QPoint(tile.x, tile.y);
|
||||||
sc->selectionObjectsView.selectObject(sc->selectionObjectsView.newObject);
|
sc->selectionObjectsView.selectObject(sc->selectionObjectsView.newObject);
|
||||||
|
sc->selectionObjectsView.selectionMode = 2;
|
||||||
|
}
|
||||||
|
else if(mouseEvent->buttons() & Qt::LeftButton)
|
||||||
|
{
|
||||||
|
if(sc->selectionObjectsView.selectionMode == 1)
|
||||||
|
{
|
||||||
|
sc->selectionObjectsView.clear();
|
||||||
|
sc->selectionObjectsView.selectObjects(tileStart.x, tileStart.y, tile.x, tile.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sc->selectionObjectsView.draw();
|
sc->selectionObjectsView.draw();
|
||||||
@ -196,9 +209,29 @@ void MapView::mousePressEvent(QMouseEvent *event)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sc->selectionObjectsView.clear();
|
|
||||||
if(event->button() == Qt::LeftButton)
|
if(event->button() == Qt::LeftButton)
|
||||||
sc->selectionObjectsView.selectObjectAt(tileStart.x, tileStart.y);
|
{
|
||||||
|
auto * obj = sc->selectionObjectsView.selectObjectAt(tileStart.x, tileStart.y);
|
||||||
|
if(obj)
|
||||||
|
{
|
||||||
|
if(sc->selectionObjectsView.isSelected(obj))
|
||||||
|
{
|
||||||
|
sc->selectionObjectsView.selectionMode = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sc->selectionObjectsView.clear();
|
||||||
|
sc->selectionObjectsView.selectionMode = 2;
|
||||||
|
sc->selectionObjectsView.selectObject(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sc->selectionObjectsView.clear();
|
||||||
|
sc->selectionObjectsView.selectionMode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sc->selectionObjectsView.shift = QPoint(0, 0);
|
||||||
sc->selectionObjectsView.draw();
|
sc->selectionObjectsView.draw();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -230,16 +263,23 @@ void MapView::mouseReleaseEvent(QMouseEvent *event)
|
|||||||
if(event->button() == Qt::RightButton)
|
if(event->button() == Qt::RightButton)
|
||||||
break;
|
break;
|
||||||
//switch position
|
//switch position
|
||||||
if(sc->selectionObjectsView.applyShift())
|
if(sc->selectionObjectsView.selectionMode == 2 && sc->selectionObjectsView.applyShift())
|
||||||
{
|
{
|
||||||
sc->selectionObjectsView.newObject = nullptr;
|
sc->selectionObjectsView.newObject = nullptr;
|
||||||
|
sc->selectionObjectsView.selectionMode = 0;
|
||||||
|
sc->selectionObjectsView.shift = QPoint(0, 0);
|
||||||
main->resetMapHandler();
|
main->resetMapHandler();
|
||||||
sc->updateViews();
|
sc->updateViews();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
sc->selectionObjectsView.selectionMode = 0;
|
||||||
sc->selectionObjectsView.shift = QPoint(0, 0);
|
sc->selectionObjectsView.shift = QPoint(0, 0);
|
||||||
sc->selectionObjectsView.draw();
|
sc->selectionObjectsView.draw();
|
||||||
|
//check if we have only one object
|
||||||
|
auto selection = sc->selectionObjectsView.getSelection();
|
||||||
|
if(selection.size() == 1)
|
||||||
|
main->loadInspector(*selection.begin());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -664,7 +704,7 @@ void SelectionObjectsView::draw()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//show translation
|
//show translation
|
||||||
if(shift.x() || shift.y())
|
if(selectionMode == 2 && (shift.x() || shift.y()))
|
||||||
{
|
{
|
||||||
painter.setOpacity(0.5);
|
painter.setOpacity(0.5);
|
||||||
auto newPos = QPoint(obj->getPosition().x, obj->getPosition().y) + shift;
|
auto newPos = QPoint(obj->getPosition().x, obj->getPosition().y) + shift;
|
||||||
@ -675,7 +715,7 @@ void SelectionObjectsView::draw()
|
|||||||
redraw();
|
redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
CGObjectInstance * SelectionObjectsView::selectObjectAt(int x, int y)
|
CGObjectInstance * SelectionObjectsView::selectObjectAt(int x, int y) const
|
||||||
{
|
{
|
||||||
if(!main->getMap() || !main->getMapHandler() || !main->getMap()->isInTheMap(int3(x, y, scene->level)))
|
if(!main->getMap() || !main->getMapHandler() || !main->getMap()->isInTheMap(int3(x, y, scene->level)))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -685,12 +725,11 @@ CGObjectInstance * SelectionObjectsView::selectObjectAt(int x, int y)
|
|||||||
//visitable is most important
|
//visitable is most important
|
||||||
for(auto & object : objects)
|
for(auto & object : objects)
|
||||||
{
|
{
|
||||||
if(!object.obj || selectedObjects.count(object.obj))
|
if(!object.obj)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(object.obj->visitableAt(x, y))
|
if(object.obj->visitableAt(x, y))
|
||||||
{
|
{
|
||||||
selectedObjects.insert(object.obj);
|
|
||||||
return object.obj;
|
return object.obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -698,12 +737,11 @@ CGObjectInstance * SelectionObjectsView::selectObjectAt(int x, int y)
|
|||||||
//if not visitable tile - try to get blocked
|
//if not visitable tile - try to get blocked
|
||||||
for(auto & object : objects)
|
for(auto & object : objects)
|
||||||
{
|
{
|
||||||
if(!object.obj || selectedObjects.count(object.obj))
|
if(!object.obj)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(object.obj->blockingAt(x, y))
|
if(object.obj->blockingAt(x, y))
|
||||||
{
|
{
|
||||||
selectedObjects.insert(object.obj);
|
|
||||||
return object.obj;
|
return object.obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -711,12 +749,11 @@ CGObjectInstance * SelectionObjectsView::selectObjectAt(int x, int y)
|
|||||||
//finally, we can take any object
|
//finally, we can take any object
|
||||||
for(auto & object : objects)
|
for(auto & object : objects)
|
||||||
{
|
{
|
||||||
if(!object.obj || selectedObjects.count(object.obj))
|
if(!object.obj)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(object.obj->coveringAt(x, y))
|
if(object.obj->coveringAt(x, y))
|
||||||
{
|
{
|
||||||
selectedObjects.insert(object.obj);
|
|
||||||
return object.obj;
|
return object.obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -738,6 +775,7 @@ bool SelectionObjectsView::applyShift()
|
|||||||
{
|
{
|
||||||
newObject->pos = pos;
|
newObject->pos = pos;
|
||||||
main->getMap()->getEditManager()->insertObject(newObject);
|
main->getMap()->getEditManager()->insertObject(newObject);
|
||||||
|
Initializer init(newObject);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -759,11 +797,25 @@ void SelectionObjectsView::deleteSelection()
|
|||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::set<CGObjectInstance *> SelectionObjectsView::selectObjects(int x1, int y1, int x2, int y2)
|
void SelectionObjectsView::selectObjects(int x1, int y1, int x2, int y2)
|
||||||
{
|
{
|
||||||
std::set<CGObjectInstance *> result;
|
if(!main->getMap() || !main->getMapHandler())
|
||||||
//TBD
|
return;
|
||||||
return result;
|
|
||||||
|
if(x1 > x2)
|
||||||
|
std::swap(x1, x2);
|
||||||
|
|
||||||
|
if(y1 > y2)
|
||||||
|
std::swap(y1, y2);
|
||||||
|
|
||||||
|
for(int j = y1; j < y2; ++j)
|
||||||
|
{
|
||||||
|
for(int i = x1; i < x2; ++i)
|
||||||
|
{
|
||||||
|
for(auto & o : main->getMapHandler()->getObjects(i, j, scene->level))
|
||||||
|
selectObject(o.obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelectionObjectsView::selectObject(CGObjectInstance * obj)
|
void SelectionObjectsView::selectObject(CGObjectInstance * obj)
|
||||||
@ -776,6 +828,11 @@ bool SelectionObjectsView::isSelected(const CGObjectInstance * obj) const
|
|||||||
return selectedObjects.count(const_cast<CGObjectInstance*>(obj));
|
return selectedObjects.count(const_cast<CGObjectInstance*>(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::set<CGObjectInstance*> SelectionObjectsView::getSelection() const
|
||||||
|
{
|
||||||
|
return selectedObjects;
|
||||||
|
}
|
||||||
|
|
||||||
void SelectionObjectsView::clear()
|
void SelectionObjectsView::clear()
|
||||||
{
|
{
|
||||||
selectedObjects.clear();
|
selectedObjects.clear();
|
||||||
|
@ -134,10 +134,11 @@ public:
|
|||||||
|
|
||||||
void draw();
|
void draw();
|
||||||
|
|
||||||
CGObjectInstance * selectObjectAt(int x, int y);
|
CGObjectInstance * selectObjectAt(int x, int y) const;
|
||||||
std::set<CGObjectInstance *> selectObjects(int x1, int y1, int x2, int y2);
|
void selectObjects(int x1, int y1, int x2, int y2);
|
||||||
void selectObject(CGObjectInstance *);
|
void selectObject(CGObjectInstance *);
|
||||||
bool isSelected(const CGObjectInstance *) const;
|
bool isSelected(const CGObjectInstance *) const;
|
||||||
|
std::set<CGObjectInstance*> getSelection() const;
|
||||||
void moveSelection(int x, int y);
|
void moveSelection(int x, int y);
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
@ -146,6 +147,7 @@ public:
|
|||||||
|
|
||||||
QPoint shift;
|
QPoint shift;
|
||||||
CGObjectInstance * newObject;
|
CGObjectInstance * newObject;
|
||||||
|
int selectionMode = 0; //0 - nothing, 1 - selection, 2 - movement
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::set<CGObjectInstance *> selectedObjects;
|
std::set<CGObjectInstance *> selectedObjects;
|
||||||
|
@ -68,6 +68,7 @@ void WindowNewMap::on_okButtong_clicked()
|
|||||||
|
|
||||||
mapGenOptions.setWaterContent(water);
|
mapGenOptions.setWaterContent(water);
|
||||||
mapGenOptions.setMonsterStrength(monster);
|
mapGenOptions.setMonsterStrength(monster);
|
||||||
|
|
||||||
CMapGenerator generator(mapGenOptions);
|
CMapGenerator generator(mapGenOptions);
|
||||||
|
|
||||||
//TODO: fix water and roads
|
//TODO: fix water and roads
|
||||||
|
Loading…
Reference in New Issue
Block a user