1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-07 06:36:55 +02:00

finally fix most of the layout issues.

god i hate qlayout...
This commit is contained in:
Leo Franchi
2010-12-12 17:00:31 -05:00
parent c345ee6e35
commit 0df8ea0732
7 changed files with 153 additions and 74 deletions

View File

@@ -59,6 +59,7 @@
<file>./data/images/view-toggle-pressed-left.png</file> <file>./data/images/view-toggle-pressed-left.png</file>
<file>./data/images/view-toggle-pressed-right.png</file> <file>./data/images/view-toggle-pressed-right.png</file>
<file>./data/images/list-add.png</file> <file>./data/images/list-add.png</file>
<file>./data/images/list-remove.png</file>
<file>./data/images/arrow-up-double.png</file> <file>./data/images/arrow-up-double.png</file>
<file>./data/images/volume-icon-full.png</file> <file>./data/images/volume-icon-full.png</file>
<file>./data/images/volume-icon-muted.png</file> <file>./data/images/volume-icon-muted.png</file>

View File

@@ -75,7 +75,7 @@ Tomahawk::EchonestControl::updateWidgets()
match->addItem( "Similar To", Echonest::DynamicPlaylist::ArtistRadioType ); match->addItem( "Similar To", Echonest::DynamicPlaylist::ArtistRadioType );
input->setPlaceholderText( "Artist name" ); input->setPlaceholderText( "Artist name" );
input->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Ignored ); input->setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Fixed );
connect( match, SIGNAL( currentIndexChanged(int) ), this, SLOT( updateData() ) ); connect( match, SIGNAL( currentIndexChanged(int) ), this, SLOT( updateData() ) );
connect( input, SIGNAL( textChanged(QString) ), this, SLOT( updateData() ) ); connect( input, SIGNAL( textChanged(QString) ), this, SLOT( updateData() ) );
@@ -84,6 +84,9 @@ Tomahawk::EchonestControl::updateWidgets()
input->hide(); input->hide();
m_match = QWeakPointer< QWidget >( match ); m_match = QWeakPointer< QWidget >( match );
m_input = QWeakPointer< QWidget >( input ); m_input = QWeakPointer< QWidget >( input );
} else {
m_match = QWeakPointer<QWidget>( new QWidget );
m_input = QWeakPointer<QWidget>( new QWidget );
} }
} }

View File

@@ -15,12 +15,15 @@
****************************************************************************************/ ****************************************************************************************/
#include "DynamicControlList.h" #include "DynamicControlList.h"
#include <QLayout> #include <QLayout>
#include <QLabel> #include <QLabel>
#include "DynamicControlWidget.h"
#include <QPaintEvent> #include <QPaintEvent>
#include <QPainter> #include <QPainter>
#include "DynamicControlWidget.h"
#include "GeneratorInterface.h"
using namespace Tomahawk; using namespace Tomahawk;
DynamicControlList::DynamicControlList() DynamicControlList::DynamicControlList()
@@ -39,13 +42,14 @@ DynamicControlList::DynamicControlList( AnimatedSplitter* parent )
init(); init();
} }
DynamicControlList::DynamicControlList( const QList< dyncontrol_ptr >& controls, AnimatedSplitter* parent) DynamicControlList::DynamicControlList( const geninterface_ptr& generator, const QList< dyncontrol_ptr >& controls, AnimatedSplitter* parent)
: AnimatedWidget(parent) : AnimatedWidget(parent)
, m_generator( generator )
, m_layout( new QVBoxLayout ) , m_layout( new QVBoxLayout )
, m_summaryWidget( 0 ) , m_summaryWidget( 0 )
{ {
init(); init();
setControls( controls ); setControls( generator, controls );
} }
DynamicControlList::~DynamicControlList() DynamicControlList::~DynamicControlList()
@@ -76,10 +80,12 @@ DynamicControlList::init()
} }
void void
DynamicControlList::setControls(const QList< dyncontrol_ptr >& controls) DynamicControlList::setControls( const geninterface_ptr& generator, const QList< dyncontrol_ptr >& controls)
{ {
m_generator = generator;
foreach( const dyncontrol_ptr& control, controls ) { foreach( const dyncontrol_ptr& control, controls ) {
m_controls << new DynamicControlWidget( control, false, false, this ); m_controls << new DynamicControlWidget( control, false, false, false, this );
connect( m_controls.last(), SIGNAL( addNewControl() ), this, SLOT( addNewControl() ) );
} }
onShown( this ); onShown( this );
} }
@@ -113,11 +119,23 @@ DynamicControlList::onShown( QWidget* w )
foreach( DynamicControlWidget* control, m_controls ) { foreach( DynamicControlWidget* control, m_controls ) {
m_layout->addWidget( control ); m_layout->addWidget( control );
control->show(); control->show();
control->setShowMinusButton( control != m_controls.last() );
control->setShowPlusButton( control == m_controls.last() ); control->setShowPlusButton( control == m_controls.last() );
control->setShowCollapseButton( control == m_controls.last() ); control->setShowCollapseButton( control == m_controls.last() );
} }
} }
void DynamicControlList::addNewControl()
{
m_controls.last()->setShowCollapseButton( false );
m_controls.last()->setShowPlusButton( false );
m_controls.last()->setShowMinusButton( true );
m_controls.append( new DynamicControlWidget( m_generator->createControl(), true, false, true, this ) );
m_layout->addWidget( m_controls.last() );
connect( m_controls.last(), SIGNAL( addNewControl() ), this, SLOT( addNewControl() ) );
}
void DynamicControlList::paintEvent(QPaintEvent* ) void DynamicControlList::paintEvent(QPaintEvent* )
{ {
} }

