X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5276b0a53cef4815230e39b54d2ecda14f72cbd1..46405e36bf9962b251e77e5048e96bf6a54edb15:/src/generic/dirctrlg.cpp diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 46b72cf08a..a87c0812ca 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -761,14 +761,9 @@ void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event) // ctor when wxTR_HIDE_ROOT was specified if (!m_rootId.IsOk()) - m_rootId = m_treeCtrl->GetRootItem(); ExpandDir(parentId); - if ( m_treeCtrl->GetChildrenCount(parentId, false) == 0 ) - { - m_treeCtrl->SetItemHasChildren(parentId, false); - } } void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event ) @@ -793,7 +788,7 @@ void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId) m_treeCtrl->Thaw(); } -void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) +void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId) { wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); @@ -892,6 +887,10 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) filenames.Sort(wxDirCtrlStringCompareFunction); } + // Now we really know whether we have any children so tell the tree control + // about it. + m_treeCtrl->SetItemHasChildren(parentId, !dirs.empty() || !filenames.empty()); + // Add the sorted dirs size_t i; for (i = 0; i < dirs.GetCount(); i++) @@ -911,7 +910,7 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) // assume that it does have children by default as it can take a long // time to really check for this (think remote drives...) // - // and if we're wrong, we'll correct it later in OnExpandItem() if + // and if we're wrong, we'll correct the icon later if // the user really tries to open this item m_treeCtrl->SetItemHasChildren(id); } @@ -936,6 +935,12 @@ void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) } } +void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId) +{ + // ExpandDir() will not actually expand the tree node, just populate it + PopulateNode(parentId); +} + void wxGenericDirCtrl::ReCreateTree() { CollapseDir(m_treeCtrl->GetRootItem()); @@ -1095,6 +1100,22 @@ bool wxGenericDirCtrl::CollapsePath(const wxString& path) wxString wxGenericDirCtrl::GetPath() const { + // Allow calling GetPath() in multiple selection from OnSelFilter + if (m_treeCtrl->HasFlag(wxTR_MULTIPLE)) + { + wxArrayTreeItemIds items; + m_treeCtrl->GetSelections(items); + if (items.size() > 0) + { + // return first string only + wxTreeItemId id = items[0]; + wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); + return data->m_path; + } + + return wxEmptyString; + } + wxTreeItemId id = m_treeCtrl->GetSelection(); if (id) { @@ -1379,16 +1400,33 @@ void wxDirFilterListCtrl::OnSelFilter(wxCommandEvent& WXUNUSED(event)) { int sel = GetSelection(); - wxString currentPath = m_dirCtrl->GetPath(); + if (m_dirCtrl->HasFlag(wxDIRCTRL_MULTIPLE)) + { + wxArrayString paths; + m_dirCtrl->GetPaths(paths); - m_dirCtrl->SetFilterIndex(sel); + m_dirCtrl->SetFilterIndex(sel); - // If the filter has changed, the view is out of date, so - // collapse the tree. - m_dirCtrl->ReCreateTree(); + // If the filter has changed, the view is out of date, so + // collapse the tree. + m_dirCtrl->ReCreateTree(); - // Try to restore the selection, or at least the directory - m_dirCtrl->ExpandPath(currentPath); + // Expand and select the previously selected paths + for (unsigned int i = 0; i < paths.GetCount(); i++) + { + m_dirCtrl->ExpandPath(paths.Item(i)); + } + } + else + { + wxString currentPath = m_dirCtrl->GetPath(); + + m_dirCtrl->SetFilterIndex(sel); + m_dirCtrl->ReCreateTree(); + + // Try to restore the selection, or at least the directory + m_dirCtrl->ExpandPath(currentPath); + } } void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilter)