/*************************************************************************** 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 #include #include #include #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->TDEListView::selectAll(false); // Select the top visible (and matching) item. PlaylistItem *item = static_cast(playlist->itemAt(TQPoint(0, 0))); if(!item) return; // A little bit of a hack to make TQListView repaint 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() { TDEToggleAction *showSearch = new TDEToggleAction(i18n("Show &Search Bar"), "filefind", 0, ActionCollection::actions(), "showSearch"); showSearch->setCheckedState(i18n("Hide &Search Bar")); new TDEAction(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("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() { TDEConfigGroup config(TDEGlobal::config(), "Splitter"); TQValueList splitterSizes = config.readIntListEntry("PlaylistSplitterSizes"); if(splitterSizes.isEmpty()) { splitterSizes.append(100); splitterSizes.append(640); } setSizes(splitterSizes); bool showSearch = config.readBoolEntry("ShowSearch", true); action("showSearch")->setChecked(showSearch); m_searchWidget->setShown(showSearch); } void PlaylistSplitter::saveConfig() { TDEConfigGroup config(TDEGlobal::config(), "Splitter"); config.writeEntry("PlaylistSplitterSizes", sizes()); config.writeEntry("ShowSearch", action("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(w); if(!p) return; m_newVisible = p; m_searchWidget->setSearch(p->search()); m_newVisible = 0; } #include "playlistsplitter.moc"