universalamarok.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 325 行
CPP
325 行
/*************************************************************************** * Copyright (C) 2004 by Marco Gulino * * marco@Paganini * * * * 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, write to the * * Free Software Foundation, Inc., * * 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307, USA. * ***************************************************************************/#include "universalamarok.h"#include "amarokdcopiface_stub.h"#include <qlabel.h>#include <kinstance.h>#include <klocale.h>#include <qstring.h>#include <qwidget.h>#include <kglobal.h>#include <kstandarddirs.h>#include <qlayout.h>#include <qtimer.h>#include <dcopclient.h>#include <kmessagebox.h>#include <kpushbutton.h>#include <kiconloader.h>#include <qdatetime.h>#include <qfileinfo.h>#include <ktoolbar.h>#include <kapplication.h>#include <qslider.h>#include <kdebug.h>#include <kurldrag.h>#include <khtmlview.h>#define HTML_FILE KGlobal::dirs()->saveLocation( "data", "amarok/", true ) + "contextbrowser.html"amarokWidget::amarokWidget( QWidget * parent, const char * name, WFlags f ) : QVBox(parent, name, f){ setAcceptDrops(true);}void amarokWidget::dragEnterEvent(QDragEnterEvent* event){ event->accept( KURLDrag::canDecode(event) );}void amarokWidget::dropEvent(QDropEvent* event){ KURL::List urlList; if( KURLDrag::decode(event, urlList) ) { KURL::List::iterator it; KURL::List::iterator end( urlList.end() ); for (it = urlList.begin(); it != end; ++it ) emit emitURL(*it); }}bool amarokWidget::eventFilter( QObject *, QEvent *e ){ if(e->type() < QEvent::DragEnter || e->type() > QEvent::Drop ) return false; QApplication::sendEvent(this, e); return true;}UniversalAmarok::UniversalAmarok(KInstance *inst,QObject *parent,QWidget *widgetParent, QString &desktopName, const char* name): KonqSidebarPlugin(inst,parent,widgetParent,desktopName,name){ KGlobal::iconLoader()->addAppDir( "amarok" ); widget = new amarokWidget( widgetParent );// widgetParent->resize(580,300); KToolBar *topBar = new KToolBar( widget, "Topbar" ); topBar->setIconSize(16); topBar->insertButton( "today", 0, SIGNAL( clicked() ), this, SLOT( currentTrack() ) ); topBar->insertButton( "document", 0, SIGNAL( clicked() ), this, SLOT( lyrics() ) ); topBar->insertButton( "personal", 0, SIGNAL( clicked() ), this, SLOT( wiki() ) ); browser = new KHTMLPart(widget, "widget-browser");//browser=new KHTMLPart(widget); kdDebug() << "parentPart() << " << browser->parentPart() << endl; browser->setDNDEnabled( true ); browser->setEncoding( "utf8", true ); updateBrowser( HTML_FILE ); browser->view()->installEventFilter( widget ); amarokDCOP = new DCOPClient(); amarokDCOP->attach(); playerStub = new AmarokPlayerInterface_stub( amarokDCOP, "amarok", "player"); playlistStub = new AmarokPlaylistInterface_stub( amarokDCOP, "amarok", "playlist"); contextStub = new AmarokContextBrowserInterface_stub (amarokDCOP, "amarok", "contextbrowser"); KToolBar* toolBar=new KToolBar(widget, "PlayerControls"); toolBar->setIconSize(16); toolBar->insertButton( "player_start",0, SIGNAL( clicked() ), this, SLOT( sendPrev() ) ); toolBar->insertButton( "player_play", 0, SIGNAL( clicked() ), this, SLOT( sendPlay() ) ); toolBar->insertButton( "player_pause",0, SIGNAL( clicked() ), this, SLOT( sendPause() ) ); toolBar->insertButton( "player_stop", 0, SIGNAL( clicked() ), this, SLOT( sendStop() ) ); toolBar->insertButton( "player_end", 0, SIGNAL( clicked() ), this, SLOT( sendNext() ) ); toolBar->insertSeparator(); toolBar->insertButton( "arts", 0, SIGNAL( clicked() ), this, SLOT( sendMute() ) ); vol_slider = new QSlider(0,100,1,0,Qt::Horizontal, toolBar,"volume"); vol_slider->setLineStep(2); connect(vol_slider, SIGNAL( valueChanged(int) ), this, SLOT(volChanged(int ) ) ); toolBar->insertWidget(1,2, vol_slider); fileInfo = new QFileInfo(HTML_FILE); QTimer *t = new QTimer( this ); connect( t, SIGNAL(timeout()), SLOT(updateStatus() ) ); t->start( 2000, false ); kdDebug() << "Connecting widget signal" << endl; connect( widget, SIGNAL( emitURL( const KURL &)), this, SLOT( openURLRequest( const KURL &) ) ); connect( browser->browserExtension(), SIGNAL( openURLRequest( const KURL &, const KParts::URLArgs & ) ), this, SLOT( openURLRequest( const KURL & ) ) ); widget->show();}UniversalAmarok::~UniversalAmarok(){ delete fileInfo;}#include "universalamarok.moc"#if ! KDE_IS_VERSION(3,4,0)#define KDE_EXPORT __attribute__ ((visibility("default")))#endif// FIXME: is this referenced from anywhere ??!extern "C"{ KDE_EXPORT void* create_konqsidebar_universalamarok(KInstance *instance,QObject *par,QWidget *widp,QString &desktopname,const char *name) { KGlobal::locale()->insertCatalogue( "amarok" ); return new UniversalAmarok(instance,par,widp,desktopname,name); }}// FIXME: Is this referenced from anywhere ??!extern "C"{ KDE_EXPORT bool add_konqsidebar_universalamarok(QString* fn, QString* param, QMap<QString,QString> *map) { Q_UNUSED(param); map->insert ("Type", "Link"); map->insert ("URL", ""); map->insert ("Icon", "amarok"); map->insert ("Name", i18n ("Amarok")); map->insert ("Open", "true"); map->insert ("X-KDE-KonqSidebarModule","konqsidebar_universalamarok"); fn->setLatin1 ("amarok.desktop"); return true; }}/*! \fn UniversalAmarok::updateBrowser() */void UniversalAmarok::updateBrowser(const QString& file){ if (! (QFile::exists(file) ) ) { showIntroduction(); return; } QString text; QFile f_file(file); if( f_file.open(IO_ReadOnly) ) { QTextStream stream( &f_file ); stream.setEncoding( QTextStream::UnicodeUTF8 ); QString line; while ( !stream.atEnd() ) { line = stream.readLine(); // line of text excluding '\n' text += QString("\n") + line; } f_file.close(); text=text.replace("<img id='current_box-largecover-image' ", "<img id='current_box-largecover-image' width=70 height=70 "); browser->begin(); browser->write(text); browser->end(); } else browser->openURL(file);}/*! \fn UniversalAmarok::updateStatus() */void UniversalAmarok::updateStatus(){ checkForAmarok(); vol_slider->setValue( playerStub->getVolume() ); fileInfo->refresh(); if( fileInfo->lastModified() != fileDT ) { updateBrowser( HTML_FILE ); fileDT=fileInfo->lastModified(); }}/*! \fn UniversalAmarok::getCurrentPlaying() */QString UniversalAmarok::getCurrentPlaying(){ return playerStub->nowPlaying();}/*! \fn UniversalAmarok::openURLRequest( const KURL &url ) */void UniversalAmarok::openURLRequest( const KURL &url ){ if( ! url.isValid() ) return; if (url.url() == "run:amarok") { runAmarok(); return; } checkForAmarok(); playlistStub->playMedia(url);}/*! \fn UniversalAmarok::checkForAmarok() */void UniversalAmarok::checkForAmarok(){ if(!amarokDCOP->isApplicationRegistered("amarok")) noAmarokRunning();}void UniversalAmarok::noAmarokRunning() { QString m_HTMLSource=""; m_HTMLSource.append( "<html>" "<div id='introduction_box' class='box'>" "<div id='introduction_box-header' class='box-header'>" "<span id='introduction_box-header-title' class='box-header-title'>" + i18n( "Amarok is not running!" ) + "</span>" "</div>" "<div id='introduction_box-body' class='box-body'>" "<p>" + i18n( "To run Amarok, just click on the link below: " ) + "</p>" "<a href='run:amarok' class='button'>" + i18n( "Run Amarok..." ) + "</a>" "</div>" "</div>" "</html>" ); browser->begin(); browser->write( m_HTMLSource ); browser->end();}void UniversalAmarok::runAmarok() { KApplication::kdeinitExecWait("amarok");}void UniversalAmarok::volChanged(int vol){ checkForAmarok(); playerStub->setVolume(vol);}void UniversalAmarok::showIntroduction(){ QString m_HTMLSource=""; m_HTMLSource.append( "<html>" "<div id='introduction_box' class='box'>" "<div id='introduction_box-header' class='box-header'>" "<span id='introduction_box-header-title' class='box-header-title'>" + i18n( "Hello Amarok user!" ) + "</span>" "</div>" "<div id='introduction_box-body' class='box-body'>" "<p>" + i18n( "This is the Context Browser: " "it shows you contextual information about the currently playing track. " "In order to use this feature of Amarok, you need to build a Collection." ) + "</p>" "<a href='show:collectionSetup' class='button'>" + i18n( "Build Collection..." ) + "</a>" "</div>" "</div>" "</html>" );kdDebug() << m_HTMLSource << endl; browser->begin(); browser->write( m_HTMLSource ); browser->end();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?