From 15ad48a5be9cb50d2600646492aecd9210bede12 Mon Sep 17 00:00:00 2001 From: Brendan Hagan Date: Wed, 15 Jun 2022 22:08:34 -0400 Subject: [PATCH] feat: super sloppy way of adding more card list columns (created, modified, notes) --- data/magic.mse-game/card_fields | 36 ++++++++++++++++++++++++++++++++- src/data/card.cpp | 18 +++++++++++++++++ src/data/card.hpp | 3 +++ src/gui/control/card_list.cpp | 13 +++++++++--- 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/data/magic.mse-game/card_fields b/data/magic.mse-game/card_fields index c36572ae..a4289c55 100644 --- a/data/magic.mse-game/card_fields +++ b/data/magic.mse-game/card_fields @@ -1110,4 +1110,38 @@ card field: type: image name: mainframe image 2 show statistics: false - description: An extra image of the card \ No newline at end of file + description: An extra image of the card + + +############################# Exposing Internal Fields? + +card field: + type: text + name: time created + show statistics: false + save value: false + editable: false + card list visible: true + card list name: Created At + card list column: 100 + card list width: 150 +card field: + type: text + name: time modified + show statistics: false + save value: false + editable: false + card list visible: true + card list name: Last Modified At + card list column: 101 + card list width: 150 +card field: + type: text + name: has notes + show statistics: false + save value: false + editable: false + card list visible: true + card list name: Has Notes + card list column: 102 + card list width: 50 diff --git a/src/data/card.cpp b/src/data/card.cpp index e65b5c2a..861fb6dd 100644 --- a/src/data/card.cpp +++ b/src/data/card.cpp @@ -52,6 +52,24 @@ String Card::identification() const { } } +String Card::valueOfDataKey(FieldP fieldP) { + String columnName = fieldP.get()->name; + + if (columnName == "time_created") { + return time_created.Format("%Y-%m-%d %H:%M:%S").ToStdString(); + } + else if (columnName == "time_modified") { + return time_modified.Format("%Y-%m-%d %H:%M:%S").ToStdString(); + } + else if (columnName == "has_notes") { + return notes.empty() ? "N" : "Y"; + } + + ValueP val = data[fieldP]; + if (val) return val->toString(); + else return wxEmptyString; +} + bool Card::contains(QuickFilterPart const& query) const { FOR_EACH_CONST(v, data) { if (query.match(v->fieldP->name, v->toString())) return true; diff --git a/src/data/card.hpp b/src/data/card.hpp index 7d6f0947..dedffe82 100644 --- a/src/data/card.hpp +++ b/src/data/card.hpp @@ -61,6 +61,9 @@ public: /// Get the identification of this card, an identification is something like a name, title, etc. /** May return "" */ String identification() const; + + String valueOfDataKey(FieldP fieldP); + /// Does any field contains the given query string? bool contains(QuickFilterPart const& query) const; diff --git a/src/gui/control/card_list.cpp b/src/gui/control/card_list.cpp index 1e452e21..4bb5525c 100644 --- a/src/gui/control/card_list.cpp +++ b/src/gui/control/card_list.cpp @@ -186,9 +186,17 @@ bool CardListBase::doDelete() { // Comparison object for comparing cards bool CardListBase::compareItems(void* a, void* b) const { FieldP sort_field = column_fields[sort_by_column]; + ValueP va = reinterpret_cast(a)->data[sort_field]; ValueP vb = reinterpret_cast(b)->data[sort_field]; assert(va && vb); + + // Super hack for sorting internal fields. Couldn't figure out how to bind these to ValuePs. + if (sort_field->name == "time_created" || sort_field->name == "time_modified" || sort_field->name == "has_notes") { + int cmp = smart_compare(reinterpret_cast(a)->valueOfDataKey(sort_field), reinterpret_cast(b)->valueOfDataKey(sort_field)); + if (cmp != 0) return cmp < 0; + } + // compare sort keys int cmp = smart_compare( va->getSortKey(), vb->getSortKey() ); if (cmp != 0) return cmp < 0; @@ -309,9 +317,8 @@ String CardListBase::OnGetItemText(long pos, long col) const { // wx may give us non existing columns! return wxEmptyString; } - ValueP val = getCard(pos)->data[column_fields[col]]; - if (val) return val->toString(); - else return wxEmptyString; + + return getCard(pos)->valueOfDataKey(column_fields[col]); } int CardListBase::OnGetItemImage(long pos) const {