benoitrigolleau@132
|
1 #include <vector>
|
benoitrigolleau@132
|
2 #include <cstdlib>
|
benoitrigolleau@132
|
3 #include <ctime>
|
benoitrigolleau@132
|
4 #include "SDLWidget.h"
|
ivand_qmul@150
|
5 float zoomFivan=1;
|
ivand_qmul@150
|
6
|
ivand_qmul@150
|
7
|
benoitrigolleau@132
|
8
|
benoitrigolleau@132
|
9 SDLWidget::SDLWidget()
|
benoitrigolleau@145
|
10 :windowInitialized(false), screen(0),m_width(0), m_height(0)
|
ivand_qmul@150
|
11 {
|
ivand_qmul@150
|
12 setAttribute(Qt::WA_PaintOnScreen);
|
benoitrigolleau@132
|
13 setAttribute(Qt::WA_NoSystemBackground);
|
benoitrigolleau@152
|
14 m_zoomFactor = 1;
|
benoitrigolleau@145
|
15 connect(this,SIGNAL(initSizeChanged()),this,SLOT(updateMinSize()));
|
benoitrigolleau@139
|
16
|
benoitrigolleau@132
|
17 }
|
benoitrigolleau@132
|
18
|
benoitrigolleau@132
|
19 SDLWidget::~SDLWidget()
|
benoitrigolleau@132
|
20 {
|
benoitrigolleau@132
|
21 SDL_Quit();
|
benoitrigolleau@132
|
22 }
|
benoitrigolleau@132
|
23
|
ivand_qmul@150
|
24 void SDLWidget::setZoomFactor( float f )
|
ivand_qmul@150
|
25 {
|
ivand_qmul@150
|
26 int w, h;
|
ivand_qmul@150
|
27
|
benoitrigolleau@151
|
28 if( f == m_zoomFactor )
|
ivand_qmul@150
|
29 return;
|
ivand_qmul@150
|
30
|
benoitrigolleau@151
|
31 m_zoomFactor = f;
|
ivand_qmul@150
|
32
|
benoitrigolleau@152
|
33 w = m_width*m_zoomFactor;
|
benoitrigolleau@152
|
34 h = m_height*m_zoomFactor;
|
ivand_qmul@150
|
35 setMinimumSize( w, h );
|
ivand_qmul@150
|
36 emit(sizeChanged(w,h));
|
ivand_qmul@150
|
37 emit(zoomfactorChanged(f));
|
ivand_qmul@150
|
38
|
ivand_qmul@150
|
39 /*QWidget *p = dynamic_cast<QWidget*>( parent() );
|
ivand_qmul@150
|
40 if( p ){
|
ivand_qmul@150
|
41 resize( p->width(), p->height() );
|
ivand_qmul@150
|
42 }*/
|
benoitrigolleau@139
|
43 }
|
benoitrigolleau@139
|
44
|
ivand_qmul@150
|
45 void SDLWidget::wheelEvent( QWheelEvent *event )
|
ivand_qmul@150
|
46 {
|
ivand_qmul@150
|
47 float f;
|
ivand_qmul@150
|
48
|
benoitrigolleau@151
|
49 f = m_zoomFactor + 0.001*event->delta();
|
benoitrigolleau@151
|
50
|
ivand_qmul@150
|
51 if( f < 32.0/m_width ){
|
ivand_qmul@150
|
52 f = 32.0/m_height;
|
ivand_qmul@150
|
53 }
|
benoitrigolleau@151
|
54 if((int)(m_width*f)%4){
|
benoitrigolleau@151
|
55 f = (m_width*f - (int)(m_width*f)%4)/m_width;
|
benoitrigolleau@151
|
56 }
|
ivand_qmul@150
|
57 zoomFivan=f;
|
ivand_qmul@150
|
58 setZoomFactor( f );
|
benoitrigolleau@139
|
59 }
|
benoitrigolleau@139
|
60
|
benoitrigolleau@145
|
61 void SDLWidget::setInitSize(int w, int h){
|
benoitrigolleau@145
|
62 if(m_width<=0 && m_height<=0){
|
benoitrigolleau@145
|
63 m_width = w;
|
benoitrigolleau@145
|
64 m_height =h;
|
benoitrigolleau@145
|
65 emit(initSizeChanged());
|
benoitrigolleau@145
|
66 }
|
benoitrigolleau@145
|
67 }
|
benoitrigolleau@145
|
68
|
benoitrigolleau@145
|
69 void SDLWidget::updateMinSize()
|
benoitrigolleau@145
|
70 {
|
benoitrigolleau@151
|
71 setMinimumSize( m_width*m_zoomFactor,m_height*m_zoomFactor );
|
benoitrigolleau@145
|
72 }
|
benoitrigolleau@145
|
73
|
benoitrigolleau@145
|
74
|
benoitrigolleau@139
|
75
|
benoitrigolleau@132
|
76 void SDLWidget::showEvent(QShowEvent *e)
|
ivand_qmul@150
|
77 {
|
benoitrigolleau@132
|
78 (void)e;
|
ivand_qmul@138
|
79
|
benoitrigolleau@132
|
80 if(!windowInitialized)
|
benoitrigolleau@132
|
81 {
|
benoitrigolleau@132
|
82 // it's here the link between SDL and QT
|
ivand_qmul@150
|
83 char windowid[64];
|
benoitrigolleau@132
|
84 #ifdef Q_WS_WIN
|
ivand_qmul@150
|
85 sprintf(windowid, "SDL_WINDOWID=0x%lx", reinterpret_cast<qlonglong>(winId()));
|
ivand_qmul@150
|
86 #elif defined Q_WS_X11
|
ivand_qmul@150
|
87 sprintf(windowid, "SDL_WINDOWID=0x%lx", winId());
|
ivand_qmul@150
|
88 #else
|
ivand_qmul@150
|
89 qFatal("uncorrect window ID");
|
benoitrigolleau@132
|
90 #endif
|
benoitrigolleau@132
|
91 SDL_putenv(windowid);
|
benoitrigolleau@132
|
92
|
benoitrigolleau@132
|
93 //SDL_Init(SDL_INIT_VIDEO);
|
benoitrigolleau@132
|
94 //screen = SDL_SetVideoMode(width(), height(), 32, SDL_SWSURFACE);
|
benoitrigolleau@132
|
95 windowInitialized = true;
|
benoitrigolleau@132
|
96 }
|
benoitrigolleau@139
|
97 }
|
benoitrigolleau@139
|
98
|