Author: Omar Emara Date: 2021-07-23T18:02:48-07:00 New Revision: 80ac12b70b16a51fac9918c4b25e3bdfad05eee5
URL: https://github.com/llvm/llvm-project/commit/80ac12b70b16a51fac9918c4b25e3bdfad05eee5 DIFF: https://github.com/llvm/llvm-project/commit/80ac12b70b16a51fac9918c4b25e3bdfad05eee5.diff LOG: [LLDB][GUI] Check fields validity in actions This patch adds a virtual method HasError to fields, it can be overridden by fields that have errors. Additionally, a form method CheckFieldsValidity was added to be called by actions that expects all the field to be valid. Differential Revision: https://reviews.llvm.org/D106459 Added: Modified: lldb/source/Core/IOHandlerCursesGUI.cpp Removed: ################################################################################ diff --git a/lldb/source/Core/IOHandlerCursesGUI.cpp b/lldb/source/Core/IOHandlerCursesGUI.cpp index 9b2cbb8fca7ca..4105bcc497871 100644 --- a/lldb/source/Core/IOHandlerCursesGUI.cpp +++ b/lldb/source/Core/IOHandlerCursesGUI.cpp @@ -1061,6 +1061,9 @@ class FieldDelegate { // Select the last element in the field if multiple elements exists. virtual void FieldDelegateSelectLastElement() { return; } + // Returns true if the field has an error, false otherwise. + virtual bool FieldDelegateHasError() { return false; } + bool FieldDelegateIsVisible() { return m_is_visible; } void FieldDelegateHide() { m_is_visible = false; } @@ -1098,7 +1101,7 @@ class TextFieldDelegate : public FieldDelegate { // field and an optional line for an error if it exists. int FieldDelegateGetHeight() override { int height = GetFieldHeight(); - if (HasError()) + if (FieldDelegateHasError()) height++; return height; } @@ -1138,7 +1141,7 @@ class TextFieldDelegate : public FieldDelegate { } void DrawError(SubPad &surface) { - if (!HasError()) + if (!FieldDelegateHasError()) return; surface.MoveCursor(0, 0); surface.AttributeOn(COLOR_PAIR(RedOnBlack)); @@ -1239,6 +1242,8 @@ class TextFieldDelegate : public FieldDelegate { return eKeyNotHandled; } + bool FieldDelegateHasError() override { return !m_error.empty(); } + void FieldDelegateExitCallback() override { if (!IsSpecified() && m_required) SetError("This field is required!"); @@ -1246,8 +1251,6 @@ class TextFieldDelegate : public FieldDelegate { bool IsSpecified() { return !m_content.empty(); } - bool HasError() { return !m_error.empty(); } - void ClearError() { m_error.clear(); } const std::string &GetError() { return m_error; } @@ -1920,6 +1923,19 @@ class FormDelegate { void SetError(const char *error) { m_error = error; } + // If all fields are valid, true is returned. Otherwise, an error message is + // set and false is returned. This method is usually called at the start of an + // action that requires valid fields. + bool CheckFieldsValidity() { + for (int i = 0; i < GetNumberOfFields(); i++) { + if (GetField(i)->FieldDelegateHasError()) { + SetError("Some fields are invalid!"); + return false; + } + } + return true; + } + // Factory methods to create and add fields of specific types. TextFieldDelegate *AddTextField(const char *label, const char *content, @@ -2535,6 +2551,10 @@ class ProcessAttachFormDelegate : public FormDelegate { void Attach(Window &window) { ClearError(); + bool all_fields_are_valid = CheckFieldsValidity(); + if (!all_fields_are_valid) + return; + bool process_is_running = StopRunningProcess(); if (process_is_running) return; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits