From df132ea00f68dec2268f29e5778f706f1a91512a Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 11 Feb 2011 12:39:13 -0500 Subject: [PATCH] Use play button to start stations Fix new ui tweaks for stations and auto playlists --- src/audiocontrols.cpp | 4 + src/audiocontrols.h | 4 + .../playlist/dynamic/DynamicView.cpp | 4 +- .../dynamic/echonest/EchonestSteerer.cpp | 10 +- .../dynamic/widgets/DynamicSetupWidget.cpp | 10 +- .../dynamic/widgets/DynamicWidget.cpp | 143 ++++++------------ .../playlist/dynamic/widgets/DynamicWidget.h | 17 +-- 7 files changed, 71 insertions(+), 121 deletions(-) diff --git a/src/audiocontrols.cpp b/src/audiocontrols.cpp index 7a90319ec..fe7229587 100644 --- a/src/audiocontrols.cpp +++ b/src/audiocontrols.cpp @@ -121,6 +121,10 @@ AudioControls::AudioControls( QWidget* parent ) connect( ui->volumeLowButton, SIGNAL( clicked() ), AudioEngine::instance(), SLOT( lowerVolume() ) ); connect( ui->volumeHighButton, SIGNAL( clicked() ), AudioEngine::instance(), SLOT( raiseVolume() ) ); + + connect( ui->playPauseButton, SIGNAL( clicked() ), this, SIGNAL( playPressed() ) ); + connect( ui->pauseButton, SIGNAL( clicked() ), this, SIGNAL( pausePressed() ) ); + connect( ui->repeatButton, SIGNAL( clicked() ), SLOT( onRepeatClicked() ) ); connect( ui->shuffleButton, SIGNAL( clicked() ), SLOT( onShuffleClicked() ) ); diff --git a/src/audiocontrols.h b/src/audiocontrols.h index 59ac80eef..eb26bf425 100644 --- a/src/audiocontrols.h +++ b/src/audiocontrols.h @@ -19,6 +19,10 @@ public: AudioControls( QWidget* parent = 0 ); ~AudioControls(); +signals: + void playPressed(); + void pausePressed(); + public slots: void onRepeatModeChanged( PlaylistInterface::RepeatMode mode ); void onShuffleModeChanged( bool enabled ); diff --git a/src/libtomahawk/playlist/dynamic/DynamicView.cpp b/src/libtomahawk/playlist/dynamic/DynamicView.cpp index ce49d1643..a7de13825 100644 --- a/src/libtomahawk/playlist/dynamic/DynamicView.cpp +++ b/src/libtomahawk/playlist/dynamic/DynamicView.cpp @@ -103,9 +103,9 @@ DynamicView::onTrackCountChanged( unsigned int tracks ) { if( m_onDemand ) { if( m_readOnly ) - overlay()->setText( tr( "Press Start to begin listening to this custom station!" ) ); + overlay()->setText( tr( "Press play to begin listening to this custom station!" ) ); else - overlay()->setText( tr( "Add some filters above, and press Start to begin listening to this custom station!" ) ); + overlay()->setText( tr( "Add some filters above, and press play to begin listening to this custom station!" ) ); } else if( m_readOnly ) overlay()->setText( tr( "Press Generate to get started!" ) ); diff --git a/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp b/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp index 8507bc797..6a02d4ccd 100644 --- a/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp +++ b/src/libtomahawk/playlist/dynamic/echonest/EchonestSteerer.cpp @@ -113,7 +113,7 @@ EchonestSteerer::EchonestSteerer( QWidget* parent ) m_fadeAnim = new QPropertyAnimation( this, "opacity", this ); m_fadeAnim->setDuration( ANIM_DURATION ); m_fadeAnim->setStartValue( 0 ); - m_fadeAnim->setStartValue( 100 ); + m_fadeAnim->setEndValue( .86 ); resize( sizeHint() ); } @@ -130,10 +130,8 @@ EchonestSteerer::paintEvent( QPaintEvent* ) void EchonestSteerer::setOpacity( qreal opacity ) { - m_opacity = opacity / 100.0; - if( m_opacity == 1 ) - show(); - else if( m_opacity == 0 ) + m_opacity = opacity; + if( m_opacity == 0 ) hide(); repaint(); } @@ -143,6 +141,8 @@ EchonestSteerer::fadeIn() { m_fadeAnim->setDirection( QAbstractAnimation::Forward ); m_fadeAnim->start(); + + show(); } void diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicSetupWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicSetupWidget.cpp index b589dee4e..becac0baa 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicSetupWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicSetupWidget.cpp @@ -86,7 +86,7 @@ DynamicSetupWidget::DynamicSetupWidget( const Tomahawk::dynplaylist_ptr& playlis m_fadeAnim = new QPropertyAnimation( this, "opacity" ); m_fadeAnim->setDuration( 500 ); m_fadeAnim->setStartValue( 0.00 ); - m_fadeAnim->setEndValue( 1.0 ); + m_fadeAnim->setEndValue( .86 ); setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); resize( sizeHint() ); @@ -108,13 +108,16 @@ DynamicSetupWidget::fadeIn() { m_fadeAnim->setDirection( QAbstractAnimation::Forward ); m_fadeAnim->start(); + + show(); } void DynamicSetupWidget::fadeOut() { - m_fadeAnim->setDirection( QAbstractAnimation::Forward ); + m_fadeAnim->setDirection( QAbstractAnimation::Backward ); m_fadeAnim->start(); + } void @@ -127,10 +130,9 @@ void DynamicSetupWidget::setOpacity( qreal opacity ) { m_opacity = opacity; + if( m_opacity == 0 ) hide(); - else if( m_opacity == 1 ) - show(); repaint(); } diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp index 5a0a0e27b..ba48e0141 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.cpp @@ -37,6 +37,10 @@ #include "DynamicSetupWidget.h" #include +#include "tomahawk/tomahawkapp.h" +#include "tomahawkwindow.h" +#include "audiocontrols.h" + using namespace Tomahawk; DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget* parent ) @@ -48,44 +52,10 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget , m_runningOnDemand( false ) , m_controlsChanged( false ) , m_steering( 0 ) - , m_headerText( 0 ) - , m_headerLayout( 0 ) - , m_generatorCombo( 0 ) - , m_logo( 0 ) - , m_generateButton( 0 ) , m_controls( 0 ) , m_view( 0 ) , m_model() { - m_headerLayout = new QHBoxLayout; - m_headerText = new QLabel( tr( "Type:" ), this ); - m_headerLayout->addWidget( m_headerText ); - - QComboBox* gen = new QComboBox( this ); - foreach( const QString& type, GeneratorFactory::types() ) - gen->addItem( type ); - m_generatorCombo = new ReadOrWriteWidget( gen, playlist->author()->isLocal(), this ); - m_headerLayout->addWidget( m_generatorCombo ); - - m_generateButton = new QPushButton( tr( "Generate" ), this ); - m_generateButton->setAttribute( Qt::WA_LayoutUsesWidgetRect ); - connect( m_generateButton, SIGNAL( clicked( bool ) ), this, SLOT( generate() ) ); - m_headerLayout->addWidget( m_generateButton ); - - m_headerLayout->addStretch( 1 ); - - m_genNumber = new QSpinBox( this ); - m_genNumber->setValue( 15 ); - m_genNumber->setMinimum( 0 ); - m_genNumber->hide(); - - m_logo = new QLabel( this ); - if( !playlist->generator()->logo().isNull() ) { - QPixmap p = playlist->generator()->logo().scaledToHeight( 16, Qt::SmoothTransformation ); - m_logo->setPixmap( p ); - } - m_headerLayout->addWidget(m_logo); - m_controls = new CollapsibleControls( this ); m_layout->addWidget( m_controls ); @@ -100,21 +70,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget m_setup = new DynamicSetupWidget( playlist, this ); - if( playlist->mode() == Static ) { - m_setup->hide(); - - m_layout->addLayout( m_headerLayout ); - } else { - m_setup->fadeIn(); - - // hide the widgets, removing them from layout - // TODO HACK these need to go away, need a good UI design - m_headerText->hide(); - m_generatorCombo->hide(); - m_generateButton->hide(); - m_genNumber->hide(); - m_logo->hide(); - } + m_setup->fadeIn(); loadDynamicPlaylist( playlist ); @@ -131,6 +87,10 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget connect( m_controls, SIGNAL( controlChanged( Tomahawk::dyncontrol_ptr ) ), this, SLOT( controlChanged( Tomahawk::dyncontrol_ptr ) ), Qt::QueuedConnection ); connect( m_controls, SIGNAL( controlsChanged() ), this, SLOT( controlsChanged() ), Qt::QueuedConnection ); + + + connect( TomahawkApp::instance()->mainWindow()->audioControls(), SIGNAL( playPressed() ), this, SLOT( playPressed() ) ); + connect( TomahawkApp::instance()->mainWindow()->audioControls(), SIGNAL( pausePressed() ), this, SLOT( pausePressed() ) ); } DynamicWidget::~DynamicWidget() @@ -173,24 +133,6 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist ) disconnect( m_playlist->generator().data(), SIGNAL( error( QString, QString ) ), this, SLOT( generatorError( QString, QString ) ) ); } - if( m_playlist.isNull() || m_playlist->mode() != playlist->mode() ) { // update our ui with the appropriate controls - if( playlist->mode() == Static ) { - m_setup->hide(); - - m_layout->insertLayout( 0, m_headerLayout ); - } else { - m_setup->fadeIn(); - - // hide the widgets, removing them from layout - // TODO HACK these need to go away, need a good UI design - m_headerText->hide(); - m_generatorCombo->hide(); - m_generateButton->hide(); - m_genNumber->hide(); - m_logo->hide(); - m_layout->removeItem( m_headerLayout ); - } - } m_playlist = playlist; m_view->setOnDemand( m_playlist->mode() == OnDemand ); @@ -202,15 +144,9 @@ DynamicWidget::loadDynamicPlaylist( const Tomahawk::dynplaylist_ptr& playlist ) if( !m_playlist.isNull() ) m_controls->setControls( m_playlist, m_playlist->author()->isLocal() ); - - m_generatorCombo->setWritable( playlist->author()->isLocal() ); - m_generatorCombo->setLabel( qobject_cast< QComboBox* >( m_generatorCombo->writableWidget() )->currentText() ); - - applyModeChange( m_playlist->mode() ); connect( m_playlist->generator().data(), SIGNAL( generated( QList ) ), this, SLOT( tracksGenerated( QList ) ) ); connect( m_playlist.data(), SIGNAL( dynamicRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ), this, SLOT( onRevisionLoaded( Tomahawk::DynamicPlaylistRevision ) ) ); connect( m_playlist->generator().data(), SIGNAL( error( QString, QString ) ), this, SLOT( generatorError( QString, QString ) ) ); - } @@ -249,7 +185,7 @@ DynamicWidget::resizeEvent(QResizeEvent* ) void DynamicWidget::layoutFloatingWidgets() { - if( m_playlist->mode() == OnDemand && !m_runningOnDemand ) { + if( !m_runningOnDemand ) { int x = ( width() / 2 ) - ( m_setup->size().width() / 2 ); int y = height() - m_setup->size().height() - 40; // padding @@ -271,6 +207,14 @@ DynamicWidget::hideEvent( QHideEvent* ev ) QWidget::hideEvent( ev ); } +void +DynamicWidget::showEvent(QShowEvent* ) +{ + if( !m_playlist.isNull() ) { + m_setup->fadeIn(); + } +} + void DynamicWidget::generate( int num ) @@ -278,12 +222,33 @@ DynamicWidget::generate( int num ) if( m_playlist->mode() == Static ) { // get the items from the generator, and put them in the playlist - m_playlist->generator()->generate( num == -1 ? m_genNumber->value() : num ); // HACK while in transition + m_playlist->generator()->generate( num ); } else if( m_playlist->mode() == OnDemand ) { } } +void +DynamicWidget::pausePressed() +{ + // we don't handle explicit pausing right now + // no more track plays == no more adding. we stop when + // the user switches to a different playlist. +} + +void +DynamicWidget::playPressed() +{ + + if( isVisible() && !m_playlist.isNull() && + m_playlist->mode() == OnDemand && !m_runningOnDemand ) { + + startStation(); + } + +} + + void DynamicWidget::stopStation() { @@ -291,9 +256,7 @@ DynamicWidget::stopStation() m_runningOnDemand = false; // TODO until i add a qwidget interface - QMetaObject::invokeMethod( m_steering, SLOT( fadeOut() ), Qt::DirectConnection ); - - m_generateButton->setText( tr( "Start" ) ); + QMetaObject::invokeMethod( m_steering, "fadeOut", Qt::DirectConnection ); } void @@ -302,8 +265,6 @@ DynamicWidget::startStation() m_runningOnDemand = true; m_model->startOnDemand(); - m_generateButton->setText( tr( "Stop" ) ); - m_setup->fadeOut(); // show the steering controls if( m_playlist->generator()->onDemandSteerable() ) { @@ -318,7 +279,7 @@ DynamicWidget::startStation() m_steering->move( x, y ); // TODO until i add a qwidget interface - QMetaObject::invokeMethod( m_steering, SLOT( fadeIn() ), Qt::DirectConnection ); + QMetaObject::invokeMethod( m_steering, "fadeIn", Qt::DirectConnection ); connect( m_steering, SIGNAL( resized() ), this, SLOT( layoutFloatingWidgets() ) ); } @@ -330,22 +291,6 @@ DynamicWidget::playlistTypeChanged( QString ) // TODO } -void -DynamicWidget::applyModeChange( int mode ) -{ - if( mode == OnDemand ) - { - m_generateButton->setText( tr( "Play" ) ); - m_genNumber->hide(); - } else if( mode == Static ) { - m_generateButton->setText( tr( "Generate" ) ); - m_genNumber->show(); - if( m_headerLayout->indexOf( m_genNumber ) == -1 ) - m_headerLayout->insertWidget( 4, m_genNumber ); - } -} - - void DynamicWidget::tracksGenerated( const QList< query_ptr >& queries ) { @@ -399,7 +344,7 @@ DynamicWidget::paintRoundedFilledRect( QPainter& p, QPalette& pal, QRect& r, qre { p.setBackgroundMode( Qt::TransparentMode ); p.setRenderHint( QPainter::Antialiasing ); - p.setOpacity( 0.7 ); + p.setOpacity( opacity ); QPen pen( pal.dark().color(), .5 ); p.setPen( pen ); @@ -407,7 +352,7 @@ DynamicWidget::paintRoundedFilledRect( QPainter& p, QPalette& pal, QRect& r, qre p.drawRoundedRect( r, 10, 10 ); - p.setOpacity( opacity ); + p.setOpacity( opacity + .2 ); p.setBrush( QBrush() ); p.setPen( pen ); p.drawRoundedRect( r, 10, 10 ); diff --git a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h index bafb136ee..30469c813 100644 --- a/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h +++ b/src/libtomahawk/playlist/dynamic/widgets/DynamicWidget.h @@ -23,6 +23,7 @@ #include "dynamic/DynamicPlaylist.h" #include "dynamic/DynamicControl.h" +class QShowEvent; class QHideEvent; class QSpinBox; class QVBoxLayout; @@ -68,6 +69,7 @@ public: virtual QSize sizeHint() const; virtual void resizeEvent( QResizeEvent* ); virtual void hideEvent(QHideEvent* ); + virtual void showEvent(QShowEvent* ); static void paintRoundedFilledRect( QPainter& p, QPalette& pal, QRect& r, qreal opacity = .95 ); public slots: @@ -77,6 +79,9 @@ public slots: void startStation(); void stopStation(); + void playPressed(); + void pausePressed(); + private slots: void generate( int = -1 ); void tracksGenerated( const QList< Tomahawk::query_ptr>& queries ); @@ -86,9 +91,7 @@ private slots: void controlChanged( const Tomahawk::dyncontrol_ptr& control ); void layoutFloatingWidgets(); -private: - void applyModeChange( int mode ); - +private: dynplaylist_ptr m_playlist; QVBoxLayout* m_layout; bool m_resolveOnNextLoad; @@ -102,14 +105,6 @@ private: bool m_controlsChanged; QWidget* m_steering; - // layout and stuff - QLabel* m_headerText; - QHBoxLayout* m_headerLayout; - ReadOrWriteWidget* m_generatorCombo; - QLabel* m_logo; - QPushButton* m_generateButton; - QSpinBox* m_genNumber; - CollapsibleControls* m_controls; DynamicView* m_view;