Bugz Door Project
Door++

Wecome to Door++, a modern BBS Door development kit written in C++

Getting Started

Clone the door++ project into a sub-directory of your project. In your project CmakeLists.txt file, add add_subdirectory(door++). Under the add_executable(your-door your-door.cpp) line, add target_link_libraries(your-door door++ pthread)`.

In main, create the door instance:

#include "door.h"
int main( int argc, char * argv[] ) {
door::Door door("your-door", argc, argv);
door << "Welcome to Door++" << door::nl;
}

Advanced Features of Door++

A line is text that can be updated, and can be colorized by the use of a rendering function.

If you want all uppercase letters one color, and lowercase another. That can be done.

/*
* Custom line rendering fuction.
* This allows for the status to be one color, and the value to be another.
* "Score: 500"
* "Score:" would be status color, "500" would be value color.
*/
door::ANSIColor value) {
door::renderFunction rf = [status,
value](const std::string &txt) -> door::Render {
door::Render r(txt);
size_t pos = txt.find(':');
if (pos == std::string::npos) {
for (char const &c : txt) {
if (std::isdigit(c))
r.append(value);
else
r.append(status);
}
} else {
pos++;
r.append(status, pos);
r.append(value, txt.length() - pos);
}
return r;
};
return rf;
}
door::renderFunction svRender = statusValue(statusColor, valueColor);
// build the actual line here
std::unique_ptr<door::Line> scoreLine = std::make_unique<door::Line>("Score: 0", 50);
scoreLine->setRender(svRender);
// Make the scoreLine automatically update when score changes.
door::updateFunction scoreUpdate = [score](void) -> std::string {
std::string text = "Score: ";
text.append(std::to_string(score));
return text;
};
scoreLine->setUpdater(scoreUpdate);

A Panel is a group of lines with a known position.

std::unique_ptr<door::Panel> panel = std::make_unique<door::Panel>(50);
panel->setStyle(door::BorderStyle::NONE);
// add lines to the panel
panel->addLines(std::move(scoreLine));
panel->set(5, 5);
panel->update();
door << panel;

A Panel that displays options for the user to select

// Define a menu starting at 5, 5 with width 25
door::Menu menu(5, 5, 25);
// Set border color
m.setColor(border_color);
// Set the Menu Title
door::Line mtitle("Main Menu");
mtitle.setColor(title_color);
mtitle.setPadding(" ", title_color);
m.setTitle(std::make_unique<door::Line>(mtitle), 1);
// Define colors for the menu
// menu line selected
m.setRender(true, door::Menu::makeRender(
// menu line unselected
m.setRender(false, door::Menu::makeRender(
// Build the menu
// First char is [ char ], followed by the text.
// The arrow keys can be used to select the menu option, or
// hitting the character.
m.addSelection('P', "Play Cards");
m.addSelection('S', "View Scores");
m.addSelection('C', "Configure");
m.addSelection('H', "Help");
m.addSelection('A', "About this game");
m.addSelection('Q', "Quit");
int r;
// Render the menu and prompt for input
r = m.choose(door);
if (r < 0) {
// timeout or out of time
}
if ( r == 1 ) {
// Play Cards
}
...
door::Door
Definition: door.h:190
door::ATTR::BOLD
@ BOLD
BOLD is the same as BRIGHT.
door::COLOR::CYAN
@ CYAN
CYAN (6)
door::ANSIColor
Foreground, Background and Attributes.
Definition: door.h:137
door::Menu
Definition: door.h:686
door::renderFunction
std::function< Render(const std::string &)> renderFunction
Render output function.
Definition: door.h:355
door::BorderStyle::NONE
@ NONE
NONE (0)
door::Line
Text and ANSIColor.
Definition: door.h:502
door::updateFunction
std::function< std::string(void)> updateFunction
Definition: door.h:374
door::nl
NewLine nl
Definition: door.cpp:1380
door::COLOR::YELLOW
@ YELLOW
YELLOW (3)
door::COLOR::WHITE
@ WHITE
WHITE (7)
door
The BBS door project. This is an attempt at writing a C++ BBS door toolkit.
Definition: ansicolor.cpp:9
door::Menu::makeRender
static renderFunction makeRender(ANSIColor c1, ANSIColor c2, ANSIColor c3, ANSIColor c4)
Definition: panel.cpp:712
door::COLOR::BLUE
@ BLUE
BLUE (4)
door::Render
Rendering a string with ANSIColor.
Definition: door.h:319