/* $Id$ This file is part of libmspgltk Copyright © 2008 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ /* A simple graphical Hello World application implemented with mspgltk. Demonstrates some of the most common widget types. */ #include #include #include #include #include #include #include #include #include #include using namespace Msp; // Application class. Because it's so much nicer than global variables. class HelloWorld: public Msp::Application { private: // An OpenGL window to display our widgets in Graphics::SimpleGLWindow wnd; // GLtk resources and widgets GLtk::Resources res; GLtk::Root root; GLtk::Entry *ent_name; GLtk::Label *lbl_hello; // Indicate our main class to the core library static Application::RegApp reg; public: HelloWorld(int, char **); private: virtual void tick(); void show_hello(); }; Application::RegApp HelloWorld::reg; HelloWorld::HelloWorld(int, char **): wnd(200, 200), // Load resources. This must be done before the root widget is created. res("basic.skin"), // A Root receives input from a Graphics::Window and passes it on root(res, wnd) { wnd.set_title("Hello World"); wnd.signal_close.connect(sigc::bind(sigc::mem_fun(this, &HelloWorld::exit), 0)); /* Container widgets will delete their contents upon destruction so we can safely forget about the pointers after setting the widgets up. */ // Panels can be used to divide the window into sub-areas GLtk::Panel *panel = new GLtk::Panel; root.add(*panel); panel->set_geometry(GLtk::Geometry(20, 20, 160, 160)); GLtk::Label *lbl; // Prompts can be displayed with Labels panel->add(*(lbl = new GLtk::Label("Type your name below:"))); lbl->set_geometry(GLtk::Geometry(10, 130, 140, 20)); // The user can type text into an Entry panel->add(*(ent_name = new GLtk::Entry)); ent_name->set_geometry(GLtk::Geometry(10, 110, 140, 20)); GLtk::Button *btn; // Buttons can be wired to cause things to happen panel->add(*(btn = new GLtk::Button("Hello"))); btn->set_geometry(GLtk::Geometry(10, 85, 140, 20)); btn->signal_clicked.connect(sigc::mem_fun(this, &HelloWorld::show_hello)); // Another label for displaying some information panel->add(*(lbl_hello = new GLtk::Label)); lbl_hello->set_geometry(GLtk::Geometry(10, 65, 140, 20)); // The user might want to exit the program (*gasp*) panel->add(*(btn = new GLtk::Button("Exit"))); btn->set_geometry(GLtk::Geometry(50, 10, 100, 20)); btn->signal_clicked.connect(sigc::bind(sigc::mem_fun(this, &HelloWorld::exit), 0)); // Done with setting things up, show the window! wnd.show(); } // This function will be called periodically from the main loop void HelloWorld::tick() { wnd.tick(); // Set up an orthogonal projection matching the root widget GL::MatrixStack::projection() = GL::Matrix::ortho_bottomleft(200, 200); GL::MatrixStack::modelview() = GL::Matrix(); // Font rendering requires blending GL::Bind bind_blend(GL::Blend::alpha()); root.render(); wnd.swap_buffers(); } // Displays a greeting to the user void HelloWorld::show_hello() { lbl_hello->set_text("Hello, "+ent_name->get_text()+"!"); }