xaizek / pipedial (License: GPLv3 only) (since 2019-01-08)
One more tool for selecting something in console.
<root> / src / PipeDial.hpp (c23c8638b05f38d50c4782a3b2185d5d7d550748) (2,711B) (mode 100644) [raw]
// pipedial -- terminal element picker
// Copyright (C) 2019 xaizek <xaizek@posteo.net>
//
// This file is part of pipedial.
//
// pipedial is free software: you can redistribute it and/or modify
// it under the terms of version 3 of the GNU General Public License
// as published by the Free Software Foundation.
//
// pipedial is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with pipedial.  If not, see <https://www.gnu.org/licenses/>.

#ifndef PIPEDIAL__PIPEDIAL_HPP__
#define PIPEDIAL__PIPEDIAL_HPP__

#include "cursed/ColorTree.hpp"
#include "cursed/Init.hpp"
#include "cursed/Input.hpp"
#include "cursed/Label.hpp"
#include "cursed/List.hpp"
#include "cursed/Screen.hpp"
#include "cursed/Text.hpp"
#include "cursed/Track.hpp"

#include "vle/Modes.hpp"

#include <string>
#include <vector>

// Core state and behaviour of the application.
class PipeDial
{
public:
    // Performs initialization.
    PipeDial(std::wstring titleText, std::vector<std::wstring> initLines);

    PipeDial(const PipeDial &rhs) = delete;
    PipeDial(PipeDial &&rhs) = delete;
    PipeDial & operator=(const PipeDial &rhs) = delete;
    PipeDial & operator=(PipeDial &&rhs) = delete;

public:
    // Runs the app.  Returns user's pick, empty result means "nothing was
    // picked".
    std::wstring run(bool filterOnStart);

private:
    // Constructs help message.
    std::vector<cursed::ColorTree> buildHelpMessage();
    // Constructs normal mode.
    vle::Mode buildNormalMode();
    // Constructs help mode.
    vle::Mode buildHelpMode();

    // Accepts current item after editing it.
    void editAndAccept();
    // Handles line filtering.
    void filter();

private:
    std::vector<std::wstring> lines; // Original list of lines.

    cursed::Init cursesInit; // Curses initialization manager.
    cursed::Screen screen;   // Screen manager.
    cursed::Input input;     // Source of input events.

    vle::Modes modes;        // Modes manager.

    cursed::Label title;     // Title of the list.
    cursed::List list;       // List of items.
    cursed::Label inputBuf;  // Input buffer for incomplete sequences.

    cursed::Text help;       // Contents of the help mode.

    cursed::Track track;     // Track of the normal mode.

    bool quit;               // Whether quitting was requested.
    std::wstring result;     // Picked value.

    cursed::Format matchHi;  // Visual style for search matches.
};

#endif // PIPEDIAL__PIPEDIAL_HPP__
Hints

Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://code.reversed.top/user/xaizek/pipedial

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@code.reversed.top/user/xaizek/pipedial

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a pull request:
... clone the repository ...
... make some changes and some commits ...
git push origin master