1 /*
2     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
3     SPDX-FileCopyrightText: 1998-2010 Sebastian Trueg <trueg@k3b.org>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "k3bvcdtrackkeysmodel.h"
9 #include "k3bvcdtrack.h"
10 
11 #include <KLocalizedString>
12 
13 #include <QIcon>
14 
15 Q_DECLARE_METATYPE( K3b::VcdTrack* )
16 
17 namespace K3b {
18 
19 
20 class VcdTrackKeysModel::Private
21 {
22 public:
Private(int kc)23     Private( int kc ) : keyCount( kc ) {}
24 
25     Key2Track keys;
26     int keyCount;
27 };
28 
29 
VcdTrackKeysModel(int keyCount,QObject * parent)30 VcdTrackKeysModel::VcdTrackKeysModel( int keyCount, QObject* parent )
31     : QAbstractTableModel( parent ),
32       d( new Private( keyCount ) )
33 {
34 }
35 
36 
~VcdTrackKeysModel()37 VcdTrackKeysModel::~VcdTrackKeysModel()
38 {
39     delete d;
40 }
41 
42 
keyCount() const43 int VcdTrackKeysModel::keyCount() const
44 {
45     return d->keyCount;
46 }
47 
48 
setKeys(const Key2Track & keys)49 void VcdTrackKeysModel::setKeys( const Key2Track& keys )
50 {
51     beginResetModel();
52     d->keys = keys;
53     endResetModel();
54 }
55 
56 
keys() const57 const VcdTrackKeysModel::Key2Track& VcdTrackKeysModel::keys() const
58 {
59     return d->keys;
60 }
61 
62 
flags(const QModelIndex & index) const63 Qt::ItemFlags VcdTrackKeysModel::flags( const QModelIndex& index ) const
64 {
65     if( index.isValid() && index.column() == PlayingColumn )
66         return QAbstractTableModel::flags( index ) | Qt::ItemIsEditable;
67     else
68         return QAbstractTableModel::flags( index );
69 }
70 
71 
data(const QModelIndex & index,int role) const72 QVariant VcdTrackKeysModel::data( const QModelIndex& index, int role ) const
73 {
74     if( index.isValid() ) {
75         if( role == Qt::DisplayRole || role == Qt::EditRole ) {
76             if( index.column() == KeyColumn ) {
77                 return index.row() + 1;
78             }
79             else if( index.column() == PlayingColumn ) {
80                 Key2Track::const_iterator it = d->keys.constFind( index.row()+1 );
81                 if( it != d->keys.constEnd() ) {
82                     return trackName( it.value() );
83                 }
84             }
85         }
86         else if( role == Qt::DecorationRole ) {
87             if( index.column() == PlayingColumn ) {
88                 Key2Track::const_iterator it = d->keys.constFind( index.row()+1 );
89                 if( it != d->keys.constEnd() ) {
90                     return trackIcon( it.value() );
91                 }
92             }
93         }
94         else if( role == TrackRole ) {
95             Key2Track::const_iterator it = d->keys.constFind( index.row()+1 );
96             if( it != d->keys.constEnd() )
97                 return QVariant::fromValue<VcdTrack*>( it.value() );
98             else
99                 return QVariant();
100         }
101     }
102     return QVariant();;
103 }
104 
105 
setData(const QModelIndex & index,const QVariant & value,int role)106 bool VcdTrackKeysModel::setData( const QModelIndex& index, const QVariant& value, int role )
107 {
108     if( index.isValid() && index.column() == PlayingColumn && role == Qt::EditRole ) {
109         if( value.isNull() ) {
110             d->keys.remove( index.row()+1 );
111         }
112         else {
113             VcdTrack* track = value.value<VcdTrack*>();
114             d->keys[ index.row()+1 ] = track;
115         }
116         emit dataChanged( index, index );
117         return true;
118     }
119     return false;
120 }
121 
122 
columnCount(const QModelIndex &) const123 int VcdTrackKeysModel::columnCount( const QModelIndex& /*parent*/ ) const
124 {
125     return ColumnCount;
126 }
127 
128 
rowCount(const QModelIndex & parent) const129 int VcdTrackKeysModel::rowCount( const QModelIndex& parent ) const
130 {
131     if( parent.isValid() )
132         return 0;
133     else
134         return d->keyCount;
135 }
136 
137 
headerData(int section,Qt::Orientation orientation,int role) const138 QVariant VcdTrackKeysModel::headerData( int section, Qt::Orientation orientation, int role ) const
139 {
140     if( orientation == Qt::Horizontal && role == Qt::DisplayRole ) {
141         switch( section ) {
142             case KeyColumn:     return i18n( "Key" );
143             case PlayingColumn: return i18n( "Playing" );
144             default:            return QVariant();
145         }
146     }
147     else {
148         return QVariant();
149     }
150 }
151 
152 
buddy(const QModelIndex & index) const153 QModelIndex VcdTrackKeysModel::buddy( const QModelIndex& index ) const
154 {
155     if( index.isValid() && index.column() == KeyColumn )
156         return QAbstractTableModel::index( index.row(), PlayingColumn );
157     else
158         return index;
159 }
160 
161 
trackName(VcdTrack * track)162 QString VcdTrackKeysModel::trackName( VcdTrack* track )
163 {
164     if( track == 0 )
165         return i18n( "Video CD END" );
166     else if( track->isSegment() )
167         return i18n( "Segment-%1 - %2" , QString::number( track->index() + 1 ).rightJustified( 3, '0' ) , track->title() );
168     else
169         return i18n( "Sequence-%1 - %2" , QString::number( track->index() + 1 ).rightJustified( 3, '0' ) , track->title() );
170 }
171 
172 
trackIcon(VcdTrack * track)173 QIcon VcdTrackKeysModel::trackIcon( VcdTrack* track )
174 {
175     if( track == 0 )
176         return QIcon::fromTheme( "media-optical-video" );
177     else if( track->isSegment() )
178         return QIcon::fromTheme( "image-x-generic" );
179     else
180         return QIcon::fromTheme( "video-x-generic" );
181 }
182 
183 } // namespace K3b
184