#include <unistd.h>
//#include "GL/glew.h"
#include "GLUT/glut.h"
#include "TDT/application.h"
#include "TDT/window.h"
class Widget
{
public:
int x, y, w, h;
Widget() : hasFocus(false), x(20), y(20), w(50), h(50)
{
}
void paintEvent()
{
}
void enterEvent()
{
}
void leaveEvent()
{
}
virtual void mousePressEvent(int button, int x, int y)
{
printf("widget mouse down\n");
}
virtual void mouseReleaseEvent(int button, int x, int y)
{
printf("widget mouse up\n");
}
void mouseMoveEvent()
{
}
virtual void keyPressEvent(int cAscii, int x, int y)
{
}
bool hasFocus;
};
class myWindow : public TDT::Window
{
public:
myWindow()
{
widgets = new Widget *;
widgets[0] = new Widget;
widgetCount = 1;
setGeometry(50, 50, 100, 100);
}
virtual void paintEvent(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
printf("repainting\n");
int *pixels = (int*)backingStore();
if ( pixels ) {
for (int j = 0; j < height(); j++)
for (int i = 0; i < width(); i++)
pixels[j*width()+i] = (i << 8) | (j << 16);
glDrawPixels(width(), height(), GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, pixels);
}
float size = 0.25;
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f*size, -1.0f*size, -1.0f*size);
glVertex3f(+1.0f*size, -1.0f*size, -1.0f*size);
glVertex3f(+1.0f*size, +1.0f*size, -1.0f*size);
glEnd();
/*
if ( pixels ) {
for (int j = 0; j < height(); j++)
for (int i = 0; i < width(); i++)
pixels[j*width()+i] = (127 << 8) | (127 << 16) | (127 << 24) | 127;
glDrawPixels(width(), height(), GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, pixels);
}
*/
//glViewport( 50, 50, 100, 100 );
//glBegin(GL_POLYGON);
//glRectf(-0.5f,-0.5f,1.0f,1.0f);
//glRecti(-4000000,-4000000,50,50);
//glEnd();
//glViewport(-50, -50, 100, 100);
//glLoadIdentity();
//glTranslatef(-50.0, -50.0, 0.0);
//glPushMatrix();
//glWindowPos2(0, -5);
//glWindowPos2fARB(0.0, 10.0);
//glRasterPos4f(0.5, 0.5, 0.5, 0.5);
//glPixelTransferi(GL_UNPACK_SKIP_ROWS, 50);
//glPixelStorei(GL_UNPACK_SKIP_ROWS, 50);
//glPushMatrix();
///glLoadIdentity();
//glPushMatrix();
//glScalef(50.0, 50.0, 0.0f);
//glTranslatef(0.5f, 0.5f, 0.0f);
//glPushMatrix();
/*
glPopMatrix();
glPopMatrix();
glPopMatrix();
*/
glutSwapBuffers();
}
virtual void idleEvent()
{
//printf("idle\n");
usleep(100000);
}
virtual void resizeEvent(int w, int h)
{
printf("resizing\n");
}
virtual void closeEvent(void)
{
printf("closing\n");
}
bool pointInWidget(int x, int y, Widget *widget)
{
int w2 = widget->w / 2;
int h2 = widget->h / 2;
int centerX = widget->x + w2;
int centerY = widget->y + h2;
int radius = w2*w2 + h2*h2;
int dx = centerX - x;
int dy = centerY - y;
int dist = dx*dx + dy*dy;
if ( dist > radius )
return false;
int x2 = widget->x + widget->w;
int y2 = widget->y + widget->h;
return ( x >= widget->x && x < x2 && y >= widget->y && y < y2 );
}
virtual void mousePressEvent(int button, int x, int y)
{
printf("mouse down\n");
for (int i = 0; i < widgetCount; i++) {
if ( pointInWidget(x, y, widgets[i]) ) {
widgets[i]->mousePressEvent(button, x, y);
}
}
}
virtual void mouseReleaseEvent(int button, int x, int y)
{
printf("mouse up\n");
for (int i = 0; i < widgetCount; i++) {
if ( pointInWidget(x, y, widgets[i]) ) {
widgets[i]->mouseReleaseEvent(button, x, y);
}
}
}
virtual void keyPressEvent(int cAscii, int x, int y)
{
printf("on key down %i %i\n", x, y);
if (cAscii == 27) { // 0x1b = ESC
exit(0); // Close Window!
}
};
virtual void keyReleaseEvent(int cAscii, int x, int y)
{
printf("on key up %i %i\n", x, y);
if (cAscii == 'f') {
showFullScreen();
} else if (cAscii == 'w') {
showNormal();
}
};
Widget **widgets;
int widgetCount;
};
int main(int argc, char *argv[])
{
TDT::Application app(argc, argv);
myWindow *myWin1 = new myWindow();
myWindow *myWin2 = new myWindow();
return app.exec();
}