stamenStatic Menu Generator | 
          
| git clone git://git.dimitrijedobrota.com/stamen.git | 
| Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING | 
stamen.cpp (1431B)
    0 #include <cmath>
              1 #include <format>
              2 #include <iostream>
          
              4 #include "stamen/stamen.hpp"
          
              6 #include "stamen/menu.h"
          
              8 namespace stamen {
          
             10 int builtin_display(const char* title, const item_t itemv[], size_t size)
             11 {
             12   const auto items  = std::span(itemv, size);
             13   const size_t dgts = static_cast<size_t>(std::log10(size)) + 1;
             14   int choice        = 0;
          
             16   while (true)
             17   {
             18     std::cout << std::format("{}:\n", title);
             19     for (auto i = 0UL; i < size; i++)
             20     {
             21       std::cout << std::format(" {:{}}. {}\n", i, dgts, items[i].prompt);
             22     }
          
             24     while (true)
             25     {
             26       std::cout << "Choose an option: ";
             27       if (std::cin >> choice && choice >= -1
             28           && choice < static_cast<int>(size))
             29       {
             30         if (choice == -1)
             31         {
             32           std::cout << "Choice: back\n";
             33           return 1;
             34         }
          
             36         const auto uchoice = static_cast<size_t>(choice);
             37         std::cout << "Choice: " << items[uchoice].prompt << "\n\n";
             38         const int res = items[uchoice].callback(uchoice);
          
             40         if (res < 2) break;
             41         return res - 1;
             42       }
          
             44       if (std::cin.eof())
             45       {
             46         std::cerr << "encountered end of input!\n";
             47         return std::numeric_limits<int>::max();
             48       }
          
             50       std::cin.clear();
             51       std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
             52       std::cout << "Invalid option, please choose again!\n";
             53     }
             54     std::cout << std::endl;
             55   }
          
             57   return 1;
             58 }
          
             60 }  // namespace stamen