The Battle for Wesnoth  1.19.0-dev
floating_textbox.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2006 - 2024
3  by Joerg Hinrichs <joerg.hinrichs@alice-dsl.de>
4  Copyright (C) 2003 by David White <dave@whitevine.net>
5  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY.
13 
14  See the COPYING file for more details.
15 */
16 
17 #include "floating_textbox.hpp"
18 
19 #include "display_chat_manager.hpp"
20 #include "floating_label.hpp"
21 #include "font/standard_colors.hpp"
22 #include "game_display.hpp"
23 #include "preferences/game.hpp"
24 #include "log.hpp"
25 
26 #include <ctime>
27 
28 static lg::log_domain log_display("display");
29 #define ERR_DP LOG_STREAM(err, log_display)
30 
31 namespace gui{
33  box_(nullptr),
34  check_(nullptr),
35  mode_(TEXTBOX_NONE),
36  label_string_(),
37  label_(0),
38  command_history_()
39  {}
40 
42  {
43  if(!active()) {
44  return;
45  }
46  if(check_ != nullptr) {
47  if(mode_ == TEXTBOX_MESSAGE) {
49  }
50  }
51  box_.reset(nullptr);
52  check_.reset(nullptr);
55  }
56 
58  {
59  if (box_ == nullptr)
60  return;
61 
62  const SDL_Rect& area = gui.map_outside_area();
63 
64  const int border_size = 10;
65 
66  const int ypos = area.y+area.h-30 - (check_ != nullptr ? check_->height() + border_size : 0);
67 
68  if (label_ != 0)
70 
73  flabel.set_position(area.x + border_size, ypos);
75  flabel.set_clip_rect(area);
76 
78 
79  if (label_ == 0)
80  return;
81 
82  const SDL_Rect& label_area = font::get_floating_label_rect(label_);
83  const int textbox_width = area.w - label_area.w - border_size*3;
84 
85  if(textbox_width <= 0) {
87  return;
88  }
89 
90  if(box_ != nullptr) {
91  const SDL_Rect rect {
92  area.x + label_area.w + border_size * 2
93  , ypos
94  , textbox_width
95  , box_->height()
96  };
97 
98  box_->set_location(rect);
99  }
100 
101  if(check_ != nullptr) {
102  check_->set_location(box_->location().x,box_->location().y + box_->location().h + border_size);
103  }
104  }
105 
106  void floating_textbox::show(gui::TEXTBOX_MODE mode, const std::string& label,
107  const std::string& check_label, bool checked, game_display& gui)
108  {
109  close();
110 
112  mode_ = mode;
113 
114  if(!check_label.empty()) {
115  check_.reset(new gui::button(check_label,gui::button::TYPE_CHECK));
116  check_->set_check(checked);
117  }
118 
119 
120  box_.reset(new gui::textbox(100,"",true,256,font::SIZE_NORMAL,0.8,0.6));
121 
123  }
124 
125  void floating_textbox::tab(const std::set<std::string>& dictionary)
126  {
127  if(active() == false) {
128  return;
129  }
130 
131  std::string text = box_->text();
132  std::vector<std::string> matches(dictionary.begin(), dictionary.end());
133  const bool line_start = utils::word_completion(text, matches);
134 
135  if (matches.empty()) return;
136  if (matches.size() == 1 && mode_ == gui::TEXTBOX_MESSAGE) {
137  text.append(line_start ? ": " : " ");
138  } else if (matches.size() > 1) {
139  std::string completion_list = utils::join(matches, " ");
140  game_display::get_singleton()->get_chat_manager().add_chat_message(time(nullptr), "", 0, completion_list,
142  }
143  box_->set_text(text);
144  }
145 
146  void floating_textbox::memorize_command(const std::string& command)
147  {
148  if(command.empty()) {
149  return;
150  }
151 
152  auto prev = std::find(command_history_.begin(), command_history_.end(), command);
153 
154  if(prev != command_history_.end()) {
155  command_history_.erase(prev);
156  }
157  command_history_.emplace_back(command);
158  }
159 }
map_location prev
Definition: astarsearch.cpp:66
void add_chat_message(const std::time_t &time, const std::string &speaker, int side, const std::string &msg, events::chat_handler::MESSAGE_TYPE type, bool bell)
void set_position(double xpos, double ypos)
void set_alignment(ALIGN align)
void set_color(const color_t &color)
void set_clip_rect(const SDL_Rect &r)
static game_display * get_singleton()
display_chat_manager & get_chat_manager()
A button is a control that can be pushed to start an action or close a dialog.
Definition: button.hpp:52
@ TYPE_CHECK
Definition: button.hpp:60
void show(gui::TEXTBOX_MODE mode, const std::string &label, const std::string &check_label, bool checked, game_display &gui)
void memorize_command(const std::string &command)
TEXTBOX_MODE mode() const
void update_location(game_display &gui)
void tab(const std::set< std::string > &dictionary)
std::unique_ptr< gui::button > check_
std::vector< std::string > command_history_
std::unique_ptr< gui::textbox > box_
static lg::log_domain log_display("display")
std::string label
What to show in the filter's drop-down list.
Definition: manager.cpp:217
Standard logging facilities (interface).
const color_t YELLOW_COLOR
int add_floating_label(const floating_label &flabel)
add a label floating on the screen above everything else.
void remove_floating_label(int handle, int fadeout)
removes the floating label given by 'handle' from the screen
SDL_Rect get_floating_label_rect(int handle)
const int SIZE_NORMAL
Definition: constants.cpp:20
General purpose widgets.
@ TEXTBOX_MESSAGE
void set_message_private(bool value)
Definition: game.cpp:838
std::string join(const T &v, const std::string &s=",")
Generates a new string joining container items in a list.
bool word_completion(std::string &text, std::vector< std::string > &wordlist)
Try to complete the last word of 'text' with the 'wordlist'.
An abstract description of a rectangle with integer coordinates.
Definition: rect.hpp:47