1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-04-20 07:52:30 +02:00

initial commit of dynamic playlist gui

This commit is contained in:
Leo Franchi 2010-12-10 21:31:43 -05:00
parent f1bd808d33
commit b2b3f26155
15 changed files with 530 additions and 8 deletions

View File

@ -58,6 +58,7 @@
<file>./data/images/view-toggle-pressed-centre.png</file>
<file>./data/images/view-toggle-pressed-left.png</file>
<file>./data/images/view-toggle-pressed-right.png</file>
<file>./data/images/list-add.png</file>
<file>./data/images/volume-icon-full.png</file>
<file>./data/images/volume-icon-muted.png</file>
<file>./data/images/volume-slider-bkg.png</file>

View File

@ -151,6 +151,8 @@ SET( tomahawkSourcesGui ${tomahawkSourcesGui}
sourcetree/sourcetreeview.cpp
dynamic/widgets/DynamicWidget.cpp
dynamic/widgets/DynamicControlWidget.cpp
dynamic/widgets/DynamicControlList.cpp
dynamic/DynamicPlaylistModel.cpp
topbar/topbar.cpp
@ -307,7 +309,9 @@ SET( tomahawkHeadersGui ${tomahawkHeadersGui}
infowidgets/sourceinfowidget.h
dynamic/widgets/DynamicWidget.cpp
dynamic/widgets/DynamicWidget.h
dynamic/widgets/DynamicControlWidget.h
dynamic/widgets/DynamicControlList.h
dynamic/DynamicPlaylistModel.h
transferview.h

View File

@ -52,9 +52,17 @@ public:
/// The current type of this control
QString selectedType() const { return m_selectedType; }
/// The match selector widget based on this control's type
/**
* The match selector widget based on this control's type
*
* The control manages the lifetime of the widget.
*/
virtual QWidget* matchSelector() { Q_ASSERT( false ); return 0; }
/// The input field widget that is associated with this type
/**
* The input field widget that is associated with this type
*
* The control manages the lifetime of the widget.
*/
virtual QWidget* inputField() { Q_ASSERT( false ); return 0; }
/// the serializable value of the match

View File

@ -43,7 +43,13 @@ Tomahawk::EchonestControl::matchSelector()
void
Tomahawk::EchonestControl::setSelectedType ( const QString& type )
{
if( !m_input.isNull() )
delete m_input.data();
if( !m_match.isNull() )
delete m_match.data();
Tomahawk::DynamicControl::setSelectedType ( type );
updateWidgets();
}
Echonest::DynamicPlaylist::PlaylistParamData
@ -73,7 +79,8 @@ Tomahawk::EchonestControl::updateWidgets()
}
}
void Tomahawk::EchonestControl::updateData()
void
Tomahawk::EchonestControl::updateData()
{
if( selectedType() == "Artist" ) {
QWeakPointer<QComboBox> combo = qWeakPointerCast<QComboBox, QWidget>( m_match );

View File

@ -0,0 +1,104 @@
/****************************************************************************************
* Copyright (c) 2010 Leo Franchi <lfranchi@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#include "DynamicControlList.h"
#include <QLayout>
#include <QLabel>
#include "DynamicControlWidget.h"
using namespace Tomahawk;
DynamicControlList::DynamicControlList()
: AnimatedWidget()
, m_summaryWidget( 0 )
{
init();
}
DynamicControlList::DynamicControlList( AnimatedSplitter* parent )
: AnimatedWidget( parent )
, m_summaryWidget( 0 )
{
init();
}
DynamicControlList::DynamicControlList( const QList< dyncontrol_ptr >& controls, AnimatedSplitter* parent)
: AnimatedWidget(parent)
, m_summaryWidget( 0 )
{
init();
setControls( controls );
}
DynamicControlList::~DynamicControlList()
{
}
void
DynamicControlList::init()
{
setLayout( new QVBoxLayout );
layout()->setMargin( 0 );
layout()->setSpacing( 0 );
m_summaryWidget = new QWidget();
// TODO replace
m_summaryWidget->setMaximumHeight( 24 );
m_summaryWidget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
m_summaryWidget->setLayout( new QVBoxLayout );
m_summaryWidget->layout()->setMargin( 0 );
m_summaryWidget->layout()->addWidget( new QLabel( "replace me plz", m_summaryWidget ) );
setHiddenSize( m_summaryWidget->size() );
}
void
DynamicControlList::setControls(const QList< dyncontrol_ptr >& controls)
{
foreach( const dyncontrol_ptr& control, controls )
m_controls << new DynamicControlWidget( control, false, this );
}
void
DynamicControlList::onHidden( QWidget* w )
{
if( w != this )
return;
AnimatedWidget::onHidden( w );
foreach( DynamicControlWidget* control, m_controls ) {
layout()->removeWidget( control );
}
layout()->addWidget( m_summaryWidget );
}
void
DynamicControlList::onShown( QWidget* w )
{
if( w != this )
return;
AnimatedWidget::onShown( w );
layout()->removeWidget( m_summaryWidget );
foreach( DynamicControlWidget* control, m_controls ) {
layout()->addWidget( control );
control->setShowPlusButton( control == m_controls.last() );
}
}

View File

@ -0,0 +1,60 @@
/****************************************************************************************
* Copyright (c) 2010 Leo Franchi <lfranchi@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#ifndef DYNAMIC_CONTROL_LIST_H
#define DYNAMIC_CONTROL_LIST_H
#include "animatedsplitter.h"
#include "tomahawk/typedefs.h"
#include "dynamic/DynamicPlaylist.h"
namespace Tomahawk
{
class DynamicControlWidget;
/**
* This widget encapsulates the list of dynamic controls and behaves as an animated widget in
* the animated splitter
*/
class DynamicControlList : public AnimatedWidget
{
Q_OBJECT
public:
DynamicControlList(); // bad compiler!
explicit DynamicControlList( AnimatedSplitter* parent );
explicit DynamicControlList( const QList< dyncontrol_ptr >& controls, AnimatedSplitter* parent );
virtual ~DynamicControlList();
void setControls( const QList< dyncontrol_ptr >& controls );
public slots:
virtual void onHidden(QWidget* );
virtual void onShown(QWidget* );
private:
void init();
QList< DynamicControlWidget* > m_controls;
QWidget* m_summaryWidget;
};
};
#endif

View File

@ -0,0 +1,103 @@
/****************************************************************************************
* Copyright (c) 2010 Leo Franchi <lfranchi@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#include "DynamicControlWidget.h"
#include "tomahawk/tomahawkapp.h"
#include "dynamic/DynamicControl.h"
#include <QHBoxLayout>
#include <QComboBox>
#include <QLayout>
#include <QToolButton>
using namespace Tomahawk;
DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& control, bool showPlus, QWidget* parent )
: QWidget(parent)
, m_showPlus( showPlus )
, m_plusButton( 0 )
, m_control( control )
, m_typeSelector( 0 )
, m_layout( 0 )
{
setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
m_layout = new QHBoxLayout;
m_typeSelector = new QComboBox( this );
m_plusButton= new QToolButton( this );
m_plusButton->setIcon( QIcon( RESPATH "images/list-add.png" ) );
connect( m_typeSelector, SIGNAL( currentIndexChanged( QString ) ), SLOT( typeSelectorChanged( QString ) ) );
if( !control.isNull() ) {
foreach( const QString& type, control->typeSelectors() )
m_typeSelector->addItem( type );
m_layout->addWidget( m_typeSelector, 0, Qt::AlignLeft );
m_layout->addWidget( m_control->matchSelector(), 0, Qt::AlignCenter );
m_layout->addWidget( m_control->inputField(), 0, Qt::AlignRight );
}
if( m_showPlus )
m_layout->addWidget( m_plusButton, 0, Qt::AlignRight );
setLayout( m_layout );
}
DynamicControlWidget::~DynamicControlWidget()
{
}
void
DynamicControlWidget::typeSelectorChanged( QString type )
{
Q_ASSERT( m_layout );
// remove the two widgets, change the control,and re-add the new ones
if( m_layout->count() == 3 )
{
m_layout->takeAt( 1 );
m_layout->takeAt( 2 );
} else
Q_ASSERT( m_layout->count() == 1 );
m_control->setSelectedType( type );
m_layout->addWidget( m_control->matchSelector(), 0, Qt::AlignCenter );
m_layout->addWidget( m_control->inputField(), 0, Qt::AlignRight );
}
void
DynamicControlWidget::setShowPlusButton(bool show)
{
if( m_showPlus != show ) {
if( show ) {
m_layout->addWidget( m_plusButton, 0, Qt::AlignRight );
} else {
m_layout->removeWidget( m_plusButton );
}
}
m_showPlus = show;
}
bool
DynamicControlWidget::showPlusButton() const
{
return m_showPlus;
}

View File

@ -0,0 +1,58 @@
/****************************************************************************************
* Copyright (c) 2010 Leo Franchi <lfranchi@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#ifndef DYNAMIC_CONTROL_WIDGET_H
#define DYNAMIC_CONTROL_WIDGET_H
#include <QWidget>
#include "tomahawk/typedefs.h"
class QToolButton;
class QHBoxLayout;
class QComboBox;
class QLabel;
namespace Tomahawk
{
/**
* This widget holds one horizontal control attached to a dynamic playlist. It's a container more than anything.
*/
class DynamicControlWidget : public QWidget
{
Q_OBJECT
public:
explicit DynamicControlWidget( const dyncontrol_ptr& control, bool showPlus = false, QWidget* parent = 0);
virtual ~DynamicControlWidget();
void setShowPlusButton( bool show );
bool showPlusButton() const;
private slots:
void typeSelectorChanged( QString );
private:
bool m_showPlus;
QToolButton* m_plusButton;
dyncontrol_ptr m_control;
QComboBox* m_typeSelector;
QHBoxLayout* m_layout;
};
};
#endif

