2010-03-24 00:11:46 +01:00
/* This file is part of Clementine.
Clementine 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 3 of the License , or
( at your option ) any later version .
Clementine 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 Clementine . If not , see < http : //www.gnu.org/licenses/>.
*/
2009-12-24 20:16:07 +01:00
# include "mainwindow.h"
2010-05-10 23:50:31 +02:00
# include "ui_mainwindow.h"
# include "core/commandlineoptions.h"
# include "core/database.h"
# include "core/globalshortcuts.h"
# include "core/mac_startup.h"
# include "core/mergedproxymodel.h"
2010-08-02 16:22:05 +02:00
# include "core/modelfuturewatcher.h"
2010-05-10 23:50:31 +02:00
# include "core/player.h"
2010-06-15 20:24:08 +02:00
# include "core/songloader.h"
2010-05-10 23:50:31 +02:00
# include "core/stylesheetloader.h"
2010-06-23 15:21:30 +02:00
# include "core/taskmanager.h"
2010-06-26 14:41:18 +02:00
# include "devices/devicemanager.h"
2010-08-08 15:06:52 +02:00
# include "devices/devicestatefiltermodel.h"
2010-10-01 21:27:01 +02:00
# include "devices/deviceview.h"
2010-04-04 19:50:11 +02:00
# include "engines/enginebase.h"
2010-05-10 23:50:31 +02:00
# include "library/groupbydialog.h"
2010-10-01 21:27:01 +02:00
# include "library/library.h"
2010-08-31 23:24:57 +02:00
# include "library/librarybackend.h"
2010-05-10 23:50:31 +02:00
# include "library/libraryconfig.h"
2010-06-24 19:34:23 +02:00
# include "library/librarydirectorymodel.h"
2010-10-01 21:27:01 +02:00
# include "library/libraryfilterwidget.h"
# include "library/libraryviewcontainer.h"
2010-05-10 23:50:31 +02:00
# include "playlist/playlistbackend.h"
# include "playlist/playlist.h"
2010-05-20 23:21:55 +02:00
# include "playlist/playlistmanager.h"
2010-05-10 23:50:31 +02:00
# include "playlist/playlistsequence.h"
2010-05-20 16:12:15 +02:00
# include "playlist/playlistview.h"
2010-07-11 17:37:40 +02:00
# include "playlist/queue.h"
# include "playlist/queuemanager.h"
2010-06-15 20:24:08 +02:00
# include "playlist/songloaderinserter.h"
2010-05-10 23:50:31 +02:00
# include "playlist/songplaylistitem.h"
2010-05-22 22:06:19 +02:00
# include "playlistparsers/playlistparser.h"
2010-05-10 23:50:31 +02:00
# include "radio/lastfmservice.h"
2010-06-12 22:43:07 +02:00
# include "radio/magnatuneservice.h"
2010-05-10 23:50:31 +02:00
# include "radio/radiomodel.h"
# include "radio/radioview.h"
# include "radio/radioviewcontainer.h"
2010-05-28 00:53:07 +02:00
# include "radio/savedradio.h"
2010-10-02 18:23:33 +02:00
# include "songinfo/artistinfoview.h"
2010-10-10 18:09:20 +02:00
# include "songinfo/songinfoview.h"
2010-05-10 23:50:31 +02:00
# include "transcoder/transcodedialog.h"
# include "ui/about.h"
# include "ui/addstreamdialog.h"
# include "ui/albumcovermanager.h"
# include "ui/edittagdialog.h"
# include "ui/equalizer.h"
2010-05-19 17:45:29 +02:00
# include "ui/iconloader.h"
2010-06-22 16:09:13 +02:00
# ifdef Q_OS_DARWIN
# include "ui/macsystemtrayicon.h"
# endif
2010-06-24 18:26:49 +02:00
# include "ui/organisedialog.h"
# include "ui/qtsystemtrayicon.h"
2010-05-10 23:50:31 +02:00
# include "ui/settingsdialog.h"
# include "ui/systemtrayicon.h"
2010-05-31 22:49:44 +02:00
# include "widgets/errordialog.h"
2010-10-01 21:27:01 +02:00
# include "widgets/fileview.h"
2010-05-10 23:50:31 +02:00
# include "widgets/multiloadingindicator.h"
# include "widgets/osd.h"
2010-10-10 16:04:05 +02:00
# include "widgets/stylehelper.h"
2010-05-10 23:50:31 +02:00
# include "widgets/trackslider.h"
2010-08-23 19:42:51 +02:00
# ifdef ENABLE_WIIMOTEDEV
2010-08-25 15:02:53 +02:00
# include "wiimotedev / shortcuts.h"
2010-08-23 19:42:51 +02:00
# endif
2010-04-16 16:39:55 +02:00
# ifdef HAVE_GSTREAMER
# include "engines / gstengine.h"
# endif
2009-12-30 17:24:55 +01:00
2010-06-11 00:48:23 +02:00
# ifdef ENABLE_VISUALISATIONS
# include "visualisations / visualisationcontainer.h"
# endif
2010-10-01 21:27:01 +02:00
# include <QCloseEvent>
2009-12-24 20:16:07 +01:00
# include <QDir>
2010-10-01 21:27:01 +02:00
# include <QFileDialog>
# include <QFileSystemModel>
# include <QLinearGradient>
2009-12-24 20:16:07 +01:00
# include <QMenu>
# include <QMessageBox>
# include <QSettings>
2010-10-01 21:27:01 +02:00
# include <QShortcut>
2009-12-24 20:16:07 +01:00
# include <QSignalMapper>
2010-10-01 21:27:01 +02:00
# include <QSortFilterProxyModel>
# include <QStatusBar>
# include <QtDebug>
2010-03-20 23:45:54 +01:00
# include <QTimer>
2010-10-01 21:27:01 +02:00
# include <QUndoStack>
2009-12-24 20:16:07 +01:00
2009-12-29 20:57:33 +01:00
# include <cmath>
2010-04-15 00:36:28 +02:00
using boost : : shared_ptr ;
2010-05-15 19:45:04 +02:00
using boost : : scoped_ptr ;
2010-04-15 00:36:28 +02:00
2010-04-14 21:38:09 +02:00
# ifdef Q_OS_DARWIN
// Non exported mac-specific function.
void qt_mac_set_dock_menu ( QMenu * ) ;
# endif
2009-12-24 20:16:07 +01:00
const char * MainWindow : : kSettingsGroup = " MainWindow " ;
2010-05-03 20:52:35 +02:00
const char * MainWindow : : kMusicFilterSpec =
2010-06-15 20:24:08 +02:00
QT_TR_NOOP ( " Music (*.mp3 *.ogg *.flac *.mpc *.m4a *.aac *.wma *.mp4 *.spx *.wav) " ) ;
2010-05-03 20:52:35 +02:00
const char * MainWindow : : kAllFilesFilterSpec =
QT_TR_NOOP ( " All Files (*) " ) ;
2009-12-24 20:16:07 +01:00
2010-10-16 19:20:54 +02:00
MainWindow : : MainWindow ( Engine : : Type engine , QWidget * parent )
2009-12-24 20:16:07 +01:00
: QMainWindow ( parent ) ,
2010-05-10 23:50:31 +02:00
ui_ ( new Ui_MainWindow ) ,
2010-06-22 16:16:04 +02:00
tray_icon_ ( SystemTrayIcon : : CreateSystemTrayIcon ( this ) ) ,
2010-10-16 19:20:54 +02:00
osd_ ( new OSD ( tray_icon_ , this ) ) ,
2010-06-23 15:21:30 +02:00
task_manager_ ( new TaskManager ( this ) ) ,
2010-06-02 17:58:07 +02:00
database_ ( new BackgroundThreadImplementation < Database , Database > ( this ) ) ,
radio_model_ ( NULL ) ,
playlist_backend_ ( NULL ) ,
2010-06-23 15:21:30 +02:00
playlists_ ( new PlaylistManager ( task_manager_ , this ) ) ,
2010-05-22 22:06:19 +02:00
playlist_parser_ ( new PlaylistParser ( this ) ) ,
2010-06-02 17:58:07 +02:00
player_ ( NULL ) ,
library_ ( NULL ) ,
2010-03-21 20:02:56 +01:00
global_shortcuts_ ( new GlobalShortcuts ( this ) ) ,
2010-07-03 23:05:55 +02:00
devices_ ( NULL ) ,
2010-10-01 21:27:01 +02:00
library_view_ ( new LibraryViewContainer ( this ) ) ,
file_view_ ( new FileView ( this ) ) ,
radio_view_ ( new RadioViewContainer ( this ) ) ,
device_view_ ( new DeviceView ( this ) ) ,
2010-10-16 19:20:54 +02:00
song_info_view_ ( new SongInfoView ( this ) ) ,
artist_info_view_ ( new ArtistInfoView ( this ) ) ,
2010-06-02 18:27:52 +02:00
settings_dialog_ ( NULL ) ,
2010-06-02 17:58:07 +02:00
cover_manager_ ( NULL ) ,
2010-04-14 23:58:51 +02:00
equalizer_ ( new Equalizer ) ,
2010-08-27 21:09:03 +02:00
error_dialog_ ( NULL ) ,
2010-06-24 20:33:38 +02:00
organise_dialog_ ( new OrganiseDialog ( task_manager_ ) ) ,
2010-08-27 21:09:03 +02:00
queue_manager_ ( NULL ) ,
2010-06-11 00:48:23 +02:00
# ifdef ENABLE_VISUALISATIONS
2010-08-27 21:09:03 +02:00
visualisation_ ( NULL ) ,
2010-08-25 23:14:37 +02:00
# endif
# ifdef ENABLE_WIIMOTEDEV
wiimotedev_shortcuts_ ( NULL ) ,
2010-06-11 00:48:23 +02:00
# endif
2010-01-15 17:22:19 +01:00
playlist_menu_ ( new QMenu ( this ) ) ,
2009-12-24 20:16:07 +01:00
library_sort_model_ ( new QSortFilterProxyModel ( this ) ) ,
2010-04-19 16:10:31 +02:00
track_position_timer_ ( new QTimer ( this ) ) ,
was_maximized_ ( false )
2009-12-24 20:16:07 +01:00
{
2010-06-02 17:58:07 +02:00
// Wait for the database thread to start - lots of stuff depends on it.
database_ - > Start ( true ) ;
// Create some objects in the database thread
2010-08-27 20:36:57 +02:00
playlist_backend_ = new PlaylistBackend ;
playlist_backend_ - > moveToThread ( database_ ) ;
2010-06-02 17:58:07 +02:00
playlist_backend_ - > SetDatabase ( database_ - > Worker ( ) ) ;
// Create stuff that needs the database
2010-10-16 19:20:54 +02:00
radio_model_ = new RadioModel ( database_ , task_manager_ , this ) ;
2010-06-02 17:58:07 +02:00
player_ = new Player ( playlists_ , radio_model_ - > GetLastFMService ( ) , engine , this ) ;
2010-06-23 15:21:30 +02:00
library_ = new Library ( database_ , task_manager_ , this ) ;
2010-08-27 18:29:28 +02:00
devices_ = new DeviceManager ( database_ , task_manager_ , this ) ;
2010-08-27 15:57:39 +02:00
2010-06-02 17:58:07 +02:00
// Initialise the UI
2010-05-10 23:50:31 +02:00
ui_ - > setupUi ( this ) ;
2010-06-23 15:21:30 +02:00
ui_ - > multi_loading_indicator - > SetTaskManager ( task_manager_ ) ;
2010-05-10 23:50:31 +02:00
ui_ - > volume - > setValue ( player_ - > GetVolume ( ) ) ;
2009-12-24 20:16:07 +01:00
2010-10-01 21:27:01 +02:00
// Add tabs to the fancy tab widget
2010-10-09 20:18:06 +02:00
ui_ - > tabs - > AddTab ( library_view_ , IconLoader : : Load ( " folder-sound " ) , tr ( " Library " ) ) ;
ui_ - > tabs - > AddTab ( file_view_ , IconLoader : : Load ( " document-open " ) , tr ( " Files " ) ) ;
ui_ - > tabs - > AddTab ( radio_view_ , QIcon ( " :last.fm/icon_radio.png " ) , tr ( " Internet " ) ) ;
ui_ - > tabs - > AddTab ( device_view_ , IconLoader : : Load ( " multimedia-player-ipod-mini-blue " ) , tr ( " Devices " ) ) ;
ui_ - > tabs - > AddSpacer ( ) ;
2010-10-10 18:09:20 +02:00
ui_ - > tabs - > AddTab ( song_info_view_ , IconLoader : : Load ( " view-media-lyrics " ) , tr ( " Song info " ) ) ;
2010-10-09 20:18:06 +02:00
ui_ - > tabs - > AddTab ( artist_info_view_ , IconLoader : : Load ( " view-media-lyrics " ) , tr ( " Artist info " ) ) ;
2010-10-01 21:27:01 +02:00
2010-10-06 20:16:49 +02:00
// Add the now playing widget to the fancy tab widget
2010-10-09 20:18:06 +02:00
ui_ - > tabs - > AddBottomWidget ( ui_ - > now_playing ) ;
2010-10-06 20:16:49 +02:00
2010-10-09 20:18:06 +02:00
ui_ - > tabs - > SetBackgroundPixmap ( QPixmap ( " :/sidebar_background.png " ) ) ;
2010-10-01 21:27:01 +02:00
StyleHelper : : setBaseColor ( palette ( ) . color ( QPalette : : Highlight ) . darker ( ) ) ;
2009-12-29 20:57:33 +01:00
track_position_timer_ - > setInterval ( 1000 ) ;
connect ( track_position_timer_ , SIGNAL ( timeout ( ) ) , SLOT ( UpdateTrackPosition ( ) ) ) ;
2010-02-04 00:12:21 +01:00
// Start initialising the player
player_ - > Init ( ) ;
2010-04-16 16:39:55 +02:00
# ifdef HAVE_GSTREAMER
2010-08-27 21:09:03 +02:00
if ( qobject_cast < GstEngine * > ( player_ - > GetEngine ( ) ) = = NULL ) {
2010-06-26 15:20:08 +02:00
ui_ - > action_transcode - > setEnabled ( false ) ;
2010-06-06 16:06:23 +02:00
}
2010-06-26 15:20:08 +02:00
# else // HAVE_GSTREAMER
ui_ - > action_transcode - > setEnabled ( false ) ;
2010-06-11 00:48:23 +02:00
# endif // HAVE_GSTREAMER
2010-04-07 15:51:14 +02:00
2009-12-24 20:16:07 +01:00
// Models
2010-05-09 02:10:26 +02:00
library_sort_model_ - > setSourceModel ( library_ - > model ( ) ) ;
library_sort_model_ - > setSortRole ( LibraryModel : : Role_SortText ) ;
2009-12-24 20:16:07 +01:00
library_sort_model_ - > setDynamicSortFilter ( true ) ;
library_sort_model_ - > sort ( 0 ) ;
2010-05-20 23:21:55 +02:00
ui_ - > playlist - > SetManager ( playlists_ ) ;
2010-03-10 01:04:04 +01:00
2010-10-01 21:27:01 +02:00
library_view_ - > view ( ) - > setModel ( library_sort_model_ ) ;
library_view_ - > view ( ) - > SetLibrary ( library_ - > model ( ) ) ;
library_view_ - > view ( ) - > SetTaskManager ( task_manager_ ) ;
library_view_ - > view ( ) - > SetDeviceManager ( devices_ ) ;
2009-12-24 20:16:07 +01:00
2010-10-01 21:27:01 +02:00
radio_view_ - > SetModel ( radio_model_ ) ;
2009-12-26 16:13:38 +01:00
2010-10-01 21:27:01 +02:00
device_view_ - > SetDeviceManager ( devices_ ) ;
device_view_ - > SetLibrary ( library_ - > model ( ) ) ;
2010-07-03 23:05:55 +02:00
2010-07-19 21:56:29 +02:00
organise_dialog_ - > SetDestinationModel ( library_ - > model ( ) - > directory_model ( ) ) ;
2010-06-24 19:34:23 +02:00
2010-05-19 17:45:29 +02:00
// Icons
ui_ - > action_about - > setIcon ( IconLoader : : Load ( " help-about " ) ) ;
2010-09-30 23:25:31 +02:00
ui_ - > action_about_qt - > setIcon ( QIcon ( " :/trolltech/qmessagebox/images/qtlogo-64.png " ) ) ;
2010-05-19 17:45:29 +02:00
ui_ - > action_add_file - > setIcon ( IconLoader : : Load ( " document-open " ) ) ;
ui_ - > action_add_folder - > setIcon ( IconLoader : : Load ( " document-open-folder " ) ) ;
ui_ - > action_add_stream - > setIcon ( IconLoader : : Load ( " document-open-remote " ) ) ;
ui_ - > action_clear_playlist - > setIcon ( IconLoader : : Load ( " edit-clear-list " ) ) ;
ui_ - > action_configure - > setIcon ( IconLoader : : Load ( " configure " ) ) ;
ui_ - > action_cover_manager - > setIcon ( IconLoader : : Load ( " download " ) ) ;
ui_ - > action_edit_track - > setIcon ( IconLoader : : Load ( " edit-rename " ) ) ;
ui_ - > action_equalizer - > setIcon ( IconLoader : : Load ( " view-media-equalizer " ) ) ;
ui_ - > action_jump - > setIcon ( IconLoader : : Load ( " go-jump " ) ) ;
ui_ - > action_next_track - > setIcon ( IconLoader : : Load ( " media-skip-forward " ) ) ;
ui_ - > action_open_media - > setIcon ( IconLoader : : Load ( " document-open " ) ) ;
ui_ - > action_play_pause - > setIcon ( IconLoader : : Load ( " media-playback-start " ) ) ;
ui_ - > action_previous_track - > setIcon ( IconLoader : : Load ( " media-skip-backward " ) ) ;
ui_ - > action_quit - > setIcon ( IconLoader : : Load ( " application-exit " ) ) ;
ui_ - > action_remove_from_playlist - > setIcon ( IconLoader : : Load ( " list-remove " ) ) ;
ui_ - > action_repeat_mode - > setIcon ( IconLoader : : Load ( " media-playlist-repeat " ) ) ;
ui_ - > action_shuffle - > setIcon ( IconLoader : : Load ( " x-clementine-shuffle " ) ) ;
ui_ - > action_shuffle_mode - > setIcon ( IconLoader : : Load ( " media-playlist-shuffle " ) ) ;
ui_ - > action_stop - > setIcon ( IconLoader : : Load ( " media-playback-stop " ) ) ;
ui_ - > action_stop_after_this_track - > setIcon ( IconLoader : : Load ( " media-playback-stop " ) ) ;
2010-05-20 16:12:15 +02:00
ui_ - > action_new_playlist - > setIcon ( IconLoader : : Load ( " document-new " ) ) ;
ui_ - > action_load_playlist - > setIcon ( IconLoader : : Load ( " document-open " ) ) ;
ui_ - > action_save_playlist - > setIcon ( IconLoader : : Load ( " document-save " ) ) ;
2010-05-25 22:40:45 +02:00
ui_ - > action_update_library - > setIcon ( IconLoader : : Load ( " view-refresh " ) ) ;
2010-06-14 22:00:17 +02:00
ui_ - > action_rain - > setIcon ( IconLoader : : Load ( " weather-showers-scattered " ) ) ;
2010-05-19 17:45:29 +02:00
2009-12-24 21:27:32 +01:00
// File view connections
2010-10-01 21:27:01 +02:00
connect ( file_view_ , SIGNAL ( AddToPlaylist ( QList < QUrl > ) ) , SLOT ( AddFilesToPlaylist ( QList < QUrl > ) ) ) ;
connect ( file_view_ , SIGNAL ( Load ( QList < QUrl > ) ) , SLOT ( LoadFilesToPlaylist ( QList < QUrl > ) ) ) ;
connect ( file_view_ , SIGNAL ( DoubleClicked ( QList < QUrl > ) ) , SLOT ( FilesDoubleClicked ( QList < QUrl > ) ) ) ;
connect ( file_view_ , SIGNAL ( PathChanged ( QString ) ) , SLOT ( FilePathChanged ( QString ) ) ) ;
connect ( file_view_ , SIGNAL ( CopyToLibrary ( QList < QUrl > ) ) , SLOT ( CopyFilesToLibrary ( QList < QUrl > ) ) ) ;
connect ( file_view_ , SIGNAL ( MoveToLibrary ( QList < QUrl > ) ) , SLOT ( MoveFilesToLibrary ( QList < QUrl > ) ) ) ;
connect ( file_view_ , SIGNAL ( CopyToDevice ( QList < QUrl > ) ) , SLOT ( CopyFilesToDevice ( QList < QUrl > ) ) ) ;
file_view_ - > SetTaskManager ( task_manager_ ) ;
2009-12-24 20:16:07 +01:00
// Action connections
2010-05-10 23:50:31 +02:00
connect ( ui_ - > action_next_track , SIGNAL ( triggered ( ) ) , player_ , SLOT ( Next ( ) ) ) ;
connect ( ui_ - > action_previous_track , SIGNAL ( triggered ( ) ) , player_ , SLOT ( Previous ( ) ) ) ;
connect ( ui_ - > action_play_pause , SIGNAL ( triggered ( ) ) , player_ , SLOT ( PlayPause ( ) ) ) ;
connect ( ui_ - > action_stop , SIGNAL ( triggered ( ) ) , player_ , SLOT ( Stop ( ) ) ) ;
connect ( ui_ - > action_quit , SIGNAL ( triggered ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
connect ( ui_ - > action_stop_after_this_track , SIGNAL ( triggered ( ) ) , SLOT ( StopAfterCurrent ( ) ) ) ;
connect ( ui_ - > action_ban , SIGNAL ( triggered ( ) ) , radio_model_ - > GetLastFMService ( ) , SLOT ( Ban ( ) ) ) ;
connect ( ui_ - > action_love , SIGNAL ( triggered ( ) ) , SLOT ( Love ( ) ) ) ;
2010-05-20 23:21:55 +02:00
connect ( ui_ - > action_clear_playlist , SIGNAL ( triggered ( ) ) , playlists_ , SLOT ( ClearCurrent ( ) ) ) ;
2010-05-10 23:50:31 +02:00
connect ( ui_ - > action_remove_from_playlist , SIGNAL ( triggered ( ) ) , SLOT ( PlaylistRemoveCurrent ( ) ) ) ;
connect ( ui_ - > action_edit_track , SIGNAL ( triggered ( ) ) , SLOT ( EditTracks ( ) ) ) ;
connect ( ui_ - > action_renumber_tracks , SIGNAL ( triggered ( ) ) , SLOT ( RenumberTracks ( ) ) ) ;
connect ( ui_ - > action_selection_set_value , SIGNAL ( triggered ( ) ) , SLOT ( SelectionSetValue ( ) ) ) ;
connect ( ui_ - > action_edit_value , SIGNAL ( triggered ( ) ) , SLOT ( EditValue ( ) ) ) ;
2010-08-27 17:42:58 +02:00
connect ( ui_ - > action_configure , SIGNAL ( triggered ( ) ) , SLOT ( OpenSettingsDialog ( ) ) ) ;
connect ( ui_ - > action_about , SIGNAL ( triggered ( ) ) , SLOT ( ShowAboutDialog ( ) ) ) ;
2010-09-30 23:25:31 +02:00
connect ( ui_ - > action_about_qt , SIGNAL ( triggered ( ) ) , qApp , SLOT ( aboutQt ( ) ) ) ;
2010-05-20 23:21:55 +02:00
connect ( ui_ - > action_shuffle , SIGNAL ( triggered ( ) ) , playlists_ , SLOT ( ShuffleCurrent ( ) ) ) ;
2010-05-11 22:02:19 +02:00
connect ( ui_ - > action_open_media , SIGNAL ( triggered ( ) ) , SLOT ( AddFile ( ) ) ) ;
connect ( ui_ - > action_add_file , SIGNAL ( triggered ( ) ) , SLOT ( AddFile ( ) ) ) ;
connect ( ui_ - > action_add_folder , SIGNAL ( triggered ( ) ) , SLOT ( AddFolder ( ) ) ) ;
2010-05-10 23:50:31 +02:00
connect ( ui_ - > action_add_stream , SIGNAL ( triggered ( ) ) , SLOT ( AddStream ( ) ) ) ;
2010-08-27 17:42:58 +02:00
connect ( ui_ - > action_cover_manager , SIGNAL ( triggered ( ) ) , SLOT ( ShowCoverManager ( ) ) ) ;
2010-05-10 23:50:31 +02:00
connect ( ui_ - > action_equalizer , SIGNAL ( triggered ( ) ) , equalizer_ . get ( ) , SLOT ( show ( ) ) ) ;
2010-08-27 17:42:58 +02:00
connect ( ui_ - > action_transcode , SIGNAL ( triggered ( ) ) , SLOT ( ShowTranscodeDialog ( ) ) ) ;
2010-05-20 16:12:15 +02:00
connect ( ui_ - > action_jump , SIGNAL ( triggered ( ) ) , ui_ - > playlist - > view ( ) , SLOT ( JumpToCurrentlyPlayingTrack ( ) ) ) ;
2010-05-25 22:40:45 +02:00
connect ( ui_ - > action_update_library , SIGNAL ( triggered ( ) ) , library_ , SLOT ( IncrementalScan ( ) ) ) ;
2010-06-14 22:00:17 +02:00
connect ( ui_ - > action_rain , SIGNAL ( toggled ( bool ) ) , player_ , SLOT ( MakeItRain ( bool ) ) ) ;
Fixes issu...
,'``.._ ,'``.
:,--._:)\,:,._,.: All Glory to
:`--,'' :`...';\ the HYPNO TOAD!
`,' `---' `.
/ :
/ \
,' :\.___,-.
`...,---'``````-..._ |: \
( ) ;: ) \ _,-.
`. ( // `' \
: `.// ) ) , ;
,-|`. _,'/ ) ) ,' ,'
( :`.`-..____..=:.-': . _,' ,'
`,'\ ``--....-)=' `._, \ ,') _ '``._
_.-/ _ `. (_) / )' ; / \ \`-.'
`--( `-:`. `' ___..' _,-' |/ `.)
`-. `.`.``-----``--, .'
|/`.\`' ,','); SSt
` (/ (/
2010-07-12 21:51:23 +02:00
connect ( ui_ - > action_hypnotoad , SIGNAL ( toggled ( bool ) ) , player_ , SLOT ( AllHail ( bool ) ) ) ;
2010-08-27 21:09:03 +02:00
connect ( ui_ - > action_queue_manager , SIGNAL ( triggered ( ) ) , SLOT ( ShowQueueManager ( ) ) ) ;
2009-12-24 20:16:07 +01:00
// Give actions to buttons
2010-05-10 23:50:31 +02:00
ui_ - > forward_button - > setDefaultAction ( ui_ - > action_next_track ) ;
ui_ - > back_button - > setDefaultAction ( ui_ - > action_previous_track ) ;
ui_ - > pause_play_button - > setDefaultAction ( ui_ - > action_play_pause ) ;
ui_ - > stop_button - > setDefaultAction ( ui_ - > action_stop ) ;
ui_ - > love_button - > setDefaultAction ( ui_ - > action_love ) ;
ui_ - > ban_button - > setDefaultAction ( ui_ - > action_ban ) ;
2010-06-18 17:07:21 +02:00
ui_ - > clear_playlist_button - > setDefaultAction ( ui_ - > action_clear_playlist ) ;
2010-05-20 16:12:15 +02:00
ui_ - > playlist - > SetActions ( ui_ - > action_new_playlist , ui_ - > action_save_playlist ,
2010-06-18 17:07:21 +02:00
ui_ - > action_load_playlist ) ;
2010-06-11 00:48:23 +02:00
# ifdef ENABLE_VISUALISATIONS
2010-08-27 21:09:03 +02:00
connect ( ui_ - > action_visualisations , SIGNAL ( triggered ( ) ) , SLOT ( ShowVisualisations ( ) ) ) ;
2010-06-11 00:48:23 +02:00
# else
ui_ - > action_visualisations - > setEnabled ( false ) ;
# endif
2009-12-24 20:16:07 +01:00
2010-03-12 02:03:43 +01:00
// Add the shuffle and repeat action groups to the menu
2010-06-16 21:21:15 +02:00
ui_ - > action_shuffle_mode - > setMenu ( ui_ - > playlist_sequence - > shuffle_menu ( ) ) ;
ui_ - > action_repeat_mode - > setMenu ( ui_ - > playlist_sequence - > repeat_menu ( ) ) ;
2010-03-12 02:03:43 +01:00
2009-12-24 20:16:07 +01:00
// Stop actions
QMenu * stop_menu = new QMenu ( this ) ;
2010-05-10 23:50:31 +02:00
stop_menu - > addAction ( ui_ - > action_stop ) ;
stop_menu - > addAction ( ui_ - > action_stop_after_this_track ) ;
ui_ - > stop_button - > setMenu ( stop_menu ) ;
2009-12-24 20:16:07 +01:00
// Player connections
2010-05-10 23:50:31 +02:00
connect ( ui_ - > volume , SIGNAL ( valueChanged ( int ) ) , player_ , SLOT ( SetVolume ( int ) ) ) ;
2009-12-24 20:16:07 +01:00
2010-08-27 21:09:03 +02:00
connect ( player_ , SIGNAL ( Error ( QString ) ) , SLOT ( ShowErrorDialog ( QString ) ) ) ;
2009-12-24 20:16:07 +01:00
connect ( player_ , SIGNAL ( Paused ( ) ) , SLOT ( MediaPaused ( ) ) ) ;
connect ( player_ , SIGNAL ( Playing ( ) ) , SLOT ( MediaPlaying ( ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , SLOT ( MediaStopped ( ) ) ) ;
2010-10-17 21:27:31 +02:00
connect ( player_ , SIGNAL ( TrackSkipped ( PlaylistItemPtr ) ) , SLOT ( TrackSkipped ( PlaylistItemPtr ) ) ) ;
2009-12-24 20:16:07 +01:00
2010-05-20 23:21:55 +02:00
connect ( player_ , SIGNAL ( Paused ( ) ) , playlists_ , SLOT ( SetActivePaused ( ) ) ) ;
connect ( player_ , SIGNAL ( Playing ( ) ) , playlists_ , SLOT ( SetActivePlaying ( ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , playlists_ , SLOT ( SetActiveStopped ( ) ) ) ;
2010-03-10 01:04:04 +01:00
2010-05-20 16:12:15 +02:00
connect ( player_ , SIGNAL ( Paused ( ) ) , ui_ - > playlist - > view ( ) , SLOT ( StopGlowing ( ) ) ) ;
connect ( player_ , SIGNAL ( Playing ( ) ) , ui_ - > playlist - > view ( ) , SLOT ( StartGlowing ( ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , ui_ - > playlist - > view ( ) , SLOT ( StopGlowing ( ) ) ) ;
2010-05-21 00:48:11 +02:00
connect ( player_ , SIGNAL ( Paused ( ) ) , ui_ - > playlist , SLOT ( ActivePaused ( ) ) ) ;
connect ( player_ , SIGNAL ( Playing ( ) ) , ui_ - > playlist , SLOT ( ActivePlaying ( ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , ui_ - > playlist , SLOT ( ActiveStopped ( ) ) ) ;
2010-03-10 01:04:04 +01:00
2010-01-08 15:52:05 +01:00
connect ( player_ , SIGNAL ( Paused ( ) ) , osd_ , SLOT ( Paused ( ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , osd_ , SLOT ( Stopped ( ) ) ) ;
2010-04-19 15:01:57 +02:00
connect ( player_ , SIGNAL ( PlaylistFinished ( ) ) , osd_ , SLOT ( PlaylistFinished ( ) ) ) ;
2010-01-08 17:40:34 +01:00
connect ( player_ , SIGNAL ( VolumeChanged ( int ) ) , osd_ , SLOT ( VolumeChanged ( int ) ) ) ;
2010-05-10 23:50:31 +02:00
connect ( player_ , SIGNAL ( VolumeChanged ( int ) ) , ui_ - > volume , SLOT ( setValue ( int ) ) ) ;
2010-04-13 22:45:40 +02:00
connect ( player_ , SIGNAL ( ForceShowOSD ( Song ) ) , SLOT ( ForceShowOSD ( Song ) ) ) ;
2010-05-20 23:21:55 +02:00
connect ( playlists_ , SIGNAL ( CurrentSongChanged ( Song ) ) , osd_ , SLOT ( SongChanged ( Song ) ) ) ;
connect ( playlists_ , SIGNAL ( CurrentSongChanged ( Song ) ) , player_ , SLOT ( CurrentMetadataChanged ( Song ) ) ) ;
connect ( playlists_ , SIGNAL ( PlaylistChanged ( ) ) , player_ , SLOT ( PlaylistChanged ( ) ) ) ;
connect ( playlists_ , SIGNAL ( EditingFinished ( QModelIndex ) ) , SLOT ( PlaylistEditFinished ( QModelIndex ) ) ) ;
2010-08-27 21:09:03 +02:00
connect ( playlists_ , SIGNAL ( Error ( QString ) ) , SLOT ( ShowErrorDialog ( QString ) ) ) ;
2010-06-16 21:21:15 +02:00
connect ( playlists_ , SIGNAL ( SummaryTextChanged ( QString ) ) , ui_ - > playlist_summary , SLOT ( setText ( QString ) ) ) ;
2010-06-15 20:24:08 +02:00
connect ( playlists_ , SIGNAL ( PlayRequested ( QModelIndex ) ) , SLOT ( PlayIndex ( QModelIndex ) ) ) ;
2009-12-24 20:16:07 +01:00
2010-05-20 16:12:15 +02:00
connect ( ui_ - > playlist - > view ( ) , SIGNAL ( doubleClicked ( QModelIndex ) ) , SLOT ( PlayIndex ( QModelIndex ) ) ) ;
connect ( ui_ - > playlist - > view ( ) , SIGNAL ( PlayPauseItem ( QModelIndex ) ) , SLOT ( PlayIndex ( QModelIndex ) ) ) ;
connect ( ui_ - > playlist - > view ( ) , SIGNAL ( RightClicked ( QPoint , QModelIndex ) ) , SLOT ( PlaylistRightClick ( QPoint , QModelIndex ) ) ) ;
2010-10-17 23:56:19 +02:00
connect ( ui_ - > playlist - > view ( ) , SIGNAL ( SongRatingSet ( QModelIndex , double ) ) , SLOT ( PlaylistSongRated ( QModelIndex , double ) ) ) ;
2010-01-15 18:12:47 +01:00
2010-06-16 21:21:15 +02:00
connect ( ui_ - > track_slider , SIGNAL ( ValueChanged ( int ) ) , player_ , SLOT ( Seek ( int ) ) ) ;
2010-03-06 16:33:57 +01:00
2010-05-09 02:10:26 +02:00
// Database connections
2010-08-27 21:09:03 +02:00
connect ( database_ - > Worker ( ) . get ( ) , SIGNAL ( Error ( QString ) ) , SLOT ( ShowErrorDialog ( QString ) ) ) ;
2010-05-09 02:10:26 +02:00
2009-12-24 20:16:07 +01:00
// Library connections
2010-10-01 21:27:01 +02:00
connect ( library_view_ - > view ( ) , SIGNAL ( doubleClicked ( QModelIndex ) ) , SLOT ( LibraryItemDoubleClicked ( QModelIndex ) ) ) ;
connect ( library_view_ - > view ( ) , SIGNAL ( Load ( QModelIndexList ) ) , SLOT ( LoadLibraryItemToPlaylist ( QModelIndexList ) ) ) ;
connect ( library_view_ - > view ( ) , SIGNAL ( AddToPlaylist ( QModelIndexList ) ) , SLOT ( AddLibraryItemToPlaylist ( QModelIndexList ) ) ) ;
connect ( library_view_ - > view ( ) , SIGNAL ( ShowConfigDialog ( ) ) , SLOT ( ShowLibraryConfig ( ) ) ) ;
connect ( library_ - > model ( ) , SIGNAL ( TotalSongCountUpdated ( int ) ) , library_view_ - > view ( ) , SLOT ( TotalSongCountUpdated ( int ) ) ) ;
2009-12-24 20:16:07 +01:00
2010-06-25 00:59:29 +02:00
connect ( task_manager_ , SIGNAL ( PauseLibraryWatchers ( ) ) , library_ , SLOT ( PauseWatcher ( ) ) ) ;
connect ( task_manager_ , SIGNAL ( ResumeLibraryWatchers ( ) ) , library_ , SLOT ( ResumeWatcher ( ) ) ) ;
2010-06-24 23:46:18 +02:00
2010-07-04 22:52:45 +02:00
// Devices connections
2010-08-27 21:09:03 +02:00
connect ( devices_ , SIGNAL ( Error ( QString ) ) , SLOT ( ShowErrorDialog ( QString ) ) ) ;
2010-10-01 21:27:01 +02:00
connect ( device_view_ , SIGNAL ( Load ( SongList ) ) , SLOT ( LoadDeviceSongsToPlaylist ( SongList ) ) ) ;
connect ( device_view_ , SIGNAL ( AddToPlaylist ( SongList ) ) , SLOT ( AddDeviceSongsToPlaylist ( SongList ) ) ) ;
connect ( device_view_ , SIGNAL ( DoubleClicked ( SongList ) ) , SLOT ( DeviceSongsDoubleClicked ( SongList ) ) ) ;
2010-07-04 22:52:45 +02:00
2010-05-09 22:18:05 +02:00
// Library filter widget
2010-06-09 17:38:00 +02:00
QAction * library_config_action = new QAction (
IconLoader : : Load ( " configure " ) , tr ( " Configure library... " ) , this ) ;
connect ( library_config_action , SIGNAL ( triggered ( ) ) , SLOT ( ShowLibraryConfig ( ) ) ) ;
2010-10-01 21:27:01 +02:00
library_view_ - > filter ( ) - > SetSettingsGroup ( kSettingsGroup ) ;
library_view_ - > filter ( ) - > SetLibraryModel ( library_ - > model ( ) ) ;
library_view_ - > filter ( ) - > AddMenuAction ( library_config_action ) ;
2009-12-24 20:16:07 +01:00
2010-01-15 17:22:19 +01:00
// Playlist menu
2010-02-23 19:33:09 +01:00
playlist_play_pause_ = playlist_menu_ - > addAction ( tr ( " Play " ) , this , SLOT ( PlaylistPlay ( ) ) ) ;
2010-05-10 23:50:31 +02:00
playlist_menu_ - > addAction ( ui_ - > action_stop ) ;
2010-05-19 17:45:29 +02:00
playlist_stop_after_ = playlist_menu_ - > addAction ( IconLoader : : Load ( " media-playback-stop " ) , tr ( " Stop after this track " ) , this , SLOT ( PlaylistStopAfter ( ) ) ) ;
2010-07-11 23:52:00 +02:00
playlist_queue_ = playlist_menu_ - > addAction ( " " , this , SLOT ( PlaylistQueue ( ) ) ) ;
2010-07-26 17:21:56 +02:00
playlist_queue_ - > setShortcut ( QKeySequence ( " Ctrl+D " ) ) ;
ui_ - > playlist - > addAction ( playlist_queue_ ) ;
2010-03-24 01:12:52 +01:00
playlist_menu_ - > addSeparator ( ) ;
2010-05-10 23:50:31 +02:00
playlist_menu_ - > addAction ( ui_ - > action_remove_from_playlist ) ;
2010-05-20 23:21:55 +02:00
playlist_undoredo_ = playlist_menu_ - > addSeparator ( ) ;
2010-05-10 23:50:31 +02:00
playlist_menu_ - > addAction ( ui_ - > action_edit_track ) ;
playlist_menu_ - > addAction ( ui_ - > action_edit_value ) ;
playlist_menu_ - > addAction ( ui_ - > action_renumber_tracks ) ;
playlist_menu_ - > addAction ( ui_ - > action_selection_set_value ) ;
2010-01-15 17:22:19 +01:00
playlist_menu_ - > addSeparator ( ) ;
2010-06-25 01:36:39 +02:00
playlist_copy_to_library_ = playlist_menu_ - > addAction ( IconLoader : : Load ( " edit-copy " ) , tr ( " Copy to library... " ) , this , SLOT ( PlaylistCopyToLibrary ( ) ) ) ;
playlist_move_to_library_ = playlist_menu_ - > addAction ( IconLoader : : Load ( " go-jump " ) , tr ( " Move to library... " ) , this , SLOT ( PlaylistMoveToLibrary ( ) ) ) ;
playlist_organise_ = playlist_menu_ - > addAction ( IconLoader : : Load ( " edit-copy " ) , tr ( " Organise files... " ) , this , SLOT ( PlaylistMoveToLibrary ( ) ) ) ;
2010-08-08 15:06:52 +02:00
playlist_copy_to_device_ = playlist_menu_ - > addAction ( IconLoader : : Load ( " multimedia-player-ipod-mini-blue " ) , tr ( " Copy to device... " ) , this , SLOT ( PlaylistCopyToDevice ( ) ) ) ;
2010-06-25 01:36:39 +02:00
playlist_delete_ = playlist_menu_ - > addAction ( IconLoader : : Load ( " edit-delete " ) , tr ( " Delete files... " ) , this , SLOT ( PlaylistDelete ( ) ) ) ;
playlist_menu_ - > addSeparator ( ) ;
2010-05-10 23:50:31 +02:00
playlist_menu_ - > addAction ( ui_ - > action_clear_playlist ) ;
playlist_menu_ - > addAction ( ui_ - > action_shuffle ) ;
2010-01-15 17:22:19 +01:00
2010-07-26 14:05:50 +02:00
# ifdef Q_OS_DARWIN
ui_ - > action_shuffle - > setShortcut ( QKeySequence ( ) ) ;
# endif
2010-06-25 01:36:39 +02:00
playlist_delete_ - > setVisible ( false ) ; // TODO
2010-05-20 23:21:55 +02:00
connect ( ui_ - > playlist , SIGNAL ( UndoRedoActionsChanged ( QAction * , QAction * ) ) ,
SLOT ( PlaylistUndoRedoChanged ( QAction * , QAction * ) ) ) ;
2010-08-08 15:06:52 +02:00
playlist_copy_to_device_ - > setDisabled ( devices_ - > connected_devices_model ( ) - > rowCount ( ) = = 0 ) ;
connect ( devices_ - > connected_devices_model ( ) , SIGNAL ( IsEmptyChanged ( bool ) ) ,
playlist_copy_to_device_ , SLOT ( setDisabled ( bool ) ) ) ;
2009-12-26 22:35:45 +01:00
// Radio connections
2010-08-27 21:09:03 +02:00
connect ( radio_model_ , SIGNAL ( StreamError ( QString ) ) , SLOT ( ShowErrorDialog ( QString ) ) ) ;
2010-05-18 22:43:10 +02:00
connect ( radio_model_ , SIGNAL ( AsyncLoadFinished ( PlaylistItem : : SpecialLoadResult ) ) , player_ , SLOT ( HandleSpecialLoad ( PlaylistItem : : SpecialLoadResult ) ) ) ;
2010-05-20 23:21:55 +02:00
connect ( radio_model_ , SIGNAL ( StreamMetadataFound ( QUrl , Song ) ) , playlists_ , SLOT ( SetActiveStreamMetadata ( QUrl , Song ) ) ) ;
2010-08-27 17:42:58 +02:00
connect ( radio_model_ , SIGNAL ( OpenSettingsAtPage ( SettingsDialog : : Page ) ) , SLOT ( OpenSettingsDialogAtPage ( SettingsDialog : : Page ) ) ) ;
2009-12-30 02:41:37 +01:00
connect ( radio_model_ , SIGNAL ( AddItemToPlaylist ( RadioItem * ) ) , SLOT ( InsertRadioItem ( RadioItem * ) ) ) ;
2010-05-10 16:19:43 +02:00
connect ( radio_model_ , SIGNAL ( AddItemsToPlaylist ( PlaylistItemList ) ) , SLOT ( InsertRadioItems ( PlaylistItemList ) ) ) ;
2009-12-29 21:48:50 +01:00
connect ( radio_model_ - > GetLastFMService ( ) , SIGNAL ( ScrobblingEnabledChanged ( bool ) ) , SLOT ( ScrobblingEnabledChanged ( bool ) ) ) ;
2010-04-07 21:26:49 +02:00
connect ( radio_model_ - > GetLastFMService ( ) , SIGNAL ( ButtonVisibilityChanged ( bool ) ) , SLOT ( LastFMButtonVisibilityChanged ( bool ) ) ) ;
2010-10-01 21:27:01 +02:00
connect ( radio_view_ - > tree ( ) , SIGNAL ( doubleClicked ( QModelIndex ) ) , SLOT ( RadioDoubleClick ( QModelIndex ) ) ) ;
2010-06-12 22:43:07 +02:00
connect ( radio_model_ - > Service < MagnatuneService > ( ) , SIGNAL ( DownloadFinished ( QStringList ) ) , osd_ , SLOT ( MagnatuneDownloadFinished ( QStringList ) ) ) ;
2009-12-26 22:35:45 +01:00
2010-04-07 21:26:49 +02:00
LastFMButtonVisibilityChanged ( radio_model_ - > GetLastFMService ( ) - > AreButtonsVisible ( ) ) ;
2010-05-28 00:53:07 +02:00
// Connections to the saved streams service
2010-08-27 17:42:58 +02:00
connect ( RadioModel : : Service < SavedRadio > ( ) , SIGNAL ( ShowAddStreamDialog ( ) ) , SLOT ( AddStream ( ) ) ) ;
2010-05-28 00:53:07 +02:00
2010-06-22 16:09:13 +02:00
# ifdef Q_OS_DARWIN
mac : : SetApplicationHandler ( this ) ;
# endif
2009-12-24 20:16:07 +01:00
// Tray icon
2010-06-22 13:52:55 +02:00
tray_icon_ - > SetupMenu ( ui_ - > action_previous_track ,
ui_ - > action_play_pause ,
ui_ - > action_stop ,
ui_ - > action_stop_after_this_track ,
ui_ - > action_next_track ,
ui_ - > action_love ,
ui_ - > action_ban ,
ui_ - > action_quit ) ;
connect ( tray_icon_ , SIGNAL ( PlayPause ( ) ) , player_ , SLOT ( PlayPause ( ) ) ) ;
connect ( tray_icon_ , SIGNAL ( ShowHide ( ) ) , SLOT ( ToggleShowHide ( ) ) ) ;
connect ( tray_icon_ , SIGNAL ( ChangeVolume ( int ) ) , SLOT ( VolumeWheelEvent ( int ) ) ) ;
2010-04-14 21:38:09 +02:00
# ifdef Q_OS_DARWIN
2010-04-15 17:23:12 +02:00
// Add check for updates item to application menu.
2010-06-23 18:50:22 +02:00
QAction * check_updates = ui_ - > menuTools - > addAction ( tr ( " Check for updates... " ) ) ;
2010-04-15 17:23:12 +02:00
check_updates - > setMenuRole ( QAction : : ApplicationSpecificRole ) ;
connect ( check_updates , SIGNAL ( triggered ( bool ) ) , SLOT ( CheckForUpdates ( ) ) ) ;
2010-05-25 15:19:28 +02:00
// Force this menu to be the app "Preferences".
ui_ - > action_configure - > setMenuRole ( QAction : : PreferencesRole ) ;
// Force this menu to be the app "About".
ui_ - > action_about - > setMenuRole ( QAction : : AboutRole ) ;
2010-10-13 16:15:32 +02:00
// Force this menu to be the app "Quit".
ui_ - > action_quit - > setMenuRole ( QAction : : QuitRole ) ;
2010-04-14 21:38:09 +02:00
# endif
2009-12-24 20:16:07 +01:00
2009-12-30 17:24:55 +01:00
// Global shortcuts
2010-05-17 13:06:50 +02:00
connect ( global_shortcuts_ , SIGNAL ( Play ( ) ) , player_ , SLOT ( Play ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( Pause ( ) ) , player_ , SLOT ( Pause ( ) ) ) ;
2010-05-10 23:50:31 +02:00
connect ( global_shortcuts_ , SIGNAL ( PlayPause ( ) ) , ui_ - > action_play_pause , SLOT ( trigger ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( Stop ( ) ) , ui_ - > action_stop , SLOT ( trigger ( ) ) ) ;
2010-05-17 13:06:50 +02:00
connect ( global_shortcuts_ , SIGNAL ( StopAfter ( ) ) , ui_ - > action_stop_after_this_track , SLOT ( trigger ( ) ) ) ;
2010-05-10 23:50:31 +02:00
connect ( global_shortcuts_ , SIGNAL ( Next ( ) ) , ui_ - > action_next_track , SLOT ( trigger ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( Previous ( ) ) , ui_ - > action_previous_track , SLOT ( trigger ( ) ) ) ;
2010-05-17 13:06:50 +02:00
connect ( global_shortcuts_ , SIGNAL ( IncVolume ( ) ) , player_ , SLOT ( VolumeUp ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( DecVolume ( ) ) , player_ , SLOT ( VolumeDown ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( Mute ( ) ) , player_ , SLOT ( Mute ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( SeekForward ( ) ) , player_ , SLOT ( SeekForward ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( SeekBackward ( ) ) , player_ , SLOT ( SeekBackward ( ) ) ) ;
2010-07-24 14:39:09 +02:00
connect ( global_shortcuts_ , SIGNAL ( ShowHide ( ) ) , SLOT ( ToggleShowHide ( ) ) ) ;
connect ( global_shortcuts_ , SIGNAL ( ShowOSD ( ) ) , player_ , SLOT ( ShowOSD ( ) ) ) ;
2010-02-24 23:26:01 +01:00
2010-10-09 20:18:06 +02:00
// Fancy tabs
connect ( ui_ - > tabs , SIGNAL ( ModeChanged ( FancyTabWidget : : Mode ) ) , SLOT ( SaveGeometry ( ) ) ) ;
connect ( ui_ - > tabs , SIGNAL ( CurrentChanged ( int ) ) , SLOT ( SaveGeometry ( ) ) ) ;
2010-09-26 18:00:28 +02:00
// Lyrics
2010-10-10 18:09:20 +02:00
ConnectInfoView ( song_info_view_ ) ;
2010-10-02 18:23:33 +02:00
ConnectInfoView ( artist_info_view_ ) ;
2010-09-26 18:00:28 +02:00
2009-12-24 20:16:07 +01:00
// Analyzer
2010-06-23 17:52:56 +02:00
ui_ - > analyzer - > SetEngine ( player_ - > GetEngine ( ) ) ;
ui_ - > analyzer - > SetActions ( ui_ - > action_visualisations ) ;
2009-12-24 20:16:07 +01:00
2010-04-07 18:26:04 +02:00
// Equalizer
2010-04-14 23:58:51 +02:00
connect ( equalizer_ . get ( ) , SIGNAL ( ParametersChanged ( int , QList < int > ) ) ,
2010-04-12 01:24:03 +02:00
player_ - > GetEngine ( ) , SLOT ( SetEqualizerParameters ( int , QList < int > ) ) ) ;
2010-04-14 23:58:51 +02:00
connect ( equalizer_ . get ( ) , SIGNAL ( EnabledChanged ( bool ) ) ,
2010-04-12 01:24:03 +02:00
player_ - > GetEngine ( ) , SLOT ( SetEqualizerEnabled ( bool ) ) ) ;
player_ - > GetEngine ( ) - > SetEqualizerEnabled ( equalizer_ - > is_enabled ( ) ) ;
player_ - > GetEngine ( ) - > SetEqualizerParameters (
2010-04-08 17:13:34 +02:00
equalizer_ - > preamp_value ( ) , equalizer_ - > gain_values ( ) ) ;
2010-04-07 18:26:04 +02:00
2010-01-15 18:12:47 +01:00
// Statusbar widgets
2010-06-16 21:21:15 +02:00
ui_ - > playlist_summary - > setMinimumWidth ( QFontMetrics ( font ( ) ) . width ( " WW selected of WW tracks - [ WW:WW ] " ) ) ;
ui_ - > status_bar_stack - > setCurrentWidget ( ui_ - > playlist_summary_page ) ;
connect ( ui_ - > multi_loading_indicator , SIGNAL ( TaskCountChange ( int ) ) , SLOT ( TaskCountChanged ( int ) ) ) ;
2010-01-15 18:12:47 +01:00
2010-06-17 00:00:39 +02:00
// Now playing widget
ui_ - > now_playing - > set_ideal_height ( ui_ - > status_bar - > sizeHint ( ) . height ( ) +
ui_ - > player_controls - > sizeHint ( ) . height ( ) +
1 ) ; // Don't question the 1
connect ( playlists_ , SIGNAL ( CurrentSongChanged ( Song ) ) , ui_ - > now_playing , SLOT ( NowPlaying ( Song ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , ui_ - > now_playing , SLOT ( Stopped ( ) ) ) ;
2010-06-18 02:06:59 +02:00
connect ( ui_ - > now_playing , SIGNAL ( ShowAboveStatusBarChanged ( bool ) ) ,
SLOT ( NowPlayingWidgetPositionChanged ( bool ) ) ) ;
Fixes issu...
,'``.._ ,'``.
:,--._:)\,:,._,.: All Glory to
:`--,'' :`...';\ the HYPNO TOAD!
`,' `---' `.
/ :
/ \
,' :\.___,-.
`...,---'``````-..._ |: \
( ) ;: ) \ _,-.
`. ( // `' \
: `.// ) ) , ;
,-|`. _,'/ ) ) ,' ,'
( :`.`-..____..=:.-': . _,' ,'
`,'\ ``--....-)=' `._, \ ,') _ '``._
_.-/ _ `. (_) / )' ; / \ \`-.'
`--( `-:`. `' ___..' _,-' |/ `.)
`-. `.`.``-----``--, .'
|/`.\`' ,','); SSt
` (/ (/
2010-07-12 21:51:23 +02:00
connect ( ui_ - > action_hypnotoad , SIGNAL ( toggled ( bool ) ) , ui_ - > now_playing , SLOT ( AllHail ( bool ) ) ) ;
2010-06-18 02:06:59 +02:00
NowPlayingWidgetPositionChanged ( ui_ - > now_playing - > show_above_status_bar ( ) ) ;
2010-06-17 00:00:39 +02:00
2009-12-24 20:16:07 +01:00
// Load theme
2010-02-27 17:36:25 +01:00
StyleSheetLoader * css_loader = new StyleSheetLoader ( this ) ;
css_loader - > SetStyleSheet ( this , " :mainwindow.css " ) ;
2009-12-24 20:16:07 +01:00
2010-05-20 23:21:55 +02:00
// Load playlists
2010-06-16 21:21:15 +02:00
playlists_ - > Init ( library_ - > backend ( ) , playlist_backend_ , ui_ - > playlist_sequence ) ;
2010-05-20 23:21:55 +02:00
2009-12-24 21:27:32 +01:00
// Load settings
2010-02-27 17:52:18 +01:00
settings_ . beginGroup ( kSettingsGroup ) ;
2009-12-24 20:16:07 +01:00
2010-02-27 17:52:18 +01:00
restoreGeometry ( settings_ . value ( " geometry " ) . toByteArray ( ) ) ;
2010-06-12 21:32:17 +02:00
if ( ! ui_ - > splitter - > restoreState ( settings_ . value ( " splitter_state " ) . toByteArray ( ) ) ) {
ui_ - > splitter - > setSizes ( QList < int > ( ) < < 200 < < width ( ) - 200 ) ;
2009-12-24 20:16:07 +01:00
}
2010-10-09 20:18:06 +02:00
ui_ - > tabs - > SetCurrentIndex ( settings_ . value ( " current_tab " , 0 ) . toInt ( ) ) ;
ui_ - > tabs - > SetMode ( FancyTabWidget : : Mode ( settings_ . value (
2010-10-24 01:39:28 +02:00
" tab_mode " , FancyTabWidget : : Mode_SmallSidebar ) . toInt ( ) ) ) ;
2010-10-01 21:27:01 +02:00
file_view_ - > SetPath ( settings_ . value ( " file_path " , QDir : : homePath ( ) ) . toString ( ) ) ;
2009-12-24 21:27:32 +01:00
2010-05-15 19:45:04 +02:00
ReloadSettings ( ) ;
2010-04-14 23:27:27 +02:00
# ifndef Q_OS_DARWIN
2010-04-07 01:46:34 +02:00
StartupBehaviour behaviour =
StartupBehaviour ( settings_ . value ( " startupbehaviour " , Startup_Remember ) . toInt ( ) ) ;
2010-03-31 05:07:11 +02:00
bool hidden = settings_ . value ( " hidden " , false ) . toBool ( ) ;
2010-04-07 01:46:34 +02:00
switch ( behaviour ) {
case Startup_AlwaysHide : hide ( ) ; break ;
case Startup_AlwaysShow : show ( ) ; break ;
case Startup_Remember : setVisible ( ! hidden ) ; break ;
}
2010-02-26 19:22:44 +01:00
// Force the window to show in case somehow the config has tray and window set to hide
2010-06-22 13:52:55 +02:00
if ( hidden & & ! tray_icon_ - > IsVisible ( ) ) {
2010-02-27 17:52:18 +01:00
settings_ . setValue ( " hidden " , false ) ;
2010-02-26 19:22:44 +01:00
show ( ) ;
}
2010-04-14 23:58:51 +02:00
# else // Q_OS_DARWIN
2010-04-14 21:38:09 +02:00
// Always show mainwindow on startup on OS X.
show ( ) ;
# endif
2009-12-24 20:16:07 +01:00
2010-04-14 23:27:27 +02:00
QShortcut * close_window_shortcut = new QShortcut ( this ) ;
close_window_shortcut - > setKey ( Qt : : CTRL + Qt : : Key_W ) ;
2010-06-17 19:08:56 +02:00
connect ( close_window_shortcut , SIGNAL ( activated ( ) ) , SLOT ( SetHiddenInTray ( ) ) ) ;
2010-04-14 23:27:27 +02:00
2010-03-23 18:26:54 +01:00
library_ - > Init ( ) ;
2009-12-24 20:16:07 +01:00
library_ - > StartThreads ( ) ;
2010-08-27 15:57:39 +02:00
2010-09-01 17:37:09 +02:00
# ifdef ENABLE_WIIMOTEDEV
// http://code.google.com/p/clementine-player/issues/detail?id=670
// Switched position, mayby something is not ready ?
wiimotedev_shortcuts_ . reset ( new WiimotedevShortcuts ( osd_ , this , player_ ) ) ;
# endif
2009-12-24 20:16:07 +01:00
}
MainWindow : : ~ MainWindow ( ) {
SaveGeometry ( ) ;
2010-05-10 23:50:31 +02:00
delete ui_ ;
2010-07-04 01:33:31 +02:00
// It's important that the device manager is deleted before the database.
// Deleting the database deletes all objects that have been created in its
// thread, including some device library backends.
delete devices_ ; devices_ = NULL ;
2009-12-24 20:16:07 +01:00
}
2010-04-07 01:46:34 +02:00
void MainWindow : : ReloadSettings ( ) {
2010-04-14 21:38:09 +02:00
# ifndef Q_OS_DARWIN
2010-04-07 01:46:34 +02:00
bool show_tray = settings_ . value ( " showtray " , true ) . toBool ( ) ;
2010-02-26 19:22:44 +01:00
2010-06-22 13:52:55 +02:00
tray_icon_ - > SetVisible ( show_tray ) ;
2010-04-07 01:46:34 +02:00
if ( ! show_tray & & ! isVisible ( ) )
show ( ) ;
2010-04-14 21:38:09 +02:00
# endif
2010-05-15 19:45:04 +02:00
QSettings library_settings ;
library_settings . beginGroup ( LibraryView : : kSettingsGroup ) ;
autoclear_playlist_ = library_settings . value ( " autoclear_playlist " , false ) . toBool ( ) ;
}
void MainWindow : : AddFilesToPlaylist ( const QList < QUrl > & urls ) {
AddFilesToPlaylist ( false , urls ) ;
2010-02-26 19:22:44 +01:00
}
2010-05-15 19:45:04 +02:00
void MainWindow : : LoadFilesToPlaylist ( const QList < QUrl > & urls ) {
AddFilesToPlaylist ( true , urls ) ;
}
void MainWindow : : FilesDoubleClicked ( const QList < QUrl > & urls ) {
AddFilesToPlaylist ( autoclear_playlist_ , urls ) ;
}
void MainWindow : : AddFilesToPlaylist ( bool clear_first , const QList < QUrl > & urls ) {
if ( clear_first )
2010-05-20 23:21:55 +02:00
playlists_ - > ClearCurrent ( ) ;
2010-05-15 19:45:04 +02:00
2010-06-15 20:24:08 +02:00
AddUrls ( player_ - > GetState ( ) ! = Engine : : Playing , urls ) ;
}
2009-12-24 20:16:07 +01:00
2010-06-15 20:24:08 +02:00
void MainWindow : : AddUrls ( bool play_now , const QList < QUrl > & urls ) {
2010-08-31 21:45:33 +02:00
SongLoaderInserter * inserter =
new SongLoaderInserter ( task_manager_ , library_ - > backend ( ) , this ) ;
2010-08-27 21:09:03 +02:00
connect ( inserter , SIGNAL ( Error ( QString ) ) , SLOT ( ShowErrorDialog ( QString ) ) ) ;
2010-06-15 20:24:08 +02:00
connect ( inserter , SIGNAL ( PlayRequested ( QModelIndex ) ) , SLOT ( PlayIndex ( QModelIndex ) ) ) ;
inserter - > Load ( playlists_ - > current ( ) , - 1 , play_now , urls ) ;
}
2010-06-12 17:18:16 +02:00
void MainWindow : : AddLibrarySongsToPlaylist ( const SongList & songs ) {
AddLibrarySongsToPlaylist ( false , songs ) ;
}
void MainWindow : : LoadLibrarySongsToPlaylist ( const SongList & songs ) {
AddLibrarySongsToPlaylist ( true , songs ) ;
}
void MainWindow : : LibrarySongsDoubleClicked ( const SongList & songs ) {
AddLibrarySongsToPlaylist ( autoclear_playlist_ , songs ) ;
}
void MainWindow : : AddLibrarySongsToPlaylist ( bool clear_first , const SongList & songs ) {
if ( clear_first )
playlists_ - > ClearCurrent ( ) ;
QModelIndex first_song = playlists_ - > current ( ) - > InsertLibraryItems ( songs ) ;
if ( ! playlists_ - > current ( ) - > proxy ( ) - > mapFromSource ( first_song ) . isValid ( ) ) {
2010-07-18 00:53:27 +02:00
// The first song doesn't match the filter, so don't play it
return ;
}
if ( first_song . isValid ( ) & & player_ - > GetState ( ) ! = Engine : : Playing ) {
playlists_ - > SetActiveToCurrent ( ) ;
player_ - > PlayAt ( first_song . row ( ) , Engine : : First , true ) ;
}
}
void MainWindow : : AddDeviceSongsToPlaylist ( const SongList & songs ) {
AddDeviceSongsToPlaylist ( false , songs ) ;
}
void MainWindow : : LoadDeviceSongsToPlaylist ( const SongList & songs ) {
AddDeviceSongsToPlaylist ( true , songs ) ;
}
void MainWindow : : DeviceSongsDoubleClicked ( const SongList & songs ) {
AddDeviceSongsToPlaylist ( autoclear_playlist_ , songs ) ;
}
void MainWindow : : AddDeviceSongsToPlaylist ( bool clear_first , const SongList & songs ) {
if ( clear_first )
playlists_ - > ClearCurrent ( ) ;
QModelIndex first_song = playlists_ - > current ( ) - > InsertSongs ( songs ) ;
if ( ! playlists_ - > current ( ) - > proxy ( ) - > mapFromSource ( first_song ) . isValid ( ) ) {
2010-06-12 17:18:16 +02:00
// The first song doesn't match the filter, so don't play it
return ;
}
if ( first_song . isValid ( ) & & player_ - > GetState ( ) ! = Engine : : Playing ) {
playlists_ - > SetActiveToCurrent ( ) ;
player_ - > PlayAt ( first_song . row ( ) , Engine : : First , true ) ;
}
}
2009-12-24 20:16:07 +01:00
void MainWindow : : MediaStopped ( ) {
2010-05-10 23:50:31 +02:00
ui_ - > action_stop - > setEnabled ( false ) ;
ui_ - > action_stop_after_this_track - > setEnabled ( false ) ;
2010-05-19 17:45:29 +02:00
ui_ - > action_play_pause - > setIcon ( IconLoader : : Load ( " media-playback-start " ) ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_play_pause - > setText ( tr ( " Play " ) ) ;
2009-12-29 17:15:21 +01:00
2010-05-10 23:50:31 +02:00
ui_ - > action_play_pause - > setEnabled ( true ) ;
2009-12-29 20:22:02 +01:00
2010-05-10 23:50:31 +02:00
ui_ - > action_ban - > setEnabled ( false ) ;
ui_ - > action_love - > setEnabled ( false ) ;
2009-12-29 20:57:33 +01:00
track_position_timer_ - > stop ( ) ;
2010-06-16 21:21:15 +02:00
ui_ - > track_slider - > SetStopped ( ) ;
2010-01-17 22:11:03 +01:00
tray_icon_ - > SetProgress ( 0 ) ;
2010-04-19 15:53:26 +02:00
tray_icon_ - > SetStopped ( ) ;
2009-12-24 20:16:07 +01:00
}
void MainWindow : : MediaPaused ( ) {
2010-05-10 23:50:31 +02:00
ui_ - > action_stop - > setEnabled ( true ) ;
ui_ - > action_stop_after_this_track - > setEnabled ( true ) ;
2010-05-19 17:45:29 +02:00
ui_ - > action_play_pause - > setIcon ( IconLoader : : Load ( " media-playback-start " ) ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_play_pause - > setText ( tr ( " Play " ) ) ;
2009-12-29 17:15:21 +01:00
2010-05-10 23:50:31 +02:00
ui_ - > action_play_pause - > setEnabled ( true ) ;
2009-12-29 20:57:33 +01:00
track_position_timer_ - > stop ( ) ;
2010-04-19 15:53:26 +02:00
tray_icon_ - > SetPaused ( ) ;
2009-12-24 20:16:07 +01:00
}
void MainWindow : : MediaPlaying ( ) {
2010-05-10 23:50:31 +02:00
ui_ - > action_stop - > setEnabled ( true ) ;
ui_ - > action_stop_after_this_track - > setEnabled ( true ) ;
2010-05-19 17:45:29 +02:00
ui_ - > action_play_pause - > setIcon ( IconLoader : : Load ( " media-playback-pause " ) ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_play_pause - > setText ( tr ( " Pause " ) ) ;
2009-12-29 17:15:21 +01:00
2010-05-10 23:50:31 +02:00
ui_ - > action_play_pause - > setEnabled (
2010-05-20 23:21:55 +02:00
! ( player_ - > GetCurrentItem ( ) - > options ( ) & PlaylistItem : : PauseDisabled ) ) ;
2009-12-29 20:22:02 +01:00
2010-05-20 23:21:55 +02:00
bool is_lastfm = ( player_ - > GetCurrentItem ( ) - > options ( ) & PlaylistItem : : LastFMControls ) ;
2009-12-29 21:48:50 +01:00
LastFMService * lastfm = radio_model_ - > GetLastFMService ( ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_ban - > setEnabled ( lastfm - > IsScrobblingEnabled ( ) & & is_lastfm ) ;
ui_ - > action_love - > setEnabled ( lastfm - > IsScrobblingEnabled ( ) ) ;
2009-12-29 20:57:33 +01:00
2010-06-16 21:21:15 +02:00
ui_ - > track_slider - > SetCanSeek ( ! is_lastfm ) ;
2010-01-15 18:12:47 +01:00
2009-12-29 20:57:33 +01:00
track_position_timer_ - > start ( ) ;
UpdateTrackPosition ( ) ;
2010-04-19 15:53:26 +02:00
tray_icon_ - > SetPlaying ( ) ;
2009-12-24 20:16:07 +01:00
}
2010-10-17 21:27:31 +02:00
void MainWindow : : TrackSkipped ( PlaylistItemPtr item ) {
// If it was a library item then we have to increment its skipped count in
// the database.
2010-10-24 01:34:56 +02:00
if ( item & & item - > IsLocalLibraryItem ( ) & & ! playlists_ - > active ( ) - > has_scrobbled ( ) ) {
2010-10-17 21:27:31 +02:00
library_ - > backend ( ) - > IncrementSkipCountAsync ( item - > Metadata ( ) . id ( ) ) ;
}
}
2009-12-29 21:48:50 +01:00
void MainWindow : : ScrobblingEnabledChanged ( bool value ) {
2009-12-30 05:14:29 +01:00
if ( ! player_ - > GetState ( ) = = Engine : : Idle )
return ;
2010-05-20 23:21:55 +02:00
bool is_lastfm = ( player_ - > GetCurrentItem ( ) - > options ( ) & PlaylistItem : : LastFMControls ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_ban - > setEnabled ( value & & is_lastfm ) ;
ui_ - > action_love - > setEnabled ( value ) ;
2009-12-29 21:48:50 +01:00
}
2010-04-07 21:26:49 +02:00
void MainWindow : : LastFMButtonVisibilityChanged ( bool value ) {
2010-05-10 23:50:31 +02:00
ui_ - > action_ban - > setVisible ( value ) ;
ui_ - > action_love - > setVisible ( value ) ;
ui_ - > last_fm_controls - > setVisible ( value ) ;
2010-04-07 21:26:49 +02:00
}
2009-12-24 20:16:07 +01:00
void MainWindow : : resizeEvent ( QResizeEvent * ) {
SaveGeometry ( ) ;
}
void MainWindow : : SaveGeometry ( ) {
2010-02-27 17:52:18 +01:00
settings_ . setValue ( " geometry " , saveGeometry ( ) ) ;
2010-06-12 21:32:17 +02:00
settings_ . setValue ( " splitter_state " , ui_ - > splitter - > saveState ( ) ) ;
2010-10-09 20:18:06 +02:00
settings_ . setValue ( " current_tab " , ui_ - > tabs - > current_index ( ) ) ;
settings_ . setValue ( " tab_mode " , ui_ - > tabs - > mode ( ) ) ;
2009-12-24 20:16:07 +01:00
}
void MainWindow : : PlayIndex ( const QModelIndex & index ) {
if ( ! index . isValid ( ) )
return ;
2010-05-25 21:39:04 +02:00
int row = index . row ( ) ;
if ( index . model ( ) = = playlists_ - > current ( ) - > proxy ( ) ) {
// The index was in the proxy model (might've been filtered), so we need
// to get the actual row in the source model.
row = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( index ) . row ( ) ;
}
2010-05-21 12:29:17 +02:00
playlists_ - > SetActiveToCurrent ( ) ;
2010-05-25 21:39:04 +02:00
player_ - > PlayAt ( row , Engine : : Manual , true ) ;
2009-12-24 20:16:07 +01:00
}
2010-06-09 17:49:05 +02:00
void MainWindow : : LoadLibraryItemToPlaylist ( const QModelIndexList & indexes ) {
AddLibraryItemToPlaylist ( true , indexes ) ;
2010-05-15 19:45:04 +02:00
}
2010-06-09 17:49:05 +02:00
void MainWindow : : AddLibraryItemToPlaylist ( const QModelIndexList & indexes ) {
AddLibraryItemToPlaylist ( false , indexes ) ;
2010-05-15 19:45:04 +02:00
}
void MainWindow : : LibraryItemDoubleClicked ( const QModelIndex & index ) {
2010-06-09 17:49:05 +02:00
AddLibraryItemToPlaylist ( autoclear_playlist_ , QModelIndexList ( ) < < index ) ;
2010-05-15 19:45:04 +02:00
}
2010-06-09 17:49:05 +02:00
void MainWindow : : AddLibraryItemToPlaylist ( bool clear_first , const QModelIndexList & indexes ) {
QModelIndexList source_indexes ;
foreach ( const QModelIndex & index , indexes ) {
if ( index . model ( ) = = library_sort_model_ )
source_indexes < < library_sort_model_ - > mapToSource ( index ) ;
else
source_indexes < < index ;
}
2010-04-04 15:31:21 +02:00
2010-06-12 17:18:16 +02:00
AddLibrarySongsToPlaylist ( clear_first , library_ - > model ( ) - > GetChildSongs ( source_indexes ) ) ;
2009-12-24 20:16:07 +01:00
}
void MainWindow : : VolumeWheelEvent ( int delta ) {
2010-05-10 23:50:31 +02:00
ui_ - > volume - > setValue ( ui_ - > volume - > value ( ) + delta / 30 ) ;
2009-12-24 20:16:07 +01:00
}
2010-06-22 13:52:55 +02:00
void MainWindow : : ToggleShowHide ( ) {
if ( settings_ . value ( " hidden " ) . toBool ( ) ) {
show ( ) ;
SetHiddenInTray ( false ) ;
} else if ( isActiveWindow ( ) ) {
hide ( ) ;
setWindowState ( ( windowState ( ) & ~ Qt : : WindowMinimized ) | Qt : : WindowActive ) ;
SetHiddenInTray ( true ) ;
} else if ( isMinimized ( ) ) {
hide ( ) ;
setWindowState ( ( windowState ( ) & ~ Qt : : WindowMinimized ) | Qt : : WindowActive ) ;
SetHiddenInTray ( false ) ;
2010-09-02 15:41:25 +02:00
} else if ( ! isVisible ( ) )
{
show ( ) ;
activateWindow ( ) ;
2010-06-22 13:52:55 +02:00
} else {
// Window is not hidden but does not have focus; bring it to front.
activateWindow ( ) ;
raise ( ) ;
2009-12-24 20:16:07 +01:00
}
}
void MainWindow : : StopAfterCurrent ( ) {
2010-05-20 23:21:55 +02:00
playlists_ - > current ( ) - > StopAfter ( playlists_ - > current ( ) - > current_index ( ) ) ;
2009-12-24 20:16:07 +01:00
}
2010-02-26 19:22:44 +01:00
/**
* Exit if the tray icon is not visible , otherwise ignore and set hidden in tray .
2010-04-14 21:38:09 +02:00
* On OS X , never quit when the main window is closed . This is equivalent to hiding in the tray .
2010-02-26 19:22:44 +01:00
*/
2009-12-24 20:16:07 +01:00
void MainWindow : : closeEvent ( QCloseEvent * event ) {
2010-04-14 21:38:09 +02:00
# ifndef Q_OS_DARWIN
2010-06-22 13:52:55 +02:00
if ( tray_icon_ - > IsVisible ( ) & & event - > spontaneous ( ) ) {
2010-02-26 19:22:44 +01:00
event - > ignore ( ) ;
SetHiddenInTray ( true ) ;
2010-04-07 18:26:04 +02:00
} else {
QApplication : : quit ( ) ;
2010-02-26 19:22:44 +01:00
}
2010-04-14 21:38:09 +02:00
# endif
2009-12-24 20:16:07 +01:00
}
void MainWindow : : SetHiddenInTray ( bool hidden ) {
2010-02-27 17:52:18 +01:00
settings_ . setValue ( " hidden " , hidden ) ;
2010-04-19 16:10:31 +02:00
2010-04-19 16:23:57 +02:00
// Some window managers don't remember maximized state between calls to
// hide() and show(), so we have to remember it ourself.
2010-04-19 16:10:31 +02:00
if ( hidden ) {
was_maximized_ = isMaximized ( ) ;
hide ( ) ;
} else {
if ( was_maximized_ )
showMaximized ( ) ;
else
show ( ) ;
}
2009-12-24 20:16:07 +01:00
}
2009-12-24 21:27:32 +01:00
void MainWindow : : FilePathChanged ( const QString & path ) {
2010-02-27 17:52:18 +01:00
settings_ . setValue ( " file_path " , path ) ;
2009-12-24 21:27:32 +01:00
}
2009-12-29 20:57:33 +01:00
void MainWindow : : UpdateTrackPosition ( ) {
2010-01-17 22:11:03 +01:00
// Track position in seconds
2010-10-17 21:27:31 +02:00
PlaylistItemPtr item ( player_ - > GetCurrentItem ( ) ) ;
2010-01-17 22:11:03 +01:00
const int position = std : : floor ( float ( player_ - > GetEngine ( ) - > position ( ) ) / 1000.0 + 0.5 ) ;
2010-10-17 21:27:31 +02:00
const int length = item - > Metadata ( ) . length ( ) ;
2009-12-29 20:57:33 +01:00
2010-01-18 03:49:07 +01:00
if ( length < = 0 ) {
// Probably a stream that we don't know the length of
2010-06-16 21:21:15 +02:00
ui_ - > track_slider - > SetStopped ( ) ;
2010-01-18 03:49:07 +01:00
tray_icon_ - > SetProgress ( 0 ) ;
return ;
}
2010-01-17 22:11:03 +01:00
// Time to scrobble?
2009-12-29 21:48:50 +01:00
LastFMService * lastfm = radio_model_ - > GetLastFMService ( ) ;
2010-05-20 23:21:55 +02:00
if ( ! playlists_ - > active ( ) - > has_scrobbled ( ) & &
position > = playlists_ - > active ( ) - > scrobble_point ( ) ) {
2009-12-29 21:48:50 +01:00
lastfm - > Scrobble ( ) ;
2010-05-20 23:21:55 +02:00
playlists_ - > active ( ) - > set_scrobbled ( true ) ;
2010-10-17 21:27:31 +02:00
// Update the play count for the song if it's from the library
2010-10-17 23:56:19 +02:00
if ( item - > IsLocalLibraryItem ( ) ) {
2010-10-17 21:27:31 +02:00
library_ - > backend ( ) - > IncrementPlayCountAsync ( item - > Metadata ( ) . id ( ) ) ;
}
2009-12-29 20:57:33 +01:00
}
2010-01-15 18:12:47 +01:00
2010-01-17 22:11:03 +01:00
// Update the slider
2010-06-16 21:21:15 +02:00
ui_ - > track_slider - > SetValue ( position , length ) ;
2010-01-17 22:11:03 +01:00
// Update the tray icon every 10 seconds
2010-10-17 20:26:25 +02:00
if ( position % 10 = = 0 ) {
2010-01-17 22:11:03 +01:00
tray_icon_ - > SetProgress ( double ( position ) / length * 100 ) ;
}
2009-12-29 20:57:33 +01:00
}
2009-12-29 21:48:50 +01:00
void MainWindow : : Love ( ) {
radio_model_ - > GetLastFMService ( ) - > Love ( ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_love - > setEnabled ( false ) ;
2009-12-29 21:48:50 +01:00
}
2009-12-30 00:17:54 +01:00
void MainWindow : : RadioDoubleClick ( const QModelIndex & index ) {
2010-05-15 19:45:04 +02:00
if ( autoclear_playlist_ )
2010-05-20 23:21:55 +02:00
playlists_ - > ClearCurrent ( ) ;
2010-05-15 19:45:04 +02:00
scoped_ptr < QMimeData > data (
radio_model_ - > merged_model ( ) - > mimeData ( QModelIndexList ( ) < < index ) ) ;
if ( ! data )
return ;
2010-06-18 17:31:49 +02:00
if ( player_ - > GetState ( ) ! = Engine : : Playing )
data - > setData ( Playlist : : kPlayNowMimetype , " true " ) ;
int rows = playlists_ - > current ( ) - > rowCount ( ) ;
2010-05-20 23:21:55 +02:00
playlists_ - > current ( ) - > dropMimeData ( data . get ( ) , Qt : : CopyAction , - 1 , 0 , QModelIndex ( ) ) ;
2010-05-15 19:45:04 +02:00
2010-06-18 17:31:49 +02:00
if ( player_ - > GetState ( ) ! = Engine : : Playing & & playlists_ - > current ( ) - > rowCount ( ) > rows ) {
QModelIndex first_song = playlists_ - > current ( ) - > index ( rows , 0 ) ;
if ( ! playlists_ - > current ( ) - > proxy ( ) - > mapFromSource ( first_song ) . isValid ( ) ) {
// The first song doesn't match the filter, so don't play it
return ;
}
2010-05-25 21:39:04 +02:00
2010-05-21 12:29:17 +02:00
playlists_ - > SetActiveToCurrent ( ) ;
2010-05-15 19:45:04 +02:00
player_ - > PlayAt ( first_song . row ( ) , Engine : : First , true ) ;
2010-05-20 23:51:01 +02:00
}
2009-12-30 02:41:37 +01:00
}
void MainWindow : : InsertRadioItem ( RadioItem * item ) {
2010-05-20 23:21:55 +02:00
QModelIndex first_song = playlists_ - > current ( ) - > InsertRadioStations (
2009-12-30 02:41:37 +01:00
QList < RadioItem * > ( ) < < item ) ;
2009-12-30 00:17:54 +01:00
2010-05-25 21:39:04 +02:00
if ( ! playlists_ - > current ( ) - > proxy ( ) - > mapFromSource ( first_song ) . isValid ( ) ) {
// The first song doesn't match the filter, so don't play it
return ;
}
2010-05-20 23:51:01 +02:00
if ( first_song . isValid ( ) & & player_ - > GetState ( ) ! = Engine : : Playing ) {
2010-05-21 12:29:17 +02:00
playlists_ - > SetActiveToCurrent ( ) ;
2010-04-30 01:30:24 +02:00
player_ - > PlayAt ( first_song . row ( ) , Engine : : First , true ) ;
2010-05-20 23:51:01 +02:00
}
2009-12-30 00:17:54 +01:00
}
2010-01-15 17:22:19 +01:00
2010-05-10 16:19:43 +02:00
void MainWindow : : InsertRadioItems ( const PlaylistItemList & items ) {
2010-05-20 23:21:55 +02:00
QModelIndex first_song = playlists_ - > current ( ) - > InsertItems ( items ) ;
2010-05-09 20:36:10 +02:00
2010-05-25 21:39:04 +02:00
if ( ! playlists_ - > current ( ) - > proxy ( ) - > mapFromSource ( first_song ) . isValid ( ) ) {
// The first song doesn't match the filter, so don't play it
return ;
}
2010-05-20 23:51:01 +02:00
if ( first_song . isValid ( ) & & player_ - > GetState ( ) ! = Engine : : Playing ) {
2010-05-21 12:29:17 +02:00
playlists_ - > SetActiveToCurrent ( ) ;
2010-05-09 20:36:10 +02:00
player_ - > PlayAt ( first_song . row ( ) , Engine : : First , true ) ;
2010-05-20 23:51:01 +02:00
}
2010-05-09 20:36:10 +02:00
}
2010-01-15 17:22:19 +01:00
void MainWindow : : PlaylistRightClick ( const QPoint & global_pos , const QModelIndex & index ) {
playlist_menu_index_ = index ;
2010-06-25 01:36:39 +02:00
QModelIndex source_index = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( index ) ;
// Is this song currently playing?
if ( playlists_ - > current ( ) - > current_index ( ) = = source_index . row ( ) & & player_ - > GetState ( ) = = Engine : : Playing ) {
2010-02-23 19:33:09 +01:00
playlist_play_pause_ - > setText ( tr ( " Pause " ) ) ;
2010-05-19 17:45:29 +02:00
playlist_play_pause_ - > setIcon ( IconLoader : : Load ( " media-playback-pause " ) ) ;
2010-01-15 17:22:19 +01:00
} else {
2010-02-23 19:33:09 +01:00
playlist_play_pause_ - > setText ( tr ( " Play " ) ) ;
2010-05-19 17:45:29 +02:00
playlist_play_pause_ - > setIcon ( IconLoader : : Load ( " media-playback-start " ) ) ;
2010-01-15 17:22:19 +01:00
}
2010-06-25 01:36:39 +02:00
// Are we allowed to pause?
2010-01-17 16:48:31 +01:00
if ( index . isValid ( ) ) {
playlist_play_pause_ - > setEnabled (
2010-06-25 01:36:39 +02:00
playlists_ - > current ( ) - > current_index ( ) ! = source_index . row ( ) | |
! ( playlists_ - > current ( ) - > item_at ( source_index . row ( ) ) - > options ( ) & PlaylistItem : : PauseDisabled ) ) ;
2010-01-17 16:48:31 +01:00
} else {
playlist_play_pause_ - > setEnabled ( false ) ;
}
2010-01-15 17:22:19 +01:00
playlist_stop_after_ - > setEnabled ( index . isValid ( ) ) ;
2010-07-11 23:52:00 +02:00
// Are any of the selected songs editable or queued?
2010-05-20 16:12:15 +02:00
QModelIndexList selection = ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selection ( ) . indexes ( ) ;
2010-03-24 01:12:52 +01:00
int editable = 0 ;
2010-07-11 23:52:00 +02:00
int in_queue = 0 ;
int not_in_queue = 0 ;
2010-03-24 17:36:44 +01:00
foreach ( const QModelIndex & index , selection ) {
2010-01-16 17:12:47 +01:00
if ( index . column ( ) ! = 0 )
continue ;
2010-05-20 23:21:55 +02:00
if ( playlists_ - > current ( ) - > item_at ( index . row ( ) ) - > Metadata ( ) . IsEditable ( ) ) {
2010-03-24 01:12:52 +01:00
editable + + ;
2010-01-16 17:12:47 +01:00
}
2010-07-11 23:52:00 +02:00
if ( index . data ( Playlist : : Role_QueuePosition ) . toInt ( ) = = - 1 )
not_in_queue + + ;
else
in_queue + + ;
2010-01-16 17:12:47 +01:00
}
2010-05-10 23:50:31 +02:00
ui_ - > action_edit_track - > setEnabled ( editable ) ;
2010-03-31 21:09:35 +02:00
bool track_column = ( index . column ( ) = = Playlist : : Column_Track ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_renumber_tracks - > setVisible ( editable > = 2 & & track_column ) ;
ui_ - > action_selection_set_value - > setVisible ( editable > = 2 & & ! track_column ) ;
ui_ - > action_edit_value - > setVisible ( editable ) ;
ui_ - > action_remove_from_playlist - > setEnabled ( ! selection . isEmpty ( ) ) ;
2010-03-24 01:12:52 +01:00
2010-06-25 01:36:39 +02:00
playlist_copy_to_library_ - > setVisible ( false ) ;
playlist_move_to_library_ - > setVisible ( false ) ;
playlist_organise_ - > setVisible ( false ) ;
playlist_delete_ - > setVisible ( false ) ;
2010-07-11 23:52:00 +02:00
if ( in_queue = = 1 & & not_in_queue = = 0 )
playlist_queue_ - > setText ( tr ( " Dequeue track " ) ) ;
else if ( in_queue > 1 & & not_in_queue = = 0 )
playlist_queue_ - > setText ( tr ( " Dequeue selected tracks " ) ) ;
else if ( in_queue = = 0 & & not_in_queue = = 1 )
playlist_queue_ - > setText ( tr ( " Queue track " ) ) ;
else if ( in_queue = = 0 & & not_in_queue > 1 )
playlist_queue_ - > setText ( tr ( " Queue selected tracks " ) ) ;
else
playlist_queue_ - > setText ( tr ( " Toggle queue status " ) ) ;
if ( not_in_queue = = 0 )
playlist_queue_ - > setIcon ( IconLoader : : Load ( " go-previous " ) ) ;
else
playlist_queue_ - > setIcon ( IconLoader : : Load ( " go-next " ) ) ;
2010-03-24 17:13:05 +01:00
if ( ! index . isValid ( ) ) {
2010-05-10 23:50:31 +02:00
ui_ - > action_selection_set_value - > setVisible ( false ) ;
ui_ - > action_edit_value - > setVisible ( false ) ;
2010-03-24 17:13:05 +01:00
} else {
Playlist : : Column column = ( Playlist : : Column ) index . column ( ) ;
2010-06-25 01:36:39 +02:00
bool column_is_editable = Playlist : : column_is_editable ( column ) ;
2010-03-26 00:48:58 +01:00
2010-05-10 23:50:31 +02:00
ui_ - > action_selection_set_value - > setVisible (
2010-06-25 01:36:39 +02:00
ui_ - > action_selection_set_value - > isVisible ( ) & & column_is_editable ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_edit_value - > setVisible (
2010-06-25 01:36:39 +02:00
ui_ - > action_edit_value - > isVisible ( ) & & column_is_editable ) ;
2010-03-24 17:13:05 +01:00
QString column_name = Playlist : : column_name ( column ) ;
2010-06-25 01:36:39 +02:00
QString column_value = playlists_ - > current ( ) - > data ( source_index ) . toString ( ) ;
2010-03-24 17:13:05 +01:00
if ( column_value . length ( ) > 25 )
column_value = column_value . left ( 25 ) + " ... " ;
2010-05-10 23:50:31 +02:00
ui_ - > action_selection_set_value - > setText ( tr ( " Set %1 to \" %2 \" ... " )
2010-03-24 17:13:05 +01:00
. arg ( column_name . toLower ( ) ) . arg ( column_value ) ) ;
2010-05-10 23:50:31 +02:00
ui_ - > action_edit_value - > setText ( tr ( " Edit tag \" %1 \" ... " ) . arg ( column_name ) ) ;
2010-06-25 01:36:39 +02:00
// Is it a library item?
2010-10-17 23:56:19 +02:00
if ( playlists_ - > current ( ) - > item_at ( source_index . row ( ) ) - > IsLocalLibraryItem ( ) ) {
2010-06-25 01:36:39 +02:00
playlist_organise_ - > setVisible ( editable ) ;
} else {
playlist_copy_to_library_ - > setVisible ( editable ) ;
playlist_move_to_library_ - > setVisible ( editable ) ;
}
2010-03-24 17:13:05 +01:00
}
2010-01-16 17:12:47 +01:00
2010-01-15 17:22:19 +01:00
playlist_menu_ - > popup ( global_pos ) ;
}
void MainWindow : : PlaylistPlay ( ) {
2010-05-20 23:21:55 +02:00
if ( playlists_ - > current ( ) - > current_index ( ) = = playlist_menu_index_ . row ( ) ) {
2010-01-15 17:22:19 +01:00
player_ - > PlayPause ( ) ;
} else {
2010-05-25 21:39:04 +02:00
PlayIndex ( playlist_menu_index_ ) ;
2010-01-15 17:22:19 +01:00
}
}
void MainWindow : : PlaylistStopAfter ( ) {
2010-05-25 21:39:04 +02:00
playlists_ - > current ( ) - > StopAfter (
playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( playlist_menu_index_ ) . row ( ) ) ;
2010-01-15 17:22:19 +01:00
}
2010-01-16 17:12:47 +01:00
void MainWindow : : EditTracks ( ) {
SongList songs ;
QList < int > rows ;
foreach ( const QModelIndex & index ,
2010-05-20 16:12:15 +02:00
ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selection ( ) . indexes ( ) ) {
2010-01-16 17:12:47 +01:00
if ( index . column ( ) ! = 0 )
continue ;
2010-05-25 21:39:04 +02:00
int row = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( index ) . row ( ) ;
Song song = playlists_ - > current ( ) - > item_at ( row ) - > Metadata ( ) ;
2010-01-16 17:12:47 +01:00
if ( song . IsEditable ( ) ) {
songs < < song ;
rows < < index . row ( ) ;
}
}
2010-08-27 17:42:58 +02:00
EnsureEditTagDialogCreated ( ) ;
2010-01-16 17:12:47 +01:00
edit_tag_dialog_ - > SetSongs ( songs ) ;
2010-05-09 02:10:26 +02:00
edit_tag_dialog_ - > SetTagCompleter ( library_ - > model ( ) - > backend ( ) ) ;
2010-03-29 18:59:01 +02:00
2010-01-16 17:12:47 +01:00
if ( edit_tag_dialog_ - > exec ( ) = = QDialog : : Rejected )
return ;
2010-05-20 23:21:55 +02:00
playlists_ - > current ( ) - > ReloadItems ( rows ) ;
2010-01-16 17:12:47 +01:00
}
2010-01-16 18:52:51 +01:00
2010-03-22 23:46:53 +01:00
void MainWindow : : RenumberTracks ( ) {
2010-05-20 16:12:15 +02:00
QModelIndexList indexes = ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selection ( ) . indexes ( ) ;
2010-03-22 23:46:53 +01:00
int track = 1 ;
2010-04-27 19:15:11 +02:00
// Get the index list in order
qStableSort ( indexes ) ;
2010-03-22 23:46:53 +01:00
// if first selected song has a track number set, start from that offset
if ( indexes . size ( ) ) {
2010-05-20 23:21:55 +02:00
Song first_song = playlists_ - > current ( ) - > item_at ( indexes [ 0 ] . row ( ) ) - > Metadata ( ) ;
2010-03-22 23:46:53 +01:00
if ( int first_track = first_song . track ( ) )
track = first_track ;
}
foreach ( const QModelIndex & index , indexes ) {
if ( index . column ( ) ! = 0 )
continue ;
2010-05-25 21:39:04 +02:00
int row = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( index ) . row ( ) ;
2010-05-20 23:21:55 +02:00
Song song = playlists_ - > current ( ) - > item_at ( row ) - > Metadata ( ) ;
2010-03-22 23:46:53 +01:00
if ( song . IsEditable ( ) ) {
song . set_track ( track ) ;
2010-08-02 16:22:05 +02:00
QFuture < bool > future = song . BackgroundSave ( ) ;
ModelFutureWatcher < bool > * watcher = new ModelFutureWatcher < bool > ( index , this ) ;
watcher - > setFuture ( future ) ;
connect ( watcher , SIGNAL ( finished ( ) ) , SLOT ( SongSaveComplete ( ) ) ) ;
2010-03-22 23:46:53 +01:00
}
track + + ;
}
}
2010-08-02 16:22:05 +02:00
void MainWindow : : SongSaveComplete ( ) {
ModelFutureWatcher < bool > * watcher = static_cast < ModelFutureWatcher < bool > * > ( sender ( ) ) ;
watcher - > deleteLater ( ) ;
if ( watcher - > index ( ) . isValid ( ) ) {
playlists_ - > current ( ) - > item_at ( watcher - > index ( ) . row ( ) ) - > Reload ( ) ;
}
}
2010-03-24 01:12:52 +01:00
void MainWindow : : SelectionSetValue ( ) {
Playlist : : Column column = ( Playlist : : Column ) playlist_menu_index_ . column ( ) ;
2010-05-20 23:21:55 +02:00
QVariant column_value = playlists_ - > current ( ) - > data ( playlist_menu_index_ ) ;
2010-03-24 01:12:52 +01:00
2010-05-20 16:12:15 +02:00
QModelIndexList indexes = ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selection ( ) . indexes ( ) ;
2010-03-24 01:12:52 +01:00
foreach ( const QModelIndex & index , indexes ) {
if ( index . column ( ) ! = 0 )
continue ;
2010-05-25 21:39:04 +02:00
int row = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( index ) . row ( ) ;
2010-05-20 23:21:55 +02:00
Song song = playlists_ - > current ( ) - > item_at ( row ) - > Metadata ( ) ;
2010-03-24 01:12:52 +01:00
2010-03-26 00:48:58 +01:00
if ( Playlist : : set_column_value ( song , column , column_value ) ) {
2010-08-02 16:22:05 +02:00
QFuture < bool > future = song . BackgroundSave ( ) ;
ModelFutureWatcher < bool > * watcher = new ModelFutureWatcher < bool > ( index , this ) ;
watcher - > setFuture ( future ) ;
connect ( watcher , SIGNAL ( finished ( ) ) , SLOT ( SongSaveComplete ( ) ) ) ;
2010-03-24 01:12:52 +01:00
}
}
}
2010-03-26 00:48:58 +01:00
void MainWindow : : EditValue ( ) {
2010-08-30 18:49:10 +02:00
QModelIndex current = ui_ - > playlist - > view ( ) - > currentIndex ( ) ;
if ( ! current . isValid ( ) )
return ;
// Edit the last column that was right-clicked on. If nothing's ever been
// right clicked then look for the first editable column.
int column = playlist_menu_index_ . column ( ) ;
if ( column = = - 1 ) {
for ( int i = 0 ; i < ui_ - > playlist - > view ( ) - > model ( ) - > columnCount ( ) ; + + i ) {
if ( ui_ - > playlist - > view ( ) - > isColumnHidden ( i ) )
continue ;
if ( ! Playlist : : column_is_editable ( Playlist : : Column ( i ) ) )
continue ;
column = i ;
break ;
}
}
ui_ - > playlist - > view ( ) - > edit ( current . sibling ( current . row ( ) , column ) ) ;
2010-03-26 00:48:58 +01:00
}
2010-05-11 22:02:19 +02:00
void MainWindow : : AddFile ( ) {
2010-02-24 23:26:01 +01:00
// Last used directory
2010-02-27 17:52:18 +01:00
QString directory = settings_ . value ( " add_media_path " , QDir : : currentPath ( ) ) . toString ( ) ;
2010-02-24 23:26:01 +01:00
2010-06-15 20:24:08 +02:00
PlaylistParser parser ;
2010-02-24 23:26:01 +01:00
// Show dialog
2010-03-07 15:42:51 +01:00
QStringList file_names = QFileDialog : : getOpenFileNames (
2010-05-03 20:52:35 +02:00
this , tr ( " Add media " ) , directory ,
2010-06-15 20:24:08 +02:00
QString ( " %1;;%2;;%3 " ) . arg ( tr ( kMusicFilterSpec ) , parser . filters ( ) ,
2010-05-03 20:52:35 +02:00
tr ( kAllFilesFilterSpec ) ) ) ;
2010-02-24 23:26:01 +01:00
if ( file_names . isEmpty ( ) )
return ;
// Save last used directory
2010-02-27 17:52:18 +01:00
settings_ . setValue ( " add_media_path " , file_names [ 0 ] ) ;
2010-02-24 23:26:01 +01:00
2010-06-15 20:24:08 +02:00
// Convert to URLs
QList < QUrl > urls ;
2010-02-24 23:26:01 +01:00
foreach ( const QString & path , file_names ) {
2010-06-15 20:24:08 +02:00
urls < < QUrl : : fromLocalFile ( path ) ;
2010-02-24 23:26:01 +01:00
}
2010-06-15 20:24:08 +02:00
AddUrls ( player_ - > GetState ( ) ! = Engine : : Playing , urls ) ;
2010-02-24 23:26:01 +01:00
}
2010-05-11 22:02:19 +02:00
void MainWindow : : AddFolder ( ) {
// Last used directory
QString directory = settings_ . value ( " add_folder_path " , QDir : : currentPath ( ) ) . toString ( ) ;
// Show dialog
directory = QFileDialog : : getExistingDirectory ( this , tr ( " Add folder " ) , directory ) ;
if ( directory . isEmpty ( ) )
return ;
// Save last used directory
settings_ . setValue ( " add_folder_path " , directory ) ;
// Add media
2010-06-15 20:24:08 +02:00
AddUrls ( player_ - > GetState ( ) ! = Engine : : Playing ,
QList < QUrl > ( ) < < QUrl : : fromLocalFile ( directory ) ) ;
2010-05-11 22:02:19 +02:00
}
2010-02-24 23:26:01 +01:00
void MainWindow : : AddStream ( ) {
2010-08-27 17:42:58 +02:00
if ( ! add_stream_dialog_ ) {
add_stream_dialog_ . reset ( new AddStreamDialog ) ;
connect ( add_stream_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , SLOT ( AddStreamAccepted ( ) ) ) ;
add_stream_dialog_ - > set_add_on_accept ( RadioModel : : Service < SavedRadio > ( ) ) ;
}
2010-02-24 23:26:01 +01:00
add_stream_dialog_ - > show ( ) ;
}
void MainWindow : : AddStreamAccepted ( ) {
2010-06-15 20:24:08 +02:00
AddUrls ( player_ - > GetState ( ) ! = Engine : : Playing ,
QList < QUrl > ( ) < < add_stream_dialog_ - > url ( ) ) ;
2010-03-07 21:19:35 +01:00
}
2010-03-24 17:36:44 +01:00
void MainWindow : : PlaylistRemoveCurrent ( ) {
2010-05-20 16:12:15 +02:00
ui_ - > playlist - > view ( ) - > RemoveSelected ( ) ;
2010-03-24 17:36:44 +01:00
}
2010-03-31 02:30:57 +02:00
2010-04-11 19:58:58 +02:00
void MainWindow : : PlaylistEditFinished ( const QModelIndex & index ) {
if ( index = = playlist_menu_index_ )
SelectionSetValue ( ) ;
}
2010-04-13 00:44:29 +02:00
2010-10-17 23:56:19 +02:00
void MainWindow : : PlaylistSongRated ( const QModelIndex & index , double rating ) {
const QModelIndex source_index =
playlists_ - > active ( ) - > proxy ( ) - > mapToSource ( index ) ;
PlaylistItemPtr item ( playlists_ - > active ( ) - > item_at ( source_index . row ( ) ) ) ;
if ( item & & item - > IsLocalLibraryItem ( ) ) {
library_ - > backend ( ) - > UpdateSongRatingAsync ( item - > Metadata ( ) . id ( ) , rating ) ;
}
}
2010-04-13 00:44:29 +02:00
void MainWindow : : CommandlineOptionsReceived ( const QByteArray & serialized_options ) {
if ( serialized_options = = " wake up! " ) {
// Old versions of Clementine sent this - just ignore it
return ;
}
CommandlineOptions options ;
options . Load ( serialized_options ) ;
2010-04-13 01:35:47 +02:00
if ( options . is_empty ( ) ) {
show ( ) ;
activateWindow ( ) ;
}
else
CommandlineOptionsReceived ( options ) ;
2010-04-13 00:44:29 +02:00
}
void MainWindow : : CommandlineOptionsReceived ( const CommandlineOptions & options ) {
switch ( options . player_action ( ) ) {
case CommandlineOptions : : Player_Play :
player_ - > Play ( ) ;
break ;
case CommandlineOptions : : Player_PlayPause :
player_ - > PlayPause ( ) ;
break ;
case CommandlineOptions : : Player_Pause :
player_ - > Pause ( ) ;
break ;
case CommandlineOptions : : Player_Stop :
player_ - > Stop ( ) ;
break ;
case CommandlineOptions : : Player_Previous :
player_ - > Previous ( ) ;
break ;
case CommandlineOptions : : Player_Next :
2010-04-30 01:30:24 +02:00
player_ - > Next ( ) ;
2010-04-13 00:44:29 +02:00
break ;
case CommandlineOptions : : Player_None :
break ;
}
switch ( options . url_list_action ( ) ) {
case CommandlineOptions : : UrlList_Load :
2010-05-20 23:21:55 +02:00
playlists_ - > ClearCurrent ( ) ;
2010-04-13 00:44:29 +02:00
// fallthrough
case CommandlineOptions : : UrlList_Append :
2010-06-15 20:24:08 +02:00
AddUrls ( player_ - > GetState ( ) ! = Engine : : Playing , options . urls ( ) ) ;
2010-04-13 00:44:29 +02:00
break ;
}
2010-04-13 01:35:47 +02:00
if ( options . set_volume ( ) ! = - 1 )
player_ - > SetVolume ( options . set_volume ( ) ) ;
if ( options . volume_modifier ( ) ! = 0 )
player_ - > SetVolume ( player_ - > GetVolume ( ) + options . volume_modifier ( ) ) ;
if ( options . seek_to ( ) ! = - 1 )
player_ - > Seek ( options . seek_to ( ) ) ;
2010-04-13 22:22:29 +02:00
else if ( options . seek_by ( ) ! = 0 )
player_ - > Seek ( player_ - > PositionGet ( ) / 1000 + options . seek_by ( ) ) ;
2010-04-13 01:35:47 +02:00
if ( options . play_track_at ( ) ! = - 1 )
2010-04-30 01:30:24 +02:00
player_ - > PlayAt ( options . play_track_at ( ) , Engine : : Manual , true ) ;
2010-04-13 01:35:47 +02:00
if ( options . show_osd ( ) )
player_ - > ShowOSD ( ) ;
2010-04-13 00:44:29 +02:00
}
2010-04-13 22:45:40 +02:00
void MainWindow : : ForceShowOSD ( const Song & song ) {
osd_ - > ForceShowNextNotification ( ) ;
osd_ - > SongChanged ( song ) ;
}
2010-04-14 23:27:27 +02:00
2010-06-14 15:22:45 +02:00
void MainWindow : : Activate ( ) {
show ( ) ;
}
2010-06-15 23:56:33 +02:00
bool MainWindow : : LoadUrl ( const QString & url ) {
if ( ! QFile : : exists ( url ) )
return false ;
QList < QUrl > urls ;
urls < < QUrl : : fromLocalFile ( url ) ;
AddUrls ( true , urls ) ; // Always play now as this was a direct request from Finder.
return true ;
}
2010-04-15 17:23:12 +02:00
void MainWindow : : CheckForUpdates ( ) {
# ifdef Q_OS_DARWIN
mac : : CheckForUpdates ( ) ;
# endif
}
2010-05-20 23:21:55 +02:00
void MainWindow : : PlaylistUndoRedoChanged ( QAction * undo , QAction * redo ) {
playlist_menu_ - > insertAction ( playlist_undoredo_ , undo ) ;
playlist_menu_ - > insertAction ( playlist_undoredo_ , redo ) ;
}
2010-06-09 17:38:00 +02:00
void MainWindow : : ShowLibraryConfig ( ) {
2010-08-27 17:42:58 +02:00
EnsureSettingsDialogCreated ( ) ;
2010-06-09 17:38:00 +02:00
settings_dialog_ - > OpenAtPage ( SettingsDialog : : Page_Library ) ;
}
2010-06-16 21:21:15 +02:00
void MainWindow : : TaskCountChanged ( int count ) {
if ( count = = 0 ) {
ui_ - > status_bar_stack - > setCurrentWidget ( ui_ - > playlist_summary_page ) ;
} else {
ui_ - > status_bar_stack - > setCurrentWidget ( ui_ - > multi_loading_indicator ) ;
}
}
2010-06-18 02:06:59 +02:00
void MainWindow : : NowPlayingWidgetPositionChanged ( bool above_status_bar ) {
if ( above_status_bar ) {
ui_ - > status_bar - > setParent ( ui_ - > centralWidget ) ;
} else {
ui_ - > status_bar - > setParent ( ui_ - > player_controls_container ) ;
}
ui_ - > status_bar - > parentWidget ( ) - > layout ( ) - > addWidget ( ui_ - > status_bar ) ;
ui_ - > status_bar - > show ( ) ;
}
2010-06-24 18:26:49 +02:00
void MainWindow : : CopyFilesToLibrary ( const QList < QUrl > & urls ) {
2010-08-08 15:06:52 +02:00
organise_dialog_ - > SetDestinationModel ( library_ - > model ( ) - > directory_model ( ) ) ;
2010-06-24 18:26:49 +02:00
organise_dialog_ - > SetUrls ( urls ) ;
2010-06-24 22:26:17 +02:00
organise_dialog_ - > SetCopy ( true ) ;
2010-06-24 18:26:49 +02:00
organise_dialog_ - > show ( ) ;
}
void MainWindow : : MoveFilesToLibrary ( const QList < QUrl > & urls ) {
2010-08-08 15:06:52 +02:00
organise_dialog_ - > SetDestinationModel ( library_ - > model ( ) - > directory_model ( ) ) ;
2010-06-24 18:26:49 +02:00
organise_dialog_ - > SetUrls ( urls ) ;
2010-06-24 22:26:17 +02:00
organise_dialog_ - > SetCopy ( false ) ;
2010-06-24 18:26:49 +02:00
organise_dialog_ - > show ( ) ;
}
2010-06-25 01:36:39 +02:00
2010-09-18 11:54:33 +02:00
void MainWindow : : CopyFilesToDevice ( const QList < QUrl > & urls ) {
organise_dialog_ - > SetDestinationModel ( devices_ - > connected_devices_model ( ) , true ) ;
organise_dialog_ - > SetCopy ( true ) ;
if ( organise_dialog_ - > SetUrls ( urls ) )
organise_dialog_ - > show ( ) ;
else {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " None of the selected songs were suitable for copying to a device " ) ) ;
}
}
2010-06-25 01:36:39 +02:00
void MainWindow : : PlaylistCopyToLibrary ( ) {
PlaylistOrganiseSelected ( true ) ;
}
void MainWindow : : PlaylistMoveToLibrary ( ) {
PlaylistOrganiseSelected ( false ) ;
}
void MainWindow : : PlaylistOrganiseSelected ( bool copy ) {
2010-08-08 15:06:52 +02:00
QModelIndexList proxy_indexes = ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selectedRows ( ) ;
SongList songs ;
2010-06-25 01:36:39 +02:00
2010-08-08 15:06:52 +02:00
foreach ( const QModelIndex & proxy_index , proxy_indexes ) {
QModelIndex index = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( proxy_index ) ;
2010-06-25 01:36:39 +02:00
2010-08-08 15:06:52 +02:00
songs < < playlists_ - > current ( ) - > item_at ( index . row ( ) ) - > Metadata ( ) ;
2010-06-25 01:36:39 +02:00
}
2010-08-08 15:06:52 +02:00
organise_dialog_ - > SetDestinationModel ( library_ - > model ( ) - > directory_model ( ) ) ;
organise_dialog_ - > SetSongs ( songs ) ;
2010-06-25 01:36:39 +02:00
organise_dialog_ - > SetCopy ( copy ) ;
organise_dialog_ - > show ( ) ;
}
void MainWindow : : PlaylistDelete ( ) {
2010-07-11 17:37:40 +02:00
// TODO
}
2010-06-25 01:36:39 +02:00
2010-07-11 17:37:40 +02:00
void MainWindow : : PlaylistQueue ( ) {
2010-07-11 18:58:22 +02:00
QModelIndexList indexes ;
foreach ( const QModelIndex & proxy_index ,
ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selectedRows ( ) ) {
indexes < < playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( proxy_index ) ;
}
2010-07-11 17:37:40 +02:00
playlists_ - > current ( ) - > queue ( ) - > ToggleTracks ( indexes ) ;
2010-06-25 01:36:39 +02:00
}
2010-08-08 15:06:52 +02:00
void MainWindow : : PlaylistCopyToDevice ( ) {
QModelIndexList proxy_indexes = ui_ - > playlist - > view ( ) - > selectionModel ( ) - > selectedRows ( ) ;
SongList songs ;
foreach ( const QModelIndex & proxy_index , proxy_indexes ) {
QModelIndex index = playlists_ - > current ( ) - > proxy ( ) - > mapToSource ( proxy_index ) ;
songs < < playlists_ - > current ( ) - > item_at ( index . row ( ) ) - > Metadata ( ) ;
}
organise_dialog_ - > SetDestinationModel ( devices_ - > connected_devices_model ( ) , true ) ;
organise_dialog_ - > SetCopy ( true ) ;
2010-09-15 22:00:17 +02:00
if ( organise_dialog_ - > SetSongs ( songs ) )
organise_dialog_ - > show ( ) ;
else {
QMessageBox : : warning ( this , tr ( " Error " ) ,
tr ( " None of the selected songs were suitable for copying to a device " ) ) ;
}
2010-08-08 15:06:52 +02:00
}
2010-08-27 17:42:58 +02:00
void MainWindow : : ShowCoverManager ( ) {
if ( ! cover_manager_ ) {
2010-10-16 19:20:54 +02:00
cover_manager_ . reset ( new AlbumCoverManager ( library_ - > backend ( ) ) ) ;
2010-08-27 17:42:58 +02:00
cover_manager_ - > Init ( ) ;
// Cover manager connections
connect ( cover_manager_ . get ( ) , SIGNAL ( AddSongsToPlaylist ( SongList ) ) , SLOT ( AddLibrarySongsToPlaylist ( SongList ) ) ) ;
connect ( cover_manager_ . get ( ) , SIGNAL ( LoadSongsToPlaylist ( SongList ) ) , SLOT ( LoadLibrarySongsToPlaylist ( SongList ) ) ) ;
connect ( cover_manager_ . get ( ) , SIGNAL ( SongsDoubleClicked ( SongList ) ) , SLOT ( LibrarySongsDoubleClicked ( SongList ) ) ) ;
}
cover_manager_ - > show ( ) ;
}
void MainWindow : : EnsureSettingsDialogCreated ( ) {
if ( settings_dialog_ )
return ;
settings_dialog_ . reset ( new SettingsDialog ) ;
settings_dialog_ - > SetLibraryDirectoryModel ( library_ - > model ( ) - > directory_model ( ) ) ;
# ifdef HAVE_GSTREAMER
if ( GstEngine * engine = qobject_cast < GstEngine * > ( player_ - > GetEngine ( ) ) ) {
settings_dialog_ - > SetGstEngine ( engine ) ;
}
# endif
settings_dialog_ - > SetGlobalShortcutManager ( global_shortcuts_ ) ;
2010-10-10 18:46:35 +02:00
settings_dialog_ - > SetSongInfoView ( song_info_view_ ) ;
2010-08-27 17:42:58 +02:00
// Settings
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , SLOT ( ReloadSettings ( ) ) ) ;
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , library_ , SLOT ( ReloadSettings ( ) ) ) ;
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , player_ , SLOT ( ReloadSettings ( ) ) ) ;
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , osd_ , SLOT ( ReloadSettings ( ) ) ) ;
2010-10-10 18:46:35 +02:00
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , library_view_ - > view ( ) , SLOT ( ReloadSettings ( ) ) ) ;
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , song_info_view_ , SLOT ( ReloadSettings ( ) ) ) ;
2010-08-27 17:42:58 +02:00
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , player_ - > GetEngine ( ) , SLOT ( ReloadSettings ( ) ) ) ;
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , ui_ - > playlist - > view ( ) , SLOT ( ReloadSettings ( ) ) ) ;
2010-08-31 22:35:11 +02:00
# ifdef ENABLE_WIIMOTEDEV
2010-08-30 19:31:42 +02:00
connect ( settings_dialog_ . get ( ) , SIGNAL ( accepted ( ) ) , wiimotedev_shortcuts_ . get ( ) , SLOT ( ReloadSettings ( ) ) ) ;
2010-08-31 22:35:11 +02:00
connect ( settings_dialog_ . get ( ) , SIGNAL ( SetWiimotedevInterfaceActived ( bool ) ) , wiimotedev_shortcuts_ . get ( ) , SLOT ( SetWiimotedevInterfaceActived ( bool ) ) ) ;
# endif
2010-08-27 17:42:58 +02:00
}
void MainWindow : : OpenSettingsDialog ( ) {
EnsureSettingsDialogCreated ( ) ;
settings_dialog_ - > show ( ) ;
}
void MainWindow : : OpenSettingsDialogAtPage ( SettingsDialog : : Page page ) {
EnsureSettingsDialogCreated ( ) ;
settings_dialog_ - > OpenAtPage ( page ) ;
}
void MainWindow : : EnsureEditTagDialogCreated ( ) {
if ( edit_tag_dialog_ )
return ;
edit_tag_dialog_ . reset ( new EditTagDialog ) ;
}
void MainWindow : : ShowAboutDialog ( ) {
if ( ! about_dialog_ ) {
about_dialog_ . reset ( new About ) ;
}
about_dialog_ - > show ( ) ;
}
void MainWindow : : ShowTranscodeDialog ( ) {
# ifdef HAVE_GSTREAMER
if ( ! transcode_dialog_ ) {
transcode_dialog_ . reset ( new TranscodeDialog ) ;
}
transcode_dialog_ - > show ( ) ;
# endif
}
2010-08-27 21:09:03 +02:00
void MainWindow : : ShowErrorDialog ( const QString & message ) {
if ( ! error_dialog_ ) {
error_dialog_ . reset ( new ErrorDialog ) ;
}
error_dialog_ - > ShowMessage ( message ) ;
}
void MainWindow : : ShowQueueManager ( ) {
if ( ! queue_manager_ ) {
queue_manager_ . reset ( new QueueManager ) ;
queue_manager_ - > SetPlaylistManager ( playlists_ ) ;
}
queue_manager_ - > show ( ) ;
}
void MainWindow : : ShowVisualisations ( ) {
# ifdef ENABLE_VISUALISATIONS
if ( ! visualisation_ ) {
visualisation_ . reset ( new VisualisationContainer ) ;
visualisation_ - > SetActions ( ui_ - > action_previous_track , ui_ - > action_play_pause ,
ui_ - > action_stop , ui_ - > action_next_track ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , visualisation_ . get ( ) , SLOT ( Stopped ( ) ) ) ;
connect ( player_ , SIGNAL ( ForceShowOSD ( Song ) ) , visualisation_ . get ( ) , SLOT ( SongMetadataChanged ( Song ) ) ) ;
connect ( playlists_ , SIGNAL ( CurrentSongChanged ( Song ) ) , visualisation_ . get ( ) , SLOT ( SongMetadataChanged ( Song ) ) ) ;
# ifdef HAVE_GSTREAMER
if ( GstEngine * engine = qobject_cast < GstEngine * > ( player_ - > GetEngine ( ) ) )
visualisation_ - > SetEngine ( engine ) ;
# endif
}
visualisation_ - > show ( ) ;
# endif // ENABLE_VISUALISATIONS
}
2010-10-01 21:27:01 +02:00
2010-10-02 15:37:10 +02:00
void MainWindow : : ConnectInfoView ( SongInfoBase * view ) {
connect ( playlists_ , SIGNAL ( CurrentSongChanged ( Song ) ) , view , SLOT ( SongChanged ( Song ) ) ) ;
connect ( player_ , SIGNAL ( PlaylistFinished ( ) ) , view , SLOT ( SongFinished ( ) ) ) ;
connect ( player_ , SIGNAL ( Stopped ( ) ) , view , SLOT ( SongFinished ( ) ) ) ;
2010-10-16 16:45:23 +02:00
connect ( view , SIGNAL ( ShowSettingsDialog ( ) ) , SLOT ( ShowSongInfoConfig ( ) ) ) ;
2010-10-16 17:22:14 +02:00
connect ( view , SIGNAL ( AddPlaylistItems ( PlaylistItemList ) ) , SLOT ( InsertRadioItems ( PlaylistItemList ) ) ) ;
2010-10-16 16:45:23 +02:00
}
void MainWindow : : ShowSongInfoConfig ( ) {
OpenSettingsDialogAtPage ( SettingsDialog : : Page_SongInformation ) ;
2010-10-02 15:37:10 +02:00
}