metaforce/Editor/Space.cpp

156 lines
4.3 KiB
C++
Raw Normal View History

#include "Space.hpp"
#include "ViewManager.hpp"
2016-01-07 00:40:27 +00:00
#include "ResourceBrowser.hpp"
2016-01-05 09:53:16 +00:00
namespace URDE
{
2016-01-05 09:53:16 +00:00
static LogVisor::LogModule Log("URDE::Space");
2016-01-05 00:01:02 +00:00
Specter::View* Space::buildSpaceView(Specter::ViewResources& res)
{
2016-01-05 00:01:02 +00:00
if (usesToolbar())
2016-01-07 00:40:27 +00:00
{
2016-01-11 02:17:08 +00:00
m_spaceView.reset(new Specter::Space(res, m_vm.rootView(), *this, Specter::Toolbar::Position::Bottom));
2016-01-07 00:40:27 +00:00
Specter::View* sview = buildContentView(res);
2016-01-11 02:17:08 +00:00
m_spaceView->setContentView(sview);
buildToolbarView(res, *m_spaceView->toolbar());
return m_spaceView.get();
2016-01-07 00:40:27 +00:00
}
else
{
2016-01-11 02:17:08 +00:00
m_spaceView.reset(new Specter::Space(res, m_vm.rootView(), *this, Specter::Toolbar::Position::None));
2016-01-07 00:40:27 +00:00
Specter::View* sview = buildContentView(res);
2016-01-11 02:17:08 +00:00
m_spaceView->setContentView(sview);
return m_spaceView.get();
2016-01-07 00:40:27 +00:00
}
}
2016-01-11 02:17:08 +00:00
Specter::View* RootSpace::buildSpaceView(Specter::ViewResources& res)
{
Specter::View* newRoot = buildContentView(res);
m_vm.RootSpaceViewBuilt(newRoot);
return newRoot;
}
2016-01-04 05:31:02 +00:00
Specter::View* SplitSpace::buildContentView(Specter::ViewResources& res)
{
2016-01-11 02:17:08 +00:00
m_splitView.reset(new Specter::SplitView(res, m_vm.rootView(), m_state.axis));
2016-01-05 00:01:02 +00:00
if (m_slots[0])
m_splitView->setContentView(0, m_slots[0]->buildSpaceView(res));
if (m_slots[1])
m_splitView->setContentView(1, m_slots[1]->buildSpaceView(res));
2016-01-11 02:17:08 +00:00
m_splitView->setSplit(m_state.split);
return m_splitView.get();
}
void SplitSpace::setChildSlot(unsigned slot, std::unique_ptr<Space>&& space)
2016-01-04 05:31:02 +00:00
{
2016-01-05 00:01:02 +00:00
if (slot > 1)
Log.report(LogVisor::FatalError, "invalid slot %u for SplitView", slot);
m_slots[slot] = std::move(space);
m_slots[slot]->m_parent = this;
}
Specter::ISplitSpaceController* Space::spaceSplit(Specter::SplitView::Axis axis, int thisSlot)
{
if (m_parent)
{
2016-01-11 02:17:08 +00:00
SplitSpace* ss = new SplitSpace(m_vm, m_parent, axis);
ss->setChildSlot(thisSlot, std::move(m_parent->exchangeSpaceSplitJoin(this, std::unique_ptr<Space>(ss))));
ss->setChildSlot(thisSlot ^ 1, std::unique_ptr<Space>(copy(ss)));
2016-01-11 02:17:08 +00:00
m_vm.BuildSpaceViews();
return ss;
}
return nullptr;
}
std::unique_ptr<Space> RootSpace::exchangeSpaceSplitJoin(Space* removeSpace, std::unique_ptr<Space>&& keepSpace)
{
std::unique_ptr<Space> ret = std::move(keepSpace);
2016-01-11 02:17:08 +00:00
if (removeSpace == m_spaceTree.get())
{
2016-01-11 02:17:08 +00:00
m_spaceTree.swap(ret);
m_spaceTree->m_parent = this;
}
else
Log.report(LogVisor::FatalError, "RootSpace::exchangeSpaceSplitJoin() failure");
return ret;
}
std::unique_ptr<Space> SplitSpace::exchangeSpaceSplitJoin(Space* removeSpace, std::unique_ptr<Space>&& keepSpace)
{
std::unique_ptr<Space> ret = std::move(keepSpace);
if (removeSpace == m_slots[0].get())
{
m_slots[0].swap(ret);
m_slots[0]->m_parent = this;
}
else if (removeSpace == m_slots[1].get())
{
m_slots[1].swap(ret);
m_slots[1]->m_parent = this;
}
else
Log.report(LogVisor::FatalError, "SplitSpace::exchangeSpaceSplitJoin() failure");
return ret;
2016-01-05 00:01:02 +00:00
}
template <class Reader>
static Space* BuildNewSpace(ViewManager& vm, Space::Class cls, Space* parent, Reader& r)
2016-01-05 00:01:02 +00:00
{
using Class = Space::Class;
switch (cls)
2016-01-04 05:31:02 +00:00
{
case Class::SplitSpace:
return new SplitSpace(vm, parent, r);
2016-01-07 00:40:27 +00:00
case Class::ResourceBrowser:
return new ResourceBrowser(vm, parent, r);
2016-01-04 05:31:02 +00:00
default: break;
}
return nullptr;
}
2016-01-07 00:40:27 +00:00
void Space::saveState(Athena::io::IStreamWriter& w) const
{
w.writeUint32Big(atUint32(m_class));
spaceState().write(w);
}
void Space::saveState(Athena::io::YAMLDocWriter& w) const
{
w.writeUint32("class", atUint32(m_class));
spaceState().write(w);
}
Space* Space::NewSpaceFromConfigStream(ViewManager& vm, Space* parent, ConfigReader& r)
2016-01-05 00:01:02 +00:00
{
2016-01-05 09:53:16 +00:00
#ifdef URDE_BINARY_CONFIGS
2016-01-05 00:01:02 +00:00
Class cls = Class(r.readUint32Big());
return BuildNewSpace(vm, cls, parent, r);
2016-01-05 00:01:02 +00:00
#else
Class cls = Class(r.readUint32("class"));
return BuildNewSpace(vm, cls, parent, r);
#endif
}
RootSpace* Space::NewRootSpaceFromConfigStream(ViewManager& vm, ConfigReader& r)
{
#ifdef URDE_BINARY_CONFIGS
Class cls = Class(r.readUint32Big());
if (cls != Class::RootSpace)
return nullptr;
2016-01-05 00:01:02 +00:00
return BuildNewSpace(vm, cls, r);
#else
Class cls = Class(r.readUint32("class"));
if (cls != Class::RootSpace)
return nullptr;
return new RootSpace(vm, r);
2016-01-05 00:01:02 +00:00
#endif
}
}