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.
amarok/amarok/src/playlistselection.cpp

223 lines
7.8 KiB

/***************************************************************************
* Copyright (C) 2005 Ian Monroe <ian@monroe.nu> *
* *
* 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. *
* *
***************************************************************************/
#define DEBUG_PREFIX "PlaylistSelection"
#include "amarok.h" //foreach
#include "debug.h"
#include "newdynamic.h"
#include "dynamicmode.h"
#include "playlistbrowser.h"
#include "playlistselection.h"
#include <tqcheckbox.h>
#include <tqgroupbox.h>
#include <tqlabel.h>
#include <tqlayout.h>
#include <tqlistview.h>
#include <tqsizepolicy.h>
#include <tqstringlist.h>
#include <kapplication.h>
#include <kiconloader.h>
#include <knuminput.h>
#include <klistview.h>
#include <klocale.h>
PlaylistSelection::PlaylistSelection( TQWidget* parent, const char* name )
: KListView( parent, name )
{
addColumn( i18n("Select Playlists") );
setRootIsDecorated( true );
PlaylistBrowserView* browserTree = PlaylistBrowser::instance()->getListView();
TQListViewItem* browserItem = browserTree->firstChild();
//load into the tree the first two items, which is the smart playlist and the playlist
for( int i = 0; i<2; i++ )
{
TQListViewItem* newItem = new TQListViewItem( this, browserItem->text(0) );
newItem->setPixmap( 0, *browserItem->pixmap(0) );
loadChildren( browserItem, newItem );
newItem->setOpen( true );
browserItem = browserItem->nextSibling();
}
}
void PlaylistSelection::loadChildren( TQListViewItem* browserParent, TQListViewItem* selectionParent )
{
TQListViewItem* browserChild = browserParent->firstChild();
while( browserChild )
{
SelectionListItem* selectionChild = new SelectionListItem( selectionParent, browserChild->text(0), browserChild );
if ( browserChild->pixmap(0) )
selectionChild->setPixmap( 0, *browserChild->pixmap(0) );
if( browserChild->childCount() > 0 )
loadChildren( browserChild, selectionChild );
browserChild = browserChild->nextSibling();
}
}
////////////////////////////////
/// ConfigDynamic
////////////////////////////////
namespace ConfigDynamic
{
KDialogBase* basicDialog( TQWidget* parent )
{
KDialogBase* dialog = new KDialogBase( parent, "new dynamic", true,
i18n("Create Dynamic Playlist"),
KDialogBase::Ok | KDialogBase::Cancel,
KDialogBase::Ok, true );
kapp->setTopWidget( dialog );
dialog->setCaption( i18n("Dynamic Mode") );
NewDynamic* nd = new NewDynamic( dialog, "new dynamic");
//TQSizePolicy policy;
//policy.setHorData(TQSizePolicy::Maximum);
//dialog->setSizePolicy(policy);
dialog->setMainWidget( nd );
return dialog;
}
void dynamicDialog( TQWidget* parent )
{
KDialogBase* dialog = basicDialog( parent );
NewDynamic* nd = static_cast<NewDynamic*>(dialog->mainWidget());
nd->m_mixLabel->setText( i18n("Add Dynamic Playlist") );
if( dialog->exec() == TQDialog::Accepted )
addDynamic( nd );
}
void editDynamicPlaylist( TQWidget* parent, DynamicMode* mode )
{
KDialogBase* dialog = basicDialog( parent );
NewDynamic* nd = static_cast<NewDynamic*>(dialog->mainWidget());
nd->m_name->setText( mode->title() );
nd->m_cycleTracks->setChecked( mode->cycleTracks() );
nd->m_upcomingIntSpinBox->setValue( mode->upcomingCount() );
nd->m_previousIntSpinBox->setValue( mode->previousCount() );
if( mode->appendType() == DynamicMode::CUSTOM )
{
//check items in the custom playlist
nd->m_mixLabel->setText( i18n("Edit Dynamic Playlist") );
TQStringList items = mode->items();
foreach( items )
{
TQCheckListItem* current = dynamic_cast<TQCheckListItem*>(
Amarok::findItemByPath(nd->selectPlaylist, (*it)) );
if( current )
current->setOn(true);
}
}
else //if its a suggested song or a random mix...
{
nd->selectPlaylist->hide();
nd->layout()->remove( nd->selectPlaylist );
// don't allow editing the name of the default random and suggested dynamics
nd->m_name->hide();
nd->m_playlistName_label->hide();
if( mode->appendType() == DynamicMode::RANDOM )
{
nd->m_mixLabel->setText( i18n("Random Mix") );
}
else
{
nd->m_mixLabel->setText( i18n("Suggested Songs") );
}
}
nd->updateGeometry();
dialog->resize( nd->minimumSizeHint() );
if( dialog->exec() == TQDialog::Accepted )
{
loadDynamicMode( mode, nd );
PlaylistBrowser::instance()->getDynamicCategory()->sortChildItems( 0, true );
PlaylistBrowser::instance()->saveDynamics();
}
}
void loadDynamicMode( DynamicMode* saveMe, NewDynamic* dialog )
{
saveMe->setTitle( dialog->m_name->text().replace( "\n", " " ) );
saveMe->setCycleTracks( dialog->m_cycleTracks->isChecked() );
saveMe->setUpcomingCount( dialog->m_upcomingIntSpinBox->value() );
saveMe->setPreviousCount( dialog->m_previousIntSpinBox->value() );
TQStringList list;
debug() << "Saving custom list..." << endl;
TQListViewItemIterator it( dialog->selectPlaylist, TQListViewItemIterator::Checked );
while( it.current() )
{
SelectionListItem *item = static_cast<SelectionListItem*>(it.current());
list.append( item->name() );
++it;
}
saveMe->setItems( list );
}
void addDynamic( NewDynamic* dialog )
{
TQListViewItem *parent = PlaylistBrowser::instance()->getDynamicCategory();
DynamicEntry *saveMe = new DynamicEntry( parent, 0, dialog->m_name->text().replace( "\n", " " ) );
saveMe->setAppendType( DynamicMode::CUSTOM );
loadDynamicMode( saveMe, dialog );
parent->sortChildItems( 0, true );
parent->setOpen( true );
PlaylistBrowser::instance()->saveDynamics();
}
}
////////////////////////////////
/// SelectionListItem
////////////////////////////////
SelectionListItem::SelectionListItem( TQCheckListItem * parent, const TQString& text, TQListViewItem* browserEquivalent )
: TQCheckListItem( parent, text, TQCheckListItem::CheckBox )
, m_browserEquivalent( browserEquivalent )
{ }
SelectionListItem::SelectionListItem( TQListViewItem * parent, const TQString& text, TQListViewItem* browserEquivalent )
: TQCheckListItem( parent, text, TQCheckListItem::CheckBox )
, m_browserEquivalent( browserEquivalent )
{ }
void SelectionListItem::stateChange( bool b )
{
TQListViewItem* it = firstChild();
while( it )
{
static_cast<SelectionListItem*>(it)->setOn( b ); //calls stateChange, so is recursive
it = it->nextSibling();
}
}
TQString
SelectionListItem::name() const
{
TQString fullName = text(0).replace('/', "\\/");
TQListViewItem *p = parent();
while ( p ) {
fullName.prepend( p->text(0).replace('/', "\\/") + "/" );
p = p->parent();
}
return fullName;
}
#include "playlistselection.moc"