diff options
Diffstat (limited to 'juk/playlistsplitter.cpp')
-rw-r--r-- | juk/playlistsplitter.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/juk/playlistsplitter.cpp b/juk/playlistsplitter.cpp new file mode 100644 index 00000000..5bc33a69 --- /dev/null +++ b/juk/playlistsplitter.cpp @@ -0,0 +1,237 @@ +/*************************************************************************** + 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" |