Files
easyrpg-libretro/src/window_stringview.cpp

183 lines
5.0 KiB
C++

/*
* This file is part of EasyRPG Player.
*
* EasyRPG Player is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EasyRPG Player 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 EasyRPG Player. If not, see <http://www.gnu.org/licenses/>.
*/
// Headers
#include <vector>
#include "window_stringview.h"
#include "bitmap.h"
#include "game_message.h"
#include "game_system.h"
#include "input.h"
#include "player.h"
#include "json_helper.h"
Window_StringView::Window_StringView(int ix, int iy, int iwidth, int iheight) :
Window_Selectable(ix, iy, iwidth, iheight) {
column_max = 1;
}
Window_StringView::~Window_StringView() {
}
void Window_StringView::SetDisplayData(std::string_view data) {
display_data_raw = ToString(data);
#ifdef HAVE_NLOHMANN_JSON
this->json_data = nullptr;
#endif
}
std::string Window_StringView::GetDisplayData(bool eval_cmds) {
std::string display_str = ToString(this->display_data_raw);
#ifdef HAVE_NLOHMANN_JSON
if (this->json_data && pretty_print) {
if (auto parsed_json = Json_Helper::Parse(display_str)) {
display_str = Json_Helper::PrettyPrint(*parsed_json, 2);
}
}
#endif
if (eval_cmds) {
return PendingMessage::ApplyTextInsertingCommands(display_str, Player::escape_char, Game_Message::CommandCodeInserter);
}
return display_str;
}
#ifdef HAVE_NLOHMANN_JSON
void Window_StringView::SetDisplayData(std::string_view data, const nlohmann::ordered_json& json_data) {
display_data_raw = ToString(data);
this->json_data = &json_data;
}
#endif
void Window_StringView::Refresh() {
lines.clear();
line_numbers.clear();
line_count = 0;
std::string value = GetDisplayData(cmd_eval);
// determine line count
size_t pos = 0;
while ((pos = value.find("\n", pos)) != std::string::npos) {
value = value.substr(pos + 1);
pos = 0;
line_count++;
}
if (!value.empty()) {
line_count++;
}
//compute how many digits there are needed for the line numbers
line_no_max_digits = std::log10(line_count) + 1;
value = GetDisplayData(cmd_eval);
//create vector of display lines
pos = 0;
int c = 0;
int limit = 6 * (max_str_length - line_no_max_digits);
while ((pos = value.find("\n", pos)) != std::string::npos) {
std::string new_line = value.substr(0, pos);
line_numbers.push_back(++c);
if (auto_linebreak) {
bool skipFirstNo = true;
Game_Message::WordWrap(new_line, limit, [&](std::string_view line) {
if (!skipFirstNo)
line_numbers.push_back(0);
skipFirstNo = false;
lines.push_back(std::string(line));
}, *Font::DefaultBitmapFont());
} else {
lines.push_back(new_line);
}
value = value.substr(pos + 1);
pos = 0;
}
if (!value.empty()) {
lines.push_back(value);
line_numbers.push_back(++c);
}
item_max = lines.size() + GetReservedLineCount();
CreateContents();
contents->Clear();
DrawCmdLines();
for (int i = 0; i < item_max - GetReservedLineCount(); ++i) {
DrawLine(i);
}
}
void Window_StringView::Update() {
Window_Selectable::Update();
if (active && index >= 0 && index < GetReservedLineCount() && Input::IsTriggered(Input::DECISION)) {
if (index == 0) {
auto_linebreak = !auto_linebreak;
} else if (index == 1) {
cmd_eval = !cmd_eval;
} else {
pretty_print = !pretty_print;
}
Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision));
Refresh();
}
}
void Window_StringView::DrawCmdLines() {
Rect rect = GetItemRect(0);
contents->ClearRect(rect);
contents->TextDraw(rect.x, rect.y, Font::ColorHeal, "Automatic line break: ");
contents->TextDraw(GetWidth() - 16, rect.y, Font::ColorCritical, auto_linebreak ? "[ON]" : "[OFF]", Text::AlignRight);
rect = GetItemRect(1);
contents->ClearRect(rect);
contents->TextDraw(rect.x, rect.y, Font::ColorHeal, "Command evaluation: ");
contents->TextDraw(GetWidth() - 16, rect.y, Font::ColorCritical, cmd_eval ? "[ON]" : "[OFF]", Text::AlignRight);
#ifdef HAVE_NLOHMANN_JSON
if (this->json_data) {
rect = GetItemRect(2);
contents->ClearRect(rect);
contents->TextDraw(rect.x, rect.y, Font::ColorHeal, "Pretty Print: ");
contents->TextDraw(GetWidth() - 16, rect.y, Font::ColorCritical, pretty_print ? "[ON]" : "[OFF]", Text::AlignRight);
}
#endif
}
void Window_StringView::DrawLine(int index) {
Rect rect = GetItemRect(index + GetReservedLineCount());
//contents->ClearRect(rect);
std::string line = lines[index];
if (!line.empty()) {
if (line_numbers[index]) {
contents->TextDraw(rect.x, rect.y, Font::ColorDisabled, fmt::format("{:0" + std::to_string(line_no_max_digits) + "d}", line_numbers[index]));
}
contents->TextDraw(rect.x + line_no_max_digits * 6 + 6, rect.y, Font::ColorDefault, line);
}
}