• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdemultimedia API Reference
  • KDE Home
  • Contact Us
 

libkcddb

  • sources
  • kde-4.14
  • kdemultimedia
  • libkcddb
  • libkcddb
cdinfodialog.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2005 Shaheedur R. Haque <srhaque@iee.org>
3  Copyright (C) 2005 Richard Lärkäng <nouseforaname@home.se>
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Library General Public
7  License as published by the Free Software Foundation; either
8  version 2 of the License, or (at your option) any later version.
9 
10  This library 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 GNU
13  Library General Public License for more details.
14 
15  You should have received a copy of the GNU Library General Public License
16  along with this library; see the file COPYING.LIB. If not, write to
17  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  Boston, MA 02110-1301, USA.
19 */
20 
21 #include "cdinfodialog.h"
22 
23 #include "cdinfoencodingwidget.h"
24 #include "ui_cdinfodialog.h"
25 
26 #include <QTextCodec>
27 #include <QStringList>
28 #include <QStandardItemModel>
29 
30 #include <kdebug.h>
31 #include <kglobal.h>
32 #include <kcharsets.h>
33 
34 using KCDDB::TrackInfo;
35 
36 namespace KCDDB
37 {
38 
39 class CDInfoDialog::Private
40 {
41  public:
42  Private()
43  : ui(new Ui::CDInfoDialogBase)
44  {
45  }
46 
47  CDInfo info;
48  KCDDB::Genres genres;
49  KCDDB::Categories categories;
50  Ui::CDInfoDialogBase* ui;
51  static QLatin1String SEPARATOR;
52  static const unsigned TRACK_NUMBER = 0;
53  static const unsigned TRACK_TIME = 1;
54  static const unsigned TRACK_TITLE = 2;
55  static const unsigned TRACK_ARTIST = 3;
56  static const unsigned TRACK_COMMENT = 4;
57 };
58 
59  QLatin1String CDInfoDialog::Private::SEPARATOR = QLatin1String( " / " );
60 
61  CDInfoDialog::CDInfoDialog(QWidget* parent)
62  : KDialog(parent),
63  d(new Private)
64  {
65  QWidget* w = new QWidget(this);
66  d->ui->setupUi(w);
67  setMainWidget(w);
68 
69  d->info.set(QLatin1String( "source" ), QLatin1String( "user" ));
70 
71  d->categories = KCDDB::Categories();
72  d->ui->m_category->addItems(d->categories.i18nList());
73  d->genres = KCDDB::Genres();
74  d->ui->m_genre->addItems(d->genres.i18nList());
75 
76  m_trackModel = new QStandardItemModel(0, 5, this);
77  d->ui->m_trackList->setModel(m_trackModel);
78 
79  // We want control over the visibility of this column. See artistChanged().
80 // d->ui->m_trackList->setColumnWidthMode(Private::TRACK_ARTIST, Q3ListView::Manual);
81 
82  // ensure we get our translations
83  KGlobal::locale()->insertCatalog( QLatin1String( "libkcddb" ));
84  connect( d->ui->m_trackList, SIGNAL(activated(QModelIndex)), this, SLOT(slotTrackSelected(QModelIndex)) );
85  connect( d->ui->m_trackList, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotTrackDoubleClicked(QModelIndex)) );
86  connect( d->ui->m_artist, SIGNAL(textChanged(QString)), this, SLOT(artistChanged(QString)) );
87  connect( d->ui->m_genre, SIGNAL(textChanged(QString)), this, SLOT(genreChanged(QString)) );
88  connect( d->ui->m_multiple, SIGNAL(toggled(bool)), this, SLOT(slotMultipleArtists(bool)) );
89 
90  connect(d->ui->m_changeEncoding,SIGNAL(clicked()),SLOT(slotChangeEncoding()));
91  }
92 
93  void CDInfoDialog::slotTrackSelected( const QModelIndex &index )
94  {
95  emit play(index.data().toUInt()-1);
96  }
97 
98 
99  CDInfoDialog::~CDInfoDialog()
100  {
101  delete d->ui;
102  delete d;
103 
104  }
105 
106  void CDInfoDialog::slotNextTrack()
107  {
108 /* QTreeWidgetItem *item = d->ui->m_trackList->itemBelow(d->ui->m_trackList->currentItem());
109  if (item)
110  {
111 
112  d->ui->m_trackList->setCurrentItem(item);*/
113 // d->ui->m_trackList->ensureItemVisible(item);
114 // }
115  }
116 
117  void CDInfoDialog::slotTrackDoubleClicked(const QModelIndex &index)
118  {
119 // d->ui->m_trackList->editItem(item);
120  }
121 
122  void CDInfoDialog::setInfo( const KCDDB::CDInfo &info, const KCDDB::TrackOffsetList &trackStartFrames )
123  {
124  d->info = info;
125 
126  d->ui->m_artist->setText(info.get(Artist).toString().trimmed());
127  d->ui->m_title->setText(info.get(Title).toString().trimmed());
128  d->ui->m_category->setItemText(d->ui->m_category->currentIndex(), d->categories.cddb2i18n(info.get(Category).toString()));
129 
130  // Make sure the revision is set before the genre to allow the genreChanged() handler to fire.
131  d->ui->m_revision->setText(QString::number(info.get(QLatin1String( "revision" )).toInt()));
132  d->ui->m_genre->setItemText(d->ui->m_genre->currentIndex(), d->genres.cddb2i18n(info.get(Genre).toString()));
133  d->ui->m_year->setValue(info.get(Year).toInt());
134  d->ui->m_comment->setText(info.get(Comment).toString().trimmed());
135  d->ui->m_id->setText(info.get(QLatin1String( "discid" )).toString().trimmed());
136 
137  // Now do the individual tracks.
138  unsigned tracks = info.numberOfTracks();
139  if (tracks > 0)
140  {
141  d->ui->m_length->setText(framesTime(trackStartFrames[tracks] - trackStartFrames[0]));
142  }
143 
144  m_trackModel->clear();
145  QStringList labels;
146  labels << i18n("Track") << i18n("Length") << i18n("Title") << i18n("Artist") << i18n("Comment");
147  m_trackModel->setHorizontalHeaderLabels(labels);
148  for (unsigned i = 0; i < tracks; i++) {
149  QList<QStandardItem *> trackItems = QList<QStandardItem *>();
150  TrackInfo ti(info.track(i));
151  QStandardItem *trackNumberItem = new QStandardItem(QString().sprintf("%02d", i + 1));
152  trackNumberItem->setEditable(FALSE);
153  trackItems << trackNumberItem;
154  QStandardItem *trackLengthItem = new QStandardItem(framesTime(trackStartFrames[i + 1] - trackStartFrames[i]));
155  trackLengthItem->setEditable(FALSE);
156  trackItems << trackLengthItem;
157  QStandardItem *trackTitleItem = new QStandardItem(ti.get(Title).toString());
158  trackItems << trackTitleItem;
159  QStandardItem *trackArtistItem = new QStandardItem(ti.get(Artist).toString());
160  trackItems << trackArtistItem;
161  QStandardItem *trackCommentItem = new QStandardItem(ti.get(Comment).toString());
162  trackItems << trackCommentItem;
163 
164  m_trackModel->appendRow(trackItems);
165  }
166  // FIXME KDE4: handle playorder here too, once KCDDBInfo::CDInfo is updated.
167 
168  if (info.get(Artist).toString() == QLatin1String( "Various" ) || d->ui->m_multiple->isChecked()){
169  d->ui->m_trackList->resizeColumnToContents(Private::TRACK_ARTIST);
170  }
171  }
172 
173  QString CDInfoDialog::framesTime(unsigned frames)
174  {
175  QTime time;
176  double ms;
177 
178  ms = frames * 1000 / 75.0;
179  time = time.addMSecs((int)ms);
180 
181  // Use ".zzz" for milliseconds...
182  QString temp2;
183  if (time.hour() > 0)
184  temp2 = time.toString(QLatin1String( "hh:mm:ss" ));
185  else
186  temp2 = time.toString(QLatin1String( "mm:ss" ));
187  return temp2;
188  } // framesTime
189 
190  KCDDB::CDInfo CDInfoDialog::info() const
191  {
192  KCDDB::CDInfo info = d->info;
193 
194  info.set(Artist, d->ui->m_artist->text().trimmed());
195  info.set(Title, d->ui->m_title->text().trimmed());
196  info.set(Category, d->categories.i18n2cddb(d->ui->m_category->currentText()));
197  info.set(Genre, d->genres.i18n2cddb(d->ui->m_genre->currentText()));
198  info.set(Year, d->ui->m_year->value());
199  info.set(Comment, d->ui->m_comment->text().trimmed());
200  info.set(QLatin1String( "revision" ), d->ui->m_revision->text().trimmed().toUInt());
201  info.set(QLatin1String( "discid" ), d->ui->m_id->text().trimmed());
202 
203  for (int t = 0; t < m_trackModel->rowCount(); ++t) {
204  TrackInfo& track = info.track(t);
205  track.set(Artist, m_trackModel->index(t, Private::TRACK_ARTIST).data().toString().trimmed());
206  track.set(Title, m_trackModel->index(t, Private::TRACK_TITLE).data().toString().trimmed());
207  track.set(Comment, m_trackModel->index(t, Private::TRACK_COMMENT).data().toString().trimmed());
208  // FIXME KDE4: handle track lengths here too, once KCDDBInfo::CDInfo is updated.
209  }
210  // FIXME KDE4: handle playorder here too, once KCDDBInfo::CDInfo is updated.
211  return info;
212  }
213 
214 
215  void CDInfoDialog::artistChanged( const QString &newArtist )
216  {
217  // Enable special handling of compilations.
218  if (newArtist.trimmed().compare(QLatin1String( "Various" ))) {
219  d->ui->m_multiple->setChecked(false);
220  } else {
221  d->ui->m_multiple->setChecked(true);
222  }
223  }
224 
225  void CDInfoDialog::genreChanged( const QString &newGenre )
226  {
227  // Disable changes to category if the version number indicates that a record
228  // is already in the database, or if the genre is poorly set. The latter
229  // condition also provides a "back-door" override.
230  d->ui->m_category->setEnabled((d->ui->m_revision->text().trimmed().toUInt() < 1) ||
231  (newGenre.compare(QLatin1String( "Unknown" )) == 0));
232  }
233 
234 
235  void CDInfoDialog::slotMultipleArtists( bool hasMultipleArtist)
236  {
237  if (hasMultipleArtist) {
238  for (int t = 0; t < m_trackModel->rowCount(); ++t) {
239  QString title = m_trackModel->index(t, Private::TRACK_TITLE).data().toString();
240  int separator = title.indexOf(Private::SEPARATOR);
241  if (separator != -1) {
242  // Artists probably entered already
243  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_ARTIST), title.left(separator));
244  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_TITLE), title.mid(separator + 3));
245  }
246  }
247  d->ui->m_trackList->resizeColumnToContents(Private::TRACK_ARTIST);
248  d->ui->m_trackList->resizeColumnToContents(Private::TRACK_TITLE);
249  } else {
250  for (int t = 0; t < m_trackModel->rowCount(); ++t) {
251  QString artist = m_trackModel->index(t, Private::TRACK_ARTIST).data().toString();
252  if (!artist.isEmpty()) {
253  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_ARTIST), QString());
254  QString title = m_trackModel->index(t, Private::TRACK_TITLE).data().toString();
255  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_TITLE), artist + Private::SEPARATOR + title);
256  }
257  }
258  d->ui->m_trackList->hideColumn(Private::TRACK_ARTIST);
259  d->ui->m_trackList->resizeColumnToContents(Private::TRACK_TITLE);
260  }
261 }
262 
263 
264  void CDInfoDialog::slotChangeEncoding()
265  {
266  KDialog* dialog = new KDialog(this);
267  dialog->setCaption(i18n("Change Encoding"));
268  dialog->setButtons( KDialog::Ok | KDialog::Cancel);
269  dialog->setModal( true );
270 
271 
272  QStringList songTitles;
273  for (int t = 0; t < m_trackModel->rowCount(); ++t) {
274  QString title = m_trackModel->index(t, Private::TRACK_ARTIST).data().toString().trimmed();
275  if (!title.isEmpty())
276  title.append(Private::SEPARATOR);
277  title.append(m_trackModel->index(t, Private::TRACK_TITLE).data().toString().trimmed());
278  songTitles << title;
279  }
280 
281  KCDDB::CDInfoEncodingWidget* encWidget = new KCDDB::CDInfoEncodingWidget(
282  dialog, d->ui->m_artist->text(),d->ui->m_title->text(), songTitles);
283 
284  dialog->setMainWidget(encWidget);
285 
286  if (dialog->exec())
287  {
288  KCharsets* charsets = KGlobal::charsets();
289  QTextCodec* codec = charsets->codecForName(charsets->encodingForName(encWidget->selectedEncoding()));
290 
291  d->ui->m_artist->setText(codec->toUnicode(d->ui->m_artist->text().toLatin1()));
292  d->ui->m_title->setText(codec->toUnicode(d->ui->m_title->text().toLatin1()));
293  d->ui->m_genre->setItemText(d->ui->m_genre->currentIndex(), codec->toUnicode(d->ui->m_genre->currentText().toLatin1()));
294  d->ui->m_comment->setText(codec->toUnicode(d->ui->m_comment->text().toLatin1()));
295 
296  QModelIndex trackIndex = m_trackModel->index(0, 0, QModelIndex());
297  int trackRows = m_trackModel->rowCount(trackIndex);
298  for (int t = 0; t < trackRows; ++t) {
299  QString artist = m_trackModel->index(t, Private::TRACK_ARTIST, trackIndex).data().toString();
300  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_ARTIST, trackIndex), codec->toUnicode(artist.toLatin1()));
301  QString title = m_trackModel->index(t, Private::TRACK_TITLE, trackIndex).data().toString();
302  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_TITLE, trackIndex), codec->toUnicode(title.toLatin1()));
303  QString comment = m_trackModel->index(t, Private::TRACK_COMMENT, trackIndex).data().toString();
304  m_trackModel->setData(m_trackModel->index(t, Private::TRACK_COMMENT, trackIndex), codec->toUnicode(comment.toLatin1()));
305  }
306  }
307  }
308 }
309 
310 #include "cdinfodialog.moc"
KCDDB::CDInfoDialog::CDInfoDialog
CDInfoDialog(QWidget *parent)
Definition: cdinfodialog.cpp:61
QStandardItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
QModelIndex
cdinfodialog.h
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QStandardItemModel
QWidget
QString::append
QString & append(QChar ch)
KCDDB::Title
The title of the track or CD.
Definition: cdinfo.h:36
QTime::toString
QString toString(Qt::DateFormat format) const
KCDDB::Category
The freedb category of the entry.
Definition: cdinfo.h:46
QStandardItemModel::clear
void clear()
KCDDB::CDInfoDialog::play
void play(int)
KCDDB::Categories
Category values defined by CDDB.
Definition: categories.h:19
QStandardItemModel::setHorizontalHeaderLabels
void setHorizontalHeaderLabels(const QStringList &labels)
KCDDB::CDInfo::get
QVariant get(const QString &type) const
Get data for type that has been assigned to this disc.
Definition: cdinfo.cpp:518
KDialog
KCDDB::Genres
The Genre is completely arbitrary.
Definition: genres.h:20
KCDDB::CDInfoDialog::setInfo
void setInfo(const KCDDB::CDInfo &info, const KCDDB::TrackOffsetList &trackStartFrames)
Definition: cdinfodialog.cpp:122
cdinfoencodingwidget.h
QTime::addMSecs
QTime addMSecs(int ms) const
QTime
QStandardItemModel::setData
virtual bool setData(const QModelIndex &index, const QVariant &value, int role)
KCDDB::CDInfoEncodingWidget::selectedEncoding
QString selectedEncoding()
Definition: cdinfoencodingwidget.cpp:44
KCDDB::Genre
The genre of the track or CD.
Definition: cdinfo.h:39
KCDDB::Comment
A comment for the track or CD.
Definition: cdinfo.h:37
QString::number
QString number(int n, int base)
QVariant::toUInt
uint toUInt(bool *ok) const
KCDDB::CDInfoEncodingWidget
Definition: cdinfoencodingwidget.h:27
QVariant::toInt
int toInt(bool *ok) const
KCDDB::CDInfo
Information about a CD.
Definition: cdinfo.h:117
QString::isEmpty
bool isEmpty() const
KCDDB::CDInfo::track
TrackInfo & track(int trackNumber)
Returns track with nr trackNumber and adds it to the track list if it doesn't exist (first track is 0...
Definition: cdinfo.cpp:562
QString::trimmed
QString trimmed() const
KCDDB::CDInfoDialog::~CDInfoDialog
virtual ~CDInfoDialog()
Definition: cdinfodialog.cpp:99
KCDDB::CDInfo::set
void set(const QString &type, const QVariant &data)
Set any data from this disc.
Definition: cdinfo.cpp:522
QString
QList< uint >
QTextCodec
KCDDB::Artist
The artist of the track or CD.
Definition: cdinfo.h:38
QStringList
QTime::hour
int hour() const
KCDDB::CDInfoDialog::info
KCDDB::CDInfo info() const
Definition: cdinfodialog.cpp:190
QString::toLatin1
QByteArray toLatin1() const
QString::mid
QString mid(int position, int n) const
QModelIndex::data
QVariant data(int role) const
QLatin1String
KCDDB::Year
The year the cd or track was produced By default, the year of the track is the same as for the whole ...
Definition: cdinfo.h:40
QTextCodec::codecForName
QTextCodec * codecForName(const QByteArray &name)
QStandardItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const
KCDDB::CDInfo::numberOfTracks
int numberOfTracks() const
Returns number of tracks on CD.
Definition: cdinfo.cpp:581
QString::left
QString left(int n) const
QStandardItem
KCDDB::TrackInfo
Information about a sepecific track in a cd.
Definition: cdinfo.h:55
QString::compare
int compare(const QString &other) const
QVariant::toString
QString toString() const
KCDDB::TrackInfo::set
void set(const QString &type, const QVariant &data)
Set any data from this track.
Definition: cdinfo.cpp:213
QStandardItemModel::appendRow
void appendRow(const QList< QStandardItem * > &items)
QStandardItem::setEditable
void setEditable(bool editable)
QTextCodec::toUnicode
QString toUnicode(const QByteArray &a) const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:28:13 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkcddb

Skip menu "libkcddb"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdemultimedia API Reference

Skip menu "kdemultimedia API Reference"
  • libkcddb
  • libkcompactdisc

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal