]> git.tdb.fi Git - libs/gltk.git/commitdiff
Store the Resources reference only in Root widget
authorMikko Rasa <tdb@tdb.fi>
Fri, 12 Nov 2010 21:43:29 +0000 (21:43 +0000)
committerMikko Rasa <tdb@tdb.fi>
Fri, 12 Nov 2010 21:43:29 +0000 (21:43 +0000)
Make other widgets get it from the Root

SOURCE COMPATIBILITY BREAK

35 files changed:
source/button.cpp
source/button.h
source/container.cpp
source/container.h
source/dialog.cpp
source/dialog.h
source/dropdown.cpp
source/dropdown.h
source/entry.cpp
source/entry.h
source/hslider.cpp
source/hslider.h
source/image.cpp
source/image.h
source/indicator.cpp
source/indicator.h
source/label.cpp
source/label.h
source/list.cpp
source/list.h
source/panel.cpp
source/panel.h
source/root.cpp
source/root.h
source/slider.cpp
source/slider.h
source/table.cpp
source/table.h
source/text.cpp
source/toggle.cpp
source/toggle.h
source/vslider.cpp
source/vslider.h
source/widget.cpp
source/widget.h

index 5871a5fabd0c7db23b2a0dfea1a5c6e6902f0368..8e6e7131cb4157c266b096e4bd121931eb68abdb 100644 (file)
@@ -12,13 +12,11 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-Button::Button(const Resources &r, const std::string &t):
-       Widget(r),
+Button::Button(const std::string &t):
        text(),
        icon(0),
        pressed(false)
 {
-       update_style();
        set_text(t);
 }
 
index 687f5dd74e3cee22bd2310b0a02dc718feeda0b5..b84511e310707655e70bc1c76392394e86f3634c 100644 (file)
@@ -39,7 +39,8 @@ private:
 public:
        sigc::signal<void> signal_clicked;
 
-       Button(const Resources &, const std::string & =std::string());
+       Button(const std::string & = std::string());
+
        void set_text(const std::string &);
        void set_icon(const GL::Texture2D *);
        virtual void button_press(int, int, unsigned);
index 2ce2c5efc367213c584197d158c1327b6a2eda4b..b2b8c56adaec281394847f0d954d9f516e5859a6 100644 (file)
@@ -12,8 +12,7 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Container::Container(const Resources &r):
-       Widget(r),
+Container::Container():
        click_focus(0),
        click_button(0)
 { }
@@ -145,6 +144,16 @@ Container::Child *Container::create_child(Widget *wdg)
        return new Child(*this, wdg);
 }
 
+void Container::on_reparent()
+{
+       for(list<Child *>::iterator i=children.begin(); i!=children.end(); ++i)
+       {
+               if(Container *c = dynamic_cast<Container *>((*i)->widget))
+                       c->on_reparent();
+               update_style(*(*i)->widget);
+       }
+}
+
 
 Container::Child::Child(Container &c, Widget *w):
        container(c),
index 32e8157dd15dec6afe64b90a3cf177b9c8bd2760..0384521d4c8657a9a6282618b90f7b6de7dafa38 100644 (file)
@@ -33,7 +33,7 @@ protected:
        Widget *click_focus;
        unsigned click_button;
 
-       Container(const Resources &);
+       Container();
 public:
        virtual ~Container();
 
@@ -49,6 +49,7 @@ public:
        virtual void pointer_leave();
 protected:
        virtual Child *create_child(Widget *);
+       virtual void on_reparent();
 };
 
 } // namespace GLtk
index 3e09783dcb5eb36350d4c4158b9139ae33ed7fd0..5a03102f463dd8b551e5606253c2b0426aa683a4 100644 (file)
@@ -11,9 +11,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-Dialog::Dialog(const Resources &r):
-       Widget(r),
-       Panel(r),
+Dialog::Dialog():
        stale(false)
 { }
 
index 0a9b0d88c9037c358ba50fa9eee8329239f08a9b..89065dcf050861542f52548bdeb28af77dd2a22e 100644 (file)
@@ -27,7 +27,7 @@ private:
 public:
        sigc::signal<void, int> signal_response;
 
-       Dialog(const Resources &);
+       Dialog();
 
        /** Adds an action button to the dialog.  Pressing the button will invoke
        response handlers and delete the dialog. */
