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/playlistsplitter.cpp

238 lines
7.5 KiB

/***************************************************************************
begin : Fri Sep 13 2002
copyright : (C) 2002 - 2004 by Scott Wheeler
email : wheeler@kde.org
***************************************************************************/
/***************************************************************************
* *
* 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 <kaction.h>
#include <kdebug.h>
#include <qlayout.h>
#include <qevent.h>
#include "playlistsplitter.h"
#include "searchwidget.h"
#include "playlistsearch.h"
#include "actioncollection.h"
#include "tageditor.h"
#include "collectionlist.h"
#include "playermanager.h"
#include "nowplaying.h"
using namespace ActionCollection;
////////////////////////////////////////////////////////////////////////////////
// public methods
////////////////////////////////////////////////////////////////////////////////
PlaylistSplitter::PlaylistSplitter(QWidget *parent, const char *name) :
QSplitter(Qt::Horizontal, parent, name),
m_newVisible(0),
m_playlistBox(0),
m_searchWidget(0),
m_playlistStack(0),
m_editor(0)
{
setupActions();
setupLayout();
readConfig();
m_editor->slotUpdateCollection();
m_editor->setupObservers();
}
PlaylistSplitter::~PlaylistSplitter()
{
saveConfig();
// Since we want to ensure that the shutdown process for the PlaylistCollection
// (a base class for PlaylistBox) has a chance to write the playlists to disk
// before they are deleted we're explicitly deleting the PlaylistBox here.
delete m_playlistBox;
}
bool PlaylistSplitter::eventFilter(QObject *, QEvent *event)
{
if(event->type() == FocusUpEvent::id) {
m_searchWidget->setFocus();
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
// public slots
////////////////////////////////////////////////////////////////////////////////
void PlaylistSplitter::setFocus()
{
m_searchWidget->setFocus();
}
void PlaylistSplitter::slotFocusCurrentPlaylist()
{
Playlist *playlist = m_playlistBox->visiblePlaylist();
if(playlist) {
playlist->setFocus();
playlist->KListView::selectAll(false);
// Select the top visible (and matching) item.
PlaylistItem *item = static_cast<PlaylistItem *>(playlist->itemAt(QPoint(0, 0)));
if(!item)
return;
// A little bit of a hack to make QListView repaint things properly. Switch
// to single selection mode, set the selection and then switch back.
playlist->setSelectionMode(QListView::Single);
playlist->markItemSelected(item, true);
playlist->setCurrentItem(item);
playlist->setSelectionMode(QListView::Extended);
}
}
////////////////////////////////////////////////////////////////////////////////
// private members
////////////////////////////////////////////////////////////////////////////////
Playlist *PlaylistSplitter::visiblePlaylist() const
{
return m_newVisible ? m_newVisible : m_playlistBox->visiblePlaylist();
}
void PlaylistSplitter::setupActions()
{
KToggleAction *showSearch =
new KToggleAction(i18n("Show &Search Bar"), "filefind", 0, actions(), "showSearch");
showSearch->setCheckedState(i18n("Hide &Search Bar"));
new KAction(i18n("Edit Track Search"), "edit_clear", "F6", this, SLOT(setFocus()), actions(), "editTrackSearch");
}
void PlaylistSplitter::setupLayout()
{
setOpaqueResize(false);
// Create a splitter to go between the playlists and the editor.
QSplitter *editorSplitter = new QSplitter(Qt::Vertical, this, "editorSplitter");
// Create the playlist and the editor.
QWidget *top = new QWidget(editorSplitter);
QVBoxLayout *topLayout = new QVBoxLayout(top);
m_playlistStack = new QWidgetStack(top, "playlistStack");
m_playlistStack->installEventFilter(this);
connect(m_playlistStack, SIGNAL(aboutToShow(QWidget *)), this, SLOT(slotPlaylistChanged(QWidget *)));
m_editor = new TagEditor(editorSplitter, "tagEditor");
// Make the editor as small as possible (or at least as small as recommended)
editorSplitter->setResizeMode(m_editor, QSplitter::FollowSizeHint);
// Create the PlaylistBox
m_playlistBox = new PlaylistBox(this, m_playlistStack, "playlistBox");
connect(m_playlistBox->object(), SIGNAL(signalSelectedItemsChanged()),
this, SLOT(slotPlaylistSelectionChanged()));
connect(m_playlistBox, SIGNAL(signalPlaylistDestroyed(Playlist *)),
m_editor, SLOT(slotPlaylistDestroyed(Playlist *)));
moveToFirst(m_playlistBox);
connect(CollectionList::instance(), SIGNAL(signalCollectionChanged()),
m_editor, SLOT(slotUpdateCollection()));
NowPlaying *nowPlaying = new NowPlaying(top, m_playlistBox);
// Create the search widget -- this must be done after the CollectionList is created.
m_searchWidget = new SearchWidget(top, "searchWidget");
connect(m_searchWidget, SIGNAL(signalQueryChanged()),
this, SLOT(slotShowSearchResults()));
connect(m_searchWidget, SIGNAL(signalDownPressed()),
this, SLOT(slotFocusCurrentPlaylist()));
connect(m_searchWidget, SIGNAL(signalAdvancedSearchClicked()),
m_playlistBox->object(), SLOT(slotCreateSearchPlaylist()));
connect(m_searchWidget, SIGNAL(signalShown(bool)),
m_playlistBox->object(), SLOT(slotSetSearchEnabled(bool)));
connect(action<KToggleAction>("showSearch"), SIGNAL(toggled(bool)),
m_searchWidget, SLOT(setEnabled(bool)));
topLayout->addWidget(nowPlaying);
topLayout->addWidget(m_searchWidget);
topLayout->addWidget(m_playlistStack);
// Show the collection on startup.
m_playlistBox->setSelected(0, true);
}
void PlaylistSplitter::readConfig()
{
KConfigGroup config(KGlobal::config(), "Splitter");
QValueList<int> splitterSizes = config.readIntListEntry("PlaylistSplitterSizes");
if(splitterSizes.isEmpty()) {
splitterSizes.append(100);
splitterSizes.append(640);
}
setSizes(splitterSizes);
bool showSearch = config.readBoolEntry("ShowSearch", true);
action<KToggleAction>("showSearch")->setChecked(showSearch);
m_searchWidget->setShown(showSearch);
}
void PlaylistSplitter::saveConfig()
{
KConfigGroup config(KGlobal::config(), "Splitter");
config.writeEntry("PlaylistSplitterSizes", sizes());
config.writeEntry("ShowSearch", action<KToggleAction>("showSearch")->isChecked());
}
void PlaylistSplitter::slotShowSearchResults()
{
PlaylistList playlists;
playlists.append(visiblePlaylist());
PlaylistSearch search = m_searchWidget->search(playlists);
visiblePlaylist()->setSearch(search);
}
void PlaylistSplitter::slotPlaylistSelectionChanged()
{
m_editor->slotSetItems(visiblePlaylist()->selectedItems());
}
void PlaylistSplitter::slotPlaylistChanged(QWidget *w)
{
Playlist *p = dynamic_cast<Playlist *>(w);
if(!p)
return;
m_newVisible = p;
m_searchWidget->setSearch(p->search());
m_newVisible = 0;
}
#include "playlistsplitter.moc"