benoitrigolleau@132: #include benoitrigolleau@132: #include benoitrigolleau@132: #include benoitrigolleau@132: #include "SDLWidget.h" ivand_qmul@150: float zoomFivan=1; ivand_qmul@150: ivand_qmul@150: benoitrigolleau@132: benoitrigolleau@132: SDLWidget::SDLWidget() benoitrigolleau@145: :windowInitialized(false), screen(0),m_width(0), m_height(0) ivand_qmul@150: { ivand_qmul@150: setAttribute(Qt::WA_PaintOnScreen); benoitrigolleau@132: setAttribute(Qt::WA_NoSystemBackground); benoitrigolleau@152: m_zoomFactor = 1; benoitrigolleau@145: connect(this,SIGNAL(initSizeChanged()),this,SLOT(updateMinSize())); benoitrigolleau@139: benoitrigolleau@132: } benoitrigolleau@132: benoitrigolleau@132: SDLWidget::~SDLWidget() benoitrigolleau@132: { benoitrigolleau@132: SDL_Quit(); benoitrigolleau@132: } benoitrigolleau@132: ivand_qmul@150: void SDLWidget::setZoomFactor( float f ) ivand_qmul@150: { ivand_qmul@150: int w, h; ivand_qmul@150: benoitrigolleau@151: if( f == m_zoomFactor ) ivand_qmul@150: return; ivand_qmul@150: benoitrigolleau@151: m_zoomFactor = f; ivand_qmul@150: benoitrigolleau@152: w = m_width*m_zoomFactor; benoitrigolleau@152: h = m_height*m_zoomFactor; ivand_qmul@150: setMinimumSize( w, h ); ivand_qmul@150: emit(sizeChanged(w,h)); ivand_qmul@150: emit(zoomfactorChanged(f)); ivand_qmul@150: ivand_qmul@150: /*QWidget *p = dynamic_cast( parent() ); ivand_qmul@150: if( p ){ ivand_qmul@150: resize( p->width(), p->height() ); ivand_qmul@150: }*/ benoitrigolleau@139: } benoitrigolleau@139: ivand_qmul@150: void SDLWidget::wheelEvent( QWheelEvent *event ) ivand_qmul@150: { ivand_qmul@150: float f; ivand_qmul@150: benoitrigolleau@151: f = m_zoomFactor + 0.001*event->delta(); benoitrigolleau@151: ivand_qmul@150: if( f < 32.0/m_width ){ ivand_qmul@150: f = 32.0/m_height; ivand_qmul@150: } benoitrigolleau@151: if((int)(m_width*f)%4){ benoitrigolleau@151: f = (m_width*f - (int)(m_width*f)%4)/m_width; benoitrigolleau@151: } ivand_qmul@150: zoomFivan=f; ivand_qmul@150: setZoomFactor( f ); benoitrigolleau@139: } benoitrigolleau@139: benoitrigolleau@145: void SDLWidget::setInitSize(int w, int h){ benoitrigolleau@145: if(m_width<=0 && m_height<=0){ benoitrigolleau@145: m_width = w; benoitrigolleau@145: m_height =h; benoitrigolleau@145: emit(initSizeChanged()); benoitrigolleau@145: } benoitrigolleau@145: } benoitrigolleau@145: benoitrigolleau@145: void SDLWidget::updateMinSize() benoitrigolleau@145: { benoitrigolleau@151: setMinimumSize( m_width*m_zoomFactor,m_height*m_zoomFactor ); benoitrigolleau@145: } benoitrigolleau@145: benoitrigolleau@145: benoitrigolleau@139: benoitrigolleau@132: void SDLWidget::showEvent(QShowEvent *e) ivand_qmul@150: { benoitrigolleau@132: (void)e; ivand_qmul@138: benoitrigolleau@132: if(!windowInitialized) benoitrigolleau@132: { benoitrigolleau@132: // it's here the link between SDL and QT ivand_qmul@150: char windowid[64]; benoitrigolleau@132: #ifdef Q_WS_WIN ivand_qmul@150: sprintf(windowid, "SDL_WINDOWID=0x%lx", reinterpret_cast(winId())); ivand_qmul@150: #elif defined Q_WS_X11 ivand_qmul@150: sprintf(windowid, "SDL_WINDOWID=0x%lx", winId()); ivand_qmul@150: #else ivand_qmul@150: qFatal("uncorrect window ID"); benoitrigolleau@132: #endif benoitrigolleau@132: SDL_putenv(windowid); benoitrigolleau@132: benoitrigolleau@132: //SDL_Init(SDL_INIT_VIDEO); benoitrigolleau@132: //screen = SDL_SetVideoMode(width(), height(), 32, SDL_SWSURFACE); benoitrigolleau@132: windowInitialized = true; benoitrigolleau@132: } benoitrigolleau@139: } benoitrigolleau@139: