PrimeWorldEditor/UI/WorldEditor/WModifyTab.cpp

146 lines
4.4 KiB
C++

#include "WModifyTab.h"
#include "ui_WModifyTab.h"
#include <Scene/CScriptNode.h>
#include <QScrollArea>
#include <QScrollBar>
#include "../CWorldEditor.h"
WModifyTab::WModifyTab(QWidget *pParent) :
QWidget(pParent),
ui(new Ui::WModifyTab)
{
ui->setupUi(this);
mpCurPropEditor = nullptr;
mpInLinkModel = new CLinkModel(this);
mpInLinkModel->SetConnectionType(CLinkModel::eIncoming);
mpOutLinkModel = new CLinkModel(this);
mpOutLinkModel->SetConnectionType(CLinkModel::eOutgoing);
ui->InLinksTableView->setModel(mpInLinkModel);
ui->OutLinksTableView->setModel(mpOutLinkModel);
ui->InLinksTableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->OutLinksTableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
connect(ui->InLinksTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(OnLinkTableDoubleClick(QModelIndex)));
connect(ui->OutLinksTableView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(OnLinkTableDoubleClick(QModelIndex)));
ClearUI();
}
WModifyTab::~WModifyTab()
{
delete ui;
}
void WModifyTab::SetEditor(CWorldEditor *pEditor)
{
mpWorldEditor = pEditor;
}
void WModifyTab::GenerateUI(std::list<CSceneNode*>& Selection)
{
WPropertyEditor *pOldEditor = mpCurPropEditor;
ClearUI();
if (Selection.size() == 1)
{
mpSelectedNode = Selection.front();
// todo: set up editing UI for Light Nodes
if (mpSelectedNode->NodeType() == eScriptNode)
{
ui->ObjectsTabWidget->show();
CScriptNode *pScriptNode = static_cast<CScriptNode*>(mpSelectedNode);
CScriptObject *pObj = pScriptNode->Object();
CScriptTemplate *pTemplate = pObj->Template();
CPropertyStruct *pProperties = pObj->Properties();
// Check whether a cached UI for this object exists
auto it = mCachedPropEditors.find(pTemplate);
// Load precached UI
if (it != mCachedPropEditors.end())
{
mpCurPropEditor = *it;
mpCurPropEditor->SetProperty(pProperties);
}
// Generate new UI
else
{
mpCurPropEditor = new WPropertyEditor(ui->PropertiesScrollContents, pProperties);
mCachedPropEditors[pTemplate] = mpCurPropEditor;
}
ui->PropertiesScrollLayout->insertWidget(0, mpCurPropEditor);
mpCurPropEditor->show();
// Scroll back up to the top, but only if this is a new editor.
// (This is so clicking on multiple objects of the same type, or even
// the same object twice, won't cause you to lose your place.)
if (pOldEditor != mpCurPropEditor)
{
ui->PropertiesScrollArea->horizontalScrollBar()->setValue(0);
ui->PropertiesScrollArea->verticalScrollBar()->setValue(0);
}
// Set up connection table model
mpInLinkModel->SetObject(pObj);
mpOutLinkModel->SetObject(pObj);
}
}
else
ClearUI();
}
void WModifyTab::ClearUI()
{
if (mpCurPropEditor)
{
ui->PropertiesScrollLayout->removeWidget(mpCurPropEditor);
mpCurPropEditor->hide();
mpCurPropEditor = nullptr;
}
ui->ObjectsTabWidget->hide();
ui->LightGroupBox->hide();
}
void WModifyTab::ClearCachedEditors()
{
foreach(WPropertyEditor *pEditor, mCachedPropEditors)
delete pEditor;
mCachedPropEditors.clear();
}
void WModifyTab::OnLinkTableDoubleClick(QModelIndex Index)
{
if (Index.column() == 0)
{
// The link table will only be visible if the selected node is a script node
CScriptNode *pNode = static_cast<CScriptNode*>(mpSelectedNode);
SLink Link;
if (sender() == ui->InLinksTableView)
Link = pNode->Object()->InLink(Index.row());
else if (sender() == ui->OutLinksTableView)
Link = pNode->Object()->OutLink(Index.row());
else
std::cout << "Error - OnLinkTableDoubleClick() activated by invalid sender\n";
CScriptNode *pLinkedNode = pNode->Scene()->ScriptNodeByID(Link.ObjectID);
if (pLinkedNode)
{
mpWorldEditor->ClearSelection();
mpWorldEditor->SelectNode(pLinkedNode);
}
ui->InLinksTableView->clearSelection();
ui->OutLinksTableView->clearSelection();
}
}