View File

@@ -38,20 +38,23 @@ class DynamicControlList : public AnimatedWidget
Q_OBJECT Q_OBJECT
public: public:
DynamicControlList(); // bad compiler! DynamicControlList(); // bad compiler!
explicit DynamicControlList( AnimatedSplitter* parent ); explicit DynamicControlList(AnimatedSplitter* parent );
explicit DynamicControlList( const QList< dyncontrol_ptr >& controls, AnimatedSplitter* parent ); explicit DynamicControlList( const geninterface_ptr& generator, const QList< dyncontrol_ptr >& controls, AnimatedSplitter* parent );
virtual ~DynamicControlList(); virtual ~DynamicControlList();
void setControls( const QList< dyncontrol_ptr >& controls ); QList< dyncontrol_ptr >& controls() const;
void setControls( const geninterface_ptr& generator, const QList< dyncontrol_ptr >& controls );
virtual void paintEvent(QPaintEvent* ); virtual void paintEvent(QPaintEvent* );
public slots: public slots:
virtual void onHidden(QWidget* ); virtual void onHidden(QWidget* );
virtual void onShown(QWidget* ); virtual void onShown(QWidget* );
void addNewControl();
private: private:
void init(); void init();
geninterface_ptr m_generator;
QVBoxLayout* m_layout; QVBoxLayout* m_layout;
QList< DynamicControlWidget* > m_controls; QList< DynamicControlWidget* > m_controls;

View File

