Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2012-03-18 11:01:29 +0000
committerStijn Buys <ingar@osirion.org>2012-03-18 11:01:29 +0000
commite3af85ab1a06742ba23c815b80887fdbf32fe36c (patch)
treea80891ff6077ff0bd95636c82516a16c9dc08cac
parentf46146993b50ca5afc802288deeb5bd72a176d9a (diff)
Made MapWidget::zoom() independent of the size of the widget.
-rw-r--r--src/editorwindow.cc2
-rw-r--r--src/mapwidget.cc87
-rw-r--r--src/mapwidget.h15
3 files changed, 56 insertions, 48 deletions
diff --git a/src/editorwindow.cc b/src/editorwindow.cc
index fc183c6..ee71577 100644
--- a/src/editorwindow.cc
+++ b/src/editorwindow.cc
@@ -254,7 +254,7 @@ void EditorWindow::deleteSelected()
void EditorWindow::showZoneProperties()
{
- QMessageBox::information(this, tr("Zone properties"), tr("Not yet iplemented"));
+ QMessageBox::information(this, tr("Zone properties"), tr("Needs to be implemented"));
}
}
diff --git a/src/mapwidget.cc b/src/mapwidget.cc
index f5dd595..2ce1def 100644
--- a/src/mapwidget.cc
+++ b/src/mapwidget.cc
@@ -15,6 +15,8 @@
#include <QDebug>
#include <QtGui>
+#include <cmath>
+
namespace editor
{
@@ -23,16 +25,12 @@ MapWidget::MapWidget(QWidget *parent) : QWidget(parent)
//setMinimumSize(256,256);
mapwidget_manipulator = new Manipulator(this);
- // zoom sucks but it works
- mapwidget_zoom = 16;
-
- // center of the map (used for dragging)
- center_x = 0;
- center_y = 0;
+ // zoom factor
+ mapwidget_zoomfactor = 0;
+ // reset dragging
dragstart_x = 0;
- dragstart_y = 0;
-
+ dragstart_y = 0;
is_dragging = false;
mapwidget_selected = 0;
@@ -40,21 +38,23 @@ MapWidget::MapWidget(QWidget *parent) : QWidget(parent)
setFocusPolicy(Qt::ClickFocus);
}
+float MapWidget::zoom() const
+{
+ return ::pow(2.0f, (float) mapwidget_zoomfactor);
+}
+
void MapWidget::wheelEvent(QWheelEvent *event)
{
if (event->orientation() == Qt::Vertical) {
- int oldzoom = mapwidget_zoom;
+
+ mapwidget_zoomfactor += event->delta() / 120;
- mapwidget_zoom -= event->delta() / 120;
- if (mapwidget_zoom < 1)
- mapwidget_zoom = 1;
- else if (mapwidget_zoom > 64) {
- mapwidget_zoom = 64;
+ if (mapwidget_zoomfactor < - 64) {
+ mapwidget_zoomfactor = -64;
+ } else if (mapwidget_zoomfactor > 64) {
+ mapwidget_zoomfactor = 64;
}
-
- center_x = center_x * oldzoom / mapwidget_zoom;
- center_y = center_y * oldzoom / mapwidget_zoom;
-
+
resizeChildren();
update();
event->accept();
@@ -83,14 +83,13 @@ void MapWidget::mouseReleaseEvent(QMouseEvent *event)
void MapWidget::mouseMoveEvent(QMouseEvent *event)
{
if (is_dragging) {
- int delta_x = event->pos().x() - dragstart_x;
- int delta_y = event->pos().y() - dragstart_y;
-
- center_x += delta_x;
- center_y += delta_y;
-
- //qDebug() << "dragging " << delta_x << " " << delta_y;
+ float delta_x = event->pos().x() - dragstart_x;
+ float delta_y = event->pos().y() - dragstart_y;
+ // move map center, mapwidget_center is in world coordinates
+ mapwidget_center[0] += delta_y / zoom();
+ mapwidget_center[1] += delta_x / zoom();
+
dragstart_x = event->pos().x();
dragstart_y = event->pos().y();
@@ -107,19 +106,20 @@ void MapWidget::resizeChildren()
if ((width() < 16) || (height() < 16))
return;
- const float scale = (float) width() / (float) (mapwidget_zoom * 256);
-
for (int i = 0; i < mapwidget_enties.size(); ++i) {
+
EntityWidget * entity = mapwidget_enties.at(i);
- int radius = (int) (entity->properties()->radius() * scale);
- if (radius < 6)
+
+ int radius = (int) (entity->properties()->radius() * zoom());
+ if (radius < 6) {
radius = 6;
+ }
- int x = width() / 2 - (int) (entity->properties()->location()[1] * scale) - radius;
- int y = height() / 2 - (int)(entity->properties()->location()[0] * scale) - radius;
+ int x = width() / 2 - (int)((entity->properties()->location()[1] - mapwidget_center[1]) * zoom()) - radius;
+ int y = height() / 2 - (int)((entity->properties()->location()[0] - mapwidget_center[0]) * zoom()) - radius;
+
+ entity->setGeometry(x, y, radius * 2 , radius * 2);
- entity->setGeometry(center_x + x, center_y + y, radius * 2 , radius * 2);
- //qDebug() << "Moving entity to " << x << " " << y;
if (entity->selected()) {
mapwidget_manipulator->setSize(entity);
mapwidget_manipulator->setProperties(entity->properties());
@@ -144,14 +144,13 @@ void MapWidget::deselect()
void MapWidget::dragEntity(EntityWidget *entity, int x, int y)
{
- const float scale = (float) (mapwidget_zoom * 256) / (float) width();
- int radius = (int) (entity->properties()->radius() / scale);
+ int radius = (int) (entity->properties()->radius() * zoom());
if (radius < 6)
radius = 6;
entity->properties()->set_location(
- entity->properties()->location()[0] - (int) ((float) (y - radius) * scale),
- entity->properties()->location()[1] - (int) ((float) (x - radius) * scale),
+ entity->properties()->location()[0] - (int) ((float) (y - radius) / zoom()),
+ entity->properties()->location()[1] - (int) ((float) (x - radius) / zoom()),
entity->properties()->location()[2]
);
@@ -217,11 +216,13 @@ void MapWidget::paintEvent(QPaintEvent *event)
painter.setPen(pen);
// mapwidget_zoom is used to scale from game units to screen coorinates
- // 1 grid square is 256 game units
+ // 1 grid square is 128 game units
// gridsize is the size of one grid square in screen coordinates
- int gridsize = width() / mapwidget_zoom;
+ int gridsize = (int) (128.0f * zoom());
+ if (gridsize <= 0)
+ return;
- int x = center_x + width() / 2;
+ int x = (int)(mapwidget_center.y() * zoom()) + width() / 2;
pen.setColor(axislinecolor);
painter.setPen(pen);
painter.drawLine(x, 0, x, height());
@@ -233,14 +234,14 @@ void MapWidget::paintEvent(QPaintEvent *event)
painter.drawLine(x, 0, x, height());
x -= gridsize;
}
- x = center_x + width() / 2 + gridsize;
+ x = (int) (mapwidget_center.y() * zoom()) + width() / 2 + gridsize;
while (x <= width()) {
painter.drawLine(x, 0, x, height());
x += gridsize;
}
- int y = center_y + height() / 2;
+ int y = (int) (mapwidget_center.x() * zoom()) + height() / 2;
pen.setColor(axislinecolor);
painter.setPen(pen);
@@ -253,7 +254,7 @@ void MapWidget::paintEvent(QPaintEvent *event)
painter.drawLine(0, y, width(), y);
y -= gridsize;
}
- y = center_y + height() / 2 + gridsize;
+ y = (int) (mapwidget_center.x() * zoom()) + height() / 2 + gridsize;
while (y <= height()) {
painter.drawLine(0, y, width(), y);
y += gridsize;
diff --git a/src/mapwidget.h b/src/mapwidget.h
index 2dde34f..d418602 100644
--- a/src/mapwidget.h
+++ b/src/mapwidget.h
@@ -42,6 +42,11 @@ public:
inline EntityWidget *selected() {
return mapwidget_selected;
}
+
+ /**
+ * @return the current map zoom factor
+ * */
+ float zoom() const;
protected:
@@ -122,14 +127,16 @@ private slots:
private:
typedef QList<EntityWidget *> Entities;
- int mapwidget_zoom;
int dragstart_x;
int dragstart_y;
- int center_x;
- int center_y;
-
bool is_dragging;
+
+ // zoom factor, as a power of 2
+ int mapwidget_zoomfactor;
+
+ // center of the map, in world coordinates
+ Vector3f mapwidget_center;
Entities mapwidget_enties;
EntityWidget *mapwidget_selected;