vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Sat Apr 13 13:10:23 2013 +0200| [cd929de4118644d4acfe57b305d51ecfc670fc61] | committer: Francois Cartegnie
Qt: StandardPanel: Add spinner on network SD nodes. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cd929de4118644d4acfe57b305d51ecfc670fc61 --- modules/gui/qt4/components/playlist/playlist.cpp | 1 + modules/gui/qt4/components/playlist/selector.cpp | 6 +++ modules/gui/qt4/components/playlist/selector.hpp | 2 + .../gui/qt4/components/playlist/standardpanel.cpp | 40 ++++++++++++++++++++ .../gui/qt4/components/playlist/standardpanel.hpp | 6 +++ 5 files changed, 55 insertions(+) diff --git a/modules/gui/qt4/components/playlist/playlist.cpp b/modules/gui/qt4/components/playlist/playlist.cpp index 3598743..0837d46 100644 --- a/modules/gui/qt4/components/playlist/playlist.cpp +++ b/modules/gui/qt4/components/playlist/playlist.cpp @@ -141,6 +141,7 @@ PlaylistWidget::PlaylistWidget( intf_thread_t *_p_i, QWidget *_par ) DCONNECT( selector, categoryActivated( playlist_item_t *, bool ), mainView, setRootItem( playlist_item_t *, bool ) ); mainView->setRootItem( p_root, false ); + CONNECT( selector, SDCategorySelected(bool), mainView, setWaiting(bool) ); /* */ split = new PlaylistSplitter( this ); diff --git a/modules/gui/qt4/components/playlist/selector.cpp b/modules/gui/qt4/components/playlist/selector.cpp index 0d22010..b65d6da 100644 --- a/modules/gui/qt4/components/playlist/selector.cpp +++ b/modules/gui/qt4/components/playlist/selector.cpp @@ -333,6 +333,7 @@ void PLSelector::createItems() selItem = addItem( SD_TYPE, *ppsz_longname ); } + selItem->treeItem()->setData( 0, SD_CATEGORY_ROLE, *p_category ); putSDData( selItem, *ppsz_name, *ppsz_longname ); if ( ! icon.isNull() ) selItem->treeItem()->setData( 0, Qt::DecorationRole, icon ); @@ -418,7 +419,12 @@ void PLSelector::setSource( QTreeWidgetItem *item ) /* */ if( pl_item ) + { emit categoryActivated( pl_item, false ); + int i_cat = item->data( 0, SD_CATEGORY_ROLE ).toInt(); + emit SDCategorySelected( i_cat == SD_CAT_INTERNET + || i_cat == SD_CAT_LAN ); + } } PLSelItem * PLSelector::addItem ( diff --git a/modules/gui/qt4/components/playlist/selector.hpp b/modules/gui/qt4/components/playlist/selector.hpp index b1755b9..2daaa54 100644 --- a/modules/gui/qt4/components/playlist/selector.hpp +++ b/modules/gui/qt4/components/playlist/selector.hpp @@ -62,6 +62,7 @@ enum { IN_ITEM_ROLE, //input_item_t->i_id SPECIAL_ROLE, //SpecialData CAP_SEARCH_ROLE, + SD_CATEGORY_ROLE, }; enum ItemAction { @@ -154,6 +155,7 @@ private slots: signals: void categoryActivated( playlist_item_t *, bool ); + void SDCategorySelected( bool ); }; #endif diff --git a/modules/gui/qt4/components/playlist/standardpanel.cpp b/modules/gui/qt4/components/playlist/standardpanel.cpp index c8ab49c..e528303 100644 --- a/modules/gui/qt4/components/playlist/standardpanel.cpp +++ b/modules/gui/qt4/components/playlist/standardpanel.cpp @@ -33,6 +33,7 @@ #include "components/playlist/ml_model.hpp" /* MLModel */ #include "components/playlist/views.hpp" /* 3 views */ #include "components/playlist/selector.hpp" /* PLSelector */ +#include "util/customwidgets.hpp" /* PixmapAnimator */ #include "menus.hpp" /* Popup */ #include "input_manager.hpp" /* THEMIM */ #include "dialogs_provider.hpp" /* THEDP */ @@ -87,6 +88,14 @@ StandardPLPanel::StandardPLPanel( PlaylistWidget *_parent, currentRootIndexId = -1; lastActivatedId = -1; + QList<QString> frames; + frames << ":/util/wait1"; + frames << ":/util/wait2"; + frames << ":/util/wait3"; + frames << ":/util/wait4"; + spinnerAnimation = new PixmapAnimator( this, frames ); + CONNECT( spinnerAnimation, pixmapReady( const QPixmap & ), this, updateViewport() ); + /* Saved Settings */ int i_savedViewMode = getSettings()->value( "Playlist/view-mode", TREE_VIEW ).toInt(); i_zoom = getSettings()->value( "Playlist/zoom", 0 ).toInt(); @@ -503,6 +512,20 @@ bool StandardPLPanel::eventFilter ( QObject *obj, QEvent * event ) "media source from the left."), QPalette::Text ); } + else if ( spinnerAnimation->state() == PixmapAnimator::Running ) + { + if ( currentView->model()->rowCount() ) + spinnerAnimation->stop(); /* Trick until SD emits events */ + else + { + QWidget *viewport = qobject_cast<QWidget *>( obj ); + QStylePainter painter( viewport ); + QPixmap *spinner = spinnerAnimation->getPixmap(); + QPoint point = viewport->geometry().center(); + point -= QPoint( spinner->size().width() / 2, spinner->size().height() / 2 ); + painter.drawPixmap( point, *spinner ); + } + } } return false; } @@ -682,6 +705,23 @@ void StandardPLPanel::showView( int i_view ) gotoPlayingItem(); } +void StandardPLPanel::setWaiting( bool b ) +{ + if ( b ) + { + spinnerAnimation->setLoopCount( 20 ); /* Trick until SD emits an event */ + spinnerAnimation->start(); + } + else + spinnerAnimation->stop(); +} + +void StandardPLPanel::updateViewport() +{ + /* A single update on parent widget won't work */ + currentView->viewport()->repaint(); +} + int StandardPLPanel::currentViewIndex() const { if( currentView == treeView ) diff --git a/modules/gui/qt4/components/playlist/standardpanel.hpp b/modules/gui/qt4/components/playlist/standardpanel.hpp index a6f83e5..5b20a53 100644 --- a/modules/gui/qt4/components/playlist/standardpanel.hpp +++ b/modules/gui/qt4/components/playlist/standardpanel.hpp @@ -53,6 +53,7 @@ class PicFlowView; class LocationBar; class PLSelector; class PlaylistWidget; +class PixmapAnimator; class StandardPLPanel: public QWidget { @@ -110,10 +111,14 @@ private: /* for popup */ QModelIndex popupIndex; /* FIXME: don't store here, pass as Action param */ + /* Wait spinner */ + PixmapAnimator *spinnerAnimation; + public slots: void setRootItem( playlist_item_t *, bool ); void browseInto( const QModelIndex& ); void showView( int ); + void setWaiting( bool ); /* spinner */ private slots: void deleteSelection(); @@ -140,6 +145,7 @@ private slots: void toggleColumnShown( int ); void cycleViews(); + void updateViewport(); /* spinner */ signals: void viewChanged( const QModelIndex& ); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org http://mailman.videolan.org/listinfo/vlc-commits