TransportButton.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:5k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * TransportButton.h
  3.  *****************************************************************************
  4.  * Copyright (C) 2001 VideoLAN
  5.  * $Id: TransportButton.h 6961 2004-03-05 17:34:23Z sam $
  6.  *
  7.  * Authors: Tony Castley <tcastley@mail.powerup.com.au>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #ifndef __MEDIA_BUTTON__
  24. #define __MEDIA_BUTTON__
  25. #include <Control.h>
  26. class BMessage;
  27. class BBitmap;
  28. class PeriodicMessageSender;
  29. class BitmapStash;
  30. // TransportButton must be installed into a window with B_ASYNCHRONOUS_CONTROLS on
  31. // currently no button focus drawing
  32. class TransportButton : public BControl {
  33. public:
  34. TransportButton(BRect frame, const char *name,
  35. const unsigned char *normalBits,
  36. const unsigned char *pressedBits,
  37. const unsigned char *disabledBits,
  38. BMessage *invokeMessage, // done pressing over button
  39. BMessage *startPressingMessage = 0, // just clicked button
  40. BMessage *pressingMessage = 0,  // periodical still pressing
  41. BMessage *donePressing = 0,  // tracked out of button/didn't invoke
  42. bigtime_t period = 0, // pressing message period
  43. uint32 key = 0, // optional shortcut key
  44. uint32 modifiers = 0, // optional shortcut key modifier
  45. uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP);
  46. virtual ~TransportButton();
  47. void SetStartPressingMessage(BMessage *);
  48. void SetPressingMessage(BMessage *);
  49. void SetDonePressingMessage(BMessage *);
  50. void SetPressingPeriod(bigtime_t);
  51. virtual void SetEnabled(bool);
  52. protected:
  53. enum {
  54. kDisabledMask = 0x1,
  55. kPressedMask = 0x2
  56. };
  57. virtual void AttachedToWindow();
  58. virtual void DetachedFromWindow();
  59. virtual void Draw(BRect);
  60. virtual void MouseDown(BPoint);
  61. virtual void MouseMoved(BPoint, uint32 code, const BMessage *);
  62. virtual void MouseUp(BPoint);
  63. virtual void WindowActivated(bool);
  64. virtual BBitmap *MakeBitmap(uint32);
  65. // lazy bitmap builder
  66. virtual uint32 ModeMask() const;
  67. // mode mask corresponding to the current button state
  68. // - determines which bitmap will be used
  69. virtual const unsigned char *BitsForMask(uint32) const;
  70. // pick the right bits based on a mode mask
  71. // overriding class can add swapping between two pairs of bitmaps, etc.
  72. virtual void StartPressing();
  73. virtual void MouseCancelPressing();
  74. virtual void DonePressing();
  75. private:
  76. void ShortcutKeyDown();
  77. void ShortcutKeyUp();
  78. void MouseStartPressing();
  79. void MouseDonePressing();
  80. BitmapStash *bitmaps;
  81. // using BitmapStash * here instead of a direct member so that the class can be private in
  82. // the .cpp file
  83. // bitmap bits used to build bitmaps for the different states
  84. const unsigned char *normalBits;
  85. const unsigned char *pressedBits;
  86. const unsigned char *disabledBits;
  87. BMessage *startPressingMessage;
  88. BMessage *pressingMessage;
  89. BMessage *donePressingMessage;
  90. bigtime_t pressingPeriod;
  91. bool mouseDown;
  92. bool keyDown;
  93. PeriodicMessageSender *messageSender;
  94. BMessageFilter *keyPressFilter;
  95. typedef BControl _inherited;
  96. friend class SkipButtonKeypressFilter;
  97. friend class BitmapStash;
  98. };
  99. class PlayPauseButton : public TransportButton {
  100. // Knows about playing and paused states, blinks
  101. // the pause LED during paused state
  102. public:
  103. PlayPauseButton(BRect frame, const char *name,
  104. const unsigned char *normalBits,
  105. const unsigned char *pressedBits,
  106. const unsigned char *disabledBits,
  107. const unsigned char *normalPlayingBits,
  108. const unsigned char *pressedPlayingBits,
  109. const unsigned char *normalPausedBits,
  110. const unsigned char *pressedPausedBits,
  111. BMessage *invokeMessage, // done pressing over button
  112. uint32 key = 0, // optional shortcut key
  113. uint32 modifiers = 0, // optional shortcut key modifier
  114. uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP);
  115. // These need get called periodically to update the button state
  116. // OK to call them over and over - once the state is correct, the call
  117. // is very low overhead
  118. void SetStopped();
  119. void SetPlaying();
  120. void SetPaused();
  121. protected:
  122. virtual uint32 ModeMask() const;
  123. virtual const unsigned char *BitsForMask(uint32) const;
  124. virtual void StartPressing();
  125. virtual void MouseCancelPressing();
  126. virtual void DonePressing();
  127. private:
  128. const unsigned char *normalPlayingBits;
  129. const unsigned char *pressedPlayingBits;
  130. const unsigned char *normalPausedBits;
  131. const unsigned char *pressedPausedBits;
  132. enum PlayState {
  133. kStopped,
  134. kAboutToPlay,
  135. kPlaying,
  136. kAboutToPause,
  137. kPausedLedOn,
  138. kPausedLedOff
  139. };
  140. enum {
  141. kPlayingMask = 0x4,
  142. kPausedMask = 0x8
  143. };
  144. PlayState state;
  145. bigtime_t lastPauseBlinkTime;
  146. uint32 lastModeMask;
  147. typedef TransportButton _inherited;
  148. };
  149. #endif // __MEDIA_BUTTON__