Mercurial > hg > svgui
comparison view/Pane.cpp @ 826:43256b925e15 tonioni
Support horizontal two-finger scrolling on Mac, and adjust zoom rate on vertical scroll to make it less crazily fast
| author | Chris Cannam |
|---|---|
| date | Fri, 18 Jul 2014 15:06:04 +0100 |
| parents | 40c6c9344ff6 |
| children | 5acfb11e8aef |
comparison
equal
deleted
inserted
replaced
| 825:f7590917177c | 826:43256b925e15 |
|---|---|
| 76 m_resizing(false), | 76 m_resizing(false), |
| 77 m_editing(false), | 77 m_editing(false), |
| 78 m_releasing(false), | 78 m_releasing(false), |
| 79 m_centreLineVisible(true), | 79 m_centreLineVisible(true), |
| 80 m_scaleWidth(0), | 80 m_scaleWidth(0), |
| 81 m_pendingWheelAngle(0), | |
| 81 m_headsUpDisplay(0), | 82 m_headsUpDisplay(0), |
| 82 m_vpan(0), | 83 m_vpan(0), |
| 83 m_hthumb(0), | 84 m_hthumb(0), |
| 84 m_vthumb(0), | 85 m_vthumb(0), |
| 85 m_reset(0), | 86 m_reset(0), |
| 2237 } | 2238 } |
| 2238 | 2239 |
| 2239 void | 2240 void |
| 2240 Pane::wheelEvent(QWheelEvent *e) | 2241 Pane::wheelEvent(QWheelEvent *e) |
| 2241 { | 2242 { |
| 2242 //cerr << "wheelEvent, delta " << e->delta() << endl; | 2243 cerr << "wheelEvent, delta " << e->delta() << ", angleDelta " << e->angleDelta().x() << "," << e->angleDelta().y() << ", pixelDelta " << e->pixelDelta().x() << "," << e->pixelDelta().y() << ", modifiers " << e->modifiers() << endl; |
| 2243 | 2244 |
| 2244 int count = e->delta(); | 2245 int dx = e->angleDelta().x(); |
| 2245 | 2246 int dy = e->angleDelta().y(); |
| 2246 if (count > 0) { | 2247 |
| 2247 if (count >= 120) count /= 120; | 2248 if (dx == 0 && dy == 0) { |
| 2248 else count = 1; | 2249 return; |
| 2249 } | 2250 } |
| 2250 | 2251 |
| 2251 if (count < 0) { | 2252 int d = dy; |
| 2252 if (count <= -120) count /= 120; | 2253 bool horizontal = false; |
| 2253 else count = -1; | 2254 |
| 2254 } | 2255 if (abs(dx) > abs(dy)) { |
| 2255 | 2256 d = dx; |
| 2256 if (e->modifiers() & Qt::ControlModifier) { | 2257 horizontal = true; |
| 2258 } else if (e->modifiers() & Qt::ControlModifier) { | |
| 2259 // treat a vertical wheel as horizontal | |
| 2260 horizontal = true; | |
| 2261 } | |
| 2262 | |
| 2263 if (e->phase() == Qt::ScrollBegin || | |
| 2264 fabs(d) >= 120 || | |
| 2265 (d > 0 && m_pendingWheelAngle < 0) || | |
| 2266 (d < 0 && m_pendingWheelAngle > 0)) { | |
| 2267 m_pendingWheelAngle = d; | |
| 2268 } else { | |
| 2269 m_pendingWheelAngle += d; | |
| 2270 } | |
| 2271 | |
| 2272 if (horizontal && e->pixelDelta().x() != 0) { | |
| 2273 | |
| 2274 // Have fine pixel information: use it | |
| 2275 | |
| 2276 wheelHorizontalFine(e->pixelDelta().x(), e->modifiers()); | |
| 2277 | |
| 2278 m_pendingWheelAngle = 0; | |
| 2279 | |
| 2280 } else { | |
| 2281 | |
| 2282 // Coarse wheel information (or vertical zoom, which is | |
| 2283 // necessarily coarse itself) | |
| 2284 | |
| 2285 while (abs(m_pendingWheelAngle) >= 120) { | |
| 2286 | |
| 2287 int sign = (m_pendingWheelAngle < 0 ? -1 : 1); | |
| 2288 | |
| 2289 if (horizontal) { | |
| 2290 wheelHorizontal(sign, e->modifiers()); | |
| 2291 } else { | |
| 2292 wheelVertical(sign, e->modifiers()); | |
| 2293 } | |
| 2294 | |
| 2295 m_pendingWheelAngle -= sign * 120; | |
| 2296 } | |
| 2297 } | |
| 2298 } | |
| 2299 | |
| 2300 void | |
| 2301 Pane::wheelVertical(int sign, Qt::KeyboardModifiers mods) | |
| 2302 { | |
| 2303 cerr << "wheelVertical: sign = " << sign << endl; | |
| 2304 | |
| 2305 if (mods & Qt::ShiftModifier) { | |
| 2306 | |
| 2307 // Pan vertically | |
| 2308 | |
| 2309 if (m_vpan) { | |
| 2310 m_vpan->scroll(sign > 0); | |
| 2311 } | |
| 2312 | |
| 2313 } else if (mods & Qt::AltModifier) { | |
| 2314 | |
| 2315 // Zoom vertically | |
| 2316 | |
| 2317 if (m_vthumb) { | |
| 2318 m_vthumb->scroll(sign > 0); | |
| 2319 } | |
| 2320 | |
| 2321 } else { | |
| 2322 | |
| 2323 // Zoom in or out | |
| 2324 | |
| 2325 int newZoomLevel = m_zoomLevel; | |
| 2326 | |
| 2327 if (sign > 0) { | |
| 2328 if (newZoomLevel <= 2) { | |
| 2329 newZoomLevel = 1; | |
| 2330 } else { | |
| 2331 newZoomLevel = getZoomConstraintBlockSize | |
| 2332 (newZoomLevel - 1, ZoomConstraint::RoundDown); | |
| 2333 } | |
| 2334 } else { // sign < 0 | |
| 2335 newZoomLevel = getZoomConstraintBlockSize | |
| 2336 (newZoomLevel + 1, ZoomConstraint::RoundUp); | |
| 2337 } | |
| 2338 | |
| 2339 if (newZoomLevel != m_zoomLevel) { | |
| 2340 setZoomLevel(newZoomLevel); | |
| 2341 } | |
| 2342 } | |
| 2343 | |
| 2344 emit paneInteractedWith(); | |
| 2345 } | |
| 2346 | |
| 2347 void | |
| 2348 Pane::wheelHorizontal(int sign, Qt::KeyboardModifiers mods) | |
| 2349 { | |
| 2350 cerr << "wheelHorizontal: sign = " << sign << endl; | |
| 2257 | 2351 |
| 2258 // Scroll left or right, rapidly | 2352 // Scroll left or right, rapidly |
| 2353 | |
| 2354 wheelHorizontalFine((width() / 4) * sign, mods); | |
| 2355 } | |
| 2356 | |
| 2357 void | |
| 2358 Pane::wheelHorizontalFine(int pixels, Qt::KeyboardModifiers) | |
| 2359 { | |
| 2360 cerr << "wheelHorizontalFine: pixels = " << pixels << endl; | |
| 2361 | |
| 2362 // Scroll left or right by a fixed number of pixels | |
| 2259 | 2363 |
| 2260 if (getStartFrame() < 0 && | 2364 if (getStartFrame() < 0 && |
| 2261 getEndFrame() >= getModelsEndFrame()) return; | 2365 getEndFrame() >= getModelsEndFrame()) return; |
| 2262 | 2366 |
| 2263 int delta = ((width() / 2) * count * m_zoomLevel); | 2367 int delta = (pixels * m_zoomLevel); |
| 2264 | 2368 |
| 2265 if (m_centreFrame < delta) { | 2369 if (m_centreFrame < delta) { |
| 2266 setCentreFrame(0); | 2370 setCentreFrame(0); |
| 2267 } else if (m_centreFrame - delta >= getModelsEndFrame()) { | 2371 } else if (m_centreFrame - delta >= getModelsEndFrame()) { |
| 2268 setCentreFrame(getModelsEndFrame()); | 2372 setCentreFrame(getModelsEndFrame()); |
| 2269 } else { | 2373 } else { |
| 2270 setCentreFrame(m_centreFrame - delta); | 2374 setCentreFrame(m_centreFrame - delta); |
| 2271 } | |
| 2272 | |
| 2273 } else if (e->modifiers() & Qt::ShiftModifier) { | |
| 2274 | |
| 2275 // Zoom vertically | |
| 2276 | |
| 2277 if (m_vpan) { | |
| 2278 m_vpan->scroll(e->delta() > 0); | |
| 2279 } | |
| 2280 | |
| 2281 } else if (e->modifiers() & Qt::AltModifier) { | |
| 2282 | |
| 2283 // Zoom vertically | |
| 2284 | |
| 2285 if (m_vthumb) { | |
| 2286 m_vthumb->scroll(e->delta() > 0); | |
| 2287 } | |
| 2288 | |
| 2289 } else { | |
| 2290 | |
| 2291 // Zoom in or out | |
| 2292 | |
| 2293 int newZoomLevel = m_zoomLevel; | |
| 2294 | |
| 2295 while (count > 0) { | |
| 2296 if (newZoomLevel <= 2) { | |
| 2297 newZoomLevel = 1; | |
| 2298 break; | |
| 2299 } | |
| 2300 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel - 1, | |
| 2301 ZoomConstraint::RoundDown); | |
| 2302 --count; | |
| 2303 } | |
| 2304 | |
| 2305 while (count < 0) { | |
| 2306 newZoomLevel = getZoomConstraintBlockSize(newZoomLevel + 1, | |
| 2307 ZoomConstraint::RoundUp); | |
| 2308 ++count; | |
| 2309 } | |
| 2310 | |
| 2311 if (newZoomLevel != m_zoomLevel) { | |
| 2312 setZoomLevel(newZoomLevel); | |
| 2313 } | |
| 2314 } | 2375 } |
| 2315 | 2376 |
| 2316 emit paneInteractedWith(); | 2377 emit paneInteractedWith(); |
| 2317 } | 2378 } |
| 2318 | 2379 |
