wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src help.cpp help.hpp


From: Guillaume Melquiond
Subject: [Wesnoth-cvs-commits] wesnoth/src help.cpp help.hpp
Date: Sun, 31 Oct 2004 02:25:35 -0500

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     Guillaume Melquiond <address@hidden>    04/10/31 07:19:44

Modified files:
        src            : help.cpp help.hpp 

Log message:
        Reduce help.hpp to minimum size and dependencies. Should somewhat speed 
up (re)compilation.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/help.cpp.diff?tr1=1.45&tr2=1.46&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/help.hpp.diff?tr1=1.15&tr2=1.16&r1=text&r2=text

Patches:
Index: wesnoth/src/help.cpp
diff -u wesnoth/src/help.cpp:1.45 wesnoth/src/help.cpp:1.46
--- wesnoth/src/help.cpp:1.45   Sat Oct 30 21:55:42 2004
+++ wesnoth/src/help.cpp        Sun Oct 31 07:19:44 2004
@@ -10,31 +10,496 @@
    See the COPYING file for more details.
 */
 
-#include "help.hpp"
-
 #include "about.hpp"
 #include "cursor.hpp"
 #include "events.hpp"
 #include "font.hpp"
 #include "game_config.hpp"
+#include "help.hpp"
 #include "image.hpp"
 #include "language.hpp"
 #include "preferences.hpp"
 #include "show_dialog.hpp"
 #include "unit.hpp"
 #include "util.hpp"
-
-#include "SDL_ttf.h"
+#include "widgets/button.hpp"
+#include "widgets/menu.hpp"
+#include "widgets/scrollbar.hpp"
+#include "widgets/widget.hpp"
 
 #include <cassert>
 #include <algorithm>
 #include <iostream>
+#include <list>
 #include <locale>
+#include <map>
 #include <queue>
 #include <set>
-#include <stack>
 #include <sstream>
 
