Mercurial > hg > svgui
comparison layer/TimeInstantLayer.cpp @ 20:1deb5f87a18c
* Add getXForFrame / getFrameForX in preference to using the zoom level everywhere
| author | Chris Cannam |
|---|---|
| date | Mon, 30 Jan 2006 13:19:42 +0000 |
| parents | 7c767d41bcee |
| children | 3a506d25d95a |
comparison
equal
deleted
inserted
replaced
| 19:46d8f5add6f0 | 20:1deb5f87a18c |
|---|---|
| 56 list.push_back(tr("Colour")); | 56 list.push_back(tr("Colour")); |
| 57 return list; | 57 return list; |
| 58 } | 58 } |
| 59 | 59 |
| 60 Layer::PropertyType | 60 Layer::PropertyType |
| 61 TimeInstantLayer::getPropertyType(const PropertyName &name) const | 61 TimeInstantLayer::getPropertyType(const PropertyName &) const |
| 62 { | 62 { |
| 63 return ValueProperty; | 63 return ValueProperty; |
| 64 } | 64 } |
| 65 | 65 |
| 66 int | 66 int |
| 149 SparseOneDimensionalModel::PointList | 149 SparseOneDimensionalModel::PointList |
| 150 TimeInstantLayer::getLocalPoints(int x) const | 150 TimeInstantLayer::getLocalPoints(int x) const |
| 151 { | 151 { |
| 152 if (!m_model) return SparseOneDimensionalModel::PointList(); | 152 if (!m_model) return SparseOneDimensionalModel::PointList(); |
| 153 | 153 |
| 154 long startFrame = m_view->getStartFrame(); | 154 long frame = getFrameForX(x); |
| 155 long endFrame = m_view->getEndFrame(); | |
| 156 int zoomLevel = m_view->getZoomLevel(); | |
| 157 long frame = startFrame + x * zoomLevel; | |
| 158 | 155 |
| 159 SparseOneDimensionalModel::PointList onPoints = | 156 SparseOneDimensionalModel::PointList onPoints = |
| 160 m_model->getPoints(frame); | 157 m_model->getPoints(frame); |
| 161 | 158 |
| 162 if (!onPoints.empty()) { | 159 if (!onPoints.empty()) { |
| 170 | 167 |
| 171 SparseOneDimensionalModel::PointList usePoints = prevPoints; | 168 SparseOneDimensionalModel::PointList usePoints = prevPoints; |
| 172 | 169 |
| 173 if (prevPoints.empty()) { | 170 if (prevPoints.empty()) { |
| 174 usePoints = nextPoints; | 171 usePoints = nextPoints; |
| 175 } else if (prevPoints.begin()->frame < startFrame && | 172 } else if (prevPoints.begin()->frame < m_view->getStartFrame() && |
| 176 !(nextPoints.begin()->frame > endFrame)) { | 173 !(nextPoints.begin()->frame > m_view->getEndFrame())) { |
| 177 usePoints = nextPoints; | 174 usePoints = nextPoints; |
| 178 } else if (nextPoints.begin()->frame - frame < | 175 } else if (nextPoints.begin()->frame - frame < |
| 179 frame - prevPoints.begin()->frame) { | 176 frame - prevPoints.begin()->frame) { |
| 180 usePoints = nextPoints; | 177 usePoints = nextPoints; |
| 181 } | 178 } |
| 264 { | 261 { |
| 265 if (!m_model || !m_model->isOK()) return; | 262 if (!m_model || !m_model->isOK()) return; |
| 266 | 263 |
| 267 // Profiler profiler("TimeInstantLayer::paint", true); | 264 // Profiler profiler("TimeInstantLayer::paint", true); |
| 268 | 265 |
| 269 long startFrame = m_view->getStartFrame(); | |
| 270 int zoomLevel = m_view->getZoomLevel(); | |
| 271 | |
| 272 int x0 = rect.left(), x1 = rect.right(); | 266 int x0 = rect.left(), x1 = rect.right(); |
| 273 long frame0 = startFrame + x0 * zoomLevel; | 267 |
| 274 long frame1 = startFrame + x1 * zoomLevel; | 268 long frame0 = getFrameForX(x0); |
| 269 long frame1 = getFrameForX(x1); | |
| 275 | 270 |
| 276 SparseOneDimensionalModel::PointList points(m_model->getPoints | 271 SparseOneDimensionalModel::PointList points(m_model->getPoints |
| 277 (frame0, frame1)); | 272 (frame0, frame1)); |
| 278 | 273 |
| 279 paint.setPen(m_colour); | 274 paint.setPen(m_colour); |
| 299 | 294 |
| 300 const SparseOneDimensionalModel::Point &p(*i); | 295 const SparseOneDimensionalModel::Point &p(*i); |
| 301 SparseOneDimensionalModel::PointList::const_iterator j = i; | 296 SparseOneDimensionalModel::PointList::const_iterator j = i; |
| 302 ++j; | 297 ++j; |
| 303 | 298 |
| 304 int x = (p.frame - startFrame) / zoomLevel; | 299 int x = getXForFrame(p.frame); |
| 305 float w = float(m_model->getResolution()) / zoomLevel; | 300 int iw = getXForFrame(p.frame + m_model->getResolution()) - x; |
| 306 int iw = w; | |
| 307 if (iw < 2) { | 301 if (iw < 2) { |
| 308 if (iw < 1) { | 302 if (iw < 1) { |
| 309 iw = 2; | 303 iw = 2; |
| 310 if (j != points.end()) { | 304 if (j != points.end()) { |
| 311 int nx = ((*j).frame - startFrame) / zoomLevel; | 305 int nx = getXForFrame(j->frame); |
| 312 if (nx < x + 3) iw = 1; | 306 if (nx < x + 3) iw = 1; |
| 313 } | 307 } |
| 314 } else { | 308 } else { |
| 315 iw = 2; | 309 iw = 2; |
| 316 } | 310 } |
| 317 } | 311 } |
| 318 | 312 |
| 319 if (p.frame == illuminateFrame) { | 313 if (p.frame == illuminateFrame) { |
| 320 paint.setPen(Qt::black); //!!! | 314 paint.setPen(Qt::black); //!!! |
| 321 } else { | 315 } else { |
| 322 paint.setPen(brushColour); | 316 paint.setPen(brushColour); |
| 323 } | 317 } |
| 330 | 324 |
| 331 int lw = paint.fontMetrics().width(p.label); | 325 int lw = paint.fontMetrics().width(p.label); |
| 332 bool good = true; | 326 bool good = true; |
| 333 | 327 |
| 334 if (j != points.end()) { | 328 if (j != points.end()) { |
| 335 int nx = (j->frame - startFrame) / zoomLevel; | 329 int nx = getXForFrame(j->frame); |
| 336 if (nx >= x && nx - x - w - 3 <= lw) good = false; | 330 if (nx >= x && nx - x - iw - 3 <= lw) good = false; |
| 337 } | 331 } |
| 338 | 332 |
| 339 if (good) { | 333 if (good) { |
| 340 paint.drawText(x + w + 2, | 334 paint.drawText(x + iw + 2, |
| 341 m_view->height() - paint.fontMetrics().height(), | 335 m_view->height() - paint.fontMetrics().height(), |
| 342 p.label); | 336 p.label); |
| 343 } | 337 } |
| 344 } | 338 } |
| 345 } | 339 } |
| 350 { | 344 { |
| 351 std::cerr << "TimeInstantLayer::drawStart(" << e->x() << ")" << std::endl; | 345 std::cerr << "TimeInstantLayer::drawStart(" << e->x() << ")" << std::endl; |
| 352 | 346 |
| 353 if (!m_model) return; | 347 if (!m_model) return; |
| 354 | 348 |
| 355 long frame = e->x() * m_view->getZoomLevel() + m_view->getStartFrame(); | 349 long frame = getFrameForX(e->x()); |
| 356 if (frame < 0) frame = 0; | 350 if (frame < 0) frame = 0; |
| 357 m_editingPoint = SparseOneDimensionalModel::Point(frame, tr("New Point")); | 351 m_editingPoint = SparseOneDimensionalModel::Point(frame, tr("New Point")); |
| 358 m_model->addPoint(m_editingPoint); | 352 m_model->addPoint(m_editingPoint); |
| 359 m_editing = true; | 353 m_editing = true; |
| 360 } | 354 } |
| 364 { | 358 { |
| 365 std::cerr << "TimeInstantLayer::drawDrag(" << e->x() << ")" << std::endl; | 359 std::cerr << "TimeInstantLayer::drawDrag(" << e->x() << ")" << std::endl; |
| 366 | 360 |
| 367 if (!m_model || !m_editing) return; | 361 if (!m_model || !m_editing) return; |
| 368 | 362 |
| 369 long frame = e->x() * m_view->getZoomLevel() + m_view->getStartFrame(); | 363 long frame = getFrameForX(e->x()); |
| 370 if (frame < 0) frame = 0; | 364 if (frame < 0) frame = 0; |
| 371 m_model->deletePoint(m_editingPoint); | 365 m_model->deletePoint(m_editingPoint); |
| 372 m_editingPoint.frame = frame; | 366 m_editingPoint.frame = frame; |
| 373 m_model->addPoint(m_editingPoint); | 367 m_model->addPoint(m_editingPoint); |
| 374 } | 368 } |
| 400 { | 394 { |
| 401 std::cerr << "TimeInstantLayer::editDrag(" << e->x() << ")" << std::endl; | 395 std::cerr << "TimeInstantLayer::editDrag(" << e->x() << ")" << std::endl; |
| 402 | 396 |
| 403 if (!m_model || !m_editing) return; | 397 if (!m_model || !m_editing) return; |
| 404 | 398 |
| 405 long frame = e->x() * m_view->getZoomLevel() + m_view->getStartFrame(); | 399 long frame = getFrameForX(e->x()); |
| 406 if (frame < 0) frame = 0; | 400 if (frame < 0) frame = 0; |
| 407 m_model->deletePoint(m_editingPoint); | 401 m_model->deletePoint(m_editingPoint); |
| 408 m_editingPoint.frame = frame; | 402 m_editingPoint.frame = frame; |
| 409 m_model->addPoint(m_editingPoint); | 403 m_model->addPoint(m_editingPoint); |
| 410 } | 404 } |
