File: qmdmodel.cpp

package info (click to toggle)
linux-minidisc 0.9.13-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,096 kB
  • ctags: 1,530
  • sloc: ansic: 6,345; cpp: 2,569; python: 2,451; perl: 866; sh: 22; makefile: 8
file content (333 lines) | stat: -rw-r--r-- 8,624 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
#include <QFont>
#include <QFontMetrics>
#include <qmdmodel.h>

enum hcolumnum {
  ColId, ColTitle, ColArtist, ColAlbum, ColLength, ColCodec, ColUploadable, ColRecDate,
  LAST_hcolumnnum = ColRecDate
};

enum ncolumnum {
  CoId, CoGroup, CoTitle, CoLength, CoCodec, CoUploadable,
  LAST_ncolumnnum = CoUploadable
};


/* netmd tracks model */
QVariant QNetMDTracksModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(orientation != Qt::Horizontal)
        return QVariant();

    if(role == Qt::SizeHintRole)
    {
        static QFont f;
        static QFontMetrics met(f);
        switch((ncolumnum)section)
        {
            case CoId:
                return QSize(met.width("9999")+5, 0);
            case CoGroup:
            case CoTitle:
            case CoLength:
                return QSize(met.width("9:99:99"), 0);
            case CoCodec:
            case CoUploadable:
                /* Really use the header for the metric in these columns,
                   contents will be shorter */
                return QAbstractListModel::headerData(section,orientation,role);
        }
    }

    if(role == Qt::DisplayRole)
    {
        switch((ncolumnum)section)
        {
            case CoId:
                return tr("Nr.");
            case CoGroup:
                return tr("Group");
            case CoTitle:
                return tr("Title");
            case CoLength:
                return tr("Length");
            case CoCodec:
                return tr("Format");
            case CoUploadable:
                return tr("Uploadable");
        }
    }
    return QVariant();
}

QVariant QNetMDTracksModel::data(const QModelIndex & index, int role) const
{
    if(role == Qt::TextAlignmentRole &&
       (index.column() == CoId || index.column() == CoLength))
        return Qt::AlignRight;

    if(index.row() >= rowCount())
        return QVariant();

    QNetMDTrack track = allTracks[index.row()];

    if(role == Qt::CheckStateRole && index.column() == CoUploadable)
        return ((ndev->name() != "SONY MZ-RH1 (NetMD)") || track.copyprotected()) ? Qt::Unchecked : Qt::Checked;

    if(role == Qt::DisplayRole)
    {
        switch((ncolumnum)index.column())
        {
            case CoId:
                return track.tracknum() + 1;
            case CoGroup:
                return track.group();
            case CoTitle:
                return track.title();
            case CoLength:
            {
                QTime t = track.duration();
                if(t < QTime(1,0,0))
                    return t.toString("m:ss");
                else
                    return t.toString("h:mm:ss");
            }
            case CoCodec:
                return track.codecname();
            case CoUploadable:
                return QVariant(); /* Displayed by checkbox */
        }
    }
    return QVariant();
}

int QNetMDTracksModel::rowCount(const QModelIndex &) const
{
    if(ndev == NULL)
        return 0;

    return ndev->trackCount();
}

int QNetMDTracksModel::columnCount(const QModelIndex &) const
{
    return LAST_ncolumnnum+1;
}

QString QNetMDTracksModel::open(QMDDevice * device)
{
    int i = 0;
    QString ret = "error opening net device";

    beginResetModel();
    if(ndev != NULL)
        close();

    if(device->deviceType() == NETMD_DEVICE)
    {
        ndev = static_cast<QNetMDDevice *>(device);
        ret = ndev->open();
    }

    if(!ret.isEmpty())
        close();

    /* fetch track info for all tracks first, getting track info inside data() function is very slow */
    for(; i < ndev->trackCount(); i++)
        allTracks.append(ndev->netmdTrack(i));

    endResetModel();	/* inform views that the model contents changed */
    return ret;
}

bool QNetMDTracksModel::is_open()
{
    return ndev->isOpen();
}

void QNetMDTracksModel::close()
{
    beginResetModel();

    if(ndev != NULL && ndev->isOpen())
        ndev->close();

    ndev = NULL;

    allTracks.clear();
    endResetModel();	/* inform views that the model contents changed */
}