View File

@ -0,0 +1,79 @@
/****************************************************************************************
* Copyright (c) 2010 Leo Franchi <lfranchi@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#include "DynamicWidget.h"
#include <QVBoxLayout>
#include <QLabel>
#include "DynamicControlList.h"
#include "playlistview.h"
#include "playlistmodel.h"
#include "trackproxymodel.h"
#include "dynamic/GeneratorInterface.h"
using namespace Tomahawk;
DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget* parent )
: QWidget(parent)
, m_header( 0 )
, m_playlist( playlist )
, m_controls( 0 )
, m_splitter( 0 )
, m_view( 0 )
, m_model()
{
setLayout( new QVBoxLayout );
m_header = new QLabel( "TODO DYN PLAYLIST HEADER", this );
layout()->addWidget( m_header );
m_splitter = new AnimatedSplitter( this );
m_splitter->setOrientation( Qt::Vertical );
m_controls = new DynamicControlList( m_splitter );
m_model = new PlaylistModel( this );
m_view = new PlaylistView( this );
m_view->setModel( m_model );
m_splitter->addWidget( m_controls );
m_splitter->addWidget( m_view );
m_splitter->setGreedyWidget( 1 );
if( !m_playlist.isNull() ) {
m_controls->setControls( m_playlist->generator()->controls() );
m_model->loadPlaylist( m_playlist );
}
}
DynamicWidget::~DynamicWidget()
{
}
void
DynamicWidget::setPlaylist(const Tomahawk::dynplaylist_ptr& playlist)
{
}
PlaylistInterface*
DynamicWidget::playlistInterface() const
{
return m_view->proxyModel();
}

View File

@ -0,0 +1,61 @@
/****************************************************************************************
* Copyright (c) 2010 Leo Franchi <lfranchi@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify it under *
* the terms of the GNU General Public License as published by the Free Software *
* Foundation; either version 2 of the License, or (at your option) any later *
* version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT ANY *
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
* PARTICULAR PURPOSE. See the GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with *
* this program. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************************/
#ifndef DYNAMIC_WIDGET_H
#define DYNAMIC_WIDGET_H
#include <QWidget>
#include <tomahawk/typedefs.h>
class PlaylistInterface;
class PlaylistModel;
class PlaylistView;
class AnimatedSplitter;
class QLabel;
namespace Tomahawk
{
class DynamicControlList;
/**
* This class contains the dynamic playlist config and the playlist view itself
*/
class DynamicWidget : public QWidget
{
Q_OBJECT
public:
explicit DynamicWidget( const dynplaylist_ptr& playlist, QWidget* parent = 0);
virtual ~DynamicWidget();
void setPlaylist( const dynplaylist_ptr& playlist );
PlaylistInterface* playlistInterface() const;
private:
QLabel* m_header;
dynplaylist_ptr m_playlist;
DynamicControlList* m_controls;
AnimatedSplitter* m_splitter;
PlaylistView* m_view;
PlaylistModel* m_model;
};
};
#endif

