Commit 82d00d49 authored by mathieui's avatar mathieui

Add a "confirm" tab type

This tab will be used when an external events prompts a boolean choice
to a user, like a new ssl cert, or a XEP (e.g. 0070) that needs an
answer, and for which a command-line interface with an info message
would be a pain.
parent c94df86b
......@@ -3,6 +3,7 @@ from poezio.tabs.basetabs import STATE_PRIORITY
from poezio.tabs.rostertab import RosterInfoTab
from poezio.tabs.muctab import MucTab, NS_MUC_USER
from poezio.tabs.privatetab import PrivateTab
from poezio.tabs.confirmtab import ConfirmTab
from poezio.tabs.conversationtab import ConversationTab, StaticConversationTab,\
DynamicConversationTab
from poezio.tabs.xmltab import XMLTab
......
"""
A generic tab that displays a text and a boolean choice
"""
import logging
log = logging.getLogger(__name__)
import curses
import collections
from poezio import windows
from poezio.decorators import refresh_wrapper
from poezio.tabs import Tab
class ConfirmTab(Tab):
plugin_commands = {}
plugin_keys = {}
def __init__(self, core, name, text, short_message, callback, critical=False):
"""Parameters:
name: The name of the tab
text: the text shown in the tab
short_message: what will be displayed at the top and bottom of
the tab
callback: the function(bool) that will be called when the user
makes a choice
critical: if the message needs to be displayed in a flashy color
"""
Tab.__init__(self, core)
self.state = 'normal'
self.name = name
self.default_help_message = windows.HelpText("Choose with arrow keys and press enter")
self.input = self.default_help_message
self.infowin_top = windows.ConfirmStatusWin(short_message, critical)
self.infowin_bottom = windows.ConfirmStatusWin(short_message, critical)
self.dialog = windows.Dialog(text, critical)
self.key_func['^I'] = self.toggle_choice
self.key_func[' '] = self.toggle_choice
self.key_func['KEY_LEFT'] = self.toggle_choice
self.key_func['KEY_RIGHT'] = self.toggle_choice
self.key_func['^M'] = self.validate
self.resize()
self.update_keys()
self.update_commands()
self.completion_callback = callback
def toggle_choice(self):
self.dialog.toggle_choice()
self.refresh()
self.core.doupdate()
def validate(self):
self.completion_callback(self.dialog.accept)
self.close()
def refresh(self):
if self.need_resize:
self.resize()
log.debug(' TAB Refresh: %s', self.__class__.__name__)
if self.size.tab_degrade_y:
display_info_win = False
else:
display_info_win = True
if display_info_win:
self.info_win.refresh()
self.refresh_tab_win()
self.infowin_top.refresh()
self.infowin_bottom.refresh()
self.dialog.refresh()
self.input.refresh()
def resize(self):
if self.size.tab_degrade_y:
info_win_height = 0
tab_win_height = 0
else:
info_win_height = self.core.information_win_size
tab_win_height = Tab.tab_win_height()
self.infowin_top.resize(1, self.width, 0, 0)
self.infowin_bottom.resize(1, self.width, self.height - 2 - info_win_height - tab_win_height, 0)
self.dialog.resize(self.height - 3 - info_win_height - tab_win_height,
self.width, 1, 0)
self.input.resize(1, self.width, self.height-1, 0)
def close(self, arg=None):
self.core.close_tab(self)
def on_input(self, key, raw):
res = self.input.do_command(key, raw=raw)
if res and not isinstance(self.input, windows.Input):
return True
elif res:
return False
if not raw and key in self.key_func:
return self.key_func[key]()
def on_info_win_size_changed(self):
if self.core.information_win_size >= self.height-3:
return
self.dialog.resize(self.height-3-self.core.information_win_size - Tab.tab_win_height(), self.width, 1, 0)
self.infowin_bottom.resize(1, self.width, self.height-2-self.core.information_win_size - Tab.tab_win_height(), 0)
......@@ -6,10 +6,11 @@ used to display information on the screen
from poezio.windows.base_wins import Win
from poezio.windows.data_forms import FormWin
from poezio.windows.bookmark_forms import BookmarksWin
from poezio.windows.confirm import Dialog
from poezio.windows.info_bar import GlobalInfoBar, VerticalGlobalInfoBar
from poezio.windows.info_wins import InfoWin, XMLInfoWin, PrivateInfoWin, MucListInfoWin, \
ConversationInfoWin, DynamicConversationInfoWin, MucInfoWin, \
ConversationStatusMessageWin, BookmarksInfoWin
ConversationStatusMessageWin, BookmarksInfoWin, ConfirmStatusWin
from poezio.windows.input_placeholders import HelpText, YesNoInput
from poezio.windows.inputs import Input, HistoryInput, MessageInput, CommandInput
from poezio.windows.list import ListWin, ColumnHeaderWin
......
from poezio.windows.base_wins import Win
from poezio.theming import get_theme, to_curses_attr
class Dialog(Win):
str_accept = " Accept "
str_refuse = " Reject "
def __init__(self, helper_text, critical=False):
self.text = helper_text
self.accept = False
self.critical = critical
def refresh(self):
self._win.erase()
self.addstr(self.text + "\n ")
if self.critical:
col = to_curses_attr(get_theme().COLOR_WARNING_PROMPT)
else:
col = to_curses_attr(get_theme().COLOR_TAB_NORMAL)
if self.accept:
self.addstr(self.str_accept, col)
else:
self.addstr(self.str_accept)
self.addstr(" ")
if self.accept:
self.addstr(self.str_refuse)
else:
self.addstr(self.str_refuse, col)
self._refresh()
def toggle_choice(self):
self.accept = not self.accept
......@@ -304,3 +304,21 @@ class BookmarksInfoWin(InfoWin):
def write_remote_status(self, preferred):
self.addstr('Remote storage: %s' % preferred, to_curses_attr(get_theme().COLOR_INFORMATION_BAR))
class ConfirmStatusWin(Win):
def __init__(self, text, critical=False):
Win.__init__(self)
self.text = text
self.critical = critical
def refresh(self):
log.debug('Refresh: %s', self.__class__.__name__)
self._win.erase()
if self.critical:
color = get_theme().COLOR_WARNING_PROMPT
else:
color = get_theme().COLOR_INFORMATION_BAR
c_color = to_curses_attr(color)
self.addstr(self.text, c_color)
self.finish_line(color)
self._refresh()
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