I don't know under what circumstances the paint events should be coalesced, nor why it's not happening here. But here's an evil hack you can use in your class definition to get around the problem:

  (define refresh? #f)

  ;; 20hz timer to check the refresh? flag
  (define refresh-timer
    (make-object timer%
      (λ () (when refresh?
              (send this refresh)
              (set! refresh? #f)))
      50))

Instead of (send this refresh) you'd use (set! refresh? #t).

I think this hack stops working well when the plots start taking longer than 50ms to generate. The plot snips have some way to get around this that I can't remember, and also render on another thread to keep the GUI responsive. IIRC, the logic is tricky and hard to get right, so you might want to look into how those are implemented.

Neil ⊥

On 04/15/2014 12:59 PM, David Vanderson wrote:
Sorry for the delay.  I hacked together something that lets you drag
points around on a plot (attached).

Is there a way to access area's plot->dc?  For this example I wanted to
ask if the mouse was within 2 pixels of any point.

When dragging the point around on the plot, it looks like I'm seeing
multiple repaints queueing up.  It's especially bad on Linux where I can
move the mouse a bunch and then watch all the repaints happen over the
next few seconds.  I'm trying to figure out if this can be improved.

Question for GUI experts: Is there a reason why multiple repaint
requests in the queue should not be coalesced into a single paint?

Thanks,
Dave

On 04/01/2014 05:41 PM, Neil Toronto wrote:
On 04/01/2014 02:17 PM, David Vanderson wrote:
Plot is fantastic - thanks so much!

Is there a way to hook into the interactive features of plot so, for
instance, the user could click to add data or drag data points around?

I'm using plot/dc to draw onto a canvas, and I'd be more than happy just
to be able to ask a plot to translate a pixel position to the
corresponding axes' positions.  I know that plot does this for the
zooming feature, but is there a way for external code to do it?

There's not an easy way right now.

If you don't mind copying code, you can take some from `plot/dc' here:

    pkgs/plot-pkgs/plot-lib/plot/private/no-gui/plot2d.rkt

The main thing you need is access to the `area' object, which has a
public `dc->plot' method that translates device context coordinates
into plot coordinates. I'm sorry it's not easier. :/

It will be someday, I promise! I've lately decided that "2D and 3D
games that use Plot to render scenes" will be two of my main test
cases. Games are the most interactive uses I can think of, and they
need to be fast, so that should cover pretty much everyone's
interactivity needs.

Neil ⊥




____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to