Files
MagicSetEditor2/src/gui/control/item_list.hpp
T
2026-05-04 07:01:52 +02:00

126 lines
5.4 KiB
C++

//+----------------------------------------------------------------------------+
//| 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 <util/prec.hpp>
#include <wx/listctrl.h>
// ----------------------------------------------------------------------------- : ItemList
/// A generic list of items
/** The list is shown in report mode, and allows sorting.
* Currently used for cards and keywords.
*
* Terminology:
* selected item = a single item in the variable selected_item
* focused items = items that are drawn as selected in the control
* TODO: This is reverse of normal
*/
class ItemList : public wxListView {
public:
ItemList(Window* parent, int id, long additional_style = 0, bool multi_sel = false);
// --------------------------------------------------- : Selection
/// Is there a previous item to select?
bool canSelectPrevious() const;
/// Is there a next item to select?
bool canSelectNext() const;
/// Can we select all?
bool canSelectAll() const;
/// Move the selection to the previous item (if possible)
void selectPrevious();
/// Move the selection to the next item (if possible)
void selectNext();
/// Move the selection to the first item (if possible)
void selectFirst();
/// Select all items
void doSelectAll();
/// Find the position for a given item
long findGivenItemPos(const VoidP& item);
// --------------------------------------------------- : Clipboard
virtual bool canCut() const { return canCopy() && canDelete(); }
virtual bool canCopy() const { return false; }
virtual bool canPaste() const { return false; }
virtual bool canDelete() const { return false; }
// Try to perform a clipboard operation, return success
virtual bool doCut();
virtual bool doCopy() { return false; }
virtual bool doPaste() { return false; }
virtual bool doDelete() { return false; }
// --------------------------------------------------- : Virtual interface
protected:
/// Get a list of all items
virtual void getItems(vector<VoidP>& out) const = 0;
/// Send an 'item selected' event for the currently selected item (selected_item)
virtual void sendEvent() = 0;
/// Is sorting required?
virtual bool mustSort() const { return false; }
/// Compare two items for < based on sort_by_column (not on sort_ascending)
virtual bool compareItems(void* a, void* b) const = 0;
// --------------------------------------------------- : Protected interface
/// Return the card at the given position in the sorted list
inline const VoidP& getItem(long pos) const { return sorted_list[pos]; }
/// Sort by the given column
virtual void sortBy(long column, bool ascending);
/// Refresh the card list (resort, refresh and reselect current item)
void refreshList(bool refresh_current_only = false);
/// Set the image of a column header (fixes wx bug)
void SetColumnImage(int col, int image);
/// Select an item, send an event to the parent
/** If focus then the item is also focused and selected in the actual control.
* This should not be done when the item is selected because it was focused (leading to a loop).
*/
void selectItem(const VoidP& item, bool focus, bool event);
/// Select a item at the specified position
void selectItemPos(long pos, bool focus, bool force_focus = false);
/// Find the position for the selected_item
void findSelectedItemPos();
/// Actually select the item at selected_item_pos in the control
/** if force_focus == true, then the item is highlighted again if it already is focused. */
void focusSelectedItem(bool force_focus = false);
/// Deselect everything in the control
void focusNone();
/// Actually select a certain item in the control
void focusItem(const VoidP& item, bool focus = true);
/// Count the number of focused items
long focusCount() const;
// --------------------------------------------------- : Fixing wx issues
wxSize DoGetBestClientSize() const override;
// --------------------------------------------------- : Data
VoidP selected_item; ///< The currently selected item
long selected_item_pos; ///< Position of the selected item in the sorted_list, or -1 if no card is selected
long sort_by_column; ///< Column to use for sorting, or -1 if not sorted
long sort_by_column2; ///< Previous column used for sorting, or -1 if not sorted
long sort_by_column3; ///< Previous previous column used for sorting, or -1 if not sorted (stable sort aint workin so we doing this I guess)
bool sort_ascending; ///< Sort order
vector<VoidP> sorted_list; ///< Sorted list of items, can be considered a map: pos->item
private:
struct ItemComparer; // for comparing items
// --------------------------------------------------- : Window events
DECLARE_EVENT_TABLE();
void onColumnClick(wxListEvent& ev);
void onItemFocus (wxListEvent& ev);
void onContextMenu(wxContextMenuEvent&);
};