1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-04-14 13:01:53 +02:00

* Added show() / hide() methods to OverlayWidget. Results in a fade-in / -out.

* Made using OverlayWidget a lot nicer. No need to fiddle with paintEvents any longer.
This commit is contained in:
Christian Muehlhaeuser 2011-01-24 03:03:27 +01:00
parent 064a8d7803
commit 92dd489640
14 changed files with 110 additions and 84 deletions

View File

@ -110,7 +110,6 @@ DatabaseCommand_AllTracks::exec( DatabaseImpl* dbi )
qDebug() << Q_FUNC_INFO << ql.length();
if ( ql.count() )
emit tracks( ql, m_collection );
emit tracks( ql, m_collection );
emit done( m_collection );
}

View File

@ -159,7 +159,10 @@ void
CollectionFlatModel::onTracksAdded( const QList<Tomahawk::query_ptr>& tracks, const Tomahawk::collection_ptr& collection )
{
if ( !tracks.count() )
{
emit trackCountChanged( rowCount( QModelIndex() ) );
return;
}
int c = rowCount( QModelIndex() );
QPair< int, int > crows;

View File

@ -32,6 +32,15 @@ CollectionView::~CollectionView()
}
void
CollectionView::setModel( TrackModel* model )
{
TrackView::setModel( model );
connect( model, SIGNAL( trackCountChanged( unsigned int ) ), SLOT( onTrackCountChanged( unsigned int ) ) );
}
void
CollectionView::dragEnterEvent( QDragEnterEvent* event )
{
@ -74,14 +83,13 @@ CollectionView::onCustomContextMenu( const QPoint& pos )
void
CollectionView::paintEvent( QPaintEvent* event )
CollectionView::onTrackCountChanged( unsigned int tracks )
{
TrackView::paintEvent( event );
QPainter painter( viewport() );
if ( !model()->trackCount() )
if ( tracks == 0 )
{
overlay()->setText( tr( "This collection is empty." ) );
overlay()->paint( &painter );
overlay()->show();
}
else
overlay()->hide();
}

View File

@ -15,12 +15,14 @@ public:
explicit CollectionView( QWidget* parent = 0 );
~CollectionView();
virtual void setModel( TrackModel* model );
private slots:
void onCustomContextMenu( const QPoint& pos );
void onTrackCountChanged( unsigned int tracks );
protected:
virtual void dragEnterEvent( QDragEnterEvent* event );
void paintEvent( QPaintEvent* event );
private:
void setupMenus();

View File

@ -89,8 +89,8 @@ PlaylistModel::loadPlaylist( const Tomahawk::playlist_ptr& playlist )
emit endInsertRows();
}
qDebug() << rowCount( QModelIndex() );
emit loadingFinished();
emit trackCountChanged( rowCount( QModelIndex() ) );
}
@ -181,7 +181,10 @@ void
PlaylistModel::onTracksInserted( unsigned int row, const QList<Tomahawk::query_ptr>& tracks, const Tomahawk::collection_ptr& collection )
{
if ( !tracks.count() )
{
emit trackCountChanged( rowCount( QModelIndex() ) );
return;
}
int c = row;
QPair< int, int > crows;
@ -207,7 +210,6 @@ PlaylistModel::onTracksInserted( unsigned int row, const QList<Tomahawk::query_p
emit endInsertRows();
emit trackCountChanged( rowCount( QModelIndex() ) );
qDebug() << rowCount( QModelIndex() );
}

View File

@ -30,8 +30,9 @@ void
PlaylistView::setModel( TrackModel* model )
{
TrackView::setModel( model );
setColumnHidden( 5, true ); // Hide age column per default
connect( model, SIGNAL( trackCountChanged( unsigned int ) ), SLOT( onTrackCountChanged( unsigned int ) ) );
}
@ -110,14 +111,13 @@ PlaylistView::deleteItems()
void
PlaylistView::paintEvent( QPaintEvent* event )
PlaylistView::onTrackCountChanged( unsigned int tracks )
{
TrackView::paintEvent( event );
QPainter painter( viewport() );
if ( !model()->trackCount() )
if ( tracks == 0 )
{
overlay()->setText( tr( "This playlist is currently empty. Add some tracks to it and enjoy the music!" ) );
overlay()->paint( &painter );
overlay()->show();
}
else
overlay()->hide();
}

View File

@ -15,14 +15,14 @@ public:
explicit PlaylistView( QWidget* parent = 0 );
~PlaylistView();
void setModel( TrackModel* model );
virtual void setModel( TrackModel* model );
protected:
void keyPressEvent( QKeyEvent* event );
void paintEvent( QPaintEvent* event );
private slots:
void onCustomContextMenu( const QPoint& pos );
void onTrackCountChanged( unsigned int tracks );
void addItemsToPlaylist();
void deleteItems();

View File

@ -251,13 +251,6 @@ TrackView::paintEvent( QPaintEvent* event )
QTreeView::paintEvent( event );
QPainter painter( viewport() );
if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() &&
model()->trackCount() )
{
m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) );
m_overlay->paint( &painter );
}
if ( m_dragging )
{
// draw drop indicator
@ -290,7 +283,15 @@ TrackView::onFilterChanged( const QString& )
if ( selectedIndexes().count() )
scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter );
reset();
if ( !proxyModel()->filter().isEmpty() && !proxyModel()->trackCount() &&
model()->trackCount() )
{
m_overlay->setText( tr( "Sorry, your filter '%1' did not match any results." ).arg( proxyModel()->filter() ) );
m_overlay->show();
}
else
if ( model()->trackCount() )
m_overlay->hide();
}

View File

