"""
open/dulcinea/lib/ui/outline.qpy
"""
from copy import deepcopy
from dulcinea.outline import Outline
from qp.fill.directory import Directory
from qp.fill.form import Form
from qp.fill.widget import SubmitWidget, TextWidget
from qp.pub.common import get_request, redirect, get_session, get_user, page, get_fields
def button:xml(action, fragment, title=None):
if get_user():
'
'
def get_button(key):
if get_request().get_method() == 'POST' and get_user():
for name in get_fields():
split = name.split()
if len(split) == 2 and key in split:
split.remove(key)
return split[0]
return None
class OutlineUI (Directory):
def __init__(self, outline, prefix=''):
self.outline = outline
self.prefix = prefix
def get_exports(self):
if not self.prefix:
yield ('', '_q_index', 'Outline', None)
else:
yield ('', '_q_index', self.prefix, None)
if self.get_clipboard() is not None:
yield ('clear', 'clear', 'Clear Clipboard', None)
yield ('paste', 'paste', 'Paste', 'Paste item from clipboard')
else:
yield ('edit', 'edit', 'Edit', 'Edit')
yield ('new', 'new', 'New', 'New')
def clear(self):
self.set_clipboard(None)
redirect('.')
def paste(self):
self.outline.append(self.get_clipboard())
self.set_clipboard(None)
redirect('.')
def _q_lookup(self, component):
result = self.outline.get(component)
if not self.prefix:
prefix = component
else:
prefix = "%s.%s" % (self.prefix, component)
if result is not None:
return self.__class__(result, prefix=prefix)
def format_outline_item:xml(self, outline_item, index):
str_index = Outline.index_to_string(index)
name = 'id' + str_index
'' % (name, len(index))
if index:
self.format_index_item(str_index, outline_item, name)
else:
outline_item.get_text()
if isinstance(outline_item, Outline) and len(outline_item) > 0:
'
' % len(index)
for j, item in enumerate(outline_item):
item_index = index + [j]
self.format_outline_item(item, index=item_index)
'
'
'
'
'
'
def _q_index:xml(self):
if self.prefix:
title = "%s" % self.prefix
else:
title = "Outline"
return page(title,
self.format_outline_item(self.outline, []),
style=STYLE)
def edit(self):
form = Form()
form.add(SubmitWidget, 'save', 'Save')
form.add(SubmitWidget, 'cancel', 'Cancel')
if form.get('cancel'):
redirect('.')
form.add(TextWidget, 'text', value=self.outline.get_text(),
title="Text", rows=30, cols=80)
if not form.is_submitted():
return page('Edit %s' % self.prefix, form.render())
self.outline.set_text(form.get('text'))
redirect('..')
def new(self):
self.outline.append(self.outline.__class__())
redirect('.')
def get_clipboard(self):
return getattr(get_session(), 'clipboard', None)
def set_clipboard(self, item):
get_session().clipboard = item
def format_index_item:xml(self, str_index, item, name):
pressed = get_button(str_index)
if pressed == 'edit':
redirect('%s/edit' % str_index)
if pressed == 'clear':
self.set_clipboard(None)
redirect('#id%s' % str_index)
if pressed == 'copy':
self.set_clipboard(deepcopy(item))
redirect('#id%s' % str_index)
if pressed == 'cut':
self.set_clipboard(item)
target = ''
last = None
for k, x in self.outline.iteritems():
if x is item:
if last:
target = self.outline.index_to_string(last)
break
last = k
del self.outline[str_index]
redirect('#id%s' % target)
if pressed == 'paste_before' and self.get_clipboard() is not None:
self.outline.insert(str_index, self.get_clipboard())
self.set_clipboard(None)
redirect('#id%s' % str_index)
if pressed == 'paste_after' and self.get_clipboard() is not None:
index = self.outline.string_to_index(str_index)
if isinstance(index, list):
index[-1] += 1
else:
index += 1
self.outline.insert(index, self.get_clipboard())
self.set_clipboard(None)
redirect('#id%s' % str_index)
self.format_index(str_index, item)
self.format_item(str_index, item)
def format_index:xml(self, str_index, item):
'\n'
number = '
%s' % (str_index, str_index)
if self.get_clipboard() is not None:
button('paste_before', str_index, "paste")
number
'
'
button('paste_after', str_index, "paste")
else:
number
'
'
def format_item:xml(self, str_index, item):
''
if self.get_clipboard() is not None:
button('clear', str_index, "Clear clipboard")
elif not get_fields():
button('cut', str_index)
button('copy', str_index)
button('edit', str_index)
item.get_text()
'
'
'
' # end item
STYLE = """
div.o1 {
position: relative;
z-index: 0;
border: thin solid black;
background: #ccc;
margin-top: 1ex;
}
div.index {
font-weight: bold;
width: 5em;
float: left;
clear: both;
background: #eee;
border: 2px outset #aaa;
padding: 2px;
margin: 0.5em;
position: relative;
z-index: 2;
}
div.index button {
padding: 0;
font-size: xx-small;
margin-right: 2px;
background: yellow;
}
div.i1 {
clear: both;
margin-top: 1em;
font-size: smaller;
font-weight: normal;
padding-left: 3em;
}
div.item {
background: #ddd;
padding-left: 6.5em;
padding-top: 2px;
padding-bottom: 2px;
padding-right: 2px;
}
div.item button {
float: right;
font-size: smaller;
margin-bottom: 4px;
padding: 0;
position: relative;
z-index: 2;
}
form.button {
display: inline;
}
"""