]> git.tdb.fi Git - libs/gltk.git/commitdiff
Make autosize_special const and add a const autosize overload
authorMikko Rasa <tdb@tdb.fi>
Wed, 6 Nov 2013 11:12:24 +0000 (13:12 +0200)
committerMikko Rasa <tdb@tdb.fi>
Wed, 6 Nov 2013 11:12:24 +0000 (13:12 +0200)
This should reduce useless back-and-forth resizing of widgets in several
common patterns.

23 files changed:
source/button.cpp
source/button.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/label.cpp
source/label.h
source/layout.cpp
source/list.cpp
source/list.h
source/panel.cpp
source/panel.h
source/toggle.cpp
source/toggle.h
source/vslider.cpp
source/vslider.h
source/widget.cpp
source/widget.h

index 8fd2de6cb02e2abbb15d4b41035d71b551e88ebf..57e5fa42f57981cfb3398576b5a6563b3d5b4843 100644 (file)
@@ -16,7 +16,7 @@ Button::Button(const std::string &t):
        set_text(t);
 }
 
        set_text(t);
 }
 
-void Button::autosize_special(const Part &part, Geometry &ageom)
+void Button::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="text")
                text.autosize(part, ageom);
 {
        if(part.get_name()=="text")
                text.autosize(part, ageom);
index edf0b62bf94e2c7198f7cc5ab567b6f6246f11f7..79045150a71a28f98d3a996ffa7cc907487dad42 100644 (file)
@@ -37,7 +37,7 @@ public:
        virtual const char *get_class() const { return "button"; }
 
 private:
        virtual const char *get_class() const { return "button"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
 
 public:
        void set_text(const std::string &);
 
 public:
        void set_text(const std::string &);
index 50aced9fe9fcaafd4317884ea4b370caa2395b03..013e1d9168721d794bcd4069f7d596fe2fb7ee36 100644 (file)
@@ -33,11 +33,12 @@ void Dropdown::init()
        list.signal_autosize_changed.connect(sigc::mem_fun(this, &Dropdown::list_autosize_changed));
 }
 
        list.signal_autosize_changed.connect(sigc::mem_fun(this, &Dropdown::list_autosize_changed));
 }
 
-void Dropdown::autosize_special(const Part &part, Geometry &ageom)
+void Dropdown::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="list")
        {
 {
        if(part.get_name()=="list")
        {
-               list.autosize();
+               Geometry lgeom;
+               list.autosize(lgeom);
                ageom.w = max(ageom.w, list.get_geometry().w);
        }
        else if(part.get_name()=="text")
                ageom.w = max(ageom.w, list.get_geometry().w);
        }
        else if(part.get_name()=="text")
@@ -58,8 +59,6 @@ void Dropdown::autosize_special(const Part &part, Geometry &ageom)
                unsigned line_height = static_cast<unsigned>((font.get_ascent()-font.get_descent())*font_size);
                ageom.h = max(ageom.h, line_height+margin.top+margin.bottom);
        }
                unsigned line_height = static_cast<unsigned>((font.get_ascent()-font.get_descent())*font_size);
                ageom.h = max(ageom.h, line_height+margin.top+margin.bottom);
        }
-
-       rebuild();
 }
 
 void Dropdown::set_selected_index(int index)
 }
 
 void Dropdown::set_selected_index(int index)
index 06aefa5af96d32cc0b6b3cc0d590bb092298164b..24c62cf862254136bcf0de2ed112ecc81b55882e 100644 (file)
@@ -39,7 +39,7 @@ public:
        virtual const char *get_class() const { return "dropdown"; }
 
 private:
        virtual const char *get_class() const { return "dropdown"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
 
 public:
        void set_data(ListData &d) { list.set_data(d); }
 
 public:
        void set_data(ListData &d) { list.set_data(d); }
index f21aacbd07beff04c64aae4be124bdfab4e138fd..1198bdee52b34d3e2057232e8b12e4c65c6791a7 100644 (file)
@@ -28,7 +28,7 @@ Entry::Entry(const string &t):
        set_text(t);
 }
 
        set_text(t);
 }
 
