summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/plugins/close_all.rst6
-rw-r--r--doc/source/plugins/index.rst6
-rw-r--r--plugins/close_all.py45
-rw-r--r--src/core/core.py11
4 files changed, 64 insertions, 4 deletions
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 <closeall-plugin>`
+
+ Close all tabs except MUCs and the roster.
+
Day Change
:ref:`Documentation <daychange-plugin>`
@@ -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()