Mercurial > hg > svgui
comparison layer/BoxLayer.cpp @ 1546:ec837d223bd9
Update getPointToDrag to prefer boxes that are containing the mouse position in height as well as width
| author | Chris Cannam |
|---|---|
| date | Thu, 17 Oct 2019 10:26:21 +0100 |
| parents | 4f8c72adbf43 |
| children | e6362cf5ff1d |
comparison
equal
deleted
inserted
replaced
| 1545:bdf284b29722 | 1546:ec837d223bd9 |
|---|---|
| 263 return {}; | 263 return {}; |
| 264 } | 264 } |
| 265 | 265 |
| 266 bool | 266 bool |
| 267 BoxLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, | 267 BoxLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, |
| 268 Event &point) const | 268 Event &point) const |
| 269 { | 269 { |
| 270 auto model = ModelById::getAs<BoxModel>(m_model); | 270 auto model = ModelById::getAs<BoxModel>(m_model); |
| 271 if (!model) return false; | 271 if (!model) return false; |
| 272 | 272 |
| 273 sv_frame_t frame = v->getFrameForX(x); | 273 sv_frame_t frame = v->getFrameForX(x); |
| 274 | 274 |
| 275 EventVector onPoints = model->getEventsCovering(frame); | 275 EventVector onPoints = model->getEventsCovering(frame); |
| 276 if (onPoints.empty()) return false; | 276 if (onPoints.empty()) return false; |
| 277 | 277 |
| 278 int nearestDistance = -1; | 278 Event bestContaining; |
| 279 for (const auto &p: onPoints) { | 279 for (const auto &p: onPoints) { |
| 280 int distance = getYForValue(v, p.getValue()) - y; | 280 auto r = getRange(p); |
| 281 if (distance < 0) distance = -distance; | 281 if (y > getYForValue(v, r.first) || y < getYForValue(v, r.second)) { |
| 282 if (nearestDistance == -1 || distance < nearestDistance) { | 282 SVCERR << "inPoints: rejecting " << p.toXmlString() << endl; |
| 283 nearestDistance = distance; | 283 continue; |
| 284 point = p; | 284 } |
| 285 SVCERR << "inPoints: looking at " << p.toXmlString() << endl; | |
| 286 if (bestContaining == Event()) { | |
| 287 bestContaining = p; | |
| 288 continue; | |
| 289 } | |
| 290 auto br = getRange(bestContaining); | |
| 291 if (r.first < br.first && r.second > br.second) { | |
| 292 continue; | |
| 293 } | |
| 294 if (r.first > br.first && r.second < br.second) { | |
| 295 bestContaining = p; | |
| 296 continue; | |
| 297 } | |
| 298 if (p.getFrame() > bestContaining.getFrame() && | |
| 299 p.getFrame() + p.getDuration() < | |
| 300 bestContaining.getFrame() + bestContaining.getDuration()) { | |
| 301 bestContaining = p; | |
| 302 continue; | |
| 303 } | |
| 304 } | |
| 305 | |
| 306 if (bestContaining != Event()) { | |
| 307 point = bestContaining; | |
| 308 } else { | |
| 309 int nearestDistance = -1; | |
| 310 for (const auto &p: onPoints) { | |
| 311 int distance = std::min | |
| 312 (getYForValue(v, p.getValue()) - y, | |
| 313 getYForValue(v, p.getValue() + fabsf(p.getLevel())) - y); | |
| 314 if (distance < 0) distance = -distance; | |
| 315 if (nearestDistance == -1 || distance < nearestDistance) { | |
| 316 nearestDistance = distance; | |
| 317 point = p; | |
| 318 } | |
| 285 } | 319 } |
| 286 } | 320 } |
| 287 | 321 |
| 288 return true; | 322 return true; |
| 289 } | 323 } |
| 305 return QString(); | 339 return QString(); |
| 306 } | 340 } |
| 307 | 341 |
| 308 QString | 342 QString |
| 309 BoxLayer::getFeatureDescription(LayerGeometryProvider *v, | 343 BoxLayer::getFeatureDescription(LayerGeometryProvider *v, |
| 310 QPoint &pos) const | 344 QPoint &pos) const |
| 311 { | 345 { |
| 312 int x = pos.x(); | 346 int x = pos.x(); |
| 313 | 347 |
| 314 auto model = ModelById::getAs<BoxModel>(m_model); | 348 auto model = ModelById::getAs<BoxModel>(m_model); |
| 315 if (!model || !model->getSampleRate()) return ""; | 349 if (!model || !model->getSampleRate()) return ""; |
| 371 return text; | 405 return text; |
| 372 } | 406 } |
| 373 | 407 |
| 374 bool | 408 bool |
| 375 BoxLayer::snapToFeatureFrame(LayerGeometryProvider *v, | 409 BoxLayer::snapToFeatureFrame(LayerGeometryProvider *v, |
| 376 sv_frame_t &frame, | 410 sv_frame_t &frame, |
| 377 int &resolution, | 411 int &resolution, |
| 378 SnapType snap) const | 412 SnapType snap) const |
| 379 { | 413 { |
| 380 auto model = ModelById::getAs<BoxModel>(m_model); | 414 auto model = ModelById::getAs<BoxModel>(m_model); |
| 381 if (!model) { | 415 if (!model) { |
| 382 return Layer::snapToFeatureFrame(v, frame, resolution, snap); | 416 return Layer::snapToFeatureFrame(v, frame, resolution, snap); |
| 383 } | 417 } |
