]> git.tdb.fi Git - libs/gltk.git/commitdiff
Support different font colors in different states
authorMikko Rasa <tdb@tdb.fi>
Sun, 22 Sep 2013 15:06:00 +0000 (18:06 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 22 Sep 2013 15:07:07 +0000 (18:07 +0300)
source/button.cpp
source/dropdown.cpp
source/entry.cpp
source/label.cpp
source/style.cpp
source/style.h
source/text.cpp
source/text.h
source/toggle.cpp
source/widget.h

index 58fc134cde2a9d551c80ad9b303bcd7773423304..8fd2de6cb02e2abbb15d4b41035d71b551e88ebf 100644 (file)
@@ -44,7 +44,7 @@ void Button::set_icon(const GL::Texture2D *i)
 void Button::rebuild_special(const Part &part)
 {
        if(part.get_name()=="text")
-               text.build(part, geom, part_cache);
+               text.build(part, state, geom, part_cache);
        if(part.get_name()=="icon")
        {
                if(icon)
index 2aac55ec511dc184b5d7952901ebc7bbe5b6ece0..50aced9fe9fcaafd4317884ea4b370caa2395b03 100644 (file)
@@ -72,7 +72,7 @@ void Dropdown::set_selected_index(int index)
 void Dropdown::rebuild_special(const Part &part)
 {
        if(part.get_name()=="text")
-               text.build(part, geom, part_cache);
+               text.build(part, state, geom, part_cache);
        else
                Widget::rebuild_special(part);
 }
index 12eff06ae4ffbc542e3b80726242b60ea03ee4ee..f21aacbd07beff04c64aae4be124bdfab4e138fd 100644 (file)
@@ -102,7 +102,7 @@ void Entry::set_multiline(bool m)
 void Entry::rebuild_special(const Part &part)
 {
        if(part.get_name()=="text")
-               text.build(part, geom, first_row, part_cache);
+               text.build(part, state, geom, first_row, part_cache);
        else if(part.get_name()=="cursor")
        {
                const Graphic *graphic = part.get_graphic(state);
index e6b7efb0192b460185df5ac4d11a870ceb20e339..2de02f638249de9f7c544cc257c79b11f05300be 100644 (file)
@@ -29,7 +29,7 @@ void Label::autosize_special(const Part &part, Geometry &ageom)
 void Label::rebuild_special(const Part &part)
 {
        if(part.get_name()=="text")
-               text.build(part, geom, part_cache);
+               text.build(part, state, geom, part_cache);
 }
 
 void Label::on_style_change()
index f26112a6c14c688674b13cc7adb40c415adcc151..369559d8095b358bac335e2fb2c5727eabbe0206 100644 (file)
@@ -18,6 +18,14 @@ const GL::Font &Style::get_font() const
        return *font;
 }
 
+const GL::Color &Style::get_font_color(State s) const
+{
+       if(s>N_STATES_)
+               throw invalid_argument("Style::get_font_color");
+
+       return font_color[s];
+}
+
 const Part *Style::get_part(const string &name) const
 {
        for(PartSeq::const_iterator i=parts.begin(); i!=parts.end(); ++i)
@@ -38,6 +46,7 @@ Style::Loader::Loader(Style &s, Resources &r):
        }
 
        add("font",       &Loader::font);
+       add("font_color", &Loader::font_color_normal);
        add("font_color", &Loader::font_color);
        add("font_size",  &Style::font_size);
        add("part",       &Loader::part);
@@ -50,9 +59,16 @@ void Style::Loader::font(const string &n)
        obj.font_size = obj.font->get_native_size();
 }
 
-void Style::Loader::font_color(float r, float g, float b)
+void Style::Loader::font_color_normal(float r, float g, float b)
+{
+       font_color(NORMAL, r, g, b);
+}
+
+void Style::Loader::font_color(State s, float r, float g, float b)
 {
-       obj.font_color = GL::Color(r, g, b);
+       for(unsigned i=0; i<N_STATES_; ++i)
+               if((i&s)==s)
+                       obj.font_color[i] = GL::Color(r, g, b);
 }
 
 void Style::Loader::part(const string &n)
index 672a7eaa202a129d0771190f411d1a3c3a4cef2e..302551422e9a5bd9409eae4624cada8373ce04af 100644 (file)
@@ -25,7 +25,8 @@ public:
 
        private:
                void font(const std::string &);
-               void font_color(float, float, float);
+               void font_color_normal(float, float, float);
+               void font_color(State, float, float, float);
                void part(const std::string &);
                void unnamed_part();
        };
@@ -35,14 +36,14 @@ public:
 private:
        const GL::Font *font;
        unsigned font_size;
-       GL::Color font_color;
+       GL::Color font_color[N_STATES_];
        PartSeq parts;
 
 public:
        Style();
        const GL::Font &get_font() const;
        unsigned get_font_size() const { return font_size; }
-       const GL::Color &get_font_color() const { return font_color; }
+       const GL::Color &get_font_color(State) const;
        const PartSeq &get_parts() const { return parts; }
        const Part *get_part(const std::string &) const;
 };
index a0f53c238c12b88eca6df4f5b28135839163d804..aa5ad8030efe6be34a08218932e4c0d284d2a98f 100644 (file)
@@ -165,19 +165,19 @@ Geometry Text::coords_to_geometry(const Part &part, const Geometry &parent, unsi
        return data.result;
 }
 
-void Text::build(const Part &part, const Geometry &parent, PartCache &cache) const
+void Text::build(const Part &part, State state, const Geometry &parent, PartCache &cache) const
 {
-       build(part, parent, 0, cache);
+       build(part, state, parent, 0, cache);
 }
 
-void Text::build(const Part &part, const Geometry &parent, unsigned first_row, PartCache &cache) const
+void Text::build(const Part &part, State state, const Geometry &parent, unsigned first_row, PartCache &cache) const
 {
        if(!style || lines.empty())
                return;
 
        const GL::Font &font = style->get_font();
        GL::MeshBuilder bld(cache.create_mesh(part, font.get_texture()));
-       bld.color(style->get_font_color());
+       bld.color(style->get_font_color(state));
 
        RenderData data;
        data.bld = &bld;
index db58b2462621aad9dcd0e66db32baa7195d1ae36..f688d4936d90d6354a56d07bac9163da74b52ccb 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <string>
 #include <vector>
+#include "state.h"
 
 namespace Msp {
 namespace GLtk {
@@ -53,8 +54,8 @@ public:
        unsigned coords_to_offset(unsigned, unsigned) const;
        Geometry coords_to_geometry(const Part &, const Geometry &, unsigned, unsigned, unsigned) const;
 
-       void build(const Part &, const Geometry &, PartCache &) const;
-       void build(const Part &, const Geometry &, unsigned, PartCache &) const;
+       void build(const Part &, State, const Geometry &, PartCache &) const;
+       void build(const Part &, State, const Geometry &, unsigned, PartCache &) const;
 
        Text &operator=(const std::string &);
 private:
index cb80880787e75162f3f03cc27cbe89444f17cf71..988b0a50eef4e1898fdb70f5f7e798affcce1109 100644 (file)
@@ -67,7 +67,7 @@ void Toggle::set_value(bool v)
 void Toggle::rebuild_special(const Part &part)
 {
        if(part.get_name()=="text")
-               text.build(part, geom, part_cache);
+               text.build(part, state, geom, part_cache);
 }
 
 void Toggle::button_press(int, int, unsigned btn)
index dfef4ba7128be3b1a3e099addc5b7720a943ad8e..7c601d2b5860668b426e3b8466ef316ab92fb2c3 100644 (file)
@@ -112,7 +112,10 @@ protected:
        void set_state(State s) { set_state(s, s); }
        void clear_state(State s) { set_state(s, NORMAL); }
        void set_state(State, State);
+public:
+       State get_state() const { return state; }
 
+protected:
        void rebuild();
        virtual void rebuild_special(const Part &);