You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/juk/coverdialog.cpp

167 lines
4.6 KiB

/***************************************************************************
begin : Sun May 15 2005
copyright : (C) 2005 by Michael Pyne
email : michael.pyne@kdemail.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <tdelistview.h>
#include <kiconview.h>
#include <kiconviewsearchline.h>
#include <kiconloader.h>
#include <tdeapplication.h>
#include <tdepopupmenu.h>
#include <tdelocale.h>
#include <tqtimer.h>
#include <tqtoolbutton.h>
#include "coverdialog.h"
#include "covericonview.h"
#include "covermanager.h"
#include "collectionlist.h"
using CoverUtility::CoverIconViewItem;
class AllArtistsListViewItem : public TDEListViewItem
{
public:
AllArtistsListViewItem(TQListView *parent) :
TDEListViewItem(parent, i18n("<All Artists>"))
{
}
int compare(TQListViewItem *, int, bool) const
{
return -1; // Always be at the top.
}
};
class CaseInsensitiveItem : public TDEListViewItem
{
public:
CaseInsensitiveItem(TQListView *parent, const TQString &text) :
TDEListViewItem(parent, text)
{
}
int compare(TQListViewItem *item, int column, bool ascending) const
{
Q_UNUSED(ascending);
return text(column).lower().localeAwareCompare(item->text(column).lower());
}
};
CoverDialog::CoverDialog(TQWidget *parent) :
CoverDialogBase(parent, "juk_cover_dialog", WType_Dialog)
{
m_covers->setResizeMode(TQIconView::Adjust);
m_covers->setGridX(140);
m_covers->setGridY(150);
m_searchLine->setIconView(m_covers);
m_clearSearch->setIconSet(SmallIconSet("locationbar_erase"));
}
CoverDialog::~CoverDialog()
{
}
void CoverDialog::show()
{
m_artists->clear();
m_covers->clear();
TQStringList artists = CollectionList::instance()->uniqueSet(CollectionList::Artists);
m_artists->setSorting(-1);
new AllArtistsListViewItem(m_artists);
for(TQStringList::ConstIterator it = artists.begin(); it != artists.end(); ++it)
new CaseInsensitiveItem(m_artists, *it);
m_artists->setSorting(0);
TQTimer::singleShot(0, this, TQ_SLOT(loadCovers()));
CoverDialogBase::show();
}
// Here we try to keep the GUI from freezing for too long while we load the
// covers.
void CoverDialog::loadCovers()
{
TQValueList<coverKey> keys = CoverManager::keys();
TQValueList<coverKey>::ConstIterator it;
int i = 0;
for(it = keys.begin(); it != keys.end(); ++it) {
new CoverIconViewItem(*it, m_covers);
if(++i == 10) {
i = 0;
kapp->processEvents();
}
}
}
// TODO: Add a way to show cover art for tracks with no artist.
void CoverDialog::slotArtistClicked(TQListViewItem *item)
{
m_covers->clear();
if(dynamic_cast<AllArtistsListViewItem *>(item)) {
// All artists.
loadCovers();
}
else {
TQString artist = item->text(0).lower();
TQValueList<coverKey> keys = CoverManager::keys();
TQValueList<coverKey>::ConstIterator it;
for(it = keys.begin(); it != keys.end(); ++it) {
CoverDataPtr data = CoverManager::coverInfo(*it);
if(data->artist == artist)
new CoverIconViewItem(*it, m_covers);
}
}
}
void CoverDialog::slotContextRequested(TQIconViewItem *item, const TQPoint &pt)
{
static TDEPopupMenu *menu = 0;
if(!item)
return;
if(!menu) {
menu = new TDEPopupMenu(this);
menu->insertItem(i18n("Remove Cover"), this, TQ_SLOT(removeSelectedCover()));
}
menu->popup(pt);
}
void CoverDialog::removeSelectedCover()
{
CoverIconViewItem *coverItem = m_covers->currentItem();
if(!coverItem || !coverItem->isSelected()) {
kdWarning(65432) << "No item selected for removeSelectedCover.\n";
return;
}
if(!CoverManager::removeCover(coverItem->id()))
kdError(65432) << "Unable to remove selected cover: " << coverItem->id() << endl;
else
delete coverItem;
}
#include "coverdialog.moc"