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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * TransportButton.h
  3.  *****************************************************************************
  4.  * Copyright (C) 2001 the VideoLAN team
  5.  * $Id: fc2a8a2ea6d2254fd10909f654d8937d62e5560a $
  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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, 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.     
  47.     virtual ~TransportButton();
  48.     void SetStartPressingMessage(BMessage *);
  49.     void SetPressingMessage(BMessage *);
  50.     void SetDonePressingMessage(BMessage *);
  51.     void SetPressingPeriod(bigtime_t);
  52.     virtual void SetEnabled(bool);
  53. protected:        
  54.     enum {
  55.         kDisabledMask = 0x1,
  56.         kPressedMask = 0x2
  57.     };
  58.     
  59.     virtual void AttachedToWindow();
  60.     virtual void DetachedFromWindow();
  61.     virtual void Draw(BRect);
  62.     virtual void MouseDown(BPoint);
  63.     virtual    void MouseMoved(BPoint, uint32 code, const BMessage *);
  64.     virtual    void MouseUp(BPoint);
  65.     virtual    void WindowActivated(bool);
  66.     virtual BBitmap *MakeBitmap(uint32);
  67.         // lazy bitmap builder
  68.     
  69.     virtual uint32 ModeMask() const;
  70.         // mode mask corresponding to the current button state
  71.         // - determines which bitmap will be used
  72.     virtual const unsigned char *BitsForMask(uint32) const;
  73.         // pick the right bits based on a mode mask
  74.         // overriding class can add swapping between two pairs of bitmaps, etc.
  75.     virtual void StartPressing();
  76.     virtual void MouseCancelPressing();
  77.     virtual void DonePressing();
  78. private:
  79.     void ShortcutKeyDown();
  80.     void ShortcutKeyUp();
  81.     
  82.     void MouseStartPressing();
  83.     void MouseDonePressing();
  84.     BitmapStash *bitmaps;
  85.         // using BitmapStash * here instead of a direct member so that the class can be private in
  86.         // the .cpp file
  87.     // bitmap bits used to build bitmaps for the different states
  88.     const unsigned char *normalBits;
  89.     const unsigned char *pressedBits;
  90.     const unsigned char *disabledBits;
  91.     
  92.     BMessage *startPressingMessage;
  93.     BMessage *pressingMessage;
  94.     BMessage *donePressingMessage;
  95.     bigtime_t pressingPeriod;
  96.     
  97.     bool mouseDown;
  98.     bool keyDown;
  99.     PeriodicMessageSender *messageSender;
  100.     BMessageFilter *keyPressFilter;
  101.     typedef BControl _inherited;
  102.     
  103.     friend class SkipButtonKeypressFilter;
  104.     friend class BitmapStash;
  105. };
  106. class PlayPauseButton : public TransportButton {
  107. // Knows about playing and paused states, blinks
  108. // the pause LED during paused state
  109. public:
  110.     PlayPauseButton(BRect frame, const char *name,
  111.         const unsigned char *normalBits,
  112.         const unsigned char *pressedBits,
  113.         const unsigned char *disabledBits,
  114.         const unsigned char *normalPlayingBits,
  115.         const unsigned char *pressedPlayingBits,
  116.         const unsigned char *normalPausedBits,
  117.         const unsigned char *pressedPausedBits,
  118.         BMessage *invokeMessage,            // done pressing over button
  119.         uint32 key = 0,                        // optional shortcut key
  120.         uint32 modifiers = 0,                // optional shortcut key modifier
  121.         uint32 resizeFlags = B_FOLLOW_LEFT | B_FOLLOW_TOP);
  122.     
  123.     // These need get called periodically to update the button state
  124.     // OK to call them over and over - once the state is correct, the call
  125.     // is very low overhead
  126.     void SetStopped();
  127.     void SetPlaying();
  128.     void SetPaused();
  129. protected:
  130.     
  131.     virtual uint32 ModeMask() const;
  132.     virtual const unsigned char *BitsForMask(uint32) const;
  133.     virtual void StartPressing();
  134.     virtual void MouseCancelPressing();
  135.     virtual void DonePressing();
  136. private:
  137.     const unsigned char *normalPlayingBits;
  138.     const unsigned char *pressedPlayingBits;
  139.     const unsigned char *normalPausedBits;
  140.     const unsigned char *pressedPausedBits;
  141.     
  142.     enum PlayState {
  143.         kStopped,
  144.         kAboutToPlay,
  145.         kPlaying,
  146.         kAboutToPause,
  147.         kPausedLedOn,
  148.         kPausedLedOff
  149.     };
  150.     
  151.     enum {
  152.         kPlayingMask = 0x4,
  153.         kPausedMask = 0x8
  154.     };
  155.     
  156.     PlayState state;
  157.     bigtime_t lastPauseBlinkTime;
  158.     uint32 lastModeMask;
  159.     
  160.     typedef TransportButton _inherited;
  161. };
  162. #endif    // __MEDIA_BUTTON__