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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * Controller_widget.cpp : Controller Widget for the controllers
  3.  ****************************************************************************
  4.  * Copyright (C) 2006-2008 the VideoLAN team
  5.  * $Id: dc2983df34b291da27e33815f78a43ce3db480e7 $
  6.  *
  7.  * Authors: Jean-Baptiste Kempf <jb@videolan.org>
  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. #ifdef HAVE_CONFIG_H
  24. # include "config.h"
  25. #endif
  26. #include "controller_widget.hpp"
  27. #include "controller.hpp"
  28. #include "input_manager.hpp"         /* Get notification of Volume Change */
  29. #include "util/input_slider.hpp"     /* SoundSlider */
  30. #include <vlc_aout.h>                /* Volume functions */
  31. #include <QLabel>
  32. #include <QHBoxLayout>
  33. #include <QSpinBox>
  34. #include <QMenu>
  35. #include <QWidgetAction>
  36. #include <QMouseEvent>
  37. SoundWidget::SoundWidget( QWidget *_parent, intf_thread_t * _p_intf,
  38.                           bool b_shiny, bool b_special )
  39.                          : QWidget( _parent ), p_intf( _p_intf),
  40.                            b_my_volume( false )
  41. {
  42.     /* We need a layout for this widget */
  43.     QHBoxLayout *layout = new QHBoxLayout( this );
  44.     layout->setSpacing( 0 ); layout->setMargin( 0 );
  45.     /* We need a Label for the pix */
  46.     volMuteLabel = new QLabel;
  47.     volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) );
  48.     /* We might need a subLayout too */
  49.     QVBoxLayout *subLayout;
  50.     volMuteLabel->installEventFilter( this );
  51.     /* Normal View, click on icon mutes */
  52.     if( !b_special )
  53.     {
  54.         volumeMenu = NULL; subLayout = NULL;
  55.         volumeControlWidget = NULL;
  56.     }
  57.     else
  58.     {
  59.         /* Special view, click on button shows the slider */
  60.         b_shiny = false;
  61.         volumeControlWidget = new QFrame;
  62.         subLayout = new QVBoxLayout( volumeControlWidget );
  63.         subLayout->setLayoutMargins( 4, 4, 4, 4, 4 );
  64.         volumeMenu = new QMenu( this );
  65.         QWidgetAction *widgetAction = new QWidgetAction( volumeControlWidget );
  66.         widgetAction->setDefaultWidget( volumeControlWidget );
  67.         volumeMenu->addAction( widgetAction );
  68.     }
  69.     /* And add the label */
  70.     layout->addWidget( volMuteLabel );
  71.     /* Slider creation: shiny or clean */
  72.     if( b_shiny )
  73.     {
  74.         volumeSlider = new SoundSlider( this,
  75.             config_GetInt( p_intf, "volume-step" ),
  76.             config_GetInt( p_intf, "qt-volume-complete" ),
  77.             config_GetPsz( p_intf, "qt-slider-colours" ) );
  78.     }
  79.     else
  80.     {
  81.         volumeSlider = new QSlider( NULL );
  82.         volumeSlider->setOrientation( b_special ? Qt::Vertical
  83.                                                 : Qt::Horizontal );
  84.         volumeSlider->setMaximum( config_GetInt( p_intf, "qt-volume-complete" )
  85.                                   ? 400 : 200 );
  86.     }
  87.     if( volumeSlider->orientation() ==  Qt::Horizontal )
  88.     {
  89.         volumeSlider->setMaximumSize( QSize( 200, 40 ) );
  90.         volumeSlider->setMinimumSize( QSize( 85, 30 ) );
  91.     }
  92.     volumeSlider->setFocusPolicy( Qt::NoFocus );
  93.     if( b_special )
  94.         subLayout->addWidget( volumeSlider );
  95.     else
  96.         layout->addWidget( volumeSlider, 0, Qt::AlignBottom  );
  97.     /* Set the volume from the config */
  98.     volumeSlider->setValue( ( config_GetInt( p_intf, "volume" ) ) *
  99.                               VOLUME_MAX / (AOUT_VOLUME_MAX/2) );
  100.     /* Force the update at build time in order to have a muted icon if needed */
  101.     updateVolume( volumeSlider->value() );
  102.     /* Volume control connection */
  103.     CONNECT( volumeSlider, valueChanged( int ), this, updateVolume( int ) );
  104.     CONNECT( THEMIM, volumeChanged( void ), this, updateVolume( void ) );
  105. }
  106. SoundWidget::~SoundWidget()
  107. {
  108.     delete volumeSlider;
  109.     delete volumeControlWidget;
  110. }
  111. void SoundWidget::updateVolume( int i_sliderVolume )
  112. {
  113.     if( !b_my_volume )
  114.     {
  115.         int i_res = i_sliderVolume  * (AOUT_VOLUME_MAX / 2) / VOLUME_MAX;
  116.         aout_VolumeSet( p_intf, i_res );
  117.     }
  118.     if( i_sliderVolume == 0 )
  119.     {
  120.         volMuteLabel->setPixmap( QPixmap(":/volume-muted" ) );
  121.         volMuteLabel->setToolTip( qtr( "Unmute" ) );
  122.         return;
  123.     }
  124.     if( i_sliderVolume < VOLUME_MAX / 3 )
  125.         volMuteLabel->setPixmap( QPixmap( ":/volume-low" ) );
  126.     else if( i_sliderVolume > (VOLUME_MAX * 2 / 3 ) )
  127.         volMuteLabel->setPixmap( QPixmap( ":/volume-high" ) );
  128.     else volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) );
  129.     volMuteLabel->setToolTip( qtr( "Mute" ) );
  130. }
  131. void SoundWidget::updateVolume()
  132. {
  133.     /* Audio part */
  134.     audio_volume_t i_volume;
  135.     aout_VolumeGet( p_intf, &i_volume );
  136.     i_volume = ( ( i_volume + 1 ) *  VOLUME_MAX )/ (AOUT_VOLUME_MAX/2);
  137.     int i_gauge = volumeSlider->value();
  138.     b_my_volume = false;
  139.     if( i_volume - i_gauge > 1 || i_gauge - i_volume > 1 )
  140.     {
  141.         b_my_volume = true;
  142.         volumeSlider->setValue( i_volume );
  143.         b_my_volume = false;
  144.     }
  145. }
  146. void SoundWidget::showVolumeMenu( QPoint pos )
  147. {
  148.     volumeMenu->exec( QCursor::pos() - pos - QPoint( 0, volumeMenu->height()/2 )
  149.                           + QPoint( width(), height() /2) );
  150. }
  151. bool SoundWidget::eventFilter( QObject *obj, QEvent *e )
  152. {
  153.     VLC_UNUSED( obj );
  154.     if (e->type() == QEvent::MouseButtonPress  )
  155.     {
  156.         if( volumeSlider->orientation() ==  Qt::Vertical )
  157.         {
  158.             QMouseEvent *event = static_cast<QMouseEvent*>(e);
  159.             showVolumeMenu( event->pos() );
  160.         }
  161.         else
  162.         {
  163.             aout_VolumeMute( p_intf, NULL );
  164.         }
  165.         e->accept();
  166.         return true;
  167.     }
  168.     else
  169.     {
  170.         e->ignore();
  171.         return false;
  172.     }
  173. }
  174. /**
  175.  * Play Button
  176.  **/
  177. void PlayButton::updateButton( bool b_playing )
  178. {
  179.     setIcon( b_playing ? QIcon( ":/pause_b" ) : QIcon( ":/play_b" ) );
  180.     setToolTip( b_playing ? qtr( "Pause the playback" )
  181.                           : qtr( I_PLAY_TOOLTIP ) );
  182. }
  183. void AtoB_Button::setIcons( bool timeA, bool timeB )
  184. {
  185.     if( !timeA && !timeB)
  186.     {
  187.         setIcon( QIcon( ":/atob_nob" ) );
  188.         setToolTip( qtr( "Loop from point A to point B continuouslyn"
  189.                          "Click to set point A" ) );
  190.     }
  191.     else if( timeA && !timeB )
  192.     {
  193.         setIcon( QIcon( ":/atob_noa" ) );
  194.         setToolTip( qtr( "Click to set point B" ) );
  195.     }
  196.     else if( timeA && timeB )
  197.     {
  198.         setIcon( QIcon( ":/atob" ) );
  199.         setToolTip( qtr( "Stop the A to B loop" ) );
  200.     }
  201. }