]> git.tdb.fi Git - libs/gltk.git/commitdiff
Add icon support to Button
authorMikko Rasa <tdb@tdb.fi>
Sun, 5 Jul 2009 20:29:10 +0000 (20:29 +0000)
committerMikko Rasa <tdb@tdb.fi>
Sun, 5 Jul 2009 20:29:10 +0000 (20:29 +0000)
Make Root take const Resources &
Propatage pointer grabs up the widget stack

source/button.cpp
source/button.h
source/panel.cpp
source/root.cpp
source/root.h

index f6cf56c1f07ecbd8b0fa41a7b49e13d269b50156..ec9901620d5d562ffd3b820316f69c0c2f829d44 100644 (file)
@@ -1,10 +1,11 @@
 /* $Id$
 
 This file is part of libmspgltk
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007, 2009  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
+#include <msp/gl/immediate.h>
 #include "button.h"
 #include "part.h"
 
@@ -13,6 +14,7 @@ namespace GLtk {
 
 Button::Button(const Resources &r, const std::string &t):
        Widget(r),
+       icon(0),
        pressed(false)
 {
        set_text(t);
@@ -24,6 +26,11 @@ void Button::set_text(const std::string &t)
        text=t;
 }
 
+void Button::set_icon(const GL::Texture2D *i)
+{
+       icon=i;
+}
+
 void Button::button_press(int, int, unsigned btn)
 {
        if(btn==1)
@@ -60,6 +67,28 @@ void Button::render_special(const Part &part) const
 {
        if(part.get_name()=="text")
                render_text(part, text);
+       if(part.get_name()=="icon" && icon)
+       {
+               Geometry rgeom;
+               rgeom.w=icon->get_width();
+               rgeom.h=icon->get_height();
+               part.get_alignment().apply(rgeom, geom, part.get_margin());
+
+               icon->bind();
+               GL::Immediate imm((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2));
+               imm.color(1.0f, 1.0f, 1.0f);
+               imm.begin(GL::QUADS);
+               imm.texcoord(0, 0);
+               imm.vertex(rgeom.x, rgeom.y);
+               imm.texcoord(1, 0);
+               imm.vertex(rgeom.x+rgeom.w, rgeom.y);
+               imm.texcoord(1, 1);
+               imm.vertex(rgeom.x+rgeom.w, rgeom.y+rgeom.h);
+               imm.texcoord(0, 1);
+               imm.vertex(rgeom.x, rgeom.y+rgeom.h);
+               imm.end();
+               GL::Texture::unbind();
+       }
 }
 
 
index 4464c446b4a11d1859a37026b89f3e96d0d8b103..d13a4c094c22deade08f6fcbe9e0fcf4b656857a 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgltk
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007, 2009  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -9,6 +9,7 @@ Distributed under the LGPL
 #define MSP_GLTK_BUTTON_H_
 
 #include <sigc++/sigc++.h>
+#include <msp/gl/texture2d.h>
 #include "widget.h"
 
 namespace Msp {
@@ -30,6 +31,7 @@ public:
 
 private:
        std::string text;
+       const GL::Texture2D *icon;
        bool pressed;
 
 public:
@@ -37,6 +39,7 @@ public:
 
        Button(const Resources &, const std::string & =std::string());
        void set_text(const std::string &);
+       void set_icon(const GL::Texture2D *);
        virtual void button_press(int, int, unsigned);
        virtual void button_release(int, int, unsigned);
        virtual void pointer_motion(int, int);
index 97c9ca4f3438d336cc77f1104dcad9e2d379ecf2..a708873edbeb4a7df6e2a2a1b097dfb057df6ced 100644 (file)
@@ -163,7 +163,11 @@ void Panel::child_hidden(Widget &wdg)
 void Panel::grab_pointer(Widget &wdg)
 {
        if(pointer_grab==0 || pointer_focus==&wdg)
+       {
                set_pointer_focus(&wdg, 255);
+               if(parent)
+                       parent->grab_pointer(*this);
+       }
        else
                throw InvalidState("Pointer is already grabbed");
 }
@@ -171,7 +175,11 @@ void Panel::grab_pointer(Widget &wdg)
 void Panel::ungrab_pointer(Widget &wdg)
 {
        if(pointer_focus==&wdg)
+       {
                set_pointer_focus(0, 0);
+               if(parent)
+                       parent->ungrab_pointer(*this);
+       }
        else if(pointer_grab>0)
                throw Exception("Someone is trying to steal the pointer!");
 }
index 1c030e82c8c38f103fa5234bde231163fceb3706..9d02c4a70f4a1698124263f55414969573489f54 100644 (file)
@@ -11,7 +11,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace GLtk {
 
-Root::Root(Resources &r, Graphics::Window &w):
+Root::Root(const Resources &r, Graphics::Window &w):
        Panel(r),
        window(w)
 {
index 2248ab87a82ea3c46dfb8508f1c6f6c8610eeff2..94fb48320e13a72a371aa9edb1ad057c782738a2 100644 (file)
@@ -26,7 +26,7 @@ private:
        Graphics::Window &window;
 
 public:
-       Root(Resources &, Graphics::Window &);
+       Root(const Resources &, Graphics::Window &);
 private:
        virtual const char *get_class() const { return "root"; }
        void button_press_event(int, int, unsigned, unsigned);