diff --git a/specter/include/Specter/PathButtons.hpp b/specter/include/Specter/PathButtons.hpp index 5b5127dac..340cbe3ca 100644 --- a/specter/include/Specter/PathButtons.hpp +++ b/specter/include/Specter/PathButtons.hpp @@ -46,6 +46,7 @@ class PathButtons : public ScrollView int m_pathButtonPending = -1; IPathButtonsBinding& m_binding; + bool m_fillContainer; struct PathButton : IButtonBinding { PathButtons& m_pb; @@ -63,10 +64,17 @@ class PathButtons : public ScrollView std::vector m_pathButtons; public: - PathButtons(ViewResources& res, View& parentView, IPathButtonsBinding& binding); + PathButtons(ViewResources& res, View& parentView, IPathButtonsBinding& binding, bool fillContainer=false); void setButtons(const std::vector& comps); void setMultiplyColor(const Zeus::CColor& color); + + /* Fill all available space in container when requested */ + void containerResized(const boo::SWindowRect& root, const boo::SWindowRect& sub) + { + if (m_fillContainer) + View::resized(root, sub); + } }; } diff --git a/specter/include/Specter/Space.hpp b/specter/include/Specter/Space.hpp index 76ce6132f..0fab6ef87 100644 --- a/specter/include/Specter/Space.hpp +++ b/specter/include/Specter/Space.hpp @@ -50,7 +50,8 @@ class Space : public View ViewChild> m_cornerView; public: - Space(ViewResources& res, View& parentView, ISpaceController& controller, Toolbar::Position toolbarPos); + Space(ViewResources& res, View& parentView, ISpaceController& controller, + Toolbar::Position toolbarPos, unsigned tbUnits); View* setContentView(View* view); Toolbar* toolbar() {return m_toolbar.m_view.get();} void mouseDown(const boo::SWindowCoord&, boo::EMouseButton, boo::EModifierKey); diff --git a/specter/include/Specter/Toolbar.hpp b/specter/include/Specter/Toolbar.hpp index 7e8c05a75..1ae5ff003 100644 --- a/specter/include/Specter/Toolbar.hpp +++ b/specter/include/Specter/Toolbar.hpp @@ -27,68 +27,22 @@ public: }; private: Position m_tbPos; - std::vector> m_children; + unsigned m_units; + std::vector>> m_children; ViewBlock m_tbBlock; boo::IGraphicsBufferD* m_tbBlockBuf; TexShaderVert m_tbVerts[10]; - int m_nomHeight = 25; + int m_nomGauge = 25; int m_padding = 10; - void setHorizontalVerts(int width) - { - m_tbVerts[0].m_pos.assign(0, 1 + m_nomHeight, 0); - m_tbVerts[0].m_uv.assign(0, 0); - m_tbVerts[1].m_pos.assign(0, -1 + m_nomHeight, 0); - m_tbVerts[1].m_uv.assign(0.5, 0); - m_tbVerts[2].m_pos.assign(width, 1 + m_nomHeight, 0); - m_tbVerts[2].m_uv.assign(0, 0); - m_tbVerts[3].m_pos.assign(width, -1 + m_nomHeight, 0); - m_tbVerts[3].m_uv.assign(0.5, 0); - m_tbVerts[4].m_pos.assign(width, -1 + m_nomHeight, 0); - m_tbVerts[4].m_uv.assign(0.5, 0); - - m_tbVerts[5].m_pos.assign(0, 1, 0); - m_tbVerts[5].m_uv.assign(0.5, 0); - m_tbVerts[6].m_pos.assign(0, 1, 0); - m_tbVerts[6].m_uv.assign(0.5, 0); - m_tbVerts[7].m_pos.assign(0, -1, 0); - m_tbVerts[7].m_uv.assign(1, 0); - m_tbVerts[8].m_pos.assign(width, 1, 0); - m_tbVerts[8].m_uv.assign(0.5, 0); - m_tbVerts[9].m_pos.assign(width, -1, 0); - m_tbVerts[9].m_uv.assign(1, 0); - } - - void setVerticalVerts(int height) - { - m_tbVerts[0].m_pos.assign(-1, height, 0); - m_tbVerts[0].m_uv.assign(0, 0); - m_tbVerts[1].m_pos.assign(-1, 0, 0); - m_tbVerts[1].m_uv.assign(0, 0); - m_tbVerts[2].m_pos.assign(1, height, 0); - m_tbVerts[2].m_uv.assign(0.5, 0); - m_tbVerts[3].m_pos.assign(1, 0, 0); - m_tbVerts[3].m_uv.assign(0.5, 0); - m_tbVerts[4].m_pos.assign(1, 0, 0); - m_tbVerts[4].m_uv.assign(0.5, 0); - - m_tbVerts[5].m_pos.assign(-1 + m_nomHeight, height, 0); - m_tbVerts[5].m_uv.assign(0.5, 0); - m_tbVerts[6].m_pos.assign(-1 + m_nomHeight, height, 0); - m_tbVerts[6].m_uv.assign(0.5, 0); - m_tbVerts[7].m_pos.assign(-1 + m_nomHeight, 0, 0); - m_tbVerts[7].m_uv.assign(0.5, 0); - m_tbVerts[8].m_pos.assign(1 + m_nomHeight, height, 0); - m_tbVerts[8].m_uv.assign(1, 0); - m_tbVerts[9].m_pos.assign(1 + m_nomHeight, 0, 0); - m_tbVerts[9].m_uv.assign(1, 0); - } + void setHorizontalVerts(int width); + void setVerticalVerts(int height); VertexBufferBinding m_vertsBinding; public: - Toolbar(ViewResources& res, View& parentView, Position toolbarPos); + Toolbar(ViewResources& res, View& parentView, Position toolbarPos, unsigned units); void mouseDown(const boo::SWindowCoord&, boo::EMouseButton, boo::EModifierKey); void mouseUp(const boo::SWindowCoord&, boo::EMouseButton, boo::EModifierKey); void mouseMove(const boo::SWindowCoord&); @@ -97,21 +51,25 @@ public: void resized(const boo::SWindowRect& rootView, const boo::SWindowRect& sub); void draw(boo::IGraphicsCommandQueue* gfxQ); - int nominalHeight() const {return m_nomHeight;} - - void clear() {m_children.clear();} - void push_back(View* v) + int nominalHeight() const { - m_children.emplace_back(); - m_children.back().m_view = v; + return m_nomGauge; } + void clear() + { + for (std::vector>& u : m_children) + u.clear(); + } + void push_back(View* v, unsigned unit); + void setMultiplyColor(const Zeus::CColor& color) { View::setMultiplyColor(color); - for (ViewChild& c : m_children) - if (c.m_view) - c.m_view->setMultiplyColor(color); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + if (c.m_view) + c.m_view->setMultiplyColor(color); } }; diff --git a/specter/include/Specter/View.hpp b/specter/include/Specter/View.hpp index 112b6eb00..07c30f8a2 100644 --- a/specter/include/Specter/View.hpp +++ b/specter/include/Specter/View.hpp @@ -90,13 +90,13 @@ public: Zeus::CVector3f m_pos; Zeus::CVector2f m_uv; }; - + struct VertexBufferBinding { boo::IGraphicsBufferD* m_vertsBuf = nullptr; boo::IVertexFormat* m_vtxFmt = nullptr; /* OpenGL only */ boo::IShaderDataBinding* m_shaderBinding = nullptr; - + void initSolid(ViewResources& res, size_t count, boo::IGraphicsBuffer* viewBlockBuf); void initTex(ViewResources& res, size_t count, boo::IGraphicsBuffer* viewBlockBuf, boo::ITexture* texture); @@ -217,6 +217,7 @@ public: virtual void modKeyDown(boo::EModifierKey, bool) {} virtual void modKeyUp(boo::EModifierKey) {} + virtual void containerResized(const boo::SWindowRect& root, const boo::SWindowRect& sub) {} virtual void resized(const boo::SWindowRect& root, const boo::SWindowRect& sub); virtual void resized(const ViewBlock& vb, const boo::SWindowRect& sub); virtual void resized(const boo::SWindowRect& root, const boo::SWindowRect& sub, diff --git a/specter/lib/PathButtons.cpp b/specter/lib/PathButtons.cpp index 70c3fad21..2641fdd57 100644 --- a/specter/lib/PathButtons.cpp +++ b/specter/lib/PathButtons.cpp @@ -4,8 +4,8 @@ namespace Specter { -PathButtons::PathButtons(ViewResources& res, View& parentView, IPathButtonsBinding& binding) -: ScrollView(res, parentView, ScrollView::Style::SideButtons), m_binding(binding) +PathButtons::PathButtons(ViewResources& res, View& parentView, IPathButtonsBinding& binding, bool fillContainer) +: ScrollView(res, parentView, ScrollView::Style::SideButtons), m_binding(binding), m_fillContainer(fillContainer) { m_contentView.m_view.reset(new ContentView(res, *this)); setContentView(m_contentView.m_view.get()); diff --git a/specter/lib/Space.cpp b/specter/lib/Space.cpp index bd73892be..2e0afe1fa 100644 --- a/specter/lib/Space.cpp +++ b/specter/lib/Space.cpp @@ -16,7 +16,8 @@ static LogVisor::LogModule Log("Specter::Space"); #define CORNER_DRAG_THRESHOLD 20 -Space::Space(ViewResources& res, View& parentView, ISpaceController& controller, Toolbar::Position tbPos) +Space::Space(ViewResources& res, View& parentView, ISpaceController& controller, + Toolbar::Position tbPos, unsigned tbUnits) : View(res, parentView), m_controller(controller), m_tbPos(tbPos) { commitResources(res); @@ -25,7 +26,7 @@ Space::Space(ViewResources& res, View& parentView, ISpaceController& controller, if (controller.spaceSplitAllowed()) m_cornerView.m_view.reset(new CornerView(res, *this, triColor)); if (tbPos != Toolbar::Position::None) - m_toolbar.m_view.reset(new Toolbar(res, *this, tbPos)); + m_toolbar.m_view.reset(new Toolbar(res, *this, tbPos, tbUnits)); } Space::CornerView::CornerView(ViewResources& res, Space& space, const Zeus::CColor& triColor) diff --git a/specter/lib/Toolbar.cpp b/specter/lib/Toolbar.cpp index 5a70d0640..74a5f77eb 100644 --- a/specter/lib/Toolbar.cpp +++ b/specter/lib/Toolbar.cpp @@ -1,6 +1,7 @@ #include #include "Specter/Toolbar.hpp" #include "Specter/ViewResources.hpp" +#include "Specter/RootView.hpp" #define TOOLBAR_PADDING 10 @@ -20,11 +21,14 @@ void Toolbar::Resources::init(boo::IGraphicsDataFactory* factory, const IThemeDa m_shadingTex = factory->newStaticTexture(4, 1, 1, boo::TextureFormat::RGBA8, tex, 16); } -Toolbar::Toolbar(ViewResources& res, View& parentView, Position tbPos) -: View(res, parentView), m_tbPos(tbPos), - m_nomHeight(res.pixelFactor() * SPECTER_TOOLBAR_GAUGE), +Toolbar::Toolbar(ViewResources& res, View& parentView, Position tbPos, unsigned units) +: View(res, parentView), m_tbPos(tbPos), m_units(units), + m_nomGauge(res.pixelFactor() * SPECTER_TOOLBAR_GAUGE * units), m_padding(res.pixelFactor() * TOOLBAR_PADDING) { + m_children.reserve(units); + for (unsigned u=0 ; unewDynamicBuffer(boo::BufferUse::Uniform, sizeof(ViewBlock), 1); m_vertsBinding.initTex(res, 10, m_tbBlockBuf, res.m_toolbarRes.m_shadingTex); commitResources(res); @@ -33,32 +37,96 @@ Toolbar::Toolbar(ViewResources& res, View& parentView, Position tbPos) void Toolbar::mouseDown(const boo::SWindowCoord& coord, boo::EMouseButton button, boo::EModifierKey mod) { - for (ViewChild& c : m_children) - c.mouseDown(coord, button, mod); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + c.mouseDown(coord, button, mod); } void Toolbar::mouseUp(const boo::SWindowCoord& coord, boo::EMouseButton button, boo::EModifierKey mod) { - for (ViewChild& c : m_children) - c.mouseUp(coord, button, mod); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + c.mouseUp(coord, button, mod); } void Toolbar::mouseMove(const boo::SWindowCoord& coord) { - for (ViewChild& c : m_children) - c.mouseMove(coord); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + c.mouseMove(coord); } void Toolbar::mouseEnter(const boo::SWindowCoord& coord) { - for (ViewChild& c : m_children) - c.mouseEnter(coord); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + c.mouseEnter(coord); } void Toolbar::mouseLeave(const boo::SWindowCoord& coord) { - for (ViewChild& c : m_children) - c.mouseLeave(coord); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + c.mouseLeave(coord); +} + +void Toolbar::setHorizontalVerts(int width) +{ + m_tbVerts[0].m_pos.assign(0, 1 + m_nomGauge, 0); + m_tbVerts[0].m_uv.assign(0, 0); + m_tbVerts[1].m_pos.assign(0, -1 + m_nomGauge, 0); + m_tbVerts[1].m_uv.assign(0.5, 0); + m_tbVerts[2].m_pos.assign(width, 1 + m_nomGauge, 0); + m_tbVerts[2].m_uv.assign(0, 0); + m_tbVerts[3].m_pos.assign(width, -1 + m_nomGauge, 0); + m_tbVerts[3].m_uv.assign(0.5, 0); + m_tbVerts[4].m_pos.assign(width, -1 + m_nomGauge, 0); + m_tbVerts[4].m_uv.assign(0.5, 0); + + m_tbVerts[5].m_pos.assign(0, 1, 0); + m_tbVerts[5].m_uv.assign(0.5, 0); + m_tbVerts[6].m_pos.assign(0, 1, 0); + m_tbVerts[6].m_uv.assign(0.5, 0); + m_tbVerts[7].m_pos.assign(0, -1, 0); + m_tbVerts[7].m_uv.assign(1, 0); + m_tbVerts[8].m_pos.assign(width, 1, 0); + m_tbVerts[8].m_uv.assign(0.5, 0); + m_tbVerts[9].m_pos.assign(width, -1, 0); + m_tbVerts[9].m_uv.assign(1, 0); +} + +void Toolbar::setVerticalVerts(int height) +{ + m_tbVerts[0].m_pos.assign(-1, height, 0); + m_tbVerts[0].m_uv.assign(0, 0); + m_tbVerts[1].m_pos.assign(-1, 0, 0); + m_tbVerts[1].m_uv.assign(0, 0); + m_tbVerts[2].m_pos.assign(1, height, 0); + m_tbVerts[2].m_uv.assign(0.5, 0); + m_tbVerts[3].m_pos.assign(1, 0, 0); + m_tbVerts[3].m_uv.assign(0.5, 0); + m_tbVerts[4].m_pos.assign(1, 0, 0); + m_tbVerts[4].m_uv.assign(0.5, 0); + + m_tbVerts[5].m_pos.assign(-1 + m_nomGauge, height, 0); + m_tbVerts[5].m_uv.assign(0.5, 0); + m_tbVerts[6].m_pos.assign(-1 + m_nomGauge, height, 0); + m_tbVerts[6].m_uv.assign(0.5, 0); + m_tbVerts[7].m_pos.assign(-1 + m_nomGauge, 0, 0); + m_tbVerts[7].m_uv.assign(0.5, 0); + m_tbVerts[8].m_pos.assign(1 + m_nomGauge, height, 0); + m_tbVerts[8].m_uv.assign(1, 0); + m_tbVerts[9].m_pos.assign(1 + m_nomGauge, 0, 0); + m_tbVerts[9].m_uv.assign(1, 0); +} + +void Toolbar::push_back(View* v, unsigned unit) +{ + if (unit >= m_units) + Log.report(LogVisor::FatalError, "unit %u out of range %u", unit, m_units); + std::vector>& u = m_children[unit]; + u.emplace_back(); + u.back().m_view = v; } void Toolbar::resized(const boo::SWindowRect& root, const boo::SWindowRect& sub) @@ -69,15 +137,30 @@ void Toolbar::resized(const boo::SWindowRect& root, const boo::SWindowRect& sub) m_tbBlock.setViewRect(root, sub); m_tbBlockBuf->load(&m_tbBlock, sizeof(ViewBlock)); + float gaugeUnit = rootView().viewRes().pixelFactor() * SPECTER_TOOLBAR_GAUGE; + float yOff = 0.0; boo::SWindowRect childRect = sub; - for (ViewChild& c : m_children) + for (std::vector>& u : m_children) { - childRect.size[0] = c.m_view->nominalWidth(); - childRect.size[1] = c.m_view->nominalHeight(); - childRect.location[0] += m_padding; - childRect.location[1] = sub.location[1] + (m_nomHeight - childRect.size[1]) / 2 - 1; - c.m_view->resized(root, childRect); - childRect.location[0] += childRect.size[0]; + boo::SWindowRect containRect = sub; + containRect.location[0] += m_padding; + containRect.size[0] -= m_padding * 2; + containRect.size[1] = gaugeUnit; + for (ViewChild& c : u) + { + c.m_view->containerResized(root, containRect); + childRect.size[0] = c.m_view->nominalWidth(); + childRect.size[1] = c.m_view->nominalHeight(); + childRect.location[0] += m_padding; + childRect.location[1] = sub.location[1] + (gaugeUnit - childRect.size[1]) / 2 - 1 + yOff; + c.m_view->resized(root, childRect); + childRect.location[0] += childRect.size[0]; + + containRect.location[0] += m_padding + childRect.size[0]; + containRect.size[0] -= m_padding + childRect.size[0]; + containRect.size[1] = gaugeUnit; + } + yOff += gaugeUnit; } } @@ -88,8 +171,9 @@ void Toolbar::draw(boo::IGraphicsCommandQueue* gfxQ) gfxQ->setDrawPrimitive(boo::Primitive::TriStrips); gfxQ->draw(0, 10); - for (ViewChild& c : m_children) - c.m_view->draw(gfxQ); + for (std::vector>& u : m_children) + for (ViewChild& c : u) + c.m_view->draw(gfxQ); } }