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/noatun/modules/splitplaylist/playlist.cpp

282 lines
6.1 KiB

#include "playlist.h"
#include "view.h"
#include <noatun/player.h>
#include <tdeapplication.h>
#include <krandomsequence.h>
#include <kdebug.h>
#include <twin.h>
#include <kiconloader.h>
SplitPlaylist *SplitPlaylist::Self=0;
SplitPlaylist::SplitPlaylist()
: Playlist(0, "SplitPlaylist"), Plugin(), mExiting(false)
{
Self=this;
}
void SplitPlaylist::init()
{
view=new View(this); // 195
connect(view->listView(), TQT_SIGNAL(executed(TQListViewItem*)), TQT_SLOT(listItemSelected(TQListViewItem*)));
connect(view, TQT_SIGNAL(shown()), TQT_SIGNAL(listShown()));
connect(view, TQT_SIGNAL(hidden()), TQT_SIGNAL(listHidden()));
view->init(); // 1000
}
SplitPlaylist::~SplitPlaylist()
{
mExiting=true;
delete view;
}
void SplitPlaylist::reset()
{
SafeListViewItem *i;
setCurrent(i=static_cast<SafeListViewItem*>(view->listView()->firstChild()), false);
if (i && !i->isOn())
next(false);
}
PlaylistItem SplitPlaylist::next()
{
return next(true);
}
PlaylistItem SplitPlaylist::next(bool play)
{
PlaylistItem nextItem;
if (napp->player()->loopStyle() == Player::Random)
{
// Ignore all this order stuff and select a random item
List *lview = view->listView();
if (lview->childCount())
{
SafeListViewItem *slvi = static_cast<SafeListViewItem*>(
lview->itemAtIndex(TDEApplication::random() % lview->childCount())
);
nextItem = PlaylistItem(slvi);
}
else
{
nextItem = 0;
}
}
else
{
if(!current())
{
nextItem = static_cast<SafeListViewItem*>(static_cast<SafeListViewItem*>(getFirst().data()));
}
else
{
nextItem = static_cast<SafeListViewItem*>(
static_cast<SafeListViewItem*>(current().data())->itemBelow());
}
}
if (!nextItem) // don't set a null-item as current item
{
return 0;
// nextItem = static_cast<SafeListViewItem*>(static_cast<SafeListViewItem*>(getFirst().data()));
}
PlaylistItem oldCurrent = currentItem;
setCurrent(nextItem, play);
// Hack for back button on randomized play
if (oldCurrent)
randomPrevious = oldCurrent;
if (currentItem)
if (!static_cast<SafeListViewItem*>(currentItem.data())->isOn())
return next(play);
return currentItem;
}
PlaylistItem SplitPlaylist::current()
{
return currentItem;
}
PlaylistItem SplitPlaylist::previous()
{
if (napp->player()->loopStyle() == Player::Random && randomPrevious)
{
List *list = view->listView();
// check if the item still exists (hackitude: 50%)
bool found=false;
for (TQListViewItem *i = list->firstChild(); i; i = i->nextSibling())
{
if (i == static_cast<SafeListViewItem*>(randomPrevious.data()))
{
found = true;
break;
}
}
if (found)
{
// setCurrent modified randomPrevious, and setCurrent is pass-by-reference
PlaylistItem prev = randomPrevious;
setCurrent(prev);
return currentItem;
}
}
// there's a possibility that I will fall out to here
// from the above branch
PlaylistItem nextItem;
if(!current())
{
nextItem = static_cast<SafeListViewItem*>(static_cast<SafeListViewItem*>(getFirst().data()));
}
else
{
nextItem = static_cast<SafeListViewItem*>(
static_cast<SafeListViewItem*>(current().data())->itemAbove());
}
if (!nextItem) // don't set a null-item as current item
return 0;
setCurrent(nextItem);
if (currentItem)
if (!static_cast<SafeListViewItem*>(currentItem.data())->isOn())
return previous();
return currentItem;
}
PlaylistItem SplitPlaylist::getFirst() const
{
return static_cast<SafeListViewItem*>(view->listView()->firstChild());
}
PlaylistItem SplitPlaylist::getAfter(const PlaylistItem &item) const
{
if (item)
return static_cast<SafeListViewItem*>(static_cast<const SafeListViewItem*>(item.data())->nextSibling());
return 0;
}
bool SplitPlaylist::listVisible() const
{
KWin::WindowInfo info = KWin::windowInfo(view->winId());
return !(info.hasState(NET::Shaded) || info.hasState(NET::Hidden) || !info.valid() || !info.isOnCurrentDesktop());
}
void SplitPlaylist::showList()
{
KWin::setOnDesktop(view->winId(), KWin::currentDesktop());
view->show();
if (view->isMinimized())
view->showNormal();
view->raise();
}
void SplitPlaylist::hideList()
{
view->hide();
}
void SplitPlaylist::clear()
{
view->listView()->clear();
}
void SplitPlaylist::addFile(const KURL &file, bool play)
{
view->addFile(file, play);
}
void SplitPlaylist::setCurrent(const PlaylistItem &i)
{
setCurrent(i, true);
}
void SplitPlaylist::setCurrent(const PlaylistItem &i, bool emitC)
{
randomPrevious = PlaylistItem();
emitC = emitC && currentItem;
if (!i)
{
currentItem=0;
}
else
{
// remove the old icon
SafeListViewItem *now=static_cast<SafeListViewItem*>(current().data());
if (now)
now->setPixmap(0, TQPixmap());
TQRect rect(view->listView()->itemRect(static_cast<SafeListViewItem*>(current().data())));
rect.setWidth(view->listView()->viewport()->width());
currentItem=i;
view->listView()->viewport()->repaint(rect,true);
view->listView()->ensureItemVisible(static_cast<SafeListViewItem*>(current().data()));
TQRect currentRect= view->listView()->itemRect(static_cast<SafeListViewItem*>(current().data()));
view->listView()->viewport()->repaint(currentRect);
now=static_cast<SafeListViewItem*>(current().data());
if(now)
now->setPixmap(0, ::SmallIcon("noatunplay"));
}
if (emitC && !exiting())
emit playCurrent();
}
void SplitPlaylist::remove(const PlaylistItem &)
{
// delete i;
}
void SplitPlaylist::listItemSelected(TQListViewItem *i)
{
setCurrent(PlaylistItem(static_cast<SafeListViewItem*>(i)), false);
emit playCurrent();
}
void SplitPlaylist::randomize()
{
// turning off sorting is necessary
// otherwise, the list will get randomized and promptly sorted again
view->setSorting(false);
List *lview = view->listView();
// eeeeevil :)
TQPtrList<void> list;
TQPtrList<TQListViewItem> items;
for(int i = 0; i < lview->childCount(); i++)
{
list.append( (void*) i );
items.append( lview->itemAtIndex( i ) );
}
KRandomSequence seq;
seq.randomize( &list );
for(int i = 0; i < lview->childCount(); i++)
{
items.take()->moveItem(lview->itemAtIndex((long) list.take()));
}
setCurrent(currentItem, false);
}
void SplitPlaylist::sort()
{
view->setSorting(true);
setCurrent(currentItem, false);
}
#include "playlist.moc"