]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/components/playlist/selector.cpp
Qt: respect font sizes
[vlc] / modules / gui / qt4 / components / playlist / selector.cpp
index 17de1f2fa70d678102f498820370562249a8016b..2b42401046d1936ec3cf0f57bcf92d00d9351a77 100644 (file)
 #include <vlc_playlist.h>
 #include <vlc_services_discovery.h>
 
+void SelectorActionButton::paintEvent( QPaintEvent *event )
+{
+    QPainter p( this );
+    QColor color = palette().color( QPalette::HighlightedText );
+    color.setAlpha( 80 );
+    if( underMouse() )
+        p.fillRect( rect(), color );
+    p.setPen( color );
+    int frame = style()->pixelMetric( QStyle::PM_DefaultFrameWidth, 0, this );
+    p.drawLine( rect().topLeft() + QPoint( 0, frame ),
+                rect().bottomLeft() - QPoint( 0, frame ) );
+    QVLCFramelessButton::paintEvent( event );
+}
+
 PLSelItem::PLSelItem ( QTreeWidgetItem *i, const QString& text )
     : qitem(i), lblAction( NULL)
 {
@@ -51,13 +65,14 @@ PLSelItem::PLSelItem ( QTreeWidgetItem *i, const QString& text )
     layout->setContentsMargins(0,0,0,0);
     layout->addSpacing( 3 );
 
-    lbl = new QLabel( text );
+    lbl = new QVLCElidingLabel( text );
 
     layout->addWidget(lbl, 1);
 
     setLayout( layout );
 
-    setMinimumHeight( 22 ); //Action icon height plus 6
+    int height = qMax( 22, fontMetrics().height() + 8 );
+    setMinimumHeight( height );
 }
 
 void PLSelItem::addAction( ItemAction act, const QString& tooltip )
@@ -74,13 +89,14 @@ void PLSelItem::addAction( ItemAction act, const QString& tooltip )
         icon = QIcon( ":/buttons/playlist/playlist_remove" ); break;
     }
 
-    lblAction = new QVLCIconLabel( icon );
+    lblAction = new SelectorActionButton();
+    lblAction->setIcon( icon );
+    lblAction->setMinimumWidth( lblAction->sizeHint().width() + 6 );
 
     if( !tooltip.isEmpty() ) lblAction->setToolTip( tooltip );
 
     layout->addWidget( lblAction, 0 );
     lblAction->hide();
-    layout->addSpacing( 3 );
 
     CONNECT( lblAction, clicked(), this, triggerAction() );
 }
@@ -101,9 +117,9 @@ PLSelector::PLSelector( QWidget *p, intf_thread_t *_p_intf )
     setFrameStyle( QFrame::NoFrame );
     viewport()->setAutoFillBackground( false );
     setIconSize( QSize( 24,24 ) );
-    setIndentation( 10 );
+    setIndentation( 12 );
     header()->hide();
-    setRootIsDecorated( false );
+    setRootIsDecorated( true );
     setAlternatingRowColors( false );
     podcastsParent = NULL;
     podcastsParentId = -1;
@@ -122,6 +138,9 @@ PLSelector::PLSelector( QWidget *p, intf_thread_t *_p_intf )
     createItems();
     CONNECT( this, itemActivated( QTreeWidgetItem *, int ),
              this, setSource( QTreeWidgetItem *) );
