Author: mordante
Date: Sat Mar 22 16:00:23 2008
New Revision: 24983

URL: http://svn.gna.org/viewcvs/wesnoth?rev=24983&view=rev
Log:
* Converted the text to use the formula system as well.
* Buttons now can draw their label from the definition.
* Various minor cleanups.

Modified:
    trunk/src/gui/widgets/button.cpp
    trunk/src/gui/widgets/button.hpp
    trunk/src/gui/widgets/canvas.cpp
    trunk/src/gui/widgets/canvas.hpp
    trunk/src/gui/widgets/window_builder.cpp
    trunk/src/gui/widgets/window_builder.hpp

Modified: trunk/src/gui/widgets/button.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/button.cpp?rev=24983&r1=24982&r2=24983&view=diff
==============================================================================
--- trunk/src/gui/widgets/button.cpp (original)
+++ trunk/src/gui/widgets/button.cpp Sat Mar 22 16:00:23 2008
@@ -58,6 +58,19 @@
 
        // inherited
        tcontrol::set_height(height);
+}
+
+void tbutton::set_label(const t_string& label)
+{
+
+       // set label in canvases
+       canvas_enabled_.set_variable("text", variant(label.str()));
+       canvas_disabled_.set_variable("text", variant(label.str()));
+       canvas_pressed_.set_variable("text", variant(label.str()));
+       canvas_focussed_.set_variable("text", variant(label.str()));
+
+       // inherited
+       tcontrol::set_label(label);
 }
 
 void tbutton::mouse_down(const tevent_info& /*event*/, bool& /*handled*/) 
@@ -167,6 +180,14 @@
                canvas_disabled_ = definition_->disabled.canvas;
                canvas_pressed_ = definition_->pressed.canvas;
                canvas_focussed_ = definition_->focussed.canvas;
+
+               // FIXME we need some extra routines since a lot of code will
+               // be duplicated here otherwise.
+               canvas_enabled_.set_variable("text", variant(label()));
+               canvas_disabled_.set_variable("text", variant(label()));
+               canvas_pressed_.set_variable("text", variant(label()));
+               canvas_focussed_.set_variable("text", variant(label()));
+
        }
 }
 

Modified: trunk/src/gui/widgets/button.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/button.hpp?rev=24983&r1=24982&r2=24983&view=diff
==============================================================================
--- trunk/src/gui/widgets/button.hpp (original)
+++ trunk/src/gui/widgets/button.hpp Sat Mar 22 16:00:23 2008
@@ -19,6 +19,7 @@
 
 #include "gui/widgets/settings.hpp"
 #include "log.hpp"
+#include "tstring.hpp"
 
 namespace gui2 {
 
@@ -41,6 +42,8 @@
        void set_width(const unsigned width);
 
        void set_height(const unsigned height);
+
+       void set_label(const t_string& label);
 
        void mouse_down(const tevent_info& /*event*/, bool& /*handled*/);
        void mouse_up(const tevent_info& /*event*/, bool& /*handled*/);

Modified: trunk/src/gui/widgets/canvas.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/canvas.cpp?rev=24983&r1=24982&r2=24983&view=diff
==============================================================================
--- trunk/src/gui/widgets/canvas.cpp (original)
+++ trunk/src/gui/widgets/canvas.cpp Sat Mar 22 16:00:23 2008
@@ -70,10 +70,22 @@
        return result;
 }
 
