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