Skip to content

Commit

Permalink
UI|Client: Improved package list searching
Browse files Browse the repository at this point in the history
One can now enter any of the hidden tags (such as “gamedata” or “core”) to see those packages, too, even though they are normally hidden.
  • Loading branch information
skyjake committed Nov 11, 2018
1 parent 68131e5 commit cadd9e2
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 65 deletions.
1 change: 0 additions & 1 deletion doomsday/apps/client/include/ui/widgets/packageswidget.h
Expand Up @@ -64,7 +64,6 @@ class PackagesWidget : public de::GuiWidget, public de::IPersistent
void setAllowPackageInfoActions(bool allowActions);
void setRightClickToOpenContextMenu(bool enable);
void setHiddenTags(de::StringList hiddenTags);
void setDontFilterHidden(bool enable);
void setPopulationEnabled(bool enable);
void setFilterEditorMinimumY(de::Rule const &minY);
void setPackageStatus(IPackageStatus const &packageStatus);
Expand Down
Expand Up @@ -240,7 +240,7 @@ CreateProfileDialog::CreateProfileDialog(String const &gameFamily)
dlg->area().enableIndicatorDraw(true);
d->customPicker.reset(new PackagesWidget);
dlg->area().add(d->customPicker);
d->customPicker->setHiddenTags({"core"});
d->customPicker->setHiddenTags({"hidden", "core"});
d->customPicker->setAllowPackageInfoActions(false);
d->customPicker->setActionItems(d->customDataFileActions);
dlg->setAnchorAndOpeningDirection(d->customDataFileName->rule(), ui::Right);
Expand Down
Expand Up @@ -193,7 +193,7 @@ DENG2_PIMPL(PackageCompatibilityDialog)

self().area().add(list = new PackagesWidget(wantedAvailable + wantedDifferent));
list->setAllowPackageInfoActions(false);
list->setDontFilterHidden(true);
list->setHiddenTags({"core", "gamedata"});
list->setActionItems(actions);
list->setActionsAlwaysShown(true);
list->setFilterEditorMinimumY(self().area().rule().top());
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/client/src/ui/dialogs/serverinfodialog.cpp
Expand Up @@ -178,7 +178,7 @@ DENG_GUI_PIMPL(ServerInfoDialog)
self().add(serverPopup);
serverPackages = new PackagesWidget(PackagesWidget::PopulationDisabled);
serverPackages->margins().set("gap");
serverPackages->setHiddenTags(StringList()); // show everything
serverPackages->setHiddenTags({"hidden"}); // show everything (top level)
serverPackages->setActionItems(serverPackageActions);
serverPackages->setActionsAlwaysShown(true);
serverPackages->setPackageStatus(*this);
Expand Down
93 changes: 32 additions & 61 deletions doomsday/apps/client/src/ui/widgets/packageswidget.cpp
Expand Up @@ -48,6 +48,7 @@
#include <doomsday/resource/bundles.h>

#include <QTimer>
#include <set>

using namespace de;

Expand Down Expand Up @@ -455,6 +456,8 @@ DENG_GUI_PIMPL(PackagesWidget)

//---------------------------------------------------------------------------------------

using Strings = std::set<String>;

LoopCallback mainCall;
LoopCallback mainCallForIdentify;

Expand All @@ -464,22 +467,21 @@ DENG_GUI_PIMPL(PackagesWidget)
ButtonWidget * clearSearch;
Animation searchBackgroundOpacity{0.f, Animation::Linear};
QStringList filterTerms;
Strings hiddenTagsInEffect;
QTimer refilterTimer;

ProgressWidget *refreshProgress;