-//! A value can be either a number of a formula, if between brackets it is a 
formula
-//! else it will be read as an unsigned. 
-//! If empty neither is modified otherwise only the type it is is modified.
-static void read_possible_formula(const std::string str, unsigned& value, 
std::string& formula)
+//! Reads a value as formula or value depending on the contents.
+//!
+//! A value can either be formula or a text containing a value, this function
+//! determines the type and sets either the formula or the value part.
+//! Formulas always start with a opening bracket '('. 
+//!
+//! @param str               The text with the value or formula. (Since there
+//!                          are some problems with tempories when a value is
+//!                          taken from a (v)config it uses a copy instead of
+//!                          a reference.)
+//! @param value             The value part, if the text is a value this will
+//!                          be modified otherwise left untouched.
+//! @param formula           The value part, if the text is a formula this will
+//!                          be modified otherwise left untouched.
+template <class T>
+static void read_possible_formula(const std::string str, T& value, 
std::string& formula)
 {
        if(str.empty()) {
                return;
@@ -82,13 +94,37 @@
        if(str[0] == '(') {
                formula = str;
        } else {
-               value = lexical_cast_default<unsigned>(str);
+               value = lexical_cast_default<T>(str);
+       }
+}
+
+static void read_possible_formula(const std::string str, t_string& value, 
std::string& formula)
+{
+       if(str.empty()) {
+               return;
+       }
+
+       if(str[0] == '(') {
+               formula = str;
+       } else {
+               value = t_string(str);
+       }
+}
+
+static void read_possible_formula(const std::string str, std::string& value, 
std::string& formula)
+{
+       if(str.empty()) {
+               return;
+       }
+
+       if(str[0] == '(') {
+               formula = str;
+       } else {
+               value = str;
        }
 }
 
 namespace gui2{
-
-
 
 tcanvas::tcanvas() :
        shapes_(),
@@ -289,6 +325,7 @@
  * Variables:
  *     width unsigned                  The width of the canvas.
  *     height unsigned                 The height of the canvas.
+ *     text tstring                    The text to render on the widget.
  *
  * Note when drawing the valid coordinates are:
  * 0 -> width - 1
@@ -327,6 +364,7 @@
  *                                     signed number.
  * string                              A text.
  * tstring                             A translatable string.
+ * f_tstring                           Formula returning a translatable string.
  *
  * colour                              A string which constains the colour, 
this
  *                                     a group of 4 numbers between 0 and 255
@@ -365,22 +403,22 @@
        // bit silly unless there has been a resize. So to optimize we should
        // use an extra flag or do the calculation in a separate routine.
        if(!x1_formula_.empty()) {
-               DBG_G_D << "Line execute x1 formula '" << x1_formula_ << "'.\n";
+               DBG_G_D << "Line: execute x1 formula '" << x1_formula_ << 
"'.\n";
                x1_ = 
game_logic::formula(x1_formula_).execute(variables).as_int();
        }
 
        if(!y1_formula_.empty()) {
-               DBG_G_D << "Line execute y1 formula '" << y1_formula_ << "'.\n";
+               DBG_G_D << "Line: execute y1 formula '" << y1_formula_ << 
"'.\n";
                y1_ = 
game_logic::formula(y1_formula_).execute(variables).as_int();
        }
 
        if(!x2_formula_.empty()) {
-               DBG_G_D << "Line execute x2 formula '" << x2_formula_ << "'.\n";
+               DBG_G_D << "Line: execute x2 formula '" << x2_formula_ << 
"'.\n";
                x2_ = 
game_logic::formula(x2_formula_).execute(variables).as_int();
        }
 
        if(!y2_formula_.empty()) {
-               DBG_G_D << "Line execute y2 formula '" << y2_formula_ << "'.\n";
+               DBG_G_D << "Line: execute y2 formula '" << y2_formula_ << 
"'.\n";
                y2_ = 
game_logic::formula(y2_formula_).execute(variables).as_int();
        }
 
@@ -422,7 +460,7 @@
 {
 /*WIKI
  * [rectangle]
- * Definition of a line.
+ * Definition of a rectangle.
  * Keys: 
  *     x (f_unsigned = 0)              The x coordinate of the top left corner.
  *     y (f_unsigned = 0)              The y coordinate of the top left corner.
@@ -439,6 +477,8 @@
  *
  * Variables:
  * See [line].
+ *
+ * [/rectangle]
  */
        read_possible_formula(cfg["x"], x_, x_formula_);
        read_possible_formula(cfg["y"], y_, y_formula_);
@@ -463,22 +503,22 @@
        // bit silly unless there has been a resize. So to optimize we should
        // use an extra flag or do the calculation in a separate routine.
        if(!x_formula_.empty()) {
-               DBG_G_D << "Rectangle execute x formula '" << x_formula_ << 
"'.\n";
+               DBG_G_D << "Rectangle: execute x formula '" << x_formula_ << 
"'.\n";
                x_ = 
game_logic::formula(x_formula_).execute(variables).as_int();
        }
 
        if(!y_formula_.empty()) {
-               DBG_G_D << "Rectangle execute y formula '" << y_formula_ << 
"'.\n";
+               DBG_G_D << "Rectangle: execute y formula '" << y_formula_ << 
"'.\n";
                y_ = 
game_logic::formula(y_formula_).execute(variables).as_int();
        }
 
        if(!w_formula_.empty()) {
-               DBG_G_D << "Rectangle execute width formula '" << w_formula_ << 
"'.\n";
+               DBG_G_D << "Rectangle: execute width formula '" << w_formula_ 
<< "'.\n";
                w_ = 
game_logic::formula(w_formula_).execute(variables).as_int();
        }
 
        if(!h_formula_.empty()) {
-               DBG_G_D << "Rectangle execute height formula '" << h_formula_ 
<< "'.\n";
+               DBG_G_D << "Rectangle: execute height formula '" << h_formula_ 
<< "'.\n";
                h_ = 
game_logic::formula(h_formula_).execute(variables).as_int();
        }
 
@@ -579,34 +619,50 @@
 }
 
 tcanvas::ttext::ttext(const vconfig& cfg) :
-       x_(lexical_cast_default<unsigned>(cfg["x"])),
-       y_(lexical_cast_default<unsigned>(cfg["y"])),
-       w_(lexical_cast_default<unsigned>(cfg["w"])),
-       h_(lexical_cast_default<unsigned>(cfg["h"])),
+       x_(0),
+       y_(0),
+       w_(0),
+       h_(0),
+       x_formula_(""),
+       y_formula_(""),
+       w_formula_(""),
+       h_formula_(""),
        font_size_(lexical_cast_default<unsigned>(cfg["font_size"])),
        colour_(decode_colour(cfg["colour"])),
-       text_(cfg["text"])
-{
-
-//FIXME enhance the options and write the wiki block in the new style.
-
-//FIXME make sure text is rendered properly.
+       text_(""),
+       text_formula_("")
+{
 
 /*WIKI
  * [text]
- *     x, y = (unsigned = 0), (unsigned = 0)    
- *                                    The top left corner of the bounding
- *                                    rectangle.
- *     w = (unsigned = 0)             The width of the bounding rectangle.
- *     h = (unsigned = 0)             The height of the bounding rectangle.
- *     font_size = (unsigned = 0)     The size of the font.
- *     colour = (widget.colour = "")  The colour of the text.
- *     text = (t_string = "")         The text to print, for now always printed
- *                                    centered in the area.
- *     debug = (string = "")          Debug message to show upon creation
- *                                    this message is not stored.
- * [/rectangle]
+ * Definition of text.
+ * Keys: 
+ *     x (f_unsigned = 0)              The x coordinate of the top left corner.
+ *     y (f_unsigned = 0)              The y coordinate of the top left corner.
+ *     w (f_unsigned = 0)              The width of the rectangle.
+ *     h (f_unsigned = 0)              The height of the rectangle.
+ *     font_size (unsigned = 0)        The size of the font to draw in.
+ *     colour (colour = "")            The colour of the text.
+ *     text (tstring = "")             The text to draw (translatable).
+ *     debug = (string = "")           Debug message to show upon creation
+ *                                     this message is not stored.
+ *
+ * NOTE there's no option of font style yet, alignment can be done with the
+ * forumulas.
+ *
+ * Variables:
+ *     text_width unsigned             The width of the rendered text.
+ *     text_height unsigned            The height of the renedered text.
+ * And also the ones defined in [line].
+ *
+ * [/text]
  */
+
+       read_possible_formula(cfg["x"], x_, x_formula_);
+       read_possible_formula(cfg["y"], y_, y_formula_);
+       read_possible_formula(cfg["w"], w_, w_formula_);
+       read_possible_formula(cfg["h"], h_, h_formula_);
+       read_possible_formula(cfg["text"], text_, text_formula_);
 
        const std::string& debug = (cfg["debug"]);
        if(!debug.empty()) {
@@ -617,12 +673,56 @@
 void tcanvas::ttext::draw(surface& canvas,
        const game_logic::map_formula_callable& variables)
 {
-       DBG_G_D << "Text: draw at " << x_ << ',' << y_ << " text '"
-               << text_ << "'.\n";
+
+       assert(variables.has_key("text"));
+
+       // We first need to determine the size of the text which need the 
rendered 
+       // text. So resolve and render the text first and then start to resolve
+       // the other formulas.
+       if(!text_formula_.empty()) {
+               DBG_G_D << "Text: execute text formula '" << text_formula_ << 
"'.\n";
+               text_ = 
t_string(game_logic::formula(text_formula_).execute(variables).as_string());
+       }
 
        SDL_Color col = { (colour_ >> 24), (colour_ >> 16), (colour_ >> 8), 
colour_ };
        surface surf(font::get_rendered_text(text_, font_size_, col, 
TTF_STYLE_NORMAL));
 
+       game_logic::map_formula_callable local_variables(variables);
+       local_variables.add("text_width", variant(surf->w));
+       local_variables.add("text_height", variant(surf->h));
+
+
+       //@todo formulas are now recalculated every draw cycle which is a 
+       // bit silly unless there has been a resize. So to optimize we should
+       // use an extra flag or do the calculation in a separate routine.
+       if(!x_formula_.empty()) {
+               DBG_G_D << "Text: execute x formula '" << x_formula_ << "'.\n";
+               x_ = 
game_logic::formula(x_formula_).execute(local_variables).as_int();
+       }
+
+       if(!y_formula_.empty()) {
+               DBG_G_D << "Text: execute y formula '" << y_formula_ << "'.\n";
+               y_ = 
game_logic::formula(y_formula_).execute(local_variables).as_int();
+       }
+
+       if(!w_formula_.empty()) {
+               DBG_G_D << "Text: execute width formula '" << w_formula_ << 
"'.\n";
+               w_ = 
game_logic::formula(w_formula_).execute(local_variables).as_int();
+       }
+
+       if(!h_formula_.empty()) {
+               DBG_G_D << "Text: execute height formula '" << h_formula_ << 
"'.\n";
+               h_ = 
game_logic::formula(h_formula_).execute(local_variables).as_int();
+       }
+
+       DBG_G_D << "Text: drawint text '" << text_
+               << "' drawn from " << x_ << ',' << y_
+               << " width " << w_ << " height " << h_ 
+               << " canvas size " << canvas->w << ',' << canvas->h << ".\n";
+
+       VALIDATE(x_ < canvas->w && y_ < canvas->h, _("Text doesn't start on 
canvas."));
+
+       // A text might be to long and will be clipped.
        if(surf->w > w_) {
                WRN_G_D << "Text: text is too wide for the canvas and will be 
clipped.\n";
        }
@@ -630,18 +730,15 @@
        if(surf->h > h_) {
                WRN_G_D << "Text: text is too high for the canvas and will be 
clipped.\n";
        }
-       
-       unsigned x_off = (surf->w >= w_) ? 0 : ((w_ - surf->w) / 2);
-       unsigned y_off = (surf->h >= h_) ? 0 : ((h_ - surf->h) / 2);
-       unsigned w_max = w_ - x_ - x_off;
-       unsigned h_max = h_ - y_ - y_off;
-
-       SDL_Rect dst = { x_ + x_off, y_ + y_off, w_max, h_max };
-
+
+       //FIXME make sure text is rendered properly.
+       //
        // A hack to make the letters show up a bit readable it does however
        // clear the back ground. This needs to be fixed but don't want to stall
        // development too long on it.
        SDL_SetAlpha(surf, 0, 0);
+
+       SDL_Rect dst = { x_, y_, canvas->w, canvas->h };
        SDL_BlitSurface(surf, 0, canvas, &dst);
 }
 

Modified: trunk/src/gui/widgets/canvas.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/canvas.hpp?rev=24983&r1=24982&r2=24983&view=diff
==============================================================================
--- trunk/src/gui/widgets/canvas.hpp (original)
+++ trunk/src/gui/widgets/canvas.hpp Sat Mar 22 16:00:23 2008
@@ -154,9 +154,17 @@
        private:
                unsigned x_, y_;
                unsigned w_, h_;
+
+               std::string
+                       x_formula_,
+                       y_formula_,
+                       w_formula_,
+                       h_formula_;
+
                unsigned font_size_;
                Uint32 colour_;
                t_string text_;
+               std::string text_formula_; 
        };
 
        tcanvas();
@@ -174,6 +182,9 @@
        surface& surf() { return canvas_; }
 
        void set_cfg(const config& cfg) { parse_cfg(cfg); }
+
+       void set_variable(const std::string& key, const variant& value)
+               { variables_.add(key, value); }
 
 private:
        void set_dirty(const bool dirty = true) { dirty_ = dirty; }

Modified: trunk/src/gui/widgets/window_builder.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/window_builder.cpp?rev=24983&r1=24982&r2=24983&view=diff
==============================================================================
--- trunk/src/gui/widgets/window_builder.cpp (original)
+++ trunk/src/gui/widgets/window_builder.cpp Sat Mar 22 16:00:23 2008
@@ -67,8 +67,10 @@
 
                        const std::string id = definition->grid.widgets[x * 
cols + y].id;
                        const std::string def = definition->grid.widgets[x * 
cols + y].definition;
+                       const t_string label = definition->grid.widgets[x * 
cols + y].label;
                        button->set_definition(id);
                        button->set_definition(def);
+                       button->set_label(label);
                        window.add_child(button, x, y);
 
                        DBG_G << "Window builder: placed button '" << id << "' 
with defintion '" 
@@ -194,7 +196,8 @@
 
 twindow_builder::tresolution::tgrid::twidget::twidget(const config& cfg) :
        id(cfg["id"]),
-       definition(cfg["button_definition"])
+       definition(cfg["button_definition"]),
+       label(cfg["label"])
 {
 
        if(definition.empty()) {

Modified: trunk/src/gui/widgets/window_builder.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/window_builder.hpp?rev=24983&r1=24982&r2=24983&view=diff
==============================================================================
--- trunk/src/gui/widgets/window_builder.hpp (original)
+++ trunk/src/gui/widgets/window_builder.hpp Sat Mar 22 16:00:23 2008
@@ -15,6 +15,7 @@
 #ifndef __GUI_WIDGETS_WINDOW_BUILDER_HPP_INCLUDED__
 #define __GUI_WIDGETS_WINDOW_BUILDER_HPP_INCLUDED__
 
+#include "tstring.hpp"
 
 #include <string>
 #include <vector>
@@ -73,6 +74,7 @@
 
                                std::string id;
                                std::string definition;
+                               t_string label;
                        };
 
                        std::vector<twidget> widgets;


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to