FLTK logo

Re: OpenGL window in Fl_Wizard

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.opengl  ]
 
Previous Message ]New Message | Reply ]Next Message ]

Re: OpenGL window in Fl_Wizard Greg Ercolano May 19, 2012  
 
On 05/18/12 23:21, david_aiken-/E1597aS9LQAvxtiuMwx3w@public.gmane.org wrote:
> 1. the OpenGL window overlaps all of the wizard pages. It should only appear on the first page.

	Oh, and besides moving the creation of the window,
	I think your Fl_Group's are oddly positioned.

	Can you say why you're using:

            Fl_Group *g = new Fl_Group(0, H-60, W, 60);
	    :
            Fl_Group *g = new Fl_Group(0, H-60, W, 60);
	    :
            Fl_Group *g = new Fl_Group(0, H-60, W, 60);

	..instead of:

            Fl_Group *g = new Fl_Group(0, 0, W, H);
	    :
            Fl_Group *g = new Fl_Group(0, 0, W, H);
	    :
            Fl_Group *g = new Fl_Group(0, 0, W, H);

	I think if you use the latter, and the mod in my last post,
	things will work.

	I think if you were to change the box() type for your
	groups to FL_FLAT_BOX and set the color() to FL_RED,
	you'd see where the groups were being positioned, and
	why you were getting strange drawing artifacts.
	(children should be positioned within Fl_Group,
	and if they are positioned outside of it, they draw oddly)

	FWIW, the following works for me, and can be compiled
	with 'fltk-config --compile -use-gl foo.cxx'.
	Changed the casing on some of the include files
	to get it to build on linux (which cares about case).

	I'm only resolving question #1 and #3, #2 is a separate
	issue that is pretty well covered elsewhere on resizable()
	behavior, eg: http://fltk.org/articles.php?L415

---------------------------------------------------------------------

#include <stdlib.h>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Gl_Window.H>
#include <FL/Fl_Group.H>
#include <FL/Fl_Wizard.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Multiline_Output.H>
#include <FL/gl.h>

class MyGlWindow : public Fl_Gl_Window {
    // FIX OPENGL VIEWPORT
    //     Do this on init or when window's size is changed
    void FixViewport(int W,int H) {
        glLoadIdentity();
        glViewport(0,0,W,H);
        glOrtho(-W,W,-H,H,-1,1);
    }
    // DRAW METHOD
    void draw() {
        if (!valid()) { valid(1); FixViewport(w(), h()); }      // first time? init
        // Clear screen to bg color
        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);
        // Draw 'X' in fg color
        glColor3f(1, 1, 1);
        glBegin(GL_LINE_STRIP); glVertex2f(w(), h()); glVertex2f(-w(),-h()); glEnd();
        glBegin(GL_LINE_STRIP); glVertex2f(w(),-h()); glVertex2f(-w(), h()); glEnd();
    }
    // HANDLE WINDOW RESIZING
    void resize(int X,int Y,int W,int H) {
        Fl_Gl_Window::resize(X,Y,W,H);
        FixViewport(W,H);
        redraw();
    }

public:
    // OPENGL WINDOW CONSTRUCTOR
    MyGlWindow(int X,int Y,int W,int H,const char*L=0) : Fl_Gl_Window(X,Y,W,H,L) {
        end();
    }
};

Fl_Wizard *G_wiz = 0;

void back_cb(Fl_Widget*,void*) {
    G_wiz->prev();
}

void next_cb(Fl_Widget*,void*) {
    G_wiz->next();
}

void done_cb(Fl_Widget*,void*) {
    exit(0);
}


class MyAppWindow : public Fl_Window {
    MyGlWindow *mygl;                    // opengl window
public:
    // APP WINDOW CONSTRUCTOR
    MyAppWindow(int W,int H,const char*L=0) : Fl_Window(W,H,L) {
        G_wiz = new Fl_Wizard(0,0,W,H);

        // Wizard: page 1
        {
            Fl_Group *g = new Fl_Group(0, 0, W, H);
            Fl_Button *next = new Fl_Button(290,H-30,100,25,"Next"); next->callback(next_cb);
            mygl = new MyGlWindow(10, 10, W-20, H-80);
            g->end();
        }
        // Wizard: page 2
        G_wiz->begin();
        {
            Fl_Group *g = new Fl_Group(0,0,W,H);
            Fl_Button *next = new Fl_Button(290,H-30,100,25,"Next"); next->callback(next_cb);
            Fl_Button *back = new Fl_Button(120,H-30,100,25,"Back"); back->callback(back_cb);
            Fl_Multiline_Output *out = new Fl_Multiline_Output(10,30,W-20,H-80,"Terms And Conditions");
            out->labelsize(20);
            out->align(FL_ALIGN_TOP|FL_ALIGN_LEFT);
            out->value("This is the Second page");
            g->end();
        }
        G_wiz->end();
        // Wizard: page 3
        G_wiz->begin();
        {
            Fl_Group *g = new Fl_Group(0,0,W,H);
            Fl_Button *done = new Fl_Button(290,H-30,100,25,"Finish"); done->callback(done_cb);
            Fl_Button *back = new Fl_Button(120,H-30,100,25,"Back"); back->callback(back_cb);
            Fl_Multiline_Output *out = new Fl_Multiline_Output(10,30,W-20,H-80,"Finish");
            out->labelsize(20);
            out->align(FL_ALIGN_TOP|FL_ALIGN_LEFT);
            out->value("This is the Last page");
            g->end();
        }
        G_wiz->end();
        end();
    }
};
// Simple 'wizard' using fltk's new Fl_Wizard widget
Fl_Window *G_win = 0;
int main(int argc, char **argv) {
    int w = 500, h=300;
    G_win = new MyAppWindow(w,h,"Example Wizard");
    G_win->resizable(G_win);
    G_win->end();
    G_win->show(argc, argv);
    return Fl::run();
}
Direct Link to Message ]
 
     
Previous Message ]New Message | Reply ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.