diff --git a/src/noggit/MapView.cpp b/src/noggit/MapView.cpp index 00fbeee1..7f869af6 100644 --- a/src/noggit/MapView.cpp +++ b/src/noggit/MapView.cpp @@ -1842,7 +1842,7 @@ void MapView::tick (float dt) if (_mod_shift_down) { // draw the selected AreaId on current selected chunk - _world->setAreaID(_cursor_pos, _selected_area_id, false); + _world->setAreaID(_cursor_pos, _selected_area_id, false, ZoneIDBrowser->brushRadius()); } else if (_mod_ctrl_down) { @@ -2348,6 +2348,9 @@ void MapView::draw_map() case editing_mode::mccv: radius = shaderTool->brushRadius(); break; + case editing_mode::areaid: + radius = ZoneIDBrowser->brushRadius(); + break; } //! \note Select terrain below mouse, if no item selected or the item is map. @@ -2706,6 +2709,10 @@ void MapView::mouseMoveEvent (QMouseEvent* event) case editing_mode::mccv: shaderTool->changeRadius(relative_movement.dx() / XSENS); break; + case editing_mode::areaid: + ZoneIDBrowser->changeRadius(relative_movement.dx() / XSENS); + break; + } } diff --git a/src/noggit/World.cpp b/src/noggit/World.cpp index 453a7b81..184d1881 100644 --- a/src/noggit/World.cpp +++ b/src/noggit/World.cpp @@ -1411,7 +1411,7 @@ void World::CropWaterADT(const tile_index& pos) for_tile_at(pos, [](MapTile* tile) { tile->CropWater(); }); } -void World::setAreaID(math::vector_3d const& pos, int id, bool adt) +void World::setAreaID(math::vector_3d const& pos, int id, bool adt, float radius) { if (adt) { @@ -1419,7 +1419,22 @@ void World::setAreaID(math::vector_3d const& pos, int id, bool adt) } else { - for_chunk_at(pos, [&](MapChunk* chunk) { chunk->setAreaID(id);}); + + if (radius >= 0) + { + for_all_chunks_in_range(pos, radius, + [&] (MapChunk* chunk) + { + chunk->setAreaID(id); + return true; + } + ); + + } + else + { + for_chunk_at(pos, [&](MapChunk* chunk) { chunk->setAreaID(id);}); + } } } diff --git a/src/noggit/World.h b/src/noggit/World.h index 1ca3d3d2..6726c839 100644 --- a/src/noggit/World.h +++ b/src/noggit/World.h @@ -126,7 +126,7 @@ public: ); unsigned int getAreaID (math::vector_3d const&); - void setAreaID(math::vector_3d const& pos, int id, bool adt); + void setAreaID(math::vector_3d const& pos, int id, bool adt, float radius = -1.0f); selection_result intersect ( math::matrix_4x4 const& model_view , math::ray const& diff --git a/src/noggit/ui/ZoneIDBrowser.cpp b/src/noggit/ui/ZoneIDBrowser.cpp index a69fb152..7cdf0bff 100644 --- a/src/noggit/ui/ZoneIDBrowser.cpp +++ b/src/noggit/ui/ZoneIDBrowser.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -21,8 +22,21 @@ namespace noggit , _area_tree(new QTreeWidget()) , mapID(-1) { - new QVBoxLayout(this); - this->layout()->addWidget(_area_tree); + auto layout = new QFormLayout(this); + + _radius_spin = new QDoubleSpinBox (this); + _radius_spin->setRange (0.0f, 250.0f); + _radius_spin->setDecimals (2); + _radius_spin->setValue (_radius); + + layout->addRow ("Radius:", _radius_spin); + + _radius_slider = new QSlider (Qt::Orientation::Horizontal, this); + _radius_slider->setRange (0, 100); + _radius_slider->setSliderPosition (_radius); + + layout->addRow (_radius_slider); + layout->addRow (_area_tree); connect ( _area_tree, &QTreeWidget::itemSelectionChanged @@ -35,6 +49,24 @@ namespace noggit } } ); + + connect ( _radius_spin, qOverload (&QDoubleSpinBox::valueChanged) + , [&] (double v) + { + _radius = v; + QSignalBlocker const blocker(_radius_slider); + _radius_slider->setSliderPosition ((int)std::round (v)); + } + ); + + connect ( _radius_slider, &QSlider::valueChanged + , [&] (int v) + { + _radius = v; + QSignalBlocker const blocker(_radius_spin); + _radius_spin->setValue(v); + } + ); } void zone_id_browser::setMapID(int id) @@ -89,6 +121,11 @@ namespace noggit } } + void zone_id_browser::changeRadius(float change) + { + _radius_spin->setValue (_radius + change); + } + QTreeWidgetItem* zone_id_browser::create_or_get_tree_widget_item(int area_id) { auto it = _items.find(area_id); diff --git a/src/noggit/ui/ZoneIDBrowser.h b/src/noggit/ui/ZoneIDBrowser.h index cae3f72d..07a87a02 100644 --- a/src/noggit/ui/ZoneIDBrowser.h +++ b/src/noggit/ui/ZoneIDBrowser.h @@ -4,6 +4,8 @@ #include #include +#include +#include #include #include @@ -20,14 +22,22 @@ namespace noggit zone_id_browser(QWidget* parent = nullptr); void setMapID(int id); void setZoneID(int id); + void changeRadius(float change); + + float brushRadius() const { return _radius; } signals: void selected (int area_id); private: QTreeWidget* _area_tree; + + QSlider* _radius_slider; + QDoubleSpinBox* _radius_spin; + std::map _items; int mapID; + float _radius = 15.0f; void buildAreaList(); QTreeWidgetItem* create_or_get_tree_widget_item(int area_id);