From 491f1184b8da8fb038cdc4ce1dbce2631a41a496 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Mon, 18 Jan 2010 02:49:07 +0000 Subject: [PATCH] Icons and right click menu for SomaFM --- data/data.qrc | 3 +++ data/refresh.png | Bin 0 -> 931 bytes data/somafm.png | Bin 0 -> 560 bytes data/web.png | Bin 0 -> 953 bytes src/mainwindow.cpp | 7 +++++++ src/somafmservice.cpp | 29 ++++++++++++++++++++++++++++- src/somafmservice.h | 10 +++++++++- 7 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 data/refresh.png create mode 100644 data/somafm.png create mode 100644 data/web.png diff --git a/data/data.qrc b/data/data.qrc index d7345da99..24032bb7e 100644 --- a/data/data.qrc +++ b/data/data.qrc @@ -50,5 +50,8 @@ list-remove.png clear-list.png edit-track.png + somafm.png + refresh.png + web.png diff --git a/data/refresh.png b/data/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..86b6f82c1ddd53740bd95cd9a252d6d0341b0656 GIT binary patch literal 931 zcmV;U16=%xP)4TMNw)Y6{994!H+hHY0`A;By%&J`*F@a z_jpGPX3-x!yYsx~<$2$ij4{{`Jx5hAT(G*VCr2tHljW{5TiIM$s&CaVL*qm9nfdd- zcS8Vpr@)?(f$&OswEV{T6X)GZe+7emgRq!|AP8{d_6^Kjor$;Cwl5*WkEKfSlO#yu zPJw^T%%N|mPMw-MGx?NYHpBhUQse5v74_@-FLd$gm-u@hzYC5WVtBPS_VCn+vByLZ z2B478Xf&{Kdjn($)!{0<9uFNRj@HCPwT8?XFc5hD`-A-hJ(rFi85fOa13J~1|9KvN zto#l~3wXAND|6qYw^GK*<0sKu>;(*984HXUI1yf`l!lyk+(t)>*B9}3ebW?NAw#Jy zCz;Yd6K9)o!=7E8rRni$xW)xZf<*-G_~MMwpzY>1c7t7P+**h4i)c4W9_=KacQ^?P z&zMJu9yojuE#5+OFG8>rfHD{^99E09LK+09->t*a3~i~t-Wyk!=k|#r^F*(Q^iG1c z;3iskS}^SlX{^5_|ALTN+Y;b_aukFjNU3M_Om=qPZnywS0v3Uc&T?sEl=;-Om`wCF zgehVXLzgwoDB!r(bSGT=&ml(i5lv8^u4P;dTdKS0#K_^P%)W4K@i-2oggzka&QLB2 zhnCn+?0NbeMC91~Txr;yONX-4iK5lGlx|wfY>O_^CgE8;twq17uc8msD$B!Kj$-w?zax~(J9FoG0Riq43dd}+ zCK$>7OcZ>(+U3~eCEFiM7W8ZJR(b?EdprA1V=Mfo=cb$VFb}Q}paNm{V2qtZ5t@TB zTKx%%+^I&_<>{~~mjHZ+oc+f{0AB7s;J)RJa<4L0Wbv^S?XrY*i{b8E+vsaq7~WHF z0(d*`Tq5Uw=X@Bzi@Bb#7#%kTlo_)C;D=oA=f-vH;~!CSYaU5(-z)$C002ovPDHLk FV1l!GvY-F} literal 0 HcmV?d00001 diff --git a/data/somafm.png b/data/somafm.png new file mode 100644 index 0000000000000000000000000000000000000000..1d06677df57cdd1efb2d36235819ce19d00f97ea GIT binary patch literal 560 zcmV-00?+-4P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igG= z0v`;2X|R|e-L|j1=W8F*5+F#V1fjyf$j0IXlL;)Y zZUh!}_b)JUF#Qv7axf-L><%`V5HQA=2-Ktrph76VwjKwd@Sr9&`Xy($KfaUioO>?t zk0qBEEQWb(>`j94eEfZI{Lbi+6d>}xI zL^OJrMprIjn@UaykXkAn?Y?#1YXATr_d@_95CC_3r*RT}#&Kj@LI^^B4dZLA1n?Vv z9`45{@a;`%^@9Lu^aewBk*^=>Ym?s2WH=n&XzziSSf)t5rP-Qw`pHN164{QPg8_v7 z!7QzQO9;>WAeB_;nim|;O?5^zKVdl#+^5xVsN|?Mkx0az^kT;WVJ7L&w|D3zo>QIq z10jR-!e6J2W8M8snpFa%qt@8xrs5a)QZt`kX3iV=BZ+V4PjjHkbd(>9GJCp~P(6AE zqpI+eB{Z5lv6z!7)S6GwXy%b{Rxso~kgf0ai}Rc}NTaGP=OK+4M4ALhC5N0ED75`d y4BY~b>yJ^Z7a<~7G%7gy6N>q#Qr_Lf|E%9N#?r)EzCk@AEu!U{b6o>#4 z1W{1Yzz+x%G$0{Cnp9w02ni{Y1uYVPfr1u>B{`q0CI3_WlmbwM+?u5is{)=3PX9q z)X?ar%*;>Hies9wA`p^CZN=7sN06jA+1&esqsvuU=(9hZt_(XG$ul!!#2QirFJG_t(cLKJ`T=8Mn?*7TTU8VnT7FZw!L99r1LShU8fi0xi zNt79iQbX-5;JaUUs617sk%BKRRK_AZATd&)O-i35S=*=+)lSfD>3uyCmemPM(Mqg=>xspwLB)TY@8NE$xgh8Kqod0ocw(z;USmR}2W*0yMOx@^`v z?6*RO^EP9HS*jNY@DpeU5w_8^wpu1=#a}74v?c*sp7&*=*16l>IMq4VAy6sxcFcHx zhLN5mPEt~nAf&~~y}D^_H-C@(&SwBNfHA9)5I0`ao7`+4-Me}D+SB=?;Xbx{&8Kn7 zgZp*XZ$IRp@7JR6)L)G{?G~2?SfW3;00000NkvXXu0mjf7GetEngine()->position()) / 1000.0 + 0.5); const int length = playlist_->current_item()->Metadata().length(); + if (length <= 0) { + // Probably a stream that we don't know the length of + track_slider_->SetStopped(); + tray_icon_->SetProgress(0); + return; + } + // Time to scrobble? LastFMService* lastfm = radio_model_->GetLastFMService(); diff --git a/src/somafmservice.cpp b/src/somafmservice.cpp index 68f39cc23..6bce13a4a 100644 --- a/src/somafmservice.cpp +++ b/src/somafmservice.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include @@ -13,16 +15,27 @@ const char* SomaFMService::kServiceName = "SomaFM"; const char* SomaFMService::kLoadingChannelsText = "Getting channels"; const char* SomaFMService::kLoadingStreamText = "Loading stream"; const char* SomaFMService::kChannelListUrl = "http://somafm.com/channels.xml"; +const char* SomaFMService::kHomepage = "http://somafm.com"; SomaFMService::SomaFMService(QObject* parent) : RadioService(kServiceName, parent), root_(NULL), + context_menu_(new QMenu), network_(new QNetworkAccessManager(this)) { + context_menu_->addAction(QIcon(":media-playback-start.png"), "Add to playlist", this, SLOT(AddToPlaylist())); + context_menu_->addSeparator(); + context_menu_->addAction(QIcon(":web.png"), "Open somafm.com in browser", this, SLOT(Homepage())); + context_menu_->addAction(QIcon(":refresh.png"), "Refresh channels", this, SLOT(RefreshChannels())); +} + +SomaFMService::~SomaFMService() { + delete context_menu_; } RadioItem* SomaFMService::CreateRootItem(RadioItem* parent) { root_ = new RadioItem(this, RadioItem::Type_Service, kServiceName, parent); + root_->icon = QIcon(":somafm.png"); return root_; } @@ -40,7 +53,8 @@ void SomaFMService::LazyPopulate(RadioItem* item) { } void SomaFMService::ShowContextMenu(RadioItem* item, const QPoint& global_pos) { - + context_item_ = item; + context_menu_->popup(global_pos); } void SomaFMService::StartLoading(const QUrl& url) { @@ -98,6 +112,8 @@ void SomaFMService::RefreshChannelsFinished() { return; } + root_->ClearNotify(); + QXmlStreamReader reader(reply); while (!reader.atEnd()) { reader.readNext(); @@ -107,12 +123,15 @@ void SomaFMService::RefreshChannelsFinished() { ReadChannel(reader); } } + + root_->lazy_loaded = true; } void SomaFMService::ReadChannel(QXmlStreamReader& reader) { RadioItem* item = new RadioItem(this, Type_Stream, QString::null); item->lazy_loaded = true; item->playable = true; + item->icon = QIcon(":last.fm/icon_radio.png"); while (!reader.atEnd()) { switch (reader.readNext()) { @@ -162,3 +181,11 @@ void SomaFMService::ConsumeElement(QXmlStreamReader& reader) { QString SomaFMService::TitleForItem(const RadioItem* item) const { return "SomaFM " + item->display_text; } + +void SomaFMService::Homepage() { + QDesktopServices::openUrl(QUrl(kHomepage)); +} + +void SomaFMService::AddToPlaylist() { + emit AddItemToPlaylist(context_item_); +} diff --git a/src/somafmservice.h b/src/somafmservice.h index 2ffa425d0..7b3e264ed 100644 --- a/src/somafmservice.h +++ b/src/somafmservice.h @@ -5,12 +5,14 @@ class QNetworkAccessManager; class QXmlStreamReader; +class QMenu; class SomaFMService : public RadioService { Q_OBJECT public: SomaFMService(QObject* parent = 0); + ~SomaFMService(); enum ItemType { Type_Stream = 2000, @@ -20,6 +22,7 @@ class SomaFMService : public RadioService { static const char* kLoadingChannelsText; static const char* kLoadingStreamText; static const char* kChannelListUrl; + static const char* kHomepage; RadioItem* CreateRootItem(RadioItem* parent); void LazyPopulate(RadioItem* item); @@ -31,16 +34,21 @@ class SomaFMService : public RadioService { void StartLoading(const QUrl& url); private slots: + void RefreshChannels(); void RefreshChannelsFinished(); void LoadPlaylistFinished(); + void AddToPlaylist(); + void Homepage(); + private: - void RefreshChannels(); void ReadChannel(QXmlStreamReader& reader); void ConsumeElement(QXmlStreamReader& reader); private: RadioItem* root_; + QMenu* context_menu_; + RadioItem* context_item_; QNetworkAccessManager* network_; };