docs: def _update_visible_blocks(self, *args):
          """ Updates the list of visible blocks """
          self._visible_blocks[:] = []
          block = self.firstVisibleBlock()
          block_nbr = block.blockNumber()
          top = int(self.blockBoundingGeometry(block).translated(
              self.contentOffset()).top())
          bottom = top + int(self.blockBoundingRect(block).height())
          ebottom_top = 0
          ebottom_bottom = self.height()
          while block.isValid():
              visible = (top >= ebottom_top and bottom <= ebottom_bottom)
              if not visible:
                  break
              if block.isVisible():
                  self._visible_blocks.append((top, block_nbr, block))
              block = block.next()
              top = bottom
              bottom = top + int(self.blockBoundingRect(block).height())
              block_nbr = block.blockNumber()