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