Unverified Commit c6cf2d08 authored by mathieui's avatar mathieui

Fix close_all and change_title plugins

parent e2414121
......@@ -12,8 +12,8 @@ The following events are poezio-only events, for Slixmpp events, check out
- **tab:** :py:class:`~tabs.MucTab` source of the event
tab_change
- **old_tab_nb:** :py:class:`int` Old current tab number.
- **new_tab_nb:** :py:class:`int` New current tab number.
- **old_tab:** :py:class:`int` Old current tab.
- **new_tab:** :py:class:`int` New current tab.
Triggered whenever the user switches between tabs.
......
......@@ -8,7 +8,7 @@ import sys
class Plugin(BasePlugin):
def init(self):
self.on_tab_change(0, self.core.current_tab_nb)
self.on_tab_change(None, new_tab=self.core.tabs.current_tab)
self.api.add_event_handler('tab_change', self.on_tab_change)
def cleanup(self):
......@@ -16,8 +16,6 @@ class Plugin(BasePlugin):
sys.stdout.write("\x1b]0;poezio\x07")
sys.stdout.flush()
def on_tab_change(self, old, new):
new_tab = self.core.get_tab_by_number(new)
def on_tab_change(self, old_tab, new_tab):
sys.stdout.write("\x1b]0;{}\x07".format(new_tab.name))
sys.stdout.flush()
......@@ -26,19 +26,18 @@ class Plugin(BasePlugin):
"""
/closeall
"""
current = self.core.current_tab()
current = self.api.current_tab()
if not isinstance(current, (tabs.RosterInfoTab, tabs.MucTab)):
self.core.go_to_roster()
current = self.core.current_tab()
current = self.api.current_tab()
def filter_func(x):
return not isinstance(x, (tabs.RosterInfoTab, tabs.MucTab))
matching_tabs = list(filter(filter_func, self.core.tabs))
matching_tabs = list(filter(filter_func, self.core.tabs.get_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()
......
......@@ -95,7 +95,11 @@ class Core:
self.xml_tab = None
self.xml_buffer = TextBuffer()
self.tabs = Tabs()
self.plugins_autoloaded = False
self.plugin_manager = PluginManager(self)
self.events = events.EventHandler()
self.tabs = Tabs(self.events)
self.previous_tab_nb = 0
own_nick = config.get('default_nick')
......@@ -104,10 +108,6 @@ class Core:
own_nick = own_nick or 'poezio'
self.own_nick = own_nick
self.plugins_autoloaded = False
self.plugin_manager = PluginManager(self)
self.events = events.EventHandler()
self.size = SizeManager(self)
# Set to True whenever we consider that we have been disconnected
......
......@@ -27,6 +27,7 @@ disabled.
from typing import List, Dict, Type, Optional, Union
from collections import defaultdict
from poezio import tabs
from poezio.events import EventHandler
class Tabs:
......@@ -34,11 +35,16 @@ class Tabs:
Tab list class
"""
__slots__ = [
'_current_index', '_current_tab', '_tabs', '_tab_types', '_tab_names',
'_previous_tab'
'_current_index',
'_current_tab',
'_tabs',
'_tab_types',
'_tab_names',
'_previous_tab',
'_events',
]
def __init__(self):
def __init__(self, events: EventHandler):
"""
Initialize the Tab List. Even though the list is initially
empty, all methods are only valid once append() has been called
......@@ -53,6 +59,7 @@ class Tabs:
self._tab_types = defaultdict(
list) # type: Dict[Type[tabs.Tab], List[tabs.Tab]]
self._tab_names = dict() # type: Dict[str, tabs.Tab]
self._events = events # type: EventHandler
def __len__(self):
return len(self._tabs)
......@@ -78,11 +85,7 @@ class Tabs:
"""Set the current tab index"""
if 0 <= value < len(self._tabs):
tab = self._tabs[value]
if not isinstance(tab, tabs.GapTab):
self._store_previous()
self._current_index = tab.nb
self._current_tab = tab
return True
return self.set_current_tab(tab)
return False
@property
......@@ -97,6 +100,10 @@ class Tabs:
self._store_previous()
self._current_index = tab.nb
self._current_tab = tab
self._events.trigger(
'tab_change',
old_tab=self._previous_tab,
new_tab=self._current_tab)
return True
return False
......@@ -170,6 +177,10 @@ class Tabs:
self._inc_cursor()
while isinstance(self.current_tab, tabs.GapTab):
self._inc_cursor()
self._events.trigger(
'tab_change',
old_tab=self._previous_tab,
new_tab=self._current_tab)
def prev(self):
"""Go to the left of the tab list (circular)"""
......@@ -177,6 +188,10 @@ class Tabs:
self._dec_cursor()
while isinstance(self.current_tab, tabs.GapTab):
self._dec_cursor()
self._events.trigger(
'tab_change',
old_tab=self._previous_tab,
new_tab=self._current_tab)
def append(self, tab: tabs.Tab):
"""
......
......@@ -4,6 +4,9 @@ Tests for the Tabs list module
from poezio.core.tabs import Tabs
from poezio.tabs import GapTab
from poezio.events import EventHandler
h = EventHandler()
class DummyTab:
count = 0
......@@ -18,7 +21,7 @@ class DummyTab:
def test_append():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
tabs.append(dummy)
assert tabs[0] is dummy
......@@ -35,7 +38,7 @@ def test_append():
def test_delete():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
tabs.append(dummy)
......@@ -50,7 +53,7 @@ def test_delete():
def test_delete_restore_previous():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
dummy3 = DummyTab()
......@@ -71,7 +74,7 @@ def test_delete_restore_previous():
def test_delete_other_tab():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
dummy3 = DummyTab()
......@@ -91,7 +94,7 @@ def test_delete_other_tab():
def test_insert_and_gaps():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
dummy3 = DummyTab()
......@@ -114,7 +117,7 @@ def test_insert_and_gaps():
def test_replace_tabs():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
dummy3 = DummyTab()
......@@ -129,7 +132,7 @@ def test_replace_tabs():
def test_prev_next():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
dummy3 = DummyTab()
......@@ -155,7 +158,7 @@ def test_prev_next():
def test_set_current():
DummyTab.reset()
tabs = Tabs()
tabs = Tabs(h)
dummy = DummyTab()
dummy2 = DummyTab()
dummy3 = DummyTab()
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment