The Battle for Wesnoth  1.15.0+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 http://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  {}
38 
40  {
41  if(!active()) {
42  return;
43  }
44  if(check_ != nullptr) {
45  if(mode_ == TEXTBOX_MESSAGE) {
47  }
48  }
49  box_.reset(nullptr);
50  check_.reset(nullptr);
53  gui.invalidate_all();
54  }
55 
57  {
58  if (box_ == nullptr)
59  return;
60 
61  const SDL_Rect& area = gui.map_outside_area();
62 
63  const int border_size = 10;
64 
65  const int ypos = area.y+area.h-30 - (check_ != nullptr ? check_->height() + border_size : 0);
66 
67  if (label_ != 0)
69 
72  flabel.set_position(area.x + border_size, ypos);
74  flabel.set_clip_rect(area);
75 
77 
78  if (label_ == 0)
79  return;
80 
81  const SDL_Rect& label_area = font::get_floating_label_rect(label_);
82  const int textbox_width = area.w - label_area.w - border_size*3;
83 
84  if(textbox_width <= 0) {
86  return;
87  }
88 
89  if(box_ != nullptr) {
90  box_->set_volatile(true);
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_volatile(true);
103  check_->set_location(box_->location().x,box_->location().y + box_->location().h + border_size);
104  }
105  }
106 
107  void floating_textbox::show(gui::TEXTBOX_MODE mode, const std::string& label,
108  const std::string& check_label, bool checked, game_display& gui)
109  {
110  close(gui);
111 
112  label_string_ = label;
113  mode_ = mode;
114 
115  if(!check_label.empty()) {
116  check_.reset(new gui::button(gui.video(),check_label,gui::button::TYPE_CHECK));
117  check_->set_check(checked);
118  }
119 
120 
121  box_.reset(new gui::textbox(gui.video(),100,"",true,256,font::SIZE_PLUS,0.8,0.6));
122 
123  update_location(gui);
124  }
125 
126  void floating_textbox::tab(const std::set<std::string>& dictionary)
127  {
128  if(active() == false) {
129  return;
130  }
131 
132  std::string text = box_->text();
133  std::vector<std::string> matches(dictionary.begin(), dictionary.end());
134  const bool line_start = utils::word_completion(text, matches);
135 
136  if (matches.empty()) return;
137  if (matches.size() == 1 && mode_ == gui::TEXTBOX_MESSAGE) {
138  text.append(line_start ? ": " : " ");
139  } else if (matches.size() > 1) {
140  std::string completion_list = utils::join(matches, " ");
141  game_display::get_singleton()->get_chat_manager().add_chat_message(time(nullptr), "", 0, completion_list,
143  }
144  box_->set_text(text);
145  }
146 }
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)
void remove_floating_label(int handle)
removes the floating label given by &#39;handle&#39; from the screen
General purpose widgets.
const int SIZE_PLUS
Definition: constants.cpp:26
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_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:2968
void set_message_private(bool value)
Definition: game.cpp:869
void set_color(const color_t &color)
std::unique_ptr< gui::button > check_
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:237
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()
Standard logging facilities (interface).
CVideo & video()
Gets the underlying screen object.
Definition: display.hpp:196
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()