OSDN Git Service

fix build system ofmoflib1 and saisei1
[moflib/moflib.git] / moflib-1.0 / src / mof / widget / Menu.cpp
1 #pragma once
2 #include <mof/widget/Menu.hpp>
3 #include <mof/widget/GridLayout.hpp>
4 #include <mof/widget/Container.hpp>
5 #include <memory>
6 #include <algorithm>
7
8 using mof::widget::Container;
9 using mof::widget::WidgetView;
10 using mof::widget::GridLayout;
11 using mof::widget::MenuItem;
12
13 namespace mof
14 {
15 namespace widget
16 {
17 //{{{ Impl
18         struct Menu::Impl
19         {
20             std::vector< boost::function0<void> > actions;
21         std::shared_ptr<Container> pView; 
22             int currentIndex;
23         
24             Impl()
25             : pView() , currentIndex(0)
26             {}
27         };
28 //}}}
29 //{{{ constructor
30         Menu::Menu
31         (
32             const MenuItem& front ,
33             const MenuItem& back
34         )
35         : m_pImpl(new Impl)
36         {
37             int length = &back - &front + 1;
38             std::vector< std::shared_ptr<mof::widget::WidgetView> > views;
39             for(int i = 0 ; i < length ; i++)
40             {
41                 views.push_back( std::shared_ptr<WidgetView>( (&front + i)->view( ) ) );
42                         m_pImpl->actions.push_back((&front + i)->action);
43             }
44         
45             m_pImpl->pView = std::make_shared<Container>
46             (
47                 views.front() , views.back() , 
48             makeFactoryMethod<GridLayout>(GridLayout::VERTICAL , 0)
49         );
50         
51             m_pImpl->pView->getAt(m_pImpl->currentIndex)->focus();
52         }
53 //}}}
54 //{{{ constructor
55         Menu::Menu
56         (
57             const MenuItem& front ,
58             const MenuItem& back ,
59         const FactoryMethod<Layout>& layout
60         )
61         : m_pImpl(new Impl)
62         {
63             int length = &back - &front + 1;
64             std::vector< std::shared_ptr<mof::widget::WidgetView> > views;
65             for(int i = 0 ; i < length ; i++)
66             {
67                 views.push_back( std::shared_ptr<WidgetView>( (&front + i)->view( ) ) );
68                         m_pImpl->actions.push_back((&front + i)->action);
69             }
70         
71             m_pImpl->pView = std::make_shared<Container>
72             (
73                 views.front() , views.back() , layout
74         );
75         
76             m_pImpl->pView->getAt(m_pImpl->currentIndex)->focus();
77         }
78 //}}}
79 //{{{ destructor
80         Menu::~Menu()
81         {
82         }
83 //}}}
84 //{{{ show
85         mof::FrameNumber Menu::show(bool imidiately)
86         {
87             return m_pImpl->pView->show(imidiately);
88         }
89 //}}}
90 //{{{ hide
91         mof::FrameNumber Menu::hide(bool imidiately)
92         {
93             return m_pImpl->pView->hide(imidiately);
94         }
95 //}}}
96 //{{{ getView
97         const std::shared_ptr<WidgetView> Menu::getView( ) const
98         {
99             return m_pImpl->pView;
100         }
101 //}}}
102 //{{{ getView
103         std::shared_ptr<WidgetView> Menu::getView( ) 
104         {
105             return m_pImpl->pView;
106         }
107 //}}}
108 //{{{ update
109         void Menu::update()
110         {
111             m_pImpl->pView->update();
112         }
113 //}}}
114 //{{{ up
115         FrameNumber Menu::up()
116         {
117             int index = m_pImpl->pView->getAdjacencyAsUp(m_pImpl->currentIndex);
118             if(index == m_pImpl->currentIndex)return 0;
119             FrameNumber period_blured = m_pImpl->pView->getAt(m_pImpl->currentIndex)->blur();
120             m_pImpl->currentIndex = index;
121             FrameNumber period_focused = m_pImpl->pView->getAt(m_pImpl->currentIndex)->focus();
122                 return max(period_blured, period_focused);
123         }
124 //}}}
125 //{{{ down
126         FrameNumber Menu::down()
127         {
128             int index = m_pImpl->pView->getAdjacencyAsDown(m_pImpl->currentIndex);
129             if(index == m_pImpl->currentIndex)return 0;
130             FrameNumber period_blured = m_pImpl->pView->getAt(m_pImpl->currentIndex)->blur();
131             m_pImpl->currentIndex = index;
132             FrameNumber period_focused = m_pImpl->pView->getAt(m_pImpl->currentIndex)->focus();
133                 return max(period_blured, period_focused);
134         }
135 //}}}
136 //{{{ left 
137         FrameNumber Menu::left()
138         {
139             int index = m_pImpl->pView->getAdjacencyAsLeft(m_pImpl->currentIndex);
140             if(index == m_pImpl->currentIndex)return 0;
141             FrameNumber period_blured = m_pImpl->pView->getAt(m_pImpl->currentIndex)->blur();
142             m_pImpl->currentIndex = index;
143             FrameNumber period_focused = m_pImpl->pView->getAt(m_pImpl->currentIndex)->focus();
144                 return max(period_blured, period_focused);
145         }
146 //}}}
147 //{{{ right 
148         FrameNumber Menu::right()
149         {
150             int index = m_pImpl->pView->getAdjacencyAsRight(m_pImpl->currentIndex);
151             if(index == m_pImpl->currentIndex)return 0;
152             FrameNumber period_blured = m_pImpl->pView->getAt(m_pImpl->currentIndex)->blur();
153             m_pImpl->currentIndex = index;
154             FrameNumber period_focused = m_pImpl->pView->getAt(m_pImpl->currentIndex)->focus();
155                 return max(period_blured, period_focused);
156         }
157 //}}}
158 //{{{ performAction
159         FrameNumber Menu::performAction() const
160         {
161             m_pImpl->actions[m_pImpl->currentIndex]();
162             return m_pImpl->pView->getAt(m_pImpl->currentIndex)->click();
163         }
164 //}}}
165 //{{{ getSelectedIndex
166         int Menu::getSelectedIndex() const
167         {
168             return m_pImpl->currentIndex;
169         }
170 //}}}
171 }
172 }