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];
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)
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
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()