Fix #2802 (add a /closeall command, with a new plugin)

This commit is contained in:
mathieui 2014-12-09 01:13:14 +01:00
parent 7b3265c636
commit ed7fe693b4
No known key found for this signature in database
GPG key ID: C59F84CEEFD616E3
4 changed files with 64 additions and 4 deletions

View file

@ -0,0 +1,6 @@
.. _closeall-plugin:
Close all
=========
.. automodule:: close_all

View file

@ -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

45
plugins/close_all.py Normal file
View file

@ -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()

View file

@ -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()