/* * SelectionTab.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "CSelectionBase.h" class CSlider; class CLabel; enum ESortBy { _playerAm, _size, _format, _name, _viccon, _loscon, _numOfMaps, _fileName }; //_numOfMaps is for campaigns /// Class which handles map sorting by different criteria class mapSorter { public: ESortBy sortBy; bool operator()(const std::shared_ptr aaa, const std::shared_ptr bbb); mapSorter(ESortBy es) : sortBy(es){}; }; class SelectionTab : public CIntObject { struct ListItem : public CIntObject { std::shared_ptr labelAmountOfPlayers; std::shared_ptr labelNumberOfCampaignMaps; std::shared_ptr labelMapSizeLetter; std::shared_ptr iconFormat; std::shared_ptr iconVictoryCondition; std::shared_ptr iconLossCondition; std::shared_ptr labelName; ListItem(Point position, std::shared_ptr iconsFormats, std::shared_ptr iconsVictory, std::shared_ptr iconsLoss); void updateItem(std::shared_ptr info = {}, bool selected = false); }; std::vector> listItems; std::shared_ptr iconsMapFormats; // FIXME: CSelectionBase use them too! std::shared_ptr iconsVictoryCondition; std::shared_ptr iconsLossCondition; public: std::vector> allItems; std::vector> curItems; size_t selectionPos; std::function)> callOnSelect; ESortBy sortingBy; ESortBy generalSortingBy; bool sortModeAscending; std::shared_ptr inputName; SelectionTab(ESelectionScreen Type); void toggleMode(); void clickLeft(tribool down, bool previousState) override; void keyPressed(const SDL_Keycode & key) override; void onDoubleClick() override; void filter(int size, bool selectFirst = false); //0 - all void sortBy(int criteria); void sort(); void select(int position); //position: <0 - positions> position on the screen void selectAbs(int position); //position: absolute position in curItems vector void sliderMove(int slidPos); void updateListItems(); int getLine(); void selectFileName(std::string fname); std::shared_ptr getSelectedMapInfo() const; void rememberCurrentSelection(); void restoreLastSelection(); private: std::shared_ptr background; std::shared_ptr slider; std::vector> buttonsSortBy; std::shared_ptr labelTabTitle; std::shared_ptr labelMapSizes; ESelectionScreen tabType; Rect inputNameRect; void parseMaps(const std::unordered_set & files); void parseSaves(const std::unordered_set & files); void parseCampaigns(const std::unordered_set & files); std::unordered_set getFiles(std::string dirURI, int resType); };