@@ -25,20 +25,24 @@
#include <QToolButton> #include <QToolButton>
#include <QPaintEvent> #include <QPaintEvent>
#include <QPainter> #include <QPainter>
#include <qstackedlayout.h>
using namespace Tomahawk; using namespace Tomahawk;
DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& control, bool showPlus, bool showCollapse, QWidget* parent ) DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& control, bool showPlus, bool showMinus, bool showCollapse, QWidget* parent )
: QWidget(parent) : QWidget(parent)
, m_showPlus( showPlus ) , m_showPlus( showPlus )
, m_showMinus( showMinus )
, m_showCollapse( showCollapse ) , m_showCollapse( showCollapse )
, m_plusButton( 0 ) , m_plusButton( 0 )
, m_minusButton( 0 )
, m_collapseButton( 0 ) , m_collapseButton( 0 )
, m_control( control ) , m_control( control )
, m_typeSelector( 0 ) , m_typeSelector( 0 )
, m_layout( 0 ) , m_layout( 0 )
{ {
setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
setMouseTracking( true );
m_layout = new QHBoxLayout; m_layout = new QHBoxLayout;
m_typeSelector = new QComboBox( this ); m_typeSelector = new QComboBox( this );
@@ -47,42 +51,56 @@ DynamicControlWidget::DynamicControlWidget( const Tomahawk::dyncontrol_ptr& cont
m_layout->setSpacing( 0 ); m_layout->setSpacing( 0 );
setContentsMargins( 0, 0, 0, 0 ); setContentsMargins( 0, 0, 0, 0 );
m_plusButton= new QToolButton( this ); m_plusButton = initButton();
m_plusButton->setIcon( QIcon( RESPATH "images/list-add.png" ) );
m_plusButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
m_plusButton->setIconSize( QSize( 16, 16 ) );
m_plusButton->setToolButtonStyle( Qt::ToolButtonIconOnly );
m_plusButton->setAutoRaise( true );
m_plusButton->setContentsMargins( 0, 0, 0, 0 );
m_plusButton->hide();
m_collapseButton= new QToolButton( this ); m_plusButton->setIcon( QIcon( RESPATH "images/list-add.png" ) );
connect( m_plusButton, SIGNAL( clicked( bool ) ), this, SIGNAL( addNewControl() ) );
m_plusL = new QStackedLayout;
m_plusL->setContentsMargins( 0, 0, 0, 0 );
m_plusL->addWidget( m_plusButton );
m_plusL->addWidget( createDummy( m_plusButton ) ); // :-(
m_plusL->setCurrentIndex( 0 );
m_minusButton = initButton();
m_minusButton->setIcon( QIcon( RESPATH "images/list-remove.png" ) );
connect( m_minusButton, SIGNAL( clicked( bool ) ), this, SIGNAL( removeControl() ) );
m_minusL = new QStackedLayout;
m_minusL->setContentsMargins( 0, 0, 0, 0 );
m_minusL->addWidget( m_minusButton );
m_minusL->addWidget( createDummy( m_plusButton ) ); // :-(
m_minusL->setCurrentIndex( 0 );
m_collapseButton = initButton();
m_collapseButton->setIcon( QIcon( RESPATH "images/arrow-up-double.png" ) ); m_collapseButton->setIcon( QIcon( RESPATH "images/arrow-up-double.png" ) );
m_collapseButton->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); m_collapseL = new QStackedLayout;
m_collapseButton->setIconSize( QSize( 16, 16 ) ); m_collapseL->setContentsMargins( 0, 0, 0, 0 );
m_collapseButton->setToolButtonStyle( Qt::ToolButtonIconOnly ); m_collapseL->addWidget( m_collapseButton );
m_collapseButton->setAutoRaise( true ); m_collapseL->addWidget( createDummy( m_collapseButton ) ); // :-(
m_collapseButton->setContentsMargins( 0, 0, 0, 0 ); m_collapseL->setCurrentIndex( 0 );
m_collapseButton->hide();
connect( m_collapseButton, SIGNAL( clicked( bool ) ), this, SIGNAL( collapse() ) );
connect( m_typeSelector, SIGNAL( currentIndexChanged( QString ) ), SLOT( typeSelectorChanged( QString ) ) ); connect( m_typeSelector, SIGNAL( currentIndexChanged( QString ) ), SLOT( typeSelectorChanged( QString ) ) );
m_layout->addWidget( m_typeSelector, 0, Qt::AlignLeft ); m_layout->addWidget( m_typeSelector, 0, Qt::AlignLeft );
if( !control.isNull() ) { if( !control.isNull() ) {
foreach( const QString& type, control->typeSelectors() ) foreach( const QString& type, control->typeSelectors() )
m_typeSelector->addItem( type ); m_typeSelector->addItem( type );
typeSelectorChanged( m_control->selectedType() );
} }
if( m_showCollapse ) { typeSelectorChanged( m_control.isNull() ? "" : m_control->selectedType() );
m_layout->insertWidget( 3, m_collapseButton, 0, Qt::AlignRight );
m_plusButton->show(); m_layout->addLayout( m_collapseL, 0 );
} m_layout->addLayout( m_minusL, 0 );
if( m_showPlus ) { m_layout->addLayout( m_plusL, 0 );
m_layout->insertWidget( m_showCollapse ? 4 : 3, m_plusButton, 0, Qt::AlignRight );
m_plusButton->show(); if( m_showCollapse )
} m_collapseL->setCurrentIndex( 0 );
if( m_showPlus )
m_plusL->setCurrentIndex( 0 );
if( m_showMinus )
m_minusL->setCurrentIndex( 0 );
setLayout( m_layout ); setLayout( m_layout );
} }
@@ -92,30 +110,45 @@ DynamicControlWidget::~DynamicControlWidget()
} }
QToolButton* DynamicControlWidget::initButton()
{
QToolButton* btn = new QToolButton( this );
btn->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
btn->setIconSize( QSize( 16, 16 ) );
btn->setToolButtonStyle( Qt::ToolButtonIconOnly );
btn->setAutoRaise( true );
btn->setContentsMargins( 0, 0, 0, 0 );
return btn;
}
QWidget* DynamicControlWidget::createDummy( QWidget* fromW )
{
QWidget* dummy = new QWidget( this );
dummy->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed );
dummy->setMinimumSize( fromW->size() );
dummy->setMaximumSize( fromW->size() );
return dummy;
}
void void
DynamicControlWidget::typeSelectorChanged( QString type ) DynamicControlWidget::typeSelectorChanged( QString type )
{ {
Q_ASSERT( m_layout ); Q_ASSERT( m_layout );
// remove the two widgets, change the control,and re-add the new ones m_layout->removeWidget( m_control->matchSelector() );
m_layout->removeWidget( m_control->inputField() );
if( m_layout->indexOf( m_control->matchSelector() ) > -1 ) m_layout->removeWidget( m_control->matchSelector() );
if( m_layout->indexOf( m_control->inputField() ) > -1 ) m_layout->removeWidget( m_control->inputField() );
m_control->setSelectedType( type ); m_control->setSelectedType( type );
if( m_control->matchSelector() ) { if( m_control->matchSelector() ) {
m_control->matchSelector()->show();
m_layout->insertWidget( 1, m_control->matchSelector(), 0 ); m_layout->insertWidget( 1, m_control->matchSelector(), 0 );
m_control->matchSelector()->show();
} }
if( m_control->inputField() ) { if( m_control->inputField() ) {
m_control->inputField()->show();
m_layout->insertWidget( 2, m_control->inputField(), 1 ); m_layout->insertWidget( 2, m_control->inputField(), 1 );
m_control->inputField()->show();
} }
qDebug() << m_layout->count();
for( int i = 0; i < m_layout->count(); i++ ){
qDebug() << i << ( m_layout->itemAt( i )->widget() ? m_layout->itemAt( i )->widget()->metaObject()->className() : "null" ) << m_layout->stretch( i ) << m_layout->itemAt( i )->sizeHint();
}
} }
void void
@@ -123,41 +156,44 @@ DynamicControlWidget::setShowPlusButton(bool show)
{ {
if( m_showPlus != show ) { if( m_showPlus != show ) {
if( show ) { show ? m_plusL->setCurrentIndex( 0 ) : m_plusL->setCurrentIndex( 1 );
m_layout->insertWidget( m_showCollapse ? 4 : 3, m_plusButton, 0, Qt::AlignRight );
m_plusButton->show();
} else {
m_layout->removeWidget( m_plusButton );
m_plusButton->hide();
}
} }
m_showPlus = show; m_showPlus = show;
} }
bool
DynamicControlWidget::showPlusButton() const
{
return m_showPlus;
}
void void
DynamicControlWidget::setShowCollapseButton(bool show) DynamicControlWidget::setShowCollapseButton(bool show)
{ {
if( m_showCollapse != show ) { if( m_showCollapse != show ) {
if( show ) { show ? m_collapseL->setCurrentIndex( 0 ) : m_collapseL->setCurrentIndex( 1 );
m_layout->insertWidget( 3, m_collapseButton, 0, Qt::AlignRight );
m_collapseButton->show();
} else {
m_layout->removeWidget( m_collapseButton );
m_collapseButton->hide();
}
} }
m_showCollapse = show; m_showCollapse = show;
} }
void DynamicControlWidget::setShowMinusButton(bool show)
{
m_showMinus = show;
}
void DynamicControlWidget::enterEvent(QEvent* ev)
{
if( m_showMinus )
m_minusL->setCurrentIndex( 0 );
QWidget::enterEvent( ev );
}
void DynamicControlWidget::leaveEvent(QEvent* ev)
{
m_minusL->setCurrentIndex( 1 );
QWidget::leaveEvent( ev );
}
void void
DynamicControlWidget::paintEvent(QPaintEvent* ) DynamicControlWidget::paintEvent(QPaintEvent* )
{ {

View File

@@ -21,6 +21,8 @@
#include "tomahawk/typedefs.h" #include "tomahawk/typedefs.h"
class QStackedLayout;
class QEvent;
class QToolButton; class QToolButton;
class QHBoxLayout; class QHBoxLayout;
class QComboBox; class QComboBox;
@@ -36,23 +38,38 @@ class DynamicControlWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit DynamicControlWidget( const dyncontrol_ptr& control, bool showPlus = false, bool showCollaps = false, QWidget* parent = 0); explicit DynamicControlWidget( const dyncontrol_ptr& control, bool showPlus = false, bool showMinus = false, bool showCollapse = false, QWidget* parent = 0);
virtual ~DynamicControlWidget(); virtual ~DynamicControlWidget();
void setShowPlusButton( bool show ); void setShowPlusButton( bool show );
bool showPlusButton() const; void setShowMinusButton( bool show );
void setShowCollapseButton( bool show ); void setShowCollapseButton( bool show );
virtual void paintEvent(QPaintEvent* ); virtual void paintEvent(QPaintEvent* );
virtual void enterEvent(QEvent* );
virtual void leaveEvent(QEvent* );
signals:
void addNewControl();
void collapse();
void removeControl();
private slots: private slots:
void typeSelectorChanged( QString ); void typeSelectorChanged( QString );
private: private:
QToolButton* initButton();
QWidget* createDummy( QWidget* fromW );
bool m_showPlus; bool m_showPlus;
bool m_showMinus;
bool m_showCollapse; bool m_showCollapse;
// i hate qlayout
QStackedLayout* m_plusL;
QToolButton* m_plusButton; QToolButton* m_plusButton;
QStackedLayout* m_minusL;
QToolButton* m_minusButton;
QStackedLayout* m_collapseL;
QToolButton* m_collapseButton; QToolButton* m_collapseButton;
dyncontrol_ptr m_control; dyncontrol_ptr m_control;

View File

@@ -49,8 +49,9 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
m_headerText = new QLabel( "Dynamic Playlist Type:", this ); m_headerText = new QLabel( "Dynamic Playlist Type:", this );
m_headerLayout->addWidget( m_headerText ); m_headerLayout->addWidget( m_headerText );
m_modeCombo = new QComboBox( this ); m_modeCombo = new QComboBox( this );
m_modeCombo->addItem( "Static", 0 ); m_modeCombo->addItem( "On Demand", 0 );
m_modeCombo->addItem( "On Demand", 1 ); m_modeCombo->addItem( "Static", 1 );
m_modeCombo->setCurrentIndex( static_cast<int>( playlist->mode() ) );
m_headerLayout->addWidget( m_modeCombo ); m_headerLayout->addWidget( m_modeCombo );
m_generatorCombo = new QComboBox( this ); m_generatorCombo = new QComboBox( this );
foreach( const QString& type, GeneratorFactory::types() ) foreach( const QString& type, GeneratorFactory::types() )
@@ -59,7 +60,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
m_headerLayout->addSpacing( 1 ); m_headerLayout->addSpacing( 1 );
m_generateButton = new QPushButton( this ); m_generateButton = new QPushButton( "Generate", this );
m_generateButton->hide(); m_generateButton->hide();
if( playlist->mode() == Static ) { if( playlist->mode() == Static ) {
m_generateButton->show(); m_generateButton->show();
@@ -85,7 +86,7 @@ DynamicWidget::DynamicWidget( const Tomahawk::dynplaylist_ptr& playlist, QWidget
m_splitter->show( 0, false ); m_splitter->show( 0, false );
if( !m_playlist.isNull() ) { if( !m_playlist.isNull() ) {
m_controls->setControls( m_playlist->generator()->controls() ); m_controls->setControls( m_playlist->generator(), m_playlist->generator()->controls() );
m_model->loadPlaylist( m_playlist ); m_model->loadPlaylist( m_playlist );
} }