You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

187 lines
5.1 KiB

#ifndef GFXGUI_INCLUDED // -*- C++ -*-
#define GFXGUI_INCLUDED
#if !defined(__GNUC__)
# pragma once
#endif
/************************************************************************
Minimalist GUI framework.
This package implements a baseline GUI framework for use in
GFX-based applications. Only a very specific kind of interface is
supported: one where the application window consists primarily of an
OpenGL drawing canvas.
$Id: gui.h 443 2005-06-14 00:53:40Z garland $
************************************************************************/
#include "gl.h"
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Menu_Bar.H>
#include <FL/Fl_Gl_Window.H>
#include <FL/Fl_Output.H>
namespace gfx
{
class MxGUI;
class MxGLCanvas : public Fl_Gl_Window
{
private:
int last_click[2];
MxGUI *app;
public:
// Override selected FLTK window methods
//
virtual void draw();
virtual int handle(int event);
virtual void resize(int x, int y, int w, int h);
public:
MxGLCanvas(int x, int y, int w, int h, const char *label=NULL);
void attach_app(MxGUI *a);
};
class MxGUI
{
private:
int w_offset, h_offset;
Fl_Window *create_window(int xw=640, int yw=480, int pad=5);
public:
// This is the public interface of MxGUI available to the application.
//
Fl_Window *toplevel;
MxGLCanvas *canvas;
Fl_Output *status_line;
Fl_Menu_Bar *menu_bar;
Fl_Menu_Item *menu_layout;
float default_fps, target_fps;
static MxGUI *current; // There should only be one.
MxGUI();
virtual ~MxGUI() {}
virtual void initialize(int argc, char **argv,
Fl_Menu_Item *layout=NULL,
int xw=640, int yw=480);
virtual int run();
int status(const char *fmt, ...);
void animate(bool will);
bool snapshot_to_file(int format, const char *filenamep=NULL);
void resize_canvas(int width, int height);
void lock_size();
void unlock_size();
void title(const char *l) { toplevel->label(l); }
// Menu construction and standard callbacks
int add_menu(const std::string&, int key, Fl_Callback *cb, int flags=0);
int add_toggle_menu(const std::string&, int key, bool& val, int flags=0);
static void cb_toggle(Fl_Menu_ *m, bool *flag);
public:
//
// Callback functions that get executed in response to menu commands.
virtual void cb_new();
virtual void cb_exit();
virtual void cb_snapshot(int);
virtual void cb_animate(Fl_Menu_ *m);
virtual void cb_fps();
virtual void cb_vga_size(int width); // uses 4:3 aspect ratio
virtual void cb_hdtv_size(int width); // uses 16:9 aspect ratio
virtual void cb_dv_size(int width); // uses 3:2 aspect ratio
virtual void cb_save_view_to_file();
virtual void cb_load_view_from_file();
virtual bool save_view_to_file();
virtual bool load_view_from_file();
public:
//
// Applications are customized by overriding the following methods.
// Override these methods to control the contents of the GL canvas
virtual void setup_for_drawing();
virtual void draw_contents();
virtual void update_animation();
// Override these methods to receive events from the GL canvas
virtual bool mouse_down(int *where, int which);
virtual bool mouse_up(int *where, int which);
virtual bool mouse_drag(int *where, int *last, int which);
virtual bool key_press(int key);
// Override these methods to get command line arguments
virtual int cmdline_option(int argc, char **argv, int& index);
virtual void cmdline_file(const char *file);
// Override these methods to add custom interface elements
virtual void add_upper_controls(int& yfill, const int pad) {}
virtual void add_lower_controls(int& yfill, const int pad) {}
// Override this method to free memory, close files, etc.
virtual void cleanup_for_exit() {}
};
////////////////////////////////////////////////////////////////////////
//
// This template makes it easier to create FLTK-compliant callbacks.
// In particular, its purpose is to construct static thunks for
// calling member functions of MxGUI-derived classes.
//
template<class Gui>
struct MxBinder
{
typedef void (Gui::*GuiCommand)();
typedef void (Gui::*GuiCommand1)(int);
typedef void (Gui::*GuiCommand2)(Fl_Menu_ *);
template<GuiCommand cmd>
static void to(Fl_Widget *, void *data)
{
Gui *gui = static_cast<Gui*>(data);
(gui->*cmd)();
gui->canvas->redraw();
}
template<GuiCommand2 cmd>
static void to_menu(Fl_Widget *w, void *data)
{
Gui *gui = static_cast<Gui*>(data);
(gui->*cmd)(static_cast<Fl_Menu_ *>(w));
gui->canvas->redraw();
}
template<GuiCommand1 cmd, int i>
static void to_arg(Fl_Widget *, void *data)
{
Gui *gui = static_cast<Gui*>(data);
(gui->*cmd)(i);
gui->canvas->redraw();
}
};
////////////////////////////////////////////////////////////////////////
//
// These macros make static FLTK menu definitions look a little nicer.
//
#define MXGUI_BEGIN_MENU(name) {name, 0, 0, 0, FL_SUBMENU},
#define MXGUI_END_MENU {0},
#define MXGUI_FINISH_MENUBAR {0}
} // namespace gfx
// GFXGUI_INCLUDED
#endif