//+----------------------------------------------------------------------------+ //| Description: Magic Set Editor - Program to make card games | //| Copyright: (C) Twan van Laarhoven and the other MSE developers | //| License: GNU General Public License 2 or later (see file COPYING) | //+----------------------------------------------------------------------------+ #pragma once // ----------------------------------------------------------------------------- : Includes #include #include #include // ----------------------------------------------------------------------------- : PackageUpdateList /// A list of installed and downloadable packages class PackageUpdateList : public TreeList { private: class TreeItem; public: typedef intrusive_ptr TreeItemP; PackageUpdateList(Window* parent, const InstallablePackages& packages, bool show_only_installable, int id = wxID_ANY); ~PackageUpdateList(); inline InstallablePackageP getSelectedPackage() const { TreeItem* ti = getSelectedItem(); return ti ? ti->package : InstallablePackageP(); } inline bool selectionIsGroup() const { TreeItem* ti = getSelectedItem(); return ti && !ti->package; } inline void forEachSelectedPackage(const std::function& fn) const { forEachPackage(getSelectedItem(), fn); } inline bool anySelectedPackage(const std::function& predicate) const { return anyPackage(getSelectedItem(), predicate); } inline bool allSelectedPackages(const std::function& predicate) const { return allPackages(getSelectedItem(), predicate); } protected: // overridden methods from TreeList void initItems() override; void drawItem(DC& dc, size_t index, size_t column, int x, int y, bool selected) const override; size_t columnCount() const override { return 3; } String columnText(size_t column) const override; int columnWidth(size_t column) const override; private: inline TreeItem* getSelectedItem() const { return selection >= items.size() ? nullptr : static_pointer_cast(items[selection]).get(); } inline void forEachPackage(const TreeItem* item, const std::function& fn) const { if (!item) return; if (item->package) { fn(item->package); } for (const auto& child : item->children) { forEachPackage(child.get(), fn); } } inline bool anyPackage(const TreeItem* item, const std::function& predicate) const { if (!item) return false; if (item->package && predicate(item->package)) { return true; } for (const auto& child : item->children) { if (anyPackage(child.get(), predicate)) { return true; } } return false; } inline bool allPackages(const TreeItem* item, const std::function& predicate) const { if (!item) return false; if (item->package && !predicate(item->package)) { return false; } for (const auto& child : item->children) { if (!allPackages(child.get(), predicate)) { return false; } } return true; } /// The list of packages we are displaying const InstallablePackages& packages; /// Show only packages with an installer? bool show_only_installable; class TreeItem : public Item { public: TreeItem() : position_type(TYPE_OTHER), position_hint(1000000) {} String label; vector children; InstallablePackageP package; Bitmap icon, icon_grey; // positioning enum PackageType { TYPE_PROG, TYPE_LOCALE, TYPE_GAME, TYPE_STYLESHEET, TYPE_EXPORT_TEMPLATE, TYPE_IMPORT_TEMPLATE, TYPE_SYMBOL_FONT, TYPE_INCLUDE, TYPE_FONT, TYPE_OTHER, } position_type; int position_hint; void add(const InstallablePackageP& package, const String& path, int level = -1); void toItems(vector& items); void setIcon(const Image& image); bool highlight() const; static PackageType package_type(const PackageDescription& desc); }; bool CheckChildrenForUpdates(const TreeItem& ti) const; friend class PackageIconRequest; };