index d120c85856e60b76730ef24f4cb4b0d74e99f61a..bcd501950a08aee01f584c925725717c5b83223b 100644 (file)
@@ -18,16 +18,11 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Dropdown::Dropdown(const Resources &r):
-       Widget(r),
-       Container(r),
-       list(r),
+Dropdown::Dropdown():
        dropped(false)
 {
        add(list);
        list.signal_item_selected.connect(sigc::mem_fun(this, &Dropdown::list_item_selected));
-
-       update_style();
 }
 
 void Dropdown::append(const string &item)
@@ -110,6 +105,11 @@ void Dropdown::on_geometry_change()
        resize_list();
 }
 
+void Dropdown::on_style_change()
+{
+       resize_list();
+}
+
 void Dropdown::resize_list()
 {
        list.autosize();
index 7428ebf086d24eb1e0660f0d703fea45cb0b74ee..2fe82d0a194c41421bfee2b057813b3d5cc01841 100644 (file)
@@ -35,7 +35,7 @@ private:
 public:
        sigc::signal<void, int, const std::string &> signal_item_selected;
 
-       Dropdown(const Resources &);
+       Dropdown();
 
        void append(const std::string &);
        void insert(unsigned, const std::string &);
@@ -54,6 +54,7 @@ private:
        virtual void render_special(const Part &) const;
 
        virtual void on_geometry_change();
+       virtual void on_style_change();
        void resize_list();
 
        void list_item_selected(unsigned, const std::string &);
index 8853ad7efe6daf8a4812313f5754ade2b900c211..2c9cb357fa55d38215c64358b4f1ae22fe972932 100644 (file)
@@ -20,9 +20,7 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Entry::Entry(const Resources &r, const string &t):
-       Widget(r),
-       Container(r),
+Entry::Entry(const string &t):
        text(),
        multiline(false),
        edit_pos(0),
@@ -31,7 +29,6 @@ Entry::Entry(const Resources &r, const string &t):
        text_part(0),
        slider(0)
 {
-       update_style();
        set_text(t);
 }
 
@@ -51,7 +48,7 @@ void Entry::set_multiline(bool m)
        {
                if(!slider)
                {
-                       slider = new VSlider(res);
+                       slider = new VSlider;
                        add(*slider);
                        slider->set_step(1);
                        slider->signal_value_changed.connect(sigc::mem_fun(this, &Entry::slider_value_changed));
@@ -159,9 +156,16 @@ void Entry::on_geometry_change()
 
 void Entry::on_style_change()
 {
+       text.set_style(style);
+
+       if(!style)
+       {
+               text_part = 0;
+               return;
+       }
+
        text_part = style->get_part("text");
 
-       text.set_style(style);
        reposition_slider();
 
        if(multiline)
@@ -170,7 +174,7 @@ void Entry::on_style_change()
 
 void Entry::reposition_slider()
 {
-       if(!slider)
+       if(!style || !slider)
                return;
 
        if(const Part *slider_part = style->get_part("slider"))
index a8bbcd5d49f865c77ac0e276271684b62bb62590..53270647a61acc31158c1c34c8c2cded3ef247bd 100644 (file)
@@ -47,7 +47,7 @@ private:
 public:
        sigc::signal<void> signal_enter;
 
-       Entry(const Resources &, const std::string & =std::string());
+       Entry(const std::string & = std::string());
 
        void set_text(const std::string &);
        const std::string &get_text() const { return text.get(); }
index 8cac45f46f772b9fdee167c9909de584f599ac6e..a4378f0c9e62fbf491b6b73c2759ca97e11baf7c 100644 (file)
@@ -15,11 +15,9 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-HSlider::HSlider(const Resources &r):
-       Slider(r)
-{
-       update_style();
-}
+HSlider::HSlider():
+       slider_size(1)
+{ }
 
 void HSlider::button_press(int x, int y, unsigned btn)
 {
@@ -72,6 +70,9 @@ void HSlider::on_geometry_change()
 
 void HSlider::on_style_change()
 {
+       if(!style)
+               return;
+
        if(const Part *slider_part = style->get_part("slider"))
                slider_size = slider_part->get_geometry().w;
 
index 5da211db4b1f3d6d4bcf481afaf2fbe592eba087..47066998c5a4e4f336422772a5bcd02b9f61a5ee 100644 (file)
@@ -23,7 +23,7 @@ private:
        unsigned slider_size;
 
 public:
-       HSlider(const Resources &);
+       HSlider();
        virtual void button_press(int, int, unsigned);
        virtual void button_release(int, int, unsigned);
        virtual void pointer_motion(int, int);
index f7f61bbb9a73e2b4b84d48228bd4e2f3217d5782..11003f4d1af56acbfb6b7367ec680f6e86bb1533 100644 (file)
@@ -16,13 +16,11 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Image::Image(const Resources &r, const GL::Texture2D *i):
-       Widget(r),
+Image::Image(const GL::Texture2D *i):
        image(i),
        keep_aspect(true)
 {
        focusable = false;
-       update_style();
 }
 
 void Image::set_image(const GL::Texture2D *i)
index 5d113ccf33c83cd900d77f400bdfad38a000babb..8256a8d9c5c1749bbee6da77793fbc91e7b09a81 100644 (file)
@@ -24,7 +24,7 @@ private:
        bool keep_aspect;
 
 public:
-       Image(const Resources &, const GL::Texture2D * = 0);
+       Image(const GL::Texture2D * = 0);
 
        void set_image(const GL::Texture2D *);
        void set_keep_aspect(bool);
index d0e75586b288098e812432e75e3db8dbee9fa21c..8aeca21b7264c7f50d003af5b9af170b64458d82 100644 (file)
@@ -10,11 +10,9 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-Indicator::Indicator(const Resources &r):
-       Widget(r)
+Indicator::Indicator()
 {
        focusable = false;
-       update_style();
 }
 
 void Indicator::set_active(bool a)
index 69e488f0656f8a19551da96cfb3c8781bbfa1a00..ce95151665e30bd7048fa1b2808d471941470132 100644 (file)
@@ -19,7 +19,7 @@ An Indicator visualizes a boolean state.  It can be either active or inactive.
 class Indicator: public Widget
 {
 public:
-       Indicator(const Resources &);
+       Indicator();
        void set_active(bool);
 private:
        virtual const char *get_class() const { return "indicator"; }
index 63b0ebdc2a1b24f366d9f4b28e82646455a5c4c3..6db6aa37820b593fa693cce70de22b65da469b2f 100644 (file)
@@ -14,17 +14,17 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Label::Label(const Resources &r, const string &t):
-       Widget(r),
-       text()
+Label::Label(const string &t)
 {
        focusable = false;
-       update_style();
        set_text(t);
 }
 
 void Label::autosize()
 {
+       if(!style)
+               return;
+
        geom.h = text.get_height();
        geom.w = text.get_width();
        if(const Part *text_part = style->get_part("text"))
index f157616f5f54b23daaed6fee10cbfbc4fc5394a3..87835da73811a4a816cdadc11c746f6a416bc3ef 100644 (file)
@@ -32,7 +32,7 @@ private:
        Text text;
 
 public:
-       Label(const Resources &, const std::string & =std::string());
+       Label(const std::string & = std::string());
 
        virtual void autosize();
        void set_text(const std::string &);
index 113871ef8ed51f35e35944fd0b155e9f2d65e958..672cf4911bbf028e4e3850579959794e9c4f11f2 100644 (file)
@@ -20,25 +20,23 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-List::List(const Resources &r):
-       Widget(r),
-       Container(r),
+List::List():
        sel_index(-1),
        first(0),
        n_visible(1),
        row_height(1),
-       items_part(0),
-       slider(res)
+       items_part(0)
 {
        add(slider);
        slider.set_step(1);
        slider.signal_value_changed.connect(sigc::mem_fun(this, &List::slider_value_changed));
-
-       update_style();
 }
 
 void List::autosize()
 {
+       if(!style)
+               return;
+
        float font_size = style->get_font()->get_default_size();
 
        geom.w = 0;
@@ -186,6 +184,12 @@ void List::on_geometry_change()
 
 void List::on_style_change()
 {
+       if(!style)
+       {
+               items_part = 0;
+               return;
+       }
+
        reposition_slider();
 
        items_part = style->get_part("items");
@@ -198,6 +202,9 @@ void List::on_style_change()
 
 void List::reposition_slider()
 {
+       if(!style)
+               return;
+
        if(const Part *slider_part = style->get_part("slider"))
        {
                Geometry sgeom = slider_part->get_geometry();
index 426d309b6a6c1a23a21b29e2d1e2a1b6bbf8899b..f1e9ac3fba6172da86fa46e1fa3a530118977d6e 100644 (file)
@@ -44,7 +44,7 @@ private:
 public:
        sigc::signal<void, unsigned, const std::string &> signal_item_selected;
 
-       List(const Resources &);
+       List();
 
        virtual void autosize();
 
index 59553b45de0122136a4c410ebf06a50ed378f6e4..f0c1c7c69f0f120b2d2696a049b75a3d975d3ed4 100644 (file)
@@ -25,15 +25,11 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Panel::Panel(const Resources &r):
-       Widget(r),
-       Container(r),
+Panel::Panel():
        pointer_focus(0),
        pointer_grabbed(false),
        input_focus(0)
-{
-       update_style();
-}
+{ }
 
 void Panel::raise(Widget &wdg)
 {
@@ -193,7 +189,7 @@ Panel::Loader::Loader(Panel &p, map<string, Widget *> &m):
 template<typename T>
 void Panel::Loader::child(const string &n)
 {
-       RefPtr<T> chl = new T(pnl.res);
+       RefPtr<T> chl = new T();
        load_sub(*chl);
        pnl.add(*chl.get());
        wdg_map[n] = chl.release();
@@ -201,7 +197,7 @@ void Panel::Loader::child(const string &n)
 
 void Panel::Loader::panel(const string &n)
 {
-       RefPtr<Panel> p = new Panel(pnl.res);
+       RefPtr<Panel> p = new Panel();
        load_sub(*p, wdg_map);
        pnl.add(*p.get());
        wdg_map[n] = p.release();
index 1082447bc58fdddaf77f660d5876e326a5a82616..dc9841654aa7b623e948610910f0fa35455907a1 100644 (file)
@@ -55,7 +55,7 @@ protected:
        Panel(const Panel &);
        Panel &operator=(const Panel &);
 public:
-       Panel(const Resources &);
+       Panel();
 
        void raise(Widget &);
        Widget *get_input_focus() const { return input_focus; }
index 9023b7cb5c0f0f89578dbd864f12228dab9d5f88..fbb4cc6e5efc887539228a79f0d2999240ba0bf2 100644 (file)
@@ -16,8 +16,7 @@ namespace Msp {
 namespace GLtk {
 
 Root::Root(const Resources &r, Graphics::Window &w):
-       Widget(r),
-       Panel(r),
+       resources(r),
        window(w),
        lbl_tooltip(0),
        tooltip_target(0)
@@ -53,7 +52,7 @@ void Root::tick()
                {
                        if(!lbl_tooltip)
                        {
-                               lbl_tooltip = new Label(res);
+                               lbl_tooltip = new Label;
                                add(*lbl_tooltip);
                                lbl_tooltip->set_style("tooltip");
                        }
index 16e01aed06a1e43d3721bb7ebfca1db2ea120c59..cfe2af344d31c9e2a6902f590e5781f28eccd345 100644 (file)
@@ -30,6 +30,7 @@ public:
        sigc::signal<std::string, int, int> signal_tooltip;
 
 private:
+       const Resources &resources;
        Graphics::Window &window;
        Label *lbl_tooltip;
        int pointer_x;
@@ -41,6 +42,7 @@ public:
        Root(const Resources &, Graphics::Window &);
        void tick();
 
+       const Resources &get_resources() const { return resources; }
        virtual unsigned get_width() const { return geom.w; }
        virtual unsigned get_height() const { return geom.h; }
 
index 425f721f0ccf052bd0eb74a78b44eaca80570498..3392ac4a1e83ce1f84b6e047abebf9d33a6e0c4e 100644 (file)
@@ -10,8 +10,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-Slider::Slider(const Resources &r):
-       Widget(r),
+Slider::Slider():
        min(0),
        max(1),
        value(0),
index 6c95526f13f2699f14c89049fe5f252510383a2e..c4326e3eac0edf5571ac29b96ee82adb3ba63abc 100644 (file)
@@ -43,7 +43,7 @@ public:
        sigc::signal<void, double> signal_value_changed;
 
 protected:
-       Slider(const Resources &);
+       Slider();
 public:
        void set_value(double);
        void set_range(double, double);
index 085a44237f979bbe9013534c9c160881d75b14eb..c0c823822c425e70fb709d721f53853965dce884 100644 (file)
@@ -16,15 +16,13 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Table::Table(const Resources &r):
-       Widget(r),
+Table::Table():
        rows(1),
        columns(1),
        data(1),
        col_w(1)
 {
        focusable = false;
-       update_style();
 }
 
 void Table::set_rows(unsigned r)
index 190973e11c07baeacde9bbd2fa675e13dc2b4e78..ab1654c419979adba16fe21d72a08ed04e1d8a03 100644 (file)
@@ -36,7 +36,7 @@ private:
        std::vector<unsigned> col_w;
 
 public:
-       Table(const Resources &);
+       Table();
 
        void set_rows(unsigned);
        void set_columns(unsigned);
index c173a8a5edb3a603351661dca1f22347270d85b6..c8c6f55ea3d6597ca348b7dbc911672d93d0ed6e 100644 (file)
@@ -42,9 +42,12 @@ void Text::set_style(const Style *s)
 {
        style = s;
 
-       float font_size = style->get_font()->get_default_size();
-       for(vector<Line>::iterator i=lines.begin(); i!=lines.end(); ++i)
-               i->width = static_cast<unsigned>(style->get_font()->get_string_width(text.substr(i->start, i->length))*font_size);
+       if(style)
+       {
+               float font_size = style->get_font()->get_default_size();
+               for(vector<Line>::iterator i=lines.begin(); i!=lines.end(); ++i)
+                       i->width = static_cast<unsigned>(style->get_font()->get_string_width(text.substr(i->start, i->length))*font_size);
+       }
 }
 
 unsigned Text::get_width() const
@@ -57,6 +60,9 @@ unsigned Text::get_width() const
 
 unsigned Text::get_height() const
 {
+       if(!style)
+               return lines.size();
+
        const GL::Font *font = style->get_font();
        float font_size = font->get_default_size();
        unsigned line_height = static_cast<unsigned>((font->get_ascent()-font->get_descent())*font_size);
@@ -158,7 +164,7 @@ Geometry Text::coords_to_geometry(const Part &part, const Geometry &parent, unsi
 
 void Text::render(const Part &part, const Geometry &parent, unsigned first_row) const
 {
-       if(lines.empty())
+       if(!style || lines.empty())
                return;
 
        const GL::Color &color = style->get_font_color();
@@ -180,7 +186,7 @@ Text &Text::operator=(const string &t)
 void Text::find_lines()
 {
        lines.clear();
-       float font_size = style->get_font()->get_default_size();
+       float font_size = (style ? style->get_font()->get_default_size() : 1);
        string::size_type start = 0;
        while(1)
        {
@@ -189,7 +195,12 @@ void Text::find_lines()
                Line line;
                line.start = start;
                line.length = (newline==string::npos ? text.size() : newline)-start;
-               line.width = static_cast<unsigned>(style->get_font()->get_string_width(text.substr(line.start, line.length))*font_size);
+               line.width = line.length;
+               if(style)
+               {
+                       string str = text.substr(line.start, line.length);
+                       line.width = static_cast<unsigned>(style->get_font()->get_string_width(str)*font_size);
+               }
                lines.push_back(line);
 
                if(newline==string::npos)
@@ -201,6 +212,9 @@ void Text::find_lines()
 template<typename T, void (Text::*func)(unsigned, const Geometry &, T &) const>
 void Text::process_lines(const Part &part, const Geometry &parent, unsigned first_row, T &data) const
 {
+       if(!style)
+               return;
+
        const GL::Font *font = style->get_font();
        float font_size = font->get_default_size();
        unsigned line_height = static_cast<unsigned>((font->get_ascent()-font->get_descent())*font_size);
@@ -209,7 +223,7 @@ void Text::process_lines(const Part &part, const Geometry &parent, unsigned firs
        int y_offset = static_cast<int>(-font->get_descent()*font_size);
 
        const Sides &margin = part.get_margin();
-       unsigned n_lines = max(min(lines.size(), (parent.h-margin.top-margin.bottom)/line_spacing), 1U);
+       unsigned n_lines = min(lines.size(), max((parent.h-margin.top-margin.bottom)/line_spacing, 1U));
        first_row = min(first_row, lines.size()-n_lines);
 
        for(unsigned i=0; i<n_lines; ++i)
index 3b896bedb7290451a202f3dcab2efbe2f40cb965..a950b971307aae231b91783624a234155aee8ae3 100644 (file)
@@ -14,14 +14,12 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Toggle::Toggle(const Resources &r, const string &t):
-       Widget(r),
+Toggle::Toggle(const string &t):
        text(),
        pressed(false),
        value(false),
        exclusive(false)
 {
-       update_style();
        set_text(t);
 }
 
index da129be2fa188f8af1ff24f7b6fa5bbd78e842b7..24dfe4867651081163a0302b88b902092213fefb 100644 (file)
@@ -40,7 +40,7 @@ private:
 public:
        sigc::signal<void, bool> signal_toggled;
 
-       Toggle(const Resources &, const std::string & =std::string());
+       Toggle(const std::string & = std::string());
 
        void set_text(const std::string &);
        void set_exclusive(bool);
index 0b5dd0ca1efe54cb178a4a4959b04215a0b78496..cdd2675952a1bf3ddf2737a08bfc414be01e4d5c 100644 (file)
@@ -15,10 +15,9 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-VSlider::VSlider(const Resources &r):
-       Slider(r)
+VSlider::VSlider():
+       slider_size(1)
 {
-       update_style();
 }
 
 void VSlider::button_press(int x, int y, unsigned btn)
@@ -72,6 +71,9 @@ void VSlider::on_geometry_change()
 
 void VSlider::on_style_change()
 {
+       if(!style)
+               return;
+
        if(const Part *slider_part = style->get_part("slider"))
                slider_size = slider_part->get_geometry().h;
 
index 38238791aca7fd2705d45f46612916df4d1c2784..2d2ac58c890ef5cd64fd72823f3bddd282ee2c44 100644 (file)
@@ -19,7 +19,7 @@ private:
        unsigned slider_size;
 
 public:
-       VSlider(const Resources &);
+       VSlider();
        virtual void button_press(int, int, unsigned);
        virtual void button_release(int, int, unsigned);
        virtual void pointer_motion(int, int);
index 2af3b60b3024a96e5689637ed152e152b2eec275..434ec454ea022beb1a31964025c7a98808d25d8f 100644 (file)
@@ -9,8 +9,9 @@ Distributed under the LGPL
 #include <msp/gl/matrix.h>
 #include <msp/gl/transform.h>
 #include <msp/strings/formatter.h>
-#include "panel.h"
+#include "container.h"
 #include "resources.h"
+#include "root.h"
 #include "widget.h"
 
 using namespace std;
@@ -18,8 +19,7 @@ using namespace std;
 namespace Msp {
 namespace GLtk {
 
-Widget::Widget(const Resources &r):
-       res(r),
+Widget::Widget():
        style(0),
        state(NORMAL),
        visible(true),
@@ -92,7 +92,7 @@ void Widget::set_focus()
 void Widget::render() const
 {
        if(!style)
-               throw InvalidState(format("Attempt to render a widget without a style (class=\"%s\")", get_class()));
+               throw InvalidState(format("Attempt to render a widget with null style (class=\"%s\", style_name=\"%s\")", get_class(), style_name));
 
        GL::push_matrix();
        GL::translate(geom.x, geom.y, 0);
@@ -131,16 +131,31 @@ void Widget::focus_out()
 
 void Widget::update_style()
 {
-       string sname = get_class();
-       if(!style_name.empty())
+       Widget *top;
+       for(top=this; top->parent; top=top->parent) ;
+       Root *root = dynamic_cast<Root *>(top);
+       if(!root)
+               style = 0;
+       else
        {
-               sname += '-';
-               sname += style_name;
+               string sname = get_class();
+               if(!style_name.empty())
+               {
+                       sname += '-';
+                       sname += style_name;
+               }
+
+               style = root->get_resources().get<Style>(sname);
        }
-       style = res.get<Style>(sname);
+
        on_style_change();
 }
 
+void Widget::update_style(Widget &w)
+{
+       w.update_style();
+}
+
 void Widget::set_parent(Container *p)
 {
        if(parent && p)
@@ -148,6 +163,7 @@ void Widget::set_parent(Container *p)
        parent = p;
 
        on_reparent();
+       update_style();
 }
 
 void Widget::set_parent(Widget &w, Container *p)
index 2fdc68c34c778e34f4ebf72ba237921eeb2f54fb..d5bc0ff04c232504a657275b956b9f14c3ec36de 100644 (file)
@@ -47,7 +47,6 @@ public:
        sigc::signal<void> signal_ungrab_pointer;
 
 protected:
-       const Resources &res;
        Geometry geom;
        std::string style_name;
        const Style *style;
@@ -57,7 +56,7 @@ protected:
        Container *parent;
        std::string tooltip;
 
-       Widget(const Resources &);
+       Widget();
 public:
        virtual ~Widget();
 
@@ -111,6 +110,8 @@ protected:
        */
        void update_style();
 
+       static void update_style(Widget &);
+
        /**
        Sets the widget's parent Panel.  The widget must be unparented when calling
        this function with a nonzero parameter.
@@ -120,7 +121,7 @@ protected:
        /**
        A helper function to set the parent of another widget.
        */
-       void set_parent(Widget &, Container *);
+       static void set_parent(Widget &, Container *);
 
        // More events
        virtual void on_geometry_change() { }