diff options
Diffstat (limited to 'src/mapwidget.cc')
-rw-r--r-- | src/mapwidget.cc | 144 |
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 |