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 + -
显示快捷键?