diff --git a/src/Editor/ResourceBrowser/CResourceBrowser.cpp b/src/Editor/ResourceBrowser/CResourceBrowser.cpp index b07ddc32..2421eae7 100644 --- a/src/Editor/ResourceBrowser/CResourceBrowser.cpp +++ b/src/Editor/ResourceBrowser/CResourceBrowser.cpp @@ -20,6 +20,12 @@ CResourceBrowser::CResourceBrowser(QWidget *pParent) mpUI->setupUi(this); setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint); +#if PUBLIC_RELEASE + // Hide store select combo box in public release build; we don't want users to edit the editor store + mpUI->StoreLabel->setHidden(true); + mpUI->StoreComboBox->setHidden(true); +#endif + // Set up table models mpModel = new CResourceTableModel(this); mpProxyModel = new CResourceProxyModel(this); @@ -137,37 +143,40 @@ void CResourceBrowser::CreateFilterCheckboxes() mTypeList.clear(); - // No store - leave empty - if (!mpStore) return; - - // Get new type list - std::list TypeList; - CResTypeInfo::GetAllTypesInGame(mpStore->Game(), TypeList); - - for (auto Iter = TypeList.begin(); Iter != TypeList.end(); Iter++) + if (mpStore) { - CResTypeInfo *pType = *Iter; + // Get new type list + std::list TypeList; + CResTypeInfo::GetAllTypesInGame(mpStore->Game(), TypeList); - if (pType->IsVisibleInBrowser()) + for (auto Iter = TypeList.begin(); Iter != TypeList.end(); Iter++) { - QCheckBox *pCheck = new QCheckBox(this); - pCheck->setFont(mFilterBoxFont); - pCheck->setText(TO_QSTRING(pType->TypeName())); - mTypeList << SResourceType { pType, pCheck }; + CResTypeInfo *pType = *Iter; + + if (pType->IsVisibleInBrowser()) + { + QCheckBox *pCheck = new QCheckBox(this); + pCheck->setFont(mFilterBoxFont); + pCheck->setText(TO_QSTRING(pType->TypeName())); + mTypeList << SResourceType { pType, pCheck }; + } + } + + qSort(mTypeList.begin(), mTypeList.end(), [](const SResourceType& rkLeft, const SResourceType& rkRight) -> bool { + return rkLeft.pTypeInfo->TypeName().ToUpper() < rkRight.pTypeInfo->TypeName().ToUpper(); + }); + + // Add sorted checkboxes to the UI + foreach (const SResourceType& rkType, mTypeList) + { + QCheckBox *pCheck = rkType.pFilterCheckBox; + mpFilterBoxesLayout->addWidget(rkType.pFilterCheckBox); + connect(pCheck, SIGNAL(toggled(bool)), this, SLOT(OnFilterTypeBoxTicked(bool))); } } - qSort(mTypeList.begin(), mTypeList.end(), [](const SResourceType& rkLeft, const SResourceType& rkRight) -> bool { - return rkLeft.pTypeInfo->TypeName().ToUpper() < rkRight.pTypeInfo->TypeName().ToUpper(); - }); - - // Add sorted checkboxes to the UI - foreach (const SResourceType& rkType, mTypeList) - { - QCheckBox *pCheck = rkType.pFilterCheckBox; - mpFilterBoxesLayout->addWidget(rkType.pFilterCheckBox); - connect(pCheck, SIGNAL(toggled(bool)), this, SLOT(OnFilterTypeBoxTicked(bool))); - } + QSpacerItem *pSpacer = new QSpacerItem(0, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + mpFilterBoxesLayout->addSpacerItem(pSpacer); } void CResourceBrowser::RefreshResources() diff --git a/src/Editor/WorldEditor/CScriptEditSidebar.cpp b/src/Editor/WorldEditor/CScriptEditSidebar.cpp index b86057c5..810dfc0f 100644 --- a/src/Editor/WorldEditor/CScriptEditSidebar.cpp +++ b/src/Editor/WorldEditor/CScriptEditSidebar.cpp @@ -1,17 +1,29 @@ #include "CScriptEditSidebar.h" +#include "WEditorProperties.h" #include "WCreateTab.h" #include "WModifyTab.h" #include "WInstancesTab.h" #include "CWorldEditor.h" CScriptEditSidebar::CScriptEditSidebar(CWorldEditor *pEditor) - : QTabWidget(pEditor) + : QWidget(pEditor) { + QVBoxLayout *pLayout = new QVBoxLayout(this); + pLayout->setContentsMargins(1, 1, 1, 1); + pLayout->setSpacing(2); + + mpEditorProperties = new WEditorProperties(this); + mpEditorProperties->SyncToEditor(pEditor); + pLayout->addWidget(mpEditorProperties); + + mpTabWidget = new QTabWidget(this); mpCreateTab = new WCreateTab(pEditor, this); mpModifyTab = new WModifyTab(pEditor, this); mpInstancesTab = new WInstancesTab(pEditor, this); - addTab(mpCreateTab, QIcon(":/icons/Create.png"), "Create"); - addTab(mpModifyTab, QIcon(":/icons/Modify.png"), "Modify"); - addTab(mpInstancesTab, QIcon(":/icons/Instances.png"), "Instances"); + mpTabWidget->setIconSize(QSize(24, 24)); + mpTabWidget->addTab(mpCreateTab, QIcon(":/icons/Create.png"), ""); + mpTabWidget->addTab(mpModifyTab, QIcon(":/icons/Modify.png"), ""); + mpTabWidget->addTab(mpInstancesTab, QIcon(":/icons/Instances.png"), ""); + pLayout->addWidget(mpTabWidget); } diff --git a/src/Editor/WorldEditor/CScriptEditSidebar.h b/src/Editor/WorldEditor/CScriptEditSidebar.h index 3d845eef..87c60277 100644 --- a/src/Editor/WorldEditor/CScriptEditSidebar.h +++ b/src/Editor/WorldEditor/CScriptEditSidebar.h @@ -4,14 +4,17 @@ #include class CWorldEditor; +class WEditorProperties; class WCreateTab; class WModifyTab; class WInstancesTab; -class CScriptEditSidebar : public QTabWidget +class CScriptEditSidebar : public QWidget { Q_OBJECT + WEditorProperties *mpEditorProperties; + QTabWidget *mpTabWidget; WCreateTab *mpCreateTab; WModifyTab *mpModifyTab; WInstancesTab *mpInstancesTab; diff --git a/src/Editor/WorldEditor/CWorldEditor.cpp b/src/Editor/WorldEditor/CWorldEditor.cpp index c604be81..0fcc9712 100644 --- a/src/Editor/WorldEditor/CWorldEditor.cpp +++ b/src/Editor/WorldEditor/CWorldEditor.cpp @@ -14,6 +14,7 @@ #include "Editor/CSelectionIterator.h" #include "Editor/UICommon.h" #include "Editor/PropertyEdit/CPropertyView.h" +#include "Editor/ResourceBrowser/CResourceBrowser.h" #include "Editor/Widgets/WDraggableSpinBox.h" #include "Editor/Widgets/WVectorEditor.h" #include "Editor/Undo/UndoCommands.h" @@ -52,6 +53,7 @@ CWorldEditor::CWorldEditor(QWidget *parent) ui->splitter->setSizes(SplitterSizes); // Initialize UI stuff + ui->MainViewport->Camera().Snap(CVector3f(0.f, 5.f, 1.f)); ui->MainViewport->SetScene(this, &mScene); ui->MainViewport->setAcceptDrops(true); ui->TransformSpinBox->SetOrientation(Qt::Horizontal); @@ -76,6 +78,11 @@ CWorldEditor::CWorldEditor(QWidget *parent) mpScriptSidebar->setHidden(true); SetSidebarWidget(mpWorldInfoSidebar); + mpEditModeButtonGroup = new QButtonGroup(this); + mpEditModeButtonGroup->addButton( ui->EditWorldInfoButton, eWEM_WorldInfo ); + mpEditModeButtonGroup->addButton( ui->EditScriptButton, eWEM_EditScript ); + connect(mpEditModeButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(ChangeEditMode(int))); + // Initialize actions addAction(ui->ActionIncrementGizmo); addAction(ui->ActionDecrementGizmo); @@ -147,6 +154,10 @@ CWorldEditor::CWorldEditor(QWidget *parent) connect(ui->ActionLink, SIGNAL(toggled(bool)), this, SLOT(OnLinkButtonToggled(bool))); connect(ui->ActionUnlink, SIGNAL(triggered()), this, SLOT(OnUnlinkClicked())); + connect(ui->ActionResourceBrowser, SIGNAL(triggered()), this, SLOT(OpenResourceBrowser())); + connect(ui->ActionEditLayers, SIGNAL(triggered()), this, SLOT(EditLayers())); + connect(ui->ActionEditPoiToWorldMap, SIGNAL(triggered()), this, SLOT(EditPoiToWorldMap())); + connect(ui->ActionDrawWorld, SIGNAL(triggered()), this, SLOT(ToggleDrawWorld())); connect(ui->ActionDrawObjects, SIGNAL(triggered()), this, SLOT(ToggleDrawObjects())); connect(ui->ActionDrawCollision, SIGNAL(triggered()), this, SLOT(ToggleDrawCollision())); @@ -165,8 +176,6 @@ CWorldEditor::CWorldEditor(QWidget *parent) connect(ui->ActionIncrementGizmo, SIGNAL(triggered()), this, SLOT(IncrementGizmo())); connect(ui->ActionDecrementGizmo, SIGNAL(triggered()), this, SLOT(DecrementGizmo())); connect(ui->ActionCollisionRenderSettings, SIGNAL(triggered()), this, SLOT(EditCollisionRenderSettings())); - connect(ui->ActionEditLayers, SIGNAL(triggered()), this, SLOT(EditLayers())); - connect(ui->ActionEditPoiToWorldMap, SIGNAL(triggered()), this, SLOT(EditPoiToWorldMap())); } CWorldEditor::~CWorldEditor() @@ -224,8 +233,11 @@ bool CWorldEditor::CloseWorld() else return false; } -void CWorldEditor::SetArea(CWorld *pWorld, int AreaIndex) +bool CWorldEditor::SetArea(CWorld *pWorld, int AreaIndex) { + if (!CloseWorld()) + return false; + ExitPickMode(); ui->MainViewport->ResetHover(); ClearSelection(); @@ -311,6 +323,8 @@ void CWorldEditor::SetArea(CWorld *pWorld, int AreaIndex) // Make sure old area is destroyed gpResourceStore->DestroyUnreferencedResources(); + + return true; } bool CWorldEditor::CheckUnsavedChanges() @@ -462,6 +476,40 @@ bool CWorldEditor::SaveAndRepack() return true; } +void CWorldEditor::ChangeEditMode(int Mode) +{ + ChangeEditMode((EWorldEditorMode) Mode); +} + +void CWorldEditor::ChangeEditMode(EWorldEditorMode Mode) +{ + mpEditModeButtonGroup->blockSignals(true); + mpEditModeButtonGroup->button(Mode)->setChecked(true); + mpEditModeButtonGroup->blockSignals(false); + + switch (Mode) + { + case eWEM_WorldInfo: + SetSidebarWidget(mpWorldInfoSidebar); + break; + + case eWEM_EditScript: + SetSidebarWidget(mpScriptSidebar); + break; + + default: + ASSERT(false); + break; + } +} + +void CWorldEditor::OpenResourceBrowser() +{ + CResourceBrowser *pBrowser = gpEdApp->ResourceBrowser(); + pBrowser->show(); + pBrowser->raise(); +} + void CWorldEditor::OnActiveProjectChanged(CGameProject *pProj) { ui->ActionCloseProject->setEnabled( pProj != nullptr ); @@ -476,6 +524,8 @@ void CWorldEditor::OnActiveProjectChanged(CGameProject *pProj) RecentProjectsList.prepend(ProjPath); Settings.setValue("WorldEditor/RecentProjectsList", RecentProjectsList); UpdateOpenRecentActions(); + + ChangeEditMode(eWEM_WorldInfo); } void CWorldEditor::OnLinksModified(const QList& rkInstances) diff --git a/src/Editor/WorldEditor/CWorldEditor.h b/src/Editor/WorldEditor/CWorldEditor.h index 42304fd2..fcedbae3 100644 --- a/src/Editor/WorldEditor/CWorldEditor.h +++ b/src/Editor/WorldEditor/CWorldEditor.h @@ -33,6 +33,12 @@ namespace Ui { class CWorldEditor; } +enum EWorldEditorMode +{ + eWEM_WorldInfo, + eWEM_EditScript +}; + class CWorldEditor : public INodeEditor { Q_OBJECT @@ -61,6 +67,7 @@ class CWorldEditor : public INodeEditor QVBoxLayout *mpRightSidebarLayout; QWidget *mpCurSidebarWidget; + QButtonGroup *mpEditModeButtonGroup; CWorldInfoSidebar *mpWorldInfoSidebar; CScriptEditSidebar *mpScriptSidebar; @@ -69,7 +76,7 @@ public: ~CWorldEditor(); void closeEvent(QCloseEvent *pEvent); bool CloseWorld(); - void SetArea(CWorld *pWorld, int AreaIndex); + bool SetArea(CWorld *pWorld, int AreaIndex); bool CheckUnsavedChanges(); bool HasAnyScriptNodesSelected() const; @@ -98,6 +105,10 @@ public slots: bool Save(); bool SaveAndRepack(); + void ChangeEditMode(int Mode); + void ChangeEditMode(EWorldEditorMode Mode); + void OpenResourceBrowser(); + void OnActiveProjectChanged(CGameProject *pProj); void OnLinksModified(const QList& rkInstances); void OnPropertyModified(IProperty *pProp); diff --git a/src/Editor/WorldEditor/CWorldEditor.ui b/src/Editor/WorldEditor/CWorldEditor.ui index c650d1eb..c65a55b8 100644 --- a/src/Editor/WorldEditor/CWorldEditor.ui +++ b/src/Editor/WorldEditor/CWorldEditor.ui @@ -30,140 +30,6 @@ 3 - - - - QFrame::StyledPanel - - - QFrame::Sunken - - - 1 - - - - 3 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - 0 - 0 - - - - - 32 - 32 - - - - - 32 - 32 - - - - World Edit Mode - - - - - - - :/icons/World.png:/icons/World.png - - - - 24 - 24 - - - - true - - - true - - - false - - - - - - - - 0 - 0 - - - - - 32 - 32 - - - - - 32 - 32 - - - - Script Edit Mode - - - - - - - :/icons/Modify.png:/icons/Modify.png - - - - 24 - 24 - - - - true - - - false - - - - - - - Qt::Vertical - - - - 20 - 546 - - - - - - - @@ -368,6 +234,140 @@ + + + + QFrame::NoFrame + + + QFrame::Sunken + + + 1 + + + + 3 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + World Edit Mode + + + + + + + :/icons/World.png:/icons/World.png + + + + 24 + 24 + + + + true + + + true + + + false + + + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + Script Edit Mode + + + + + + + :/icons/Modify.png:/icons/Modify.png + + + + 24 + 24 + + + + true + + + false + + + + + + + Qt::Vertical + + + + 20 + 546 + + + + + + + @@ -473,6 +473,7 @@ Tools + @@ -846,6 +847,11 @@ Close Project + + + Resource Browser + + diff --git a/src/Editor/WorldEditor/CWorldInfoSidebar.ui b/src/Editor/WorldEditor/CWorldInfoSidebar.ui index ad90e623..b21073cd 100644 --- a/src/Editor/WorldEditor/CWorldInfoSidebar.ui +++ b/src/Editor/WorldEditor/CWorldInfoSidebar.ui @@ -49,7 +49,7 @@ QAbstractItemView::ScrollPerPixel - 10 + 15 true diff --git a/src/Editor/WorldEditor/WCreateTab.cpp b/src/Editor/WorldEditor/WCreateTab.cpp index f69cd903..042e5b6e 100644 --- a/src/Editor/WorldEditor/WCreateTab.cpp +++ b/src/Editor/WorldEditor/WCreateTab.cpp @@ -13,8 +13,8 @@ WCreateTab::WCreateTab(CWorldEditor *pEditor, QWidget *pParent /*= 0*/) mpEditor = pEditor; mpEditor->Viewport()->installEventFilter(this); - connect(mpEditor, SIGNAL(LayersModified()), this, SLOT(OnLayersChanged())); + connect(mpEditor, SIGNAL(LayersModified()), this, SLOT(OnLayersChanged())); connect(ui->SpawnLayerComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(OnSpawnLayerChanged(int))); } diff --git a/src/Editor/WorldEditor/WCreateTab.ui b/src/Editor/WorldEditor/WCreateTab.ui index 154fa562..20b7698e 100644 --- a/src/Editor/WorldEditor/WCreateTab.ui +++ b/src/Editor/WorldEditor/WCreateTab.ui @@ -15,70 +15,61 @@ - 9 + 6 - 9 + 6 - 9 + 6 - 9 + 6 - - - Create Instance + + + + + Spawn Layer: + + + + + + + + 1 + 0 + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::InternalMove + + + Qt::MoveAction + + + QAbstractItemView::SelectItems + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel - - - - - - - Spawn Layer: - - - - - - - - 1 - 0 - - - - - - - - - - QAbstractItemView::NoEditTriggers - - - true - - - QAbstractItemView::InternalMove - - - Qt::MoveAction - - - QAbstractItemView::SelectItems - - - QAbstractItemView::ScrollPerPixel - - - QAbstractItemView::ScrollPerPixel - - - - diff --git a/src/Editor/WorldEditor/WEditorProperties.cpp b/src/Editor/WorldEditor/WEditorProperties.cpp index 38859787..c13a4b93 100644 --- a/src/Editor/WorldEditor/WEditorProperties.cpp +++ b/src/Editor/WorldEditor/WEditorProperties.cpp @@ -9,7 +9,7 @@ WEditorProperties::WEditorProperties(QWidget *pParent /*= 0*/) , mHasEditedName(false) { mpInstanceInfoLabel = new QLabel; - mpInstanceInfoLabel->setText("No selection"); + mpInstanceInfoLabel->setText("[No selection]"); mpInstanceInfoLayout = new QHBoxLayout; mpInstanceInfoLayout->addWidget(mpInstanceInfoLabel); @@ -34,7 +34,7 @@ WEditorProperties::WEditorProperties(QWidget *pParent /*= 0*/) mpMainLayout->addLayout(mpInstanceInfoLayout); mpMainLayout->addLayout(mpNameLayout); mpMainLayout->addLayout(mpLayersLayout); - mpMainLayout->setContentsMargins(6, 6, 6, 0); + mpMainLayout->setContentsMargins(3, 3, 3, 0); mpMainLayout->setSpacing(3); setLayout(mpMainLayout); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); diff --git a/src/Editor/WorldEditor/WInstancesTab.ui b/src/Editor/WorldEditor/WInstancesTab.ui index 4767e1e9..d4c8c271 100644 --- a/src/Editor/WorldEditor/WInstancesTab.ui +++ b/src/Editor/WorldEditor/WInstancesTab.ui @@ -13,7 +13,7 @@ Form - + 0 @@ -29,7 +29,7 @@ - 0 + 1 diff --git a/src/Editor/WorldEditor/WModifyTab.ui b/src/Editor/WorldEditor/WModifyTab.ui index 2a38a69a..57cfef9e 100644 --- a/src/Editor/WorldEditor/WModifyTab.ui +++ b/src/Editor/WorldEditor/WModifyTab.ui @@ -107,8 +107,8 @@ 0 0 - 276 - 460 + 278 + 442