/* himd tracks model */

QVariant QHiMDTracksModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(orientation != Qt::Horizontal)
        return QVariant();

    if(role == Qt::SizeHintRole)
    {
        static QFont f;
        static QFontMetrics met(f);
        switch((hcolumnum)section)
        {
            case ColId:
                return QSize(met.width("9999")+5, 0);
            case ColTitle:
            case ColArtist:
            case ColAlbum:
                return QSize(25*met.averageCharWidth(), 0);
            case ColLength:
                return QSize(met.width("9:99:99"), 0);
            case ColCodec:
            case ColUploadable:
                /* Really use the header for the metric in these columns,
                   contents will be shorter */
                return QAbstractListModel::headerData(section,orientation,role);
            case ColRecDate:
                return QSize(met.width("yyyy.MM.dd hh:mm:ss"), 0);
        }
    }

    if(role == Qt::DisplayRole)
    {
        switch((hcolumnum)section)
        {
            case ColId:
                return tr("Nr.");
            case ColTitle:
                return tr("Title");
            case ColArtist:
                return tr("Artist");
            case ColAlbum:
                return tr("Album");
            case ColLength:
                return tr("Length");
            case ColCodec:
                return tr("Format");
            case ColUploadable:
                return tr("Uploadable");
            case ColRecDate:
                return tr("Recorded At");
        }
    }
    return QVariant();
}

QVariant QHiMDTracksModel::data(const QModelIndex & index, int role) const
{
    if(role == Qt::TextAlignmentRole &&
       (index.column() == ColId || index.column() == ColLength))
        return Qt::AlignRight;

    if(index.row() >= rowCount())
        return QVariant();

    QHiMDTrack track = hdev->himdTrack(index.row());

    if(role == Qt::CheckStateRole && index.column() == ColUploadable)
        return track.copyprotected() ? Qt::Unchecked : Qt::Checked;

    if(role == Qt::DisplayRole)
    {
        switch((hcolumnum)index.column())
        {
            case ColId:
                return index.row() + 1;
            case ColTitle:
                return track.title();
            case ColArtist:
                return track.artist();
            case ColAlbum:
                return track.album();
            case ColLength:
            {
                QTime t = track.duration();
                if(t < QTime(1,0,0))
                    return t.toString("m:ss");
                else
                    return t.toString("h:mm:ss");
            }
            case ColCodec:
                return track.codecname();
            case ColUploadable:
                return QVariant(); /* Displayed by checkbox */
            case ColRecDate:
            {
                QDateTime dt = track.recdate();
                return dt.toString("yyyy.MM.dd hh:mm:ss");
            }
        }
    }
    return QVariant();
}

int QHiMDTracksModel::rowCount(const QModelIndex &) const
{
    if(hdev == NULL)
        return 0;

    return hdev->trackCount();
}

int QHiMDTracksModel::columnCount(const QModelIndex &) const
{
    return LAST_hcolumnnum+1;
}

QString QHiMDTracksModel::open(QMDDevice * device)
{
    QString ret = "error opening himd device";

    beginResetModel();
    if(hdev != NULL)
        close();

    if(device->deviceType() == HIMD_DEVICE)
    {
        hdev = static_cast<QHiMDDevice *>(device);
        ret = hdev->open();
    }

    if(!ret.isEmpty())
        close();

    endResetModel();	/* inform views that the model contents changed */
    return ret;
}

bool QHiMDTracksModel::is_open()
{
    return hdev->isOpen();
}

void QHiMDTracksModel::close()
{
    beginResetModel();

    if(hdev != NULL && hdev->isOpen())
        hdev->close();

    hdev = NULL;

    endResetModel();	/* inform views that the model contents changed */
}


/* QFileSystemModel stuff */

Qt::ItemFlags QHiMDFileSystemModel::flags(const QModelIndex &index) const
{
    if(!isDir(index) && !selectableExtensions.contains((fileInfo(index).suffix()), Qt::CaseInsensitive))
        return Qt::NoItemFlags;   //not selectable, not enabled (grayed out in the browser)

    return QFileSystemModel::flags(index);
}

void QHiMDFileSystemModel::setSelectableExtensions(QStringList extensions)
{
    beginResetModel();
    selectableExtensions = extensions;
    endResetModel();
}