From: Mikko Rasa Date: Wed, 20 Nov 2013 17:06:51 +0000 (+0200) Subject: Don't rebuild on state change if there are no visual changes X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=85e27a9f4678a20dc197d1f29fae3d0370e402d9;p=libs%2Fgltk.git Don't rebuild on state change if there are no visual changes --- diff --git a/source/style.cpp b/source/style.cpp index 369559d..d53ae24 100644 --- a/source/style.cpp +++ b/source/style.cpp @@ -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(s, &r) diff --git a/source/style.h b/source/style.h index 3025514..ed1de87 100644 --- a/source/style.h +++ b/source/style.h @@ -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 diff --git a/source/widget.cpp b/source/widget.cpp index e5c58a2..8b7f1cb 100644 --- a/source/widget.cpp +++ b/source/widget.cpp @@ -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()