diff --git a/uppsrc/ide/SelectPkg.cpp b/uppsrc/ide/SelectPkg.cpp index eceb2abc8..01b95f207 100644 --- a/uppsrc/ide/SelectPkg.cpp +++ b/uppsrc/ide/SelectPkg.cpp @@ -195,11 +195,7 @@ SelectPackageDlg::SelectPackageDlg(const char *title, bool selectvars_, bool mai newu <<= THISBACK(OnNew); filter <<= THISBACK(OnFilter); - filter.Add(MAIN|FIRST, "Main packages of first nest"); - filter.Add(MAIN, "All main packages"); - filter.Add(FIRST, "All packages of first nest"); - filter.Add(0, "All packages"); - filter <<= main ? MAIN|FIRST : 0; + filter <<= main ? MAIN|NEST : 0; progress.Hide(); brief <<= THISBACK(SyncBrief); search.NullText("Search (Ctrl+K)", StdFont().Italic(), SColorDisabled()); @@ -219,6 +215,21 @@ SelectPackageDlg::SelectPackageDlg(const char *title, bool selectvars_, bool mai help << [&] { LaunchWebBrowser("https://www.ultimatepp.org/app$ide$PackagesAssembliesAndNests$en-us.html"); }; } +void SelectPackageDlg::SyncFilter() +{ + filter.ClearList(); + Vector upp = GetUppDirs(); + if(upp.GetCount() == 0) + return; + for(int i = 0; i < upp.GetCount(); i++) { + String fn = GetFileName(upp[i]); + filter.Add(NEST|MAIN|i, "Main packages of " + fn); + filter.Add(NEST|i, "All packages of " + fn); + } + filter.Add(MAIN, "All main packages"); + filter.Add(0, "All packages"); +} + bool SelectPackageDlg::Key(dword key, int count) { if(key == K_ALT_ENTER) { @@ -522,20 +533,25 @@ void SelectPackageDlg::SyncList(const String& find) String s = ~search; int f = ~filter; Index added; - for(int i = 0; i < min((f & FIRST) ? 1 : data.GetCount(), data.GetCount()); i++) { - const ArrayMap& nest = data[i]; - for(int i = 0; i < nest.GetCount(); i++) { - const PkData& d = nest[i]; - if(!nest.IsUnlinked(i) && - d.ispackage && - (!(f & MAIN) || d.main) && - ToUpper(d.package + d.description + d.nest).Find(s) >= 0 && - added.Find(d.package) < 0) { - packages.Add() = d; - added.Add(d.package); + int from = 0; + int to = data.GetCount() - 1; + if(f & NEST) + from = to = f & NEST_MASK; + if(to < data.GetCount()) + for(int i = from; i <= to; i++) { + const ArrayMap& nest = data[i]; + for(int i = 0; i < nest.GetCount(); i++) { + const PkData& d = nest[i]; + if(!nest.IsUnlinked(i) && + d.ispackage && + (!(f & MAIN) || d.main) && + ToUpper(d.package + d.description + d.nest).Find(s) >= 0 && + added.Find(d.package) < 0) { + packages.Add() = d; + added.Add(d.package); + } } } - } Sort(packages); alist.Clear(); clist.Clear(); @@ -587,6 +603,7 @@ String SelectPackageDlg::CachePath(const char *vn) const void SelectPackageDlg::Load(const String& find) { + SyncFilter(); if(selectvars && !base.IsCursor()) return; if(loading) { // If we are called recursively from ProcessEvents, stop current loading and change loadi diff --git a/uppsrc/ide/UppDlg.h b/uppsrc/ide/UppDlg.h index ff33b2609..e6e9522ac 100644 --- a/uppsrc/ide/UppDlg.h +++ b/uppsrc/ide/UppDlg.h @@ -203,6 +203,7 @@ struct SelectPackageDlg : public WithSelectPackageLayout { void ListCursor(); void ChangeDescription(); + void SyncFilter(); void ScanFolder(const String& path, ArrayMap& nd, const String& nest, Index& dir_exists, const String& prefix); @@ -223,7 +224,7 @@ struct SelectPackageDlg : public WithSelectPackageLayout { void MovePackage(bool copy); enum { - MAIN = 1, FIRST = 2 + MAIN = 0x1000, NEST = 0x2000, NEST_MASK = 0xfff }; };