Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/mapwidget.cc')
-rw-r--r--src/mapwidget.cc144
1 files changed, 118 insertions, 26 deletions
diff --git a/src/mapwidget.cc b/src/mapwidget.cc
index d960c0a..b5f52d1 100644
--- a/src/mapwidget.cc
+++ b/src/mapwidget.cc
@@ -16,6 +16,7 @@
#include <QtGui>
#include <cmath>
+#include <cstdlib>
namespace editor
{
@@ -32,6 +33,7 @@ MapWidget::MapWidget(QWidget *parent) : QWidget(parent)
dragstart_x = 0;
dragstart_y = 0;
is_dragging = false;
+ is_box_selecting = false;
mapwidget_selected = 0;
@@ -63,19 +65,35 @@ void MapWidget::wheelEvent(QWheelEvent *event)
void MapWidget::mousePressEvent(QMouseEvent *event)
{
- if (event->button() == Qt::RightButton) {
+ if (event->button() == Qt::LeftButton) {
+ dragstart_x = event->pos().x();
+ dragstart_y = event->pos().y();
+
+ dragstop_x = dragstart_x;
+ dragstop_y = dragstart_y;
+
+ is_dragging = false;
+ is_box_selecting = true;
+ event->accept();
+ } else if (event->button() == Qt::RightButton) {
dragstart_x = event->pos().x();
dragstart_y = event->pos().y();
- event->accept();
is_dragging = true;
+ is_box_selecting = false;
+ event->accept();
} else {
is_dragging = false;
+ is_box_selecting = false;
}
}
void MapWidget::mouseReleaseEvent(QMouseEvent *event)
{
- if (event->button() == Qt::RightButton) {
+ if (event->button() == Qt::LeftButton) {
+ doBoxSelect();
+ is_box_selecting = false;
+ update();
+ } else if (event->button() == Qt::RightButton) {
is_dragging = false;
}
}
@@ -98,6 +116,13 @@ void MapWidget::mouseMoveEvent(QMouseEvent *event)
resizeChildren();
update();
+ } else if (is_box_selecting) {
+ dragstop_x = event->pos().x();
+ dragstop_y = event->pos().y();
+
+ event->accept();
+
+ update();
}
}
@@ -120,7 +145,7 @@ void MapWidget::resizeChildren()
entity->setGeometry(x, y, radius * 2 , radius * 2);
- if (entity->selected()) {
+ if (entity->selected()== EntityWidget::SelectActive) {
mapwidget_manipulator->setSize(entity);
mapwidget_manipulator->setProperties(entity->properties());
mapwidget_manipulator->update();
@@ -129,11 +154,50 @@ void MapWidget::resizeChildren()
}
+void MapWidget::doBoxSelect()
+{
+ // deselect all
+ for (int i = 0; i < mapwidget_enties.size(); ++i) {
+ EntityWidget *entitywidget = mapwidget_enties.at(i);
+ entitywidget->set_selected(EntityWidget::SelectNone);
+ }
+
+ const int x = dragstop_x < dragstart_x ? dragstop_x : dragstart_x;
+ const int y = dragstop_y < dragstart_y ? dragstop_y : dragstart_y;
+ const int w = abs(dragstop_x - dragstart_x);
+ const int h = abs(dragstop_y - dragstart_y);
+
+ QRect box(x, y, w, h);
+
+ mapwidget_selected = 0;
+
+ for (int i = 0; i < mapwidget_enties.size(); ++i) {
+ EntityWidget *entitywidget = mapwidget_enties.at(i);
+
+ if (box.contains(entitywidget->geometry())) {
+ entitywidget->set_selected(EntityWidget::SelectHighlight);
+ mapwidget_selected = entitywidget;
+ }
+ }
+
+ if (mapwidget_selected) {
+ mapwidget_selected->set_selected(EntityWidget::SelectActive);
+ emit propertiesChanged(mapwidget_selected->properties());
+ mapwidget_manipulator->setMode(Manipulator::Select);
+ mapwidget_manipulator->setProperties(mapwidget_selected->properties());
+ mapwidget_manipulator->setSize(mapwidget_selected);
+ } else {
+ mapwidget_selected = 0;
+ emit propertiesChanged(0);
+ mapwidget_manipulator->setMode(Manipulator::None);
+ }
+ mapwidget_manipulator->update();
+}
void MapWidget::deselect()
{
for (int i = 0; i < mapwidget_enties.size(); ++i) {
EntityWidget *entitywidget = mapwidget_enties.at(i);
- entitywidget->set_selected(false);
+ entitywidget->set_selected(EntityWidget::SelectNone);
}
mapwidget_selected = 0;
@@ -147,12 +211,20 @@ void MapWidget::dragEntity(EntityWidget *entity, int x, int y)
int radius = (int) (entity->properties()->radius() * zoom());
if (radius < 6)
radius = 6;
-
- entity->properties()->set_location(
- entity->properties()->location()[0] - (int) ((float) (y - radius) / zoom()),
- entity->properties()->location()[1] - (int) ((float) (x - radius) / zoom()),
- entity->properties()->location()[2]
- );
+
+ for (int i = 0; i < mapwidget_enties.size(); ++i) {
+
+ EntityWidget *entitywidget = mapwidget_enties.at(i);
+
+ if ((entitywidget->selected() == EntityWidget::SelectHighlight) || (entitywidget->selected() == EntityWidget::SelectActive)) {
+
+ entitywidget->properties()->set_location(
+ entitywidget->properties()->location()[0] - (int) ((float) (y - radius) / zoom()),
+ entitywidget->properties()->location()[1] - (int) ((float) (x - radius) / zoom()),
+ entitywidget->properties()->location()[2]
+ );
+ }
+ }
emit propertiesChanged(entity->properties());
resizeChildren();
@@ -161,6 +233,10 @@ void MapWidget::dragEntity(EntityWidget *entity, int x, int y)
void MapWidget::select(EntityWidget *entity)
{
+ if (mapwidget_selected == entity) {
+ return;
+ }
+
mapwidget_selected = 0;
mapwidget_manipulator->setMode(Manipulator::None);
@@ -170,7 +246,7 @@ void MapWidget::select(EntityWidget *entity)
if (entity == entitywidget) {
- entity->set_selected(true);
+ entity->set_selected(EntityWidget::SelectActive);
//qDebug() << "selected entity " << entity->name();
emit propertiesChanged(entity->properties());
mapwidget_manipulator->setMode(Manipulator::Select);
@@ -178,8 +254,7 @@ void MapWidget::select(EntityWidget *entity)
mapwidget_manipulator->setSize(entity);
mapwidget_selected = entity;
} else {
-
- entitywidget->set_selected(false);
+ entitywidget->set_selected(EntityWidget::SelectNone);
}
}
update();
@@ -259,6 +334,18 @@ void MapWidget::paintEvent(QPaintEvent *event)
painter.drawLine(0, y, width(), y);
y += gridsize;
}
+
+ if (is_box_selecting) {
+ x = dragstop_x < dragstart_x ? dragstop_x : dragstart_x;
+ y = dragstop_y < dragstart_y ? dragstop_y : dragstart_y;
+ int w = abs(dragstop_x - dragstart_x);
+ int h = abs(dragstop_y - dragstart_y);
+
+ pen.setColor(QColor(255, 0, 0));
+ painter.setPen(pen);
+ painter.drawRect(x, y, w ,h);
+ }
+
}
@@ -290,15 +377,17 @@ EntityWidget *MapWidget::addEntity()
void MapWidget::duplicateSelected()
{
- std::vector<EntityWidget *> new_widgets;
+ // obtain count only once, this will exclude the new widgets copying itself in an endless loop
+ const int count = mapwidget_enties.size();
- for (int i = 0; i < mapwidget_enties.size(); ++i) {
+ for (int i = 0; i < count; ++i) {
EntityWidget *entitywidget = mapwidget_enties.at(i);
- if (entitywidget->selected()) {
+
+ if ((entitywidget->selected() == EntityWidget::SelectHighlight) || (entitywidget->selected() == EntityWidget::SelectActive)) {
+
// duplicate the child widget
EntityWidget *new_entitywidget = addEntity();
- new_widgets.push_back(new_entitywidget);
new_entitywidget->assign(*entitywidget);
// offset the new widget's position
@@ -306,16 +395,19 @@ void MapWidget::duplicateSelected()
Vector3f location = new_entitywidget->properties()->location();
new_entitywidget->properties()->set_location(location.x() + offset, location.y() - offset, location.z());
+ // copy selection state to the new widget
+ new_entitywidget->set_selected(entitywidget->selected());
+
// deselect the old widgets
- entitywidget->set_selected(false);
- } else {
+ entitywidget->set_selected(EntityWidget::SelectNone);
+
+ if (entitywidget == mapwidget_selected) {
+ mapwidget_selected = new_entitywidget;
+ }
}
}
-
- // select the new widgets
- for(int i = 0; i < new_widgets.size(); ++i)
- new_widgets.at(i)->set_selected(true);
-
+
+ emit propertiesChanged(mapwidget_selected->properties());
resizeChildren();
update();
}
@@ -327,7 +419,7 @@ void MapWidget::deleteSelected()
while (i != mapwidget_enties.end()) {
EntityWidget *entitywidget = (*i);
- if (entitywidget->selected()) {
+ if ((entitywidget->selected() == EntityWidget::SelectHighlight) || (entitywidget->selected() == EntityWidget::SelectActive)) {
// delete the child widget
delete entitywidget;
// set the pointer in the list to NULL