Only apply visibility toggle if we have >10 tabs

This commit is contained in:
Jay Kamat 2018-09-29 12:25:49 -07:00
parent 3081d017ce
commit a5f9115b2f
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5
2 changed files with 31 additions and 14 deletions

View File

@ -21,6 +21,7 @@
import functools import functools
import enum import enum
import contextlib
import attr import attr
from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QSize, QRect, QPoint, from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QSize, QRect, QPoint,
@ -214,20 +215,36 @@ class TabWidget(QTabWidget):
fields['scroll_pos'] = scroll_pos fields['scroll_pos'] = scroll_pos
return fields return fields
def update_tab_titles(self): @contextlib.contextmanager
"""Update all texts.""" def _toggle_visibility(self, force_toggle=False):
# Every single call to setTabText calls the size hinting functions for """Toggle visibility while running.
# every single tab, which are slow. Since we know we are updating all
# the tab's titles, we can delay this processing by making the tab Every single call to setTabText calls the size hinting functions for
# non-visible. To avoid flickering, disable repaint updates whlie we every single tab, which are slow. Since we know we are updating all
# work. the tab's titles, we can delay this processing by making the tab
non-visible. To avoid flickering, disable repaint updates whlie we
work.
Args:
force_toggle: Whether to always force the toggle, or only do it
if we have enough tabs for it to matter
"""
if self.count() > 10:
force_toggle = True
if force_toggle:
self.setUpdatesEnabled(False) self.setUpdatesEnabled(False)
self.setVisible(False) self.setVisible(False)
for idx in range(self.count()): yield
self.update_tab_title(idx) if force_toggle:
self.setVisible(True) self.setVisible(True)
self.setUpdatesEnabled(True) self.setUpdatesEnabled(True)
def update_tab_titles(self):
"""Update all texts."""
with self._toggle_visibility():
for idx in range(self.count()):
self.update_tab_title(idx)
def tabInserted(self, idx): def tabInserted(self, idx):
"""Update titles when a tab was inserted.""" """Update titles when a tab was inserted."""
super().tabInserted(idx) super().tabInserted(idx)

View File

@ -24,7 +24,7 @@ import functools
import pytest import pytest
from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtGui import QIcon, QPixmap
from qutebrowser.mainwindow import tabwidget, tabbedbrowser from qutebrowser.mainwindow import tabwidget
from qutebrowser.utils import usertypes from qutebrowser.utils import usertypes
@ -108,7 +108,7 @@ class TestTabWidget:
assert first_size == widget.tabBar().tabSizeHint(i) assert first_size == widget.tabBar().tabSizeHint(i)
assert first_size_min == widget.tabBar().minimumTabSizeHint(i) assert first_size_min == widget.tabBar().minimumTabSizeHint(i)
@pytest.mark.parametrize("num_tabs", [4, 10]) @pytest.mark.parametrize("num_tabs", [4, 10, 50, 100])
def test_update_tab_titles_benchmark(self, benchmark, widget, def test_update_tab_titles_benchmark(self, benchmark, widget,
qtbot, fake_web_tab, num_tabs): qtbot, fake_web_tab, num_tabs):
"""Benchmark for update_tab_titles.""" """Benchmark for update_tab_titles."""
@ -120,7 +120,7 @@ class TestTabWidget:
benchmark(widget.update_tab_titles) benchmark(widget.update_tab_titles)
@pytest.mark.parametrize("num_tabs", [4, 10]) @pytest.mark.parametrize("num_tabs", [4, 100])
@pytest.mark.parametrize("rev", [True, False]) @pytest.mark.parametrize("rev", [True, False])
def test_add_remove_tab_benchmark(self, benchmark, widget, def test_add_remove_tab_benchmark(self, benchmark, widget,
qtbot, fake_web_tab, num_tabs, rev): qtbot, fake_web_tab, num_tabs, rev):