mirror of https://github.com/AxioDL/metaforce.git
split and join functionality
This commit is contained in:
parent
39012da281
commit
a37e6ba8a4
|
@ -15,7 +15,7 @@ Specter::View* Space::buildSpaceView(Specter::ViewResources& res)
|
|||
{
|
||||
if (usesToolbar())
|
||||
{
|
||||
m_spaceView.reset(new Specter::Space(res, m_vm.rootView(), *this, Specter::Toolbar::Position::Bottom, toolbarUnits()));
|
||||
m_spaceView.reset(new Specter::Space(res, *m_parent->basisView(), *this, Specter::Toolbar::Position::Bottom, toolbarUnits()));
|
||||
Specter::View* sview = buildContentView(res);
|
||||
m_spaceView->setContentView(sview);
|
||||
Specter::Toolbar& tb = *m_spaceView->toolbar();
|
||||
|
@ -31,7 +31,7 @@ Specter::View* Space::buildSpaceView(Specter::ViewResources& res)
|
|||
}
|
||||
else
|
||||
{
|
||||
m_spaceView.reset(new Specter::Space(res, m_vm.rootView(), *this, Specter::Toolbar::Position::None, 0));
|
||||
m_spaceView.reset(new Specter::Space(res, *m_parent->basisView(), *this, Specter::Toolbar::Position::None, 0));
|
||||
Specter::View* sview = buildContentView(res);
|
||||
m_spaceView->setContentView(sview);
|
||||
return m_spaceView.get();
|
||||
|
@ -64,6 +64,8 @@ Specter::View* RootSpace::buildSpaceView(Specter::ViewResources& res)
|
|||
return newRoot;
|
||||
}
|
||||
|
||||
Specter::View* RootSpace::basisView() {return &m_vm.rootView();}
|
||||
|
||||
Specter::View* SplitSpace::buildContentView(Specter::ViewResources& res)
|
||||
{
|
||||
int clearance = res.pixelFactor() * SPECTER_TOOLBAR_GAUGE;
|
||||
|
@ -84,10 +86,61 @@ void SplitSpace::setChildSlot(unsigned slot, std::unique_ptr<Space>&& space)
|
|||
m_slots[slot]->m_parent = this;
|
||||
}
|
||||
|
||||
void SplitSpace::joinViews(Specter::SplitView* thisSplit, int thisSlot, Specter::SplitView* otherSplit, int otherSlot)
|
||||
{
|
||||
if (thisSplit == otherSplit)
|
||||
{
|
||||
SplitSpace* thisSS = dynamic_cast<SplitSpace*>(m_slots[thisSlot].get());
|
||||
if (thisSS)
|
||||
{
|
||||
int ax = thisSS->m_state.axis == Specter::SplitView::Axis::Horizontal ? 1 : 0;
|
||||
const boo::SWindowRect& thisRect = m_splitView->subRect();
|
||||
const boo::SWindowRect& subRect = thisSS->m_splitView->subRect();
|
||||
int splitPx = subRect.location[ax] + subRect.size[ax] * thisSS->m_state.split -
|
||||
thisRect.location[ax];
|
||||
thisSS->m_state.split = splitPx / float(thisRect.size[ax]);
|
||||
}
|
||||
m_parent->exchangeSpaceSplitJoin(this, std::move(m_slots[thisSlot]));
|
||||
m_vm.BuildSpaceViews();
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i=0 ; i<2 ; ++i)
|
||||
{
|
||||
SplitSpace* otherSS = dynamic_cast<SplitSpace*>(m_slots[i].get());
|
||||
if (otherSS && otherSS->m_splitView.get() == otherSplit)
|
||||
{
|
||||
int ax = m_state.axis == Specter::SplitView::Axis::Horizontal ? 1 : 0;
|
||||
const boo::SWindowRect& thisRect = m_splitView->subRect();
|
||||
const boo::SWindowRect& subRect = otherSS->m_splitView->subRect();
|
||||
int splitPx = subRect.location[ax] + subRect.size[ax] * otherSS->m_state.split -
|
||||
thisRect.location[ax];
|
||||
m_state.split = splitPx / float(thisRect.size[ax]);
|
||||
exchangeSpaceSplitJoin(otherSS, std::move(otherSS->m_slots[otherSlot ^ 1]));
|
||||
m_vm.BuildSpaceViews();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Specter::ISplitSpaceController* Space::spaceSplit(Specter::SplitView::Axis axis, int thisSlot)
|
||||
{
|
||||
if (m_parent)
|
||||
{
|
||||
/* Reject split operations with insufficient clearance */
|
||||
int clearance = m_vm.m_viewResources.pixelFactor() * SPECTER_TOOLBAR_GAUGE;
|
||||
if (axis == Specter::SplitView::Axis::Horizontal)
|
||||
{
|
||||
if (m_spaceView->subRect().size[1] <= clearance)
|
||||
return nullptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_spaceView->subRect().size[0] <= clearance)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
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)));
|
||||
|
|
|
@ -148,11 +148,14 @@ public:
|
|||
Specter::ISplitSpaceController* spaceSplit(Specter::SplitView::Axis axis, int thisSlot);
|
||||
virtual std::unique_ptr<Space> exchangeSpaceSplitJoin(Space* removeSpace, std::unique_ptr<Space>&& keepSpace)
|
||||
{return std::unique_ptr<Space>();}
|
||||
|
||||
virtual Specter::View* basisView() {return m_spaceView.get();}
|
||||
};
|
||||
|
||||
class RootSpace : public Space
|
||||
{
|
||||
friend class ViewManager;
|
||||
std::unique_ptr<Specter::RootView> m_rootView;
|
||||
std::unique_ptr<Space> m_spaceTree;
|
||||
struct State : Space::State
|
||||
{
|
||||
|
@ -212,6 +215,8 @@ public:
|
|||
Specter::View* buildContentView(Specter::ViewResources& res) {return m_spaceTree->buildSpaceView(res);}
|
||||
|
||||
std::unique_ptr<Space> exchangeSpaceSplitJoin(Space* removeSpace, std::unique_ptr<Space>&& keepSpace);
|
||||
|
||||
Specter::View* basisView();
|
||||
};
|
||||
|
||||
class SplitSpace : public Space, public Specter::ISplitSpaceController
|
||||
|
@ -324,6 +329,8 @@ public:
|
|||
|
||||
Specter::SplitView* splitView() {return m_splitView.get();}
|
||||
void updateSplit(float split) {m_state.split = split;}
|
||||
void joinViews(Specter::SplitView* thisSplit, int thisSlot, Specter::SplitView* otherSplit, int otherSlot);
|
||||
|
||||
void setAxis(Specter::SplitView::Axis axis)
|
||||
{
|
||||
m_state.axis = axis;
|
||||
|
@ -332,6 +339,8 @@ public:
|
|||
|
||||
Specter::SplitView::Axis axis() const {return m_state.axis;}
|
||||
float split() const {return m_state.split;}
|
||||
|
||||
Specter::View* basisView() {return m_splitView.get();}
|
||||
};
|
||||
|
||||
class TestSpace : public Space
|
||||
|
|
|
@ -14,6 +14,7 @@ class ViewManager : public Specter::IViewManager
|
|||
friend class ProjectManager;
|
||||
friend class Space;
|
||||
friend class RootSpace;
|
||||
friend class SplitSpace;
|
||||
|
||||
HECL::Runtime::FileStoreManager& m_fileStoreManager;
|
||||
HECL::CVarManager& m_cvarManager;
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 60d3894c73d85d95b206b4ecb3681b9512ef7ecf
|
||||
Subproject commit a4272a09a349a1b9ff5ae921960f44470e31b47a
|
Loading…
Reference in New Issue