-void Entry::autosize_special(const Part &part, Geometry &ageom)
+void Entry::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="text")
        {
 {
        if(part.get_name()=="text")
        {
index 4854340a14f730a1fe90fcc9c847be1ce87514ce..541675f7cb60799a3bf7cb3b50ef55154079aa78 100644 (file)
@@ -51,7 +51,7 @@ public:
        virtual const char *get_class() const { return "entry"; }
 
 private:
        virtual const char *get_class() const { return "entry"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
 
 public:
        void set_text(const std::string &);
 
 public:
        void set_text(const std::string &);
index 2c6e968695439603031234b045dfb3ded26fc458..dcb7634da9e633b751df9315f36bc5c5088d7e1d 100644 (file)
@@ -12,7 +12,7 @@ HSlider::HSlider():
        slider_size(1)
 { }
 
        slider_size(1)
 { }
 
-void HSlider::autosize_special(const Part &part, Geometry &ageom)
+void HSlider::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="slider")
        {
 {
        if(part.get_name()=="slider")
        {
index cadae5941d09c1974c1c701396d85c28813f7ff2..774c7369d418841d226afa833e3a9348ede6050a 100644 (file)
@@ -21,7 +21,7 @@ public:
        virtual const char *get_class() const { return "hslider"; }
 
 private:
        virtual const char *get_class() const { return "hslider"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
        virtual void rebuild_special(const Part &);
 
 public:
        virtual void rebuild_special(const Part &);
 
 public:
index 8e14328c84b85aa073661cdb2dede39806715f20..5dcb2e3f5b84b8e727a98b3aa6180c3642b35a24 100644 (file)
@@ -15,7 +15,7 @@ Image::Image(const GL::Texture2D *i):
        focusable = false;
 }
 
        focusable = false;
 }
 
-void Image::autosize_special(const Part &part, Geometry &ageom)
+void Image::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="image")
        {
 {
        if(part.get_name()=="image")
        {
index 8c5a9d5bc8ff40e8e6858ffca8e4dd27fcceaeda..3194216d8bff06b1b69cd7b04db12272d79d6b28 100644 (file)
@@ -22,7 +22,7 @@ public:
        virtual const char *get_class() const { return "image"; }
 
 private:
        virtual const char *get_class() const { return "image"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
 
 public:
        void set_image(const GL::Texture2D *);
 
 public:
        void set_image(const GL::Texture2D *);
index 2de02f638249de9f7c544cc257c79b11f05300be..c59e71851d3ceaee9b91ce71203087b79220e35d 100644 (file)
@@ -20,7 +20,7 @@ void Label::set_text(const string &t)
        rebuild();
 }
 
        rebuild();
 }
 
-void Label::autosize_special(const Part &part, Geometry &ageom)
+void Label::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="text")
                text.autosize(part, ageom);
 {
        if(part.get_name()=="text")
                text.autosize(part, ageom);
index f2279340adabf37555c683b01686814b3f6d9b82..e3cff690005fd358a24b8088a7dc902701d96dbd 100644 (file)
@@ -32,7 +32,7 @@ public:
        void set_text(const std::string &);
 
 private:
        void set_text(const std::string &);
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
        virtual void rebuild_special(const Part &);
 
        virtual void on_style_change();
        virtual void rebuild_special(const Part &);
 
        virtual void on_style_change();
index 5ebb55ccf4f8822de2423427d4c795c8d906ecf8..bee972d903ab242415f992767247e425e9109922 100644 (file)
@@ -470,16 +470,13 @@ Layout::Slot::Slot(Layout &l, Widget &w):
 
 void Layout::Slot::autosize_changed()
 {
 
 void Layout::Slot::autosize_changed()
 {
-       widget.autosize();
-       autosize_geom = widget.get_geometry();
+       widget.autosize(autosize_geom);
 
        if(!widget.is_visible() && !ghost)
                return;
 
 
        if(!widget.is_visible() && !ghost)
                return;
 
-       // If the widget fits in the area it had, just leave it there.
-       if(autosize_geom.w<=geom.w && autosize_geom.h<=geom.h)
-               widget.set_geometry(geom);
-       else
+       // Only trigger an update if the widget won't fit in its current area.
+       if(autosize_geom.w>geom.w || autosize_geom.h>geom.h)
        {
                layout.container->signal_autosize_changed.emit();
                layout.update();
        {
                layout.container->signal_autosize_changed.emit();
                layout.update();
index 653a40c92bc1195e7b75276a50f08fc37891ff29..461d5e425c3076426f8ad51029ee971825cf396f 100644 (file)
@@ -55,7 +55,7 @@ List::~List()
                delete data;
 }
 
                delete data;
 }
 
-void List::autosize_special(const Part &part, Geometry &ageom)
+void List::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="items")
        {
 {
        if(part.get_name()=="items")
        {
@@ -344,7 +344,7 @@ void List::DataObserver::refresh_item(unsigned i)
 }
 
 
 }
 
 
-void List::Item::autosize_special(const Part &part, Geometry &ageom)
+void List::Item::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="children")
        {
 {
        if(part.get_name()=="children")
        {
index dd3ddaa6d5e12100deff93187e068af07eaf1ceb..6f6aec1f9dcf50d2dd5b5ead0fb66db4790b5d72 100644 (file)
@@ -61,7 +61,7 @@ public:
                virtual const char *get_class() const { return "listitem"; }
 
        protected:
                virtual const char *get_class() const { return "listitem"; }
 
        protected:
-               virtual void autosize_special(const Part &, Geometry &);
+               virtual void autosize_special(const Part &, Geometry &) const;
        public:
                void set_active(bool);
 
        public:
                void set_active(bool);
 
@@ -145,7 +145,7 @@ public:
        virtual const char *get_class() const { return "list"; }
 
 private:
        virtual const char *get_class() const { return "list"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
 
 public:
        void set_data(ListData &);
 
 public:
        void set_data(ListData &);
index 23657de506c6fc42f7bd8c02d8cadf07f28b201a..f1eef110848abed72e114742ea2ff24b6e2ead11 100644 (file)
@@ -41,7 +41,7 @@ void Panel::set_layout(Layout *l)
        layout = l;
 }
 
        layout = l;
 }
 
-void Panel::autosize_special(const Part &part, Geometry &ageom)
+void Panel::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="children" && layout)
                layout->autosize(ageom);
 {
        if(part.get_name()=="children" && layout)
                layout->autosize(ageom);
index d224596098d95b05dc281e925abc95b9f380a9b6..165cc6ad50f497cfe35f49f45502a6bfc6c639f4 100644 (file)
@@ -68,7 +68,7 @@ public:
        Layout *get_layout() { return layout; }
 
 protected:
        Layout *get_layout() { return layout; }
 
 protected:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
        virtual void render_special(const Part &, GL::Renderer &) const;
 
        virtual void on_geometry_change();
        virtual void render_special(const Part &, GL::Renderer &) const;
 
        virtual void on_geometry_change();
index 988b0a50eef4e1898fdb70f5f7e798affcce1109..b597eb99d32ad73eb02123e2fa83429d7836977f 100644 (file)
@@ -17,7 +17,7 @@ Toggle::Toggle(const string &t):
        set_text(t);
 }
 
        set_text(t);
 }
 
-void Toggle::autosize_special(const Part &part, Geometry &ageom)
+void Toggle::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="text")
                text.autosize(part, ageom);
 {
        if(part.get_name()=="text")
                text.autosize(part, ageom);
index 9bba26863a42b281aa4b8b1eba3d67b4f701663e..54becb9a3d1200c6b600d144875c2bf4ce53daa2 100644 (file)
@@ -37,7 +37,7 @@ public:
        virtual const char *get_class() const { return "toggle"; }
 
 private:
        virtual const char *get_class() const { return "toggle"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
 
 public:
        void set_text(const std::string &);
 
 public:
        void set_text(const std::string &);
index e4c40d8123385ed283c1a1089a1c1346c627d946..d32c57d1aa91b9d25c919f9d3f592b0dee9eb327 100644 (file)
@@ -12,7 +12,7 @@ VSlider::VSlider():
        slider_size(1)
 { }
 
        slider_size(1)
 { }
 
-void VSlider::autosize_special(const Part &part, Geometry &ageom)
+void VSlider::autosize_special(const Part &part, Geometry &ageom) const
 {
        if(part.get_name()=="slider")
        {
 {
        if(part.get_name()=="slider")
        {
index a994aac88f53a66825f43ff1b478c255916eca50..ee12689ff0afb8b152e89ac10cae237b3c6a1b7f 100644 (file)
@@ -17,7 +17,7 @@ public:
        virtual const char *get_class() const { return "vslider"; }
 
 private:
        virtual const char *get_class() const { return "vslider"; }
 
 private:
-       virtual void autosize_special(const Part &, Geometry &);
+       virtual void autosize_special(const Part &, Geometry &) const;
        virtual void rebuild_special(const Part &);
 
 public:
        virtual void rebuild_special(const Part &);
 
 public:
index 59105b949b3e09d027b6c9a78ed34e228f764aa2..e5c58a25d4e3b2000c29e1a2c92f0b79cc9970b2 100644 (file)
@@ -39,13 +39,18 @@ void Widget::set_size(unsigned w, unsigned h)
 }
 
 void Widget::autosize()
 }
 
 void Widget::autosize()
+{
+       Geometry ageom;
+       autosize(ageom);
+       set_geometry(ageom);
+}
+
+void Widget::autosize(Geometry &ageom) const
 {
        if(!style)
                return;
 
 {
        if(!style)
                return;
 
-       Geometry ageom;
-       ageom.x = geom.x;
-       ageom.y = geom.y;
+       ageom = Geometry(geom.x, geom.y, 0, 0);
        const Style::PartSeq &parts = style->get_parts();
        for(Style::PartSeq::const_iterator i=parts.begin(); i!=parts.end(); ++i)
        {
        const Style::PartSeq &parts = style->get_parts();
        for(Style::PartSeq::const_iterator i=parts.begin(); i!=parts.end(); ++i)
        {
@@ -59,8 +64,6 @@ void Widget::autosize()
                else
                        autosize_special(*i, ageom);
        }
                else
                        autosize_special(*i, ageom);
        }
-
-       set_geometry(ageom);
 }
 
 void Widget::set_geometry(const Geometry &g)
 }
 
 void Widget::set_geometry(const Geometry &g)
index 461cafe232781b1fb490a93bf85e19785ed4e961..9caae9fb6216180654c9165dbe1893f2f1fec999 100644 (file)
@@ -65,8 +65,9 @@ public:
        void set_position(int, int);
        void set_size(unsigned, unsigned);
        void autosize();
        void set_position(int, int);
        void set_size(unsigned, unsigned);
        void autosize();
+       void autosize(Geometry &) const;
 protected:
 protected:
-       virtual void autosize_special(const Part &, Geometry &) { }
+       virtual void autosize_special(const Part &, Geometry &) const { };
 public:
        void set_geometry(const Geometry &);
        const Geometry &get_geometry() const { return geom; }
 public:
        void set_geometry(const Geometry &);
        const Geometry &get_geometry() const { return geom; }