From de45b379e318c59dbce091fda284e34543825895 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Thu, 23 Jan 2025 20:12:32 -0600 Subject: [PATCH] add max-chars attribute to text field --- rsrc/dialogs/edit-talk-node.xml | 4 ++-- rsrc/schemas/dialog.xsd | 1 + src/dialogxml/widgets/field.cpp | 23 ++++++++++++++--------- src/dialogxml/widgets/field.hpp | 4 ++++ 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/rsrc/dialogs/edit-talk-node.xml b/rsrc/dialogs/edit-talk-node.xml index 684bba02..fad463f0 100644 --- a/rsrc/dialogs/edit-talk-node.xml +++ b/rsrc/dialogs/edit-talk-node.xml @@ -3,8 +3,8 @@ - - + + The in-game "Buy" button checks for these response keys, in order: purc, sale, heal, iden, trai, ench The "Sell" button checks for sell. diff --git a/rsrc/schemas/dialog.xsd b/rsrc/schemas/dialog.xsd index 7676d46f..c349f0b4 100644 --- a/rsrc/schemas/dialog.xsd +++ b/rsrc/schemas/dialog.xsd @@ -150,6 +150,7 @@ + diff --git a/src/dialogxml/widgets/field.cpp b/src/dialogxml/widgets/field.cpp index 46c2467f..24429d9a 100644 --- a/src/dialogxml/widgets/field.cpp +++ b/src/dialogxml/widgets/field.cpp @@ -442,16 +442,18 @@ void cTextField::handleInput(cKey key, bool record) { handleInput(deleteKey); contents = getText(); } - if(aTextInsert* ins = dynamic_cast(current_action.get())) - ins->append(key.c); - else { - if(current_action) history.add(current_action); - aTextInsert* new_ins = new aTextInsert(*this, insertionPoint); - new_ins->append(key.c); - current_action.reset(new_ins); + if(maxChars < 0 || contents.size() < maxChars){ + if(aTextInsert* ins = dynamic_cast(current_action.get())) + ins->append(key.c); + else { + if(current_action) history.add(current_action); + aTextInsert* new_ins = new aTextInsert(*this, insertionPoint); + new_ins->append(key.c); + current_action.reset(new_ins); + } + contents.insert(contents.begin() + insertionPoint, char(key.c)); + selectionPoint = ++insertionPoint; } - contents.insert(contents.begin() + insertionPoint, char(key.c)); - selectionPoint = ++insertionPoint; } else switch(key.k) { case key_enter: break; // Shouldn't be receiving this anyway case key_left: case key_word_left: @@ -681,6 +683,9 @@ bool cTextField::parseAttribute(ticpp::Attribute& attr, std::string tagName, std } else if(name == "tab-order"){ attr.GetValue(&tabOrder); return true; + } else if(name == "max-chars"){ + attr.GetValue(&maxChars); + return true; } return cControl::parseAttribute(attr, tagName, fname); } diff --git a/src/dialogxml/widgets/field.hpp b/src/dialogxml/widgets/field.hpp index fefce7a0..cec28d18 100644 --- a/src/dialogxml/widgets/field.hpp +++ b/src/dialogxml/widgets/field.hpp @@ -90,6 +90,10 @@ private: rectangle text_rect; std::vector snippets; int ip_row, ip_col; + /// Setting maxChars AFTER the player has a chance to type in the field would be a bad idea. + /// So would calling setText() with a string longer than maxChars. + /// Really, it should probably only be set in xml, as the attribute "max-chars". + int maxChars = -1; friend class aTextInsert; friend class aTextDelete; };