ctrl_button.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * ctrl_button.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: f379c40ac69b4152e45b3af42b16899c07b9fff4 $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teulière <ipkiss@via.ecp.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #include "ctrl_button.hpp"
  25. #include "../events/evt_generic.hpp"
  26. #include "../src/generic_bitmap.hpp"
  27. #include "../src/os_factory.hpp"
  28. #include "../src/os_graphics.hpp"
  29. #include "../commands/cmd_generic.hpp"
  30. CtrlButton::CtrlButton( intf_thread_t *pIntf, const GenericBitmap &rBmpUp,
  31.                         const GenericBitmap &rBmpOver,
  32.                         const GenericBitmap &rBmpDown, CmdGeneric &rCommand,
  33.                         const UString &rTooltip, const UString &rHelp,
  34.                         VarBool *pVisible ):
  35.     CtrlGeneric( pIntf, rHelp, pVisible ), m_fsm( pIntf ),
  36.     m_rCommand( rCommand ), m_tooltip( rTooltip ),
  37.     m_imgUp( pIntf, rBmpUp ), m_imgOver( pIntf, rBmpOver ),
  38.     m_imgDown( pIntf, rBmpDown ), m_pImg( NULL ), m_cmdUpOverDownOver( this ),
  39.     m_cmdDownOverUpOver( this ), m_cmdDownOverDown( this ),
  40.     m_cmdDownDownOver( this ), m_cmdUpOverUp( this ), m_cmdUpUpOver( this ),
  41.     m_cmdDownUp( this ), m_cmdUpHidden( this ), m_cmdHiddenUp( this )
  42. {
  43.     // States
  44.     m_fsm.addState( "up" );
  45.     m_fsm.addState( "down" );
  46.     m_fsm.addState( "upOver" );
  47.     m_fsm.addState( "downOver" );
  48.     m_fsm.addState( "hidden" );
  49.     // Transitions
  50.     m_fsm.addTransition( "upOver", "mouse:left:down", "downOver",
  51.                          &m_cmdUpOverDownOver );
  52.     m_fsm.addTransition( "upOver", "mouse:left:dblclick", "downOver",
  53.                          &m_cmdUpOverDownOver );
  54.     m_fsm.addTransition( "downOver", "mouse:left:up", "upOver",
  55.                          &m_cmdDownOverUpOver );
  56.     m_fsm.addTransition( "downOver", "leave", "down", &m_cmdDownOverDown );
  57.     m_fsm.addTransition( "down", "enter", "downOver", &m_cmdDownDownOver );
  58.     m_fsm.addTransition( "upOver", "leave", "up", &m_cmdUpOverUp );
  59.     m_fsm.addTransition( "up", "enter", "upOver", &m_cmdUpUpOver );
  60.     m_fsm.addTransition( "down", "mouse:left:up", "up", &m_cmdDownUp );
  61.     // XXX: It would be easy to use a "ANY" initial state to handle these
  62.     // four lines in only one. But till now it isn't worthwhile...
  63.     m_fsm.addTransition( "up", "special:hide", "hidden", &m_cmdUpHidden );
  64.     m_fsm.addTransition( "down", "special:hide", "hidden", &m_cmdUpHidden );
  65.     m_fsm.addTransition( "upOver", "special:hide", "hidden", &m_cmdUpHidden );
  66.     m_fsm.addTransition( "downOver", "special:hide", "hidden", &m_cmdUpHidden );
  67.     m_fsm.addTransition( "hidden", "special:show", "up", &m_cmdHiddenUp );
  68.     // Initial state
  69.     m_fsm.setState( "up" );
  70.     setImage( &m_imgUp );
  71. }
  72. CtrlButton::~CtrlButton()
  73. {
  74. }
  75. void CtrlButton::handleEvent( EvtGeneric &rEvent )
  76. {
  77.     m_fsm.handleTransition( rEvent.getAsString() );
  78. }
  79. bool CtrlButton::mouseOver( int x, int y ) const
  80. {
  81.     if( m_pImg )
  82.     {
  83.         return m_pImg->hit( x, y );
  84.     }
  85.     else
  86.     {
  87.         return false;
  88.     }
  89. }
  90. void CtrlButton::draw( OSGraphics &rImage, int xDest, int yDest )
  91. {
  92.     if( m_pImg )
  93.     {
  94.         // Draw the current image
  95.         m_pImg->draw( rImage, xDest, yDest );
  96.     }
  97. }
  98. void CtrlButton::setImage( AnimBitmap *pImg )
  99. {
  100.     AnimBitmap *pOldImg = m_pImg;
  101.     m_pImg = pImg;
  102.     if( pOldImg )
  103.     {
  104.         pOldImg->stopAnim();
  105.         pOldImg->delObserver( this );
  106.     }
  107.     if( pImg )
  108.     {
  109.         pImg->startAnim();
  110.         pImg->addObserver( this );
  111.     }
  112.     notifyLayoutMaxSize( pOldImg, pImg );
  113. }
  114. void CtrlButton::onUpdate( Subject<AnimBitmap> &rBitmap, void *arg )
  115. {
  116.     notifyLayout();
  117. }
  118. void CtrlButton::CmdUpOverDownOver::execute()
  119. {
  120.     m_pParent->captureMouse();
  121.     m_pParent->setImage( &m_pParent->m_imgDown );
  122. }
  123. void CtrlButton::CmdDownOverUpOver::execute()
  124. {
  125.     m_pParent->releaseMouse();
  126.     m_pParent->setImage( &m_pParent->m_imgUp );
  127.     // Execute the command associated to this button
  128.     m_pParent->m_rCommand.execute();
  129. }
  130. void CtrlButton::CmdDownOverDown::execute()
  131. {
  132.     m_pParent->setImage( &m_pParent->m_imgUp );
  133. }
  134. void CtrlButton::CmdDownDownOver::execute()
  135. {
  136.     m_pParent->setImage( &m_pParent->m_imgDown );
  137. }
  138. void CtrlButton::CmdUpUpOver::execute()
  139. {
  140.     m_pParent->setImage( &m_pParent->m_imgOver );
  141. }
  142. void CtrlButton::CmdUpOverUp::execute()
  143. {
  144.     m_pParent->setImage( &m_pParent->m_imgUp );
  145. }
  146. void CtrlButton::CmdDownUp::execute()
  147. {
  148.     m_pParent->releaseMouse();
  149. }
  150. void CtrlButton::CmdUpHidden::execute()
  151. {
  152.     m_pParent->setImage( NULL );
  153. }
  154. void CtrlButton::CmdHiddenUp::execute()
  155. {
  156.     m_pParent->setImage( &m_pParent->m_imgUp );
  157. }