+    CONNECT( this, itemClicked( QTreeWidgetItem *, int ),
+             this, setSource( QTreeWidgetItem *) );
+
     /* I believe this is unnecessary, seeing
        QStyle::SH_ItemView_ActivateItemOnSingleClick
         CONNECT( view, itemClicked( QTreeWidgetItem *, int ),
@@ -170,7 +189,7 @@ void PLSelector::setSource( QTreeWidgetItem *item )
 
     if( i_type == SD_TYPE )
     {
-        pl_item = playlist_ChildSearchName( THEPL->p_root_category, qtu( item->data(0, LONGNAME_ROLE ).toString() ) );
+        pl_item = playlist_ChildSearchName( THEPL->p_root, qtu( item->data(0, LONGNAME_ROLE ).toString() ) );
         if( item->data( 0, SPECIAL_ROLE ).toInt() == IS_PODCAST )
         {
             if( pl_item && !sd_loaded )
@@ -222,88 +241,94 @@ PLSelItem * putPLData( PLSelItem* item, playlist_item_t* plItem )
 
 PLSelItem *PLSelector::addPodcastItem( playlist_item_t *p_item )
 {
-  vlc_gc_incref( p_item->p_input );
-  char *psz_name = input_item_GetName( p_item->p_input );
-  PLSelItem *item = addItem(
-      PL_ITEM_TYPE, qfu( psz_name ), false, podcastsParent );
-  item->addAction( RM_ACTION, qtr( "Remove this podcast subscription" ) );
-  item->treeItem()->setData( 0, PL_ITEM_ROLE, QVariant::fromValue( p_item ) );
-  item->treeItem()->setData( 0, PL_ITEM_ID_ROLE, QVariant(p_item->i_id) );
-  item->treeItem()->setData( 0, IN_ITEM_ROLE, QVariant::fromValue( p_item->p_input ) );
-  CONNECT( item, action( PLSelItem* ), this, podcastRemove( PLSelItem* ) );
-  free( psz_name );
-  return item;
+    vlc_gc_incref( p_item->p_input );
+    char *psz_name = input_item_GetName( p_item->p_input );
+    PLSelItem *item = addItem(
+            PL_ITEM_TYPE, qfu( psz_name ), false, podcastsParent );
+    item->addAction( RM_ACTION, qtr( "Remove this podcast subscription" ) );
+    item->treeItem()->setData( 0, PL_ITEM_ROLE, QVariant::fromValue( p_item ) );
+    item->treeItem()->setData( 0, PL_ITEM_ID_ROLE, QVariant(p_item->i_id) );
+    item->treeItem()->setData( 0, IN_ITEM_ROLE, QVariant::fromValue( p_item->p_input ) );
+    CONNECT( item, action( PLSelItem* ), this, podcastRemove( PLSelItem* ) );
+    free( psz_name );
+    return item;
 }
 
 void PLSelector::createItems()
 {
     PLSelItem *pl = putPLData( addItem( PL_ITEM_TYPE, qtr( "Playlist" ), true ),
-                              THEPL->p_local_category );
+                              THEPL->p_playing );
     pl->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PL ) );
 
     PLSelItem *ml = putPLData( addItem( PL_ITEM_TYPE, qtr( "Media Library" ), true ),
-                              THEPL->p_ml_category );
+                              THEPL->p_media_library );
     ml->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_ML ) );
 
-    QTreeWidgetItem *msrc = addItem( CATEGORY_TYPE, qtr( "Media Sources" ),
-                                      false )->treeItem();
-
-    QTreeWidgetItem *mfldrs = NULL;
-
-    QTreeWidgetItem *shouts = NULL;
-
-    msrc->setExpanded( true );
+    QTreeWidgetItem *mycomp = addItem( CATEGORY_TYPE, qtr( "My Computer" ),
+                                        false )->treeItem();
+    QTreeWidgetItem *devices = addItem( CATEGORY_TYPE, qtr( "Devices" ),
+                                        false )->treeItem();
+    QTreeWidgetItem *lan = addItem( CATEGORY_TYPE, qtr( "Local Network" ),
+                                    false )->treeItem();
+    QTreeWidgetItem *internet = addItem( CATEGORY_TYPE, qtr( "Internet" ),
+                                          false )->treeItem();;
 
     char **ppsz_longnames;
-    char **ppsz_names = vlc_sd_GetNames( &ppsz_longnames );
+    int *p_categories;
+    char **ppsz_names = vlc_sd_GetNames( THEPL, &ppsz_longnames, &p_categories );
     if( !ppsz_names )
         return;
 
     char **ppsz_name = ppsz_names, **ppsz_longname = ppsz_longnames;
-    for( ; *ppsz_name; ppsz_name++, ppsz_longname++ )
+    int *p_category = p_categories;
+    for( ; *ppsz_name; ppsz_name++, ppsz_longname++, p_category++ )
     {
         //msg_Dbg( p_intf, "Adding a SD item: %s", *ppsz_longname );
-#define SD_IS( name ) ( !strcmp( *ppsz_name, name ) )
 
-        if( SD_IS("shoutcast") || SD_IS("shoutcasttv") ||
-            SD_IS("frenchtv") || SD_IS("freebox") )
+        if( *p_category == SD_CAT_INTERNET )
         {
-            if( !shouts ) shouts = addItem( CATEGORY_TYPE, qtr( "Shoutcast" ),
-                                            false, msrc )->treeItem();
-            putSDData( addItem( SD_TYPE, *ppsz_longname, false, shouts ),
+            PLSelItem *selItem = addItem( SD_TYPE, *ppsz_longname, false, internet );
+            putSDData( selItem, *ppsz_name, *ppsz_longname );
+            if( !strncmp( *ppsz_name, "podcast", 7 ) )
+            {
+                selItem->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PODCAST ) );
+                selItem->addAction( ADD_ACTION, qtr( "Subscribe to a podcast" ) );
+                CONNECT( selItem, action( PLSelItem* ), this, podcastAdd( PLSelItem* ) );
+                podcastsParent = selItem->treeItem();
+            }
+        }
+        else if( *p_category == SD_CAT_DEVICES )
+        {
+            putSDData( addItem( SD_TYPE, *ppsz_longname, false, devices ),
                        *ppsz_name, *ppsz_longname );
         }
-        else if( SD_IS("video_dir") || SD_IS("audio_dir") || SD_IS("picture_dir") )
+        else if( *p_category == SD_CAT_LAN )
         {
-            if( !mfldrs ) mfldrs = addItem( CATEGORY_TYPE, qtr( "Media Folders" ),
-                                            false, msrc )->treeItem();
-            putSDData( addItem( SD_TYPE, *ppsz_longname, false, mfldrs ),
+            putSDData( addItem( SD_TYPE, *ppsz_longname, false, lan ),
                        *ppsz_name, *ppsz_longname );
         }
-        else if( SD_IS("podcast") )
+        else if( *p_category == SD_CAT_MYCOMPUTER )
         {
-
-            PLSelItem *podItem = addItem( SD_TYPE, qtr( "Podcasts" ), false, msrc );
-            putSDData( podItem, *ppsz_name, *ppsz_longname );
-            podItem->treeItem()->setData( 0, SPECIAL_ROLE, QVariant( IS_PODCAST ) );
-            podItem->addAction( ADD_ACTION, qtr( "Subscribe to a podcast" ) );
-            CONNECT( podItem, action( PLSelItem* ), this, podcastAdd( PLSelItem* ) );
-
-            podcastsParent = podItem->treeItem();
+            putSDData( addItem( SD_TYPE, *ppsz_longname, false, mycomp ),
+                       *ppsz_name, *ppsz_longname );
         }
         else
         {
-            putSDData( addItem( SD_TYPE, qtr( *ppsz_longname ), false, msrc ),
+            putSDData( addItem( SD_TYPE, qtr( *ppsz_longname ), false ),
                        *ppsz_name, *ppsz_longname );
         }
 
-#undef SD_IS
-
         free( *ppsz_name );
         free( *ppsz_longname );
     }
     free( ppsz_names );
     free( ppsz_longnames );
+    free( p_categories );
+
+    if( mycomp->childCount() == 0 ) delete mycomp;
+    if( devices->childCount() == 0 ) delete devices;
+    if( lan->childCount() == 0 ) delete lan;
+    if( internet->childCount() == 0 ) delete internet;
 }
 
 QStringList PLSelector::mimeTypes() const
@@ -436,7 +461,6 @@ void PLSelector::podcastAdd( PLSelItem* item )
 
 void PLSelector::podcastRemove( PLSelItem* item )
 {
-    //FIXME will translators know to leave that %1 somewhere inside?
     QString question ( qtr( "Do you really want to unsubscribe from %1?" ) );
     question = question.arg( item->text() );
     QMessageBox::StandardButton res =
@@ -465,3 +489,13 @@ PLSelItem * PLSelector::itemWidget( QTreeWidgetItem *item )
     return ( static_cast<PLSelItem*>( QTreeWidget::itemWidget( item, 0 ) ) );
 }
 
+void PLSelector::drawBranches ( QPainter * painter, const QRect & rect, const QModelIndex & index ) const
+{
+    if( !model()->hasChildren( index ) ) return;
+    QStyleOption option;
+    option.initFrom( this );
+    option.rect = rect.adjusted( rect.width() - indentation(), 0, 0, 0 );
+    style()->drawPrimitive( isExpanded( index ) ?
+                            QStyle::PE_IndicatorArrowDown :
+                            QStyle::PE_IndicatorArrowRight, &option, painter );
+}