1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-04-13 20:41:58 +02:00

* Added OverlayWidget, a helper class to display neat little info / osd-like overlays in another QWidget.

This commit is contained in:
Christian Muehlhaeuser 2011-01-23 04:39:58 +01:00
parent 78a786e878
commit 0acb83a778
10 changed files with 176 additions and 5 deletions

View File

@ -104,6 +104,7 @@ set( libSources
widgets/newplaylistwidget.cpp
widgets/welcomewidget.cpp
widgets/overlaywidget.cpp
widgets/infowidgets/sourceinfowidget.cpp
)
@ -203,6 +204,7 @@ set( libHeaders
widgets/newplaylistwidget.h
widgets/welcomewidget.h
widgets/overlaywidget.h
widgets/infowidgets/sourceinfowidget.h
)

View File

@ -2,8 +2,10 @@
#include <QDebug>
#include <QDragEnterEvent>
#include <QPainter>
#include "playlist/collectionproxymodel.h"
#include "widgets/overlaywidget.h"
using namespace Tomahawk;
@ -69,3 +71,17 @@ CollectionView::onCustomContextMenu( const QPoint& pos )
m_itemMenu.exec( mapToGlobal( pos ) );
}
void
CollectionView::paintEvent( QPaintEvent* event )
{
TrackView::paintEvent( event );
QPainter painter( viewport() );
if ( !model()->trackCount() )
{
overlay()->setText( tr( "This collection is empty." ) );
overlay()->paint( &painter );
}
}

View File

@ -20,6 +20,7 @@ private slots:
protected:
virtual void dragEnterEvent( QDragEnterEvent* event );
void paintEvent( QPaintEvent* event );
private:
void setupMenus();

View File

@ -2,8 +2,10 @@
#include <QDebug>
#include <QKeyEvent>
#include <QPainter>
#include "playlist/playlistproxymodel.h"
#include "widgets/overlaywidget.h"
using namespace Tomahawk;
@ -105,3 +107,17 @@ PlaylistView::deleteItems()
{
proxyModel()->removeIndexes( selectedIndexes() );
}
void
PlaylistView::paintEvent( QPaintEvent* event )
{
TrackView::paintEvent( event );
QPainter painter( viewport() );
if ( !model()->trackCount() )
{
overlay()->setText( tr( "This playlist is currently empty. Add some tracks to it and enjoy the music!" ) );
overlay()->paint( &painter );
}
}

View File

@ -19,6 +19,7 @@ public:
protected:
void keyPressEvent( QKeyEvent* event );
void paintEvent( QPaintEvent* event );
private slots:
void onCustomContextMenu( const QPoint& pos );

View File

@ -30,6 +30,7 @@ public:
virtual Tomahawk::result_ptr siblingItem( int itemsAway );
virtual QString filter() const { return filterRegExp().pattern(); }
virtual void setFilter( const QString& pattern );
virtual PlaylistInterface::RepeatMode repeatMode() const { return m_repeatMode; }

View File

@ -7,6 +7,7 @@
#include "audio/audioengine.h"
#include "utils/tomahawkutils.h"
#include "widgets/overlaywidget.h"
#include "trackheader.h"
#include "playlistmanager.h"
@ -23,6 +24,7 @@ TrackView::TrackView( QWidget* parent )
, m_proxyModel( 0 )
, m_delegate( 0 )
, m_header( new TrackHeader( this ) )
, m_overlay( new OverlayWidget() )
, m_resizing( false )
{
setSortingEnabled( false );
@ -54,6 +56,8 @@ TrackView::TrackView( QWidget* parent )
TrackView::~TrackView()
{
qDebug() << Q_FUNC_INFO;
delete m_overlay;
}
@ -245,11 +249,18 @@ void
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
QPainter painter( viewport() );
{
// draw indicator for inserting items
QBrush blendedBrush = viewOptions().palette.brush( QPalette::Normal, QPalette::Highlight );
@ -278,6 +289,8 @@ TrackView::onFilterChanged( const QString& )
{
if ( selectedIndexes().count() )
scrollTo( selectedIndexes().at( 0 ), QAbstractItemView::PositionAtCenter );
reset();
}

View File

@ -12,6 +12,7 @@ class PlaylistInterface;
class TrackHeader;
class TrackModel;
class TrackProxyModel;
class OverlayWidget;
class DLLEXPORT TrackView : public QTreeView
{
@ -23,10 +24,11 @@ public:
void setProxyModel( TrackProxyModel* model );
TrackModel* model() { return m_model; }
TrackProxyModel* proxyModel() { return m_proxyModel; }
PlaylistItemDelegate* delegate() { return m_delegate; }
TrackHeader* header() { return m_header; }
TrackModel* model() const { return m_model; }
TrackProxyModel* proxyModel() const { return m_proxyModel; }
PlaylistItemDelegate* delegate() const { return m_delegate; }
TrackHeader* header() const { return m_header; }
OverlayWidget* overlay() const { return m_overlay; }
void setModel( TrackModel* model );
@ -61,6 +63,7 @@ private:
TrackProxyModel* m_proxyModel;
PlaylistItemDelegate* m_delegate;
TrackHeader* m_header;
OverlayWidget* m_overlay;
bool m_resizing;
bool m_dragging;

View File

@ -0,0 +1,86 @@
#include "overlaywidget.h"
#include <QPainter>
OverlayWidget::OverlayWidget()
: QWidget()
{
resize( 380, 220 );
setAttribute( Qt::WA_TranslucentBackground, true );
}
OverlayWidget::~OverlayWidget()
{
}
void
OverlayWidget::setText( const QString& text )
{
if ( text == m_text )
return;
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 )
{
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->drawPixmap( center, m_pixmap );
}
void
OverlayWidget::paintEvent( QPaintEvent* event )
{
QPainter p( this );
QRect r = contentsRect();
p.save();
p.setBackgroundMode( Qt::TransparentMode );
p.setRenderHint( QPainter::Antialiasing );
p.setPen( palette().shadow().color() );
p.setBrush( palette().shadow() );
p.setOpacity( 0.7 );
p.drawRoundedRect( r, 32.0, 32.0 );
QTextOption to( Qt::AlignCenter );
to.setWrapMode( QTextOption::WrapAtWordBoundaryOrAnywhere );
QFont f( font() );
f.setPixelSize( 18 );
f.setBold( true );
p.setFont( f );
p.setPen( palette().light().color() );
p.drawText( r.adjusted( 16, 16, -16, -16 ), text(), to );
p.restore();
}

View File

@ -0,0 +1,32 @@
#ifndef OVERLAYWIDGET_H
#define OVERLAYWIDGET_H
#include <QWidget>
#include "dllmacro.h"
class DLLEXPORT OverlayWidget : public QWidget
{
Q_OBJECT
public:
OverlayWidget();
~OverlayWidget();
QPixmap pixmap();
QString text() const { return m_text; }
void setText( const QString& text );
void paint( QPainter* painter );
protected:
// void changeEvent( QEvent* e );
void paintEvent( QPaintEvent* event );
private:
QString m_text;
QPixmap m_pixmap;
};
#endif // WELCOMEWIDGET_H