1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2011 LoRd_MuldeR <MuldeR2@GMX.de>
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License along
16 // with this program; if not, write to the Free Software Foundation, Inc.,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 // http://www.gnu.org/licenses/gpl-2.0.txt
20 ///////////////////////////////////////////////////////////////////////////////
22 #include "Model_CueSheet.h"
25 #include <QMessageBox>
26 #include <QInputDialog>
32 ////////////////////////////////////////////////////////////
34 ////////////////////////////////////////////////////////////
39 virtual const char* type(void) = 0;
42 class CueSheetTrack : public CueSheetItem
45 CueSheetTrack(CueSheetFile *parent, int trackNo)
50 m_startIndex = std::numeric_limits<double>::quiet_NaN();
52 int trackNo(void) { return m_trackNo; }
53 double startIndex(void) { return m_startIndex; }
54 QString title(void) { return m_title; }
55 QString performer(void) { return m_performer; }
56 CueSheetFile *parent(void) { return m_parent; }
57 void setStartIndex(double startIndex) { m_startIndex = startIndex; }
58 void setTitle(const QString &title) { m_title = title; }
59 void setPerformer(const QString &performer) { m_performer = performer; }
60 bool isValid(void) { return !(_isnan(m_startIndex) || (m_trackNo < 0)); }
61 virtual const char* type(void) { return "CueSheetTrack"; }
67 CueSheetFile *m_parent;
70 class CueSheetFile : public CueSheetItem
73 CueSheetFile(const QString &fileName) : m_fileName(fileName) {}
74 ~CueSheetFile(void) { while(!m_tracks.isEmpty()) delete m_tracks.takeLast(); }
75 QString fileName(void) { return m_fileName; }
76 void addTrack(CueSheetTrack *track) { m_tracks.append(track); }
77 void clearTracks(void) { while(!m_tracks.isEmpty()) delete m_tracks.takeLast(); }
78 CueSheetTrack *track(int index) { return m_tracks.at(index); }
79 int trackCount(void) { return m_tracks.count(); }
80 virtual const char* type(void) { return "CueSheetFile"; }
82 const QString m_fileName;
83 QList<CueSheetTrack*> m_tracks;
86 ////////////////////////////////////////////////////////////
87 // Constructor & Destructor
88 ////////////////////////////////////////////////////////////
90 CueSheetModel::CueSheetModel()
94 for(int i = 0; i < 5; i++)
96 CueSheetFile *currentFile = new CueSheetFile(QString().sprintf("File %02d.wav", i+1));
97 for(int j = 0; j < 8; j++)
99 CueSheetTrack *currentTrack = new CueSheetTrack(currentFile, trackNo++);
100 currentTrack->setTitle("ATWA (Air Trees Water Animals)");
101 currentTrack->setPerformer("System of a Down");
102 currentFile->addTrack(currentTrack);
104 m_files.append(currentFile);
108 CueSheetModel::~CueSheetModel(void)
110 while(!m_files.isEmpty()) delete m_files.takeLast();
113 ////////////////////////////////////////////////////////////
115 ////////////////////////////////////////////////////////////
117 QModelIndex CueSheetModel::index(int row, int column, const QModelIndex &parent) const
119 if(!parent.isValid())
121 return createIndex(row, column, m_files.at(row));
124 CueSheetItem *parentItem = static_cast<CueSheetItem*>(parent.internalPointer());
125 if(CueSheetFile *filePtr = dynamic_cast<CueSheetFile*>(parentItem))
127 return createIndex(row, column, filePtr->track(row));
130 return QModelIndex();
133 int CueSheetModel::columnCount(const QModelIndex &parent) const
138 int CueSheetModel::rowCount(const QModelIndex &parent) const
140 if(!parent.isValid())
142 return m_files.count();
145 CueSheetItem *parentItem = static_cast<CueSheetItem*>(parent.internalPointer());
146 if(CueSheetFile *filePtr = dynamic_cast<CueSheetFile*>(parentItem))
148 return filePtr->trackCount();
154 QModelIndex CueSheetModel::parent(const QModelIndex &child) const
158 CueSheetItem *childItem = static_cast<CueSheetItem*>(child.internalPointer());
159 if(CueSheetTrack *trackPtr = dynamic_cast<CueSheetTrack*>(childItem))
161 return createIndex(m_files.indexOf(trackPtr->parent()), 0, trackPtr->parent());
165 return QModelIndex();
168 QVariant CueSheetModel::headerData (int section, Qt::Orientation orientation, int role) const
170 if(role == Qt::DisplayRole)
178 return tr("File / Track");
194 QVariant CueSheetModel::data(const QModelIndex &index, int role) const
196 if(role == Qt::DisplayRole)
198 CueSheetItem *item = reinterpret_cast<CueSheetItem*>(index.internalPointer());
200 if(CueSheetFile *filePtr = dynamic_cast<CueSheetFile*>(item))
202 switch(index.column())
205 return tr("File %1").arg(QString().sprintf("%02d", index.row() + 1)).append(" ");
208 return QString("[%1]").arg(QFileInfo(filePtr->fileName()).fileName());
215 else if(CueSheetTrack *trackPtr = dynamic_cast<CueSheetTrack*>(item))
217 switch(index.column())
220 return tr("Track %1").arg(QString().sprintf("%02d", trackPtr->trackNo() + 1)).append(" ");
223 if(!trackPtr->title().isEmpty() && !trackPtr->performer().isEmpty())
225 return QString("%1 / %2").arg(trackPtr->performer(), trackPtr->title());
227 else if(!trackPtr->title().isEmpty())
229 return trackPtr->title();
231 else if(!trackPtr->performer().isEmpty())
233 return trackPtr->performer();
238 return QString().sprintf("%07.2f", trackPtr->startIndex());
250 void CueSheetModel::clearData(void)
253 while(!m_files.isEmpty()) delete m_files.takeLast();