Add CMakeLists.txt

Fix warnings related to -Weffc++.

Format with clang-format.
This commit is contained in:
Stephen Seo 2023-12-14 20:16:09 +09:00
parent c4f9a01b7f
commit a43f83d7d5
5 changed files with 309 additions and 218 deletions

1
.gitignore vendored
View file

@ -2,3 +2,4 @@
/objects/ /objects/
/.cache/ /.cache/
/compile_commands.json /compile_commands.json
/build*/

39
CMakeLists.txt Normal file
View file

@ -0,0 +1,39 @@
cmake_minimum_required(VERSION 3.22.1)
project(DvorakTypingPractice)
set(DvorakTypingPractice_SOURCES
"${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc"
"${CMAKE_CURRENT_SOURCE_DIR}/src/screen.cc"
)
set(DvorakTypingPractice_HEADERS
"${CMAKE_CURRENT_SOURCE_DIR}/src/screen.h"
)
add_executable(DvorakTypingPractice ${DvorakTypingPractice_SOURCES})
find_package(raylib REQUIRED)
target_include_directories(DvorakTypingPractice PUBLIC ${raylib_INCLUDE_DIRS})
target_link_libraries(DvorakTypingPractice PUBLIC ${raylib_LIBRARIES})
target_compile_options(DvorakTypingPractice PUBLIC
-Wall -Wextra -Wpedantic
$<$<COMPILE_LANGUAGE:CXX>:-Weffc++>
$<$<CONFIG:DEBUG>:-Og>
)
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "Setting build type to 'Debug', none was specified.")
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")
endif()
if(EXISTS /usr/bin/clang-format)
add_custom_target(
ClangFormatTarget
COMMAND clang-format -i --style=google ${DvorakTypingPractice_SOURCES} ${DvorakTypingPractice_HEADERS}
)
add_dependencies(DvorakTypingPractice ClangFormatTarget)
message(STATUS "Enabled clang-format formatting.")
endif()

View file

@ -1,7 +1,7 @@
// Standard library includes // Standard library includes
#include <string>
#include <iostream>
#include <fstream> #include <fstream>
#include <iostream>
#include <string>
// Third party includes // Third party includes
#include <raylib.h> #include <raylib.h>
@ -10,58 +10,59 @@
#include "screen.h" #include "screen.h"
std::string get_next_word(std::istream *i) { std::string get_next_word(std::istream *i) {
std::string word; std::string word;
while (i->good()) { while (i->good()) {
int in = i->get(); int in = i->get();
if (in != std::char_traits<char>::eof() && in != ' ' && in != '\n' && in != '\r') { if (in != std::char_traits<char>::eof() && in != ' ' && in != '\n' &&
word.push_back((char)in); in != '\r') {
} else if (in == ' '|| in == '\n' || in == '\r' || in == '\t') { word.push_back((char)in);
if (!word.empty()) { } else if (in == ' ' || in == '\n' || in == '\r' || in == '\t') {
break; if (!word.empty()) {
} else { break;
continue; } else {
} continue;
} }
} }
}
return word; return word;
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (argc != 2) { if (argc != 2) {
std::cout << "Expected 1 arg input filename!\n"; std::cout << "Expected 1 arg input filename!\n";
return 1; return 1;
} }
std::ifstream ifs(argv[1]); std::ifstream ifs(argv[1]);
if (!ifs.good()) { if (!ifs.good()) {
std::cout << "ERROR: Failed to open file \"" << argv[1] << "\"!\n"; std::cout << "ERROR: Failed to open file \"" << argv[1] << "\"!\n";
return 2; return 2;
} }
InitWindow(900, 400, "Dvorak Typing Practice"); InitWindow(900, 400, "Dvorak Typing Practice");
SetTargetFPS(15); SetTargetFPS(15);
{ {
Screen screen{}; Screen screen{};
std::string word; std::string word;
do { do {
word = get_next_word(&ifs); word = get_next_word(&ifs);
if (!word.empty()) { if (!word.empty()) {
screen.set_word(word); screen.set_word(word);
while (!screen.update() && !WindowShouldClose()) { while (!screen.update() && !WindowShouldClose()) {
BeginDrawing(); BeginDrawing();
ClearBackground(BLACK); ClearBackground(BLACK);
screen.draw(); screen.draw();
EndDrawing(); EndDrawing();
} }
} }
} while (!ifs.eof() && !WindowShouldClose()); } while (!ifs.eof() && !WindowShouldClose());
} }
CloseWindow(); CloseWindow();
return 0; return 0;
} }

View file