+namespace help {
+
+/// Generate the help contents from the configurations given to the
+/// manager.
+void generate_contents();
+
+struct section;
+
+typedef std::vector<section *> section_list;
+
+struct topic_generator;
+
+class topic_text {
+       mutable std::string text_;
+       mutable topic_generator *generator_;
+public:
+       ~topic_text();
+       topic_text(): generator_(NULL) {}
+       topic_text(std::string const &t): text_(t), generator_(NULL) {}
+       explicit topic_text(topic_generator *g): generator_(g) {}
+       topic_text &operator=(topic_generator *g);
+       topic_text(topic_text const &t);
+       operator std::string() const;
+};
+
+/// A topic contains a title, an id and some text.
+struct topic {
+       topic(const std::string &_title, const std::string &_id, const 
std::string &_text)
+               : title(_title), id(_id), text(_text) {}
+       topic(const std::string &_title, const std::string &_id, 
topic_generator *g)
+               : title(_title), id(_id), text(g) {}
+       topic() : title(""), id(""), text("") {}
+       /// Two topics are equal if their IDs are equal.
+       bool operator==(const topic &) const;
+       /// Comparison on the ID.
+       bool operator<(const topic &) const;
+       std::string title, id;
+       topic_text text;
+};
+
+typedef std::list<topic> topic_list;
+
+/// A section contains topics and sections along with title and ID.
+struct section {
+       section(const std::string &_title, const std::string &_id, const 
topic_list &_topics,
+                       const std::vector<section> &_sections);
+       section() : title(""), id("") {}
+       section(const section&);
+       section& operator=(const section&);
+       ~section();
+       /// Two sections are equal if their IDs are equal.
+       bool operator==(const section &) const;
+       /// Comparison on the ID.
+       bool operator<(const section &) const;
+       
+       /// Allocate memory for and add the section.
+       void add_section(const section &s);
+       
+       void clear();
+       std::string title, id;
+       topic_list topics;
+       section_list sections;
+};
+
+
+/// To be used as a function object to locate sections and topics
+/// with a specified ID.
+class has_id {
+public:
+       has_id(const std::string &id) : id_(id) {}
+       bool operator()(const topic &t) { return t.id == id_; }
+       bool operator()(const section &s) { return s.id == id_; }
+       bool operator()(const section *s) { return s != NULL && s->id == id_; }
+private:
+       const std::string id_;
+};
+
+/// To be used as a function object when sorting topic lists on the title.
+class title_less {
+public:
+       bool operator()(const topic &t1, const topic &t2) { return t1.title < 
t2.title; }
+};
+
+struct delete_section {
+       void operator()(section *s) { delete s; }
+};
+
+struct create_section {
+       section *operator()(const section *s) { return new section(*s); }
+       section *operator()(const section &s) { return new section(s); }
+};
+               
+/// The menu to the left in the help browser, where topics can be
+/// navigated through and chosen.
+class help_menu : public gui::menu {
+public:
+       help_menu(display& disp, const section &toplevel, int max_height=-1);
+       void bg_backup();
+       void bg_restore();
+       int process(int x, int y, bool button,bool up_arrow,bool down_arrow,
+                   bool page_up, bool page_down, int select_item=-1);
+
+       /// Overloaded from menu so that the background can be saved.
+       void set_loc(int x, int y);
+       /// Overloaded from menu so that the background can be saved.
+       void set_width(int w);
+       /// Overloaded from menu so that the background can be saved.
+       void set_max_height(const int new_height);
+
+       /// Make the topic the currently selected one, and expand all
+       /// sections that need to be expanded to show it.
+       void select_topic(const topic &t);
+
+       /// If a topic has been chosen, return that topic, otherwise
+       /// NULL. If one topic is returned, it will not be returned again,
+       /// if it is not re-chosen.
+       const topic *chosen_topic();
+protected:
+       void handle_event(const SDL_Event &event);
+
+private:
+       /// Information about an item that is visible in the menu.
+       struct visible_item {
+               visible_item(const section *_sec, const std::string 
&visible_string);
+               visible_item(const topic *_t, const std::string 
&visible_string);
+               // Invariant, one if these should be NULL. The constructors
+               // enforce it.
+               const topic *t;
+               const section *sec;
+               std::string visible_string;
+               bool operator==(const visible_item &vis_item) const;
+               bool operator==(const section &sec) const;
+               bool operator==(const topic &t) const;
+       };
+
+       /// Regenerate what items are visible by checking what sections are
+       /// expanded.
+       void update_visible_items(const section &top_level, unsigned 
starting_level=0);
+       
+       /// Return true if the section is expanded.
+       bool expanded(const section &sec);
+
+       /// Mark a section as expanded. Do not update the visible items or
+       /// anything.
+       void expand(const section &sec);
+
+       /// Contract (close) a section. That is, mark it as not expanded,
+       /// visible items are not updated.
+       void contract(const section &sec);
+
+       /// Return the string to use as the menu-string for sections at the
+       /// specified level.
+       std::string get_string_to_show(const section &sec, const unsigned 
level);
+       /// Return the string to use as the menu-string for topics at the
+       /// specified level.
+       std::string get_string_to_show(const topic &topic, const unsigned 
level);
+
+       /// Draw the currently visible items.
+       void display_visible_items();
+       
+       /// Internal recursive thingie. did_expand will be true if any
+       /// section was expanded, otherwise untouched.
+       bool select_topic_internal(const topic &t, const section &sec);
+
+       display &disp_;
+       std::vector<visible_item> visible_items_;
+       const section &toplevel_;
+       std::set<const section*> expanded_; 
+       surface_restorer restorer_;
+       SDL_Rect rect_;
+       topic const *chosen_topic_;
+       int internal_width_;
+       visible_item selected_item_;
+       bool selected_;
+};
+
+/// Thrown when the help system fails to parse something.
+struct parse_error {
+       parse_error(const std::string& msg) : message(msg) {}
+       std::string message;
+};
+
+/// The area where the content is shown in the help browser.
+class help_text_area : public gui::widget, public gui::scrollable {
+public:
+       help_text_area(display &disp, const section &toplevel);
+       /// Display the topic.
+       void show_topic(const topic &t);
+
+       /// Return the ID that is crossreferenced at the (screen)
+       /// coordinates x, y. If no cross-reference is there, return the
+       /// empty string.
+       std::string ref_at(const int x, const int y);
+
+       /// Return the width of the area where text fit.
+       int text_width() const;
+
+       void scroll(int pos);
+
+       void set_dirty(bool dirty);
+
+       /// Scroll the contents up an amount. If how_much is below zero the
+       /// amount will depend on the height.
+       void scroll_up(const int how_much=-1);
+
+       /// Scroll the contents down an amount. If how_much is below zero
+       /// the amount will depend on the height.
+       void scroll_down(const int how_much=-1);
+private:
+       enum ALIGNMENT {LEFT, MIDDLE, RIGHT, HERE};
+       /// Convert a string to an alignment. Throw parse_error if
+       /// unsuccesful.
+       ALIGNMENT str_to_align(const std::string &s);
+
+       /// An item that is displayed in the text area. Contains the surface
+       /// that should be blitted along with some other information.
+       struct item {
+
+               item(surface surface, int x, int y, const std::string text="",
+                        const std::string reference_to="", bool floating=false,
+                        bool box=false, ALIGNMENT alignment=HERE);
+
+               item(surface surface, int x, int y,
+                        bool floating, bool box=false, ALIGNMENT=HERE);
+
+               /// Relative coordinates of this item.
+               SDL_Rect rect;
+
+               surface surf;
+
+               // If this item contains text, this will contain that text.
+               std::string text; 
+
+               // If this item contains a cross-reference, this is the id
+               // of the referenced topic.
+               std::string ref_to; 
+
+               // If this item is floating, that is, if things should be filled
+               // around it.
+               bool floating;
+               bool box;
+               ALIGNMENT align;
+       };
+       
+       /// Function object to find an item at the specified coordinates.
+       class item_at {
+       public:
+               item_at(const int x, const int y) : x_(x), y_(y) {}
+               bool operator()(const item&) const;
+       private:
+               const int x_, y_;
+       };
+
+       /// Update the vector with items, creating surfaces for everything
+       /// and putting things where they belong. parsed_items should be a
+       /// vector with parsed strings, such as parse_text returns.
+       void set_items(const std::vector<std::string> &parsed_items,
+                                  const std::string &title);
+
+       // Create appropriate items from configs. Items will be added to the
+       // internal vector. These methods check that the necessary
+       // attributes are specified.
+       void handle_ref_cfg(const config &cfg);
+       void handle_img_cfg(const config &cfg);
+       void handle_bold_cfg(const config &cfg);
+       void handle_italic_cfg(const config &cfg);
+       void handle_header_cfg(const config &cfg);
+       void handle_jump_cfg(const config &cfg);
+       void handle_format_cfg(const config &cfg);
+
+       void handle_event(const SDL_Event &event);
+       void draw();
+       void process();
+
+       /// Update the scrollbar to take account for the current items.
+       void update_scrollbar();
+
+       /// Get the current amount of scrolling that should be
+       /// added/substracted from the locations to get the desired effect.
+       unsigned get_scroll_offset() const;
+
+       /// Add an item with text. If ref_dst is something else than the
+       /// empty string, the text item will be underlined to show that it
+       /// is a cross-reference. The item will also remember what the
+       /// reference points to. If font_size is below zero, the default
+       /// will be used.
+       void add_text_item(const std::string text, const std::string ref_dst="",
+                                          int font_size=-1, bool bold=false, 
bool italic=false,
+                                          SDL_Color color=font::NORMAL_COLOUR);
+
+       /// Add an image item with the specified attributes.
+       void add_img_item(const std::string path, const std::string alignment, 
const bool floating,
+                                         const bool box);
+
+       /// Move the current input point to the next line.
+       void down_one_line();
+
+       /// Adjust the heights of the items in the last row to make it look
+       /// good .
+       void adjust_last_row();
+
+       /// Return the width that remain on the line the current input point is 
at.
+       int get_remaining_width();
+       
+       /// Return the least x coordinate at which something of the
+       /// specified height can be drawn at the specified y coordinate
+       /// without interfering with floating images.
+       int get_min_x(const int y, const int height=0);
+
+       /// Analogous with get_min_x but return the maximum X.
+       int get_max_x(const int y, const int height=0);
+
+       /// Find the lowest y coordinate where a floating img of the
+       /// specified width and at the specified x coordinate can be
+       /// placed. Start looking at desired_y and continue downwards. Only
+       /// check against other floating things, since text and inline
+       /// images only can be above this place if called correctly.
+       int get_y_for_floating_img(const int width, const int x, const int 
desired_y);
+
+       /// Add an item to the internal list, update the locations and row
+       /// height.
+       void add_item(const item& itm);
+
+       std::list<item> items_;
+       std::list<item *> last_row_;
+       display &disp_;
+       const section &toplevel_;
+       topic const *shown_topic_;
+       const int title_spacing_;
+       // The current input location when creating items.
+       std::pair<int, int> curr_loc_;
+       const unsigned min_row_height_;
+       unsigned curr_row_height_;
+       gui::scrollbar scrollbar_;
+       bool use_scrollbar_;
+       gui::button uparrow_, downarrow_;
+       /// The height of all items in total.
+       int contents_height_;
+};
+
+/// A help browser widget.
+class help_browser : public gui::widget {
+public:
+       help_browser(display &disp, const section &toplevel);
+
+       // Overloaded from widget so that the layout may be adjusted to fit
+       // the new dimensions.
+       void set_location(const SDL_Rect& rect);
+       void set_location(int x, int y);
+       void set_width(int w);
+       void set_height(int h);
+
+       void set_dirty(bool dirty);
+       void adjust_layout();
+
+       void process();
+       /// Display the topic with the specified identifier. Open the menu
+       /// on the right location and display the topic in the text area.
+       void show_topic(const std::string &topic_id);
+
+private:
+       /// Update the current cursor, set it to the reference cursor if
+       /// mousex, mousey is over a cross-reference, otherwise, set it to
+       /// the normal cursor.
+       void update_cursor();
+       void handle_event(const SDL_Event &event);
+       void show_topic(const topic &t, bool save_in_history=true);
+       /// Move in the topic history. Pop an element from from and insert
+       /// it in to. Pop at the fronts if the maximum number of elements is
+       /// exceeded.
+       void move_in_history(std::deque<const topic *> &from, std::deque<const 
topic *> &to);
+       display &disp_;
+       help_menu menu_;
+       help_text_area text_area_;
+       const section &toplevel_;
+       bool ref_cursor_; // If the cursor currently is the hyperlink cursor.
+       std::deque<const topic *> back_topics_, forward_topics_;
+       gui::button back_button_, forward_button_;
+       topic const *shown_topic_;
+};
+
+// Generator stuff below. Maybe move to a separate file? This one is
+// getting crowded. Dunno if much more is needed though so I'll wait and
+// see.
+
+/// Dispatch generators to their appropriate functions.
+std::vector<section> generate_sections(const std::string &generator);
+std::vector<topic> generate_topics(const std::string &generator);
+std::string generate_topic_text(const std::string &generator);
+std::string generate_about_text();
+std::string generate_traits_text();
+std::vector<topic> generate_unit_topics();
+enum UNIT_DESCRIPTION_TYPE {FULL_DESCRIPTION, NO_DESCRIPTION, 
NON_REVEALING_DESCRIPTION};
+/// Return the type of description that should be shown for a unit of
+/// the given kind. This method is intended to filter out information
+/// about units that should not be shown, for example due to not being
+/// encountered.
+UNIT_DESCRIPTION_TYPE description_type(const unit_type &type);
+std::vector<topic> generate_ability_topics();
+std::vector<topic> generate_weapon_special_topics();
+std::vector<topic> generate_terrains_topics();
+
+/// Parse a help config, return the top level section. Return an empty
+/// section if cfg is NULL.
+section parse_config(const config *cfg); 
+/// Recursive function used by parse_config.
+void parse_config_internal(const config *help_cfg, const config *section_cfg,
+                                                  section &sec, int level=0);
+
+/// Return true if the section with id section_id is referenced from
+/// another section in the config, or the toplevel.
+bool section_is_referenced(const std::string &section_id, const config &cfg);
+/// Return true if the topic with id topic_id is referenced from
+/// another section in the config, or the toplevel.
+bool topic_is_referenced(const std::string &topic_id, const config &cfg);
+
+/// Search for the topic with the specified identifier in the section
+/// and its subsections. Return the found topic, or NULL if none could
+/// be found.
+const topic *find_topic(const section &sec, const std::string &id);
+
+/// Search for the section with the specified identifier in the section
+/// and its subsections. Return the found section or NULL if none could
+/// be found.
+const section *find_section(const section &sec, const std::string &id);
+
+/// Parse a text string. Return a vector with the different parts of the
+/// text. Each markup item is a separate part while the text between
+/// markups are separate parts.
+std::vector<std::string> parse_text(const std::string &text);
+
+/// Convert the contents to wml attributes, surrounded within
+/// [element_name]...[/element_name]. Return the resulting WML.
+std::string convert_to_wml(const std::string &element_name, const std::string 
&contents);
+
+/// Return true if s is a representation of a truth value
+/// (yes/true/...), otherwise false.
+bool get_bool(const std::string &s);
+
+/// Return the color the string represents. Return font::NORMAL_COLOUR if
+/// the string is empty or can't be matched against any other color.
+SDL_Color string_to_color(const std::string &s);
+
+/// Make a best effort to word wrap s. All parts are less than width.
+std::vector<std::string> split_in_width(const std::string &s, const int 
font_size, const unsigned width);
+
+std::string remove_first_space(const std::string& text);
+
+/// Return a lowercase copy of s.
+std::string to_lower(const std::string &s);
+
+/// Return a copy of s with the first letter capitalized.
+std::string cap(const std::string &s);
+
+/// Prepend all chars with meaning inside attributes with a backslash.
+std::string escape(const std::string &s);
+
+/// Return the first word in s, not removing any spaces in the start of
+/// it.
+std::string get_first_word(const std::string &s);
+
+} // namespace help
+
 namespace {
        const config *game_cfg = NULL;
        game_data *game_info = NULL;
Index: wesnoth/src/help.hpp
diff -u wesnoth/src/help.hpp:1.15 wesnoth/src/help.hpp:1.16
--- wesnoth/src/help.hpp:1.15   Sat Oct 30 20:20:53 2004
+++ wesnoth/src/help.hpp        Sun Oct 31 07:19:44 2004
@@ -12,22 +12,13 @@
 #ifndef HELP_HPP_INCLUDED
 #define HELP_HPP_INCLUDED
 
-#include "config.hpp"
-#include "display.hpp"
-#include "font.hpp"
-#include "map.hpp"
-#include "sdl_utils.hpp"
-#include "unit_types.hpp"
-#include "widgets/button.hpp"
-#include "widgets/menu.hpp"
-#include "widgets/scrollbar.hpp"
+#include <string>
+#include <vector>
 
-#include "widgets/widget.hpp"
-
-#include <set>
-#include <queue>
-#include <map>
-#include <list>
+struct config;
+struct display;
+struct game_data;
+struct gamemap;
 
 namespace help {
 
@@ -36,467 +27,8 @@
        ~help_manager();
 };
 
-/// Generate the help contents from the configurations given to the
-/// manager.
-void generate_contents();
-
 struct section;
 
-typedef std::vector<section *> section_list;
-
-struct topic_generator;
-
-class topic_text {
-       mutable std::string text_;
-       mutable topic_generator *generator_;
-public:
-       ~topic_text();
-       topic_text(): generator_(NULL) {}
-       topic_text(std::string const &t): text_(t), generator_(NULL) {}
-       explicit topic_text(topic_generator *g): generator_(g) {}
-       topic_text &operator=(topic_generator *g);
-       topic_text(topic_text const &t);
-       operator std::string() const;
-};
-
-/// A topic contains a title, an id and some text.
-struct topic {
-       topic(const std::string &_title, const std::string &_id, const 
std::string &_text)
-               : title(_title), id(_id), text(_text) {}
-       topic(const std::string &_title, const std::string &_id, 
topic_generator *g)
-               : title(_title), id(_id), text(g) {}
-       topic() : title(""), id(""), text("") {}
-       /// Two topics are equal if their IDs are equal.
-       bool operator==(const topic &) const;
-       /// Comparison on the ID.
-       bool operator<(const topic &) const;
-       std::string title, id;
-       topic_text text;
-};
-
-typedef std::list<topic> topic_list;
-
-/// A section contains topics and sections along with title and ID.
-struct section {
-       section(const std::string &_title, const std::string &_id, const 
topic_list &_topics,
-                       const std::vector<section> &_sections);
-       section() : title(""), id("") {}
-       section(const section&);
-       section& operator=(const section&);
-       ~section();
-       /// Two sections are equal if their IDs are equal.
-       bool operator==(const section &) const;
-       /// Comparison on the ID.
-       bool operator<(const section &) const;
-       
-       /// Allocate memory for and add the section.
-       void add_section(const section &s);
-       
-       void clear();
-       std::string title, id;
-       topic_list topics;
-       section_list sections;
-};
-
-
-/// To be used as a function object to locate sections and topics
-/// with a specified ID.
-class has_id {
-public:
-       has_id(const std::string &id) : id_(id) {}
-       bool operator()(const topic &t) { return t.id == id_; }
-       bool operator()(const section &s) { return s.id == id_; }
-       bool operator()(const section *s) { return s != NULL && s->id == id_; }
-private:
-       const std::string id_;
-};
-
-/// To be used as a function object when sorting topic lists on the title.
-class title_less {
-public:
-       bool operator()(const topic &t1, const topic &t2) { return t1.title < 
t2.title; }
-};
-
-struct delete_section {
-       void operator()(section *s) { delete s; }
-};
-
-struct create_section {
-       section *operator()(const section *s) { return new section(*s); }
-       section *operator()(const section &s) { return new section(s); }
-};
-               
-/// The menu to the left in the help browser, where topics can be
-/// navigated through and chosen.
-class help_menu : public gui::menu {
-public:
-       help_menu(display& disp, const section &toplevel, int max_height=-1);
-       void bg_backup();
-       void bg_restore();
-       int process(int x, int y, bool button,bool up_arrow,bool down_arrow,
-                   bool page_up, bool page_down, int select_item=-1);
-
-       /// Overloaded from menu so that the background can be saved.
-       void set_loc(int x, int y);
-       /// Overloaded from menu so that the background can be saved.
-       void set_width(int w);
-       /// Overloaded from menu so that the background can be saved.
-       void set_max_height(const int new_height);
-
-       /// Make the topic the currently selected one, and expand all
-       /// sections that need to be expanded to show it.
-       void select_topic(const topic &t);
-
-       /// If a topic has been chosen, return that topic, otherwise
-       /// NULL. If one topic is returned, it will not be returned again,
-       /// if it is not re-chosen.
-       const topic *chosen_topic();
-protected:
-       void handle_event(const SDL_Event &event);
-
-private:
-       /// Information about an item that is visible in the menu.
-       struct visible_item {
-               visible_item(const section *_sec, const std::string 
&visible_string);
-               visible_item(const topic *_t, const std::string 
&visible_string);
-               // Invariant, one if these should be NULL. The constructors
-               // enforce it.
-               const topic *t;
-               const section *sec;
-               std::string visible_string;
-               bool operator==(const visible_item &vis_item) const;
-               bool operator==(const section &sec) const;
-               bool operator==(const topic &t) const;
-       };
-
-       /// Regenerate what items are visible by checking what sections are
-       /// expanded.
-       void update_visible_items(const section &top_level, unsigned 
starting_level=0);
-       
-       /// Return true if the section is expanded.
-       bool expanded(const section &sec);
-
-       /// Mark a section as expanded. Do not update the visible items or
-       /// anything.
-       void expand(const section &sec);
-
-       /// Contract (close) a section. That is, mark it as not expanded,
-       /// visible items are not updated.
-       void contract(const section &sec);
-
-       /// Return the string to use as the menu-string for sections at the
-       /// specified level.
-       std::string get_string_to_show(const section &sec, const unsigned 
level);
-       /// Return the string to use as the menu-string for topics at the
-       /// specified level.
-       std::string get_string_to_show(const topic &topic, const unsigned 
level);
-
-       /// Draw the currently visible items.
-       void display_visible_items();
-       
-       /// Internal recursive thingie. did_expand will be true if any
-       /// section was expanded, otherwise untouched.
-       bool select_topic_internal(const topic &t, const section &sec);
-
-       display &disp_;
-       std::vector<visible_item> visible_items_;
-       const section &toplevel_;
-       std::set<const section*> expanded_; 
-       surface_restorer restorer_;
-       SDL_Rect rect_;
-       topic const *chosen_topic_;
-       int internal_width_;
-       visible_item selected_item_;
-       bool selected_;
-};
-
-/// Thrown when the help system fails to parse something.
-struct parse_error {
-       parse_error(const std::string& msg) : message(msg) {}
-       std::string message;
-};
-
-/// The area where the content is shown in the help browser.
-class help_text_area : public gui::widget, public gui::scrollable {
-public:
-       help_text_area(display &disp, const section &toplevel);
-       /// Display the topic.
-       void show_topic(const topic &t);
-
-       /// Return the ID that is crossreferenced at the (screen)
-       /// coordinates x, y. If no cross-reference is there, return the
-       /// empty string.
-       std::string ref_at(const int x, const int y);
-
-       /// Return the width of the area where text fit.
-       int text_width() const;
-
-       void scroll(int pos);
-
-       void set_dirty(bool dirty);
-
-       /// Scroll the contents up an amount. If how_much is below zero the
-       /// amount will depend on the height.
-       void scroll_up(const int how_much=-1);
-
-       /// Scroll the contents down an amount. If how_much is below zero
-       /// the amount will depend on the height.
-       void scroll_down(const int how_much=-1);
-private:
-       enum ALIGNMENT {LEFT, MIDDLE, RIGHT, HERE};
-       /// Convert a string to an alignment. Throw parse_error if
-       /// unsuccesful.
-       ALIGNMENT str_to_align(const std::string &s);
-
-       /// An item that is displayed in the text area. Contains the surface
-       /// that should be blitted along with some other information.
-       struct item {
-
-               item(surface surface, int x, int y, const std::string text="",
-                        const std::string reference_to="", bool floating=false,
-                        bool box=false, ALIGNMENT alignment=HERE);
-
-               item(surface surface, int x, int y,
-                        bool floating, bool box=false, ALIGNMENT=HERE);
-
-               /// Relative coordinates of this item.
-               SDL_Rect rect;
-
-               surface surf;
-
-               // If this item contains text, this will contain that text.
-               std::string text; 
-
-               // If this item contains a cross-reference, this is the id
-               // of the referenced topic.
-               std::string ref_to; 
-
-               // If this item is floating, that is, if things should be filled
-               // around it.
-               bool floating;
-               bool box;
-               ALIGNMENT align;
-       };
-       
-       /// Function object to find an item at the specified coordinates.
-       class item_at {
-       public:
-               item_at(const int x, const int y) : x_(x), y_(y) {}
-               bool operator()(const item&) const;
-       private:
-               const int x_, y_;
-       };
-
-       /// Update the vector with items, creating surfaces for everything
-       /// and putting things where they belong. parsed_items should be a
-       /// vector with parsed strings, such as parse_text returns.
-       void set_items(const std::vector<std::string> &parsed_items,
-                                  const std::string &title);
-
-       // Create appropriate items from configs. Items will be added to the
-       // internal vector. These methods check that the necessary
-       // attributes are specified.
-       void handle_ref_cfg(const config &cfg);
-       void handle_img_cfg(const config &cfg);
-       void handle_bold_cfg(const config &cfg);
-       void handle_italic_cfg(const config &cfg);
-       void handle_header_cfg(const config &cfg);
-       void handle_jump_cfg(const config &cfg);
-       void handle_format_cfg(const config &cfg);
-
-       void handle_event(const SDL_Event &event);
-       void draw();
-       void process();
-
-       /// Update the scrollbar to take account for the current items.
-       void update_scrollbar();
-
-       /// Get the current amount of scrolling that should be
-       /// added/substracted from the locations to get the desired effect.
-       unsigned get_scroll_offset() const;
-
-       /// Add an item with text. If ref_dst is something else than the
-       /// empty string, the text item will be underlined to show that it
-       /// is a cross-reference. The item will also remember what the
-       /// reference points to. If font_size is below zero, the default
-       /// will be used.
-       void add_text_item(const std::string text, const std::string ref_dst="",
-                                          int font_size=-1, bool bold=false, 
bool italic=false,
-                                          SDL_Color color=font::NORMAL_COLOUR);
-
-       /// Add an image item with the specified attributes.
-       void add_img_item(const std::string path, const std::string alignment, 
const bool floating,
-                                         const bool box);
-
-       /// Move the current input point to the next line.
-       void down_one_line();
-
-       /// Adjust the heights of the items in the last row to make it look
-       /// good .
-       void adjust_last_row();
-
-       /// Return the width that remain on the line the current input point is 
at.
-       int get_remaining_width();
-       
-       /// Return the least x coordinate at which something of the
-       /// specified height can be drawn at the specified y coordinate
-       /// without interfering with floating images.
-       int get_min_x(const int y, const int height=0);
-
-       /// Analogous with get_min_x but return the maximum X.
-       int get_max_x(const int y, const int height=0);
-
-       /// Find the lowest y coordinate where a floating img of the
-       /// specified width and at the specified x coordinate can be
-       /// placed. Start looking at desired_y and continue downwards. Only
-       /// check against other floating things, since text and inline
-       /// images only can be above this place if called correctly.
-       int get_y_for_floating_img(const int width, const int x, const int 
desired_y);
-
-       /// Add an item to the internal list, update the locations and row
-       /// height.
-       void add_item(const item& itm);
-
-       std::list<item> items_;
-       std::list<item *> last_row_;
-       display &disp_;
-       const section &toplevel_;
-       topic const *shown_topic_;
-       const int title_spacing_;
-       // The current input location when creating items.
-       std::pair<int, int> curr_loc_;
-       const unsigned min_row_height_;
-       unsigned curr_row_height_;
-       gui::scrollbar scrollbar_;
-       bool use_scrollbar_;
-       gui::button uparrow_, downarrow_;
-       /// The height of all items in total.
-       int contents_height_;
-};
-
-
-/// A help browser widget.
-class help_browser : public gui::widget {
-public:
-       help_browser(display &disp, const section &toplevel);
-
-       // Overloaded from widget so that the layout may be adjusted to fit
-       // the new dimensions.
-       void set_location(const SDL_Rect& rect);
-       void set_location(int x, int y);
-       void set_width(int w);
-       void set_height(int h);
-
-       void set_dirty(bool dirty);
-       void adjust_layout();
-
-       void process();
-       /// Display the topic with the specified identifier. Open the menu
-       /// on the right location and display the topic in the text area.
-       void show_topic(const std::string &topic_id);
-
-private:
-       /// Update the current cursor, set it to the reference cursor if
-       /// mousex, mousey is over a cross-reference, otherwise, set it to
-       /// the normal cursor.
-       void update_cursor();
-       void handle_event(const SDL_Event &event);
-       void show_topic(const topic &t, bool save_in_history=true);
-       /// Move in the topic history. Pop an element from from and insert
-       /// it in to. Pop at the fronts if the maximum number of elements is
-       /// exceeded.
-       void move_in_history(std::deque<const topic *> &from, std::deque<const 
topic *> &to);
-       display &disp_;
-       help_menu menu_;
-       help_text_area text_area_;
-       const section &toplevel_;
-       bool ref_cursor_; // If the cursor currently is the hyperlink cursor.
-       std::deque<const topic *> back_topics_, forward_topics_;
-       gui::button back_button_, forward_button_;
-       topic const *shown_topic_;
-};
-
-// Generator stuff below. Maybe move to a separate file? This one is
-// getting crowded. Dunno if much more is needed though so I'll wait and
-// see.
-
-/// Dispatch generators to their appropriate functions.
-std::vector<section> generate_sections(const std::string &generator);
-std::vector<topic> generate_topics(const std::string &generator);
-std::string generate_topic_text(const std::string &generator);
-std::string generate_about_text();
-std::string generate_traits_text();
-std::vector<topic> generate_unit_topics();
-enum UNIT_DESCRIPTION_TYPE {FULL_DESCRIPTION, NO_DESCRIPTION, 
NON_REVEALING_DESCRIPTION};
-/// Return the type of description that should be shown for a unit of
-/// the given kind. This method is intended to filter out information
-/// about units that should not be shown, for example due to not being
-/// encountered.
-UNIT_DESCRIPTION_TYPE description_type(const unit_type &type);
-std::vector<topic> generate_ability_topics();
-std::vector<topic> generate_weapon_special_topics();
-std::vector<topic> generate_terrains_topics();
-
-/// Parse a help config, return the top level section. Return an empty
-/// section if cfg is NULL.
-section parse_config(const config *cfg); 
-/// Recursive function used by parse_config.
-void parse_config_internal(const config *help_cfg, const config *section_cfg,
-                                                  section &sec, int level=0);
-
-/// Return true if the section with id section_id is referenced from
-/// another section in the config, or the toplevel.
-bool section_is_referenced(const std::string &section_id, const config &cfg);
-/// Return true if the topic with id topic_id is referenced from
-/// another section in the config, or the toplevel.
-bool topic_is_referenced(const std::string &topic_id, const config &cfg);
-
-/// Search for the topic with the specified identifier in the section
-/// and its subsections. Return the found topic, or NULL if none could
-/// be found.
-const topic *find_topic(const section &sec, const std::string &id);
-
-/// Search for the section with the specified identifier in the section
-/// and its subsections. Return the found section or NULL if none could
-/// be found.
-const section *find_section(const section &sec, const std::string &id);
-
-/// Parse a text string. Return a vector with the different parts of the
-/// text. Each markup item is a separate part while the text between
-/// markups are separate parts.
-std::vector<std::string> parse_text(const std::string &text);
-
-/// Convert the contents to wml attributes, surrounded within
-/// [element_name]...[/element_name]. Return the resulting WML.
-std::string convert_to_wml(const std::string &element_name, const std::string 
&contents);
-
-/// Return true if s is a representation of a truth value
-/// (yes/true/...), otherwise false.
-bool get_bool(const std::string &s);
-
-/// Return the color the string represents. Return font::NORMAL_COLOUR if
-/// the string is empty or can't be matched against any other color.
-SDL_Color string_to_color(const std::string &s);
-
-/// Make a best effort to word wrap s. All parts are less than width.
-std::vector<std::string> split_in_width(const std::string &s, const int 
font_size, 
-                                                                               
const unsigned width);
-
-std::string remove_first_space(const std::string& text);
-
-/// Return a lowercase copy of s.
-std::string to_lower(const std::string &s);
-
-/// Return a copy of s with the first letter capitalized.
-std::string cap(const std::string &s);
-
-/// Prepend all chars with meaning inside attributes with a backslash.
-std::string escape(const std::string &s);
-
-/// Return the first word in s, not removing any spaces in the start of
-/// it.
-std::string get_first_word(const std::string &s);
-
 /// Open a help dialog showing the topics with ids topics_to_show and
 /// the sections with ids sections_to_show. Subsections and subtopics of
 /// the sections will be added recursively according to the help config.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]