repaint regions

This commit is contained in:
Will McGugan
2022-07-20 10:01:14 +01:00
parent 49764a3ec7
commit 8f7b271b75
4 changed files with 16 additions and 19 deletions

View File

@@ -2,10 +2,10 @@
* { /* * {
transition: color 300ms linear, background 300ms linear; transition: color 300ms linear, background 300ms linear;
} }
*/
*:hover { *:hover {
/* tint: 30% red; /* tint: 30% red;

View File

@@ -609,6 +609,7 @@ class Compositor:
Returns: Returns:
SegmentLines: A renderable SegmentLines: A renderable
""" """
width, height = self.size width, height = self.size
screen_region = Region(0, 0, width, height) screen_region = Region(0, 0, width, height)
@@ -706,7 +707,7 @@ class Compositor:
region, clip = self.regions[widget] region, clip = self.regions[widget]
offset = region.offset offset = region.offset
intersection = clip.intersection intersection = clip.intersection
for dirty_region in widget.get_dirty_regions(): for dirty_region in widget._exchange_repaint_regions():
update_region = intersection(dirty_region.translate(offset)) update_region = intersection(dirty_region.translate(offset))
if update_region: if update_region:
add_region(update_region) add_region(update_region)

View File

@@ -40,16 +40,6 @@ class ScrollView(Widget):
"""Not transparent, i.e. renders something.""" """Not transparent, i.e. renders something."""
return False return False
def get_dirty_regions(self) -> Collection[Region]:
"""Get regions which require a repaint.
Returns:
Collection[Region]: Regions to repaint.
"""
regions = self._dirty_regions.copy()
self._dirty_regions.clear()
return regions
def on_mount(self): def on_mount(self):
self._refresh_scrollbars() self._refresh_scrollbars()

View File

@@ -106,7 +106,10 @@ class Widget(DOMNode):
self._horizontal_scrollbar: ScrollBar | None = None self._horizontal_scrollbar: ScrollBar | None = None
self._render_cache = RenderCache(Size(0, 0), []) self._render_cache = RenderCache(Size(0, 0), [])
# Regions which need to be updated (in Widget)
self._dirty_regions: set[Region] = set() self._dirty_regions: set[Region] = set()
# Regions which need to be transferred from cache to screen
self._repaint_regions: set[Region] = set()
# Cache the auto content dimensions # Cache the auto content dimensions
# TODO: add mechanism to explicitly clear this # TODO: add mechanism to explicitly clear this
@@ -549,24 +552,27 @@ class Widget(DOMNode):
*regions (Region): Regions which require a repaint. *regions (Region): Regions which require a repaint.
""" """
if regions: if regions:
content_offset = self.content_offset content_offset = self.content_offset
widget_regions = [region.translate(content_offset) for region in regions] widget_regions = [region.translate(content_offset) for region in regions]
self._dirty_regions.update(widget_regions) self._dirty_regions.update(widget_regions)
self._repaint_regions.update(widget_regions)
self._styles_cache.set_dirty(*widget_regions) self._styles_cache.set_dirty(*widget_regions)
else: else:
self._dirty_regions.clear() self._dirty_regions.clear()
self._repaint_regions.clear()
self._styles_cache.clear() self._styles_cache.clear()
self._dirty_regions.add(self.outer_size.region) self._dirty_regions.add(self.outer_size.region)
self._repaint_regions.add(self.outer_size.region)
def get_dirty_regions(self) -> Collection[Region]: def _exchange_repaint_regions(self) -> Collection[Region]:
"""Get regions which require a repaint. """Get a copy of the regions which need a repaint, and clear internal cache.
Returns: Returns:
Collection[Region]: Regions to repaint. Collection[Region]: Regions to repaint.
""" """
regions = self._dirty_regions.copy() regions = self._repaint_regions.copy()
self._repaint_regions.clear()
return regions return regions
def scroll_to( def scroll_to(
@@ -956,10 +962,10 @@ class Widget(DOMNode):
"""Render the widget in to lines. """Render the widget in to lines.
Args: Args:
crop (Region): Region within visible area to. crop (Region): Region within visible area to render.
Returns: Returns:
Lines: A list of list of segments Lines: A list of list of segments.
""" """
lines = self._styles_cache.render_widget(self, crop) lines = self._styles_cache.render_widget(self, crop)
return lines return lines