From 1e8cb42c00e24f2086c72ed1767eba0b00d52307 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 19 Jan 2014 22:55:00 +0100 Subject: [PATCH] Rewrite whole command system. Every command signal now returns a tuple (count, args) and gets handled in app.py by cmd_handler. This makes things easier in a lot of places. --- qutebrowser/app.py | 65 +++++++++++++++++++++----------- qutebrowser/commands/commands.py | 18 --------- qutebrowser/commands/keys.py | 8 ++-- qutebrowser/commands/utils.py | 42 +++++++++------------ qutebrowser/widgets/browser.py | 16 ++++++-- 5 files changed, 77 insertions(+), 72 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 44058c02b..6c7b96c69 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -49,25 +49,48 @@ class QuteBrowser(QApplication): def init_cmds(self): cmdutils.register_all() cmds = cmdutils.cmd_dict - cmds['open'].signal.connect(self.mainwindow.tabs.openurl) - cmds['tabopen'].signal.connect(self.mainwindow.tabs.tabopen) - cmds['quit'].signal.connect(QApplication.closeAllWindows) # FIXME - cmds['tabclose'].signal.connect(self.mainwindow.tabs.close_act) - cmds['tabprev'].signal.connect(self.mainwindow.tabs.switch_prev) - cmds['tabnext'].signal.connect(self.mainwindow.tabs.switch_next) - cmds['reload'].signal.connect(self.mainwindow.tabs.reload_act) - cmds['stop'].signal.connect(self.mainwindow.tabs.stop_act) - cmds['back'].signal.connect(self.mainwindow.tabs.back_act) - cmds['forward'].signal.connect(self.mainwindow.tabs.forward_act) - cmds['print'].signal.connect(self.mainwindow.tabs.print_act) - cmds['scrolldown'].signal.connect(self.mainwindow.tabs.scroll_down_act) - cmds['scrollup'].signal.connect(self.mainwindow.tabs.scroll_up_act) - cmds['scrollleft'].signal.connect(self.mainwindow.tabs.scroll_left_act) - cmds['scrollright'].signal.connect( - self.mainwindow.tabs.scroll_right_act) - cmds['scrollstart'].signal.connect( - self.mainwindow.tabs.scroll_start_act) - cmds['scrollend'].signal.connect( - self.mainwindow.tabs.scroll_end_act) - cmds['undo'].signal.connect(self.mainwindow.tabs.undo_close) + for cmd in cmds.values(): + cmd.signal.connect(self.cmd_handler) self.keyparser.from_cmd_dict(cmdutils.cmd_dict) + + def cmd_handler(self, tpl): + (count, argv) = tpl + cmd = argv[0] + args = argv[1:] + + if cmd == 'open': + self.mainwindow.tabs.openurl(*args) + elif cmd == 'tabopen': + self.mainwindow.tabs.tabopen(*args) + elif cmd == 'quit': + QApplication.closeAllWindows() # FIXME + elif cmd == 'tabclose': + self.mainwindow.tabs.close_act() + elif cmd == 'tabprev': + self.mainwindow.tabs.switch_prev() + elif cmd == 'tabnext': + self.mainwindow.tabs.switch_next() + elif cmd == 'reload': + self.mainwindow.tabs.reload_act() + elif cmd == 'stop': + self.mainwindow.tabs.stop_act() + elif cmd == 'back': + self.mainwindow.tabs.back_act() + elif cmd == 'forward': + self.mainwindow.tabs.forward_act() + elif cmd == 'print': + self.mainwindow.tabs.print_act() + elif cmd == 'scrolldown': + self.mainwindow.tabs.scroll_down_act(count=count) + elif cmd == 'scrollup': + self.mainwindow.tabs.scroll_up_act(count=count) + elif cmd == 'scrollleft': + self.mainwindow.tabs.scroll_left_act(count=count) + elif cmd == 'scrollright': + self.mainwindow.tabs.scroll_right_act(count=count) + elif cmd == 'scrollstart': + self.mainwindow.tabs.scroll_start_act() + elif cmd == 'scrollend': + self.mainwindow.tabs.scroll_end_act() + elif cmd == 'undo': + self.mainwindow.tabs.undo_close() diff --git a/qutebrowser/commands/commands.py b/qutebrowser/commands/commands.py index b09645354..ef9a24821 100644 --- a/qutebrowser/commands/commands.py +++ b/qutebrowser/commands/commands.py @@ -4,90 +4,72 @@ from qutebrowser.commands.utils import Command class Open(Command): nargs = 1 key = 'o' - signal = pyqtSignal(str) class TabOpen(Command): nargs = 1 key = 'O' - signal = pyqtSignal(str) class TabClose(Command): nargs = 0 key = 'd' - signal = pyqtSignal() class TabNext(Command): nargs = 0 key = 'J' - signal = pyqtSignal() class TabPrev(Command): nargs = 0 key = 'K' - signal = pyqtSignal() class Quit(Command): nargs = 0 - signal = pyqtSignal() class Reload(Command): nargs = 0 key = 'r' - signal = pyqtSignal() class Stop(Command): nargs = 0 - signal = pyqtSignal() class Back(Command): nargs = 0 key = 'H' - signal = pyqtSignal() class Forward(Command): nargs = 0 key = 'L' - signal = pyqtSignal() class Print(Command): nargs = 0 - signal = pyqtSignal() class ScrollLeft(Command): nargs = 0 key = 'h' count = True - signal = pyqtSignal([], [int]) class ScrollDown(Command): nargs = 0 key = 'j' count = True - signal = pyqtSignal([], [int]) class ScrollUp(Command): nargs = 0 key = 'k' count = True - signal = pyqtSignal([], [int]) class ScrollRight(Command): nargs = 0 key = 'l' count = True - signal = pyqtSignal([], [int]) class Undo(Command): nargs = 0 key = 'u' - signal = pyqtSignal() class ScrollStart(Command): nargs = 0 key = 'gg' - signal = pyqtSignal() class ScrollEnd(Command): nargs = 0 key = 'G' - signal = pyqtSignal() diff --git a/qutebrowser/commands/keys.py b/qutebrowser/commands/keys.py index 8e7df935e..92326dfc4 100644 --- a/qutebrowser/commands/keys.py +++ b/qutebrowser/commands/keys.py @@ -42,6 +42,7 @@ class KeyParser(QObject): for needle in self.key_to_cmd]): logging.debug('No match for "{}" (added {})'.format( self.keystring, txt)) + return else: logging.debug('Giving up with "{}", no matches'.format( self.keystring)) @@ -55,8 +56,7 @@ class KeyParser(QObject): logging.debug('Filling statusbar with partial command {}'.format( cmd.name)) self.set_cmd_text.emit(':{} '.format(cmd.name)) + elif count is not None: + cmd.run(count=count) else: - if count is not None: - cmd.run(count=count) - else: - cmd.run() + cmd.run() diff --git a/qutebrowser/commands/utils.py b/qutebrowser/commands/utils.py index 8f55809b7..a2ec3c650 100644 --- a/qutebrowser/commands/utils.py +++ b/qutebrowser/commands/utils.py @@ -23,18 +23,18 @@ class CommandParser(QObject): def parse(self, text): parts = text.strip().split() cmd = parts[0] - argv = parts[1:] + args = parts[1:] try: obj = cmd_dict[cmd] except KeyError: self.error.emit("{}: no such command".format(cmd)) return try: - obj.check(argv) + obj.check(args) except TypeError: self.error.emit("{}: invalid argument count".format(cmd)) return - obj.run(argv) + obj.run(args) class Command(QObject): nargs = 0 @@ -43,33 +43,25 @@ class Command(QObject): signal = None count = False bind = True + signal = pyqtSignal(tuple) def __init__(self): super().__init__() if self.name is None: self.name = self.__class__.__name__.lower() - def check(self, argv): - if ((isinstance(self.nargs, int) and len(argv) != self.nargs) or - (self.nargs == '?' and len(argv) > 1) or - (self.nargs == '+' and len(argv) < 1)): + def check(self, args): + if ((isinstance(self.nargs, int) and len(args) != self.nargs) or + (self.nargs == '?' and len(args) > 1) or + (self.nargs == '+' and len(args) < 1)): raise TypeError("Invalid argument count!") - def run(self, argv=None, count=None): - logging.debug("Cmd called: {}({})".format(self.__class__.__name__, - ", ".join(argv) if argv else '')) - if not self.signal: - raise NotImplementedError - # some sane defaults - if self.nargs == 0: - if count is not None: - self.signal.emit(count) - else: - self.signal.emit() - elif self.nargs == 1: - if count is not None: - self.signal.emit(count, argv[0]) - else: - self.signal.emit(argv[0]) - else: - raise NotImplementedError + def run(self, args=None, count=None): + countstr = ' * {}'.format(count) if count is not None else '' + argstr = ", ".join(args) if args else '' + logging.debug("Cmd called: {}({}){}".format(self.name, argstr, + countstr)) + argv = [self.name] + if args is not None: + argv += args + self.signal.emit((count, argv)) diff --git a/qutebrowser/widgets/browser.py b/qutebrowser/widgets/browser.py index a64deb93b..66fc9b6d9 100644 --- a/qutebrowser/widgets/browser.py +++ b/qutebrowser/widgets/browser.py @@ -65,16 +65,24 @@ class TabbedBrowser(TabWidget): # FIXME display warning if end of history self.currentWidget().forward() - def scroll_down_act(self, count=50): + def scroll_down_act(self, count=None): + if count is None: + count = 50 self.currentWidget().page().mainFrame().scroll(0, count) - def scroll_up_act(self, count=50): + def scroll_up_act(self, count=None): + if count is None: + count = 50 self.currentWidget().page().mainFrame().scroll(0, -count) - def scroll_left_act(self, count=50): + def scroll_left_act(self, count=None): + if count is None: + count = 50 self.currentWidget().page().mainFrame().scroll(-count, 0) - def scroll_right_act(self, count=50): + def scroll_right_act(self, count=None): + if count is None: + count = 50 self.currentWidget().page().mainFrame().scroll(count, 0) def scroll_start_act(self):