/**********************************************************************
* *
* cgt - CAMP Graphics Toolbox, Copyright (C) 2012-2015 *
* Chair for Computer Aided Medical Procedures *
* Technische Universitaet Muenchen, Germany. *
* *
* *
* forked from tgt - Tiny Graphics Toolbox, Copyright (C) 2006-2011 *
* Visualization and Computer Graphics Group, Department of *
* Computer Science, University of Muenster, Germany. *
* *
* *
* This file is part of the cgt library. This library is free *
* software; you can redistribute it and/or modify it under the terms *
* of the GNU Lesser General Public License version 2.1 as published *
* by the Free Software Foundation. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License in the file "LICENSE.txt" along with this library. *
* If not, see . *
* *
**********************************************************************/
#include "qtcanvas.h"
#include
namespace cgt {
// shared context widget
QGLWidget* QtCanvas::shareWidget_ = 0;
QtCanvas::QtCanvas(const std::string& title,
const ivec2& size,
const Buffers buffers,
QWidget* parent, bool shared, Qt::WindowFlags f, char* /*name*/)
: QGLWidget(getQGLFormat(buffers), 0, (shared ? shareWidget_ : 0), f)
, GLCanvas(title, size, buffers)
{
resize(size.x, size.y);
if (shared && shareWidget_ == 0)
shareWidget_ = this;
setWindowTitle(QString(title.c_str()));
setFocusPolicy(Qt::StrongFocus);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// we have our own AutoBufferSwap-mechanism (GLCanvas::setAutoFlush), so disable the one of qt
setAutoBufferSwap(false);
rgbaSize_ = ivec4(format().redBufferSize(),
format().greenBufferSize(),
format().blueBufferSize(),
format().alphaBufferSize());
stencilSize_ = format().stencilBufferSize();
depthSize_ = format().depthBufferSize();
doubleBuffered_ = doubleBuffer();
stereoViewing_ = format().stereo();
connect(this, &QtCanvas::s_sizeChangedExternally, this, &QtCanvas::sizeChangedExternally);
connect(this, &QtCanvas::fullScreenChanged, this, &QtCanvas::changeFullScreen);
}
QtCanvas::QtCanvas(QWidget* parent, bool shared, Qt::WindowFlags f, char* /*name*/)
: QGLWidget(getQGLFormat(), 0, (shared ? shareWidget_ : 0), f)
{
if (shared && shareWidget_ == 0)
shareWidget_ = this;
// we have our own AutoBufferSwap-mechanism (GLCanvas::setAutoFlush), so disable the one of qt
setAutoBufferSwap(false);
rgbaSize_ = ivec4(format().redBufferSize(),
format().greenBufferSize(),
format().blueBufferSize(),
format().alphaBufferSize());
stencilSize_ = format().stencilBufferSize();
depthSize_ = format().depthBufferSize();
doubleBuffered_ = doubleBuffer();
stereoViewing_ = format().stereo();
}
QtCanvas::~QtCanvas() {}
void QtCanvas::moveThreadAffinity(void* threadPointer) {
QThread* qThreadPointer = static_cast(threadPointer);
this->context()->moveToThread(qThreadPointer);
}
void* QtCanvas::getCurrentThreadPointer() {
return QThread::currentThread();
}
void QtCanvas::initializeGL() {
}
void QtCanvas::resizeGL(int w, int h) {
sizeChanged(ivec2(w, h));
}
void QtCanvas::paintGL() {
paint();
}
void QtCanvas::repaint() {
updateGL();
}
void QtCanvas::update() {
QWidget::update();
}
void QtCanvas::swap() {
QGLWidget::swapBuffers();
QGLWidget::makeCurrent();
}
void QtCanvas::toggleFullScreen() {
if (fullscreen_) {
fullscreen_ = false;
//showNormal();
}
else {
//showFullScreen();
fullscreen_ = !fullscreen_;
}
emit fullScreenChanged(fullscreen_); // emit a Qt signal to process the GUI changes
};
/*
These functions are called by qt if there is a user-caused event, like the pressing of a
mouse-button, as in this case. The press-event has to be turned into a cgt::MouseEvent and
handled: Either by a custom eventloop, or by directly broadcasting it to all eventlisteners
that are associated with this canvas. The same is true for the other event-handling
methods.
*/
void QtCanvas::enterEvent(QEvent* /*e*/) {
cgt::MouseEvent* enterEv = new cgt::MouseEvent(0, 0, cgt::MouseEvent::ENTER,
cgt::MouseEvent::MODIFIER_NONE, cgt::MouseEvent::MOUSE_BUTTON_NONE, cgt::ivec2(width(), height()));
eventHandler_->broadcastEvent(enterEv);
}
void QtCanvas::leaveEvent(QEvent* /*e*/) {
cgt::MouseEvent* leaveEv = new cgt::MouseEvent(0, 0, cgt::MouseEvent::EXIT,
cgt::MouseEvent::MODIFIER_NONE, cgt::MouseEvent::MOUSE_BUTTON_NONE, cgt::ivec2(width(), height()));
eventHandler_->broadcastEvent(leaveEv);
}
void QtCanvas::mousePressEvent(QMouseEvent* e) {
cgt::MouseEvent* prEv = new cgt::MouseEvent(e->x(), e->y(), cgt::MouseEvent::PRESSED,
getModifier(e), getButton(e), cgt::ivec2(width(), height()));
eventHandler_->broadcastEvent(prEv);
}
// See mousePressEvent
void QtCanvas::mouseReleaseEvent (QMouseEvent* e) {
cgt::MouseEvent* relEv = new cgt::MouseEvent(e->x(), e->y(), cgt::MouseEvent::RELEASED,
getModifier(e), getButton(e), cgt::ivec2(width(), height()));
eventHandler_->broadcastEvent(relEv);
}
// See mousePressEvent
void QtCanvas::mouseMoveEvent(QMouseEvent* e) {
cgt::MouseEvent* movEv = new cgt::MouseEvent(e->x(), e->y(), cgt::MouseEvent::MOTION,
getModifier(e), getButtons(e), cgt::ivec2(width(), height())); // FIXME: submit information which mouse buttons are pressed
eventHandler_->broadcastEvent(movEv);
}
// See mousePressEvent
void QtCanvas::mouseDoubleClickEvent(QMouseEvent* e) {
cgt::MouseEvent* dcEv = new cgt::MouseEvent(e->x(), e->y(), cgt::MouseEvent::DOUBLECLICK,
getModifier(e), getButton(e), cgt::ivec2(width(), height()));
eventHandler_->broadcastEvent(dcEv);
}
// See mousePressEvent
// does not distinguish correctly between UP and DOWN => works fine in voreen!
void QtCanvas::wheelEvent(QWheelEvent* e) {
cgt::MouseEvent::MouseButtons b = cgt::MouseEvent::MOUSE_WHEEL_DOWN;
if (e->delta() > 0)
b = cgt::MouseEvent::MOUSE_WHEEL_UP;
cgt::MouseEvent* wheelEv = new cgt::MouseEvent(e->x(),e->y(), cgt::MouseEvent::WHEEL,
getModifier(e), b, cgt::ivec2(width(), height()));
eventHandler_->broadcastEvent(wheelEv);
}
// See mousePressEvent
void QtCanvas::keyPressEvent(QKeyEvent* event) {
if (event->key() == Qt::Key_Return && event->modifiers() == Qt::Modifier::ALT) {
toggleFullScreen();
event->accept();
}
else {
cgt::KeyEvent* ke = new cgt::KeyEvent(getKey(event->key()), getModifier(event), true);
eventHandler_->broadcastEvent(ke);
}
}
// See mousePressEvent
void QtCanvas::keyReleaseEvent(QKeyEvent* event) {
cgt::KeyEvent* ke = new cgt::KeyEvent(getKey(event->key()), getModifier(event), false);
eventHandler_->broadcastEvent(ke);
}
// yes, we need this in voreen FL
void QtCanvas::timerEvent(QTimerEvent* /*e*/) {
cgt::TimeEvent* te = new cgt::TimeEvent();
eventHandler_->broadcastEvent(te);
}
cgt::MouseEvent::MouseButtons QtCanvas::getButton(QMouseEvent* e) {
switch (e->button()) {
case Qt::LeftButton:
return cgt::MouseEvent::MOUSE_BUTTON_LEFT;
case Qt::RightButton:
return cgt::MouseEvent::MOUSE_BUTTON_RIGHT;
case Qt::MidButton:
return cgt::MouseEvent::MOUSE_BUTTON_MIDDLE;
default:
return cgt::MouseEvent::MOUSE_BUTTON_NONE;
}
}
cgt::MouseEvent::MouseButtons QtCanvas::getButtons(QMouseEvent* e) {
/*cgt::MouseEvent::MouseButtons*/ int buttons = cgt::MouseEvent::MOUSE_BUTTON_NONE;
if (e->buttons() & Qt::LeftButton)
buttons |= cgt::MouseEvent::MOUSE_BUTTON_LEFT;
if (e->buttons() & Qt::RightButton)
buttons |= cgt::MouseEvent::MOUSE_BUTTON_RIGHT;
if (e->buttons() & Qt::MidButton)
buttons |= cgt::MouseEvent::MOUSE_BUTTON_MIDDLE;
return static_cast(buttons);
}
cgt::Event::Modifier QtCanvas::getModifier(QInputEvent* e) {
int result = 0;
if (e->modifiers() & Qt::ControlModifier)
result |= int(cgt::Event::CTRL);
if (e->modifiers() & Qt::ShiftModifier)
result |= int(cgt::Event::SHIFT);
if (e->modifiers() & Qt::AltModifier)
result |= int(cgt::Event::ALT);
if (e->modifiers() & Qt::MetaModifier)
result |= int(cgt::Event::META);
if (e->modifiers() == Qt::NoModifier)
result = int(cgt::Event::MODIFIER_NONE);
return cgt::Event::Modifier(result);
}
QGLFormat QtCanvas::getQGLFormat(const Buffers buffers) {
QGLFormat format = getQGLFormat();
format.setAlpha(buffers & GLCanvas::ALPHA_BUFFER);
format.setDepth(buffers & GLCanvas::DEPTH_BUFFER);
format.setDoubleBuffer(buffers & GLCanvas::DOUBLE_BUFFER);
format.setStencil(buffers & GLCanvas::STENCIL_BUFFER);
format.setAccum(buffers & GLCanvas::ACCUM_BUFFER);
format.setStereo(buffers & GLCanvas::STEREO_VIEWING);
format.setSampleBuffers(buffers & GLCanvas::MULTISAMPLING);
return format;
}
QGLFormat QtCanvas::getQGLFormat()
{
QGLFormat format = QGLFormat(QGL::NoDeprecatedFunctions);
format = QGLFormat(QGL::NoDeprecatedFunctions);
format.setProfile(QGLFormat::CoreProfile);
//format.setVersion(3, 3);
return format;
}
KeyEvent::KeyCode QtCanvas::getKey(int key) {
switch(key) {
case Qt::Key_Escape : return cgt::KeyEvent::K_ESCAPE;
case Qt::Key_Tab : return cgt::KeyEvent::K_TAB;
// case Qt::Key_Backtab : return cgt::KeyEvent::K_;
case Qt::Key_Backspace : return cgt::KeyEvent::K_BACKSPACE;
case Qt::Key_Return : return cgt::KeyEvent::K_RETURN;
case Qt::Key_Enter : return cgt::KeyEvent::K_KP_ENTER;
case Qt::Key_Insert : return cgt::KeyEvent::K_INSERT;
case Qt::Key_Delete : return cgt::KeyEvent::K_DELETE;
case Qt::Key_Pause : return cgt::KeyEvent::K_PAUSE;
case Qt::Key_Print : return cgt::KeyEvent::K_PRINT;
case Qt::Key_SysReq : return cgt::KeyEvent::K_SYSREQ;
case Qt::Key_Clear : return cgt::KeyEvent::K_CLEAR;
case Qt::Key_Home : return cgt::KeyEvent::K_HOME;
case Qt::Key_End : return cgt::KeyEvent::K_END;
case Qt::Key_Left : return cgt::KeyEvent::K_LEFT;
case Qt::Key_Up : return cgt::KeyEvent::K_UP;
case Qt::Key_Right : return cgt::KeyEvent::K_RIGHT;
case Qt::Key_Down : return cgt::KeyEvent::K_DOWN;
case Qt::Key_PageUp : return cgt::KeyEvent::K_PAGEUP;
case Qt::Key_PageDown : return cgt::KeyEvent::K_PAGEDOWN;
case Qt::Key_Shift : return cgt::KeyEvent::K_LSHIFT; // Qt only knows one shift, control, meta and alt
case Qt::Key_Control : return cgt::KeyEvent::K_LCTRL;//...
case Qt::Key_Meta : return cgt::KeyEvent::K_RMETA;//...
case Qt::Key_Alt : return cgt::KeyEvent::K_LALT;//...
case Qt::Key_AltGr : return cgt::KeyEvent::K_MODE;
case Qt::Key_CapsLock : return cgt::KeyEvent::K_CAPSLOCK;
case Qt::Key_NumLock : return cgt::KeyEvent::K_NUMLOCK;
case Qt::Key_ScrollLock : return cgt::KeyEvent::K_SCROLLOCK;
case Qt::Key_F1 : return cgt::KeyEvent::K_F1;
case Qt::Key_F2 : return cgt::KeyEvent::K_F2;
case Qt::Key_F3 : return cgt::KeyEvent::K_F3;
case Qt::Key_F4 : return cgt::KeyEvent::K_F4;
case Qt::Key_F5 : return cgt::KeyEvent::K_F5;
case Qt::Key_F6 : return cgt::KeyEvent::K_F6;
case Qt::Key_F7 : return cgt::KeyEvent::K_F7;
case Qt::Key_F8 : return cgt::KeyEvent::K_F8;
case Qt::Key_F9 : return cgt::KeyEvent::K_F9;
case Qt::Key_F10 : return cgt::KeyEvent::K_F10;
case Qt::Key_F11 : return cgt::KeyEvent::K_F11;
case Qt::Key_F12 : return cgt::KeyEvent::K_F12;
case Qt::Key_F13 : return cgt::KeyEvent::K_F13;
case Qt::Key_F14 : return cgt::KeyEvent::K_F14;
case Qt::Key_F15 : return cgt::KeyEvent::K_F15;
// case Qt::Key_F16 : return cgt::KeyEvent::K_;
// case Qt::Key_F17 : return cgt::KeyEvent::K_;
// case Qt::Key_F18 : return cgt::KeyEvent::K_;
// case Qt::Key_F19 : return cgt::KeyEvent::K_;
// case Qt::Key_F20 : return cgt::KeyEvent::K_;
// case Qt::Key_F21 : return cgt::KeyEvent::K_;
// case Qt::Key_F22 : return cgt::KeyEvent::K_;
// case Qt::Key_F23 : return cgt::KeyEvent::K_;
// case Qt::Key_F24 : return cgt::KeyEvent::K_;
// case Qt::Key_F25 : return cgt::KeyEvent::K_;
// case Qt::Key_F26 : return cgt::KeyEvent::K_;
// case Qt::Key_F27 : return cgt::KeyEvent::K_;
// case Qt::Key_F28 : return cgt::KeyEvent::K_;
// case Qt::Key_F29 : return cgt::KeyEvent::K_;
// case Qt::Key_F30 : return cgt::KeyEvent::K_;
// case Qt::Key_F31 : return cgt::KeyEvent::K_;
// case Qt::Key_F32 : return cgt::KeyEvent::K_;
// case Qt::Key_F33 : return cgt::KeyEvent::K_;
// case Qt::Key_F34 : return cgt::KeyEvent::K_;
// case Qt::Key_F35 : return cgt::KeyEvent::K_;
case Qt::Key_Super_L : return cgt::KeyEvent::K_LSUPER;
case Qt::Key_Super_R : return cgt::KeyEvent::K_RSUPER;
case Qt::Key_Menu : return cgt::KeyEvent::K_MENU;
// case Qt::Key_Hyper_L : return cgt::KeyEvent::K_;
// case Qt::Key_Hyper_R : return cgt::KeyEvent::K_;
case Qt::Key_Help : return cgt::KeyEvent::K_HELP;
// case Qt::Key_Direction_L : return cgt::KeyEvent::K_;
// case Qt::Key_Direction_R : return cgt::KeyEvent::K_;
case Qt::Key_Space : return cgt::KeyEvent::K_SPACE;
case Qt::Key_Exclam : return cgt::KeyEvent::K_EXCLAIM;
// case Qt::Key_QuoteDbl : return cgt::KeyEvent::K_;
// case Qt::Key_NumberSign : return cgt::KeyEvent::K_;
case Qt::Key_Dollar : return cgt::KeyEvent::K_DOLLAR;
// case Qt::Key_Percent : return cgt::KeyEvent::K_;
case Qt::Key_Ampersand : return cgt::KeyEvent::K_AMPERSAND;
// case Qt::Key_Apostrophe : return cgt::KeyEvent::K_;
case Qt::Key_ParenLeft : return cgt::KeyEvent::K_LEFTPAREN;
case Qt::Key_ParenRight : return cgt::KeyEvent::K_RIGHTPAREN;
case Qt::Key_Asterisk : return cgt::KeyEvent::K_ASTERISK;
case Qt::Key_Plus : return cgt::KeyEvent::K_PLUS;
case Qt::Key_Comma : return cgt::KeyEvent::K_COMMA;
case Qt::Key_Minus : return cgt::KeyEvent::K_MINUS;
case Qt::Key_Period : return cgt::KeyEvent::K_PERIOD;
case Qt::Key_Slash : return cgt::KeyEvent::K_SLASH;
case Qt::Key_0 : return cgt::KeyEvent::K_0;
case Qt::Key_1 : return cgt::KeyEvent::K_1;
case Qt::Key_2 : return cgt::KeyEvent::K_2;
case Qt::Key_3 : return cgt::KeyEvent::K_3;
case Qt::Key_4 : return cgt::KeyEvent::K_4;
case Qt::Key_5 : return cgt::KeyEvent::K_5;
case Qt::Key_6 : return cgt::KeyEvent::K_6;
case Qt::Key_7 : return cgt::KeyEvent::K_7;
case Qt::Key_8 : return cgt::KeyEvent::K_8;
case Qt::Key_9 : return cgt::KeyEvent::K_9;
case Qt::Key_Colon : return cgt::KeyEvent::K_COLON;
case Qt::Key_Semicolon : return cgt::KeyEvent::K_SEMICOLON;
case Qt::Key_Less : return cgt::KeyEvent::K_LESS;
case Qt::Key_Equal : return cgt::KeyEvent::K_EQUALS;
case Qt::Key_Greater : return cgt::KeyEvent::K_GREATER;
case Qt::Key_Question : return cgt::KeyEvent::K_QUESTION;
case Qt::Key_At : return cgt::KeyEvent::K_AT;
case Qt::Key_A : return cgt::KeyEvent::K_A;
case Qt::Key_B : return cgt::KeyEvent::K_B;
case Qt::Key_C : return cgt::KeyEvent::K_C;
case Qt::Key_D : return cgt::KeyEvent::K_D;
case Qt::Key_E : return cgt::KeyEvent::K_E;
case Qt::Key_F : return cgt::KeyEvent::K_F;
case Qt::Key_G : return cgt::KeyEvent::K_G;
case Qt::Key_H : return cgt::KeyEvent::K_H;
case Qt::Key_I : return cgt::KeyEvent::K_I;
case Qt::Key_J : return cgt::KeyEvent::K_J;
case Qt::Key_K : return cgt::KeyEvent::K_K;
case Qt::Key_L : return cgt::KeyEvent::K_L;
case Qt::Key_M : return cgt::KeyEvent::K_M;
case Qt::Key_N : return cgt::KeyEvent::K_N;
case Qt::Key_O : return cgt::KeyEvent::K_O;
case Qt::Key_P : return cgt::KeyEvent::K_P;
case Qt::Key_Q : return cgt::KeyEvent::K_Q;
case Qt::Key_R : return cgt::KeyEvent::K_R;
case Qt::Key_S : return cgt::KeyEvent::K_S;
case Qt::Key_T : return cgt::KeyEvent::K_T;
case Qt::Key_U : return cgt::KeyEvent::K_U;
case Qt::Key_V : return cgt::KeyEvent::K_V;
case Qt::Key_W : return cgt::KeyEvent::K_W;
case Qt::Key_X : return cgt::KeyEvent::K_X;
case Qt::Key_Y : return cgt::KeyEvent::K_Y;
case Qt::Key_Z : return cgt::KeyEvent::K_Z;
case Qt::Key_BracketLeft : return cgt::KeyEvent::K_LEFTBRACKET;
case Qt::Key_Backslash : return cgt::KeyEvent::K_BACKSLASH;
case Qt::Key_BracketRight : return cgt::KeyEvent::K_RIGHTBRACKET;
// case Qt::Key_AsciiCircum : return cgt::KeyEvent::K_;
case Qt::Key_Underscore : return cgt::KeyEvent::K_UNDERSCORE;
// case Qt::Key_QuoteLeft : return cgt::KeyEvent::K_;
// case Qt::Key_BraceLeft : return cgt::KeyEvent::K_;
// case Qt::Key_Bar : return cgt::KeyEvent::K_;
// case Qt::Key_BraceRight : return cgt::KeyEvent::K_;
// case Qt::Key_AsciiTilde : return cgt::KeyEvent::K_;
// case Qt::Key_nobreakspace : return cgt::KeyEvent::K_;
// case Qt::Key_exclamdown : return cgt::KeyEvent::K_;
// case Qt::Key_cent : return cgt::KeyEvent::K_;
// case Qt::Key_sterling : return cgt::KeyEvent::K_;
// case Qt::Key_currency : return cgt::KeyEvent::K_;
// case Qt::Key_yen : return cgt::KeyEvent::K_;
// case Qt::Key_brokenbar : return cgt::KeyEvent::K_;
// case Qt::Key_section : return cgt::KeyEvent::K_;
// case Qt::Key_diaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_copyright : return cgt::KeyEvent::K_;
// case Qt::Key_ordfeminine : return cgt::KeyEvent::K_;
// case Qt::Key_guillemotleft : return cgt::KeyEvent::K_;
// case Qt::Key_notsign : return cgt::KeyEvent::K_;
// case Qt::Key_hyphen : return cgt::KeyEvent::K_;
// case Qt::Key_registered : return cgt::KeyEvent::K_;
// case Qt::Key_macron : return cgt::KeyEvent::K_;
// case Qt::Key_degree : return cgt::KeyEvent::K_;
// case Qt::Key_plusminus : return cgt::KeyEvent::K_;
// case Qt::Key_twosuperior : return cgt::KeyEvent::K_;
// case Qt::Key_threesuperior : return cgt::KeyEvent::K_;
// case Qt::Key_acute : return cgt::KeyEvent::K_;
// case Qt::Key_mu : return cgt::KeyEvent::K_;
// case Qt::Key_paragraph : return cgt::KeyEvent::K_;
// case Qt::Key_periodcentered : return cgt::KeyEvent::K_;
// case Qt::Key_cedilla : return cgt::KeyEvent::K_;
// case Qt::Key_onesuperior : return cgt::KeyEvent::K_;
// case Qt::Key_masculine : return cgt::KeyEvent::K_;
// case Qt::Key_guillemotright : return cgt::KeyEvent::K_;
// case Qt::Key_onequarter : return cgt::KeyEvent::K_;
// case Qt::Key_onehalf : return cgt::KeyEvent::K_;
// case Qt::Key_threequarters : return cgt::KeyEvent::K_;
// case Qt::Key_questiondown : return cgt::KeyEvent::K_;
// case Qt::Key_Agrave : return cgt::KeyEvent::K_;
// case Qt::Key_Aacute : return cgt::KeyEvent::K_;
// case Qt::Key_Acircumflex : return cgt::KeyEvent::K_;
// case Qt::Key_Atilde : return cgt::KeyEvent::K_;
// case Qt::Key_Adiaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_Aring : return cgt::KeyEvent::K_;
// case Qt::Key_AE : return cgt::KeyEvent::K_;
// case Qt::Key_Ccedilla : return cgt::KeyEvent::K_;
// case Qt::Key_Egrave : return cgt::KeyEvent::K_;
// case Qt::Key_Eacute : return cgt::KeyEvent::K_;
// case Qt::Key_Ecircumflex : return cgt::KeyEvent::K_;
// case Qt::Key_Ediaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_Igrave : return cgt::KeyEvent::K_;
// case Qt::Key_Iacute : return cgt::KeyEvent::K_;
// case Qt::Key_Icircumflex : return cgt::KeyEvent::K_;
// case Qt::Key_Idiaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_ETH : return cgt::KeyEvent::K_;
// case Qt::Key_Ntilde : return cgt::KeyEvent::K_;
// case Qt::Key_Ograve : return cgt::KeyEvent::K_;
// case Qt::Key_Oacute : return cgt::KeyEvent::K_;
// case Qt::Key_Ocircumflex : return cgt::KeyEvent::K_;
// case Qt::Key_Otilde : return cgt::KeyEvent::K_;
// case Qt::Key_Odiaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_multiply : return cgt::KeyEvent::K_;
// case Qt::Key_Ooblique : return cgt::KeyEvent::K_;
// case Qt::Key_Ugrave : return cgt::KeyEvent::K_;
// case Qt::Key_Uacute : return cgt::KeyEvent::K_;
// case Qt::Key_Ucircumflex : return cgt::KeyEvent::K_;
// case Qt::Key_Udiaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_Yacute : return cgt::KeyEvent::K_;
// case Qt::Key_THORN : return cgt::KeyEvent::K_;
// case Qt::Key_ssharp : return cgt::KeyEvent::K_;
// case Qt::Key_division : return cgt::KeyEvent::K_;
// case Qt::Key_ydiaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_Multi_key : return cgt::KeyEvent::K_;
// case Qt::Key_Codeinput : return cgt::KeyEvent::K_;
// case Qt::Key_SingleCandidate : return cgt::KeyEvent::K_;
// case Qt::Key_MultipleCandidate : return cgt::KeyEvent::K_;
// case Qt::Key_PreviousCandidate : return cgt::KeyEvent::K_;
// case Qt::Key_Mode_switch : return cgt::KeyEvent::K_;
// case Qt::Key_Kanji : return cgt::KeyEvent::K_;
// case Qt::Key_Muhenkan : return cgt::KeyEvent::K_;
// case Qt::Key_Henkan : return cgt::KeyEvent::K_;
// case Qt::Key_Romaji : return cgt::KeyEvent::K_;
// case Qt::Key_Hiragana : return cgt::KeyEvent::K_;
// case Qt::Key_Katakana : return cgt::KeyEvent::K_;
// case Qt::Key_Hiragana_Katakana : return cgt::KeyEvent::K_;
// case Qt::Key_Zenkaku : return cgt::KeyEvent::K_;
// case Qt::Key_Hankaku : return cgt::KeyEvent::K_;
// case Qt::Key_Zenkaku_Hankaku : return cgt::KeyEvent::K_;
// case Qt::Key_Touroku : return cgt::KeyEvent::K_;
// case Qt::Key_Massyo : return cgt::KeyEvent::K_;
// case Qt::Key_Kana_Lock : return cgt::KeyEvent::K_;
// case Qt::Key_Kana_Shift : return cgt::KeyEvent::K_;
// case Qt::Key_Eisu_Shift : return cgt::KeyEvent::K_;
// case Qt::Key_Eisu_toggle : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Start : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_End : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Hanja : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Jamo : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Romaja : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Jeonja : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Banja : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_PreHanja : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_PostHanja : return cgt::KeyEvent::K_;
// case Qt::Key_Hangul_Special : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Grave : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Acute : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Circumflex : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Tilde : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Macron : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Breve : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Abovedot : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Diaeresis : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Abovering : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Doubleacute : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Caron : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Cedilla : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Ogonek : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Iota : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Voiced_Sound : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Semivoiced_Sound : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Belowdot : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Hook : return cgt::KeyEvent::K_;
// case Qt::Key_Dead_Horn : return cgt::KeyEvent::K_;
// case Qt::Key_Back : return cgt::KeyEvent::K_;
// case Qt::Key_Forward : return cgt::KeyEvent::K_;
// case Qt::Key_Stop : return cgt::KeyEvent::K_;
// case Qt::Key_Refresh : return cgt::KeyEvent::K_;
// case Qt::Key_VolumeDown : return cgt::KeyEvent::K_;
// case Qt::Key_VolumeMute : return cgt::KeyEvent::K_;
// case Qt::Key_VolumeUp : return cgt::KeyEvent::K_;
// case Qt::Key_BassBoost : return cgt::KeyEvent::K_;
// case Qt::Key_BassUp : return cgt::KeyEvent::K_;
// case Qt::Key_BassDown : return cgt::KeyEvent::K_;
// case Qt::Key_TrebleUp : return cgt::KeyEvent::K_;
// case Qt::Key_TrebleDown : return cgt::KeyEvent::K_;
// case Qt::Key_MediaPlay : return cgt::KeyEvent::K_;
// case Qt::Key_MediaStop : return cgt::KeyEvent::K_;
// case Qt::Key_MediaPrevious : return cgt::KeyEvent::K_;
// case Qt::Key_MediaNext : return cgt::KeyEvent::K_;
// case Qt::Key_MediaRecord : return cgt::KeyEvent::K_;
// case Qt::Key_HomePage : return cgt::KeyEvent::K_;
// case Qt::Key_Favorites : return cgt::KeyEvent::K_;
// case Qt::Key_Search : return cgt::KeyEvent::K_;
// case Qt::Key_Standby : return cgt::KeyEvent::K_;
// case Qt::Key_OpenUrl : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchMail : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchMedia : return cgt::KeyEvent::K_;
// case Qt::Key_Launch0 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch1 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch2 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch3 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch4 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch5 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch6 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch7 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch8 : return cgt::KeyEvent::K_;
// case Qt::Key_Launch9 : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchA : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchB : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchC : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchD : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchE : return cgt::KeyEvent::K_;
// case Qt::Key_LaunchF : return cgt::KeyEvent::K_;
// case Qt::Key_MediaLast : return cgt::KeyEvent::K_;
// case Qt::Key_unknown : return cgt::KeyEvent::K_;
// case Qt::Key_Call : return cgt::KeyEvent::K_;
// case Qt::Key_Context1 : return cgt::KeyEvent::K_;
// case Qt::Key_Context2 : return cgt::KeyEvent::K_;
// case Qt::Key_Context3 : return cgt::KeyEvent::K_;
// case Qt::Key_Context4 : return cgt::KeyEvent::K_;
// case Qt::Key_Flip : return cgt::KeyEvent::K_;
// case Qt::Key_Hangup : return cgt::KeyEvent::K_;
// case Qt::Key_No : return cgt::KeyEvent::K_;
// case Qt::Key_Select : return cgt::KeyEvent::K_;
// case Qt::Key_Yes : return cgt::KeyEvent::K_;
default: return cgt::KeyEvent::K_UNKNOWN;
}
}
void QtCanvas::setSize(ivec2 newSize) {
// pass size change command through Qt's event messaging system to enforce execution in GUI thread.
// (setSize() may be called externally from a different thread).
emit s_sizeChangedExternally(newSize.x, newSize.y);
}
QSize QtCanvas::sizeHint() const {
const ivec2& size = getSize();
return QSize(size.x, size.y);
}
void QtCanvas::acquireAsCurrentContext() {
QGLWidget::makeCurrent();
}
void QtCanvas::releaseAsCurrentContext() {
QGLWidget::doneCurrent();
}
void QtCanvas::sizeChangedExternally(int w, int h) {
QWidget::resize(w, h);
}
void QtCanvas::changeFullScreen(bool fullscreen) {
fullscreen_ = fullscreen;
if (fullscreen) {
showFullScreen();
}
else {
showNormal();
}
}
} // namespace