@ -1,275 +1,326 @@
#include "screen.h" #include "screen.h"
#include <raylib.h> #include <raylib.h>
Screen::Screen() : Screen::Screen()
prev(), : prev(),
word(), word(),
word_center{0, 0}, word_pre(),
keyboard(LoadTexture("dvorak_keyboard.png")), word_post(),
idx(0) word_center{0, 0},
{ keyboard(LoadTexture("dvorak_keyboard.png")),
flags.set(0); idx(0),
flags() {
flags.set(0);
} }
Screen::~Screen() { Screen::~Screen() { UnloadTexture(keyboard); }
UnloadTexture(keyboard);
}
void Screen::set_word(std::string s) { void Screen::set_word(std::string s) {
prev = word; prev = word;
word = s; word = s;
idx = 0; idx = 0;
word_pre.clear(); word_pre.clear();
word_post.clear(); word_post.clear();
word_center[0] = s.at(0); word_center[0] = s.at(0);
flags.set(0); flags.set(0);
} }
bool Screen::update() { bool Screen::update() {
int input = GetCharPressed(); int input = GetCharPressed();
if (input == word_center[0]) { if (input == word_center[0]) {
++idx; ++idx;
flags.set(0); flags.set(0);
if (idx >= word.size()) { if (idx >= word.size()) {
return true; return true;
}
} }
}
return false; return false;
} }
void Screen::draw() { void Screen::draw() {
DrawTexture(keyboard, 0, 0, WHITE); DrawTexture(keyboard, 0, 0, WHITE);
if (flags.test(0)) { if (flags.test(0)) {
flags.reset(0); flags.reset(0);
if (idx > 0) { if (idx > 0) {
word_pre = word.substr(0, idx); word_pre = word.substr(0, idx);
} else { } else {
word_pre.clear(); word_pre.clear();
}
if (idx < word.size()) {
word_post = word.substr(idx + 1, word.size() - idx - 1);
} else {
word_post.clear();
}
word_center[0] = word.at(idx);
} }
int offset = 0; if (idx < word.size()) {
if (!prev.empty()) { word_post = word.substr(idx + 1, word.size() - idx - 1);
DrawText(prev.c_str(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE, GRAY); } else {
offset += MeasureText(prev.c_str(), FONT_SIZE) + PREV_OFFSET; word_post.clear();
} }
if (!word_pre.empty()) { word_center[0] = word.at(idx);
DrawText(word_pre.c_str(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE, WHITE); }
offset += MeasureText(word_pre.c_str(), FONT_SIZE) + CENTER_X_OFFSET;
}
DrawText(word_center.data(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE, GREEN); int offset = 0;
offset += MeasureText(word_center.data(), FONT_SIZE) + CENTER_X_OFFSET; if (!prev.empty()) {
DrawText(prev.c_str(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE, GRAY);
offset += MeasureText(prev.c_str(), FONT_SIZE) + PREV_OFFSET;
}
if (!word_post.empty()) { if (!word_pre.empty()) {
DrawText(word_post.c_str(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE, WHITE); DrawText(word_pre.c_str(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE,
} WHITE);
offset += MeasureText(word_pre.c_str(), FONT_SIZE) + CENTER_X_OFFSET;
}
draw_overlay(word_center[0]); DrawText(word_center.data(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE,
GREEN);
offset += MeasureText(word_center.data(), FONT_SIZE) + CENTER_X_OFFSET;
if (!word_post.empty()) {
DrawText(word_post.c_str(), LEFT_OFFSET + offset, TOP_OFFSET, FONT_SIZE,
WHITE);
}
draw_overlay(word_center[0]);
} }
void Screen::draw_overlay(char c) { void Screen::draw_overlay(char c) {
switch (c) { switch (c) {
case '`': case '`':
case '~': case '~':
DrawCircle(1 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(1 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '1': case '1':
case '!': case '!':
DrawCircle(61 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(61 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '2': case '2':
case '@': case '@':
DrawCircle(121 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(121 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '3': case '3':
case '#': case '#':
DrawCircle(181 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(181 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '4': case '4':
case '$': case '$':
DrawCircle(241 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(241 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '5': case '5':
case '%': case '%':
DrawCircle(301 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(301 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '6': case '6':
case '^': case '^':
DrawCircle(361 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(361 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '7': case '7':
case '&': case '&':
DrawCircle(421 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(421 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '8': case '8':
case '*': case '*':
DrawCircle(481 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(481 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '9': case '9':
case '(': case '(':
DrawCircle(541 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(541 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '0': case '0':
case ')': case ')':
DrawCircle(601 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(601 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '{': case '{':
case '[': case '[':
DrawCircle(661 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(661 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '}': case '}':
case ']': case ']':
DrawCircle(721 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(721 + KEY_HALF_SIZE, 1 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '\'': case '\'':
case '"': case '"':
DrawCircle(91 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(91 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '<': case '<':
case ',': case ',':
DrawCircle(151 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(151 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '>': case '>':
case '.': case '.':
DrawCircle(211 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(211 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'P': case 'P':
case 'p': case 'p':
DrawCircle(271 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(271 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'Y': case 'Y':
case 'y': case 'y':
DrawCircle(331 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(331 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'F': case 'F':
case 'f': case 'f':
DrawCircle(391 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(391 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'G': case 'G':
case 'g': case 'g':
DrawCircle(451 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(451 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'C': case 'C':
case 'c': case 'c':
DrawCircle(511 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(511 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'R': case 'R':
case 'r': case 'r':
DrawCircle(571 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(571 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'L': case 'L':
case 'l': case 'l':
DrawCircle(631 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(631 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '?': case '?':
case '/': case '/':
DrawCircle(691 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(691 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '+': case '+':
case '=': case '=':
DrawCircle(751 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(751 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '|': case '|':
case '\\': case '\\':
DrawCircle(811 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(811 + KEY_HALF_SIZE, 61 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'A': case 'A':
case 'a': case 'a':
DrawCircle(106 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(106 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'O': case 'O':
case 'o': case 'o':
DrawCircle(166 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(166 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'E': case 'E':
case 'e': case 'e':
DrawCircle(226 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(226 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'U': case 'U':
case 'u': case 'u':
DrawCircle(286 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(286 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'I': case 'I':
case 'i': case 'i':
DrawCircle(346 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(346 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'D': case 'D':
case 'd': case 'd':
DrawCircle(406 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(406 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'H': case 'H':
case 'h': case 'h':
DrawCircle(466 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(466 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'T': case 'T':
case 't': case 't':
DrawCircle(526 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(526 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'N': case 'N':
case 'n': case 'n':
DrawCircle(586 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(586 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'S': case 'S':
case 's': case 's':
DrawCircle(646 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(646 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case '_': case '_':
case '-': case '-':
DrawCircle(706 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(706 + KEY_HALF_SIZE, 121 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case ':': case ':':
case ';': case ';':
DrawCircle(136 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(136 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'Q': case 'Q':
case 'q': case 'q':
DrawCircle(196 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(196 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'J': case 'J':
case 'j': case 'j':
DrawCircle(256 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(256 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'K': case 'K':
case 'k': case 'k':
DrawCircle(316 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(316 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'X': case 'X':
case 'x': case 'x':
DrawCircle(376 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(376 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'B': case 'B':
case 'b': case 'b':
DrawCircle(436 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(436 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'M': case 'M':
case 'm': case 'm':
DrawCircle(496 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(496 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'W': case 'W':
case 'w': case 'w':
DrawCircle(556 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(556 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'V': case 'V':
case 'v': case 'v':
DrawCircle(616 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(616 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
case 'Z': case 'Z':
case 'z': case 'z':
DrawCircle(676 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE, KEY_HIGHLIGHT_COLOR); DrawCircle(676 + KEY_HALF_SIZE, 181 + KEY_HALF_SIZE, KEY_HALF_SIZE,
break; KEY_HIGHLIGHT_COLOR);
break;
default: default:
break; break;
} }
} }

View file

@ -20,31 +20,30 @@ constexpr int KEY_HALF_SIZE = 29;
constexpr Color KEY_HIGHLIGHT_COLOR = Color{255, 255, 0, 127}; constexpr Color KEY_HIGHLIGHT_COLOR = Color{255, 255, 0, 127};
class Screen { class Screen {
public: public:
Screen(); Screen();
~Screen(); ~Screen();
void set_word(std::string s); void set_word(std::string s);
// True if finished with word. // True if finished with word.
bool update(); bool update();
void draw(); void draw();
private: private:
std::string prev; std::string prev;
std::string word; std::string word;
std::string word_pre; std::string word_pre;
std::string word_post; std::string word_post;
std::array<char, 2> word_center; std::array<char, 2> word_center;
Texture2D keyboard; Texture2D keyboard;
unsigned int idx; unsigned int idx;
/* /*
* 0 - cached word data is dirty * 0 - cached word data is dirty
*/ */
std::bitset<32> flags; std::bitset<32> flags;
void draw_overlay(char c);
void draw_overlay(char c);
}; };
#endif #endif