QtBiomeVisualiser: Added mouse and keyboard view control.
Mouse dragging or WASD pans view, mouse wheel or QE zooms.
This commit is contained in:
parent
2a020e47f1
commit
69b46aeb27
@ -33,6 +33,9 @@ BiomeView::BiomeView(QWidget * parent) :
|
|||||||
|
|
||||||
// Add a chunk-update callback mechanism:
|
// Add a chunk-update callback mechanism:
|
||||||
connect(&m_Cache, SIGNAL(chunkAvailable(int, int)), this, SLOT(chunkAvailable(int, int)));
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,10 +35,20 @@ public slots:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
double m_X, m_Z;
|
double m_X, m_Z;
|
||||||
int m_Zoom;
|
double m_Zoom;
|
||||||
|
|
||||||
|
/** Cache for the loaded chunk data. */
|
||||||
ChunkCache m_Cache;
|
ChunkCache m_Cache;
|
||||||
|
|
||||||
|
/** The entire view's contents in an offscreen image. */
|
||||||
QImage m_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 */
|
/** Data used for rendering a chunk that hasn't been loaded yet */
|
||||||
uchar m_EmptyChunkImage[16 * 16 * 4];
|
uchar m_EmptyChunkImage[16 * 16 * 4];
|
||||||
|
|
||||||
@ -55,8 +65,20 @@ protected:
|
|||||||
/** Paints the entire widget */
|
/** Paints the entire widget */
|
||||||
virtual void paintEvent(QPaintEvent *) override;
|
virtual void paintEvent(QPaintEvent *) override;
|
||||||
|
|
||||||
/** Queues the chunk for rendering. */
|
/** Called when the user presses any mouse button. */
|
||||||
void queueChunkRender(ChunkPtr a_Chunk);
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user