1 #include <mof/widget/GridLayout.hpp>
2 #include <mof/widget/WidgetView.hpp>
3 #include <mof/widget/VerticalClipping.hpp>
4 #include <mof/widget/HorizontalClipping.hpp>
5 #include <mof/streams.hpp>
6 #include <mof/utilities.hpp>
7 #include "mof/ConsoleIO.hpp"
12 using std::shared_ptr;
16 struct mof::widget::GridLayout::Impl
19 mof::widget::GridLayout::Direction direction;
21 int width , height;// preferredSize
22 std::vector< shared_ptr<WidgetView> > views;
23 std::vector<Vector2D> positions;
25 Impl(Direction _direction , int span_ , int margin_ )
27 direction(_direction) , span(span_) , margin(margin_) ,
38 mof::widget::GridLayout::GridLayout
40 Direction direction , int span , int margin
42 : m_pImpl( new Impl( direction , span , margin ) )
47 mof::widget::GridLayout::~GridLayout( )
52 void mof::widget::GridLayout::add(shared_ptr<WidgetView> pView)
54 mof::Vector2D size = pView->getPreferredSize();
55 m_pImpl->views.push_back(pView);
57 if(m_pImpl->direction == VERTICAL)
59 m_pImpl->positions.push_back( mof::Vector2D(0 , m_pImpl->height));
60 if( !m_pImpl->views.empty( ) )m_pImpl->height += m_pImpl->margin;
61 m_pImpl->width = m_pImpl->width < size.x
62 ? mof::real2int(size.x)
64 m_pImpl->height += mof::real2int(size.y);
66 else if(m_pImpl->direction == HORIZONTAL)
68 m_pImpl->positions.push_back( mof::Vector2D(m_pImpl->width , 0));
69 if( !m_pImpl->views.empty( ) )m_pImpl->width += m_pImpl->margin;
70 m_pImpl->width += mof::real2int(size.x);
71 m_pImpl->height = m_pImpl->height < size.y
72 ? mof::real2int(size.y)
78 size_t mof::widget::GridLayout::getLength() const
80 return m_pImpl->positions.size();
83 //{{{ getPreferredSize
84 mof::Vector2D mof::widget::GridLayout::getPreferredSize() const
86 return mof::Vector2D(m_pImpl->width , m_pImpl->height);
90 void mof::widget::GridLayout::connect(WidgetView* pParentView)
93 if(m_pImpl->direction == VERTICAL)
95 float py = pParentView->getPositionStream().value().y + pParentView->getPreferredSize().y;
96 foreach(WidgetView::ptr pView, m_pImpl->views)
98 pView->getPositionStream() << m_pImpl->positions[i++] << pParentView->getPositionStream();
101 mof::Vector2D filter(1, 0);
102 float cy = pView->getPositionStream().value().y + pView->getPreferredSize().y;
103 float d = py - cy;// 親と子の終点の差
104 pView->getSizeStream()
105 << -pView->getPreferredSize()
106 << mof::makeFilterHandler(pParentView->getSizeStream().toManipulator(), filter)//TODO この時点のフレームが非ゼロだと問題が起こるかも?
107 << std::make_shared<VerticalClipping>(pParentView->getSizeStream().toManipulator(), pView->getPreferredSize().y, d);
113 float px = pParentView->getPositionStream().value().x + pParentView->getPreferredSize().x;
114 foreach(WidgetView::ptr pView, m_pImpl->views)
116 pView->getPositionStream() << m_pImpl->positions[i++] << pParentView->getPositionStream();
119 mof::Vector2D filter(0, 1);
120 float cx = pView->getPositionStream().value().x + pView->getPreferredSize().x;
121 float d = px - cx;// 親と子の終点の差
122 pView->getSizeStream()
123 << -pView->getPreferredSize()
124 << mof::makeFilterHandler(pParentView->getSizeStream().toManipulator(), filter)//TODO この時点のフレームが非ゼロだと問題が起こるかも?
125 << std::make_shared<HorizontalClipping>(pParentView->getSizeStream().toManipulator(), pView->getPreferredSize().x, d);
132 //{{{ getAdjacencyAsUp
133 int mof::widget::GridLayout::getAdjacencyAsUp(int index) const
135 if(m_pImpl->direction == VERTICAL)return mof::rotation_mod(index-1 , m_pImpl->positions.size());
139 //{{{ getAdjacencyAsDown
140 int mof::widget::GridLayout::getAdjacencyAsDown(int index) const
142 if(m_pImpl->direction == VERTICAL)return mof::rotation_mod(index+1 , m_pImpl->positions.size());
146 //{{{ getAdjacencyAsLeft
147 int mof::widget::GridLayout::getAdjacencyAsLeft(int index) const
149 if(m_pImpl->direction == HORIZONTAL)return mof::rotation_mod(index-1 , m_pImpl->positions.size());
153 //{{{ getAdjacencyAsRight
154 int mof::widget::GridLayout::getAdjacencyAsRight(int index) const
156 if(m_pImpl->direction == HORIZONTAL)return mof::rotation_mod(index+1 , m_pImpl->positions.size());