]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/components/playlist/playlist_model.cpp
Move the track id from the last column to the first one in the playlist dialog and...
[vlc] / modules / gui / qt4 / components / playlist / playlist_model.cpp
index d9a30d218f646a606403cbe5fd90c6e83d4dc0b6..99fe3398d5d5d316582f505268ff97cb7e7718a9 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
+
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
 
-#include <assert.h>
-#include <QIcon>
-#include <QFont>
-#include <QMenu>
-#include <QApplication>
-
 #include "qt4.hpp"
 #include "components/playlist/playlist_model.hpp"
 #include "dialogs/mediainfo.hpp"
 
 #include "pixmaps/type_unknown.xpm"
 
-#define DEPTH_PL -1
-#define DEPTH_SEL 1
+#include <assert.h>
+#include <QIcon>
+#include <QFont>
+#include <QMenu>
+#include <QApplication>
+#include <QSettings>
+
 QIcon PLModel::icons[ITEM_TYPE_NUMBER];
 
 static int PlaylistChanged( vlc_object_t *, const char *,
@@ -52,221 +52,6 @@ static int ItemAppended( vlc_object_t *p_this, const char *psz_variable,
 static int ItemDeleted( vlc_object_t *p_this, const char *psz_variable,
                         vlc_value_t oval, vlc_value_t nval, void *param );
 
-/*************************************************************************
- * Playlist item implementation
- *************************************************************************/
-
-/*
-   Playlist item is just a wrapper, an abstraction of the playlist_item
-   in order to be managed by PLModel
-
-   PLItem have a parent, and id and a input Id
-*/
-
-
-void PLItem::init( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
-{
-    parentItem = parent;          /* Can be NULL, but only for the rootItem */
-    i_id       = _i_id;           /* Playlist item specific id */
-    i_input_id = _i_input_id;     /* Identifier of the input */
-    model      = m;               /* PLModel (QAbsmodel) */
-    i_type     = -1;              /* Item type - Avoid segfault */
-    b_current  = false;
-
-    assert( model );
-
-    /* No parent, should be the main one */
-    if( parentItem == NULL )
-    {
-        i_showflags = config_GetInt( model->p_intf, "qt-pl-showflags" );
-        updateview();
-    }
-    else
-    {
-        i_showflags = parentItem->i_showflags;
-        //Add empty string and update() handles data appending
-        item_col_strings.append( "" );
-    }
-    msg_Dbg( model->p_intf, "PLItem created of type: %i", model->i_depth );
-}
-
-/*
-   Constructors
-   Call the above function init
-   So far the first constructor isn't used...
-   */
-PLItem::PLItem( int _i_id, int _i_input_id, PLItem *parent, PLModel *m )
-{
-    init( _i_id, _i_input_id, parent, m );
-}
-
-PLItem::PLItem( playlist_item_t * p_item, PLItem *parent, PLModel *m )
-{
-    init( p_item->i_id, p_item->p_input->i_id, parent, m );
-}
-
-PLItem::~PLItem()
-{
-    qDeleteAll( children );
-    children.clear();
-}
-
-/* Column manager */
-void PLItem::updateview()
-{
-    item_col_strings.clear();
-
-    if( model->i_depth == 1 )  /* Selector Panel */
-    {
-        item_col_strings.append( "" );
-        return;
-    }
-
-    for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
-    {
-        if( i_showflags & i_index )
-        {
-            switch( i_index )
-            {
-            case VLC_META_ENGINE_ARTIST:
-                item_col_strings.append( qtr( VLC_META_ARTIST ) );
-                break;
-            case VLC_META_ENGINE_TITLE:
-                item_col_strings.append( qtr( VLC_META_TITLE ) );
-                break;
-            case VLC_META_ENGINE_DESCRIPTION:
-                item_col_strings.append( qtr( VLC_META_DESCRIPTION ) );
-                break;
-            case VLC_META_ENGINE_DURATION:
-                item_col_strings.append( qtr( "Duration" ) );
-                break;
-            case VLC_META_ENGINE_GENRE:
-                item_col_strings.append( qtr( VLC_META_GENRE ) );
-                break;
-            case VLC_META_ENGINE_COLLECTION:
-                item_col_strings.append( qtr( VLC_META_COLLECTION ) );
-                break;
-            case VLC_META_ENGINE_SEQ_NUM:
-                item_col_strings.append( qtr( VLC_META_SEQ_NUM ) );
-                break;
-            case VLC_META_ENGINE_RATING:
-                item_col_strings.append( qtr( VLC_META_RATING ) );
-                break;
-            default:
-                break;
-            }
-        }
-    }
-}
-
-/* So far signal is always true.
-   Using signal false would not call PLModel... Why ?
- */
-void PLItem::insertChild( PLItem *item, int i_pos, bool signal )
-{
-    if( signal )
-        model->beginInsertRows( model->index( this , 0 ), i_pos, i_pos );
-    children.insert( i_pos, item );
-    if( signal )
-        model->endInsertRows();
-}
-
-void PLItem::remove( PLItem *removed )
-{
-    if( model->i_depth == DEPTH_SEL || parentItem )
-    {
-        int i_index = parentItem->children.indexOf( removed );
-        model->beginRemoveRows( model->index( parentItem, 0 ),
-                                i_index, i_index );
-        parentItem->children.removeAt( i_index );
-        model->endRemoveRows();
-    }
-}
-
-/* This function is used to get one's parent's row number in the model */
-int PLItem::row() const
-{
-    if( parentItem )
-        return parentItem->children.indexOf( const_cast<PLItem*>(this) ); // Why this ? I don't think we ever inherit PLItem
-    return 0;
-}
-
-/* update the PL Item, get the good names and so on */
-void PLItem::update( playlist_item_t *p_item, bool iscurrent )
-{
-    char psz_duration[MSTRTIME_MAX_SIZE];
-    char *psz_meta;
-
-    assert( p_item->p_input->i_id == i_input_id );
-
-    i_type = p_item->p_input->i_type;
-    b_current = iscurrent;
-
-    item_col_strings.clear();
-
-    if( model->i_depth == 1 )  /* Selector Panel */
-    {
-        item_col_strings.append( qfu( p_item->p_input->psz_name ) );
-        return;
-    }
-
-#define ADD_META( item, meta ) \
-    psz_meta = input_item_Get ## meta ( item->p_input ); \
-    item_col_strings.append( qfu( psz_meta ) ); \
-    free( psz_meta );
-
-    for( int i_index=1; i_index <= VLC_META_ENGINE_ART_URL; i_index *= 2 )
-    {
-        if( parentItem->i_showflags & i_index )
-        {
-            switch( i_index )
-            {
-            case VLC_META_ENGINE_ARTIST:
-                ADD_META( p_item, Artist );
-                break;
-            case VLC_META_ENGINE_TITLE:
-                char *psz_title, *psz_name;
-                psz_title = input_item_GetTitle( p_item->p_input );
-                psz_name = input_item_GetName( p_item->p_input );
-                if( psz_title )
-                {
-                    ADD_META( p_item, Title );
-                }
-                else if( psz_name )
-                {
-                    item_col_strings.append( qfu( psz_name ) );
-                }
-                free( psz_title );
-                free( psz_name );
-                break;
-            case VLC_META_ENGINE_DESCRIPTION:
-                ADD_META( p_item, Description );
-                break;
-            case VLC_META_ENGINE_DURATION:
-                secstotimestr( psz_duration,
-                    input_item_GetDuration( p_item->p_input ) / 1000000 );
-                item_col_strings.append( QString( psz_duration ) );
-                break;
-            case VLC_META_ENGINE_GENRE:
-                ADD_META( p_item, Genre );
-                break;
-            case VLC_META_ENGINE_COLLECTION:
-                ADD_META( p_item, Album );
-                break;
-            case VLC_META_ENGINE_SEQ_NUM:
-                ADD_META( p_item, TrackNum );
-                break;
-            case VLC_META_ENGINE_RATING:
-                ADD_META( p_item, Rating );
-            default:
-                break;
-            }
-        }
-
-    }
-#undef ADD_META
-}
-
 /*************************************************************************
  * Playlist model implementation
  *************************************************************************/
@@ -308,12 +93,13 @@ PLModel::PLModel( playlist_t *_p_playlist,  /* THEPL */
     ADD_ICON( NODE, ":/pixmaps/type_node.png" );
 #undef ADD_ICON
 
-    addCallbacks();
     rebuild( p_root );
 }
 
 PLModel::~PLModel()
 {
+    QSettings settings( "vlc", "vlc-qt-interface" );
+    settings.setValue( "qt-pl-showflags", rootItem->i_showflags );
     delCallbacks();
     delete rootItem;
 }
@@ -928,23 +714,57 @@ void PLModel::doDeleteItem( PLItem *item, QModelIndexList *fullList )
 /******* Volume III: Sorting and searching ********/
 void PLModel::sort( int column, Qt::SortOrder order )
 {
+    int i_index = -1;
+    int i_flag = 0;
+
+#define CHECK_COLUMN( meta )                        \
+{                                                   \
+    if( ( shownFlags() & VLC_META_ENGINE_##meta ) ) \
+        i_index++;                                  \
+    if( column == i_index )                         \
+    {                                               \
+        i_flag = VLC_META_ENGINE_##meta;            \
+        goto next;                                  \
+    }                                               \
+}
+
+    CHECK_COLUMN( TRACKID );
+    CHECK_COLUMN( TITLE );
+    CHECK_COLUMN( DURATION );
+    CHECK_COLUMN( ARTIST );
+    CHECK_COLUMN( GENRE );
+    CHECK_COLUMN( COLLECTION );
+    CHECK_COLUMN( SEQ_NUM );
+    CHECK_COLUMN( DESCRIPTION );
+
+#undef CHECK_COLUMN
+
+next:
     PL_LOCK;
     {
         playlist_item_t *p_root = playlist_ItemGetById( p_playlist,
                                                         rootItem->i_id,
                                                         VLC_TRUE );
         int i_mode;
-        switch( column )
+        switch( i_flag )
         {
-        case 0: i_mode = SORT_TITLE_NODES_FIRST;break;
-        case 1: i_mode = SORT_ARTIST;break;
-        case 2: i_mode = SORT_DURATION; break;
-        default: i_mode = SORT_TITLE_NODES_FIRST; break;
+        case VLC_META_ENGINE_TRACKID:    i_mode = SORT_ID;               break;
+        case VLC_META_ENGINE_TITLE:      i_mode = SORT_TITLE_NODES_FIRST;break;
+        case VLC_META_ENGINE_DURATION:   i_mode = SORT_DURATION;         break;
+        case VLC_META_ENGINE_ARTIST:     i_mode = SORT_ARTIST;           break;
+        case VLC_META_ENGINE_GENRE:      i_mode = SORT_GENRE;            break;
+        case VLC_META_ENGINE_COLLECTION: i_mode = SORT_ALBUM;            break;
+        case VLC_META_ENGINE_SEQ_NUM:    i_mode = SORT_TRACK_NUMBER;     break;
+        case VLC_META_ENGINE_DESCRIPTION:i_mode = SORT_DESCRIPTION;      break;
+        default:                         i_mode = SORT_TITLE_NODES_FIRST;break;
         }
         if( p_root )
+        {
             playlist_RecursiveNodeSort( p_playlist, p_root, i_mode,
                                         order == Qt::AscendingOrder ?
                                             ORDER_NORMAL : ORDER_REVERSE );
+            p_playlist->b_reset_currently_playing = VLC_TRUE;
+        }
     }
     PL_UNLOCK;
     rebuild();
@@ -1006,54 +826,54 @@ void PLModel::popup( QModelIndex & index, QPoint &point, QModelIndexList list )
 
 void PLModel::viewchanged( int meta )
 {
-   if( rootItem )
-   {
-       int index=0;
-       switch( meta )
-       {
-       case VLC_META_ENGINE_TITLE:
-           index=0; break;
-       case VLC_META_ENGINE_DURATION:
-           index=1; break;
-       case VLC_META_ENGINE_ARTIST:
-           index=2; break;
-       case VLC_META_ENGINE_GENRE:
-           index=3; break;
-       case VLC_META_ENGINE_COPYRIGHT:
-           index=4; break;
-       case VLC_META_ENGINE_COLLECTION:
-           index=5; break;
-       case VLC_META_ENGINE_SEQ_NUM:
-           index=6; break;
-       case VLC_META_ENGINE_DESCRIPTION:
-           index=7; break;
-       default:
-           break;
-       }
-       /* UNUSED        emit layoutAboutToBeChanged(); */
-       index = __MIN( index , rootItem->item_col_strings.count() );
-       QModelIndex parent = createIndex( 0, 0, rootItem );
-
-       if( rootItem->i_showflags & meta )
-           /* Removing columns */
-       {
-           beginRemoveColumns( parent, index, index+1 );
-           rootItem->i_showflags &= ~( meta );
-           rootItem->updateview();
-           endRemoveColumns();
-       }
-       else
-       {
-           /* Adding columns */
-           beginInsertColumns( createIndex( 0, 0, rootItem), index, index+1 );
-           rootItem->i_showflags |= meta;
-           rootItem->updateview();
-           endInsertColumns();
-       }
-       rebuild();
-       config_PutInt( p_intf, "qt-pl-showflags", rootItem->i_showflags );
-       config_SaveConfigFile( p_intf, NULL );
-   }
+    if( rootItem )
+    {
+        int index=0;
+        switch( meta )
+        {
+        case VLC_META_ENGINE_TRACKID:
+            index=0; break;
+        case VLC_META_ENGINE_TITLE:
+            index=1; break;
+        case VLC_META_ENGINE_DURATION:
+            index=2; break;
+        case VLC_META_ENGINE_ARTIST:
+            index=3; break;
+        case VLC_META_ENGINE_GENRE:
+            index=4; break;
+        case VLC_META_ENGINE_COPYRIGHT:
+            index=5; break;
+        case VLC_META_ENGINE_COLLECTION:
+            index=6; break;
+        case VLC_META_ENGINE_SEQ_NUM:
+            index=7; break;
+        case VLC_META_ENGINE_DESCRIPTION:
+            index=8; break;
+        default:
+            break;
+        }
+        /* UNUSED        emit layoutAboutToBeChanged(); */
+        index = __MIN( index, rootItem->item_col_strings.count() );
+        QModelIndex parent = createIndex( 0, 0, rootItem );
+
+        if( rootItem->i_showflags & meta )
+            /* Removing columns */
+        {
+            beginRemoveColumns( parent, index, index+1 );
+            rootItem->i_showflags &= ~( meta );
+            rootItem->updateColumnHeaders();
+            endRemoveColumns();
+        }
+        else
+        {
+            /* Adding columns */
+            beginInsertColumns( createIndex( 0, 0, rootItem), index, index+1 );
+            rootItem->i_showflags |= meta;
+            rootItem->updateColumnHeaders();
+            endInsertColumns();
+        }
+        rebuild();
+    }
 }
 
 void PLModel::popupDel()
@@ -1097,7 +917,7 @@ void PLModel::popupSave()
 #include <shellapi.h>
 void PLModel::popupExplore()
 {
-    ShellExecuteW( NULL, L"explore", L"C:\\", NULL, NULL, SW_SHOWNORMAL );
+    ShellExecute( NULL, "explore", "C:\\", NULL, NULL, SW_SHOWNORMAL );
 }
 #endif