UpcomingEventsWidget::UpcomingEventsWidget( const LastFmEventPtr &event, QGraphicsItem *parent, Qt::WindowFlags wFlags ) : QGraphicsWidget( parent, wFlags ) , m_mapButton( 0 ) , m_urlButton( 0 ) , m_image( new QLabel ) , m_event( event ) { setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Maximum ); m_image->setText( i18n("Loading picture...") ); m_image->setAttribute( Qt::WA_NoSystemBackground ); m_image->setAlignment( Qt::AlignCenter ); m_image->setFixedSize( 128, 128 ); QGraphicsProxyWidget *imageProxy = new QGraphicsProxyWidget( this ); imageProxy->setWidget( m_image ); m_attendance = createLabel(); m_date = createLabel(); m_location = createLabel(); m_name = createLabel(); m_participants = createLabel(); m_tags = createLabel(); m_venue = createLabel(); QGraphicsLinearLayout *buttonsLayout = new QGraphicsLinearLayout( Qt::Horizontal ); buttonsLayout->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed ); if( event && event->venue() && event->venue()->location ) { QPointF geo( event->venue()->location->longitude, event->venue()->location->latitude ); if( !geo.isNull() ) { m_mapButton = new Plasma::PushButton( this ); m_mapButton->setMaximumSize( QSizeF( 22, 22 ) ); m_mapButton->setIcon( KIcon("edit-find") ); // TODO: a map icon would be nice m_mapButton->setToolTip( i18n( "View map" ) ); buttonsLayout->addItem( m_mapButton ); } } if( event && event->url().isValid() ) { m_urlButton = new Plasma::PushButton( this ); m_urlButton->setMaximumSize( QSizeF( 22, 22 ) ); m_urlButton->setIcon( KIcon("applications-internet") ); m_urlButton->setToolTip( i18n( "Open Last.fm webpage for this event" ) ); connect( m_urlButton, SIGNAL(clicked()), this, SLOT(openUrl()) ); buttonsLayout->addItem( m_urlButton ); } QSizePolicy::Policy minPol = QSizePolicy::Minimum; QGraphicsWidget *supportLabel, *venueLabel, *locationLabel, *dateLabel, *attendLabel, *tagsLabel; supportLabel = createLabel( i18nc("@label:textbox Supporing acts for an event", "Supporting:"), minPol ); venueLabel = createLabel( i18nc("@label:textbox", "Venue:"), minPol ); locationLabel = createLabel( i18nc("@label:textbox", "Location:"), minPol ); dateLabel = createLabel( i18nc("@label:textbox", "Date:"), minPol ); attendLabel = createLabel( i18nc("@label:textbox", "Attending:"), minPol ); tagsLabel = createLabel( i18nc("@label:textbox", "Tags:"), minPol ); QGraphicsGridLayout *infoLayout = new QGraphicsGridLayout; infoLayout->addItem( supportLabel, 0, 0 ); infoLayout->addItem( venueLabel, 1, 0 ); infoLayout->addItem( locationLabel, 2, 0 ); infoLayout->addItem( dateLabel, 3, 0 ); infoLayout->addItem( attendLabel, 4, 0 ); infoLayout->addItem( tagsLabel, 5, 0 ); infoLayout->addItem( m_participants, 0, 1 ); infoLayout->addItem( m_venue, 1, 1 ); infoLayout->addItem( m_location, 2, 1 ); infoLayout->addItem( m_date, 3, 1 ); infoLayout->addItem( m_attendance, 4, 1 ); infoLayout->addItem( m_tags, 5, 1 ); QGraphicsGridLayout *layout = new QGraphicsGridLayout; layout->addItem( imageProxy, 0, 0, 2, 1, Qt::AlignCenter ); layout->addItem( m_name, 0, 1 ); layout->addItem( buttonsLayout, 0, 2, Qt::AlignRight ); layout->addItem( infoLayout, 1, 1, 1, 2 ); setLayout( layout ); QString name = event->name(); if( event->isCancelled() ) name = i18nc( "@label:textbox Title for a canceled upcoming event", "<s>%1</s> (Canceled)", name ); setName( name ); setDate( event->date() ); setLocation( event->venue()->location ); setVenue( event->venue() ); setAttendance( event->attendance() ); setParticipants( event->participants() ); setTags( event->tags() ); setImage( event->imageUrl(LastFmEvent::Large) ); }
ArtistWidget::ArtistWidget( const SimilarArtistPtr &artist, QGraphicsWidget *parent, Qt::WindowFlags wFlags ) : QGraphicsWidget( parent, wFlags ) , m_artist( artist ) { setAttribute( Qt::WA_NoSystemBackground, true ); m_image = new QLabel; m_image->setAttribute( Qt::WA_NoSystemBackground, true ); m_image->setFixedSize( 128, 128 ); m_image->setCursor( Qt::PointingHandCursor ); QGraphicsProxyWidget *imageProxy = new QGraphicsProxyWidget( this ); imageProxy->setWidget( m_image ); m_image->installEventFilter( this ); m_nameLabel = new QLabel; m_match = new QLabel; m_tagsLabel = new QLabel; m_topTrackLabel = new QLabel; m_bio = new QGraphicsWidget( this ); QGraphicsProxyWidget *nameProxy = new QGraphicsProxyWidget( this ); QGraphicsProxyWidget *matchProxy = new QGraphicsProxyWidget( this ); QGraphicsProxyWidget *topTrackProxy = new QGraphicsProxyWidget( this ); QGraphicsProxyWidget *tagsProxy = new QGraphicsProxyWidget( this ); nameProxy->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); matchProxy->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ); topTrackProxy->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); tagsProxy->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); imageProxy->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); nameProxy->setWidget( m_nameLabel ); matchProxy->setWidget( m_match ); topTrackProxy->setWidget( m_topTrackLabel ); tagsProxy->setWidget( m_tagsLabel ); m_nameLabel->setAttribute( Qt::WA_NoSystemBackground ); m_match->setAttribute( Qt::WA_NoSystemBackground ); m_topTrackLabel->setAttribute( Qt::WA_NoSystemBackground ); m_tagsLabel->setAttribute( Qt::WA_NoSystemBackground ); m_image->setAlignment( Qt::AlignCenter ); m_match->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); m_nameLabel->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); m_topTrackLabel->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); m_tagsLabel->setAlignment( Qt::AlignLeft | Qt::AlignVCenter ); m_nameLabel->setWordWrap( false ); m_match->setWordWrap( false ); m_topTrackLabel->setWordWrap( false ); m_tagsLabel->setWordWrap( false ); m_match->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); m_topTrackLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); m_match->setMinimumWidth( 10 ); m_topTrackLabel->setMinimumWidth( 10 ); m_nameLabel->setMinimumWidth( 10 ); m_tagsLabel->setMinimumWidth( 10 ); QFontMetricsF fm( font() ); m_bio->setMinimumHeight( fm.lineSpacing() * 5 ); m_bio->setMaximumHeight( fm.lineSpacing() * 5 ); m_bio->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ); m_bioLayout.setCacheEnabled( true ); QFont artistFont; artistFont.setPointSize( artistFont.pointSize() + 2 ); artistFont.setBold( true ); m_nameLabel->setFont( artistFont ); m_topTrackLabel->setFont( KGlobalSettings::smallestReadableFont() ); m_tagsLabel->setFont( KGlobalSettings::smallestReadableFont() ); m_match->setFont( KGlobalSettings::smallestReadableFont() ); m_navigateButton = new Plasma::PushButton( this ); m_navigateButton->setMaximumSize( QSizeF( 22, 22 ) ); m_navigateButton->setIcon( KIcon( "edit-find" ) ); m_navigateButton->setToolTip( i18n( "Show in Media Sources" ) ); connect( m_navigateButton, SIGNAL(clicked()), this, SLOT(navigateToArtist()) ); m_lastfmStationButton = new Plasma::PushButton( this ); m_lastfmStationButton->setMaximumSize( QSizeF( 22, 22 ) ); m_lastfmStationButton->setIcon( KIcon("view-services-lastfm-amarok") ); m_lastfmStationButton->setToolTip( i18n( "Add Last.fm artist station to the Playlist" ) ); connect( m_lastfmStationButton, SIGNAL(clicked()), this, SLOT(addLastfmArtistStation()) ); m_topTrackButton = new Plasma::PushButton( this ); m_topTrackButton->setMaximumSize( QSizeF( 22, 22 ) ); m_topTrackButton->setIcon( KIcon( "media-track-add-amarok" ) ); m_topTrackButton->setToolTip( i18n( "Add top track to the Playlist" ) ); m_topTrackButton->hide(); connect( m_topTrackButton, SIGNAL(clicked()), this, SLOT(addTopTrackToPlaylist()) ); m_similarArtistButton = new Plasma::PushButton( this ); m_similarArtistButton->setMaximumSize( QSizeF( 22, 22 ) ); m_similarArtistButton->setIcon( KIcon( "similarartists-amarok" ) ); m_similarArtistButton->setToolTip( i18n( "Show Similar Artists of %1", m_artist->name() ) ); connect( m_similarArtistButton, SIGNAL(clicked()), this, SIGNAL(showSimilarArtists()) ); QGraphicsLinearLayout *buttonsLayout = new QGraphicsLinearLayout( Qt::Horizontal ); buttonsLayout->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Preferred ); buttonsLayout->addItem( m_topTrackButton ); buttonsLayout->addItem( m_navigateButton ); buttonsLayout->addItem( m_lastfmStationButton ); QString artistUrl = m_artist->url().url(); if( !artistUrl.isEmpty() ) { m_urlButton = new Plasma::PushButton( this ); m_urlButton->setMaximumSize( QSizeF( 22, 22 ) ); m_urlButton->setIcon( KIcon("applications-internet") ); m_urlButton->setToolTip( i18n( "Open Last.fm webpage for this artist" ) ); connect( m_urlButton, SIGNAL(clicked()), this, SLOT(openArtistUrl()) ); buttonsLayout->addItem( m_urlButton ); } buttonsLayout->addItem( m_similarArtistButton ); // the image display is extended on two row m_layout = new QGraphicsGridLayout( this ); m_layout->addItem( imageProxy, 0, 0, 4, 1 ); m_layout->addItem( nameProxy, 0, 1 ); m_layout->addItem( buttonsLayout, 0, 2, Qt::AlignRight ); m_layout->addItem( topTrackProxy, 1, 1 ); m_layout->addItem( matchProxy, 1, 2, Qt::AlignRight ); m_layout->addItem( tagsProxy, 2, 1, 1, 2 ); m_layout->addItem( m_bio, 3, 1, 1, 2 ); m_match->setText( i18n( "Match: %1%", QString::number( m_artist->match() ) ) ); m_nameLabel->setText( m_artist->name() ); QTimer::singleShot( 0, this, SLOT(updateInfo()) ); }
void CurrentTrack::init() { DEBUG_BLOCK PERF_LOG( "Begin init" ); // Call the base implementation. Context::Applet::init(); setToolTip( i18n( "Right-click to configure" ) ); m_ratingWidget = new RatingWidget( this ); m_ratingWidget->setSpacing( 2 ); m_ratingWidget->setMinimumSize( m_albumWidth + 10, 30 ); m_ratingWidget->setMaximumSize( m_albumWidth + 10, 30 ); connect( m_ratingWidget, SIGNAL(ratingChanged(int)), SLOT(trackRatingChanged(int)) ); QLabel *collectionLabel = new QLabel( i18n( "Local Collection" ) ); collectionLabel->setAttribute( Qt::WA_NoSystemBackground ); collectionLabel->setAlignment( Qt::AlignCenter ); m_collectionLabel = new QGraphicsProxyWidget( this ); m_collectionLabel->setWidget( collectionLabel ); m_title = new TextScrollingWidget( this ); m_artist = new TextScrollingWidget( this ); m_album = new TextScrollingWidget( this ); m_byText = new QGraphicsSimpleTextItem( i18nc( "What artist is this track by", "By" ), this ); m_onText = new QGraphicsSimpleTextItem( i18nc( "What album is this track on", "On" ), this ); m_recentWidget = new RecentlyPlayedListWidget( this ); m_recentHeader = new TextScrollingWidget( this ); m_recentHeader->setDrawBackground( true ); m_recentHeader->setAlignment( Qt::AlignLeft ); QFont recentHeaderFont; recentHeaderFont.setPointSize( recentHeaderFont.pointSize() + 2 ); m_recentHeader->setFont( recentHeaderFont ); m_title->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_artist->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_album->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_collectionLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_recentHeader->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ); m_recentWidget->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); m_recentWidget->setMinimumHeight( 10 ); m_albumCover = new DropPixmapLayoutItem( this ); m_albumCover->setPreferredSize( QSizeF( m_albumWidth, m_albumWidth ) ); connect( m_albumCover, SIGNAL(imageDropped(QPixmap)), SLOT(coverDropped(QPixmap)) ); const QBrush brush = normalBrush(); m_title->setBrush( brush ); m_artist->setBrush( brush ); m_album->setBrush( brush ); m_byText->setBrush( brush ); m_onText->setBrush( brush ); const QFont tinyFont = KGlobalSettings::smallestReadableFont(); m_byText->setFont( tinyFont ); m_onText->setFont( tinyFont ); m_actionsLayout = new QGraphicsLinearLayout; m_actionsLayout->setMinimumWidth( 10 ); m_actionsLayout->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); QGraphicsLinearLayout *titlesLayout = new QGraphicsLinearLayout( Qt::Vertical ); titlesLayout->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); titlesLayout->setMinimumWidth( 10 ); titlesLayout->setSpacing( 2 ); titlesLayout->addItem( m_title ); titlesLayout->addItem( m_artist ); titlesLayout->addItem( m_album ); titlesLayout->addItem( m_actionsLayout ); titlesLayout->setItemSpacing( 2, 4 ); // a bit more spacing for the actions row const qreal pad = standardPadding(); QGraphicsAnchorLayout *l = new QGraphicsAnchorLayout( this ); l->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); l->addCornerAnchors( m_ratingWidget, Qt::BottomLeftCorner, l, Qt::BottomLeftCorner ); l->addCornerAnchors( m_ratingWidget, Qt::BottomLeftCorner, m_collectionLabel, Qt::BottomLeftCorner ); l->addCornerAnchors( m_ratingWidget, Qt::TopRightCorner, m_collectionLabel, Qt::TopRightCorner ); l->addCornerAnchors( m_recentHeader, Qt::TopRightCorner, l, Qt::TopRightCorner ); l->addAnchor( m_albumCover, Qt::AnchorBottom, m_ratingWidget, Qt::AnchorTop )->setSpacing( 4 ); l->addAnchor( m_albumCover, Qt::AnchorHorizontalCenter, m_ratingWidget, Qt::AnchorHorizontalCenter ); l->addAnchor( titlesLayout, Qt::AnchorTop, l, Qt::AnchorTop )->setSpacing( 18 ); l->addAnchor( titlesLayout, Qt::AnchorRight, l, Qt::AnchorRight )->setSpacing( pad ); l->addAnchors( m_recentWidget, m_recentHeader, Qt::Horizontal ); l->addAnchor( m_recentWidget, Qt::AnchorTop, m_recentHeader, Qt::AnchorBottom ); l->addAnchor( m_recentWidget, Qt::AnchorRight, m_recentHeader, Qt::AnchorRight ); l->addAnchor( m_recentWidget, Qt::AnchorLeft, m_ratingWidget, Qt::AnchorRight )->setSpacing( pad * 2 ); l->addAnchor( m_recentWidget, Qt::AnchorBottom, m_albumCover, Qt::AnchorBottom )->setSpacing( 20 ); qreal midSpacing = qMax( m_byText->boundingRect().width(), m_onText->boundingRect().width() ) + pad; l->addAnchor( titlesLayout, Qt::AnchorLeft, m_ratingWidget, Qt::AnchorRight )->setSpacing( midSpacing ); l->anchor( m_recentHeader, Qt::AnchorTop, l, Qt::AnchorTop )->setSpacing( 2 ); // Read config KConfigGroup config = Amarok::config("Current Track Applet"); const QString fontDesc = config.readEntry( "Font", QString() ); QFont font; if( !fontDesc.isEmpty() ) font.fromString( fontDesc ); else font.setPointSize( font.pointSize() + 3 ); m_showEditTrackDetailsAction = config.readEntry( "ShowEditTrackAction", true ); m_title->setFont( font ); m_artist->setFont( font ); m_album->setFont( font ); m_title->setAlignment( Qt::AlignLeft ); m_artist->setAlignment( Qt::AlignLeft ); m_album->setAlignment( Qt::AlignLeft ); dataEngine( "amarok-current" )->setProperty( "coverWidth", m_albumWidth ); dataEngine( "amarok-current" )->connectSource( "current", this ); connect( The::paletteHandler(), SIGNAL(newPalette(QPalette)), SLOT(paletteChanged(QPalette)) ); connect( CollectionManager::instance(), SIGNAL(collectionDataChanged(Collections::Collection*)), this, SLOT(queryCollection()), Qt::QueuedConnection ); queryCollection(); setView( Stopped ); PERF_LOG( "Finished init" ); }