First attempt at a scrolling indicator
This commit is contained in:
parent
373b22690d
commit
621839dc17
@ -1,6 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from PyQt5.QtCore import QUrl, pyqtSignal, Qt, QPoint
|
from PyQt5.QtCore import QUrl, pyqtSignal, Qt, QPoint, QEvent
|
||||||
from PyQt5.QtPrintSupport import QPrintPreviewDialog
|
from PyQt5.QtPrintSupport import QPrintPreviewDialog
|
||||||
from PyQt5.QtWebKitWidgets import QWebView
|
from PyQt5.QtWebKitWidgets import QWebView
|
||||||
|
|
||||||
@ -11,6 +11,8 @@ class TabbedBrowser(TabWidget):
|
|||||||
|
|
||||||
cur_progress = pyqtSignal(int) # Progress of the current tab changed
|
cur_progress = pyqtSignal(int) # Progress of the current tab changed
|
||||||
cur_load_finished = pyqtSignal(bool) # Current tab finished loading
|
cur_load_finished = pyqtSignal(bool) # Current tab finished loading
|
||||||
|
# Current tab changed scroll position
|
||||||
|
cur_scroll_perc_changed = pyqtSignal(int, int)
|
||||||
keypress = pyqtSignal('QKeyEvent')
|
keypress = pyqtSignal('QKeyEvent')
|
||||||
_url_stack = [] # Stack of URLs of closed tabs
|
_url_stack = [] # Stack of URLs of closed tabs
|
||||||
|
|
||||||
@ -30,6 +32,7 @@ class TabbedBrowser(TabWidget):
|
|||||||
lambda *args: self._filter_signals(self.cur_progress, *args))
|
lambda *args: self._filter_signals(self.cur_progress, *args))
|
||||||
tab.loadFinished.connect(
|
tab.loadFinished.connect(
|
||||||
lambda *args: self._filter_signals(self.cur_load_finished, *args))
|
lambda *args: self._filter_signals(self.cur_load_finished, *args))
|
||||||
|
tab.scroll_pos_changed.connect(self._scroll_pos_changed_handler)
|
||||||
# FIXME should we really bind this to loadStarted? Sometimes the URL
|
# FIXME should we really bind this to loadStarted? Sometimes the URL
|
||||||
# isn't set correctly at this point, e.g. when doing
|
# isn't set correctly at this point, e.g. when doing
|
||||||
# setContent(..., baseUrl=QUrl('foo'))
|
# setContent(..., baseUrl=QUrl('foo'))
|
||||||
@ -166,9 +169,24 @@ class TabbedBrowser(TabWidget):
|
|||||||
tab = self.widget(idx)
|
tab = self.widget(idx)
|
||||||
self.cur_progress.emit(tab.progress)
|
self.cur_progress.emit(tab.progress)
|
||||||
|
|
||||||
|
def _scroll_pos_changed_handler(self, point):
|
||||||
|
"""Gets a QPoint() of the new position from a BrowserTab. If it's the
|
||||||
|
current tab, it calculates the percentage and emits
|
||||||
|
cur_scroll_perc_changed.
|
||||||
|
"""
|
||||||
|
sender = self.sender()
|
||||||
|
if sender != self.currentWidget():
|
||||||
|
return
|
||||||
|
size = sender.page().mainFrame().contentsSize()
|
||||||
|
perc_x = 100 / size.width() * point.x()
|
||||||
|
perc_y = 100 / size.height() * point.y()
|
||||||
|
self.cur_scroll_perc_changed.emit(perc_x, perc_y)
|
||||||
|
|
||||||
class BrowserTab(QWebView):
|
class BrowserTab(QWebView):
|
||||||
"""One browser tab in TabbedBrowser"""
|
"""One browser tab in TabbedBrowser"""
|
||||||
progress = 0
|
progress = 0
|
||||||
|
scroll_pos_changed = pyqtSignal('QPoint')
|
||||||
|
_scroll_pos = QPoint(-1, -1)
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
@ -176,6 +194,7 @@ class BrowserTab(QWebView):
|
|||||||
frame.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
|
frame.setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
|
||||||
frame.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
|
frame.setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
|
||||||
self.loadProgress.connect(self.set_progress)
|
self.loadProgress.connect(self.set_progress)
|
||||||
|
self.installEventFilter(self)
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def openurl(self, url):
|
def openurl(self, url):
|
||||||
@ -186,3 +205,18 @@ class BrowserTab(QWebView):
|
|||||||
|
|
||||||
def set_progress(self, prog):
|
def set_progress(self, prog):
|
||||||
self.progress = prog
|
self.progress = prog
|
||||||
|
|
||||||
|
def eventFilter(self, watched, e):
|
||||||
|
"""Dirty hack to emit a signal if the scroll position changed.
|
||||||
|
|
||||||
|
We listen to repaint requests here, in the hope a repaint will always
|
||||||
|
be requested when scrolling, and if the scroll position actually
|
||||||
|
changed, we emit a signal.
|
||||||
|
"""
|
||||||
|
if watched == self and e.type() == QEvent.Paint:
|
||||||
|
new_pos = self.page().mainFrame().scrollPosition()
|
||||||
|
if self._scroll_pos != new_pos:
|
||||||
|
logging.debug("Updating scroll position")
|
||||||
|
self.scroll_pos_changed.emit(new_pos)
|
||||||
|
self._scroll_pos = new_pos
|
||||||
|
return super().eventFilter(watched, e)
|
||||||
|
@ -26,6 +26,7 @@ class MainWindow(QMainWindow):
|
|||||||
|
|
||||||
self.tabs.cur_progress.connect(self.status.prog.set_progress)
|
self.tabs.cur_progress.connect(self.status.prog.set_progress)
|
||||||
self.tabs.cur_load_finished.connect(self.status.prog.load_finished)
|
self.tabs.cur_load_finished.connect(self.status.prog.load_finished)
|
||||||
|
self.tabs.cur_scroll_perc_changed.connect(self.status.txt.set_perc)
|
||||||
self.status.cmd.esc_pressed.connect(self.tabs.setFocus)
|
self.status.cmd.esc_pressed.connect(self.tabs.setFocus)
|
||||||
|
|
||||||
#self.retranslateUi(MainWindow)
|
#self.retranslateUi(MainWindow)
|
||||||
|
@ -116,6 +116,13 @@ class StatusText(QLabel):
|
|||||||
"""Setter to be used as a Qt slot"""
|
"""Setter to be used as a Qt slot"""
|
||||||
self.keystring = s
|
self.keystring = s
|
||||||
|
|
||||||
|
def set_perc(self, x, y):
|
||||||
|
"""Setter to be used as a Qt slot"""
|
||||||
|
if y == 0:
|
||||||
|
self.scrollperc = '[top]'
|
||||||
|
else:
|
||||||
|
self.scrollperc = '[{}%]'.format(y)
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
"""Update the text displayed"""
|
"""Update the text displayed"""
|
||||||
self.setText(' '.join([self.keystring, self.error, self.text,
|
self.setText(' '.join([self.keystring, self.error, self.text,
|
||||||
|
Loading…
Reference in New Issue
Block a user