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.7 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 <tqlayout.h>
#include <tqevent.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(TQWidget *parent, const char *name) :
TQSplitter(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(TQObject *, TQEvent *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(TQPoint(0, 0)));
if(!item)
return;
// A little bit of a hack to make TQListView tqrepaint things properly. Switch
// to single selection mode, set the selection and then switch back.
playlist->setSelectionMode(TQListView::Single);
playlist->markItemSelected(item, true);
playlist->setCurrentItem(item);
playlist->setSelectionMode(TQListView::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, ActionCollection::actions(), "showSearch");
showSearch->setCheckedState(i18n("Hide &Search Bar"));
new KAction(i18n("Edit Track Search"), "edit_clear", "F6", TQT_TQOBJECT(this), TQT_SLOT(setFocus()), ActionCollection::actions(), "editTrackSearch");
}
void PlaylistSplitter::setupLayout()
{
setOpaqueResize(false);
// Create a splitter to go between the playlists and the editor.
TQSplitter *editorSplitter = new TQSplitter(Qt::Vertical, this, "editorSplitter");
// Create the playlist and the editor.
TQWidget *top = new TQWidget(editorSplitter);
TQVBoxLayout *topLayout = new TQVBoxLayout(top);
m_playlistStack = new TQWidgetStack(top, "playlistStack");
m_playlistStack->installEventFilter(this);
connect(m_playlistStack, TQT_SIGNAL(aboutToShow(TQWidget *)), this, TQT_SLOT(slotPlaylistChanged(TQWidget *)));
m_editor = new TagEditor(editorSplitter, "tagEditor");
// Make the editor as small as possible (or at least as small as recommended)
editorSplitter->setResizeMode(m_editor, TQSplitter::FollowSizeHint);
// Create the PlaylistBox
m_playlistBox = new PlaylistBox(this, m_playlistStack, "playlistBox");
connect(m_playlistBox->object(), TQT_SIGNAL(signalSelectedItemsChanged()),
this, TQT_SLOT(slotPlaylistSelectionChanged()));
connect(m_playlistBox, TQT_SIGNAL(signalPlaylistDestroyed(Playlist *)),
m_editor, TQT_SLOT(slotPlaylistDestroyed(Playlist *)));
moveToFirst(m_playlistBox);
connect(CollectionList::instance(), TQT_SIGNAL(signalCollectionChanged()),
m_editor, TQT_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, TQT_SIGNAL(signalQueryChanged()),
this, TQT_SLOT(slotShowSearchResults()));
connect(m_searchWidget, TQT_SIGNAL(signalDownPressed()),
this, TQT_SLOT(slotFocusCurrentPlaylist()));
connect(m_searchWidget, TQT_SIGNAL(signalAdvancedSearchClicked()),
m_playlistBox->object(), TQT_SLOT(slotCreateSearchPlaylist()));
connect(m_searchWidget, TQT_SIGNAL(signalShown(bool)),
m_playlistBox->object(), TQT_SLOT(slotSetSearchEnabled(bool)));
connect(action<KToggleAction>("showSearch"), TQT_SIGNAL(toggled(bool)),
m_searchWidget, TQT_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");
TQValueList<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(TQWidget *w)
{
Playlist *p = dynamic_cast<Playlist *>(w);
if(!p)
return;
m_newVisible = p;
m_searchWidget->setSearch(p->search());
m_newVisible = 0;
}
#include "playlistsplitter.moc"