View File

@ -18,6 +18,7 @@
#include "albummodel.h"
#include "infowidgets/sourceinfowidget.h"
#include <widgets/DynamicWidget.h>
#define FILTER_TIMEOUT 280
@ -115,6 +116,27 @@ PlaylistManager::show( const Tomahawk::playlist_ptr& playlist )
return true;
}
bool
PlaylistManager::show(const Tomahawk::dynplaylist_ptr& playlist)
{
unlinkPlaylist();
if( !m_dynamicWidgets.contains( playlist ) ) {
m_dynamicWidgets[ playlist ] = new Tomahawk::DynamicWidget( playlist, m_stack );
}
m_stack->setCurrentWidget( m_dynamicWidgets.value( playlist ) );
m_currentInterface = m_dynamicWidgets.value( playlist )->playlistInterface();
m_superCollectionVisible = false;
m_statsAvailable = true;
m_modesAvailable = false;
linkPlaylist();
emit numSourcesChanged( APP->sourcelist().count() );\
return true;
}
bool
PlaylistManager::show( const Tomahawk::album_ptr& album )

View File

@ -8,6 +8,10 @@
#include "tomahawk/collection.h"
#include "tomahawk/playlistinterface.h"
namespace Tomahawk {
class DynamicWidget;
}
class AnimatedSplitter;
class AlbumModel;
class AlbumView;
@ -36,6 +40,7 @@ public:
bool isSuperCollectionVisible() const { return true; }
bool show( const Tomahawk::playlist_ptr& playlist );
bool show( const Tomahawk::dynplaylist_ptr& playlist );
bool show( const Tomahawk::album_ptr& album );
bool show( const Tomahawk::collection_ptr& collection );
bool show( const Tomahawk::source_ptr& source );
@ -92,6 +97,7 @@ private:
QList< Tomahawk::collection_ptr > m_superCollections;
PlaylistModel* m_playlistModel;
QHash< Tomahawk::dynplaylist_ptr, Tomahawk::DynamicWidget* > m_dynamicWidgets;
QHash< Tomahawk::collection_ptr, CollectionView* > m_collectionViews;
QHash< Tomahawk::collection_ptr, AlbumView* > m_collectionAlbumViews;
QHash< Tomahawk::source_ptr, SourceInfoWidget* > m_sourceViews;

