Changed: #1301 Added dialog with a list of landscapes and operations (setActive, save, saveAs, delete).

--HG--
branch : gsoc2011-worldeditorqt
This commit is contained in:
dnk-88 2011-07-06 18:52:10 +03:00
parent 808d0f1b8e
commit d67fa1668d
4 changed files with 265 additions and 28 deletions

View file

@ -222,10 +222,11 @@ void ZoneBuilder::deleteZoneRegion(int id)
{ {
if ((0 <= id) && (id < int(m_landscapeItems.size()))) if ((0 <= id) && (id < int(m_landscapeItems.size())))
{ {
if (m_landscapeItems.at(id).rectItem != 0)
delete m_landscapeItems.at(id).rectItem;
m_landscapeScene->delZoneRegion(m_landscapeItems.at(id).zoneRegionObject->ligoZoneRegion()); m_landscapeScene->delZoneRegion(m_landscapeItems.at(id).zoneRegionObject->ligoZoneRegion());
delete m_landscapeItems.at(id).zoneRegionObject; delete m_landscapeItems.at(id).zoneRegionObject;
delete m_landscapeItems.at(id).builderZoneRegion; delete m_landscapeItems.at(id).builderZoneRegion;
delete m_landscapeItems.at(id).rectItem;
m_landscapeItems.erase(m_landscapeItems.begin() + id); m_landscapeItems.erase(m_landscapeItems.begin() + id);
calcMask(); calcMask();
} }
@ -236,10 +237,13 @@ void ZoneBuilder::setCurrentZoneRegion(int id)
if ((0 <= id) && (id < int(m_landscapeItems.size()))) if ((0 <= id) && (id < int(m_landscapeItems.size())))
{ {
if (currentIdZoneRegion() != -1) if (currentIdZoneRegion() != -1)
m_landscapeItems.at(m_currentZoneRegion).rectItem = m_landscapeScene->createLayerBlackout(currentZoneRegion()->ligoZoneRegion()); {
m_currentZoneRegion = id; NLLIGO::CZoneRegion &ligoRegion = m_landscapeItems.at(m_currentZoneRegion).zoneRegionObject->ligoZoneRegion();
m_landscapeItems.at(m_currentZoneRegion).rectItem = m_landscapeScene->createLayerBlackout(ligoRegion);
}
delete m_landscapeItems.at(id).rectItem; delete m_landscapeItems.at(id).rectItem;
m_landscapeItems.at(id).rectItem = 0; m_landscapeItems.at(id).rectItem = 0;
m_currentZoneRegion = id;
} }
} }

View file

