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