1 #include "mof/Menu.hpp"
2 #include "mof/Effect.hpp"
3 #include "mof/utilities.hpp"
4 #include "mof/LayoutManager.hpp"
5 #include <boost/scoped_array.hpp>
6 #include "mof/ConsoleIO.hpp"
7 #include "mof/WidgetView.hpp"
8 #include "mof/GraphicsDevice.hpp"
9 #include "mof/mofAnimations.hpp"
12 struct mof::Menu::Impl{
13 mof::WidgetView* pBackgroundView;
14 mof::LayoutManager* pLayout;
15 std::shared_ptr<mof::Matrix2D> pTranslation;
23 Impl( const mof::Rectangle<int>& _bounds)
24 : pBackgroundView(NULL) ,
25 width(_bounds.endX - _bounds.beginX) , height(_bounds.endY - _bounds.beginY) ,
26 items(NULL) , size(0) , indicator(0) , pLayout(NULL) {
27 pTranslation = std::shared_ptr<mof::Matrix2D>(
29 mof::Matrix2D::createTranslation(
30 mof::Vector2D(_bounds.beginX , _bounds.beginY )
37 for(int i = 0 ; i < size ; ++i){
38 delete items[i].pView;
42 delete pBackgroundView;
52 mof::WidgetView* pBackgroundView ,
53 const mof::Menu::MenuItem & front ,
54 const mof::Menu::MenuItem& back ,
55 const mof::Rectangle<int>& bounds ,
56 mof::LayoutManager* pLayout
58 : m_pImpl(new Impl(bounds))
60 m_pImpl->pLayout = pLayout;
61 m_pImpl->pBackgroundView = pBackgroundView;
63 m_pImpl->size = &back - &front + 1;
64 if(m_pImpl->size <= 0)throw std::invalid_argument("the length of front-back is less than zero");
66 m_pImpl->items = new MenuItem[m_pImpl->size];
67 boost::scoped_array<mof::Rectangle<int> > boundList(new mof::Rectangle<int>[m_pImpl->size]);
69 for(int i = 0 ; i < m_pImpl->size ; ++i){
70 m_pImpl->items[i] = (&front)[i];
71 mof::Rectangle<int> bounds = m_pImpl->items[i].pView->initialize();
72 boundList[i] = bounds;
75 m_pImpl->pLayout->replace(m_pImpl->width , m_pImpl->height , boundList[0] , boundList[m_pImpl->size-1]);
77 //TODO: LayoutAnimation
\82ð
\82Â
\82
\82é
78 for(int i = 0 ; i < m_pImpl->size ; ++i){
79 const mof::Animation<mof::Matrix2D>::Handler children[] =
81 mof::makeParametricHandler(m_pImpl->pTranslation) ,
82 mof::makeConstantHandler
84 mof::Matrix2D::createTranslation( m_pImpl->pLayout->getPosition(i))
88 m_pImpl->items[i].pView->setPosition
90 mof::Animation<mof::Matrix2D>::Handler
92 new mof::CascadingAnimation<mof::Matrix2D>(children[0] , children[1])
96 m_pImpl->pBackgroundView->setBounds(bounds);
105 void mof::Menu::show(){
106 m_pImpl->pBackgroundView->show();
107 for(int i = 0 ; i < m_pImpl->size ; ++i){
108 m_pImpl->items[i].pView->show();
112 void mof::Menu::close(){
113 m_pImpl->pBackgroundView->close();
114 for(int i = 0 ; i < m_pImpl->size ; ++i){
115 m_pImpl->items[i].pView->close();
119 void mof::Menu::up(){
120 mof::Menu::MenuItem* pItem = &m_pImpl->items[m_pImpl->indicator];
121 pItem->pView->blur();
123 m_pImpl->indicator--;
124 if(m_pImpl->indicator == -1)m_pImpl->indicator = m_pImpl->size -1;
126 pItem = &m_pImpl->items[m_pImpl->indicator];
127 pItem->pView->focus();
130 void mof::Menu::down(){
131 mof::Menu::MenuItem* pItem = &m_pImpl->items[m_pImpl->indicator];
132 pItem->pView->blur();
134 m_pImpl->indicator++;
135 if(m_pImpl->indicator == m_pImpl->size)m_pImpl->indicator = 0;
137 pItem = &m_pImpl->items[m_pImpl->indicator];
138 pItem->pView->focus();
143 void mof::Menu::left() {
147 void mof::Menu::right(){
151 void mof::Menu::performAction() const{
152 if(!m_pImpl->items[m_pImpl->indicator].action)return;
153 m_pImpl->items[m_pImpl->indicator].action();
156 void mof::Menu::draw() const{
157 m_pImpl->pBackgroundView->draw();
158 mof::GraphicsDevice::setViewport(m_pImpl->pBackgroundView->getBounds());
159 for(int i = 0 ; i < m_pImpl->size ; ++i){
160 m_pImpl->items[i].pView->getEffect()->draw();
162 mof::GraphicsDevice::setViewport(mof::Rectangle<int>(0 , 0 , 640 , 480));//TODO
166 void mof::Menu::update() {
167 m_pImpl->pBackgroundView->update();
168 for(int i = 0 ; i < m_pImpl->size ; ++i){
169 m_pImpl->items[i].pView->update();