/*************************************************************************** kplayernodeview.cpp -------------------- begin : Mon Apr 18 2005 copyright : (C) 2005-2007 by kiriuja email : http://kplayer.sourceforge.net/email.html ***************************************************************************/ /*************************************************************************** * 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 3 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #ifdef DEBUG #define DEBUG_KPLAYER_NODEVIEW #endif #include "kplayernodeview.h" #include "kplayernodeview.moc" #include "kplayernodeaction.h" #include "kplayerplaylist.h" #include "kplayerpropertiesdialog.h" #include "kplayersettings.h" #include "kplayer.h" KPlayerNodeNameValidator::KPlayerNodeNameValidator (KPlayerContainerNode* node, TQObject* parent, const char* name) : TQValidator (parent, name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating node name validator\n"; kdDebugTime() << " URL " << node -> url().url() << "\n"; #endif m_node = node; node -> reference(); node -> populateGroups(); } KPlayerNodeNameValidator::~KPlayerNodeNameValidator() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying node name validator\n"; kdDebugTime() << " URL " << m_node -> url().url() << "\n"; #endif m_node -> vacateGroups(); m_node -> release(); } TQValidator::State KPlayerNodeNameValidator::validate (TQString& input, int&) const { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeNameValidator::validate\n"; kdDebugTime() << " Input " << input << "\n"; #endif if ( ! input.isEmpty() && input.find ('/') < 0 ) { KPlayerNode* node = m_node -> nodeById (input); #ifdef DEBUG_KPLAYER_NODEVIEW if ( node ) kdDebugTime() << " Node " << node -> url().url() << " container " << node -> isContainer() << "\n"; #endif if ( ! node || ! node -> isContainer() ) return TQValidator::Acceptable; } return TQValidator::Intermediate; } KPlayerPropertiesDevice::KPlayerPropertiesDevice (TQWidget* parent, const char* name) : KPlayerPropertiesDevicePage (parent, name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating device properties page\n"; #endif m_node = KPlayerNode::root() -> getNodeByUrl ("kplayer:/devices"); m_node -> reference(); m_node -> populateGroups(); TQString list (KPlayerTVProperties::channelListFromCountry()); for ( uint i = 0; i < channellistcount; i ++ ) { c_channel_list -> insertItem (i18n(channellists[i].name)); if ( channellists[i].id == list ) c_channel_list -> setCurrentItem (i); } pathChanged (c_path -> text()); typeChanged (c_type -> currentItem()); c_driver -> setCurrentItem (2); } KPlayerPropertiesDevice::~KPlayerPropertiesDevice() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying device properties page\n"; #endif m_node -> vacateGroups(); m_node -> release(); } void KPlayerPropertiesDevice::pathChanged (const TQString& path) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerPropertiesDevice::pathChanged\n"; kdDebugTime() << " Path " << path << "\n"; #endif TQString fullpath (path), slash ("/"); if ( ! path.startsWith (slash) ) fullpath.prepend (slash); bool enable = ! c_name -> text().isEmpty() && fullpath != slash && ! m_node -> nodeById (fullpath); parent() -> enableButton (KDialogBase::Ok, enable); } void KPlayerPropertiesDevice::typeChanged (int index) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerPropertiesDevice::typeChanged\n"; kdDebugTime() << " Type " << c_type -> text (index) << "\n"; #endif if ( index == 2 ) { l_channel_list -> show(); c_channel_list -> show(); l_driver -> show(); c_driver -> show(); } else { l_channel_list -> hide(); c_channel_list -> hide(); l_driver -> hide(); c_driver -> hide(); } if ( index == 3 ) { l_channel_file -> show(); c_channel_file -> show(); } else { l_channel_file -> hide(); c_channel_file -> hide(); } } void KPlayerPropertiesDevice::addDevice (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerPropertiesDevice::addDevice\n"; #endif TQString fullpath (c_path -> text()), slash ("/"); if ( ! fullpath.startsWith (slash) ) fullpath.prepend (slash); KPlayerDeviceProperties* media = KPlayerMedia::deviceProperties (m_node -> url (fullpath)); media -> setName (c_name -> text()); int index = c_type -> currentItem(); media -> setType (index == 1 ? "DVD" : index == 2 ? "TV" : index == 3 ? "DVB" : "CD"); if ( index == 2 ) { ((KPlayerTunerProperties*) media) -> setChannelList (channellists[c_channel_list -> currentItem()].id); int driver = c_driver -> currentItem(); ((KPlayerTVProperties*) media) -> setInputDriver (driver == 0 ? "bsdbt848" : driver == 1 ? "v4l" : "v4l2"); } else if ( index == 3 && ! c_channel_file -> text().isEmpty() ) ((KPlayerTunerProperties*) media) -> setChannelList (c_channel_file -> text()); media -> commit(); TQStringList list; list.append (fullpath); m_node -> addedBranches (list); KPlayerMedia::release (media); } KPlayerDeviceDialog::KPlayerDeviceDialog (TQWidget* parent, const char* name) : KDialogBase (parent, name, true, i18n("Add device"), Help | Ok | Cancel) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating device dialog\n"; #endif setMainWidget (new KPlayerPropertiesDevice (this)); } KPlayerDeviceDialog::~KPlayerDeviceDialog (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying device dialog\n"; #endif } void KPlayerListViewItem::initialize (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Initializing item\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif node() -> reference(); update(); } int KPlayerListViewItem::compare (TQListViewItem* item, int, bool ascending) const { int result = node() -> compare (nodeForItem (item)); return ascending ? result : - result; } KPlayerListViewItem* KPlayerListViewItem::itemForNode (KPlayerNode* node) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewItem::itemForNode\n"; #endif if ( ! node ) return 0; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " URL " << node -> url() << "\n"; #endif KPlayerListViewItem* item = (KPlayerListViewItem*) firstChild(); while ( item ) { if ( item -> node() == node ) return item; item = (KPlayerListViewItem*) item -> nextSibling(); } return 0; } TQString KPlayerListViewItem::icon (void) const { return node() -> icon(); } bool KPlayerListViewItem::hasChildren (void) { return false; } void KPlayerListViewItem::resetCustomOrder (void) { } void KPlayerListViewItem::update (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewItem::update\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif setPixmap (0, DesktopIcon (icon(), TDEIcon::SizeSmall)); TQStringList::ConstIterator iterator (nodeView() -> attributeNames().begin()); for ( int i = 0; iterator != nodeView() -> attributeNames().end(); ++ iterator, ++ i ) { TQString text (node() -> media() -> asString (*iterator)); setText (nodeView() -> header() -> mapToSection (i), text); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " " << *iterator << " " << text << "\n"; #endif } } void KPlayerListViewItem::update (const TQString& name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewItem::update\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif int index = nodeView() -> attributeNames().findIndex (name); if ( index > 0 ) { TQString text (node() -> media() -> asString (name)); setText (nodeView() -> header() -> mapToSection (index), text); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " " << name << " " << text << "\n"; #endif } } void KPlayerListViewItem::terminate (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Terminating item\n"; kdDebugTime() << " URL " << node() -> url() << "\n"; #endif nodeView() -> itemTerminating (this); delete this; } KPlayerListViewItem::~KPlayerListViewItem() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying list view item\n"; #endif node() -> release(); } void KPlayerListViewGroupItem::initialize (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Initializing group item\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif KPlayerListViewItem::initialize(); } KPlayerListViewGroupItem::~KPlayerListViewGroupItem() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying list view group item\n"; #endif } void KPlayerListViewFolderItem::initialize (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Initializing folder item\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif KPlayerListViewGroupItem::initialize(); connectNode(); } void KPlayerListViewFolderItem::connectNodeCommon (void) { TQObject::connect (node(), SIGNAL (nodesAdded (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*)), nodeView(), SLOT (added (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*))); TQObject::connect (node(), SIGNAL (nodesRemoved (KPlayerContainerNode*, const KPlayerNodeList&)), nodeView(), SLOT (removed (KPlayerContainerNode*, const KPlayerNodeList&))); TQObject::connect (node(), SIGNAL (nodeUpdated (KPlayerContainerNode*, KPlayerNode*)), nodeView(), SLOT (updated (KPlayerContainerNode*, KPlayerNode*))); } void KPlayerListViewFolderItem::connectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Connecting list view folder item node\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif connectNodeCommon(); if ( isOpen() ) TQObject::connect (node(), SIGNAL (attributesUpdated (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&)), listView(), SLOT (updateAttributes (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&))); } void KPlayerListViewFolderItem::disconnectNodeCommon (void) { TQObject::disconnect (node(), SIGNAL (nodesAdded (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*)), nodeView(), SLOT (added (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*))); TQObject::disconnect (node(), SIGNAL (nodesRemoved (KPlayerContainerNode*, const KPlayerNodeList&)), nodeView(), SLOT (removed (KPlayerContainerNode*, const KPlayerNodeList&))); TQObject::disconnect (node(), SIGNAL (nodeUpdated (KPlayerContainerNode*, KPlayerNode*)), nodeView(), SLOT (updated (KPlayerContainerNode*, KPlayerNode*))); } void KPlayerListViewFolderItem::disconnectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Disconnecting list view folder item node\n"; kdDebugTime() << " URL " << node() -> url() << "\n"; #endif disconnectNodeCommon(); TQObject::disconnect (node(), SIGNAL (attributesUpdated (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&)), listView(), SLOT (updateAttributes (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&))); } void KPlayerListViewFolderItem::populateNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Populating list view folder item node\n"; #endif node() -> populate(); listView() -> updateAttributes (node() -> attributeCounts(), KPlayerPropertyCounts()); TQObject::connect (node(), SIGNAL (attributesUpdated (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&)), listView(), SLOT (updateAttributes (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&))); } void KPlayerListViewFolderItem::vacateNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Vacating list view folder item node\n"; #endif TQObject::disconnect (node(), SIGNAL (attributesUpdated (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&)), listView(), SLOT (updateAttributes (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&))); listView() -> updateAttributes (KPlayerPropertyCounts(), node() -> attributeCounts()); node() -> vacate(); } void KPlayerListViewFolderItem::updateColumns (void) { listView() -> updateAttributes (KPlayerPropertyCounts(), KPlayerPropertyCounts()); } void KPlayerListViewFolderItem::resetCustomOrder (void) { if ( isOpen() && childCount() ) { node() -> setCustomOrder (false); for ( TQListViewItem* item = firstChild(); item; item = item -> nextSibling() ) ((KPlayerListViewItem*) item) -> resetCustomOrder(); } } void KPlayerListViewFolderItem::setOpen (bool open) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewFolderItem::setOpen " << open << "\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif bool change = open != isOpen(); if ( change ) { terminateChildren(); if ( open ) populateNode(); else vacateNode(); } KPlayerListViewGroupItem::setOpen (open); if ( change ) { setPixmap (0, DesktopIcon (icon(), TDEIcon::SizeSmall)); if ( open ) added (node() -> nodes()); updateColumns(); } } TQString KPlayerListViewFolderItem::icon (void) const { return isOpen() ? node() -> openIcon() : node() -> icon(); } bool KPlayerListViewFolderItem::hasChildren (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewFolderItem::hasChildren\n"; #endif return node() -> hasNodes(); } KPlayerListViewItem* KPlayerListViewFolderItem::createChild (KPlayerListViewItem* after, KPlayerNode* node) { return node -> isContainer() ? (KPlayerListViewItem*) new KPlayerListViewFolderItem (this, after, node) : new KPlayerListViewItem (this, after, node); } void KPlayerListViewFolderItem::added (const KPlayerNodeList& nodes, KPlayerNode* after) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewFolderItem::added\n"; #endif if ( isOpen() ) { int count = childCount(); KPlayerListViewItem* item = after == node() ? 0 : itemForNode (after); KPlayerNodeListIterator iterator (nodes); while ( KPlayerNode* node = iterator.current() ) { item = createChild (item, node); if ( item ) { item -> initialize(); item -> setExpandable (item -> hasChildren()); if ( nodeView() -> moving() ) item -> setSelected (true); } ++ iterator; } setExpandable (childCount() > 0); if ( childCount() - count == 1 && nodeForItem (item) -> isContainer() ) listView() -> setOpen (item, true); } else { bool was_empty = ! parent() && ! isExpandable(); setExpandable (hasChildren()); if ( was_empty && isExpandable() && listView() -> childCount() == 1 ) listView() -> setOpen (this, true); } repaint(); } void KPlayerListViewFolderItem::removed (const KPlayerNodeList& nodes) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListViewFolderItem::removed\n"; #endif if ( isOpen() ) { KPlayerNodeListIterator iterator (nodes); while ( KPlayerNode* node = iterator.current() ) { KPlayerListViewItem* item = itemForNode (node); if ( item ) { nodeView() -> keepUpCurrentItem (this, item); item -> terminate(); } ++ iterator; } setExpandable (childCount() > 0); } else setExpandable (hasChildren()); repaint(); } void KPlayerListViewFolderItem::terminateChildren (void) { while ( KPlayerListViewItem* item = (KPlayerListViewItem*) firstChild() ) item -> terminate(); } void KPlayerListViewFolderItem::terminate (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Terminating folder item\n"; kdDebugTime() << " URL " << node() -> url() << "\n"; #endif disconnectNode(); if ( isOpen() ) { terminateChildren(); vacateNode(); } KPlayerListViewGroupItem::terminate(); } KPlayerListViewFolderItem::~KPlayerListViewFolderItem() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying list view folder item\n"; #endif } int KPlayerTreeViewFolderItem::compare (TQListViewItem* item, int, bool) const { return node() -> compareByName (nodeForItem (item)); } void KPlayerTreeViewFolderItem::connectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Connecting tree view folder item node\n"; kdDebugTime() << " URL " << node() -> url().url() << "\n"; #endif connectNodeCommon(); } void KPlayerTreeViewFolderItem::disconnectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Disconnecting tree view folder item node\n"; kdDebugTime() << " URL " << node() -> url() << "\n"; #endif disconnectNodeCommon(); } void KPlayerTreeViewFolderItem::populateNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Populating tree view folder item node groups\n"; #endif node() -> populateGroups(); } void KPlayerTreeViewFolderItem::vacateNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Vacating tree view folder item node groups\n"; #endif node() -> vacateGroups(); } void KPlayerTreeViewFolderItem::updateColumns (void) { } bool KPlayerTreeViewFolderItem::hasChildren (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeViewFolderItem::hasChildren\n"; #endif return node() -> hasGroups(); } KPlayerListViewItem* KPlayerTreeViewFolderItem::createChild (KPlayerListViewItem* item, KPlayerNode* node) { return node -> isContainer() ? (KPlayerListViewItem*) new KPlayerTreeViewFolderItem (this, item, node) : 0; } KPlayerTreeViewFolderItem::~KPlayerTreeViewFolderItem() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying tree view folder item\n"; #endif } KPlayerHistoryActionList::KPlayerHistoryActionList (KPlayerHistory& history, const KPlayerHistory::Iterator& current, const TQString& text, const TQString& status, const TQString& whatsthis, TQObject* parent, const char* name) : KPlayerActionList (text, status, whatsthis, parent, name), m_history (history), m_current (current) { #ifdef DEBUG_KPLAYER_ACTIONLIST kdDebugTime() << "Creating history action list\n"; #endif } KPlayerHistoryActionList::~KPlayerHistoryActionList() { #ifdef DEBUG_KPLAYER_ACTIONLIST kdDebugTime() << "Destroying history action list\n"; #endif } void KPlayerHistoryActionList::update (void) { #ifdef DEBUG_KPLAYER_ACTIONLIST kdDebugTime() << "KPlayerHistoryActionList::update\n"; #endif unplug(); if ( m_history.count() > 1 ) { uint limit = KPlayerEngine::engine() -> configuration() -> recentMenuSize(); uint halflimit = limit / 2; uint count = 0; KPlayerHistory::ConstIterator iterator (m_history.end()); do { -- iterator; if ( actions().count() == limit ) m_actions.removeFirst(); TDEToggleAction* action = new TDEToggleAction ((*iterator).m_name, 0, this, SLOT(actionActivated()), this); if ( iterator == m_current ) { action -> setChecked (true); ++ count; } else if ( count ) ++ count; updateAction (action); m_actions.append (action); } while ( iterator != m_history.begin() && (count < halflimit || actions().count() < limit) ); plug(); } } void KPlayerHistoryActionList::actionActivated (TDEAction*, int index) { #ifdef DEBUG_KPLAYER_ACTIONLIST kdDebugTime() << "KPlayerHistoryActionList::actionActivated\n"; kdDebugTime() << " Index " << index << "\n"; #endif if ( ! m_history.isEmpty() ) { KPlayerHistory::Iterator iterator (m_history.end()); do { -- iterator; -- index; } while ( iterator != m_history.begin() && index >= 0 ); if ( index < 0 ) emit activated (iterator); } } KPlayerNodeView::KPlayerNodeView (TQWidget* parent, const char* name) : TDEListView (parent, name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating node view\n"; #endif m_node = 0; m_last_node = 0; m_moving = false; m_in_focus = false; m_popup_menu_shown = false; m_mouse_pressed = false; m_dragging = false; m_last_item = 0; m_editing_item = 0; m_editing_column = 0; } KPlayerNodeView::~KPlayerNodeView() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying node view\n"; #endif } void KPlayerNodeView::initialize (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Initializing node view\n"; #endif setAcceptDrops (true); setDragEnabled (true); setAllColumnsShowFocus (true); setDefaultRenameAction (Accept); setShowSortIndicator (true); setTabOrderedRenaming (false); renameLineEdit() -> setFrame (true); //header() -> disconnect (SIGNAL (clicked (int)), this); //header() -> disconnect (SIGNAL (sectionClicked (int)), this); //header() -> disconnect (SIGNAL (sectionHandleDoubleClicked (int)), this); connect (this, SIGNAL (selectionChanged()), SLOT (itemSelectionChanged())); connect (this, SIGNAL (executed (TQListViewItem*)), SLOT (itemExecuted (TQListViewItem*))); if ( library() -> popupMenu() ) connect (this, SIGNAL (contextMenu (TDEListView*, TQListViewItem*, const TQPoint&)), SLOT (showContextMenu (TDEListView*, TQListViewItem*, const TQPoint&))); connect (this, SIGNAL (itemRenamed (TQListViewItem*, const TQString&, int)), SLOT (edited (TQListViewItem*, const TQString&, int))); header() -> installEventFilter (this); renameLineEdit() -> installEventFilter (this); } void KPlayerNodeView::terminate (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Terminating node view\n"; #endif disconnect (this, SIGNAL (selectionChanged()), this, SLOT (itemSelectionChanged())); setRootNode (0); } void KPlayerNodeView::connectNodeCommon (void) { connect (rootNode(), SIGNAL (nodesAdded (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*)), SLOT (added (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*))); connect (rootNode(), SIGNAL (nodesRemoved (KPlayerContainerNode*, const KPlayerNodeList&)), SLOT (removed (KPlayerContainerNode*, const KPlayerNodeList&))); connect (rootNode(), SIGNAL (nodeUpdated (KPlayerContainerNode*, KPlayerNode*)), this, SLOT (updated (KPlayerContainerNode*, KPlayerNode*))); } void KPlayerNodeView::disconnectNodeCommon (void) { disconnect (rootNode(), SIGNAL (nodesAdded (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*)), this, SLOT (added (KPlayerContainerNode*, const KPlayerNodeList&, KPlayerNode*))); disconnect (rootNode(), SIGNAL (nodesRemoved (KPlayerContainerNode*, const KPlayerNodeList&)), this, SLOT (removed (KPlayerContainerNode*, const KPlayerNodeList&))); disconnect (rootNode(), SIGNAL (nodeUpdated (KPlayerContainerNode*, KPlayerNode*)), this, SLOT (updated (KPlayerContainerNode*, KPlayerNode*))); } KPlayerNode* KPlayerNodeView::currentNode (void) const { return activeNode(); } KPlayerContainerNode* KPlayerNodeView::activeContainer (void) const { return ! currentItem() ? rootNode() : currentItem() -> isSelected() && activeNode() -> isContainer() ? (KPlayerContainerNode*) activeNode() : activeNode() -> parent(); } void KPlayerNodeView::setRootNode (KPlayerContainerNode* node) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::setRootNode\n"; if ( node ) kdDebugTime() << " URL " << node -> url().url() << "\n"; #endif if ( rootNode() ) { disconnectNode(); while ( KPlayerListViewItem* item = (KPlayerListViewItem*) firstChild() ) item -> terminate(); rootNode() -> vacate(); rootNode() -> release(); } m_node = node; if ( node ) { KPlayerItemProperties::resetMetaInfoTimer(); setRootIsDecorated (! node -> groupsFirst() || ! node -> parent()); node -> reference(); node -> populate(); while ( columns() > 0 ) removeColumn (0); setupColumns(); added (node, node -> nodes()); connectNode(); } } KPlayerListViewItem* KPlayerNodeView::itemForNode (KPlayerNode* node, bool open) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::itemForNode\n"; #endif if ( ! node ) return 0; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " URL " << node -> url() << "\n"; #endif KPlayerListViewItem* item; if ( ! node -> parent() || rootNode() == node -> parent() ) item = (KPlayerListViewItem*) firstChild(); else { item = itemForNode (node -> parent(), open); if ( ! item || ! open && ! item -> isOpen() ) return 0; if ( ! item -> isOpen() ) setOpen (item, true); item = (KPlayerListViewItem*) item -> firstChild(); } while ( item ) { if ( item -> node() == node ) return item; item = (KPlayerListViewItem*) item -> nextSibling(); } return 0; } void KPlayerNodeView::added (KPlayerContainerNode* parent, const KPlayerNodeList& nodes, KPlayerNode* after) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::added\n"; #endif if ( ! parent || parent == rootNode() ) { int count = childCount(); KPlayerListViewItem* item = after == parent ? 0 : itemForNode (after); KPlayerNodeListIterator iterator (nodes); while ( KPlayerNode* node = iterator.current() ) { item = createChild (item, node); if ( item ) { item -> initialize(); update (item); item -> setExpandable (item -> hasChildren()); if ( moving() ) item -> setSelected (true); } ++ iterator; } sort(); if ( childCount() - count == 1 && nodeForItem (item) -> isContainer() ) setOpen (item, true); } else if ( rootIsDecorated() ) { KPlayerListViewFolderItem* item = (KPlayerListViewFolderItem*) itemForNode (parent); if ( item ) { item -> added (nodes, after); if ( item -> isOpen() ) item -> sort(); } } if ( inFocus() ) updateActions(); else if ( sibling() -> inFocus() ) sibling() -> updateActions(); } void KPlayerNodeView::removed (KPlayerContainerNode* parent, const KPlayerNodeList& nodes) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::removed\n"; #endif if ( ! parent || parent == rootNode() ) { KPlayerNodeListIterator iterator (nodes); while ( KPlayerNode* node = iterator.current() ) { KPlayerListViewItem* item = itemForNode (node); if ( item ) item -> terminate(); ++ iterator; } } else if ( rootIsDecorated() ) { KPlayerListViewFolderItem* item = (KPlayerListViewFolderItem*) itemForNode (parent); if ( item ) item -> removed (nodes); } if ( inFocus() ) updateActions(); else if ( sibling() -> inFocus() ) sibling() -> updateActions(); } void KPlayerNodeView::updated (KPlayerContainerNode*, KPlayerNode* node) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::updated\n"; #endif KPlayerListViewItem* item = itemForNode (node); if ( item ) { item -> update(); update (item); } } void KPlayerNodeView::update (KPlayerListViewItem*) { } void KPlayerNodeView::startEditing (TQListViewItem* item, int column) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::startEditing\n"; kdDebugTime() << " Item " << item -> text (0) << "\n"; kdDebugTime() << " Column " << column << "\n"; #endif stopEditing(); sibling() -> stopEditing(); setRenameable (column, true); setItemsRenameable (true); if ( item -> itemAbove() ) ensureItemVisible (item -> itemAbove()); if ( item -> itemBelow() ) ensureItemVisible (item -> itemBelow()); ensureItemVisible (item); TQRect rect (itemRect (item)); rect.moveLeft (0); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " ItemRect " << rect.x() << "x" << rect.y() << " " << rect.width() << "x" << rect.height() << "\n"; kdDebugTime() << " ItemPos " << item -> itemPos() << "\n"; #endif viewport() -> repaint (rect, false); int pos = header() -> sectionPos (column); int width = header() -> sectionSize (column); int index = header() -> mapToIndex (column); int before = index > 0 ? header() -> sectionSize (header() -> mapToSection (index - 1)) : 0; int after = index < columns() - 1 ? header() -> sectionSize (header() -> mapToSection (index + 1)) : 0; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; kdDebugTime() << " Name " << attributeNames() [index] << "\n"; kdDebugTime() << " Position " << pos << "\n"; kdDebugTime() << " Width " << width << "\n"; kdDebugTime() << " Before " << before << "\n"; kdDebugTime() << " After " << after << "\n"; kdDebugTime() << " Visible " << visibleWidth() << "\n"; kdDebugTime() << " Frame " << renameLineEdit() -> frame() << "\n"; #endif if ( before + width > visibleWidth() - 50 ) before = 0; if ( pos + width + after > contentsX() + visibleWidth() && pos > contentsX() + before || pos < contentsX() + before ) setContentsPos (pos < contentsX() + before || before + width + after > visibleWidth() ? pos - before : pos + width + after - visibleWidth(), contentsY()); header() -> repaint (false); rect = itemRect (item); rect.moveLeft (0); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " ItemRect " << rect.x() << "x" << rect.y() << " " << rect.width() << "x" << rect.height() << "\n"; kdDebugTime() << " ItemPos " << item -> itemPos() << "\n"; #endif viewport() -> repaint (rect, false); m_editing_item = (KPlayerListViewItem*) item; m_editing_column = column; rename (item, column); connect (this, SIGNAL(contentsMoving(int, int)), SLOT(moveLineEdit(int, int))); connect (header(), SIGNAL (sizeChange (int, int, int)), SLOT (moveLineEdit (int, int, int))); } void KPlayerNodeView::stopEditing (bool save, int state) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::stopEditing " << save << " " << state << "\n"; #endif disconnect (header(), SIGNAL (sizeChange (int, int, int)), this, SLOT (moveLineEdit (int, int, int))); disconnect (this, SIGNAL(contentsMoving(int, int)), this, SLOT(moveLineEdit(int, int))); if ( renameLineEdit() -> isHidden() ) return; TQListViewItem* item = m_editing_item; TQKeyEvent keyevent (TQEvent::KeyPress, save ? TQt::Key_Return : TQt::Key_Escape, 0, state); TQApplication::sendEvent (renameLineEdit(), &keyevent); repaintItem (item); setItemsRenameable (false); m_editing_item = 0; m_editing_column = 0; treeView() -> resetActiveNode(); } void KPlayerNodeView::moveLineEdit (int section, int from, int to) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveLineEdit\n"; kdDebugTime() << " Change " << section << ": " << from << " -> " << to << "\n"; #endif moveLineEdit(); } void KPlayerNodeView::moveLineEdit (int x, int y) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveLineEdit\n"; kdDebugTime() << " From " << contentsX() << "x" << contentsY() << "\n"; kdDebugTime() << " To " << x << "x" << y << "\n"; kdDebugTime() << " Edit " << renameLineEdit() -> x() << "x" << renameLineEdit() -> y() << "\n"; #endif TQTimer::singleShot (0, this, SLOT (moveLineEdit())); } void KPlayerNodeView::moveLineEdit (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveLineEdit\n"; #endif if ( m_editing_item ) { TQRect rect (itemRect (m_editing_item)); int x = rect.x() - 1; int index = header() -> mapToIndex (m_editing_column); for ( int i = 0; i < index; i ++ ) x += columnWidth (header() -> mapToSection (i)); if ( m_editing_column == 0 ) x += (m_editing_item -> depth() + (rootIsDecorated() ? 1 : 0)) * treeStepSize(); if ( m_editing_item -> pixmap (m_editing_column) ) x += m_editing_item -> pixmap (m_editing_column) -> width(); renameLineEdit() -> setGeometry (x, rect.y() - 1, columnWidth (header() -> mapToSection (index)), renameLineEdit() -> height()); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Moved " << renameLineEdit() -> x() << "x" << renameLineEdit() -> y() << "\n"; #endif } } void KPlayerNodeView::setColumnWidth (int column, int width) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::setColumnWidth\n"; kdDebugTime() << " Column " << column << "\n"; kdDebugTime() << " Width " << width << "\n"; #endif TDEListView::setColumnWidth (column, width); moveLineEdit(); } bool KPlayerNodeView::eventFilter (TQObject* object, TQEvent* event) { static bool recursion = false, move_recursion = false; static bool firstcolumn = false, anothercolumn = false; if ( object == header() && (event -> type() == TQEvent::MouseButtonPress || event -> type() == TQEvent::MouseButtonRelease || event -> type() == TQEvent::MouseMove) ) { TQMouseEvent* mouseevent = (TQMouseEvent*) event; const TQPoint& position (mouseevent -> pos()); int section = header() -> sectionAt (position.x() + header() -> offset()); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::eventFilter mouse move " << position.x() << "x" << position.y() << " offset " << header() -> offset() << " section " << section << "\n"; #endif if ( (mouseevent -> stateAfter() & TQt::LeftButton) == TQt::LeftButton ) { if ( event -> type() == TQEvent::MouseButtonPress ) (section == 0 ? firstcolumn : anothercolumn) = true; else if ( event -> type() == TQEvent::MouseMove && (firstcolumn || anothercolumn && section <= 0) ) return true; } else { //if ( event -> type() == TQEvent::MouseButtonRelease && (firstcolumn && section || anothercolumn && section <= 0) ) // return true; firstcolumn = anothercolumn = false; } } else if ( ! move_recursion && m_editing_item && object == renameLineEdit() && event -> type() == TQEvent::Move ) { #ifdef DEBUG_KPLAYER_NODEVIEW TQMoveEvent* moveevent = (TQMoveEvent*) event; kdDebugTime() << "KPlayerNodeView::eventFilter move " << moveevent -> oldPos().x() << "x" << moveevent -> oldPos().y() << " => " << moveevent -> pos().x() << "x" << moveevent -> pos().y() << " " << event -> spontaneous() << "\n"; #endif move_recursion = true; moveLineEdit(); move_recursion = false; } else if ( ! recursion && m_editing_item && object == renameLineEdit() && (event -> type() == TQEvent::KeyPress || event -> type() == TQEvent::AccelOverride) ) { TQKeyEvent* keyevent = (TQKeyEvent*) event; int key = keyevent -> key(); int state = keyevent -> state(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::eventFilter " << event -> type() << " " << key << " " << state << "\n"; #endif if ( event -> type() == TQEvent::AccelOverride ) { if ( key == TQt::Key_Return || key == TQt::Key_Enter || key == TQt::Key_Escape || key == TQt::Key_Tab || key == TQt::Key_Backtab || key == TQt::Key_Up || key == TQt::Key_Down ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " override\n"; #endif keyevent -> accept(); return true; } } else if ( key == TQt::Key_Return || key == TQt::Key_Enter ) { recursion = true; stopEditing (true, state); recursion = false; return true; } else if ( key == TQt::Key_Escape ) { recursion = true; stopEditing (false, state); recursion = false; return true; } else if ( key == TQt::Key_Tab || key == TQt::Key_Backtab ) { if ( (state & (TQt::AltButton | TQt::ControlButton | TQt::MetaButton)) == 0 ) { KPlayerListViewItem* item = m_editing_item; int column = m_editing_column; recursion = true; stopEditing (true, state); recursion = false; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Item " << item -> text (0) << "\n"; kdDebugTime() << " Column " << column << "\n"; #endif column = header() -> mapToIndex (column); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << column << "\n"; kdDebugTime() << " Name " << attributeNames() [column] << "\n"; #endif if ( column >= 0 ) { bool edit = false; bool container = item -> node() -> isContainer(); bool tab = key == TQt::Key_Tab && (state & TQt::ShiftButton) == 0; do { while ( ! edit && (container ? column != 0 : tab ? column < attributeCount() - 1 : column > 0) ) { tab ? ++ column : -- column; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Name " << attributeNames() [column] << "\n"; kdDebugTime() << " Index " << column << "\n"; #endif edit = column ? ! container && KPlayerMedia::info (attributeNames() [column]) -> canEdit() : item -> node() -> canRename(); } if ( ! edit ) { item = tab ? (KPlayerListViewItem*) item -> itemBelow() : (KPlayerListViewItem*) item -> itemAbove(); if ( item ) { container = item -> node() -> isContainer(); column = tab ? -1 : container ? 1 : attributeCount(); } } } while ( item && ! edit ); if ( item ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Name " << attributeNames() [column] << "\n"; kdDebugTime() << " Index " << column << "\n"; #endif column = header() -> mapToSection (column); if ( column >= 0 ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Column " << column << "\n"; kdDebugTime() << " Item " << item -> text (0) << "\n"; #endif startEditing (item, column); } } } } return true; } else if ( key == TQt::Key_Up || key == TQt::Key_Down ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::eventFilter " << (key == TQt::Key_Up ? "Up" : "Down") << "\n"; #endif if ( (state & (TQt::AltButton | TQt::ControlButton | TQt::MetaButton)) == 0 ) { KPlayerListViewItem* item = m_editing_item; int column = m_editing_column; recursion = true; stopEditing (true, state); recursion = false; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Item " << item -> text (0) << "\n"; kdDebugTime() << " Column " << column << "\n"; #endif int index = header() -> mapToIndex (column); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; kdDebugTime() << " Name " << attributeNames() [index] << "\n"; #endif if ( index >= 0 ) { bool up = key == TQt::Key_Up; do item = up ? (KPlayerListViewItem*) item -> itemAbove() : (KPlayerListViewItem*) item -> itemBelow(); while ( item && (index ? item -> node() -> isContainer() : ! item -> node() -> canRename()) ); if ( item ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Item " << item -> text (0) << "\n"; #endif startEditing (item, column); } } } return true; } } return TDEListView::eventFilter (object, event); } void KPlayerNodeView::findDropTarget (const TQPoint& pos, TQListViewItem*& parent, TQListViewItem*& after) { parent = after = 0; if ( ! firstChild() ) return; TQPoint p (contentsToViewport (pos)); KPlayerListViewItem* item = (KPlayerListViewItem*) itemAt (p); KPlayerNode* node = item ? item -> node() : rootNode(); KPlayerContainerNode* container = node -> isContainer() ? (KPlayerContainerNode*) node : node -> parent(); KPlayerListViewItem* above = (KPlayerListViewItem*) (item ? item -> itemAbove() : lastItem()); int offset = p.y() - (item ? itemRect (item).topLeft().y() : itemRect (above).bottomLeft().y()); int height = (item ? item : above) -> height() / 2; /*if ( above && offset < height ) { KPlayerNode* aboveNode = above -> node(); KPlayerContainerNode* aboveContainer = aboveNode -> isContainer() ? (KPlayerContainerNode*) aboveNode : aboveNode -> parent(); if ( aboveContainer -> canAddLeaves() && aboveContainer -> allowsCustomOrder() ) { item = above; node = aboveNode; container = aboveContainer; } }*/ if ( ! item ) return; if ( ! container -> allowsCustomOrder() || node -> isContainer() && offset <= height ) { parent = node -> isContainer() ? item : item -> parent(); return; } if ( node -> isContainer() && (p.x() >= depthToPixels (item -> depth() + 1) || item -> isOpen() && item -> firstChild()) ) { parent = item; after = item; return; } if ( item -> nextSibling() ) { parent = item -> parent(); after = item; return; } TQListViewItem* last = item; above = (KPlayerListViewItem*) item -> parent(); while ( above && ! last -> nextSibling() && p.x() < depthToPixels (last -> depth()) ) { if ( ((KPlayerContainerNode*) above -> node()) -> canAddLeaves() ) item = above; last = above; above = (KPlayerListViewItem*) above -> parent(); } after = item; parent = item ? item -> parent() : 0; } void KPlayerNodeView::findDrop (const TQPoint& pos, TQListViewItem*& parent, TQListViewItem*& after) { findDropTarget (pos, parent, after); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::findDrop\n"; if ( parent ) kdDebugTime() << " Parent " << parent -> text (0) << "\n"; if ( after ) kdDebugTime() << " After " << after -> text (0) << "\n"; #endif if ( parent == after ) after = 0; } extern TQDragManager* qt_dnd_manager; bool KPlayerNodeView::acceptDrag (TQDropEvent* event) const { if ( event -> pos().x() < 0 || event -> pos().y() < 0 ) return false; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::acceptDrag\n"; kdDebugTime() << " Action " << event -> action() << "\n"; #endif event -> accept (false); event -> acceptAction (false); KPlayerNodeView* that = (KPlayerNodeView*) this; TQListViewItem *parent, *after; that -> findDropTarget (event -> pos(), parent, after); #ifdef DEBUG_KPLAYER_NODEVIEW if ( parent ) kdDebugTime() << " Parent " << parent -> text (0) << "\n"; if ( after ) kdDebugTime() << " After " << after -> text (0) << "\n"; #endif KURL::List urls; bool urldrag = KURLDrag::canDecode (event); if ( urldrag && KURLDrag::decode (event, urls) || event -> source() == viewport() || event -> source() == sibling() -> viewport() ) { KPlayerContainerNode* target = parent ? ((KPlayerListViewGroupItem*) parent) -> node() : rootNode(); const KPlayerNodeView* view = event -> source() == viewport() ? this : sibling(); if ( urldrag && m_drag_node_list.isEmpty() ) that -> m_drag_node_list = KPlayerNodeList::fromUrlList (urls); KPlayerNodeList nodes (urldrag ? m_drag_node_list : view -> getSelectedNodes()); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Target " << target -> url().url() << "\n"; #endif if ( target && ! nodes.isEmpty() && target -> canCopy (nodes) ) { if ( after ) that -> cleanItemHighlighter(); else that -> cleanDropVisualizer(); that -> setDropHighlighter (after == 0); that -> setDropVisualizer (after != 0); KPlayerNode* node = nodes.getFirst(); bool control = kPlayerSettings() -> control(); bool shift = kPlayerSettings() -> shift(); bool canlink = target -> canLink (nodes); bool canmove = ! urldrag && node -> parent() -> canRemove(); if ( control ) { if ( shift ) shift = canlink; } else if ( shift ) { shift = canmove || canlink; control = ! canmove; } else if ( canlink ) control = shift = true; else if ( ! urldrag && target -> preferMove (node) ) shift = true; else control = true; int state = (kPlayerSettings() -> anyShift() ? TQt::ShiftButton : 0) | (kPlayerSettings() -> anyControl() ? TQt::ControlButton : 0); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Accept " << event -> isAccepted() << "\n"; kdDebugTime() << " Action " << event -> isActionAccepted() << "\n"; kdDebugTime() << " Control real " << kPlayerSettings() -> control() << " current " << kPlayerSettings() -> anyControl() << " need " << control << "\n"; kdDebugTime() << " Shift real " << kPlayerSettings() -> shift() << " current " << kPlayerSettings() -> anyShift() << " need " << shift << "\n"; #endif if ( control && ! kPlayerSettings() -> anyControl() ) { kPlayerSettings() -> setFakeControl(); TQApplication::postEvent (that, new TQKeyEvent (TQEvent::KeyPress, TQt::Key_Control, 0, state)); } else if ( ! control && kPlayerSettings() -> anyControl() ) { kPlayerSettings() -> setNoControl(); TQApplication::postEvent (that, new TQKeyEvent (TQEvent::KeyRelease, TQt::Key_Control, 0, state)); } if ( shift && ! kPlayerSettings() -> anyShift() ) { kPlayerSettings() -> setFakeShift(); TQApplication::postEvent (that, new TQKeyEvent (TQEvent::KeyPress, TQt::Key_Shift, 0, state)); } else if ( ! shift && kPlayerSettings() -> anyShift() ) { kPlayerSettings() -> setNoShift(); TQApplication::postEvent (that, new TQKeyEvent (TQEvent::KeyRelease, TQt::Key_Shift, 0, state)); } if ( kPlayerSettings() -> anyControl() && kPlayerSettings() -> anyShift() ) event -> setAction (TQDropEvent::Link); else if ( kPlayerSettings() -> anyControl() ) event -> setAction (TQDropEvent::Copy); else if ( kPlayerSettings() -> anyShift() ) event -> setAction (TQDropEvent::Move); event -> acceptAction(); qt_dnd_manager -> killTimers(); return true; } } that -> cleanItemHighlighter(); that -> cleanDropVisualizer(); that -> setDropHighlighter (false); that -> setDropVisualizer (false); kPlayerSettings() -> resetControl(); kPlayerSettings() -> resetShift(); return false; } void KPlayerNodeView::contentsDragMoveEvent (TQDragMoveEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsDragMoveEvent\n"; #endif //if ( acceptDrag (event) ) TDEListView::contentsDragMoveEvent (event); if ( event -> isAccepted() ) event -> accept (TQRect (TQCursor::pos(), TQCursor::pos())); qt_dnd_manager -> killTimers(); } void KPlayerNodeView::contentsDragEnterEvent (TQDragEnterEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsDragEnterEvent\n"; #endif m_dragging = true; m_drag_node_list.releaseAll(); m_drag_node_list.clear(); kPlayerSettings() -> resetControl(); kPlayerSettings() -> resetShift(); TDEListView::contentsDragEnterEvent (event); } void KPlayerNodeView::contentsDragLeaveEvent (TQDragLeaveEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsDragLeaveEvent\n"; #endif m_drag_node_list.releaseAll(); m_drag_node_list.clear(); kPlayerSettings() -> resetControl(); kPlayerSettings() -> resetShift(); TDEListView::contentsDragLeaveEvent (event); } void KPlayerNodeView::contentsDropEvent (TQDropEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsDropEvent\n"; #endif if ( acceptDrag (event) ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Drag accepted\n"; #endif TQListViewItem *parent = 0, *after = 0; findDropTarget (event -> pos(), parent, after); #ifdef DEBUG_KPLAYER_NODEVIEW if ( parent ) kdDebugTime() << " Parent " << parent -> text (0) << "\n"; if ( after ) kdDebugTime() << " After " << after -> text (0) << "\n"; #endif KURL::List urls; bool own = event -> source() == viewport(); bool urldrag = KURLDrag::canDecode (event) && KURLDrag::decode (event, urls); KPlayerContainerNode* target = parent ? ((KPlayerListViewGroupItem*) parent) -> node() : rootNode(); const KPlayerNodeView* view = own ? this : sibling(); if ( urldrag && m_drag_node_list.isEmpty() ) m_drag_node_list = KPlayerNodeList::fromUrlList (urls); KPlayerNodeList nodes (urldrag ? m_drag_node_list : view -> getSelectedNodes()); if ( ! nodes.isEmpty() ) { if ( after ) setNodeOrder (target); KPlayerNode* node = after ? ((KPlayerListViewItem*) after) -> node() : 0; if ( event -> isActionAccepted() && event -> action() == TQDropEvent::Move ) { m_moving = own && ! urldrag; target -> move (nodes, node); m_moving = false; } else target -> add (nodes, event -> isActionAccepted() && event -> action() == TQDropEvent::Link, node); } } event -> setPoint (TQPoint (-1, -1)); TDEListView::contentsDropEvent (event); m_drag_node_list.releaseAll(); m_drag_node_list.clear(); setCurrentItem (m_last_item); m_dragging = false; m_mouse_pressed = false; } bool KPlayerNodeView::event (TQEvent* e) { if ( e -> type() == TQEvent::AccelOverride ) { TQKeyEvent* keyevent = (TQKeyEvent*) e; int key = keyevent -> key(); int state = keyevent -> state(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::event AccelOverride " << key << " " << state << "\n"; #endif if ( (state & TQt::ShiftButton) == TQt::ShiftButton && (key == TQt::Key_Left || key == TQt::Key_Right) || (state & TQt::ControlButton) == TQt::ControlButton && (key == TQt::Key_Up || key == TQt::Key_Down || key == TQt::Key_A) ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " override\n"; #endif keyevent -> accept(); return true; } } return TDEListView::event (e); } void KPlayerNodeView::keyPressEvent (TQKeyEvent* keyevent) { int key = keyevent -> key(); int state = keyevent -> state(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::keyPressEvent " << key << " " << state << "\n"; #endif if ( currentItem() && state == 0 && (key == TQt::Key_Return || key == TQt::Key_Enter) ) { if ( ! activeNode() -> isContainer() ) play(); else if ( rootIsDecorated() ) setOpen (currentItem(), ! currentItem() -> isOpen()); else treeView() -> setActiveNode (activeContainer()); keyevent -> accept(); } else TDEListView::keyPressEvent (keyevent); } void KPlayerNodeView::setNodeOrder (KPlayerContainerNode*) { } void KPlayerNodeView::connectActions (void) { library() -> disconnectActions(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Connecting actions\n"; #endif connect (action ("library_play"), SIGNAL(activated()), SLOT(play())); connect (action ("library_play_next"), SIGNAL(activated()), SLOT(playNext())); connect (action ("library_queue"), SIGNAL(activated()), SLOT(queue())); connect (action ("library_queue_next"), SIGNAL(activated()), SLOT(queueNext())); connect (action ("library_add_files"), SIGNAL(activated()), SLOT(addFiles())); connect (action ("library_add_url"), SIGNAL(activated()), SLOT(addUrl())); connect (action ("library_add_group"), SIGNAL(activated()), SLOT(addGroup())); connect (action ("library_add_to_new_playlist"), SIGNAL(activated()), SLOT(addToNewPlaylist())); connect (action ("library_add_to_playlists"), SIGNAL(activated()), SLOT(addToPlaylists())); connect (playlistActionList(), SIGNAL(activated(KPlayerNode*)), SLOT(addToPlaylist(KPlayerNode*))); connect (action ("library_add_to_collection"), SIGNAL(activated()), SLOT(addToCollection())); connect (action ("library_rename"), SIGNAL(activated()), SLOT(editName())); connect (editActionList(), SIGNAL(activated(int)), listView(), SLOT(editField(int))); connect (action ("library_properties"), SIGNAL(activated()), SLOT(properties())); connect (action ("library_select_all"), SIGNAL(activated()), listView(), SLOT(selectAll())); connect (action ("library_move_up"), SIGNAL(activated()), SLOT(moveUp())); connect (action ("library_move_down"), SIGNAL(activated()), SLOT(moveDown())); connect (action ("library_remove"), SIGNAL(activated()), SLOT(remove())); connect (columnActionList(), SIGNAL(activated(int)), listView(), SLOT(toggleColumn(int))); connect (action ("library_go_back"), SIGNAL(activated()), treeView(), SLOT(goBack())); connect (action ("library_go_forward"), SIGNAL(activated()), treeView(), SLOT(goForward())); connect (action ("library_go_up"), SIGNAL(activated()), listView(), SLOT(goUp())); connect (action ("library_go_down"), SIGNAL(activated()), listView(), SLOT(goDown())); connect (action ("library_go_to_origin"), SIGNAL(activated()), SLOT(goToOrigin())); } void KPlayerNodeView::showContextMenu (TDEListView*, TQListViewItem*, const TQPoint& point) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Showing node view popup menu\n"; #endif stopEditing(); sibling() -> stopEditing(); setFocus(); connectActions(); updateActions(); m_popup_menu_shown = true; m_mouse_pressed = false; library() -> popupMenu() -> popup (point); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Shown node view popup menu\n"; #endif } void KPlayerNodeView::focusInEvent (TQFocusEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "List view getting focus\n"; #endif TDEListView::focusInEvent (event); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "List view got focus\n"; #endif m_in_focus = true; connectActions(); updateActions(); library() -> setLastActiveView (this); } void KPlayerNodeView::focusOutEvent (TQFocusEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "List view loosing focus\n"; #endif TDEListView::focusOutEvent (event); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "List view lost focus\n"; #endif m_in_focus = false; } void KPlayerNodeView::contentsMousePressEvent (TQMouseEvent* e) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsMousePressEvent enter\n"; kdDebugTime() << " Button " << e -> button() << "\n"; kdDebugTime() << " State " << e -> stateAfter() << "\n"; #endif m_mouse_pressed = true; m_popup_menu_shown = e -> button() == TQt::RightButton; m_last_node = currentNode(); TDEListView::contentsMousePressEvent (e); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsMousePressEvent leave\n"; #endif } void KPlayerNodeView::contentsMouseReleaseEvent (TQMouseEvent* e) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsMouseReleaseEvent enter\n"; kdDebugTime() << " Button " << e -> button() << "\n"; kdDebugTime() << " State " << e -> stateAfter() << "\n"; #endif TDEListView::contentsMouseReleaseEvent (e); m_mouse_pressed = (e -> stateAfter() & TQt::MouseButtonMask) != TQt::NoButton; if ( ! m_mouse_pressed && ! m_popup_menu_shown ) { if ( m_dragging ) { m_dragging = false; setCurrentItem (m_last_item); } else itemSelectionChanged(); } #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::contentsMouseReleaseEvent leave\n"; #endif } void KPlayerNodeView::itemExecuted (TQListViewItem* item) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Item executed\n"; #endif KPlayerNode* node = nodeForItem (item); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " URL " << node -> url().url() << "\n"; #endif if ( node -> isContainer() ) { if ( ! rootIsDecorated() ) treeView() -> setActiveNode ((KPlayerContainerNode*) node); else if ( activeNode() == m_last_node ) setOpen (item, ! item -> isOpen()); } else { item -> setSelected (true); item -> repaint(); play(); } } void KPlayerNodeView::itemSelectionChanged (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Selection changed\n"; #endif if ( ! m_mouse_pressed && currentItem() != m_last_item ) { activeItemChanged(); m_last_item = (KPlayerListViewItem*) currentItem(); if ( inFocus() ) updateActions(); else if ( sibling() -> inFocus() ) sibling() -> updateActions(); } } void KPlayerNodeView::activeItemChanged (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Active item changed\n"; #endif } void KPlayerNodeView::itemTerminating (TQListViewItem* item) { if ( item == m_editing_item ) stopEditing(); if ( item == m_last_item ) m_last_item = 0; } void KPlayerNodeView::keepUpCurrentItem (TQListViewItem* current, TQListViewItem* item) { TQListViewItem* lvi = currentItem(); if ( lvi != current ) { while ( lvi && lvi != item ) lvi = lvi -> parent(); if ( lvi ) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::keepUpCurrentItem\n"; kdDebugTime() << " Item " << item -> text (0) << "\n"; kdDebugTime() << " Current " << current -> text (0) << "\n"; #endif setCurrentItem (current); TQTimer::singleShot (0, treeView(), SLOT (activateCurrentItem())); } } } void KPlayerNodeView::setOpen (TQListViewItem* item, bool open) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::setOpen " << open << "\n"; kdDebugTime() << " URL " << nodeForItem (item) -> url().url() << "\n"; #endif if ( ! rootIsDecorated() ) return; if ( ! open ) keepUpCurrentItem (item, item); TDEListView::setOpen (item, open); } void KPlayerNodeView::play (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::play\n"; #endif playlist() -> play (getSelectedNodes()); } void KPlayerNodeView::playNext (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::playNext\n"; #endif playlist() -> playNext (getSelectedNodes()); } void KPlayerNodeView::queue (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::queue\n"; #endif playlist() -> queue (getSelectedNodes()); } void KPlayerNodeView::queueNext (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::queueNext\n"; #endif playlist() -> queueNext (getSelectedNodes()); } void KPlayerNodeView::addFiles (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addFiles\n"; #endif activeContainer() -> append (kPlayerEngine() -> openFiles (i18n("Add files"))); } void KPlayerNodeView::addUrl (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addUrl\n"; #endif activeContainer() -> append (kPlayerEngine() -> openUrl (i18n("Add URL"))); } void KPlayerNodeView::addGroup (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addGroup\n"; #endif KPlayerContainerNode* container = activeContainer(); if ( container -> isDevices() ) { KPlayerDeviceDialog dialog (this); if ( dialog.exec() == KDialogBase::Accepted ) dialog.addDevice(); } else { KPlayerNodeNameValidator validator (container); TQString name = KInputDialog::text (container -> isPlaylist() ? i18n("Add playlist") : i18n("Add folder"), container -> isPlaylist() ? i18n("Playlist name") : i18n("Folder name"), TQString::null, 0, 0, 0, &validator, TQString::null, i18n("Folder name field allows you to enter a name for a new folder. OK button will be enabled when you enter a unique and valid name.")); if ( ! name.isNull() ) container -> addBranch (name); } } void KPlayerNodeView::addToNewPlaylist (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToNewPlaylist\n"; #endif KPlayerNodeList list (getSelectedNodes()); if ( ! list.isEmpty() ) addToNewPlaylist (list); } void KPlayerNodeView::addToNewPlaylistUrls (const KURL::List& urls) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToNewPlaylist urls\n"; kdDebugTime() << " URLs " << urls.count() << "\n"; #endif KPlayerContainerNode* container = playlistActionList() -> node(); if ( playlist() -> checkUrls (urls) ) { KPlayerNodeList list (KPlayerNodeList::fromUrlList (urls)); if ( ! list.isEmpty() ) { container = addToNewPlaylist (list); list.releaseAll(); } } if ( container ) library() -> open (container); } KPlayerContainerNode* KPlayerNodeView::addToNewPlaylist (const KPlayerNodeList& list) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToNewPlaylist list\n"; kdDebugTime() << " Count " << list.count() << "\n"; #endif KPlayerContainerNode* container = playlistActionList() -> node(); KPlayerNodeNameValidator validator (container); TQString name = KInputDialog::text (i18n("Add to new playlist"), i18n("Playlist name"), TQString::null, 0, 0, 0, &validator, TQString::null, i18n("Playlist name field allows you to enter a name for a new playlist. OK button will be enabled when you enter a unique and valid name.")); if ( ! name.isNull() ) { container -> addBranch (name); container = container -> getNodeById (name); if ( container ) { KPlayerContainerNode* node = list.count() == 1 && list.getFirst() -> isContainer() ? (KPlayerContainerNode*) list.getFirst() : 0; if ( node ) node -> populate(); const KPlayerNodeList& nodes = node ? node -> nodes() : list; if ( ! nodes.isEmpty() ) container -> append (nodes); if ( node ) node -> vacate(); } return container; } return 0; } void KPlayerNodeView::addToPlaylistsUrls (const KURL::List& urls) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToPlaylists urls\n"; kdDebugTime() << " URLs " << urls.count() << "\n"; #endif if ( playlist() -> checkUrls (urls) ) { KPlayerNodeList list (KPlayerNodeList::fromUrlList (urls)); if ( ! list.isEmpty() ) { playlistActionList() -> node() -> append (list); list.releaseAll(); } } library() -> open (playlistActionList() -> node()); } void KPlayerNodeView::addToPlaylists (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToPlaylists\n"; #endif KPlayerNodeList list (getSelectedNodes()); if ( ! list.isEmpty() ) if ( list.count() == 1 && list.getFirst() == playlist() -> nowplaying() ) playlist() -> addToPlaylists(); else playlistActionList() -> node() -> append (list); } void KPlayerNodeView::addToPlaylist (KPlayerNode* node) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToPlaylist\n"; kdDebugTime() << " Node " << node -> url().url() << "\n"; #endif KPlayerNodeList list (getSelectedNodes()); KPlayerContainerNode* container = list.count() == 1 && list.getFirst() -> isContainer() ? (KPlayerContainerNode*) list.getFirst() : 0; if ( container ) container -> populate(); const KPlayerNodeList& nodes = container ? container -> nodes() : list; if ( ! nodes.isEmpty() && node -> isContainer() ) ((KPlayerContainerNode*) node) -> append (nodes); if ( container ) container -> vacate(); } void KPlayerNodeView::addToCollectionUrls (const KURL::List& urls) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToCollection urls\n"; kdDebugTime() << " URLs " << urls.count() << "\n"; #endif KPlayerContainerNode* node = KPlayerNode::root() -> getNodeByUrl ("kplayer:/collection"); if ( playlist() -> checkUrls (urls) ) { KPlayerNodeList list (KPlayerNodeList::fromUrlList (urls)); if ( ! list.isEmpty() ) { node -> add (list); list.releaseAll(); } } library() -> open (node); } void KPlayerNodeView::addToCollection (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::addToCollection\n"; #endif KPlayerNodeList list (getSelectedNodes()); if ( ! list.isEmpty() ) if ( list.count() == 1 && list.getFirst() == playlist() -> nowplaying() ) playlist() -> addToCollection(); else KPlayerNode::root() -> getNodeByUrl ("kplayer:/collection") -> add (list); } void KPlayerNodeView::editName (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::editName\n"; #endif KPlayerListViewItem* item = itemForNode (activeNode()); if ( item ) { int section = header() -> mapToSection (0); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Section " << section << "\n"; #endif startEditing (item, section); } } void KPlayerNodeView::edited (TQListViewItem* item, const TQString& value, int column) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::edited column " << column << " to '" << value << "'\n"; #endif int index = header() -> mapToIndex (column); if ( index >= 0 && index < attributeCount() ) { const TQString& name (attributeNames() [index]); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Column " << name << " " << index << "\n"; #endif nodeForItem (item) -> media() -> fromString (name, value); } setItemsRenameable (false); m_editing_item = 0; m_editing_column = 0; treeView() -> resetActiveNode(); } void KPlayerNodeView::properties (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::properties\n"; #endif KPlayerNode* node = activeNode(); if ( node && ! node -> hasProperties() && node -> isContainer() ) node = ((KPlayerContainerNode*) node) -> origin(); if ( node && node -> hasProperties() ) { KPlayerPropertiesDialog* dialog; if ( ! node -> isContainer() ) dialog = KPlayerPropertiesDialog::createDialog ((KPlayerTrackProperties*) node -> media()); else { const TQString& type = ((KPlayerDeviceProperties*) node -> media()) -> type(); if ( type == "TV" ) dialog = new KPlayerTVDevicePropertiesDialog; else if ( type == "DVB" ) dialog = new KPlayerDVBDevicePropertiesDialog; else dialog = new KPlayerDevicePropertiesDialog; } dialog -> setup (node -> media() -> url()); dialog -> exec(); delete dialog; } } void KPlayerNodeView::moveUp (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveUp\n"; #endif moveUp (rootNode(), (KPlayerListViewItem*) firstChild()); } void KPlayerNodeView::moveUp (KPlayerContainerNode* parent, KPlayerListViewItem* item) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveUp\n"; kdDebugTime() << " URL " << parent -> url() << "\n"; #endif KPlayerNodeList list; KPlayerNode *after = parent, *previous = 0; while ( item ) { if ( item -> isOpen() && item -> firstChild() ) moveUp ((KPlayerContainerNode*) item -> node(), (KPlayerListViewItem*) item -> firstChild()); if ( item -> isSelected() ) { if ( previous ) list.append (item -> node()); } else { if ( ! list.isEmpty() ) { m_moving = true; parent -> move (list, after); m_moving = false; list.clear(); } if ( previous ) after = previous; previous = item -> node(); } item = (KPlayerListViewItem*) item -> nextSibling(); } if ( ! list.isEmpty() ) { m_moving = true; parent -> move (list, after); m_moving = false; list.clear(); } } void KPlayerNodeView::moveDown (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveDown\n"; #endif moveDown (rootNode(), (KPlayerListViewItem*) firstChild()); } void KPlayerNodeView::moveDown (KPlayerContainerNode* parent, KPlayerListViewItem* item) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::moveDown\n"; kdDebugTime() << " URL " << parent -> url() << "\n"; #endif KPlayerNodeList list; while ( item ) { if ( item -> isOpen() && item -> firstChild() ) moveDown ((KPlayerContainerNode*) item -> node(), (KPlayerListViewItem*) item -> firstChild()); KPlayerListViewItem* next = (KPlayerListViewItem*) item -> nextSibling(); if ( item -> isSelected() ) list.append (item -> node()); else if ( ! list.isEmpty() ) { m_moving = true; parent -> move (list, item -> node()); m_moving = false; list.clear(); } item = next; } } void KPlayerNodeView::remove (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::remove\n"; #endif remove (rootNode(), (KPlayerListViewItem*) firstChild()); } void KPlayerNodeView::remove (KPlayerContainerNode* parent, KPlayerListViewItem* item) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::remove\n"; kdDebugTime() << " URL " << parent -> url() << "\n"; #endif KPlayerNodeList list; while ( item ) { if ( item -> isSelected() ) list.append (item -> node()); else if ( item -> isOpen() && item -> firstChild() ) remove ((KPlayerContainerNode*) item -> node(), (KPlayerListViewItem*) item -> firstChild()); item = (KPlayerListViewItem*) item -> nextSibling(); } if ( ! list.isEmpty() ) parent -> remove (list); } void KPlayerNodeView::goToOrigin (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerNodeView::goToOrigin\n"; #endif KPlayerContainerNode* container = activeContainer(); if ( container && container -> origin() ) treeView() -> setActiveNode (container -> origin()); } KPlayerPlaylist* KPlayerNodeView::playlist (void) { return ((KPlayer*) kapp -> mainWidget()) -> playlist(); } KPlayerListView::KPlayerListView (TQWidget* parent, const char* name) : KPlayerNodeView (parent, name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating list view\n"; #endif config() -> setGroup ("Multimedia Library"); m_attribute_order = config() -> hasKey ("Column Order") ? config() -> readListEntry ("Column Order") : KPlayerMedia::defaultOrder(); TQStringList::ConstIterator iterator (attributeOrder().begin()); while ( iterator != attributeOrder().end() ) { const TQString& name (*iterator); if ( ! name.isEmpty() && config() -> hasKey ("Show Column " + name) ) KPlayerMedia::info (name) -> setShow (config() -> readBoolEntry ("Show Column " + name)); ++ iterator; } } KPlayerListView::~KPlayerListView() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying list view\n"; #endif } void KPlayerListView::initialize (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Initializing list view\n"; #endif KPlayerNodeView::initialize(); setSelectionMode (TQListView::Extended); connect (header(), SIGNAL (indexChange (int, int, int)), SLOT (headerIndexChange (int, int, int))); //connect (header(), SIGNAL (clicked (int)), SLOT (headerClicked (int))); //connect (header(), SIGNAL (sectionHandleDoubleClicked (int)), SLOT (headerAdjustColumn (int))); resize (2000, height()); m_home_media = KPlayerNode::root() -> nodeById ("file:" + TQDir::homeDirPath()) -> media(); } void KPlayerListView::terminate (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Terminating list view\n"; #endif config() -> setGroup ("Multimedia Library"); if ( attributeOrder() == KPlayerMedia::defaultOrder() ) config() -> deleteEntry ("Column Order"); else config() -> writeEntry ("Column Order", attributeOrder()); KPlayerPropertyInfoMap::ConstIterator iterator (KPlayerMedia::info().begin()); while ( iterator != KPlayerMedia::info().end() ) { const TQString& name (iterator.key()); KPlayerPropertyInfo* info = iterator.data(); if ( info -> show() == info -> showByDefault() ) config() -> deleteEntry ("Show Column " + name); else config() -> writeEntry ("Show Column " + name, info -> show()); ++ iterator; } KPlayerNodeView::terminate(); } void KPlayerListView::setupColumns (void) { m_attribute_names.clear(); m_available_attributes.clear(); m_attribute_states.clear(); m_column_states.clear(); m_editable_attributes.clear(); m_attribute_counts.clear(); updateAttributes (rootNode() -> attributeCounts(), KPlayerPropertyCounts()); } KPlayerListViewItem* KPlayerListView::createChild (KPlayerListViewItem* after, KPlayerNode* node) { return ! node -> isContainer() ? new KPlayerListViewItem (this, after, node) : rootIsDecorated() ? (KPlayerListViewItem*) new KPlayerListViewFolderItem (this, after, node) : (KPlayerListViewItem*) new KPlayerListViewGroupItem (this, after, node); } KPlayerNodeView* KPlayerListView::sibling (void) const { return library() -> treeView(); } void KPlayerListView::connectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Connecting list view node\n"; kdDebugTime() << " URL " << rootNode() -> url().url() << "\n"; #endif loadColumnWidths(); connectNodeCommon(); connect (rootNode(), SIGNAL (attributesUpdated (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&)), this, SLOT (updateAttributes (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&))); } void KPlayerListView::disconnectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Disonnecting list view node\n"; kdDebugTime() << " URL " << rootNode() -> url() << "\n"; #endif saveColumnWidths(); disconnectNodeCommon(); disconnect (rootNode(), SIGNAL (attributesUpdated (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&)), this, SLOT (updateAttributes (const KPlayerPropertyCounts&, const KPlayerPropertyCounts&))); } bool KPlayerListView::showingMedia (void) const { for ( TQListViewItem* item = firstChild(); item; item = item -> itemBelow() ) if ( nodeForItem (item) -> hasProperties() ) return true; return false; } void KPlayerListView::updateActions (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Updating list view actions\n"; #endif TQListViewItemIterator iterator (this, TQListViewItemIterator::Selected); bool selection = iterator.current() != 0; KPlayerNode* node = activeNode(); KPlayerContainerNode* container = activeContainer(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Selection " << selection << "\n"; if ( node ) kdDebugTime() << " Active " << node -> url().url() << "\n"; if ( container ) kdDebugTime() << " Container " << container -> url().url() << "\n"; #endif action ("library_play") -> setEnabled (selection); action ("library_play_next") -> setEnabled (selection); bool enable = selection && rootNode() -> canQueue(); action ("library_queue") -> setEnabled (enable); action ("library_queue_next") -> setEnabled (enable); enable = container && (container -> canAddLeaves() || container -> canAddBranches()); library() -> emitEnableActionGroup ("library_add", enable); enable = container && container -> canAddLeaves(); action ("library_add_files") -> setEnabled (enable); action ("library_add_url") -> setEnabled (enable); enable = container && container -> canAddBranches(); TDEAction* a = action ("library_add_group"); a -> setEnabled (enable); if ( container && container -> isDevices() ) { a -> setText (i18n("&Device...")); a -> setStatusText (i18n("Adds a new device")); a -> setWhatsThis (i18n("Add device command allows you to add a new device. You will need to give the new device a unique name and specify the device path and type.")); } else if ( container && container -> isPlaylist() ) { a -> setText (i18n("&Playlist...")); a -> setStatusText (i18n("Adds a new playlist")); a -> setWhatsThis (i18n("Add playlist command allows you to add a new playlist. You will need to give the new playlist a unique name.")); } else { a -> setText (i18n("F&older...")); a -> setStatusText (i18n("Adds a new subfolder to the selected folder")); a -> setWhatsThis (i18n("Add folder command allows you to add a new subfolder to the selected folder. You will need to give the new subfolder a unique name.")); } enable = selection && rootNode() -> canSaveAsPlaylist(); library() -> emitEnableActionGroup ("library_add_to", enable); action ("library_add_to_new_playlist") -> setEnabled (enable); action ("library_add_to_playlists") -> setEnabled (enable); action ("library_add_to_collection") -> setEnabled (enable); action ("library_rename") -> setEnabled (node && node -> canRename()); library() -> emitEnableActionGroup ("library_edit", node && ! node -> isContainer()); action ("library_properties") -> setEnabled (node && (node -> hasProperties() || node -> isContainer() && ((KPlayerContainerNode*) node) -> origin() && ((KPlayerContainerNode*) node) -> origin() -> hasProperties())); action ("library_select_all") -> setEnabled (firstChild() != 0); enable = selection && rootNode() -> allowsCustomOrder(); action ("library_move_up") -> setEnabled (enable); action ("library_move_down") -> setEnabled (enable); action ("library_remove") -> setEnabled (selection && rootNode() -> canRemove()); library() -> emitEnableActionGroup ("library_columns", ! columnActionList() -> isEmpty() && showingMedia()); action ("library_go_down") -> setEnabled (container != rootNode()); action ("library_go_to_origin") -> setEnabled (container -> origin() != 0); treeView() -> updateNavigationActions(); } void KPlayerListView::selectAll (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::selectAll\n"; #endif TDEListView::selectAll (true); } void KPlayerListView::goUp (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::goUp\n"; #endif if ( rootNode() -> parent() -> parent() ) treeView() -> setActiveNode (rootNode() -> parent()); } void KPlayerListView::goDown (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::goDown\n"; #endif treeView() -> setActiveNode (activeContainer()); } void KPlayerListView::toggleColumn (int index) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::toggleColumn\n"; kdDebugTime() << " Index " << index << "\n"; #endif const TQString& name (availableAttributes() [index]); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Name " << name << "\n"; #endif KPlayerPropertyInfo* info = KPlayerMedia::info (name); info -> setShow (! attributeStates() [name]); m_attribute_states.insert (name, info -> show()); m_column_states.insert (name, info -> show()); saveColumnWidths(); if ( info -> show() ) { index = setupColumn (name); for ( TQListViewItem* item = firstChild(); item; item = item -> itemBelow() ) ((KPlayerListViewItem*) item) -> update (name); loadColumnWidth (index); if ( index == columns() - 1 ) loadColumnWidth (index - 1); } else cleanupColumn (name); //adjustLastColumn(); } void KPlayerListView::editField (int index) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::editField\n"; kdDebugTime() << " Index " << index << "\n"; #endif const TQString& name (editableAttributes() [index]); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Name " << name << "\n"; #endif index = attributeNames().findIndex (name); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; #endif if ( index < 0 ) { index = availableAttributes().findIndex (name); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; #endif if ( index < 0 ) { insertAttribute (m_available_attributes, name); m_attribute_states.insert (name, false); index = availableAttributes().findIndex (name); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; #endif } toggleColumn (index); index = attributeNames().findIndex (name); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; #endif } if ( index >= 0 ) { index = header() -> mapToSection (index); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Column " << index << "\n"; #endif startEditing (currentItem(), index); } } void KPlayerListView::update (KPlayerListViewItem* item) { if ( nodeForItem (item) -> media() == m_home_media ) item -> setText (0, nodeForItem (item) -> id()); } void KPlayerListView::updateAttributes (const KPlayerPropertyCounts& added, const KPlayerPropertyCounts& removed) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::updateAttributes\n"; #endif saveColumnWidths(); //if ( columns() ) // loadColumnWidth (columns() - 1); m_attribute_counts.add (added); m_attribute_counts.subtract (removed); KPlayerPropertyCounts::ConstIterator it = attributeCounts().begin(); while ( it != attributeCounts().end() ) { const TQString& name (it.key()); if ( KPlayerMedia::info (name) -> canShow() && ! attributeOrder().contains (name) ) m_attribute_order.insert (m_attribute_order.find (""), name); ++ it; } TQStringList::ConstIterator iterator (attributeOrder().begin()); if ( columns() == 0 ) setupColumn (*iterator); ++ iterator; while ( iterator != attributeOrder().end() ) { const TQString& name (*iterator); if ( ! name.isEmpty() ) { KPlayerPropertyInfo* info = KPlayerMedia::info (name); if ( ! attributeCounts().contains (name) || rootNode() -> isDirectory() && name == "Path" ) { m_available_attributes.remove (name); m_attribute_states.insert (name, false); } else { if ( ! availableAttributes().contains (name) ) insertAttribute (m_available_attributes, name); m_attribute_states.insert (name, info -> show() && attributeCounts().contains (name) || showColumn (name)); } if ( ! info -> canEdit() ) m_editable_attributes.remove (name); else if ( ! editableAttributes().contains (name) ) insertAttribute (m_editable_attributes, name); if ( ! attributeNames().contains (name) && attributeStates() [name] ) setupColumn (name); else if ( attributeNames().contains (name) && ! attributeStates() [name] ) cleanupColumn (name); } ++ iterator; } loadColumnWidths(); columnActionList() -> update(); editActionList() -> update(); if ( inFocus() ) updateActions(); else if ( sibling() -> inFocus() ) sibling() -> updateActions(); } void KPlayerListView::insertAttribute (TQStringList& list, const TQString& name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::insertAttribute\n"; kdDebugTime() << " Name " << name << "\n"; #endif list.remove (name); TQStringList::ConstIterator iterator (attributeOrder().begin()); TQStringList::Iterator it (list.begin()); while ( it != list.end() && iterator != attributeOrder().end() && *iterator != name ) { if ( *it == *iterator ) ++ it; ++ iterator; } list.insert (it, name); } void KPlayerListView::headerIndexChange (int section, int from, int to) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::headerIndexChange\n"; kdDebugTime() << " Column " << section << "\n"; kdDebugTime() << " From " << from << "\n"; kdDebugTime() << " To " << to << "\n"; #endif if ( from == to || from == 0 || to == 0 ) return; TQString name (attributeNames() [from]); TQString after (attributeNames() [from < to ? to : to - 1]); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Name " << name << "\n"; kdDebugTime() << " After " << after << "\n"; #endif m_attribute_order.remove (name); TQStringList::Iterator iterator (m_attribute_order.find (after)); ++ iterator; m_attribute_order.insert (iterator, name); insertAttribute (m_attribute_names, name); KPlayerPropertyInfo* info = KPlayerMedia::info (name); insertAttribute (m_available_attributes, name); if ( info -> canEdit() ) insertAttribute (m_editable_attributes, name); if ( from == columns() - 1 || to == columns() - 1 ) loadColumnWidth (from == columns() - 1 ? to : columns() - 2); columnActionList() -> update(); editActionList() -> update(); moveLineEdit(); } KPlayerNodeList KPlayerListView::getSelectedNodes (void) const { KPlayerNodeList list; for ( TQListViewItem* item = firstChild(); item; item = item -> nextSibling() ) if ( item -> isSelected() ) list.append (nodeForItem (item)); else getSelectedNodes (item, list); return list; } void KPlayerListView::getSelectedNodes (TQListViewItem* item, KPlayerNodeList& list) const { for ( item = item -> firstChild(); item; item = item -> nextSibling() ) if ( item -> isSelected() ) list.append (nodeForItem (item)); else getSelectedNodes (item, list); } void KPlayerListView::setSorting (int column, bool ascending) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::setSorting\n"; kdDebugTime() << " Column " << column << "\n"; #endif if ( column >= 0 ) { int index = header() -> mapToIndex (column); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; #endif if ( index >= 0 ) { const TQString& name (attributeNames() [index]); config() -> setGroup ("Multimedia Library"); config() -> writeEntry ("Sort Column", name); config() -> writeEntry ("Sort Ascending", ascending); KPlayerNode::setSorting (name, ascending); rootNode() -> setCustomOrder (false); for ( TQListViewItem* item = firstChild(); item; item = item -> nextSibling() ) ((KPlayerListViewItem*) item) -> resetCustomOrder(); } } KPlayerNodeView::setSorting (column, ascending); } void KPlayerListView::cleanupColumn (const TQString& name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::cleanupColumn\n"; #endif int index = attributeNames().findIndex (name); if ( index >= 0 ) { m_attribute_names.remove (m_attribute_names.at (index)); int section = header() -> mapToSection (index); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " -" << name << " " << index << "/" << section << "\n"; #endif removeColumn (section); } } int KPlayerListView::setupColumn (const TQString& name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::setupColumn\n"; #endif insertAttribute (m_attribute_names, name); int index = attributeNames().findIndex (name); const TQString& caption (KPlayerMedia::info (name) -> caption()); int section = addColumn (caption.isEmpty() ? i18n(name.utf8()) : caption); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " +" << name << " " << index << "/" << section << "\n"; #endif if ( index != section ) header() -> moveSection (section, index); return index; } void KPlayerListView::loadColumnWidth (int index) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::loadColumnWidth\n"; kdDebugTime() << " Index " << index << "\n"; #endif int column = header() -> mapToSection (index); const TQString& name (attributeNames() [index]); config() -> setGroup ("Multimedia Library"); int width = config() -> readNumEntry ("Column " + name + " Width"); if ( width <= 0 && index == 0 ) width = 200; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Column " << column << "\n"; kdDebugTime() << " Name " << name << "\n"; kdDebugTime() << " Width " << width << "\n"; #endif header() -> setStretchEnabled (false, index); setColumnWidthMode (column, TQListView::Manual); if ( width <= 0 ) adjustColumn (column); else setColumnWidth (column, width); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Actual " << columnWidth (column) << "\n"; kdDebugTime() << " Mode " << columnWidthMode (column) << "\n"; kdDebugTime() << " Stretch " << header() -> isStretchEnabled (index) << "\n"; #endif } #if 0 void KPlayerListView::adjustLastColumn (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::adjustLastColumn\n"; #endif int index = columns() - 1; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Index " << index << "\n"; #endif if ( index >= 0 ) { if ( header() -> headerWidth() < viewport() -> width() ) header() -> setStretchEnabled (true, index); /*int section = header() -> mapToSection (index); int previous_width = columnWidth (section); header() -> setStretchEnabled (true, index); int new_width = columnWidth (section); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Stretch column index " << index << " section " << section << " mode " << columnWidthMode (section) << " stretch " << header() -> isStretchEnabled (index) << " actual width " << new_width << "\n"; #endif if ( previous_width >= new_width + new_width ) { setColumnWidth (section, previous_width); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Fix up column index " << index << " section " << section << " mode " << columnWidthMode (section) << " stretch " << header() -> isStretchEnabled (index) << " actual width " << columnWidth (section) << "\n"; #endif } if ( ! horizontalScrollBar() -> isVisible() ) { setColumnWidthMode (section, TQListView::Maximum); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Maximum mode index " << index << " section " << section << " mode " << columnWidthMode (section) << " stretch " << header() -> isStretchEnabled (index) << " column width " << columnWidth (section) << " view width " << width() << " viewport width " << viewport() -> width() << "\n"; #endif }*/ } } #endif void KPlayerListView::loadColumnWidths (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::loadColumnWidths\n"; #endif int index = 0; TQStringList::ConstIterator iterator (attributeNames().begin()); while ( iterator != attributeNames().end() ) { loadColumnWidth (index); ++ iterator; ++ index; } //adjustLastColumn(); config() -> setGroup ("Multimedia Library"); TQString name (config() -> readEntry ("Sort Column")); index = attributeNames().findIndex (name); bool ascending = config() -> readBoolEntry ("Sort Ascending", true); if ( index < 0 ) { index = 0; ascending = true; } KPlayerNodeView::setSorting (header() -> mapToSection (index), ascending); KPlayerNode::setSorting (name, ascending); } void KPlayerListView::saveColumnWidths (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::saveColumnWidths\n"; #endif int index = 0; config() -> setGroup ("Multimedia Library"); TQStringList::ConstIterator iterator (attributeNames().begin()); //while ( (index < columns() - 1 || ! header() -> isStretchEnabled (index)) && iterator != attributeNames().end() ) while ( index < columns() && iterator != attributeNames().end() ) { int section = header() -> mapToSection (index); int width = columnWidth (section); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Column " << *iterator << " mode " << columnWidthMode (section) << " stretch " << header() -> isStretchEnabled (index) << " width <- " << width << "\n"; #endif if ( width > 0 ) config() -> writeEntry ("Column " + *iterator + " Width", width); ++ iterator; ++ index; } } #if 0 void KPlayerListView::resizeContents (int width, int height) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::resizeContents " << width << "x" << height << "\n"; #endif KPlayerNodeView::resizeContents (width, height); adjustLastColumn(); } void KPlayerListView::viewportResizeEvent (TQResizeEvent* event) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::viewportResizeEvent " << event -> size().width() << "x" << event -> size().height() << "\n"; #endif KPlayerNodeView::viewportResizeEvent (event); adjustLastColumn(); } #endif void KPlayerListView::loadHistoryEntry (const KPlayerHistoryEntry& entry) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::loadHistoryEntry\n"; kdDebugTime() << " Expanded " << entry.m_expanded.count() << "\n"; kdDebugTime() << " Selected " << entry.m_expanded.count() << "\n"; kdDebugTime() << " Current container " << entry.m_current.url() << "\n"; kdDebugTime() << " Current ID " << entry.m_current_id << "\n"; kdDebugTime() << " Position " << entry.m_position.x() << "x" << entry.m_position.y() << "\n"; #endif setContentsPos (entry.m_position.x(), entry.m_position.y()); KPlayerContainerNode* container; KPlayerNode* node; KURL::List::ConstIterator iterator (entry.m_expanded.begin()); while ( iterator != entry.m_expanded.end() ) { node = KPlayerNode::root() -> getNodeByUrl (*iterator); if ( node ) { TQListViewItem* item = itemForNode (node); if ( item ) item -> setOpen (true); } ++ iterator; } TQStringList::ConstIterator iditerator (entry.m_selected_ids.begin()); iterator = entry.m_selected.begin(); while ( iterator != entry.m_selected.end() && iditerator != entry.m_selected_ids.end() ) { container = KPlayerNode::root() -> getNodeByUrl (*iterator); if ( container ) { node = container -> nodeById (*iditerator); if ( node ) { TQListViewItem* item = itemForNode (node); if ( item ) item -> setSelected (true); } } ++ iditerator; ++ iterator; } if ( ! entry.m_current.isEmpty() && ! entry.m_current_id.isNull() ) { container = KPlayerNode::root() -> getNodeByUrl (entry.m_current); if ( container ) { node = container -> nodeById (entry.m_current_id); if ( node ) { TQListViewItem* item = itemForNode (node); if ( item ) setCurrentItem (item); } } } } void KPlayerListView::saveHistoryEntry (KPlayerHistoryEntry& entry) const { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerListView::saveHistoryEntry\n"; #endif entry.m_expanded.clear(); entry.m_selected.clear(); entry.m_selected_ids.clear(); KPlayerListViewItem* item = (KPlayerListViewItem*) firstChild(); while ( item ) { if ( item -> isOpen() && item -> node() -> isContainer() ) entry.m_expanded.append (item -> node() -> url()); if ( item -> isSelected() ) { entry.m_selected.append (item -> node() -> parent() -> url()); entry.m_selected_ids.append (item -> node() -> id()); } item = (KPlayerListViewItem*) item -> itemBelow(); } item = (KPlayerListViewItem*) currentItem(); entry.m_current = item ? item -> node() -> parent() -> url() : KURL(); entry.m_current_id = item ? item -> node() -> id() : TQString::null; entry.m_position.setX (contentsX()); entry.m_position.setY (contentsY()); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Expanded " << entry.m_expanded.count() << "\n"; kdDebugTime() << " Selected " << entry.m_expanded.count() << "\n"; kdDebugTime() << " Current container " << entry.m_current.url() << "\n"; kdDebugTime() << " Current ID " << entry.m_current_id << "\n"; kdDebugTime() << " Position " << entry.m_position.x() << "x" << entry.m_position.y() << "\n"; #endif } /* void KPlayerListView::headerSizeChange (int section, int, int) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Setting column " << attributeNames() [section] << " width mode to Manual\n"; #endif setColumnWidthMode (section, TQListView::Manual); } void KPlayerListView::headerAdjustColumn (int section) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Setting column " << attributeNames() [section] << " width mode to Maximum\n"; #endif adjustColumn (section); setColumnWidthMode (section, TQListView::Maximum); }*/ KPlayerTreeView::KPlayerTreeView (TQWidget* parent, const char* name) : KPlayerNodeView (parent, name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating tree view\n"; #endif m_navigating = false; m_current = m_history.begin(); } KPlayerTreeView::~KPlayerTreeView() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying tree view\n"; #endif } void KPlayerTreeView::initialize (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Initializing tree view\n"; #endif KPlayerNodeView::initialize(); setAlternateBackground (TQColor()); setSelectionMode (TQListView::Single); header() -> hide(); setRootNode (KPlayerNode::root()); setSelected (firstChild(), true); if ( library() -> popupMenu() ) connect (library() -> popupMenu(), SIGNAL (aboutToHide()), SLOT (popupMenuHidden())); } void KPlayerTreeView::terminate (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Terminating tree view\n"; #endif KPlayerNodeView::terminate(); } void KPlayerTreeView::setupColumns (void) { m_attribute_names.append ("Name"); addColumn (i18n("Name")); setSorting (header() -> mapToSection (0)); } KPlayerListViewItem* KPlayerTreeView::createChild (KPlayerListViewItem* item, KPlayerNode* node) { return node -> isContainer() ? (KPlayerListViewItem*) new KPlayerTreeViewFolderItem (this, item, node) : 0; } KPlayerNodeView* KPlayerTreeView::sibling (void) const { return library() -> listView(); } void KPlayerTreeView::connectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Connecting tree view node\n"; kdDebugTime() << " URL " << rootNode() -> url().url() << "\n"; #endif connectNodeCommon(); } void KPlayerTreeView::disconnectNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Disonnecting tree view node\n"; kdDebugTime() << " URL " << rootNode() -> url() << "\n"; #endif disconnectNodeCommon(); } void KPlayerTreeView::setOpen (TQListViewItem* item, bool open) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::setOpen " << open << "\n"; kdDebugTime() << " URL " << nodeForItem (item) -> url().url() << "\n"; #endif int width = contentsWidth(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Content " << contentsX() << "x" << contentsY() << " " << width << "x" << contentsHeight() << "\n"; kdDebugTime() << " Visible " << visibleWidth() << "x" << visibleHeight() << "\n"; #endif KPlayerNodeView::setOpen (item, open); adjustColumn (0); int newwidth = contentsWidth(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Content " << contentsX() << "x" << contentsY() << " " << newwidth << "x" << contentsHeight() << "\n"; kdDebugTime() << " Visible " << visibleWidth() << "x" << visibleHeight() << "\n"; #endif if ( newwidth > width ) { int x = item -> depth() * treeStepSize(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Depth " << x << "\n"; #endif if ( x > contentsX() ) { scrollBy (x - contentsX(), 0); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Scrolled " << contentsX() << "x" << contentsY() << "\n"; #endif } } } void KPlayerTreeView::remove (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::remove\n"; #endif KPlayerNodeList list (getSelectedNodes()); resetActiveNode(); if ( ! list.isEmpty() ) list.first() -> parent() -> remove (list); } void KPlayerTreeView::goBack (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::goBack\n"; #endif if ( m_current != m_history.end() ) listView() -> saveHistoryEntry (*m_current); KPlayerContainerNode* node = 0; while ( ! node && m_current != m_history.begin() ) { -- m_current; node = KPlayerNode::root() -> getNodeByUrl ((*m_current).m_url); if ( node ) { m_navigating = true; setActiveNode (node); m_navigating = false; } else { m_current = m_history.remove (m_current); historyActionList() -> update(); } } #ifdef DEBUG_KPLAYER_NODEVIEW if ( m_current != m_history.end() ) kdDebugTime() << "Current URL " << (*m_current).m_url.url() << "\n"; #endif } void KPlayerTreeView::goForward (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::goForward\n"; #endif if ( m_current != m_history.end() ) listView() -> saveHistoryEntry (*m_current); KPlayerContainerNode* node = 0; while ( ! node && m_current != m_history.end() ) { ++ m_current; if ( m_current != m_history.end() ) { node = KPlayerNode::root() -> getNodeByUrl ((*m_current).m_url); if ( node ) { m_navigating = true; setActiveNode (node); m_navigating = false; } else { m_current = m_history.remove (m_current); historyActionList() -> update(); } } } #ifdef DEBUG_KPLAYER_NODEVIEW if ( m_current != m_history.end() ) kdDebugTime() << "Current URL " << (*m_current).m_url.url() << "\n"; #endif } void KPlayerTreeView::goToHistory (const KPlayerHistory::Iterator& iterator) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::goToHistory\n"; kdDebugTime() << " URL " << (*iterator).m_url.url() << "\n"; #endif if ( m_current != m_history.end() ) listView() -> saveHistoryEntry (*m_current); if ( iterator != m_current ) { KPlayerContainerNode* node = KPlayerNode::root() -> getNodeByUrl ((*iterator).m_url); if ( node ) { m_current = iterator; m_navigating = true; setActiveNode (node); m_navigating = false; } else { m_history.remove (iterator); historyActionList() -> update(); } } #ifdef DEBUG_KPLAYER_NODEVIEW if ( m_current != m_history.end() ) kdDebugTime() << "Current URL " << (*m_current).m_url.url() << "\n"; #endif } void KPlayerTreeView::updateActions (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Updating tree view actions\n"; #endif KPlayerContainerNode* node = activeNode(); bool selection = currentItem() && currentItem() -> isSelected(); #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << " Selection " << selection << "\n"; if ( node ) kdDebugTime() << " Active " << node -> url().url() << "\n"; #endif action ("library_play") -> setEnabled (selection); action ("library_play_next") -> setEnabled (selection); bool enable = selection && node -> canQueue(); action ("library_queue") -> setEnabled (enable); action ("library_queue_next") -> setEnabled (enable); enable = selection && (node -> canAddLeaves() || node -> canAddBranches()); library() -> emitEnableActionGroup ("library_add", enable); enable = selection && node -> canAddLeaves(); action ("library_add_files") -> setEnabled (enable); action ("library_add_url") -> setEnabled (enable); enable = selection && node -> canAddBranches(); TDEAction* a = action ("library_add_group"); a -> setEnabled (enable); if ( node && node -> isDevices() ) { a -> setText (i18n("&Device...")); a -> setStatusText (i18n("Adds a new device")); a -> setWhatsThis (i18n("Add device command allows you to add a new device. You will need to give the new device a unique name and specify the device path and type.")); } else if ( node && node -> isPlaylist() ) { a -> setText (i18n("&Playlist...")); a -> setStatusText (i18n("Adds a new playlist")); a -> setWhatsThis (i18n("Add playlist command allows you to add a new playlist. You will need to give the new playlist a unique name.")); } else { a -> setText (i18n("F&older...")); a -> setStatusText (i18n("Adds a new subfolder to the selected folder")); a -> setWhatsThis (i18n("Add folder command allows you to add a new subfolder to the selected folder. You will need to give the new subfolder a unique name.")); } enable = selection && node -> canSaveAsPlaylist(); library() -> emitEnableActionGroup ("library_add_to", enable); action ("library_add_to_new_playlist") -> setEnabled (enable); action ("library_add_to_playlists") -> setEnabled (enable); action ("library_add_to_collection") -> setEnabled (enable); action ("library_rename") -> setEnabled (selection && node -> canRename()); library() -> emitEnableActionGroup ("library_edit", false); action ("library_properties") -> setEnabled (selection && (node -> hasProperties() || node -> origin() && node -> origin() -> hasProperties())); action ("library_select_all") -> setEnabled (node == currentNode()); enable = selection && node -> allowsCustomOrder(); action ("library_move_up") -> setEnabled (enable); action ("library_move_down") -> setEnabled (enable); action ("library_remove") -> setEnabled (selection && node -> parent() -> canRemove()); library() -> emitEnableActionGroup ("library_columns", ! columnActionList() -> isEmpty() && listView() -> showingMedia()); action ("library_go_down") -> setEnabled (false); action ("library_go_to_origin") -> setEnabled (selection && node -> origin() != 0); updateNavigationActions(); } void KPlayerTreeView::updateNavigationActions (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Updating tree navigation actions\n"; #endif bool notempty = m_current != m_history.end(); action ("library_go_back") -> setEnabled (m_current != m_history.begin()); if ( notempty ) ++ m_current; action ("library_go_forward") -> setEnabled (m_current != m_history.end()); if ( notempty ) -- m_current; #ifdef DEBUG_KPLAYER_NODEVIEW if ( m_current != m_history.end() ) kdDebugTime() << "Current URL " << (*m_current).m_url.url() << "\n"; #endif KPlayerContainerNode* parent = currentNode() -> parent(); action ("library_go_up") -> setEnabled (parent && parent -> parent()); } KPlayerNodeList KPlayerTreeView::getSelectedNodes (void) const { KPlayerNodeList list; KPlayerNode* node = activeNode(); if ( node ) list.append (node); return list; } bool KPlayerTreeView::event (TQEvent* event) { bool result = KPlayerNodeView::event (event); if ( event -> type() == TQEvent::ApplicationPaletteChange ) setAlternateBackground (TQColor()); return result; } void KPlayerTreeView::setNodeOrder (KPlayerContainerNode* node) { node -> customOrderByName(); } KPlayerNode* KPlayerTreeView::currentNode (void) const { return listView() -> rootNode(); } void KPlayerTreeView::setActiveNode (KPlayerContainerNode* node) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::setActiveNode\n"; kdDebugTime() << " URL " << node -> url().url() << "\n"; #endif stopEditing(); sibling() -> stopEditing(); TQListViewItem* item = itemForNode (node, true); if ( item ) { TQListViewItem* child = item -> firstChild(); if ( child ) { while ( child -> nextSibling() ) child = child -> nextSibling(); if ( child -> itemBelow() ) child = child -> itemBelow(); ensureItemVisible (child); } else if ( item -> itemBelow() ) ensureItemVisible (item -> itemBelow()); ensureItemVisible (item); setSelected (item, true); } } void KPlayerTreeView::activeItemChanged (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Active tree view item changed\n"; #endif if ( m_popup_menu_shown ) return; if ( ! m_navigating && m_current != m_history.end() ) listView() -> saveHistoryEntry (*m_current); if ( currentItem() && activeNode() != currentNode() ) { listView() -> setRootNode (activeNode()); if ( m_navigating ) { if ( m_current != m_history.end() ) listView() -> loadHistoryEntry (*m_current); } else { if ( m_current != m_history.end() ) ++ m_current; while ( m_current != m_history.end() ) m_current = m_history.remove (m_current); KPlayerHistoryEntry entry; entry.m_url = activeNode() -> url(); entry.m_name = activeNode() -> name(); m_history.append (entry); -- m_current; #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Current URL " << (*m_current).m_url.url() << "\n"; #endif } historyActionList() -> update(); } } void KPlayerTreeView::popupMenuHidden (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Popup menu hidden\n"; #endif m_popup_menu_shown = false; if ( currentItem() && activeNode() != currentNode() && renameLineEdit() -> isHidden() ) TQTimer::singleShot (0, this, SLOT (resetActiveNode())); } void KPlayerTreeView::resetActiveNode (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::resetActiveNode\n"; #endif if ( ! m_popup_menu_shown && renameLineEdit() -> isHidden() ) setActiveNode ((KPlayerContainerNode*) currentNode()); } void KPlayerTreeView::activateCurrentItem (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerTreeView::activateCurrentItem\n"; #endif if ( currentItem() && ! currentItem() -> isSelected() ) setActiveNode (activeNode()); } KPlayerLibrary::KPlayerLibrary (TDEActionCollection* ac, TQWidget* parent, const char* name) : TQSplitter (parent, name) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Creating library\n"; #endif m_ac = ac; KPlayerNode::initialize(); TDEAction* action = new TDEAction (i18n("&Play"), 0, CTRL + Key_Return, m_ac, "library_play"); action -> setStatusText (i18n("Plays the selected items")); action -> setWhatsThis (i18n("Play command plays the selected items.")); action = new TDEAction (i18n("Play &Next"), 0, 0, m_ac, "library_play_next"); action -> setStatusText (i18n("Plays the selected items after the currently played item")); action -> setWhatsThis (i18n("Play next command plays the selected items after the currently played item finishes playing.")); action = new TDEAction (i18n("&Queue"), 0, 0, m_ac, "library_queue"); action -> setStatusText (i18n("Queues the selected items")); action -> setWhatsThis (i18n("Queue command queues the selected items for playing.")); action = new TDEAction (i18n("Queue Ne&xt"), 0, 0, m_ac, "library_queue_next"); action -> setStatusText (i18n("Queues the selected items for playing after the currently played item")); action -> setWhatsThis (i18n("Queue next command queues the selected items for playing after the currently played item finishes playing.")); action = new TDEAction (i18n("&Files..."), 0, 0, m_ac, "library_add_files"); action -> setStatusText (i18n("Adds files to the selected folder")); action -> setWhatsThis (i18n("Add files command displays the standard Open File dialog and lets you choose a file or several files to add to the selected folder.")); action = new TDEAction (i18n("&URL..."), 0, 0, m_ac, "library_add_url"); action -> setStatusText (i18n("Adds a URL to the selected folder")); action -> setWhatsThis (i18n("Add URL command displays the standard Open URL dialog and lets you type or paste in a URL to add to the selected folder.")); action = new TDEAction (i18n("F&older..."), 0, 0, m_ac, "library_add_group"); action -> setStatusText (i18n("Adds a new subfolder to the selected folder")); action -> setWhatsThis (i18n("Add folder command allows you to add a new subfolder to the selected folder. You will need to give the new subfolder a unique name.")); action = new TDEAction (i18n("&New Playlist..."), 0, 0, m_ac, "library_add_to_new_playlist"); action -> setStatusText (i18n("Adds selected items to a new playlist")); action -> setWhatsThis (i18n("Add to new playlist command prompts for a new playlist name and adds the selected items to the new playlist.")); action = new TDEAction (i18n("&Playlists"), 0, 0, m_ac, "library_add_to_playlists"); action -> setStatusText (i18n("Adds selected items to the root playlist")); action -> setWhatsThis (i18n("Add to playlists command adds the selected items to the root playlist.")); m_playlists = new KPlayerContainerActionList ("%1", i18n("Adds selected items to %1 playlist"), i18n("Add to playlist command adds the selected items to the %1 playlist."), this, "library_add_to_playlist"); playlistActionList() -> setMaximumSize (configuration() -> playlistMenuSize()); action = new TDEAction (i18n("&Collection"), 0, 0, m_ac, "library_add_to_collection"); action -> setStatusText (i18n("Adds selected items to the collection")); action -> setWhatsThis (i18n("Add to collection command adds the selected items to the multimedia collection.")); action = new TDEAction (i18n("&Rename"), 0, Key_F2, m_ac, "library_rename"); action -> setStatusText (i18n("Lets you rename the selected item")); action -> setWhatsThis (i18n("Rename command starts edit mode for the current item in the multimedia library so you can change the item name.")); action = new TDEAction (i18n("Propert&ies..."), 0, 0, m_ac, "library_properties"); action -> setStatusText (i18n("Opens Properties dialog for the selected item")); action -> setWhatsThis (i18n("Properties command opens File Properties dialog for the current item in the multimedia library. See the File properties micro-HOWTO for details.")); action = new TDEAction (i18n("&Select All"), 0, 0, m_ac, "library_select_all"); action -> setStatusText (i18n("Selects all items in the current folder")); action -> setWhatsThis (i18n("Select all command selects all items in the current folder of the multimedia library.")); action = new TDEAction (i18n("Move &Up"), "1uparrow", 0, m_ac, "library_move_up"); action -> setStatusText (i18n("Moves the selected items up in the playlist")); action -> setWhatsThis (i18n("Move Up command moves the selected items up in a playlist. You can also move items around by clicking and dragging them with the left mouse button.")); action = new TDEAction (i18n("Move &Down"), "1downarrow", 0, m_ac, "library_move_down"); action -> setStatusText (i18n("Moves the selected items down in the playlist")); action -> setWhatsThis (i18n("Move Down command moves the selected items down in a playlist. You can also move items around by clicking and dragging them with the left mouse button.")); action = new TDEAction (i18n("Re&move"), "editdelete", Key_Delete, m_ac, "library_remove"); action -> setStatusText (i18n("Removes the selected items from the multimedia library")); action -> setWhatsThis (i18n("Remove command removes the selected items from the multimedia library.")); m_go_to = new KPlayerContainerActionList ("%1", i18n("Opens %1 in the library window"), i18n("Go to %1 command opens the corresponding folder in the library window."), this, "library_go_to_list"); connect (goToActionList(), SIGNAL(activated(KPlayerNode*)), SLOT(open(KPlayerNode*))); action = new TDEAction (i18n("&Back"), "back", ALT + Key_Left, m_ac, "library_go_back"); action -> setStatusText (i18n("Opens the previous folder")); action -> setWhatsThis (i18n("Go back command opens the previous folder from the history.")); action = new TDEAction (i18n("&Forward"), "forward", ALT + Key_Right, m_ac, "library_go_forward"); action -> setStatusText (i18n("Opens the next folder")); action -> setWhatsThis (i18n("Go forward command opens the next folder from the history.")); action = new TDEAction (i18n("&Up"), "up", ALT + SHIFT + Key_Up, m_ac, "library_go_up"); action -> setStatusText (i18n("Opens the parent folder")); action -> setWhatsThis (i18n("Go up command opens the parent folder of the current folder.")); action = new TDEAction (i18n("&Down"), "down", ALT + SHIFT + Key_Down, m_ac, "library_go_down"); action -> setStatusText (i18n("Opens the selected folder")); action -> setWhatsThis (i18n("Go down command opens the selected folder.")); action = new TDEAction (i18n("&To Origin"), 0, ALT + SHIFT + Key_Left, m_ac, "library_go_to_origin"); action -> setStatusText (i18n("Opens the origin of the current folder")); action -> setWhatsThis (i18n("Go to origin command opens the origin folder of the current folder.")); action = new TDEAction (i18n("&Edit"), 0, 0, this, SLOT (editPlaylist()), m_ac, "playlist_edit"); action -> setStatusText (i18n("Opens the playlist in the multimedia library")); action -> setWhatsThis (i18n("Edit command opens the playlist in the multimedia library and allows you to edit it.")); m_tree = new KPlayerTreeView (this); setResizeMode (treeView(), TQSplitter::KeepSize); m_list = new KPlayerListView (this); config() -> setGroup ("Multimedia Library"); int width = config() -> readNumEntry ("Tree View Width"); if ( width ) { TQValueList sizes; sizes.append (width); setSizes (sizes); } m_columns = new KPlayerToggleActionList (listView() -> availableAttributes(), listView() -> attributeStates(), i18n("Hide %1"), i18n("Show %1"), i18n("Hides %1 column"), i18n("Shows %1 column"), i18n("Hide %1 command hides the column."), i18n("Show %1 command shows the column."), this, "library_columns"); m_edit = new KPlayerSimpleActionList (listView() -> editableAttributes(), "%1", i18n("Starts edit mode for %1 field"), i18n("Edit %1 starts edit mode for this field of the current item."), this, "library_edit"); m_history_list = new KPlayerHistoryActionList (treeView() -> history(), treeView() -> currentHistoryEntry(), "%1", i18n("Opens %1 in the library window"), i18n("Go to %1 command opens the corresponding folder in the library window."), this, "library_history"); connect (historyActionList(), SIGNAL(activated(const KPlayerHistory::Iterator&)), treeView(), SLOT(goToHistory(const KPlayerHistory::Iterator&))); m_last_view = m_tree; } KPlayerLibrary::~KPlayerLibrary() { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Destroying library\n"; #endif } void KPlayerLibrary::initialize (TQPopupMenu* menu) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerLibrary::initialize\n"; #endif m_popup = menu; listView() -> initialize(); treeView() -> initialize(); playlistActionList() -> initialize ("kplayer:/playlists"); goToActionList() -> initialize ("kplayer:/"); disconnectActions(); } void KPlayerLibrary::terminate (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerLibrary::terminate\n"; #endif config() -> setGroup ("Multimedia Library"); config() -> writeEntry ("Tree View Width", sizes().first()); playlistActionList() -> terminate(); goToActionList() -> terminate(); listView() -> terminate(); treeView() -> terminate(); KPlayerNode::terminate(); } void KPlayerLibrary::setFocus (void) { m_last_view -> setFocus(); } void KPlayerLibrary::disconnectActions (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "Disconnecting actions\n"; #endif TDEAction* a = action ("library_play"); a -> disconnect(); a -> setEnabled (false); a = action ("library_play_next"); a -> disconnect(); a -> setEnabled (false); a = action ("library_queue"); a -> disconnect(); a -> setEnabled (false); a = action ("library_queue_next"); a -> disconnect(); a -> setEnabled (false); a = action ("library_add_files"); a -> disconnect(); a -> setEnabled (false); a = action ("library_add_url"); a -> disconnect(); a -> setEnabled (false); a = action ("library_add_group"); a -> disconnect(); a -> setEnabled (false); a = action ("library_add_to_new_playlist"); a -> disconnect(); a -> setEnabled (false); a = action ("library_add_to_playlists"); a -> disconnect(); a -> setEnabled (false); playlistActionList() -> disconnect (SIGNAL(activated(KPlayerNode*))); a = action ("library_add_to_collection"); a -> disconnect(); a -> setEnabled (false); a = action ("library_rename"); a -> disconnect(); a -> setEnabled (false); editActionList() -> disconnect (SIGNAL(activated(int))); a = action ("library_properties"); a -> disconnect(); a -> setEnabled (false); a = action ("library_select_all"); a -> disconnect(); a -> setEnabled (false); a = action ("library_move_up"); a -> disconnect(); a -> setEnabled (false); a = action ("library_move_down"); a -> disconnect(); a -> setEnabled (false); a = action ("library_remove"); a -> disconnect(); a -> setEnabled (false); columnActionList() -> disconnect (SIGNAL(activated(int))); a = action ("library_go_back"); a -> disconnect(); a -> setEnabled (false); a = action ("library_go_forward"); a -> disconnect(); a -> setEnabled (false); a = action ("library_go_up"); a -> disconnect(); a -> setEnabled (false); a = action ("library_go_down"); a -> disconnect(); a -> setEnabled (false); a = action ("library_go_to_origin"); a -> disconnect(); a -> setEnabled (false); emitEnableActionGroup ("library_add", false); emitEnableActionGroup ("library_add_to", false); emitEnableActionGroup ("library_columns", false); emitEnableActionGroup ("library_edit", false); } void KPlayerLibrary::open (KPlayerNode* node) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerLibrary::open\n"; kdDebugTime() << " Node " << node -> url().url() << "\n"; #endif if ( node -> isContainer() ) { treeView() -> setActiveNode ((KPlayerContainerNode*) node); emit makeVisible(); treeView() -> ensureItemVisible (treeView() -> currentItem()); } } void KPlayerLibrary::editPlaylist (void) { #ifdef DEBUG_KPLAYER_NODEVIEW kdDebugTime() << "KPlayerLibrary::editPlaylist\n"; #endif open (treeView() -> playlist() -> nowplaying()); } KPlayerLibraryWindow::KPlayerLibraryWindow (TDEActionCollection* ac, TQWidget* parent, const char* name) : TQDockWindow (parent, name) { setWidget (new KPlayerLibrary (ac, this)); setResizeEnabled (true); setCloseMode (TQDockWindow::Always); setNewLine (true); setCaption (i18n("Multimedia Library")); } void KPlayerLibraryWindow::setFocus (void) { library() -> setFocus(); } void KPlayerLibraryWindow::hideEvent (TQHideEvent* event) { TQDockWindow::hideEvent (event); library() -> disconnectActions(); if ( isHidden() ) emit windowHidden(); }