console: basic options page

This commit is contained in:
Aldo Cortesi 2015-04-03 14:10:57 +13:00
parent fe6957eddb
commit 65971f02ad
4 changed files with 188 additions and 37 deletions

View File

@ -15,7 +15,7 @@ import urwid
import weakref import weakref
from .. import controller, flow, script from .. import controller, flow, script
from . import flowlist, flowview, help, window, signals from . import flowlist, flowview, help, window, signals, options
from . import grideditor, palettes, contentview, statusbar from . import grideditor, palettes, contentview, statusbar
EVENTLOG_SIZE = 500 EVENTLOG_SIZE = 500
@ -465,6 +465,16 @@ class ConsoleMaster(flow.FlowMaster):
None None
) )
def view_options(self):
signals.push_view_state.send(self)
self.loop.widget = window.Window(
self,
options.Options(self),
None,
statusbar.StatusBar(self, help.footer),
None
)
def view_grideditor(self, ge): def view_grideditor(self, ge):
signals.push_view_state.send(self) signals.push_view_state.send(self)
self.loop.widget = window.Window( self.loop.widget = window.Window(
@ -586,24 +596,6 @@ class ConsoleMaster(flow.FlowMaster):
if a != "n": if a != "n":
raise urwid.ExitMainLoop raise urwid.ExitMainLoop
def _change_options(self, a):
if a == "a":
self.anticache = not self.anticache
if a == "c":
self.anticomp = not self.anticomp
if a == "h":
self.showhost = not self.showhost
self.sync_list_view()
self.refresh_focus()
elif a == "k":
self.killextra = not self.killextra
elif a == "n":
self.refresh_server_playback = not self.refresh_server_playback
elif a == "u":
self.server.config.no_upstream_cert =\
not self.server.config.no_upstream_cert
signals.update_settings.send(self)
def shutdown(self): def shutdown(self):
self.state.killall(self) self.state.killall(self)
flow.FlowMaster.shutdown(self) flow.FlowMaster.shutdown(self)

View File

@ -0,0 +1,151 @@
import urwid
from . import common, signals
help_context = None
class OptionWidget(urwid.WidgetWrap):
def __init__(self, option, text, active, focus):
self.option = option
opt = urwid.Text(text, align="center")
if focus and active:
opt = urwid.AttrWrap(opt, "option_active_selected")
elif focus:
opt = urwid.AttrWrap(opt, "option_selected")
elif active:
opt = urwid.AttrWrap(opt, "option_active")
opt = urwid.Padding(opt, align="center", width=("relative", 20))
urwid.WidgetWrap.__init__(self, opt)
def keypress(self, size, key):
return key
def selectable(self):
return True
class OptionWalker(urwid.ListWalker):
def __init__(self, options):
urwid.ListWalker.__init__(self)
self.options = options
self.focus = 0
signals.update_settings.connect(self.sig_update_settings)
def sig_update_settings(self, sender):
self._modified()
def set_focus(self, pos):
self.focus = pos
def get_focus(self):
return self.options[self.focus].render(True), self.focus
def get_next(self, pos):
if pos >= len(self.options)-1:
return None, None
return self.options[pos+1].render(False), pos+1
def get_prev(self, pos):
if pos <= 0:
return None, None
return self.options[pos-1].render(False), pos-1
class OptionListBox(urwid.ListBox):
def __init__(self, options):
urwid.ListBox.__init__(
self,
OptionWalker(options)
)
def keypress(self, size, key):
key = common.shortcuts(key)
if key == "enter":
self.get_focus()[0].option.ativate()
return None
return super(self.__class__, self).keypress(size, key)
_neg = lambda: False
class Option:
def __init__(self, text, getstate=None, ativate=None):
self.text = text
self.getstate = getstate or _neg
self.ativate = ativate or _neg
def render(self, focus):
return OptionWidget(self, self.text, self.getstate(), focus)
class Options(urwid.WidgetWrap):
def __init__(self, master):
self.master = master
self.lb = OptionListBox(
[
Option(
"Anti-Cache",
lambda: master.anticache,
self.toggle_anticache
),
Option(
"Anti-Compression",
lambda: master.anticomp,
self.toggle_anticomp
),
#Option("Header Set Patterns"),
#Option("Ignore Patterns"),
Option(
"Kill Extra",
lambda: master.killextra,
self.toggle_killextra
),
#Option("Manage Scripts"),
#Option("Replacement Patterns"),
Option(
"Show Host",
lambda: master.showhost,
self.toggle_showhost
),
#Option("Sticky Cookies"),
#Option("Sticky Auth"),
#Option("TCP Proxying"),
Option(
"No Refresh",
lambda: not master.refresh_server_playback,
self.toggle_refresh_server_playback
),
Option(
"No Upstream Certs",
lambda: master.server.config.no_upstream_cert,
self.toggle_upstream_cert
),
]
)
title = urwid.Text("Options")
title = urwid.Padding(title, align="left", width=("relative", 100))
title = urwid.AttrWrap(title, "heading")
self._w = urwid.Frame(
self.lb,
header = title
)
self.master.loop.widget.footer.update("")
def toggle_anticache(self):
self.master.anticache = not self.master.anticache
def toggle_anticomp(self):
self.master.anticomp = not self.master.anticomp
def toggle_killextra(self):
self.master.killextra = not self.master.killextra
def toggle_showhost(self):
self.master.showhost = not self.master.showhost
def toggle_refresh_server_playback(self):
self.master.refresh_server_playback = not self.master.refresh_server_playback
def toggle_upstream_cert(self):
self.master.server.config.no_upstream_cert = not self.master.server.config.no_upstream_cert
signals.update_settings.send(self)

View File

@ -17,6 +17,9 @@ class Palette:
# Help # Help
'key', 'head', 'text', 'key', 'head', 'text',
# Options
'option_selected', 'option_active', 'option_active_selected',
# List and Connections # List and Connections
'method', 'focus', 'method', 'focus',
'code_200', 'code_300', 'code_400', 'code_500', 'code_other', 'code_200', 'code_300', 'code_400', 'code_500', 'code_other',
@ -60,6 +63,9 @@ class LowDark(Palette):
head = ('white,bold', 'default'), head = ('white,bold', 'default'),
text = ('light gray', 'default'), text = ('light gray', 'default'),
# Options
option_selected = ('light gray', 'dark blue'),
# List and Connections # List and Connections
method = ('dark cyan', 'default'), method = ('dark cyan', 'default'),
focus = ('yellow', 'default'), focus = ('yellow', 'default'),
@ -112,6 +118,11 @@ class LowLight(Palette):
head = ('black,bold', 'default'), head = ('black,bold', 'default'),
text = ('dark gray', 'default'), text = ('dark gray', 'default'),
# Options
option_selected = ('light gray', 'dark blue'),
option_active = ('light red', 'default'),
option_active_selected = ('light red', 'dark blue'),
# List and Connections # List and Connections
method = ('dark cyan', 'default'), method = ('dark cyan', 'default'),
focus = ('black', 'default'), focus = ('black', 'default'),
@ -181,6 +192,11 @@ class SolarizedLight(LowLight):
key = (sol_blue, 'default',), key = (sol_blue, 'default',),
head = (sol_base00, 'default'), head = (sol_base00, 'default'),
# Options
option_selected = (sol_base2, sol_base02),
option_active = (sol_orange, 'default'),
option_active_selected = (sol_orange, sol_base02),
# List and Connections # List and Connections
method = (sol_cyan, 'default'), method = (sol_cyan, 'default'),
focus = (sol_base01, 'default'), focus = (sol_base01, 'default'),
@ -223,6 +239,9 @@ class SolarizedDark(LowDark):
key = (sol_blue, 'default',), key = (sol_blue, 'default',),
head = (sol_base00, 'default'), head = (sol_base00, 'default'),
# Options
option_selected = (sol_base03, sol_base01),
# List and Connections # List and Connections
method = (sol_cyan, 'default'), method = (sol_cyan, 'default'),
focus = (sol_base1, 'default'), focus = (sol_base1, 'default'),
@ -252,10 +271,10 @@ class SolarizedDark(LowDark):
palettes = { palettes = {
"lowlight": LowLight(), #"lowlight": LowLight(),
"lowdark": LowDark(), #"lowdark": LowDark(),
"light": Light(), #"light": Light(),
"dark": Dark(), #"dark": Dark(),
"solarized_light": SolarizedLight(), "solarized_light": SolarizedLight(),
"solarized_dark": SolarizedDark(), #"solarized_dark": SolarizedDark(),
} }

View File

@ -64,6 +64,8 @@ class Window(urwid.Frame):
text = self.master.state.intercept_txt, text = self.master.state.intercept_txt,
callback = self.master.set_intercept callback = self.master.set_intercept
) )
elif k == "o":
self.master.view_options()
elif k == "Q": elif k == "Q":
raise urwid.ExitMainLoop raise urwid.ExitMainLoop
elif k == "q": elif k == "q":
@ -107,19 +109,6 @@ class Window(urwid.Frame):
), ),
callback = self.master.stop_server_playback_prompt, callback = self.master.stop_server_playback_prompt,
) )
elif k == "o":
signals.status_prompt_onekey.send(
prompt = "Options",
keys = (
("anticache", "a"),
("anticomp", "c"),
("showhost", "h"),
("killextra", "k"),
("norefresh", "n"),
("no-upstream-certs", "u"),
),
callback = self.master._change_options
)
elif k == "t": elif k == "t":
signals.status_prompt.send( signals.status_prompt.send(
prompt = "Sticky cookie filter", prompt = "Sticky cookie filter",