Implement searching
This commit is contained in:
parent
c0f01d9219
commit
18c68ce74e
@ -53,6 +53,7 @@ class QuteBrowser(QApplication):
|
|||||||
config.init(confdir)
|
config.init(confdir)
|
||||||
|
|
||||||
self.commandparser = cmdutils.CommandParser()
|
self.commandparser = cmdutils.CommandParser()
|
||||||
|
self.searchparser = cmdutils.SearchParser()
|
||||||
self.keyparser = KeyParser(self.mainwindow)
|
self.keyparser = KeyParser(self.mainwindow)
|
||||||
self._init_cmds()
|
self._init_cmds()
|
||||||
self.mainwindow = MainWindow()
|
self.mainwindow = MainWindow()
|
||||||
@ -61,9 +62,14 @@ class QuteBrowser(QApplication):
|
|||||||
self.mainwindow.tabs.keypress.connect(self.keyparser.handle)
|
self.mainwindow.tabs.keypress.connect(self.keyparser.handle)
|
||||||
self.keyparser.set_cmd_text.connect(self.mainwindow.status.cmd.set_cmd)
|
self.keyparser.set_cmd_text.connect(self.mainwindow.status.cmd.set_cmd)
|
||||||
self.mainwindow.status.cmd.got_cmd.connect(self.commandparser.run)
|
self.mainwindow.status.cmd.got_cmd.connect(self.commandparser.run)
|
||||||
|
self.mainwindow.status.cmd.got_search.connect(self.searchparser.search)
|
||||||
|
self.mainwindow.status.cmd.got_search_rev.connect(
|
||||||
|
self.searchparser.search_rev)
|
||||||
self.mainwindow.status.cmd.returnPressed.connect(
|
self.mainwindow.status.cmd.returnPressed.connect(
|
||||||
self.mainwindow.tabs.setFocus)
|
self.mainwindow.tabs.setFocus)
|
||||||
self.commandparser.error.connect(self.mainwindow.status.disp_error)
|
self.commandparser.error.connect(self.mainwindow.status.disp_error)
|
||||||
|
self.searchparser.do_search.connect(
|
||||||
|
self.mainwindow.tabs.cur_search)
|
||||||
self.keyparser.commandparser.error.connect(
|
self.keyparser.commandparser.error.connect(
|
||||||
self.mainwindow.status.disp_error)
|
self.mainwindow.status.disp_error)
|
||||||
self.keyparser.keystring_updated.connect(
|
self.keyparser.keystring_updated.connect(
|
||||||
@ -178,6 +184,7 @@ class QuteBrowser(QApplication):
|
|||||||
'scroll_perc_y': self.mainwindow.tabs.cur_scroll_percent_y,
|
'scroll_perc_y': self.mainwindow.tabs.cur_scroll_percent_y,
|
||||||
'undo': self.mainwindow.tabs.undo_close,
|
'undo': self.mainwindow.tabs.undo_close,
|
||||||
'pyeval': self.pyeval,
|
'pyeval': self.pyeval,
|
||||||
|
'nextsearch': self.searchparser.nextsearch,
|
||||||
}
|
}
|
||||||
|
|
||||||
handler = handlers[cmd]
|
handler = handlers[cmd]
|
||||||
|
@ -145,3 +145,10 @@ class PyEval(Command):
|
|||||||
|
|
||||||
nargs = 1
|
nargs = 1
|
||||||
split_args = False
|
split_args = False
|
||||||
|
|
||||||
|
|
||||||
|
class NextSearch(Command):
|
||||||
|
"""Jump to the next search term."""
|
||||||
|
|
||||||
|
nargs = 0
|
||||||
|
hide = True
|
||||||
|
@ -5,6 +5,7 @@ import inspect
|
|||||||
import shlex
|
import shlex
|
||||||
|
|
||||||
from PyQt5.QtCore import QObject, pyqtSignal
|
from PyQt5.QtCore import QObject, pyqtSignal
|
||||||
|
from PyQt5.QtWebKitWidgets import QWebPage
|
||||||
|
|
||||||
import qutebrowser.commands
|
import qutebrowser.commands
|
||||||
from qutebrowser.commands.exceptions import (ArgumentCountError,
|
from qutebrowser.commands.exceptions import (ArgumentCountError,
|
||||||
@ -29,6 +30,43 @@ def register_all():
|
|||||||
cmd_dict[n] = obj
|
cmd_dict[n] = obj
|
||||||
|
|
||||||
|
|
||||||
|
class SearchParser(QObject):
|
||||||
|
"""Parse qutebrowser searches."""
|
||||||
|
text = None
|
||||||
|
flags = 0
|
||||||
|
do_search = pyqtSignal(str, 'QWebPage::FindFlags')
|
||||||
|
|
||||||
|
def search(self, text):
|
||||||
|
"""Search for a text on a website.
|
||||||
|
|
||||||
|
text -- The text to search for.
|
||||||
|
"""
|
||||||
|
self._search(text)
|
||||||
|
|
||||||
|
def search_rev(self, text):
|
||||||
|
"""Search for a text on a website in reverse direction.
|
||||||
|
|
||||||
|
text -- The text to search for.
|
||||||
|
"""
|
||||||
|
self._search(text, rev=True)
|
||||||
|
|
||||||
|
def _search(self, text, rev=False):
|
||||||
|
"""Search for a text on the current page.
|
||||||
|
|
||||||
|
text -- The text to search for.
|
||||||
|
rev -- Search direction.
|
||||||
|
"""
|
||||||
|
self.text = text
|
||||||
|
if rev:
|
||||||
|
self.flags = QWebPage.FindBackward
|
||||||
|
self.do_search.emit(self.text, self.flags)
|
||||||
|
|
||||||
|
def nextsearch(self):
|
||||||
|
"""Continue the search to the next term."""
|
||||||
|
if self.text is not None:
|
||||||
|
self.do_search.emit(self.text, self.flags)
|
||||||
|
|
||||||
|
|
||||||
class CommandParser(QObject):
|
class CommandParser(QObject):
|
||||||
"""Parse qutebrowser commandline commands."""
|
"""Parse qutebrowser commandline commands."""
|
||||||
text = ''
|
text = ''
|
||||||
|
@ -36,6 +36,7 @@ default_config = {
|
|||||||
'u': 'undo',
|
'u': 'undo',
|
||||||
'gg': 'scroll_perc_y 0',
|
'gg': 'scroll_perc_y 0',
|
||||||
'G': 'scroll_perc_y',
|
'G': 'scroll_perc_y',
|
||||||
|
'n': 'nextsearch',
|
||||||
},
|
},
|
||||||
'colors': {
|
'colors': {
|
||||||
'completion.fg': '#333333',
|
'completion.fg': '#333333',
|
||||||
|
@ -145,6 +145,14 @@ class TabbedBrowser(TabWidget):
|
|||||||
# FIXME display warning if end of history
|
# FIXME display warning if end of history
|
||||||
self.currentWidget().forward()
|
self.currentWidget().forward()
|
||||||
|
|
||||||
|
def cur_search(self, text, flags):
|
||||||
|
"""Search for text in the current page.
|
||||||
|
|
||||||
|
text -- The text to search for.
|
||||||
|
flags -- The QWebPage::FindFlags.
|
||||||
|
"""
|
||||||
|
self.currentWidget().findText(text, flags)
|
||||||
|
|
||||||
def cur_scroll(self, dx, dy, count=None):
|
def cur_scroll(self, dx, dy, count=None):
|
||||||
"""Scroll the current tab by count * dx/dy
|
"""Scroll the current tab by count * dx/dy
|
||||||
|
|
||||||
|
@ -12,6 +12,9 @@ class Command(QLineEdit):
|
|||||||
"""The commandline part of the statusbar."""
|
"""The commandline part of the statusbar."""
|
||||||
# Emitted when a command is triggered by the user
|
# Emitted when a command is triggered by the user
|
||||||
got_cmd = pyqtSignal(str)
|
got_cmd = pyqtSignal(str)
|
||||||
|
# Emitted for searches triggered by the user
|
||||||
|
got_search = pyqtSignal(str)
|
||||||
|
got_search_rev = pyqtSignal(str)
|
||||||
statusbar = None # The status bar object
|
statusbar = None # The status bar object
|
||||||
esc_pressed = pyqtSignal() # Emitted when escape is pressed
|
esc_pressed = pyqtSignal() # Emitted when escape is pressed
|
||||||
tab_pressed = pyqtSignal(bool) # Emitted when tab is pressed (arg: shift)
|
tab_pressed = pyqtSignal(bool) # Emitted when tab is pressed (arg: shift)
|
||||||
@ -47,13 +50,18 @@ class Command(QLineEdit):
|
|||||||
|
|
||||||
def process_cmdline(self):
|
def process_cmdline(self):
|
||||||
"""Handle the command in the status bar."""
|
"""Handle the command in the status bar."""
|
||||||
|
signals = {
|
||||||
|
':': self.got_cmd,
|
||||||
|
'/': self.got_search,
|
||||||
|
'?': self.got_search_rev,
|
||||||
|
}
|
||||||
self._histbrowse_stop()
|
self._histbrowse_stop()
|
||||||
text = self.text()
|
text = self.text()
|
||||||
if not self.history or text != self.history[-1]:
|
if not self.history or text != self.history[-1]:
|
||||||
self.history.append(text)
|
self.history.append(text)
|
||||||
self.setText('')
|
self.setText('')
|
||||||
if text[0] == ':':
|
if text[0] in signals:
|
||||||
self.got_cmd.emit(text.lstrip(':'))
|
signals[text[0]].emit(text.lstrip(text[0]))
|
||||||
|
|
||||||
def set_cmd(self, text):
|
def set_cmd(self, text):
|
||||||
"""Preset the statusbar to some text."""
|
"""Preset the statusbar to some text."""
|
||||||
|
Loading…
Reference in New Issue
Block a user