@ -33,15 +33,20 @@
// Qt includes // Qt includes
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtGui/QMenu>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
namespace LandscapeEditor namespace LandscapeEditor
{ {
static const int LANDSCAPE_ID = 32;
int NewLandCounter = 0;
QString _lastDir; QString _lastDir;
LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent) LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent)
: QMainWindow(parent), : QMainWindow(parent),
m_currentRow(-1),
m_landscapeScene(0), m_landscapeScene(0),
m_zoneBuilder(0), m_zoneBuilder(0),
m_undoStack(0), m_undoStack(0),
@ -53,7 +58,7 @@ LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent)
m_landscapeScene = new LandscapeScene(this); m_landscapeScene = new LandscapeScene(this);
m_zoneBuilder = new ZoneBuilder(m_landscapeScene, m_ui.zoneListWidget, m_undoStack); m_zoneBuilder = new ZoneBuilder(m_landscapeScene, m_ui.zoneListWidget, m_undoStack);
m_zoneBuilder->init("e:/-nel-/install/continents/newbieland", true); m_zoneBuilder->init("e:/-nel-/install/continents/newbieland", false);
m_ui.zoneListWidget->setZoneBuilder(m_zoneBuilder); m_ui.zoneListWidget->setZoneBuilder(m_zoneBuilder);
m_ui.zoneListWidget->updateUi(); m_ui.zoneListWidget->updateUi();
@ -63,6 +68,12 @@ LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent)
m_oglWidget = new QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::SampleBuffers)); m_oglWidget = new QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::SampleBuffers));
m_ui.graphicsView->setViewport(m_oglWidget); m_ui.graphicsView->setViewport(m_oglWidget);
m_ui.newLandAction->setIcon(QIcon(Core::Constants::ICON_NEW));
m_ui.saveAction->setIcon(QIcon(Core::Constants::ICON_SAVE));
m_ui.saveLandAction->setIcon(QIcon(Core::Constants::ICON_SAVE));
m_ui.saveAsLandAction->setIcon(QIcon(Core::Constants::ICON_SAVE_AS));
m_ui.deleteLandAction->setEnabled(false);
createMenus(); createMenus();
createToolBars(); createToolBars();
readSettings(); readSettings();
@ -71,6 +82,16 @@ LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent)
connect(m_ui.projectSettingsAction, SIGNAL(triggered()), this, SLOT(openProjectSettings())); connect(m_ui.projectSettingsAction, SIGNAL(triggered()), this, SLOT(openProjectSettings()));
connect(m_ui.snapshotAction, SIGNAL(triggered()), this, SLOT(openSnapshotDialog())); connect(m_ui.snapshotAction, SIGNAL(triggered()), this, SLOT(openSnapshotDialog()));
connect(m_ui.enableGridAction, SIGNAL(toggled(bool)), m_ui.graphicsView, SLOT(setVisibleGrid(bool))); connect(m_ui.enableGridAction, SIGNAL(toggled(bool)), m_ui.graphicsView, SLOT(setVisibleGrid(bool)));
connect(m_ui.newLandAction, SIGNAL(triggered()), this, SLOT(newLand()));
connect(m_ui.setActiveLandAction, SIGNAL(triggered()), this, SLOT(setActiveLand()));
connect(m_ui.saveLandAction, SIGNAL(triggered()), this, SLOT(saveSelectedLand()));
connect(m_ui.saveAsLandAction, SIGNAL(triggered()), this, SLOT(saveAsSelectedLand()));
connect(m_ui.deleteLandAction, SIGNAL(triggered()), this, SLOT(deleteSelectedLand()));
connect(m_ui.landscapesListWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenu()));
m_ui.landscapesListWidget->setContextMenuPolicy(Qt::CustomContextMenu);
} }
LandscapeEditorWindow::~LandscapeEditorWindow() LandscapeEditorWindow::~LandscapeEditorWindow()
@ -97,17 +118,9 @@ void LandscapeEditorWindow::open()
_lastDir = QFileInfo(list.front()).absolutePath(); _lastDir = QFileInfo(list.front()).absolutePath();
Q_FOREACH(QString fileName, fileNames) Q_FOREACH(QString fileName, fileNames)
{ {
int id = m_zoneBuilder->createZoneRegion(fileName); int row = createLandscape(fileName);
if (id == -1) if (row != -1)
{ setActiveLandscape(row);
QMessageBox::critical(this, "Landscape Editor", "Cannot add this zone because it overlaps existing ones");
continue;
}
ZoneRegionObject *zoneRegion = m_zoneBuilder->zoneRegion(id);
m_ui.graphicsView->centerOn(zoneRegion->ligoZoneRegion().getMinX() * m_landscapeScene->cellSize(),
abs(zoneRegion->ligoZoneRegion().getMinY()) * m_landscapeScene->cellSize());
m_zoneBuilder->setCurrentZoneRegion(id);
} }
} }
setCursor(Qt::ArrowCursor); setCursor(Qt::ArrowCursor);
@ -115,16 +128,7 @@ void LandscapeEditorWindow::open()
void LandscapeEditorWindow::save() void LandscapeEditorWindow::save()
{ {
ZoneRegionObject *zoneRegion = m_zoneBuilder->currentZoneRegion(); saveLandscape(m_currentRow, true);
if (zoneRegion->fileName().empty())
{
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save NeL Ligo land file"), _lastDir,
tr("NeL Ligo land file (*.land)"));
if (!fileName.isEmpty())
zoneRegion->setFileName(fileName.toStdString());
}
zoneRegion->save();
} }
void LandscapeEditorWindow::openProjectSettings() void LandscapeEditorWindow::openProjectSettings()
@ -184,6 +188,133 @@ void LandscapeEditorWindow::openSnapshotDialog()
delete dialog; delete dialog;
} }
void LandscapeEditorWindow::customContextMenu()
{
if (m_ui.landscapesListWidget->currentRow() == -1)
return;
QMenu *popurMenu = new QMenu(this);
popurMenu->addAction(m_ui.setActiveLandAction);
popurMenu->addAction(m_ui.saveLandAction);
popurMenu->addAction(m_ui.saveAsLandAction);
popurMenu->addAction(m_ui.deleteLandAction);
popurMenu->exec(QCursor::pos());
delete popurMenu;
}
void LandscapeEditorWindow::newLand()
{
createLandscape(QString());
}
void LandscapeEditorWindow::setActiveLand()
{
setActiveLandscape(m_ui.landscapesListWidget->currentRow());
}
void LandscapeEditorWindow::saveSelectedLand()
{
saveLandscape(m_ui.landscapesListWidget->currentRow(), true);
}
void LandscapeEditorWindow::saveAsSelectedLand()
{
saveLandscape(m_ui.landscapesListWidget->currentRow(), false);
}
void LandscapeEditorWindow::deleteSelectedLand()
{
int row = m_ui.landscapesListWidget->currentRow();
QListWidgetItem *item = m_ui.landscapesListWidget->item(row);
if (row == m_currentRow)
{
if (row == 0)
++row;
else
--row;
setActiveLandscape(row);
}
m_zoneBuilder->deleteZoneRegion(item->data(LANDSCAPE_ID).toInt());
m_ui.landscapesListWidget->removeItemWidget(item);
delete item;
if (m_ui.landscapesListWidget->count() == 1)
m_ui.deleteLandAction->setEnabled(false);
}
int LandscapeEditorWindow::createLandscape(const QString &fileName)
{
int id;
if (fileName.isEmpty())
id = m_zoneBuilder->createZoneRegion();
else
id = m_zoneBuilder->createZoneRegion(fileName);
if (id == -1)
{
QMessageBox::critical(this, "Landscape Editor", "Cannot add this zone because it overlaps existing ones");
return -1;
}
ZoneRegionObject *zoneRegion = m_zoneBuilder->zoneRegion(id);
m_ui.graphicsView->centerOn(zoneRegion->ligoZoneRegion().getMinX() * m_landscapeScene->cellSize(),
abs(zoneRegion->ligoZoneRegion().getMinY()) * m_landscapeScene->cellSize());
QListWidgetItem *item;
if (fileName.isEmpty())
item = new QListWidgetItem(QString("NewLandscape%1").arg(NewLandCounter++), m_ui.landscapesListWidget);
else
item = new QListWidgetItem(fileName, m_ui.landscapesListWidget);
item->setData(LANDSCAPE_ID, id);
item->setFont(QFont("SansSerif", 9, QFont::Normal));
if (m_ui.landscapesListWidget->count() > 1)
m_ui.deleteLandAction->setEnabled(true);
return m_ui.landscapesListWidget->count() - 1;
}
void LandscapeEditorWindow::setActiveLandscape(int row)
{
if ((0 <= row) && (row < m_ui.landscapesListWidget->count()))
{
if (m_currentRow != -1)
{
QListWidgetItem *item = m_ui.landscapesListWidget->item(m_currentRow);
item->setFont(QFont("SansSerif", 9, QFont::Normal));
}
QListWidgetItem *item = m_ui.landscapesListWidget->item(row);
item->setFont(QFont("SansSerif", 9, QFont::Bold));
m_zoneBuilder->setCurrentZoneRegion(item->data(LANDSCAPE_ID).toInt());
m_currentRow = row;
}
}
void LandscapeEditorWindow::saveLandscape(int row, bool force)
{
if ((0 <= row) && (row < m_ui.landscapesListWidget->count()))
{
QListWidgetItem *item = m_ui.landscapesListWidget->item(row);
ZoneRegionObject *regionObject = m_zoneBuilder->zoneRegion(item->data(LANDSCAPE_ID).toInt());
if ((!force) || (regionObject->fileName().empty()))
{
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save NeL Ligo land file"), _lastDir,
tr("NeL Ligo land file (*.land)"));
if (!fileName.isEmpty())
{
regionObject->setFileName(fileName.toStdString());
regionObject->save();
regionObject->setModified(false);
item->setText(fileName);
}
}
else
{
regionObject->save();
regionObject->setModified(false);
}
}
}
void LandscapeEditorWindow::showEvent(QShowEvent *showEvent) void LandscapeEditorWindow::showEvent(QShowEvent *showEvent)
{ {
QMainWindow::showEvent(showEvent); QMainWindow::showEvent(showEvent);
@ -202,7 +333,23 @@ void LandscapeEditorWindow::createToolBars()
//QAction *action = menuManager->action(Core::Constants::NEW); //QAction *action = menuManager->action(Core::Constants::NEW);
//m_ui.fileToolBar->addAction(action); //m_ui.fileToolBar->addAction(action);
QAction *action = menuManager->action(Core::Constants::OPEN); QAction *action = menuManager->action(Core::Constants::OPEN);
m_ui.fileToolBar->addAction(m_ui.newLandAction);
m_ui.fileToolBar->addAction(action); m_ui.fileToolBar->addAction(action);
m_ui.fileToolBar->addAction(m_ui.saveAction);
const char * const UNDO = "ObjectViewerQt.Undo";
const char * const REDO = "ObjectViewerQt.Redo";
//action = menuManager->action(Core::Constants::UNDO);
action = menuManager->action(UNDO);
if (action != 0)
m_ui.undoToolBar->addAction(action);
//action = menuManager->action(Core::Constants::REDO);
action = menuManager->action(REDO);
if (action != 0)
m_ui.undoToolBar->addAction(action);
//action = menuManager->action(Core::Constants::SAVE); //action = menuManager->action(Core::Constants::SAVE);
//m_ui.fileToolBar->addAction(action); //m_ui.fileToolBar->addAction(action);
//action = menuManager->action(Core::Constants::SAVE_AS); //action = menuManager->action(Core::Constants::SAVE_AS);

View file

@ -49,6 +49,12 @@ public Q_SLOTS:
private Q_SLOTS: private Q_SLOTS:
void openProjectSettings(); void openProjectSettings();
void openSnapshotDialog(); void openSnapshotDialog();
void customContextMenu();
void newLand();
void setActiveLand();
void saveSelectedLand();
void saveAsSelectedLand();
void deleteSelectedLand();
protected: protected:
virtual void showEvent(QShowEvent *showEvent); virtual void showEvent(QShowEvent *showEvent);
@ -59,6 +65,11 @@ private:
void readSettings(); void readSettings();
void writeSettings(); void writeSettings();
void setActiveLandscape(int row);
void saveLandscape(int row, bool force);
int createLandscape(const QString &fileName);
int m_currentRow;
LandscapeScene *m_landscapeScene; LandscapeScene *m_landscapeScene;
ZoneBuilder *m_zoneBuilder; ZoneBuilder *m_zoneBuilder;
QUndoStack *m_undoStack; QUndoStack *m_undoStack;

View file

@ -62,7 +62,7 @@
</attribute> </attribute>
<widget class="LandscapeEditor::ListZonesWidget" name="zoneListWidget"/> <widget class="LandscapeEditor::ListZonesWidget" name="zoneListWidget"/>
</widget> </widget>
<widget class="QToolBar" name="landToolBar"> <widget class="QToolBar" name="undoToolBar">
<property name="windowTitle"> <property name="windowTitle">
<string>toolBar_2</string> <string>toolBar_2</string>
</property> </property>
@ -72,9 +72,40 @@
<attribute name="toolBarBreak"> <attribute name="toolBarBreak">
<bool>false</bool> <bool>false</bool>
</attribute> </attribute>
<addaction name="saveAction"/> </widget>
<addaction name="snapshotAction"/> <widget class="QDockWidget" name="landscapesDockWidget">
<property name="windowTitle">
<string>Landscapes</string>
</property>
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QGridLayout" name="gridLayout_2">
<property name="margin">
<number>3</number>
</property>
<property name="spacing">
<number>3</number>
</property>
<item row="0" column="0">
<widget class="QListWidget" name="landscapesListWidget"/>
</item>
</layout>
</widget>
</widget>
<widget class="QToolBar" name="zoneToolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="projectSettingsAction"/> <addaction name="projectSettingsAction"/>
<addaction name="snapshotAction"/>
<addaction name="enableGridAction"/> <addaction name="enableGridAction"/>
</widget> </widget>
<action name="projectSettingsAction"> <action name="projectSettingsAction">
@ -113,6 +144,50 @@
<string>Save</string> <string>Save</string>
</property> </property>
</action> </action>
<action name="setActiveLandAction">
<property name="icon">
<iconset resource="landscape_editor.qrc">
<normaloff>:/icons/ic_nel_zone.png</normaloff>:/icons/ic_nel_zone.png</iconset>
</property>
<property name="text">
<string>Set active</string>
</property>
<property name="toolTip">
<string>Set active selected landscape</string>
</property>
</action>
<action name="saveLandAction">
<property name="text">
<string>Save</string>
</property>
<property name="toolTip">
<string>Save selected landscape</string>
</property>
</action>
<action name="saveAsLandAction">
<property name="text">
<string>Save As landscape</string>
</property>
<property name="toolTip">
<string>Save as selected landscape</string>
</property>
</action>
<action name="deleteLandAction">
<property name="text">
<string>Delete</string>
</property>
<property name="toolTip">
<string>Delete selected landscape</string>
</property>
</action>
<action name="newLandAction">
<property name="text">
<string>New</string>
</property>
<property name="toolTip">
<string>Create new landscape</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>