// Packages list:
StringList hiddenTags;
StringList hiddenTags; // Packages with these not shown unless filterTerms has the tag.
StringList manualPackagePaths; // if empty, all available packages used
HomeMenuWidget * menu;
ui::ListDataT<PackageItem> allPackages;
ui::FilteredData filteredPackages{allPackages};
ui::ListData defaultActionItems;
ui::Data const * actionItems = &defaultActionItems;
bool populateEnabled = true;
bool showHidden = false;
bool showOnlyLoaded = false;
bool dontFilterHidden = false;
bool actionOnlyForSelection = true;
bool rightClickToOpenContextMenu = false;
PackageInfoDialog::Mode packageInfoMode = PackageInfoDialog::EnableActions;
Expand All @@ -499,7 +501,7 @@ DENG_GUI_PIMPL(PackagesWidget)
*/
Impl(Public * i)
: Base(i)
, hiddenTags({"core", "gamedata"})
, hiddenTags({"hidden", "core", "gamedata"})
{
defaultActionItems << new ui::VariantActionItem(
tr("Load"), tr("Unload"), new CallbackAction([this]() {
Expand Down Expand Up @@ -564,23 +566,30 @@ DENG_GUI_PIMPL(PackagesWidget)
// - identifier
// - tags

if (!item.info) return false;

if (!item.info)
{
// Don't know what this is (probably deleted), can't show it.
return false;
}
if (showOnlyLoaded && !item.isLoaded())
{
return false;
}

if (!dontFilterHidden)
{
const bool isHidden =
Package::matchTags(*item.file, QStringLiteral("\\bhidden\\b"));
if (showHidden ^ isHidden)
bool isHidden = false;
for (const auto &h : hiddenTagsInEffect)
{
if (Package::matchTags(*item.file, h))
{
isHidden = true;
break;
}
}
if (isHidden)
{
return false;
}
}

return filterTerms.isEmpty() || checkTerms({item.data().toString(), // ID
item.file->source()->name(), // file name
item.info->gets(VAR_TITLE),
Expand Down Expand Up @@ -698,25 +707,10 @@ DENG_GUI_PIMPL(PackagesWidget)
// Add/update the listed packages.
for (String const &path : packages)
{
File const &pack = App::rootFolder().locate<File>(path);

// Check for tags that should never be shown.
auto const tags = Package::tags(pack);
{
bool disregard = false;
for (String const &hiddenTag : hiddenTags)
{
if (tags.contains(hiddenTag))
{
disregard = true;
break;
}
}
if (disregard) continue;
}
const File &pack = App::rootFolder().locate<File>(path);

// Is this already in the list?
ui::DataPos pos = allPackages.findData(Package::versionedIdentifierForFile(pack));
const ui::DataPos pos = allPackages.findData(Package::versionedIdentifierForFile(pack));
if (pos != ui::Data::InvalidPos)
{
allPackages.at(pos).setFile(pack);
Expand Down Expand Up @@ -767,19 +761,19 @@ DENG_GUI_PIMPL(PackagesWidget)
void setFilterTerms(QStringList terms)
{
filterTerms = terms;
hiddenTagsInEffect.clear();
for (const auto &t : hiddenTags)
{
if (!terms.contains(t))
{
hiddenTagsInEffect.insert("\\b" + t + "\\b"); // tag regexp
}
}
clearSearch->show(!terms.isEmpty());
if ((showOnlyLoaded = filterTerms.contains(TAG_LOADED)) != false)
{
filterTerms.removeAll(TAG_LOADED);
}
if (dontFilterHidden)
{
showHidden = true;
}
else if ((showHidden = filterTerms.contains(TAG_HIDDEN)) != false)
{
filterTerms.removeAll(TAG_HIDDEN);
}

filteredPackages.refilter();

Expand Down Expand Up @@ -862,17 +856,9 @@ PackagesWidget::PackagesWidget(PopulateBehavior initBehavior, String const &name
: GuiWidget(name)
, d(new Impl(this))
{
// auto &bundles = DoomsdayApp::bundles();
//bundles.audienceForIdentify() += d;

d->populateEnabled = (initBehavior == PopulationEnabled);

FS::get().audienceForBusy() += d;

//if (bundles.isEverythingIdentified())
//{
populate();
//}
populate();
}

PackagesWidget::PackagesWidget(StringList manualPackageIds, String const &name)
Expand Down Expand Up @@ -916,15 +902,6 @@ void PackagesWidget::setHiddenTags(StringList hiddenTags)
populate();
}

void PackagesWidget::setDontFilterHidden(bool enable)
{
if (d->dontFilterHidden != enable)
{
d->dontFilterHidden = enable;
d->updateFilterTerms(true);
}
}

void PackagesWidget::setPopulationEnabled(bool enable)
{
d->populateEnabled = enable;
Expand Down Expand Up @@ -1111,9 +1088,3 @@ void PackagesWidget::operator<<(PersistentState const &fromState)
d->search->setText(rec.gets(name().concatenateMember("search"), ""));
d->updateFilterTerms(true);
}

/*void PackagesWidget::refreshPackages()
{
d->showProgressIndicator(true);
FS::get().refreshAsync();
}*/

0 comments on commit cadd9e2

Please sign in to comment.