diff options
Diffstat (limited to 'Source/CursesDialog/cmCursesOptionsWidget.cxx')
-rw-r--r-- | Source/CursesDialog/cmCursesOptionsWidget.cxx | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/Source/CursesDialog/cmCursesOptionsWidget.cxx b/Source/CursesDialog/cmCursesOptionsWidget.cxx new file mode 100644 index 0000000..a8c4933 --- /dev/null +++ b/Source/CursesDialog/cmCursesOptionsWidget.cxx @@ -0,0 +1,84 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#include "cmCursesOptionsWidget.h" + +#include "cmCursesWidget.h" +#include "cmStateTypes.h" + +#define ctrl(z) ((z)&037) + +cmCursesOptionsWidget::cmCursesOptionsWidget(int width, int height, int left, + int top) + : cmCursesWidget(width, height, left, top) +{ + this->Type = cmStateEnums::BOOL; // this is a bit of a hack + // there is no option type, and string type causes ccmake to cast + // the widget into a string widget at some point. BOOL is safe for + // now. + set_field_fore(this->Field, A_NORMAL); + set_field_back(this->Field, A_STANDOUT); + field_opts_off(this->Field, O_STATIC); +} + +bool cmCursesOptionsWidget::HandleInput(int& key, cmCursesMainForm* /*fm*/, + WINDOW* w) +{ + switch (key) { + case 10: // 10 == enter + case KEY_ENTER: + this->NextOption(); + touchwin(w); + wrefresh(w); + return true; + case KEY_LEFT: + case ctrl('b'): + touchwin(w); + wrefresh(w); + this->PreviousOption(); + return true; + case KEY_RIGHT: + case ctrl('f'): + this->NextOption(); + touchwin(w); + wrefresh(w); + return true; + default: + return false; + } +} + +void cmCursesOptionsWidget::AddOption(std::string const& option) +{ + this->Options.push_back(option); +} + +void cmCursesOptionsWidget::NextOption() +{ + this->CurrentOption++; + if (this->CurrentOption > this->Options.size() - 1) { + this->CurrentOption = 0; + } + this->SetValue(this->Options[this->CurrentOption]); +} +void cmCursesOptionsWidget::PreviousOption() +{ + if (this->CurrentOption == 0) { + this->CurrentOption = this->Options.size() - 1; + } else { + this->CurrentOption--; + } + this->SetValue(this->Options[this->CurrentOption]); +} + +void cmCursesOptionsWidget::SetOption(const std::string& value) +{ + this->CurrentOption = 0; // default to 0 index + this->SetValue(value); + int index = 0; + for (auto const& opt : this->Options) { + if (opt == value) { + this->CurrentOption = index; + } + index++; + } +} |