1
0

QtBiomeVisualiser: Added mouse and keyboard view control.

Mouse dragging or WASD pans view, mouse wheel or QE zooms.
This commit is contained in:
Mattes D 2014-09-14 22:05:10 +02:00
parent 2a020e47f1
commit 69b46aeb27
2 changed files with 138 additions and 5 deletions

View File

@ -33,6 +33,9 @@ BiomeView::BiomeView(QWidget * parent) :
// Add a chunk-update callback mechanism:
connect(&m_Cache, SIGNAL(chunkAvailable(int, int)), this, SLOT(chunkAvailable(int, int)));
// Allow keyboard interaction:
setFocusPolicy(Qt::StrongFocus);
}
@ -236,9 +239,117 @@ void BiomeView::paintEvent(QPaintEvent * a_Event)
void BiomeView::queueChunkRender(ChunkPtr a_Chunk)
void BiomeView::mousePressEvent(QMouseEvent * a_Event)
{
m_LastX = a_Event->x();
m_LastY = a_Event->y();
m_IsMouseDragging = true;
}
void BiomeView::mouseMoveEvent(QMouseEvent * a_Event)
{
if (m_IsMouseDragging)
{
// The user is dragging the mouse, move the view around:
m_X += (m_LastX - a_Event->x()) / m_Zoom;
m_Z += (m_LastY - a_Event->y()) / m_Zoom;
m_LastX = a_Event->x();
m_LastY = a_Event->y();
redraw();
return;
}
// TODO: Update the status bar info for the biome currently pointed at
}
void BiomeView::mouseReleaseEvent(QMouseEvent *)
{
m_IsMouseDragging = false;
}
void BiomeView::wheelEvent(QWheelEvent * a_Event)
{
m_Zoom += floor(a_Event->delta() / 90.0);
m_Zoom = Clamp(m_Zoom, 1.0, 20.0);
redraw();
}
void BiomeView::keyPressEvent(QKeyEvent * a_Event)
{
switch (a_Event->key())
{
case Qt::Key_Up:
case Qt::Key_W:
{
m_Z -= 10.0 / m_Zoom;
redraw();
break;
}
case Qt::Key_Down:
case Qt::Key_S:
{
m_Z += 10.0 / m_Zoom;
redraw();
break;
}
case Qt::Key_Left:
case Qt::Key_A:
{
m_X -= 10.0 / m_Zoom;
redraw();
break;
}
case Qt::Key_Right:
case Qt::Key_D:
{
m_X += 10.0 / m_Zoom;
redraw();
break;
}
case Qt::Key_PageUp:
case Qt::Key_Q:
{
m_Zoom++;
if (m_Zoom > 20.0)
{
m_Zoom = 20.0;
}
redraw();
break;
}
case Qt::Key_PageDown:
case Qt::Key_E:
{
m_Zoom--;
if (m_Zoom < 1.0)
{
m_Zoom = 1.0;
}
redraw();
break;
}
}
}

View File

@ -35,10 +35,20 @@ public slots:
protected:
double m_X, m_Z;
int m_Zoom;
double m_Zoom;
/** Cache for the loaded chunk data. */
ChunkCache m_Cache;
/** The entire view's contents in an offscreen image. */
QImage m_Image;
/** Coords of the mouse for the previous position, used while dragging. */
int m_LastX, m_LastY;
/** Set to true when the user has a mouse button depressed, and is dragging the view. */
bool m_IsMouseDragging;
/** Data used for rendering a chunk that hasn't been loaded yet */
uchar m_EmptyChunkImage[16 * 16 * 4];
@ -55,8 +65,20 @@ protected:
/** Paints the entire widget */
virtual void paintEvent(QPaintEvent *) override;
/** Queues the chunk for rendering. */
void queueChunkRender(ChunkPtr a_Chunk);
/** Called when the user presses any mouse button. */
virtual void mousePressEvent(QMouseEvent * a_Event);
/** Called when the user moves the mouse. */
virtual void mouseMoveEvent(QMouseEvent * a_Event);
/** Called when the user releases a previously held mouse button. */
virtual void mouseReleaseEvent(QMouseEvent * a_Event) override;
/** Called when the user rotates the mouse wheel. */
virtual void wheelEvent(QWheelEvent * a_Event) override;
/** Called when the user presses a key. */
virtual void keyPressEvent(QKeyEvent * a_Event) override;
};