Hi David, David Faden writes: > I'd like to allow users to zoom in on a graph by clicking and dragging > the mouse not on the axes but on the graph itself. Ideally, users > would click at the point they want to be one corner of the zoomed view, > then drag the mouse to select the area of the zoomed view. And I would > like to draw a box around the area to be zoomed into. How hard is this to > do with ROOT? Is there already a class included with ROOT 3.0 that > provides the service I describe? If anyone has example code, I would love > to see it. (Sorry if I have once again missed the obvious.) As far as I have found you need to do some by-hand work to get this to happen. I do this by subclassing TPad (in a class called ``View''), overriding ExecuteEvent and emitting a signal when a box is drawn (click-hold-drag events). This signal is then connected to a method which calls View's TPad::Range() method. I use a signal instead of calling a function directly because other things may be interested in this click-hold-drag gesture. Having TPad or a TPad derived class in ROOT which emits signals in response to various common gestures might be useful. The overridden ExecuteEvent() is below. If anything isn't clear, ask away. HTH, -Brett. ---------------- void View::ExecuteEvent(Int_t event, Int_t px, Int_t py) { switch (event) { case kButton1Down: gPad->SetCursor(kHand); fInside = 1; fSelectedRange[0] = px; fSelectedRange[1] = py; break; case kButton1Motion: fInside=1; if (fDrawingSelection) gVirtualX->DrawBox(fSelectedRange[0], fSelectedRange[1], fSelectedRange[2], fSelectedRange[3], TVirtualX::kHollow); fSelectedRange[2] = px; fSelectedRange[3] = py; fDrawingSelection = true; gVirtualX->DrawBox(fSelectedRange[0], fSelectedRange[1], fSelectedRange[2], fSelectedRange[3], TVirtualX::kHollow); break; case kButton1Up: { gPad->SetCursor(kPointer); // Bail if outside pad - this check was found empirically, // there might be a better way??? Int_t dtp = this->DistancetoPrimitive(fSelectedRange[2], fSelectedRange[3]); if (!fDrawingSelection || dtp || !fInside) { this->ClearSelection(); break; } fHaveSelection = true; fDrawingSelection = false; Selected(); // emits "Selected()" signal break; } case kMouseLeave: fInside = false; break; case kMouseEnter: fInside = true; break; } } void View::Slected(void) { Emit("Selected()"); }
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:49 MET