[kde-doc-english] [amarok] playground/src/context/applets: Add covergrid applet to playground/
Kevin Funk
krf at electrostorm.net
Thu Aug 25 14:12:06 UTC 2011
Git commit 0da397249f895a5b036166d966ce03f2cf601243 by Kevin Funk.
Committed on 25/08/2011 at 16:03.
Pushed by kfunk into branch 'master'.
Add covergrid applet to playground/
Fixed some minor issues while applying the patch
* Whitespace fixes
* Added missing copyright headers to AlbumItem.(cpp|h)
* Adapt API changes: Fix invalid signal/slot connection
Courtesy of Emmanuel Wagner <manu.wagner at sfr.fr>
REVIEW: 100841
GUI:
A +45 -0 playground/src/context/applets/covergrid/CoverGridSettings.ui
A +44 -0 playground/src/context/applets/covergrid/AlbumItem.h [License: GPL (v2+)]
A +65 -0 playground/src/context/applets/covergrid/CoverGridApplet.h [License: GPL (v2+)]
A +20 -0 playground/src/context/applets/covergrid/amarok-context-applet-covergrid.desktop
A +25 -0 playground/src/context/applets/covergrid/CMakeLists.txt
A +181 -0 playground/src/context/applets/covergrid/CoverGridApplet.cpp [License: GPL (v2+)]
A +83 -0 playground/src/context/applets/covergrid/AlbumItem.cpp [License: GPL (v2+)]
M +1 -0 playground/src/context/applets/CMakeLists.txt
http://commits.kde.org/amarok/0da397249f895a5b036166d966ce03f2cf601243
diff --git a/playground/src/context/applets/CMakeLists.txt b/playground/src/context/applets/CMakeLists.txt
index 44760ea..5b47765 100644
--- a/playground/src/context/applets/CMakeLists.txt
+++ b/playground/src/context/applets/CMakeLists.txt
@@ -1,2 +1,3 @@
#add_subdirectory( cloud )
add_subdirectory( coverbling )
+add_subdirectory( covergrid )
diff --git a/playground/src/context/applets/covergrid/AlbumItem.cpp b/playground/src/context/applets/covergrid/AlbumItem.cpp
new file mode 100644
index 0000000..9d9ac69
--- /dev/null
+++ b/playground/src/context/applets/covergrid/AlbumItem.cpp
@@ -0,0 +1,83 @@
+/****************************************************************************************
+ * Copyright (c) 2011 Emmanuel Wagner <manu.wagner at sfr.fr> *
+ * *
+ * 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 "AlbumItem.h"
+// Amarok
+#include "playlist/PlaylistModelStack.h"
+#include "core/meta/Meta.h"
+#include "playlist/PlaylistController.h"
+// Qt
+#include <QGraphicsPixmapItem>
+#include <QStyleOptionGraphicsItem>
+#include <QPaintEvent>
+#include <QPainter>
+#include <QPalette>
+#include <QImage>
+// Other
+#include <math.h>
+
+
+AlbumItem::AlbumItem( const QPixmap & pixmap, Meta::AlbumPtr album , QWidget * parent, Qt::WindowFlags f )
+
+ : QLabel( parent, f )
+{
+ m_album = album;
+ m_pixmap = pixmap;
+ setPixmap( pixmap );
+ m_size = pixmap.height();
+ setMouseTracking( true );
+ setDisabled( false );
+ if( album )
+ {
+ Meta::ArtistPtr artist = album->albumArtist();
+ QString label = album->prettyName();
+ if( artist ) label += " - " + artist->prettyName();
+ setToolTip( label );
+ }
+}
+
+Meta::AlbumPtr AlbumItem::getAlbum()
+{
+ return m_album;
+}
+void AlbumItem::mousePressEvent( QMouseEvent * event )
+{
+ Q_UNUSED( event )
+}
+void AlbumItem::mouseDoubleClickEvent( QMouseEvent * event )
+{
+ Q_UNUSED( event )
+ The::playlistController()->insertOptioned( m_album->tracks(), Playlist::AppendAndPlay );
+}
+void AlbumItem::leaveEvent( QEvent * event )
+{
+ setPixmap( m_pixmap );
+}
+void AlbumItem::enterEvent( QEvent * event )
+{
+ Q_UNUSED( event )
+ QImage image = m_pixmap.toImage();
+ QPixmap transparent( image.size() );
+ transparent.fill( Qt::transparent );
+ QPainter p;
+ p.begin( &transparent );
+ p.setCompositionMode( QPainter::CompositionMode_Source );
+ p.drawPixmap( 0, 0, QPixmap::fromImage( image ) );
+ p.setCompositionMode( QPainter::CompositionMode_DestinationIn );
+ p.fillRect( transparent.rect(), QColor( 0, 0, 0, 150 ) );
+ p.end();
+ setPixmap( transparent );
+}
diff --git a/playground/src/context/applets/covergrid/AlbumItem.h b/playground/src/context/applets/covergrid/AlbumItem.h
new file mode 100644
index 0000000..1f4df0f
--- /dev/null
+++ b/playground/src/context/applets/covergrid/AlbumItem.h
@@ -0,0 +1,44 @@
+/****************************************************************************************
+ * Copyright (c) 2011 Emmanuel Wagner <manu.wagner at sfr.fr> *
+ * *
+ * 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 "core/meta/Meta.h"
+
+#include <QLabel>
+
+class QMouseEvent;
+class QStyleOptionGraphicsItem;
+class QPaintEvent;
+class QEvent;
+
+class AlbumItem : public QLabel
+{
+ Q_OBJECT
+
+public:
+ AlbumItem( const QPixmap & pixmap, Meta::AlbumPtr album, QWidget * parent = 0, Qt::WindowFlags f = 0 );
+ Meta::AlbumPtr getAlbum();
+
+protected :
+ void mousePressEvent( QMouseEvent * event );
+ void leaveEvent( QEvent * event);
+ void enterEvent( QEvent * event);
+ void mouseDoubleClickEvent( QMouseEvent * event );
+
+private:
+ Meta::AlbumPtr m_album;
+ int m_size;
+ QPixmap m_pixmap;
+};
diff --git a/playground/src/context/applets/covergrid/CMakeLists.txt b/playground/src/context/applets/covergrid/CMakeLists.txt
new file mode 100644
index 0000000..0f08454
--- /dev/null
+++ b/playground/src/context/applets/covergrid/CMakeLists.txt
@@ -0,0 +1,25 @@
+project(context-covergrid)
+
+set(covergrid_SRCS
+ CoverGridApplet.cpp
+ AlbumItem.cpp
+)
+
+include_directories( ../../..
+ ../..
+ ${KDE4_INCLUDE_DIR}/amarok # this way we don't need to prefix it with amarok/ (and it compiles this way too :)
+)
+
+kde4_add_ui_files( covergrid_SRCS CoverGridSettings.ui )
+kde4_add_plugin(amarok_context_applet_covergrid ${covergrid_SRCS})
+
+
+target_link_libraries(amarok_context_applet_covergrid
+ amarokcore
+ amaroklib
+ ${KDE4_PLASMA_LIBS}
+ ${KDE4_KIO_LIBS}
+)
+
+install(TARGETS amarok_context_applet_covergrid DESTINATION ${PLUGIN_INSTALL_DIR})
+install(FILES amarok-context-applet-covergrid.desktop DESTINATION ${SERVICES_INSTALL_DIR})
diff --git a/playground/src/context/applets/covergrid/CoverGridApplet.cpp b/playground/src/context/applets/covergrid/CoverGridApplet.cpp
new file mode 100644
index 0000000..2432df6
--- /dev/null
+++ b/playground/src/context/applets/covergrid/CoverGridApplet.cpp
@@ -0,0 +1,181 @@
+/****************************************************************************************
+ * Copyright (c) 2011 Emmanuel Wagner <manu.wagner at sfr.fr> *
+ * *
+ * 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/>. *
+ ****************************************************************************************/
+
+#define DEBUG_PREFIX "CoverGridApplet"
+
+#include "CoverGridApplet.h"
+#include "AlbumItem.h"
+// Amarok
+#include "core/support/Amarok.h"
+#include "EngineController.h"
+#include "core/support/Debug.h"
+#include "context/ContextView.h"
+#include "core/collections/Collection.h"
+#include "core-impl/collections/support/CollectionManager.h"
+#include "playlist/PlaylistModelStack.h"
+#include "playlist/PlaylistController.h"
+// KDE
+#include <KAction>
+#include <KColorScheme>
+#include <KConfigDialog>
+#include <KGlobalSettings>
+#include <Plasma/ScrollWidget>
+#include "covermanager/CoverCache.h"
+#include <KStandardDirs>
+// Qt
+#include <QGraphicsLinearLayout>
+#include <QGraphicsProxyWidget>
+#include <QGraphicsSimpleTextItem>
+#include <QGraphicsWidget>
+#include <QLabel>
+#include <QPixmap>
+#include <QGraphicsPixmapItem>
+#include <QGraphicsGridLayout>
+
+
+CoverGridApplet::CoverGridApplet( QObject* parent, const QVariantList& args )
+ : Context::Applet( parent, args )
+{
+ DEBUG_BLOCK
+
+ setHasConfigurationInterface( true );
+}
+
+void
+CoverGridApplet::init()
+{
+ // Call the base implementation.
+ Context::Applet::init();
+ setBackgroundHints( Plasma::Applet::NoBackground );
+
+ KConfigGroup config = Amarok::config( "CoverGrid Applet" );
+ m_coversize = config.readEntry( "CoverSize", 70 );
+
+ QGraphicsLinearLayout* lay = new QGraphicsLinearLayout( Qt::Vertical );
+ setLayout( lay );
+ m_scroll = new Plasma::ScrollWidget( this );
+ m_scroll->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+ m_scroll->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
+ m_scroll->show();
+
+ m_proxywidget = new QGraphicsProxyWidget( this ) ;
+ m_layout = new QGraphicsGridLayout( m_proxywidget );
+ m_layout->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+
+ setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+ // create a scroll Area
+ m_scroll->setWidget( m_proxywidget );
+ lay->addItem( m_scroll );
+
+ Collections::Collection *coll = CollectionManager::instance()->primaryCollection();
+ Collections::QueryMaker *qm = coll->queryMaker();
+ qm->setAutoDelete( true );
+ qm->setQueryType( Collections::QueryMaker::Album );
+ qm->orderBy( Meta::valArtist );
+
+ connect( qm, SIGNAL( newResultReady( Meta::AlbumList ) ),
+ this, SLOT( slotAlbumQueryResult( Meta::AlbumList ) ) );
+ qm->run();
+}
+
+CoverGridApplet::~CoverGridApplet()
+{
+ delete m_proxywidget;
+}
+
+void CoverGridApplet::slotAlbumQueryResult( Meta::AlbumList albums ) //SLOT
+{
+ DEBUG_BLOCK
+
+ m_album_list = albums;
+ prepareLayout();
+}
+
+void CoverGridApplet::appendAlbum( int islideindex )
+{
+ Meta::AlbumPtr album = m_album_list[islideindex];
+ if( album )
+ {
+ The::playlistController()->insertOptioned( album->tracks(), Playlist::AppendAndPlay );
+ }
+
+}
+void CoverGridApplet::createConfigurationInterface( KConfigDialog *parent )
+{
+ KConfigGroup configuration = config();
+ QWidget * const settings = new QWidget;
+ ui_Settings.setupUi( settings );
+ if( m_coversize )
+ ui_Settings.coversizeSpin->setValue( m_coversize );
+ parent->addPage( settings, i18n( "Covergrid Settings" ), "preferences-system" );
+ connect( parent, SIGNAL( accepted() ), this, SLOT( saveSettings( ) ) );
+}
+bool
+CoverGridApplet::hasHeightForWidth() const
+{
+ return false;
+}
+void CoverGridApplet::saveSettings()
+{
+ m_coversize = ui_Settings.coversizeSpin->value();
+ KConfigGroup config = Amarok::config( "CoverGrid Applet" );
+ config.writeEntry( "CoverSize", m_coversize );
+ prepareLayout();
+}
+void CoverGridApplet::prepareLayout()
+{
+ int nb_prev = m_layout->count();
+ for( int i = nb_prev - 1; i >= 0; i-- ) m_layout->removeAt( i );
+ m_layout->invalidate();
+
+ const int vertical_size = boundingRect().height();
+ const int horizontal_size = boundingRect().width();
+ int x_pos = 0;
+ int y_pos = 0;
+ int nb_albums = m_album_list.size();
+ int nbcolumns = horizontal_size / m_coversize;
+ for( int index = 0; index < nb_albums; index++ )
+ {
+ Meta::AlbumPtr album = m_album_list[index];
+ QPixmap pixmap;
+ if( album->hasImage() )
+ {
+ pixmap = The::coverCache()->getCover( album, m_coversize );
+ }
+ else
+ {
+ pixmap = QPixmap( KStandardDirs::locate( "data", "amarok/images/nocover.png" ) );
+ QImage image = pixmap.toImage();
+ image = image.scaled( QSize( m_coversize, m_coversize ), Qt::KeepAspectRatio, Qt::SmoothTransformation );
+ pixmap = QPixmap::fromImage( image );
+ }
+
+ QGraphicsProxyWidget* proxywidget = new QGraphicsProxyWidget( this ) ;
+
+ AlbumItem *pixmap_widget = new AlbumItem( pixmap, album );
+ proxywidget->setWidget( pixmap_widget );
+ m_layout->addItem( proxywidget, y_pos, x_pos, 0 );
+ x_pos ++;
+
+ if( x_pos > nbcolumns )
+ {
+ x_pos = 0; y_pos++;
+ }
+ }
+ m_layout->activate();
+}
+
+#include "CoverGridApplet.moc"
diff --git a/playground/src/context/applets/covergrid/CoverGridApplet.h b/playground/src/context/applets/covergrid/CoverGridApplet.h
new file mode 100644
index 0000000..3e41ca7
--- /dev/null
+++ b/playground/src/context/applets/covergrid/CoverGridApplet.h
@@ -0,0 +1,65 @@
+/****************************************************************************************
+ * Copyright (c) 2011 Emmanuel Wagner <manu.wagner at sfr.fr> *
+ * *
+ * 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 COVERGRID_APPLET_H
+#define COVERGRID_APPLET_H
+
+#include "context/Applet.h"
+#include "ui_CoverGridSettings.h"
+#include "core/meta/Meta.h"
+
+class KConfigDialog;
+class QGraphicsProxyWidget;
+class QGraphicsGridLayout;
+
+namespace Plasma
+{
+ class ScrollWidget;
+}
+
+class CoverGridApplet : public Context::Applet
+{
+ Q_OBJECT
+
+ public:
+ CoverGridApplet( QObject* parent, const QVariantList& args );
+ ~CoverGridApplet();
+
+ void init();
+ bool hasHeightForWidth() const;
+
+ public slots:
+ void slotAlbumQueryResult( Meta::AlbumList albums);
+ void appendAlbum( int islideindex );
+ void saveSettings();
+
+ protected :
+ void createConfigurationInterface(KConfigDialog *parent);
+
+ private:
+ void prepareLayout();
+
+ QGraphicsProxyWidget * m_proxywidget;
+ Plasma::ScrollWidget *m_scroll;
+ QGraphicsGridLayout * m_layout;
+ Meta::AlbumList m_album_list;
+ Ui::CoverGridSettings ui_Settings;
+ int m_coversize;
+};
+
+AMAROK_EXPORT_APPLET( covergrid, CoverGridApplet )
+
+#endif /* COVERGRID_APPLET_H */
diff --git a/playground/src/context/applets/covergrid/CoverGridSettings.ui b/playground/src/context/applets/covergrid/CoverGridSettings.ui
new file mode 100644
index 0000000..3d79172
--- /dev/null
+++ b/playground/src/context/applets/covergrid/CoverGridSettings.ui
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CoverGridSettings</class>
+ <widget class="QWidget" name="coverGridSettings">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>265</width>
+ <height>66</height>
+ </rect>
+ </property>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>20</y>
+ <width>101</width>
+ <height>16</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Cover size (pixels)</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" name="coversizeSpin">
+ <property name="geometry">
+ <rect>
+ <x>120</x>
+ <y>20</y>
+ <width>51</width>
+ <height>21</height>
+ </rect>
+ </property>
+ <property name="minimum">
+ <number>10</number>
+ </property>
+ <property name="maximum">
+ <number>500</number>
+ </property>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/playground/src/context/applets/covergrid/amarok-context-applet-covergrid.desktop b/playground/src/context/applets/covergrid/amarok-context-applet-covergrid.desktop
new file mode 100644
index 0000000..f878c01
--- /dev/null
+++ b/playground/src/context/applets/covergrid/amarok-context-applet-covergrid.desktop
@@ -0,0 +1,20 @@
+
+[Desktop Entry]
+Encoding=UTF-8
+Name=CoverGrid
+Type=Service
+ServiceTypes=Plasma/Applet
+
+X-KDE-Library=amarok_context_applet_covergrid
+X-KDE-PluginInfo-Author=manuw2009
+X-KDE-PluginInfo-Email=manu.wagner at sfr.fr
+X-KDE-PluginInfo-Name=covergrid
+X-KDE-PluginInfo-Version=0.10
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+X-KDE-ParentApp=amarok
+X-KDE-PluginInfo-Category=Current
+Name[fr_FR]=amarok-context-applet-covergrid.desktop
More information about the kde-doc-english
mailing list