I’m writing a tutorial to implement a small Logo interpreter, and it
would
be nice to use QtRuby as an output canvas for the turtle graphics bit. I
have a simple canvas class:
class Canvas < Qt::Widget
def initialize
super
@lines = []
end
def draw_line(x1, y1, x2, y2)
@lines << [x1, y1, x2, y2]
end
def paintEvent(event)
painter = Qt::Painter.new(self)
painter.pen = Qt::Pen.new(@color)
@lines.each do |x1, y1, x2, y2|
painter.drawLine x1, y1, x2, y2
end
painter.end
end
end
which I intend passing to the turtle to use via
def forward n
theta = direction * PI / 180
new_x = @x + n * cos(theta)
new_y = @y + n * sin(theta)
if @drawing
canvas.draw_line x, y, new_x, new_y
end
@x = new_x
@y = new_y
end
I’m trying to keep the code as straightforward as possible, and focused
on
the interpreter rather than on the details of QtRuby. The problem is
that
Qt insists on being the main loop, and of course an interpreter needs to
run in a loop over the input code too.
I’m trying to think of a nice way to write the interpreter as
independently
of the Qt event loop as possible and send line drawing events to it by
simply calling canvas.draw_line, without having to change the
interpreter
architecture in any way, or have my tutorial bogged down by the details
of
threading and events.
One idea, e.g. would be to have the canvas object in the turtle be a
message queue, that the Qt canvas polled via a timer, but if someone can
think of something even simpler I’d love to hear it.
martin