DrawingArea Internal Behaviour
Here is more information about the
DrawingArea internal stuffs.
It is related to the way
qt manages draw events sent by the X Server.
First, you must know that a draw event is a rectangle in your window that you
must redraw.
Then there is two ways:
-
All X11 draw events are merged by QT into a Region object, that is not rectangular, and then the QT paint event is called, and thus the Gambas Draw event. All drawings during the draw event handler will be clipped by this region.
It worked like that before my modifications.
-
QT merges nothing, and you get one Gambas draw event for each X11 draw event. The drawing is clipped by the rectangle.
It works like that now.
Why doing that ?
Logically, during the drawing event handler, you have to draw the less
possible things to speed up the drawing.
The only way in Gambas to know what to draw is using the
Clip property.
of the
Draw class.
In the first case, as drawing is clipped by the region,
Draw.
Clip.[X/Y/W/H] returns
the smallest rectangle that includes the region.
But, for example, when you enlarge a little a window, the region contains two
rectangles: one at the right of the window, the other at the bottom. And so,
the including rectangle is the entire window!
+--------------------------------+---+
| | x | xxx = The region used by Qt
| | x |
| | x |
| | x |
| | x |
| | x |
| | x |
| Old size | x |
| | x |
+--------------------------------+ x |
|xxxxxxxxxxxxxxxxxxxxx New size xxxx |
+------------------------------------+
When you can easily draw any sub-rectangle of your drawing area, the second
way is the better.
When you can't easily do that, i.e. when your drawing is too complex to be
easily splitted into a rectangle, you prefer drawing everything each time you
receive a
Draw event. And so, you do the job twice or more times comparing to
the first way. So it is twice or more slower.
The solution is having a property in the
DrawingArea to tell it merging
or not drawing events.
This is the
merge ? property.