View File

@ -47,6 +47,8 @@ QueueView::onShown( QWidget* widget )
qDebug() << Q_FUNC_INFO << widget;
if ( widget != this )
return;
AnimatedWidget::onShown( widget );
m_button->setText( tr( "Click to hide queue" ) );
disconnect( m_button, SIGNAL( clicked() ), this, SIGNAL( showWidget() ) );
@ -60,7 +62,9 @@ QueueView::onHidden( QWidget* widget )
qDebug() << Q_FUNC_INFO << widget;
if ( widget != this )
return;
AnimatedWidget::onHidden( widget );
m_button->setText( tr( "Click to show queue" ) );
disconnect( m_button, SIGNAL( clicked() ), this, SIGNAL( hideWidget() ) );
connect( m_button, SIGNAL( clicked() ), SIGNAL( showWidget() ) );

View File

@ -1,6 +1,6 @@
#include "animatedsplitter.h"
#define ANIMATION_TIME 500
#define ANIMATION_TIME 400
AnimatedSplitter::AnimatedSplitter( QWidget* parent )
@ -213,6 +213,10 @@ AnimatedWidget::AnimatedWidget( AnimatedSplitter* parent )
qDebug() << Q_FUNC_INFO;
}
AnimatedWidget::~AnimatedWidget()
{
}
void
AnimatedWidget::onShown( QWidget* )

View File

@ -48,8 +48,9 @@ class AnimatedWidget : public QWidget
{
Q_OBJECT
public:
explicit AnimatedWidget( AnimatedSplitter* parent );
explicit AnimatedWidget( AnimatedSplitter* parent = 0 );
virtual ~AnimatedWidget();
QSize hiddenSize() const { return m_hiddenSize; }
void setHiddenSize( const QSize& size ) { m_hiddenSize = size; emit hiddenSizeChanged(); }