]> git.tdb.fi Git - libs/gltk.git/commitdiff
Don't rebuild on state change if there are no visual changes
authorMikko Rasa <tdb@tdb.fi>
Wed, 20 Nov 2013 17:06:51 +0000 (19:06 +0200)
committerMikko Rasa <tdb@tdb.fi>
Wed, 20 Nov 2013 17:06:51 +0000 (19:06 +0200)
source/style.cpp
source/style.h
source/widget.cpp

index 369559d8095b358bac335e2fb2c5727eabbe0206..d53ae240fcea168a1b4659e6d8ac4472ec79f69c 100644 (file)
@@ -20,7 +20,7 @@ const GL::Font &Style::get_font() const
 
 const GL::Color &Style::get_font_color(State s) const
 {
-       if(s>N_STATES_)
+       if(s>=N_STATES_)
                throw invalid_argument("Style::get_font_color");
 
        return font_color[s];
@@ -35,6 +35,23 @@ const Part *Style::get_part(const string &name) const
        return 0;
 }
 
+bool Style::compare_states(State s1, State s2) const
+{
+       if(s1>=N_STATES_ || s2>=N_STATES_)
+               throw invalid_argument("Style::compare_states");
+
+       const GL::Color &c1 = font_color[s1];
+       const GL::Color &c2 = font_color[s2];
+       if(c1.r!=c2.r || c1.g!=c2.g || c1.b!=c2.b)
+               return true;
+
+       for(PartSeq::const_iterator i=parts.begin(); i!=parts.end(); ++i)
+               if(i->get_graphic(s1)!=i->get_graphic(s2))
+                       return true;
+
+       return false;
+}
+
 
 Style::Loader::Loader(Style &s, Resources &r):
        DataFile::CollectionObjectLoader<Style, Resources>(s, &r)
index 302551422e9a5bd9409eae4624cada8373ce04af..ed1de87621e99cce33bd5dd2ee10b6ebdb6a0fa4 100644 (file)
@@ -46,6 +46,7 @@ public:
        const GL::Color &get_font_color(State) const;
        const PartSeq &get_parts() const { return parts; }
        const Part *get_part(const std::string &) const;
+       bool compare_states(State, State) const;
 };
 
 } // namespace GLtk
index e5c58a25d4e3b2000c29e1a2c92f0b79cc9970b2..8b7f1cbd88b351305a83f6dd56b2c9d5e32ac69b 100644 (file)
@@ -182,8 +182,10 @@ void Widget::set_enabled(bool e)
 
 void Widget::set_state(State mask, State bits)
 {
+       State old_state = state;
        state = (state&~mask)|bits;
-       rebuild();
+       if(style && style->compare_states(old_state, state))
+               rebuild();
 }
 
 void Widget::rebuild()