diff --git a/CMakeLists.txt b/CMakeLists.txt index 2c77428..d46c973 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,176 +1,174 @@ project(kscd) cmake_minimum_required(VERSION 2.8.12) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH "${ECM_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake") add_definitions(-fexceptions) include(FeatureSummary) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(ECMInstallIcons) # Handle build type if(CMAKE_BUILD_TYPE MATCHES [Dd]ebug) message(STATUS "Debug build") add_definitions(-DKSCD_DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0") else() message(STATUS "Release build") add_definitions(-DNDEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") endif() find_package(Qt5 REQUIRED COMPONENTS Widgets Svg) find_package(KF5 REQUIRED Config ConfigWidgets CoreAddons DBusAddons GlobalAccel I18n IconThemes KIO - Service Solid WidgetsAddons XmlGui ) find_package(Phonon4Qt5 REQUIRED) find_package(MusicBrainz5 REQUIRED) find_package(DiscId REQUIRED) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/gui ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${PHONON_INCLUDE_DIR} ${MUSICBRAINZ5_INCLUDE_DIR} ${DISCID_INCLUDE_DIR} ) if(BUILD_TESTING) find_package(Qt5Test REQUIRED) add_subdirectory(tests) endif() ########### next target ############### set(kscd_SRCS ########## # Main ########## kscd.cpp ############### # Solid/Phonon ############### hwcontroler.cpp audiocd.cpp ######################### # Music Brainz ######################### mbmanager.cpp #################### # Graphics / SVG #################### gui/kscdwindow.cpp gui/kscdwidget.cpp gui/ejectbutton.cpp gui/stopbutton.cpp gui/playbutton.cpp gui/nextbutton.cpp gui/previousbutton.cpp gui/mutebutton.cpp gui/randombutton.cpp gui/loopbutton.cpp gui/tracklistbutton.cpp gui/volumebutton.cpp gui/panel.cpp gui/titlePopUp.cpp gui/tracklistdlg.cpp gui/background.cpp gui/closebutton.cpp gui/minimizebutton.cpp #gui/seekslider.cpp gui/seekcursor.cpp gui/seekbar.cpp #################### # DBus Connection #################### dbus/PlayerDBusHandler.cpp dbus/RootDBusHandler.cpp dbus/TracklistDBusHandler.cpp ) ################################## # DBUS LINKING # ################################## qt5_add_dbus_adaptor(kscd_SRCS org.kde.kscd.cdplayer.xml kscd.h KSCD) qt5_add_dbus_adaptor( kscd_SRCS dbus/org.freedesktop.MediaPlayer.root.xml dbus/RootDBusHandler.h KsCD::RootDBusHandler RootAdaptor RootAdaptor) qt5_add_dbus_adaptor( kscd_SRCS dbus/org.freedesktop.MediaPlayer.player.xml dbus/PlayerDBusHandler.h KsCD::PlayerDBusHandler PlayerAdaptor PlayerAdaptor) qt5_add_dbus_adaptor( kscd_SRCS dbus/org.freedesktop.MediaPlayer.tracklist.xml dbus/TracklistDBusHandler.h KsCD::TracklistDBusHandler TracklistAdaptor TracklistAdaptor) ################################## # Graphics Setting # ################################## file(GLOB resource_svg "gui/skin/*.svg") ki18n_wrap_ui(kscd_SRCS gui/trackListDlgUI.ui generalSettings.ui interfaceSettings.ui) ################################## # KsCD Executable # ################################## kconfig_add_kcfg_files(kscd_SRCS prefs.kcfgc) add_executable(kscd ${kscd_SRCS}) ################################## # Libraries Linking # ################################## target_link_libraries(kscd Qt5::Svg Qt5::Widgets KF5::ConfigGui KF5::ConfigWidgets KF5::CoreAddons KF5::DBusAddons KF5::GlobalAccel KF5::I18n KF5::IconThemes - KF5::Service KF5::Solid KF5::WidgetsAddons KF5::XmlGui ${PHONON_LIBRARIES} ${MUSICBRAINZ5_LIBRARIES} ${DISCID_LIBRARIES} ) ########### install files ############### install(TARGETS kscd ${INSTALL_TARGETS_DEFAULT_ARGS}) install(FILES ${resource_svg} DESTINATION ${DATA_INSTALL_DIR}/kscd/skin) install(PROGRAMS org.kde.kscd.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) install(FILES kscd.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install(FILES kscd-play-audiocd.desktop DESTINATION ${DATA_INSTALL_DIR}/solid/actions) install(FILES org.kde.kscd.cdplayer.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR}) add_subdirectory(pics) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/dbus/PlayerDBusHandler.cpp b/dbus/PlayerDBusHandler.cpp index 980b162..d1289c8 100644 --- a/dbus/PlayerDBusHandler.cpp +++ b/dbus/PlayerDBusHandler.cpp @@ -1,166 +1,167 @@ /****************************************************************************** * Copyright (C) 2008 Amine Bouchikhi * * * * 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 . * ******************************************************************************/ #include "PlayerDBusHandler.h" #include "../kscd.h" #include #include #include #include #include "PlayerAdaptor.h" // Marshall the DBusStatus data into a D-BUS argument QDBusArgument &operator<<(QDBusArgument &argument, const DBusStatus &status) { argument.beginStructure(); argument << status.Play; argument << status.Random; argument << status.Repeat; argument << status.RepeatPlaylist; argument.endStructure(); return argument; } // Retrieve the DBusStatus data from the D-BUS argument const QDBusArgument &operator>>(const QDBusArgument &argument, DBusStatus &status) { argument.beginStructure(); argument >> status.Play; argument >> status.Random; argument >> status.Repeat; argument >> status.RepeatPlaylist; argument.endStructure(); return argument; } namespace KsCD { PlayerDBusHandler *PlayerDBusHandler::s_instance = 0; PlayerDBusHandler::PlayerDBusHandler(KSCD* kscd) : QObject() { player = kscd; qDebug() << "**** Launching Player Handler ****"; new PlayerAdaptor( this ); QDBusConnection::sessionBus().registerObject( QLatin1String( "/Player" ), this); s_instance = this; setObjectName( QLatin1String("PlayerDBusHandler" )); //QDBusConnection::sessionBus().registerObject( QLatin1String( "/Player" ), this); connect( this, SIGNAL(StatusChange(DBusStatus)), this, SLOT(slotCapsChange()) ); } DBusStatus PlayerDBusHandler::GetStatus() { qDebug() << "**** Dbus -> GetStatus() ****"; struct DBusStatus s; memset(&s, 0, sizeof(struct DBusStatus)); return s; } void PlayerDBusHandler::Pause() { qDebug() << "**** Dbus -> Pause() ****"; player->getDevices()->pause() ; } void PlayerDBusHandler::Play() { qDebug() << "**** Dbus -> Play() ****"; player->getDevices()->play(); } void PlayerDBusHandler::Next() { qDebug() << "**** Dbus -> Next() ****"; player->getDevices()->nextTrack(); } void PlayerDBusHandler::Prev() { qDebug() << "**** Dbus -> Prev() ****"; player->getDevices()->prevTrack(); } void PlayerDBusHandler::Repeat( bool on ) { + Q_UNUSED(on) qDebug() << "**** Dbus -> Repeat() ****"; } //position is specified in milliseconds int PlayerDBusHandler::PositionGet() { qDebug() << "**** Dbus -> PositionGet() ****"; return player->getDevices()->getTotalTime() - player->getDevices()->getRemainingTime(); } void PlayerDBusHandler::PositionSet( int time ) { qDebug() << "**** Dbus -> Position set() = "< Stop() ****"; player->getDevices()->stop(); } int PlayerDBusHandler::VolumeGet() { qDebug() << "**** Dbus -> VolumeGet() ****"; return player->getDevices()->getVolume(); } void PlayerDBusHandler::VolumeSet( int vol ) { qDebug() << "**** Dbus -> VolumeSet() ****"; player->getDevices()->setVolume(vol); } int PlayerDBusHandler::GetCaps() { qDebug() << "**** Dbus -> GetCaps() ****"; return 0; } void PlayerDBusHandler::slotCapsChange() { qDebug() << "**** Dbus -> slotCapsChange() ****"; } void PlayerDBusHandler::slotTrackChange() { qDebug() << "**** Dbus -> slotTrackChange() ****"; } void PlayerDBusHandler::slotStatusChange() { qDebug() << "**** Dbus -> slotStatusChange() ****"; } } // namespace KsCD diff --git a/dbus/TracklistDBusHandler.cpp b/dbus/TracklistDBusHandler.cpp index 463d5b9..0dfcf7e 100644 --- a/dbus/TracklistDBusHandler.cpp +++ b/dbus/TracklistDBusHandler.cpp @@ -1,78 +1,82 @@ /****************************************************************************** * Copyright (C) 2008 Amine Bouchikhi * * * * 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 . * ******************************************************************************/ #include "TracklistDBusHandler.h" #include "TracklistAdaptor.h" #include "dbus/PlayerDBusHandler.h" #include namespace KsCD { TracklistDBusHandler::TracklistDBusHandler(KSCD *kscd) : QObject() { player = kscd; new TracklistAdaptor( this ); QDBusConnection::sessionBus().registerObject( QLatin1String( "/Player" ), this); setObjectName( QLatin1String("TracklistDBusHandler" )); } int TracklistDBusHandler::AddTrack( const QString& url, bool playImmediately ) { + Q_UNUSED(url) + Q_UNUSED(playImmediately) return 0; } void TracklistDBusHandler::DelTrack( int index ) { + Q_UNUSED(index) } int TracklistDBusHandler::GetCurrentTrack() { return 0; } int TracklistDBusHandler::GetLength() { return 0; } QVariantMap TracklistDBusHandler::GetMetadata( int position ) { + Q_UNUSED(position) return QVariantMap(); } void TracklistDBusHandler::SetLoop(bool enable) { - + Q_UNUSED(enable) } void TracklistDBusHandler::SetRandom( bool enable ) { - + Q_UNUSED(enable) } void TracklistDBusHandler::slotTrackListChange() { } } diff --git a/dbus/org.freedesktop.MediaPlayer.player.xml b/dbus/org.freedesktop.MediaPlayer.player.xml index d6078ff..df99db0 100644 --- a/dbus/org.freedesktop.MediaPlayer.player.xml +++ b/dbus/org.freedesktop.MediaPlayer.player.xml @@ -1,67 +1,66 @@ - - + - + - + diff --git a/dbus/org.freedesktop.MediaPlayer.root.xml b/dbus/org.freedesktop.MediaPlayer.root.xml index 593e991..6b8976e 100644 --- a/dbus/org.freedesktop.MediaPlayer.root.xml +++ b/dbus/org.freedesktop.MediaPlayer.root.xml @@ -1,20 +1,20 @@ - + diff --git a/dbus/org.freedesktop.MediaPlayer.tracklist.xml b/dbus/org.freedesktop.MediaPlayer.tracklist.xml index e8cb127..fe0c8b1 100644 --- a/dbus/org.freedesktop.MediaPlayer.tracklist.xml +++ b/dbus/org.freedesktop.MediaPlayer.tracklist.xml @@ -1,44 +1,44 @@ - + diff --git a/gui/kscdwidget.cpp b/gui/kscdwidget.cpp index a1e8b53..39d3cd6 100644 --- a/gui/kscdwidget.cpp +++ b/gui/kscdwidget.cpp @@ -1,200 +1,201 @@ /* * Kscd - A simple cd player for the KDE Project * * Copyright (c) 1997 Bernd Johannes wuebben@math.cornell.edu * Copyright (c) 2002-2003 Aaron J. Seigo * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Stanislas KRZYWDA * Sovanramy Var * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "kscdwidget.h" #include #include #include #include #include #include KscdWidget::KscdWidget(const QString& sName,QWidget * parent):QWidget(parent) { m_state = QLatin1String( "default" ); m_name = sName; m_baseName = m_name; m_id = m_name + QLatin1Char( '_' ) + m_state; m_path = Prefs::url(); m_renderer = new QSvgRenderer(this); loadSkin(m_path); if (m_renderer->elementExists(m_id)) { setFixedSize(m_renderer->boundsOnElement(m_id).width(), m_renderer->boundsOnElement(m_id).height()); connect(this, SIGNAL(needRepaint()),this, SLOT(repaint())); connect(this,SIGNAL(changePicture()),this,SLOT(update())); setMouseTracking ( true ); } } KscdWidget::~KscdWidget() { delete m_bounds; delete m_renderer; } void KscdWidget::setName(const QString & sName) { m_name = sName; } QString KscdWidget::getName() const { return m_name; } QString KscdWidget::getState() const { return m_state; } void KscdWidget::setId(const QString & name,const QString & state) { m_id = name + QLatin1Char( '_' ) + state; } QString KscdWidget::getId() const { return m_id; } void KscdWidget::loadPicture(const QString & name,const QString & state) { m_id= name + QLatin1Char( '_' ) + state; emit(changePicture()); emit(needRepaint()); } void KscdWidget::paintEvent(QPaintEvent *event) { + Q_UNUSED(event) QPainter painter(this); if (m_renderer->elementExists(m_id)) m_renderer->render(&painter,m_id); } void KscdWidget::enterEvent (QEvent * event ) { event->accept(); m_state = QLatin1String( "over" ); m_id = m_name + QLatin1Char( '_' ) + m_state; emit(needRepaint()); setToolTip( i18n( qPrintable( m_name ) ) ); } void KscdWidget::leaveEvent (QEvent * event ) { event->accept(); m_state = QLatin1String( "default" ); m_id = m_name + QLatin1Char( '_' ) + m_state; emit(needRepaint()); } void KscdWidget::mousePressEvent(QMouseEvent *event) { if(m_bounds->contains(event->pos()+(m_bounds->boundingRect()).topLeft())) { event->accept(); qDebug() << "**** button name : " << m_name << " ****"; m_state = QLatin1String( "pressed" ); m_id = m_name + QLatin1Char( '_' )+ m_state; emit(needRepaint()); } else { event->ignore(); } } void KscdWidget::mouseReleaseEvent(QMouseEvent *event) { if(m_bounds->contains(event->pos()+(m_bounds->boundingRect()).topLeft())) { event->accept(); m_state = QLatin1String( "over" ); m_id = m_name + QLatin1Char( '_' ) + m_state; emit(buttonClicked(QString(m_name))); emit(needRepaint()); } else { event->ignore(); } } QString KscdWidget::getPath() const { return m_path; } QRegion* KscdWidget::bounds() const { return m_bounds; } QPixmap KscdWidget::getPix() const { return pix; } void KscdWidget::loadSkin(const QString & skin) { const QString newId = m_baseName + QLatin1String( "_default" ); m_path = skin; if (!m_renderer->load(skin)) { Prefs::setUrl(Prefs::defaultUrlValue()); m_path = Prefs::url(); m_renderer->load(skin); } if (m_renderer->elementExists(m_id)){ QRectF rect = m_renderer->boundsOnElement(newId); resize(rect.width(),rect.height()); pix = QPixmap(rect.toRect().size()); pix.fill(QColor(Qt::transparent)); QPainter p(&pix); m_renderer->render(&p,newId,rect); m_bounds = new QRegion(pix); //setMask( pix.mask() ); move(rect.toRect().x(),rect.toRect().y()); } } diff --git a/gui/kscdwindow.cpp b/gui/kscdwindow.cpp index b1280f9..301609f 100644 --- a/gui/kscdwindow.cpp +++ b/gui/kscdwindow.cpp @@ -1,417 +1,418 @@ /* * Kscd - A simple cd player for the KDE Project * * Copyright (c) 1997 Bernd Johannes wuebben@math.cornell.edu * Copyright (c) 2002-2003 Aaron J. Seigo * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Stanislas KRZYWDA * Sovanramy Var * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "kscdwindow.h" #include #include #include #include #include #include "panel.h" using namespace Phonon; KscdWindow::KscdWindow(QWidget *parent):QWidget(parent) { setWindowFlags(Qt::FramelessWindowHint); m_backG = new BackGround(this); m_stopB = new StopButton(this); m_playB = new PlayButton(this); m_nextB = new NextButton(this); m_prevB = new PreviousButton(this); m_ejectB = new EjectButton(this); m_muteB = new MuteButton(this); m_randB = new RandomButton(this); m_loopB = new LoopButton(this); m_trackB = new TrackListButton(this); m_volumeB = new VolumeButton(this); m_closeB = new CloseButton(this); m_miniB = new MinimizeButton(this); // m_slider = new SeekSlider(this); m_bar = new SeekBar(this); m_panel = new Panel(this); m_stateTrackDialog = false; m_trackDlgCreated = false; m_trackDlg = new TrackListDlg(parent); // m_prefB = new ConfigButton(this); m_move = false; // createTrackWindow(); setMask( m_backG->getPix().mask() ); connect(m_stopB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_playB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_prevB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_nextB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_ejectB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_muteB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_randB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_loopB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_trackB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_volumeB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_volumeB,SIGNAL(volumeChange(qreal)),this,SIGNAL(actionVolume(qreal))); connect(m_trackDlg,SIGNAL(itemClicked(int)),this,SLOT(doubleClickedEvent(int))); connect( m_trackDlg, SIGNAL(trackListClosed()), this, SLOT(closeTrackDialog()) ); connect(m_miniB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_closeB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); connect(m_volumeB,SIGNAL(volumeChange(qreal)),m_panel,SLOT(setVolumeDisplay(qreal))); // connect(m_prefB,SIGNAL(buttonClicked(QString)),this,SIGNAL(actionClicked(QString))); } KscdWindow::~KscdWindow() { delete m_playB; delete m_stopB; delete m_nextB; delete m_prevB; delete m_ejectB; delete m_muteB; delete m_trackB; delete m_panel; delete m_closeB; delete m_backG; delete m_miniB; // delete m_slider; delete m_volumeB; delete m_loopB; delete m_randB; // delete /*m_popUp*/; delete m_trackDlg; } void KscdWindow::closeTrackDialog() { qDebug()<<"Close Track Dialog"; m_stateTrackDialog = false; m_trackDlg->hide(); } // void KscdWindow::clearTracklist() void KscdWindow::createTrackDialog(const QList & trackList,const QString & albumTitle) { QList::const_iterator it; QList::const_iterator end = trackList.constEnd(); m_trackDlg->removeRowsTrackTable(); m_stateTrackDialog = true; m_trackDlg->setAlbumLbl(albumTitle); int trackNumber = 0; m_trackDlg->setRowCount(trackList.count()); for(it = trackList.constBegin();it != end;++it) { m_trackDlg->addItemTrackTable(trackNumber,0,QString::number(trackNumber+1)); m_trackDlg->addItemTrackTable(trackNumber,1,(*it).Title); QTime time; time = time.addMSecs((*it).Duration); m_trackDlg->addItemTrackTable(trackNumber,2,time.toString(QLatin1String( "mm:ss" ))); // m_trackDlg->setYearLbl((*it).Year); trackNumber++; } m_trackDlg->moveTrackDialog(x(),y()+frameGeometry().height()); m_trackDlg->show(); } //Apply changes on kscdwidgets with new skin void KscdWindow::setNewSkin(QString & newS){ qDebug () << "make change with new skin :"<writeConfig(); + Prefs::self()->save(); qDebug () << "**** " << Prefs::url() << " ****"; QSvgRenderer* rend = new QSvgRenderer(newS,this); this->resize(rend->boundsOnElement(QLatin1String( "kscdBack_default" )).width(), rend->boundsOnElement(QLatin1String( "kscdBack_default" )).height()); m_backG->loadSkin(newS); m_stopB->loadSkin(newS); m_playB->loadSkin(newS); m_prevB->loadSkin(newS); m_nextB->loadSkin(newS); m_ejectB->loadSkin(newS); m_muteB->loadSkin(newS); m_randB->loadSkin(newS); m_loopB->loadSkin(newS); m_trackB->loadSkin(newS); m_volumeB->loadSkin(newS); m_closeB->loadSkin(newS); m_miniB->loadSkin(newS); m_panel->loadSkin(newS); sslider->move(m_bar->x(),m_bar->y()-5); sslider->setMaximumWidth(m_bar->width()); sslider->setMinimumWidth(m_bar->width()); // (m_slider->cursor())->changeSkin(newS); // (m_slider->bar())->changeSkin(newS); //m_popUp->changeSkin(newS);; QRectF rect = rend->boundsOnElement(QLatin1String( "kscdBack_default" )); QPixmap pix(rect.toRect().size()); pix.fill(QColor(Qt::transparent)); QPainter p(&pix); rend->render(&p,QLatin1String( "kscdBack_default" ),rect); setMask(pix.mask()); delete rend; } void KscdWindow::doubleClickedEvent(int pos) { qDebug()<<"signal recu\n"<<"pos clicked:"<addWidget((QWidget*)ss, 2, 3,1,2); // } /** * hide the title popUp */ // void KscdWindow::hideTitlePopUp() // { // if(m_titlePopUp != NULL) // { // m_titlePopUp->hide(); // } // } /** * Links treatments with the UI */ void KscdWindow::catchButton(QString & name) { qDebug()<<"Catch :" << name; emit(actionClicked(name)); } void KscdWindow::catchVolume(qreal value) { emit(actionVolume(value)); } void KscdWindow::changePicture(const QString & name,const QString & state) { qDebug() << name << state; QString result; QString def = QLatin1String( "default" ); if(name == QLatin1String( "play" )) { result = QLatin1String( "pause" ); m_playB->loadPicture(result,state); m_playB->setName(result); } else if(name == QLatin1String( "pause" )) { result = QLatin1String( "play" ); m_playB->loadPicture(result,state); m_playB->setName(result); } else if(name == QLatin1String( "stop" )) { result = QLatin1String( "play" ); m_stopB->loadPicture(name,state); m_playB->setName(result); QString tmp = m_playB->getName(); m_playB->loadPicture(tmp,def); } else if(name == QLatin1String( "eject" )) { result = QLatin1String( "play" ); m_playB->setName(result); QString tmp = m_playB->getName(); m_playB->loadPicture(tmp,def); } else if(name == QLatin1String( "next" )) { m_nextB->loadPicture(name,state); } else if(name == QLatin1String( "previous" )) { m_prevB->loadPicture(name,state); } else if(name == QLatin1String( "mute" )) { m_muteB->loadPicture(name,state); } else if(name == QLatin1String( "unmute" )) { m_muteB->loadPicture(name,state); } else if(name == QLatin1String( "random" )) { m_randB->loadPicture(name,state); } else if(name == QLatin1String( "p_random" )) { result = QLatin1String( "random" ); def = QLatin1String( "pressed" ); m_randB->loadPicture(result,def); } else if(name == QLatin1String( "loop" )) { m_loopB->loadPicture(name,state); } else if(name == QLatin1String( "looptrack" )) { m_loopB->loadPicture(name,state); } else if(name == QLatin1String( "loopdisc" )) { m_loopB->loadPicture(name,state); } else if(name == QLatin1String( "tracklist" )) { m_trackB->loadPicture(name,state); } else if(name == QLatin1String( "close" )) { m_closeB->loadPicture(name,state); } else if(name == QLatin1String( "minimize" )) { m_miniB->loadPicture(name,state); } } KscdWidget & KscdWindow::getPanel() const{ return *m_panel; } //void KscdWindow::paintEvent(QPaintEvent *event) //{ // QPainter painter(this); // painter.setBackgroundMode(Qt::TransparentMode); //} /** * Manages the Trackinfo Label */ void KscdWindow::showTrackinfoLabel(QString & infoStatus) { m_panel->setTitle(infoStatus); } /** * Manages the Artist label */ void KscdWindow::showArtistLabel(QString & infoStatus) { m_panel->setAuthor(infoStatus); } void KscdWindow::showArtistAlbum(QString & infoStatus) { m_panel->setAlbum(infoStatus); } void KscdWindow::setTime(qint64 pos){ m_panel->setTime(pos); // m_slider->setTime(pos); } void KscdWindow::panelInfo(const QString & mess) { QString informationDisplay; if(mess == QLatin1String( "loop" )) { m_panel->setLoop(QLatin1String( "" )); } if(mess == QLatin1String( "looptrack" )) { m_panel->setLoop(i18n( "loop track " )); //informationDisplay = "loop track "; } if(mess == QLatin1String( "loopdisc" )) { //informationDisplay = "loop disc "; m_panel->setLoop(i18n( "loop disc " )); } if(mess == QLatin1String( "random" )) { m_panel->setRandom(QLatin1String( "" )); } if(mess == QLatin1String( "p_random" )) { //informationDisplay += "random"; m_panel->setRandom(i18nc( "This action allow the user to listen a random track","random")); } m_panel->displayInfo(m_panel->getLoop(),m_panel->getRandom()); } void KscdWindow::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { event->accept(); mousePosition = event->pos(); m_move =true; grabMouse(Qt::SizeAllCursor); } else { event->ignore(); } } void KscdWindow::mouseReleaseEvent(QMouseEvent *event) { + Q_UNUSED(event) releaseMouse(); m_move = false; } void KscdWindow::mouseMoveEvent(QMouseEvent * event) { if(m_move == true) { event->accept(); move(event->globalPos() - mousePosition); //emit(moveValue(event->globalPos() - mousePosition)); } else { event->ignore(); } } diff --git a/gui/seekcursor.cpp b/gui/seekcursor.cpp index a286354..b88f409 100644 --- a/gui/seekcursor.cpp +++ b/gui/seekcursor.cpp @@ -1,71 +1,72 @@ /* * Kscd - A simple cd player for the KDE Project * * Copyright (c) 1997 Bernd Johannes wuebben@math.cornell.edu * Copyright (c) 2002-2003 Aaron J. Seigo * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Stanislas KRZYWDA * Sovanramy Var * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "seekcursor.h" #include SeekCursor::SeekCursor(QWidget * parent,const QString& sName):KscdWidget(sName,parent) { m_posInit = x(); init(); hide(); } SeekCursor::~SeekCursor() { } int SeekCursor::getStep() const { return m_step; } void SeekCursor::setStep(qint64 time,int length) { m_step = ceil((SECOND_IN_MILLI * (float)length)/(float)time); qDebug()<<"m_step:"< * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Stanislas KRZYWDA * Sovanramy Var * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "tracklistdlg.h" #include #include #include #include #include TrackListDlg::TrackListDlg(QWidget * parent) :QDialog(parent) { QWidget *page = new QWidget( this ); QVBoxLayout* vlay = new QVBoxLayout( page ); m_ui = new trackListDlgUI( this ); vlay->addWidget( m_ui ); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); - QWidget *mainWidget = new QWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout; setLayout(mainLayout); mainLayout->addWidget(page); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); mainLayout->addWidget(buttonBox); m_ui->trackTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); m_ui->trackTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); m_ui->trackTable->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); m_ui->trackTable->verticalHeader()->hide(); setSizeIncrement ( 0, 50 ); connect(m_ui->trackTable,SIGNAL(itemDoubleClicked(QTableWidgetItem*)), this,SLOT(valueDoubleCliked(QTableWidgetItem*))); } TrackListDlg::~TrackListDlg() { } void TrackListDlg::closeEvent( QCloseEvent * ) { emit trackListClosed(); } void TrackListDlg::setAlbumLbl(const QString& album) { m_ui->albumLbl->setText(album); } void TrackListDlg::setYearLbl(const QString& year) { m_ui->yearLbl->setText(year); } void TrackListDlg::addItemTrackTable(int row,int column,const QString& item) { m_ui->trackTable->setItem(row,column, new QTableWidgetItem(item)); } int TrackListDlg::numberColumnTrackTable() const { return m_ui->trackTable->columnCount(); } void TrackListDlg::setRowCount(int nRows) { m_ui->trackTable->setRowCount(nRows); } void TrackListDlg::removeRowsTrackTable() { m_ui->trackTable->setRowCount(0); } void TrackListDlg::valueDoubleCliked(QTableWidgetItem* item) { emit(itemClicked(item->row()+ 1)); } void TrackListDlg::moveTrackDialog(int x, int y) { move(x,y); } diff --git a/gui/volumebutton.cpp b/gui/volumebutton.cpp index 1edf291..eaa720b 100644 --- a/gui/volumebutton.cpp +++ b/gui/volumebutton.cpp @@ -1,202 +1,206 @@ /* * Kscd - A simple cd player for the KDE Project * * Copyright (c) 1997 Bernd Johannes wuebben@math.cornell.edu * Copyright (c) 2002-2003 Aaron J. Seigo * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Stanislas KRZYWDA * Sovanramy Var * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "volumebutton.h" #include #include VolumeButton::VolumeButton(QWidget * parent, qreal value):KscdWidget(QLatin1String("volume"),parent) { m_vValue = value; m_angle = valueToAngle(m_vValue); m_centerX = width()/2; m_centerY = height()/2; m_move = false; } VolumeButton::~VolumeButton() { } /* change skin path and refresh */ void VolumeButton::changeSkin(const QString& newPathSkin) { if (m_renderer->elementExists(m_id)) { loadSkin(newPathSkin); emit(changePicture()); emit(needRepaint()); m_centerX = width()/2; m_centerY = height()/2; } } void VolumeButton::mousePressEvent(QMouseEvent *event) { if(m_bounds->contains(event->pos()+(m_bounds->boundingRect()).topLeft())) { event->accept(); m_posX = event->x(); m_posY = event->y(); m_move =true; grabMouse(Qt::ClosedHandCursor); } else { event->ignore(); } } // void VolumeButton::mouseMoveEvent(QMouseEvent *event) { if(m_bounds->contains(event->pos()+(m_bounds->boundingRect()).topLeft()) && m_move == true){ event->accept(); //find the angle //find three triangle side's length qreal b=(qreal)sqrt((m_centerX - m_posX)*(m_centerX - m_posX) + (m_centerY - m_posY)*(m_centerY - m_posY)); qreal a=(qreal)sqrt((event->x() - m_posX)*(event->x() - m_posX) + (event->y()- m_posY)*(event->y()- m_posY)); qreal c=(qreal)sqrt((m_centerX - event->x())*(m_centerX - event->x()) + (m_centerY - event->y())*(m_centerY - event->y())); //find angle in radian between last point, center point and the new point qreal A=(qreal)acos((b*b+c*c-a*a)/(2*b*c)); //sound must be higher if((event->x()>m_centerX && event->y()< m_posY) || (event->x()< m_centerX && event->y()>m_posY) || (event->y()y()==m_posY && event->x()y()>m_centerY && event->y()==m_posY && event->x()>m_posX)){ if((m_angle - (180 * (A))/3.1415)>=0){ rotation(m_angle - (180 * (A))/3.1415); //change m_angle m_vValue=angleToValue(m_angle); //change m_vValue emit(volumeChange(m_vValue)); // change sound volume } //sound must be lower }else if((event->x()<=m_centerX && event->y()< m_posY) || (event->x()>= m_centerX && event->y()>m_posY) || (event->y()y()==m_posY && event->x()>m_posX) || (event->y()>m_centerY && event->y()==m_posY && event->x()x(); m_posY = event->y(); }else{ event->ignore(); } } void VolumeButton::mouseReleaseEvent(QMouseEvent *event) { + Q_UNUSED(event) + releaseMouse(); m_move = false; } void VolumeButton::wheelEvent(QWheelEvent *event) { qreal step = valueToAngle((event->delta()/120)*wheelStep); if((m_angle + step)>=0 && (m_angle + step)<=250) { // event->accept(); m_angle += step; m_vValue += (event->delta()/120)*wheelStep; emit(volumeChange(m_vValue)); rotation(m_angle); } else { event->ignore(); } } void VolumeButton::rotation (qreal angle) { m_angle = angle; emit(update()); } qreal VolumeButton::angleToValue(qreal angle) { return angle/wheelStep ; } qreal VolumeButton::valueToAngle(qreal value) { return value*wheelStep ; } void VolumeButton::paintEvent(QPaintEvent *event) { + Q_UNUSED(event) + QPainter painter(this); painter.translate((m_renderer->boundsOnElement(m_id).width())/2, (m_renderer->boundsOnElement(m_id).height())/2); painter.rotate(m_angle); painter.translate(-(m_renderer->boundsOnElement(m_id).width())/2, -(m_renderer->boundsOnElement(m_id).height())/2); m_renderer->render(&painter,m_id); } void VolumeButton::enterEvent (QEvent * event ) { event->accept(); setToolTip( i18n( qPrintable( m_name ) ) ); } void VolumeButton::leaveEvent (QEvent * event ) { event->accept(); } void VolumeButton::volumeShortcut(qreal value) { if (m_vValue<=100 && m_vValue>=0) { qreal angle = valueToAngle(value); rotation (m_angle + angle); m_vValue+=value; emit(volumeChange(m_vValue)); } } diff --git a/hwcontroler.cpp b/hwcontroler.cpp index f3da51b..6890e93 100644 --- a/hwcontroler.cpp +++ b/hwcontroler.cpp @@ -1,552 +1,554 @@ /* * Kscd - A simple cd player for the KDE Project * * Copyright (c) 1997 Bernd Johannes wuebben@math.cornell.edu * Copyright (c) 2002-2003 Aaron J. Seigo * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "hwcontroler.h" #include "audiocd.h" #include #include #include #include #include #include #include #include #include #include using namespace Phonon; HWControler::HWControler () : selectedCd(-1) , speakers(new Phonon::AudioOutput ( MusicCategory, this )) , selectedS(-1) , media(new Phonon::MediaObject(this)) , mc(new MediaController(media)) , loopState(NoLoop) , random(false) , isEjectAtTheEndOfTheCdActivated(false) , posPlayList(-1) { // getting all optical disc driver QList devList = Solid::Device::listFromType(Solid::DeviceInterface::OpticalDrive, QString()); // if no optical drive detected if (devList.isEmpty()) { qDebug() << "No Optical Drive detected!"; selectedCd = -1; } // else loading all optical drives else { for (int i = 0; i < devList.size();i++) { cdIn.append(new AudioCD(devList[i])); selectedCd = 0; connect(cdIn[selectedCd],SIGNAL(discChanged()),this,SLOT(configMedia())); } } selectedS=0; // Multimedia configuration configMedia(); } HWControler::~HWControler () { delete speakers; delete media; delete mc; } // TODO function to switch optical drive void HWControler::selectCd(int /*cdNum*/) { } // TODO function to switch audio output void HWControler::selectSpeaker(int /*sNum*/) { } void HWControler::eject() { // if optical drive detected with a cd inside if(!(selectedCd==-1)) { cdIn[selectedCd]->getCdDrive()->eject(); } } void HWControler::play() { if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { /*if (!random) {*/ mc->setAutoplayTitles(true); media->play(); qDebug() << getCurrentTrack() <<"/"<< getTotalTrack(); // } /*else { qDebug() << "Booooooooooooooooo"; playRand(); }*/ } else { qDebug() << "No CD detected"; } } else { qDebug() << "No Drive detected!!!"; } } void HWControler::nextTrack() { if(!(selectedCd==-1)) { if(cdIn[selectedCd]->isCdInserted()) { if(!random) { if(mc->currentTitle() == mc->availableTitles()) { mc->setCurrentTitle(1); } else { mc->nextTitle(); catchCurrentTime(0); } } else { playRand(); } } } } void HWControler::prevTrack() { if(!(selectedCd==-1)) { if(cdIn[selectedCd]->isCdInserted()) { if(!random) { if(mc->currentTitle() == 1) { mc->setCurrentTitle(mc->availableTitles()); } else { mc->previousTitle(); catchCurrentTime(0); } } else { playRand(); } } } } void HWControler::stop(bool restart) { if(!(selectedCd==-1)) { if(cdIn[selectedCd]->isCdInserted()) { mc->setAutoplayTitles(false); media->stop(); qDebug() << "stop with restart?" << restart; if (restart) { mc->setCurrentTitle(1); } catchCurrentTime(0); } } } void HWControler::pause() { if(!(selectedCd==-1)) { if(cdIn[selectedCd]->isCdInserted()) { media->pause(); } } } void HWControler::mute(bool mute) { if((selectedS!=-1)) { speakers->setMuted(mute); } } qint64 HWControler::getTotalTime ()const { if(!(selectedCd==-1)) { if(cdIn[selectedCd]->isCdInserted()) { return media->totalTime(); } else { return -1; } } else { return -1; } } qint64 HWControler::getRemainingTime ()const { if(!(selectedCd==-1)) { if(cdIn[selectedCd]->isCdInserted()) { return media->remainingTime(); } else { return -1; } } else { return -1; } } qreal HWControler::getVolume()const { if (selectedS == -1) { return -1; } else { return speakers->volume(); } } void HWControler::setVolume(qreal vol) { if (selectedS != -1) { speakers->setVolume(vol/100); } } Phonon::State HWControler ::getState()const { if(selectedCd==-1) { return ErrorState; } else { if(cdIn[selectedCd]->isCdInserted()) { return media->state(); } else { return ErrorState; } } } void HWControler ::configMedia() { if(selectedCd!=-1) { qDebug()<< "#o#o#o# Loading Optical Drive"; if(cdIn[selectedCd]->isCdInserted()) { media->setCurrentSource(*cdIn[selectedCd]->getMediaSource()); if (!path.isValid()) path = Phonon::createPath(media, speakers); qDebug()<< "Phonon Loaded"; mc->setAutoplayTitles(false); media->setTickInterval(100); connect(media,SIGNAL(tick(qint64)),this,SLOT(replayTrack(qint64))); connect(media,SIGNAL(tick(qint64)),this,SLOT(catchCurrentTime(qint64))); connect(media,SIGNAL(finished()),this,SLOT(replayDisk())); connect(mc,SIGNAL(titleChanged(int)),this,SLOT(catchTitleChanged())); } emit(cdLoaded(media->currentSource().deviceName())); } } AudioCD * HWControler::getCD()const { if((selectedCd!=-1)) { return cdIn[selectedCd]; } return NULL; } void HWControler ::setLoopMode(LoopMode lm) { loopState = lm; qDebug()<<"Loop Mode: "<stop(); mc->setCurrentTitle(mc->currentTitle()); media->play(); break; default: if (random) { playRand(); } } } } void HWControler ::playRand() { bool endOfList = false; if (posPlayList == getTotalTrack() - 1) { posPlayList = 0; endOfList = true; } else { posPlayList = posPlayList + 1; } if(endOfList && loopState!=LoopAll) { stop(); } else { play(playList[posPlayList]); } } void HWControler ::replayDisk() { if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { if(loopState==LoopAll) { mc->setCurrentTitle( 1 ); play(); } else{ if(isEjectAtTheEndOfTheCdActivated){ eject(); } } } } } Phonon::MediaObject * HWControler ::getMedia()const { if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { return media; } } return NULL; } void HWControler ::catchCurrentTime(qint64 pos) { emit(currentTime(pos)); } Phonon::AudioOutput * HWControler ::getAudioOutPut()const { return speakers; } int HWControler ::getCurrentTrack()const { if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { return mc->currentTitle(); } } return 0; } int HWControler ::getTotalTrack()const { if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { return mc->availableTitles(); } } return 0; } void HWControler ::play(int track) { if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { mc->setAutoplayTitles(true); mc->setCurrentTitle(track); media->play(); } else { qDebug() << "No disc inserted"; } } else { qDebug() << "No drive detected"; } } void HWControler ::catchTitleChanged() { emit(trackChanged()); } void HWControler::setRandom(bool b) { random = b; if (b) qDebug() << "Random Activated"; else qDebug() << "Random Disabled"; if((selectedCd!=-1)) { if(cdIn[selectedCd]->isCdInserted()) { loadPlayList(); } } } bool HWControler::isDiscValid() { /* if(getCD()->isCdInserted()) { return !(getCD()->getCd()->discType()&0x01) ; } else return false; */ return true; } void HWControler ::loadPlayList() { srand( time( NULL ) ); int pos; posPlayList = 0; QList tmp; for (int i = 0; i0; i--) { pos = generateNumber(i); playList.append(tmp[pos-1]); tmp.removeAt(pos-1); } for (int i = 0; isignature(); } diff --git a/mbmanager.cpp b/mbmanager.cpp index 63ffd26..1f3d245 100644 --- a/mbmanager.cpp +++ b/mbmanager.cpp @@ -1,332 +1,331 @@ /* * Kscd - A simple cd player for the KDE Project * * Copyright (c) 1997 Bernd Johannes wuebben@math.cornell.edu * Copyright (c) 2002-2003 Aaron J. Seigo * Copyright (c) 2004 Alexander Kern * Copyright (c) 2003-2006 Richard Lärkäng * * -------------- * ISI KsCD Team : * -------------- * Stanislas KRZYWDA * Sovanramy Var * Bouchikhi Mohamed-Amine * Gastellu Sylvain * ----------------------------------------------------------------------------- * * 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, 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include "mbmanager.h" #include - -#include +#include #include #include #include #include #include #include #include #include #include #include #include MBManager::MBManager():m_validInfo(true) { m_discid = discid_new(); } MBManager::~MBManager() { discid_free(m_discid); } static QString getTitle(MusicBrainz5::CRelease *release, MusicBrainz5::CMedium *medium) { QString title; if (!release) { return title; } title = QString::fromUtf8(release->Title().c_str()); if (medium && release->MediumList()->NumItems() > 1) { title = i18n("%1 (disc %2)", title, medium->Position()); } return title; } static QString getArtistFromArtistCredit(MusicBrainz5::CArtistCredit *artistCredit) { QString artist; MusicBrainz5::CNameCreditList *artistList = artistCredit->NameCreditList(); if (!artistList) { return artist; } for (int i = 0; i < artistList->NumItems(); i++) { MusicBrainz5::CNameCredit* name = artistList->Item(i); MusicBrainz5::CArtist* itemArtist = name->Artist(); if (!name->Name().empty()) { artist += QString::fromUtf8(name->Name().c_str()); } else { artist += QString::fromUtf8(itemArtist->Name().c_str()); } artist += QString::fromUtf8(name->JoinPhrase().c_str()); } return artist; } static QString getArtist(MusicBrainz5::CRelease *release) { QString artist; if (!release) { return artist; } MusicBrainz5::CArtistCredit *artistCredit = release->ArtistCredit(); return getArtistFromArtistCredit(artistCredit); } static QList unknownTracks(QString &discArtist, DiscId *m_discid) { QList tracks; MBTrackInfo track; for (int j = 1; j < discid_get_first_track_num(m_discid); j++) { track.Title = i18n("Unknown title"); track.Artist = discArtist; // Not an audio track track.Duration = 0; tracks << track; } for (int j = discid_get_first_track_num(m_discid); j <= discid_get_last_track_num(m_discid); j++) { track.Title = i18n("Unknown title"); track.Artist = discArtist; // time from mb library in sectors, 75 sectors = 1 second track.Duration = discid_get_track_length(m_discid, j) * 1000 / 75; tracks << track; } return tracks; } static QList getTracks(MusicBrainz5::CMedium *medium, QString &discArtist, DiscId *m_discid) { QList tracks; if (!medium) { return tracks; } MusicBrainz5::CTrackList *trackList = medium->TrackList(); if (!trackList) { return unknownTracks(discArtist, m_discid); } MBTrackInfo track; for (int i = 0; i < trackList->NumItems(); i++) { MusicBrainz5::CTrack *itemTrack = trackList->Item(i); MusicBrainz5::CRecording *recording = itemTrack->Recording(); if (recording && !itemTrack->ArtistCredit()) { track.Artist = getArtistFromArtistCredit(recording->ArtistCredit()); } else { track.Artist = getArtistFromArtistCredit(itemTrack->ArtistCredit()); } if(recording && itemTrack->Title().empty()) { track.Title = QString::fromUtf8(recording->Title().c_str()); } else { track.Title = QString::fromUtf8(itemTrack->Title().c_str()); } track.Duration = itemTrack->Length(); tracks << track; } return tracks; } static MusicBrainz5::CRelease *getRelease(MusicBrainz5::CQuery &query, std::string &discId, MusicBrainz5::CMetadata &metadata, MusicBrainz5::CMetadata &fullMetadata) { metadata = query.Query("discid", discId); // Check to see how many items were returned from the server if (!metadata.Disc() || !metadata.Disc()->ReleaseList()) { return 0; } MusicBrainz5::CReleaseList *results = metadata.Disc()->ReleaseList(); // TODO if multiple entries found if (results->NumItems() > 1) { qDebug() << results->NumItems() << " entries found"; } MusicBrainz5::CRelease *release; for (int i = 0; i < results->NumItems(); i++) { MusicBrainz5::CRelease *result = results->Item(i); MusicBrainz5::CQuery::tParamMap params; params["inc"] = "artists labels recordings release-groups url-rels " "discids artist-credits"; fullMetadata = query.Query("release", result->ID(), "", params); release = fullMetadata.Release(); if (release) { break; } } return release; } static MusicBrainz5::CMedium *getMedium(MusicBrainz5::CRelease *release, std::string &discId, MusicBrainz5::CMediumList &mediaList) { if (!release) { return 0; } // Find the specific media in the release mediaList = release->MediaMatchingDiscID(discId); MusicBrainz5::CMedium* medium = 0; for (int i = 0; i < mediaList.NumItems(); i++) { medium = mediaList.Item(i); if (medium) { break; } } return medium; } void MBManager::discLookup(const QString &device) { m_validInfo = true; MusicBrainz5::CQuery query("kscd"); int discid_ok = discid_read_sparse(m_discid, qPrintable(device), 0); if (discid_ok) { std::string discId(discid_get_id(m_discid)); try { MusicBrainz5::CMetadata metadata, fullMetadata; MusicBrainz5::CMediumList mediaList; MusicBrainz5::CRelease *release = getRelease(query, discId, metadata, fullMetadata); MusicBrainz5::CMedium *medium = getMedium(release, discId, mediaList); if (release && medium) { // Sets info m_discInfo.Title = getTitle(release, medium); m_discInfo.Artist = getArtist(release); m_trackList = getTracks(medium, m_discInfo.Artist, m_discid); } else { qDebug() << "This CD was not found."; m_validInfo = false; } } catch (MusicBrainz5::CExceptionBase& error) { qDebug() << "Connection Exception: '" << error.what() << "'"; qDebug() << "LastResult: " << query.LastResult(); qDebug() << "LastHTTPCode: " << query.LastHTTPCode(); qDebug() << "LastErrorMessage: " << QString::fromUtf8(query.LastErrorMessage().c_str()); m_validInfo = false; } catch (...) { qDebug() << "Caught Unknown Exception:"; m_validInfo = false; } } else { m_validInfo = false; } if (!m_validInfo) { // If invalid data, fill the information with something // Sets info m_discInfo.Title = i18n("Unknown album"); m_discInfo.Artist = i18n("Unknown artist"); m_trackList.clear(); if (discid_ok) { m_trackList = unknownTracks(m_discInfo.Artist, m_discid); } } emit discLookupFinished(); } void MBManager::discUpload(const QString &device) { showArtistLabel(m_discInfo.Artist); const char *discid_device = device.isEmpty()? NULL : qPrintable(device); int ok = discid_read_sparse(m_discid, discid_device, 0); if (ok) { QString url = QString::fromUtf8(discid_get_submission_url(m_discid)); - KToolInvocation::invokeBrowser(url); + QDesktopServices::openUrl(url); } else { qDebug() << "Error: " << discid_get_error_msg(m_discid); } }