From ed7fe693b4e2a4354a7db58d03bc74f155f1ad71 Mon Sep 17 00:00:00 2001 From: mathieui Date: Tue, 9 Dec 2014 01:13:14 +0100 Subject: Fix #2802 (add a /closeall command, with a new plugin) --- doc/source/plugins/close_all.rst | 6 ++++++ doc/source/plugins/index.rst | 6 ++++++ plugins/close_all.py | 45 ++++++++++++++++++++++++++++++++++++++++ src/core/core.py | 11 ++++++---- 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 doc/source/plugins/close_all.rst create mode 100644 plugins/close_all.py diff --git a/doc/source/plugins/close_all.rst b/doc/source/plugins/close_all.rst new file mode 100644 index 00000000..853a6e0d --- /dev/null +++ b/doc/source/plugins/close_all.rst @@ -0,0 +1,6 @@ +.. _closeall-plugin: + +Close all +========= + +.. automodule:: close_all diff --git a/doc/source/plugins/index.rst b/doc/source/plugins/index.rst index b86423c7..0b30a331 100644 --- a/doc/source/plugins/index.rst +++ b/doc/source/plugins/index.rst @@ -82,6 +82,11 @@ Plugin index Allows a message to be broadcasted on all the rooms your are in. Caution: do not overuse. + Close all + :ref:`Documentation ` + + Close all tabs except MUCs and the roster. + Day Change :ref:`Documentation ` @@ -285,3 +290,4 @@ Plugin index irc change_title pipe_cmd + close_all diff --git a/plugins/close_all.py b/plugins/close_all.py new file mode 100644 index 00000000..1b98213e --- /dev/null +++ b/plugins/close_all.py @@ -0,0 +1,45 @@ +""" +``close_all`` plugin: close all tabs except MUCs and the roster. + +Commands +-------- + +.. glossary:: + + /closeall + **Usage:** ``/closeall`` + + Close all tabs except the roster and MUC tabs. +""" +from plugin import BasePlugin +import tabs +from decorators import command_args_parser + + +class Plugin(BasePlugin): + def init(self): + self.api.add_command('closeall', self.command_closeall, + help='Close all non-muc tabs.') + + @command_args_parser.ignored + def command_closeall(self): + """ + /closeall + """ + current = self.core.current_tab() + if not isinstance(current, (tabs.RosterInfoTab, tabs.MucTab)): + self.core.go_to_roster() + current = self.core.current_tab() + + def filter_func(x): + return not isinstance(x, (tabs.RosterInfoTab, tabs.MucTab)) + + matching_tabs = list(filter(filter_func, self.core.tabs)) + length = len(matching_tabs) + for tab in matching_tabs: + self.core.close_tab(tab) + self.core.current_tab_nb = current.nb + self.api.information('%s tabs closed.' % length, 'Info') + self.core.refresh_window() + + diff --git a/src/core/core.py b/src/core/core.py index 79d19087..f6b973ec 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -1286,6 +1286,7 @@ class Core(object): """ Close the given tab. If None, close the current one """ + was_current = tab is None tab = tab or self.current_tab() if isinstance(tab, tabs.RosterInfoTab): return # The tab 0 should NEVER be closed @@ -1293,9 +1294,10 @@ class Core(object): del tab.commands # and make the object collectable tab.on_close() nb = tab.nb - if self.previous_tab_nb != nb: - self.current_tab_nb = self.previous_tab_nb - self.previous_tab_nb = 0 + if was_current: + if self.previous_tab_nb != nb: + self.current_tab_nb = self.previous_tab_nb + self.previous_tab_nb = 0 if config.get('create_gaps'): if nb >= len(self.tabs) - 1: self.tabs.remove(tab) @@ -1315,7 +1317,8 @@ class Core(object): self.current_tab_nb = len(self.tabs) - 1 while not self.tabs[self.current_tab_nb]: self.current_tab_nb -= 1 - self.current_tab().on_gain_focus() + if was_current: + self.current_tab().on_gain_focus() self.refresh_window() import gc gc.collect() -- cgit v1.2.3