更新批量索引集

This commit is contained in:
codeboss 2025-10-13 00:25:29 +08:00
parent 529abd14b4
commit 4f511a2a5d
4 changed files with 23 additions and 14 deletions

View File

@ -12,7 +12,7 @@ int main(int argc, char* argv[])
MapPresent p; MapPresent p;
p.show(); p.show();
p.zoomTo(1); p.zoomTo(0);
//QObject::connect(&p, &MapPresent::mouseIn, [=]() { //QObject::connect(&p, &MapPresent::mouseIn, [=]() {
// qDebug() << "Mouse Enter"; // qDebug() << "Mouse Enter";

View File

@ -20,10 +20,11 @@ MapPresent::MapPresent(QWidget* parent /*= nullptr*/)
_type_present_delegate[delegate->unitType()] = delegate; _type_present_delegate[delegate->unitType()] = delegate;
connect(this, &MapPresent::mouseOutNotify, delegate, &BasicUnitDelegate::hotClear); connect(this, &MapPresent::mouseOutNotify, delegate, &BasicUnitDelegate::hotClear);
connect(this, &MapPresent::mouseHoverNotify, delegate, &BasicUnitDelegate::hotIndexSet); connect(this, &MapPresent::mouseHoverNotify, delegate, &BasicUnitDelegate::hotIndexSet);
connect(delegate, &BasicUnitDelegate::updateRequest, [=](const PresentIndex& idx) { connect(delegate, &BasicUnitDelegate::updateRequest, [=](const QList<PresentIndex>& list) {
if (idx.isValid() && !_updated_index_list.contains(idx)) { for (auto idx : list)
_updated_index_list.append(idx); if (idx.isValid() && !_updated_index_list.contains(idx)) {
} _updated_index_list.append(idx);
}
this->update(); this->update();
}); });
@ -33,7 +34,7 @@ MapPresent::MapPresent(QWidget* parent /*= nullptr*/)
void MapPresent::zoomTo(double percent) void MapPresent::zoomTo(double percent)
{ {
this->_scale_times = std::max(1.0 / 2, percent); this->_scale_times = std::max(1.0 / 5, percent);
this->visible_units_tidy(); this->visible_units_tidy();
this->update(); this->update();
@ -63,6 +64,11 @@ void MapPresent::setDataModel(MapDataModel* model)
this->update(); this->update();
} }
MapDataModel* MapPresent::dataModel() const
{
return _map_data_model;
}
PresentIndex MapPresent::indexGet(const QPointF& pos) const PresentIndex MapPresent::indexGet(const QPointF& pos) const
{ {
QList<PresentOption> templist; QList<PresentOption> templist;
@ -193,8 +199,9 @@ void MapPresent::mouseReleaseEvent(QMouseEvent* ev)
emit this->mouseReleaseNotify(ev); emit this->mouseReleaseNotify(ev);
} }
PresentOption AssumeOpt(PresentIndex index, QRectF rf) { PresentOption AssumeOpt(PresentIndex index, QRectF rf, MapDataModel *m) {
PresentOption opt; PresentOption opt;
opt.dataModel = m;
opt.index = index; opt.index = index;
opt.outline = rf; opt.outline = rf;
return opt; return opt;
@ -206,7 +213,7 @@ void MapPresent::visible_units_tidy() {
QRectF curr_outline = this->rect(); QRectF curr_outline = this->rect();
_paint_buffer = QPixmap(curr_outline.toRect().size()); _paint_buffer = QPixmap(curr_outline.toRect().size());
_visible_units[_center_index] = AssumeOpt(_center_index, outlineGet(_center_index)); _visible_units[_center_index] = AssumeOpt(_center_index, outlineGet(_center_index), _map_data_model);
int visible_count = 1, deduce_x = 1; int visible_count = 1, deduce_x = 1;
while (visible_count) { while (visible_count) {
visible_count = 0; visible_count = 0;
@ -215,13 +222,13 @@ void MapPresent::visible_units_tidy() {
for (auto unit : siblings) { for (auto unit : siblings) {
auto visible_rect = outlineGet(unit); auto visible_rect = outlineGet(unit);
if (curr_outline.intersects(visible_rect)) { if (curr_outline.intersects(visible_rect)) {
_visible_units[unit] = AssumeOpt(unit, visible_rect); _visible_units[unit] = AssumeOpt(unit, visible_rect, _map_data_model);
visible_count++; visible_count++;
} }
} }
} }
for (auto optx : _visible_units) for (auto &optx : _visible_units)
_updated_index_list.append(optx.index); _updated_index_list.append(optx.index);
} }
@ -297,5 +304,6 @@ PresentOption& PresentOption::operator=(const PresentOption& other)
{ {
index = other.index; index = other.index;
outline = other.outline; outline = other.outline;
dataModel = other.dataModel;
return *this; return *this;
} }

View File

@ -91,7 +91,7 @@ signals:
/// <summary> /// <summary>
/// 更新通知/重绘请求 /// 更新通知/重绘请求
/// </summary> /// </summary>
void updateRequest(const PresentIndex& idx); void updateRequest(const QList<PresentIndex>& idx_list);
}; };
/// <summary> /// <summary>
@ -170,6 +170,7 @@ public:
/// </summary> /// </summary>
/// <param name="model"></param> /// <param name="model"></param>
void setDataModel(MapDataModel* model); void setDataModel(MapDataModel* model);
MapDataModel* dataModel() const;
/// <summary> /// <summary>
/// 通过widget上定位获取绘制索引 /// 通过widget上定位获取绘制索引

View File

@ -72,7 +72,7 @@ void BasicUnitDelegate::hotClear()
auto prev_idx = _hot_index; auto prev_idx = _hot_index;
_hot_index = PresentIndex(); _hot_index = PresentIndex();
emit this->updateRequest(prev_idx); emit this->updateRequest({ prev_idx });
} }
void BasicUnitDelegate::hotIndexSet(const PresentIndex& idx) void BasicUnitDelegate::hotIndexSet(const PresentIndex& idx)
@ -81,7 +81,7 @@ void BasicUnitDelegate::hotIndexSet(const PresentIndex& idx)
auto prev_idx = _hot_index; auto prev_idx = _hot_index;
_hot_index = idx; _hot_index = idx;
emit this->updateRequest(prev_idx); emit this->updateRequest({ prev_idx });
emit this->updateRequest(idx); emit this->updateRequest({ idx });
} }
} }