playlistwindow.cpp
来自「Amarok是一款在LINUX或其他类UNIX操作系统中运行的音频播放器软件。 」· C++ 代码 · 共 1,244 行 · 第 1/4 页
CPP
1,244 行
//BEGIN Actions menu KPopupMenu *actionsMenu = new KPopupMenu( m_menubar ); actionCollection()->action("playlist_playmedia")->plug( actionsMenu ); actionCollection()->action("lastfm_play")->plug( actionsMenu ); actionCollection()->action("play_audiocd")->plug( actionsMenu ); actionsMenu->insertSeparator(); actionCollection()->action("prev")->plug( actionsMenu ); actionCollection()->action("play_pause")->plug( actionsMenu ); actionCollection()->action("stop")->plug( actionsMenu ); actionCollection()->action("next")->plug( actionsMenu ); actionsMenu->insertSeparator(); actionCollection()->action(KStdAction::name(KStdAction::Quit))->plug( actionsMenu ); connect( actionsMenu, SIGNAL( aboutToShow() ), SLOT( actionsMenuAboutToShow() ) ); //END Actions menu //BEGIN Playlist menu KPopupMenu *playlistMenu = new KPopupMenu( m_menubar ); actionCollection()->action("playlist_add")->plug( playlistMenu ); actionCollection()->action("stream_add")->plug( playlistMenu ); actionCollection()->action("lastfm_add")->plug( playlistMenu ); actionCollection()->action("playlist_save")->plug( playlistMenu ); actionCollection()->action("playlist_burn")->plug( playlistMenu ); playlistMenu->insertSeparator(); actionCollection()->action("playlist_undo")->plug( playlistMenu ); actionCollection()->action("playlist_redo")->plug( playlistMenu ); playlistMenu->insertSeparator(); actionCollection()->action("playlist_clear")->plug( playlistMenu ); actionCollection()->action("playlist_shuffle")->plug( playlistMenu ); //this one has no real context with regard to the menu //actionCollection()->action("playlist_copy")->plug( playlistMenu ); playlistMenu->insertSeparator(); actionCollection()->action("queue_selected")->plug( playlistMenu ); actionCollection()->action("playlist_remove_duplicates")->plug( playlistMenu ); actionCollection()->action("playlist_select_all")->plug( playlistMenu ); //END Playlist menu //BEGIN Mode menu KPopupMenu *modeMenu = new KPopupMenu( m_menubar ); actionCollection()->action("repeat")->plug( modeMenu ); KSelectAction *random = static_cast<KSelectAction*>( actionCollection()->action("random_mode") ); random->plug( modeMenu ); random->popupMenu()->insertSeparator(); actionCollection()->action("favor_tracks")->plug( random->popupMenu() ); //END Mode menu //BEGIN Tools menu m_toolsMenu = new KPopupMenu( m_menubar ); m_toolsMenu->insertItem( SmallIconSet( Amarok::icon( "covermanager" ) ), i18n("&Cover Manager"), Amarok::Menu::ID_SHOW_COVER_MANAGER ); actionCollection()->action("queue_manager")->plug( m_toolsMenu ); m_toolsMenu->insertItem( SmallIconSet( Amarok::icon( "visualizations" ) ), i18n("&Visualizations"), Amarok::Menu::ID_SHOW_VIS_SELECTOR ); m_toolsMenu->insertItem( SmallIconSet( Amarok::icon( "equalizer") ), i18n("&Equalizer"), kapp, SLOT( slotConfigEqualizer() ), 0, Amarok::Menu::ID_CONFIGURE_EQUALIZER ); actionCollection()->action("script_manager")->plug( m_toolsMenu ); actionCollection()->action("statistics")->plug( m_toolsMenu ); m_toolsMenu->insertSeparator(); actionCollection()->action("update_collection")->plug( m_toolsMenu ); m_toolsMenu->insertItem( SmallIconSet( Amarok::icon( "rescan" ) ), i18n("&Rescan Collection"), Amarok::Menu::ID_RESCAN_COLLECTION ); #if defined HAVE_LIBVISUAL m_toolsMenu->setItemEnabled( Amarok::Menu::ID_SHOW_VIS_SELECTOR, true ); #else m_toolsMenu->setItemEnabled( Amarok::Menu::ID_SHOW_VIS_SELECTOR, false ); #endif connect( m_toolsMenu, SIGNAL( aboutToShow() ), SLOT( toolsMenuAboutToShow() ) ); connect( m_toolsMenu, SIGNAL( activated(int) ), SLOT( slotMenuActivated(int) ) ); //END Tools menu //BEGIN Settings menu m_settingsMenu = new KPopupMenu( m_menubar ); //TODO use KStdAction or KMainWindow#ifndef Q_WS_MAC m_settingsMenu->insertItem( AmarokConfig::showToolbar() ? i18n( "Hide Toolbar" ) : i18n("Show Toolbar"), ID_SHOW_TOOLBAR ); m_settingsMenu->insertItem( AmarokConfig::showPlayerWindow() ? i18n("Hide Player &Window") : i18n("Show Player &Window"), ID_SHOW_PLAYERWINDOW ); m_settingsMenu->insertSeparator();#endif#ifdef Q_WS_MAC // plug it first, as this item will be moved to the applications first menu actionCollection()->action(KStdAction::name(KStdAction::Preferences))->plug( m_settingsMenu );#endif actionCollection()->action("options_configure_globals")->plug( m_settingsMenu ); actionCollection()->action(KStdAction::name(KStdAction::KeyBindings))->plug( m_settingsMenu ); actionCollection()->action(KStdAction::name(KStdAction::ConfigureToolbars))->plug( m_settingsMenu ); actionCollection()->action(KStdAction::name(KStdAction::Preferences))->plug( m_settingsMenu ); connect( m_settingsMenu, SIGNAL( activated(int) ), SLOT( slotMenuActivated(int) ) ); //END Settings menu m_menubar->insertItem( i18n( "E&ngage" ), actionsMenu ); m_menubar->insertItem( i18n( "&Playlist" ), playlistMenu ); m_menubar->insertItem( i18n( "&Mode" ), modeMenu ); m_menubar->insertItem( i18n( "&Tools" ), m_toolsMenu ); m_menubar->insertItem( i18n( "&Settings" ), m_settingsMenu ); m_menubar->insertItem( i18n( "&Help" ), Amarok::Menu::helpMenu() ); QBoxLayout *layV = new QVBoxLayout( this ); layV->addWidget( m_menubar ); layV->addWidget( m_browsers, 1 ); layV->addWidget( m_toolbar ); layV->addSpacing( 2 ); layV->addWidget( statusbar ); //The volume slider later becomes our FocusProxy, so all wheelEvents get redirected to it m_toolbar->setFocusPolicy( QWidget::WheelFocus ); m_toolbar->setFlat( true ); m_toolbar->setMovingEnabled( false ); playlist->setMargin( 2 ); playlist->installEventFilter( this ); //we intercept keyEvents //<XMLGUI> { QString xmlFile = Amarok::config()->readEntry( "XMLFile", "amarokui.rc" ); // this bug can bite you if you are a pre 1.2 user, we // deleted amarokui_first.rc, but we must still support it // NOTE 1.4.1 we remove amarokui_xmms.rc too, so we can only be this ui.rc xmlFile = "amarokui.rc"; setXMLFile( xmlFile ); createGUI(); //NOTE we implement this } //</XMLGUI> //<Browsers> { Debug::Block block( "Creating browsers. Please report long start times!" ); #define addBrowserMacro( Type, name, text, icon ) { \ Debug::Block block( name ); \ m_browsers->addBrowser( name, new Type( name ), text, icon ); } #define addInstBrowserMacro( Type, name, text, icon ) { \ Debug::Block block( name ); \ m_browsers->addBrowser( name, Type::instance(), text, icon ); } addBrowserMacro( ContextBrowser, "ContextBrowser", i18n("Context"), Amarok::icon( "info" ) ) addBrowserMacro( CollectionBrowser, "CollectionBrowser", i18n("Collection"), Amarok::icon( "collection" ) ) m_browsers->makeDropProxy( "CollectionBrowser", CollectionView::instance() ); addInstBrowserMacro( PlaylistBrowser, "PlaylistBrowser", i18n("Playlists"), Amarok::icon( "playlist" ) ) //DEBUG: Comment out the addBrowserMacro line and uncomment the m_browsers line (passing in a vfat device name) to see the "virtual root" functionality addBrowserMacro( FileBrowser, "FileBrowser", i18n("Files"), Amarok::icon( "files" ) ) //Add Magnatune browser addInstBrowserMacro( MagnatuneBrowser, "MagnatuneBrowser", i18n("Magnatune"), Amarok::icon( "magnatune" ) ) new MediaBrowser( "MediaBrowser" ); if( MediaBrowser::isAvailable() ) { addInstBrowserMacro( MediaBrowser, "MediaBrowser", i18n("Devices"), Amarok::icon( "device" ) ) //to re-enable mediabrowser hiding, uncomment this: //connect( MediaBrowser::instance(), SIGNAL( availabilityChanged( bool ) ), // this, SLOT( mbAvailabilityChanged( bool ) ) ); m_browsers->makeDropProxy( "MediaBrowser", MediaBrowser::queue() ); } #undef addBrowserMacro #undef addInstBrowserMacro } //</Browsers> connect( Playlist::instance()->qscrollview(), SIGNAL( dynamicModeChanged( const DynamicMode* ) ), PlaylistBrowser::instance(), SLOT( loadDynamicItems() ) ); qApp->installEventFilter( this ); // keyboards shortcuts for the browsers connect( playlist, SIGNAL( itemCountChanged( int, int, int, int, int, int ) ), statusbar, SLOT( slotItemCountChanged( int, int, int, int, int, int ) ) ); connect( playlist, SIGNAL( queueChanged( const PLItemList &, const PLItemList & ) ), statusbar, SLOT( updateQueueLabel() ) ); connect( playlist, SIGNAL( aboutToClear() ), m_lineEdit, SLOT( clear() ) ); Amarok::MessageQueue::instance()->sendMessages();}void PlaylistWindow::slotSetFilter( const QString &filter ) //SLOT{ m_lineEdit->setText( filter );}void PlaylistWindow::slotEditFilter() //SLOT{ EditFilterDialog *fd = new EditFilterDialog( this, true, m_lineEdit->text() ); connect( fd, SIGNAL(filterChanged(const QString &)), SLOT(slotSetFilter(const QString &)) ); if( fd->exec() ) m_lineEdit->setText( fd->filter() ); delete fd;}void PlaylistWindow::addBrowser( const QString &name, QWidget *browser, const QString &text, const QString &icon ){ if( !m_browsers->browser( name ) ) m_browsers->addBrowser( name, browser, text, icon ); if( name == "MediaBrowser" ) { m_browsers->makeDropProxy( "MediaBrowser", MediaBrowser::queue() ); }}/** * Reload the amarokui.rc xml file. * mainly just used by amarok::Menu */void PlaylistWindow::recreateGUI(){ reloadXML(); createGUI();}/** * Create the amarok gui from the xml file. */void PlaylistWindow::createGUI(){ setUpdatesEnabled( false ); LastFm::Controller::instance(); // create love/ban/skip actions m_toolbar->clear(); //KActions don't unplug themselves when the widget that is plugged is deleted! //we need to unplug to detect if the menu is plugged in App::applySettings() //TODO report to bugs.kde.org //we unplug after clear as otherwise it crashes! dunno why.. KActionPtrList actions = actionCollection()->actions(); for( KActionPtrList::Iterator it = actions.begin(), end = actions.end(); it != end; ++it ) (*it)->unplug( m_toolbar ); KXMLGUIBuilder builder( this ); KXMLGUIFactory factory( &builder, this ); //build Toolbar, plug actions factory.addClient( this ); //TEXT ON RIGHT HACK //KToolBarButtons have independent settings for their appearance. //KToolBarButton::modeChange() causes that button to set its mode to that of its parent KToolBar //KToolBar::setIconText() calls modeChange() for children, unless 2nd param is false QStringList list; list << "toolbutton_playlist_add"// << "toolbutton_playlist_clear"// << "toolbutton_playlist_shuffle"// << "toolbutton_playlist_show" << "toolbutton_burn_menu" << "toolbutton_amarok_menu"; m_toolbar->setIconText( KToolBar::IconTextRight, false ); //we want some buttons to have text on right const QStringList::ConstIterator end = list.constEnd(); const QStringList::ConstIterator last = list.fromLast(); for( QStringList::ConstIterator it = list.constBegin(); it != end; ++it ) { KToolBarButton* const button = static_cast<KToolBarButton*>( m_toolbar->child( (*it).latin1() ) ); if ( button ) { button->modeChange(); button->setFocusPolicy( QWidget::NoFocus ); } } m_toolbar->setIconText( KToolBar::IconOnly, false ); //default appearance conserveMemory(); setUpdatesEnabled( true );}/** * Apply the loaded settings on the playlist window. * this function loads the custom fonts (if chosen) and than calls PlayList::instance()->applySettings(); */void PlaylistWindow::applySettings(){ switch( AmarokConfig::useCustomFonts() ) { case true: Playlist::instance()->setFont( AmarokConfig::playlistWindowFont() ); ContextBrowser::instance()->setFont( AmarokConfig::contextBrowserFont() ); break; case false: Playlist::instance()->unsetFont(); ContextBrowser::instance()->unsetFont(); break; }}/** * @param o The object * @param e The event * * Here we filter some events for the Playlist Search LineEdit and the Playlist. @n * this makes life easier since we have more useful functions available from this class */bool PlaylistWindow::eventFilter( QObject *o, QEvent *e ){ Playlist* const pl = Playlist::instance(); typedef QListViewItemIterator It; switch( e->type() ) { case 6/*QEvent::KeyPress*/:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?