@ -30,7 +30,7 @@ public:
TrackHeader* header() const { return m_header; }
OverlayWidget* overlay() const { return m_overlay; }
void setModel( TrackModel* model );
virtual void setModel( TrackModel* model );
QModelIndex contextMenuIndex() const { return m_contextMenuIndex; }
void setContextMenuIndex( const QModelIndex& idx ) { m_contextMenuIndex = idx; }

View File

@ -5,17 +5,20 @@
#include <QPropertyAnimation>
#define CORNER_ROUNDNESS 16.0
#define FADEIN_DURATION 500
#define FADING_DURATION 500
#define FONT_SIZE 18
#define OPACITY 0.80
#define OPACITY 0.86
OverlayWidget::OverlayWidget( QAbstractItemView* parent )
: QWidget() // this is on purpose!
OverlayWidget::OverlayWidget( QWidget* parent )
: QWidget( parent ) // this is on purpose!
, m_opacity( 0.00 )
, m_parent( parent )
{
resize( 380, 220 );
setAttribute( Qt::WA_TranslucentBackground, true );
setOpacity( m_opacity );
}
@ -28,74 +31,50 @@ void
OverlayWidget::setOpacity( qreal opacity )
{
m_opacity = opacity;
m_parent->reset();
repaint();
}
void
OverlayWidget::setText( const QString& text )
{
if ( text == m_text )
return;
if ( isEnabled() )
{
QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" );
animation->setDuration( FADEIN_DURATION );
animation->setStartValue( 0.00 );
animation->setEndValue( OPACITY );
animation->start();
}
else
m_opacity = OPACITY;
m_text = text;
m_pixmap = QPixmap();
}
QPixmap
OverlayWidget::pixmap()
{
if ( m_pixmap.isNull() )
{
QPixmap p( contentsRect().size() );
p.fill( Qt::transparent );
render( &p );
m_pixmap = p;
}
return m_pixmap;
}
void
OverlayWidget::paint( QPainter* painter )
OverlayWidget::show()
{
if ( !isEnabled() )
return;
QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" );
animation->setDuration( FADING_DURATION );
animation->setStartValue( 0.00 );
animation->setEndValue( OPACITY );
animation->start();
}
pixmap(); // cache the image
QRect center( QPoint( ( painter->viewport().width() - m_pixmap.width() ) / 2,
( painter->viewport().height() - m_pixmap.height() ) / 2 ), m_pixmap.size() );
painter->save();
painter->setOpacity( m_opacity );
painter->drawPixmap( center, m_pixmap );
painter->restore();
void
OverlayWidget::hide()
{
QPropertyAnimation* animation = new QPropertyAnimation( this, "opacity" );
animation->setDuration( FADING_DURATION );
animation->setEndValue( 0.00 );
animation->start();
}
void
OverlayWidget::paintEvent( QPaintEvent* event )
{
QPoint center( ( m_parent->width() - width() ) / 2, ( m_parent->height() - height() ) / 2 );
move( center );
QPainter p( this );
QRect r = contentsRect();
p.setBackgroundMode( Qt::TransparentMode );
p.setRenderHint( QPainter::Antialiasing );
p.setOpacity( m_opacity );
QPen pen( palette().dark().color(), .5 );
p.setPen( pen );

View File

@ -12,18 +12,18 @@ Q_OBJECT
Q_PROPERTY( qreal opacity READ opacity WRITE setOpacity )
public:
OverlayWidget( QAbstractItemView* parent );
OverlayWidget( QWidget* parent );
~OverlayWidget();
QPixmap pixmap();
qreal opacity() const { return m_opacity; }
void setOpacity( qreal opacity );
QString text() const { return m_text; }
void setText( const QString& text );
void paint( QPainter* painter );
public slots:
void show();
void hide();
protected:
// void changeEvent( QEvent* e );
@ -31,10 +31,9 @@ protected:
private:
QString m_text;
QPixmap m_pixmap;
qreal m_opacity;
QAbstractItemView* m_parent;
QWidget* m_parent;
};
#endif // WELCOMEWIDGET_H
#endif // OVERLAYWIDGET_H

View File

@ -56,6 +56,14 @@ WelcomeWidget::updatePlaylists()
ui->playlistWidget->addItem( item );
item->setData( Qt::DisplayRole, playlist->title() );
}
if ( !playlists.count() )
{
ui->playlistWidget->overlay()->setText( tr( "You have not played any playlists yet." ) );
ui->playlistWidget->overlay()->show();
}
else
ui->playlistWidget->overlay()->hide();
}
@ -178,3 +186,10 @@ PlaylistDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
painter->restore();
}
PlaylistWidget::PlaylistWidget( QWidget* parent )
: QListWidget( parent )
{
m_overlay = new OverlayWidget( this );
}

View File

@ -15,6 +15,7 @@
#include "dllmacro.h"
class PlaylistModel;
class OverlayWidget;
namespace Ui
{
@ -60,6 +61,18 @@ private:
};
class DLLEXPORT PlaylistWidget : public QListWidget
{
public:
PlaylistWidget( QWidget* parent = 0 );
OverlayWidget* overlay() const { return m_overlay; }
private:
OverlayWidget* m_overlay;
};
class DLLEXPORT WelcomeWidget : public QWidget
{
Q_OBJECT

View File

@ -41,7 +41,7 @@
</widget>
</item>
<item>
<widget class="QListWidget" name="playlistWidget"/>
<widget class="PlaylistWidget" name="playlistWidget"/>
</item>
<item>
<widget class="QLabel" name="label_3">
@ -66,6 +66,11 @@
<extends>QTreeView</extends>
<header>playlist/playlistview.h</header>
</customwidget>
<customwidget>
<class>PlaylistWidget</class>
<extends>QListWidget</extends>
<header>widgets/welcomewidget.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>