Use signals to update statusbar in caret mode
This means we don't use objreg anymore to get the status bar, and also makes the bar more accurately reflect reality. See #3583
This commit is contained in:
parent
460bd86579
commit
e50068021d
@ -333,7 +333,14 @@ class AbstractZoom(QObject):
|
|||||||
|
|
||||||
class AbstractCaret(QObject):
|
class AbstractCaret(QObject):
|
||||||
|
|
||||||
"""Attribute of AbstractTab for caret browsing."""
|
"""Attribute of AbstractTab for caret browsing.
|
||||||
|
|
||||||
|
Signals:
|
||||||
|
selection_toggled: Emitted when the selection was toggled.
|
||||||
|
arg: Whether the selection is now active.
|
||||||
|
"""
|
||||||
|
|
||||||
|
selection_toggled = pyqtSignal(bool)
|
||||||
|
|
||||||
def __init__(self, tab, mode_manager, parent=None):
|
def __init__(self, tab, mode_manager, parent=None):
|
||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
|
@ -230,7 +230,7 @@ class WebEngineCaret(browsertab.AbstractCaret):
|
|||||||
|
|
||||||
self._tab.run_js_async(
|
self._tab.run_js_async(
|
||||||
javascript.assemble('caret', 'setPlatform', sys.platform))
|
javascript.assemble('caret', 'setPlatform', sys.platform))
|
||||||
self._js_call('setInitialCursor')
|
self._js_call('setInitialCursor', self.selection_toggled.emit)
|
||||||
|
|
||||||
@pyqtSlot(usertypes.KeyMode)
|
@pyqtSlot(usertypes.KeyMode)
|
||||||
def _on_mode_left(self, mode):
|
def _on_mode_left(self, mode):
|
||||||
@ -297,7 +297,7 @@ class WebEngineCaret(browsertab.AbstractCaret):
|
|||||||
self._js_call('moveToEndOfDocument')
|
self._js_call('moveToEndOfDocument')
|
||||||
|
|
||||||
def toggle_selection(self):
|
def toggle_selection(self):
|
||||||
self._js_call('toggleSelection')
|
self._js_call('toggleSelection', self.selection_toggled.emit)
|
||||||
|
|
||||||
def drop_selection(self):
|
def drop_selection(self):
|
||||||
self._js_call('dropSelection')
|
self._js_call('dropSelection')
|
||||||
@ -352,9 +352,8 @@ class WebEngineCaret(browsertab.AbstractCaret):
|
|||||||
self._tab.run_js_async(js_code, lambda jsret:
|
self._tab.run_js_async(js_code, lambda jsret:
|
||||||
self._follow_selected_cb(jsret, tab))
|
self._follow_selected_cb(jsret, tab))
|
||||||
|
|
||||||
def _js_call(self, command):
|
def _js_call(self, command, callback=None):
|
||||||
self._tab.run_js_async(
|
self._tab.run_js_async(javascript.assemble('caret', command), callback)
|
||||||
javascript.assemble('caret', command))
|
|
||||||
|
|
||||||
|
|
||||||
class WebEngineScroller(browsertab.AbstractScroller):
|
class WebEngineScroller(browsertab.AbstractScroller):
|
||||||
|
@ -196,9 +196,10 @@ class WebKitCaret(browsertab.AbstractCaret):
|
|||||||
if mode != usertypes.KeyMode.caret:
|
if mode != usertypes.KeyMode.caret:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.selection_enabled = self._widget.hasSelection()
|
||||||
|
self.selection_toggled.emit(self.selection_enabled)
|
||||||
settings = self._widget.settings()
|
settings = self._widget.settings()
|
||||||
settings.setAttribute(QWebSettings.CaretBrowsingEnabled, True)
|
settings.setAttribute(QWebSettings.CaretBrowsingEnabled, True)
|
||||||
self.selection_enabled = self._widget.hasSelection()
|
|
||||||
|
|
||||||
if self._widget.isVisible():
|
if self._widget.isVisible():
|
||||||
# Sometimes the caret isn't immediately visible, but unfocusing
|
# Sometimes the caret isn't immediately visible, but unfocusing
|
||||||
@ -363,9 +364,7 @@ class WebKitCaret(browsertab.AbstractCaret):
|
|||||||
|
|
||||||
def toggle_selection(self):
|
def toggle_selection(self):
|
||||||
self.selection_enabled = not self.selection_enabled
|
self.selection_enabled = not self.selection_enabled
|
||||||
mainwindow = objreg.get('main-window', scope='window',
|
self.selection_toggled.emit(self.selection_enabled)
|
||||||
window=self._tab.win_id)
|
|
||||||
mainwindow.status.set_mode_active(usertypes.KeyMode.caret, True)
|
|
||||||
|
|
||||||
def drop_selection(self):
|
def drop_selection(self):
|
||||||
self._widget.triggerPageAction(QWebPage.MoveToNextChar)
|
self._widget.triggerPageAction(QWebPage.MoveToNextChar)
|
||||||
|
@ -1269,13 +1269,14 @@ window._qutebrowser.caret = (function() {
|
|||||||
funcs.setInitialCursor = () => {
|
funcs.setInitialCursor = () => {
|
||||||
if (!CaretBrowsing.initiated) {
|
if (!CaretBrowsing.initiated) {
|
||||||
CaretBrowsing.setInitialCursor();
|
CaretBrowsing.setInitialCursor();
|
||||||
return;
|
return CaretBrowsing.selectionEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.getSelection().toString().length === 0) {
|
if (window.getSelection().toString().length === 0) {
|
||||||
positionCaret();
|
positionCaret();
|
||||||
}
|
}
|
||||||
CaretBrowsing.toggle();
|
CaretBrowsing.toggle();
|
||||||
|
return CaretBrowsing.selectionEnabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
funcs.setPlatform = (platform) => {
|
funcs.setPlatform = (platform) => {
|
||||||
@ -1361,6 +1362,7 @@ window._qutebrowser.caret = (function() {
|
|||||||
|
|
||||||
funcs.toggleSelection = () => {
|
funcs.toggleSelection = () => {
|
||||||
CaretBrowsing.selectionEnabled = !CaretBrowsing.selectionEnabled;
|
CaretBrowsing.selectionEnabled = !CaretBrowsing.selectionEnabled;
|
||||||
|
return CaretBrowsing.selectionEnabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
return funcs;
|
return funcs;
|
||||||
|
@ -479,6 +479,10 @@ class MainWindow(QWidget):
|
|||||||
self.tabbed_browser.cur_link_hovered.connect(status.url.set_hover_url)
|
self.tabbed_browser.cur_link_hovered.connect(status.url.set_hover_url)
|
||||||
self.tabbed_browser.cur_load_status_changed.connect(
|
self.tabbed_browser.cur_load_status_changed.connect(
|
||||||
status.url.on_load_status_changed)
|
status.url.on_load_status_changed)
|
||||||
|
|
||||||
|
self.tabbed_browser.cur_caret_selection_toggled.connect(
|
||||||
|
status.on_caret_selection_toggled)
|
||||||
|
|
||||||
self.tabbed_browser.cur_fullscreen_requested.connect(
|
self.tabbed_browser.cur_fullscreen_requested.connect(
|
||||||
self._on_fullscreen_requested)
|
self._on_fullscreen_requested)
|
||||||
self.tabbed_browser.cur_fullscreen_requested.connect(status.maybe_hide)
|
self.tabbed_browser.cur_fullscreen_requested.connect(status.maybe_hide)
|
||||||
|
@ -289,17 +289,9 @@ class StatusBar(QWidget):
|
|||||||
log.statusbar.debug("Setting prompt flag to {}".format(val))
|
log.statusbar.debug("Setting prompt flag to {}".format(val))
|
||||||
self._color_flags.prompt = val
|
self._color_flags.prompt = val
|
||||||
elif mode == usertypes.KeyMode.caret:
|
elif mode == usertypes.KeyMode.caret:
|
||||||
tab = self._current_tab()
|
if not val:
|
||||||
log.statusbar.debug("Setting caret flag - val {}, selection "
|
# Turning on is handled in on_current_caret_selection_toggled
|
||||||
"{}".format(val, tab.caret.selection_enabled))
|
log.statusbar.debug("Setting caret mode off")
|
||||||
if val:
|
|
||||||
if tab.caret.selection_enabled:
|
|
||||||
self._set_mode_text("{} selection".format(mode.name))
|
|
||||||
self._color_flags.caret = ColorFlags.CaretMode.selection
|
|
||||||
else:
|
|
||||||
self._set_mode_text(mode.name)
|
|
||||||
self._color_flags.caret = ColorFlags.CaretMode.on
|
|
||||||
else:
|
|
||||||
self._color_flags.caret = ColorFlags.CaretMode.off
|
self._color_flags.caret = ColorFlags.CaretMode.off
|
||||||
config.set_register_stylesheet(self, update=False)
|
config.set_register_stylesheet(self, update=False)
|
||||||
|
|
||||||
@ -377,6 +369,18 @@ class StatusBar(QWidget):
|
|||||||
self.maybe_hide()
|
self.maybe_hide()
|
||||||
assert tab.private == self._color_flags.private
|
assert tab.private == self._color_flags.private
|
||||||
|
|
||||||
|
@pyqtSlot(bool)
|
||||||
|
def on_caret_selection_toggled(self, selection):
|
||||||
|
"""Update the statusbar when entering/leaving caret selection mode."""
|
||||||
|
log.statusbar.debug("Setting caret selection {}".format(selection))
|
||||||
|
if selection:
|
||||||
|
self._set_mode_text("caret selection")
|
||||||
|
self._color_flags.caret = ColorFlags.CaretMode.selection
|
||||||
|
else:
|
||||||
|
self._set_mode_text("caret")
|
||||||
|
self._color_flags.caret = ColorFlags.CaretMode.on
|
||||||
|
config.set_register_stylesheet(self, update=False)
|
||||||
|
|
||||||
def resizeEvent(self, e):
|
def resizeEvent(self, e):
|
||||||
"""Extend resizeEvent of QWidget to emit a resized signal afterwards.
|
"""Extend resizeEvent of QWidget to emit a resized signal afterwards.
|
||||||
|
|
||||||
|
@ -104,6 +104,7 @@ class TabbedBrowser(QWidget):
|
|||||||
cur_scroll_perc_changed = pyqtSignal(int, int)
|
cur_scroll_perc_changed = pyqtSignal(int, int)
|
||||||
cur_load_status_changed = pyqtSignal(str)
|
cur_load_status_changed = pyqtSignal(str)
|
||||||
cur_fullscreen_requested = pyqtSignal(bool)
|
cur_fullscreen_requested = pyqtSignal(bool)
|
||||||
|
cur_caret_selection_toggled = pyqtSignal(bool)
|
||||||
close_window = pyqtSignal()
|
close_window = pyqtSignal()
|
||||||
resized = pyqtSignal('QRect')
|
resized = pyqtSignal('QRect')
|
||||||
current_tab_changed = pyqtSignal(browsertab.AbstractTab)
|
current_tab_changed = pyqtSignal(browsertab.AbstractTab)
|
||||||
@ -217,6 +218,8 @@ class TabbedBrowser(QWidget):
|
|||||||
self._filter.create(self.cur_load_status_changed, tab))
|
self._filter.create(self.cur_load_status_changed, tab))
|
||||||
tab.fullscreen_requested.connect(
|
tab.fullscreen_requested.connect(
|
||||||
self._filter.create(self.cur_fullscreen_requested, tab))
|
self._filter.create(self.cur_fullscreen_requested, tab))
|
||||||
|
tab.caret.selection_toggled.connect(
|
||||||
|
self._filter.create(self.cur_caret_selection_toggled, tab))
|
||||||
# misc
|
# misc
|
||||||
tab.scroller.perc_changed.connect(self.on_scroll_pos_changed)
|
tab.scroller.perc_changed.connect(self.on_scroll_pos_changed)
|
||||||
tab.url_changed.connect(
|
tab.url_changed.connect(
|
||||||
|
Loading…
Reference in New Issue
Block a user