Here is some current code. There is an editor on the front end for editing Objects/Arrows (this is a math thing). Arrows have a lot of style properties associated with them. If I'm usually not going to search the Neo4j database based upon styling, would it be best to store these differently (say as a "blob") or to keep it the way I have it?
class QuiverEditorArrow(StructuredNode):
"""
A base class, not meant to be used directly.
"""
#uid = StringProperty(default=Morphism.get_unique_id())
notation = StringProperty(max_length=MAX_TEXT_LENGTH)
diagram_name = StringProperty(max_length=MAX_TEXT_LENGTH)
diagram_index = IntegerProperty(requied=True) # Diagram code needs to keep this updated
# RE-DESIGN: TODO - these need to be independent of style and settable in an accompanying
# panel to the editor.
# These are the mathematical properties, that you can search by:
#epic = BooleanProperty(default=False)
#monic = BooleanProperty(default=False)
#inclusion = BooleanProperty(default=False)
# Strictly style below this line:
NUM_LINES = { 1: 'one', 2: 'two', 3: 'three' }
num_lines = IntegerProperty(choices=NUM_LINES, default=1)
LeftAlign, CenterAlign, RightAlign, OverAlign = range(4)
DefaultAlignment = LeftAlign
ALIGNMENT = { 0:LeftAlign, 1:RightAlign, 2:CenterAlign, 3:OverAlign}
alignment = IntegerProperty(choices=ALIGNMENT, default=DefaultAlignment)
label_position = IntegerProperty(default=50)
offset = IntegerProperty(default=0)
curve = IntegerProperty(default=0)
tail_shorten = IntegerProperty(default=0)
head_shorten = IntegerProperty(default=0)
TAIL_STYLE = {0:'none', 1:'mono', 2:'hook', 3:'arrowhead', 4:'maps_to'}
tail_style = IntegerProperty(choices=TAIL_STYLE, default=0)
SIDE = {0:'none', 1:'top', 2:'bottom'}
hook_tail_side = IntegerProperty(choices=SIDE, default=0)
HEAD_STYLE = {0:'none', 1:'arrowhead', 2:'epi', 3:'harpoon'}
head_style = IntegerProperty(choices=HEAD_STYLE, default=1)
harpoon_head_side = IntegerProperty(choices=SIDE, default=0)
BODY_STYLE = {0:'solid', 1:'none', 2:'dashed', 3:'dotted', 4:'squiggly', 5:'barred'}
body_style = IntegerProperty(choices=BODY_STYLE, default=0)
color_hue = IntegerProperty(default=0)
color_sat = IntegerProperty(default=0) # BUGFIX: default (black) is 0,0,0 in hsl, not 0,100,0
color_lum = IntegerProperty(default=0)
color_alph = FloatProperty(default=1.0)
def copy_properties_from(self, f, nodes_memo):
self.notation = f.notation
self.diagram_index = f.diagram_index
self.num_lines = f.num_lines
self.alignment = f.alignment
self.label_position = f.label_position
self.offset = f.offset
self.curve = f.curve
self.tail_shorten = f.tail_shorten
self.head_shorten = f.head_shorten
self.tail_style = f.tail_style
self.hook_tail_side = f.hook_tail_side
self.head_style = f.head_style
self.harpoon_head_side = f.harpoon_head_side
self.body_style = f.body_style
self.color_hue = f.color_hue
self.color_sat = f.color_sat
self.color_lum = f.color_lum
self.color_alph = f.color_alph
self.save()
def load_from_editor(self, format):
if len(format) > 2:
self.notation = format[2]
else:
self.notation = '' # BUGFIX: need this
if len(format) > 3:
self.alignment = format[3]
if len(format) > 4:
options = format[4]
self.label_position = options.get('label_position', 50)
self.offset = options.get('offset', 0)
self.curve = options.get('curve', 0)
shorten = options.get('shorten', {'source': 0, 'target': 0})
self.tail_shorten = shorten.get('source', 0)
self.head_shorten = shorten.get('target', 0)
self.num_lines = options.get('level', 1)
self.body_style = next(x for x,y in self.BODY_STYLE.items() \
if y == deep_get(options, ('style', 'body', 'name'), 'solid'))
self.tail_style = next(x for x,y in self.TAIL_STYLE.items() \
if y == deep_get(options, ('style', 'tail', 'name'), 'none' ))
side = deep_get(options, ('style', 'tail', 'side'), 'none')
if isinstance(side, int):
self.hook_tail_side = side
else:
self.hook_tail_side = next(x for x,y in self.SIDE.items() if y == side)
self.head_style = next(x for x,y in self.HEAD_STYLE.items() \
if y == deep_get(options, ('style', 'head', 'name'), 'arrowhead'))
side = deep_get(options, ('style', 'head', 'side'), 'none')
if isinstance(side, int):
self.harpoon_head_side = side
else:
self.harpoon_head_side = next(x for x,y in self.SIDE.items() if y == side)
if len(format) > 5:
color = format[5]
elif 'colour' in options:
color = options['colour']
else:
color = [0, 0, 0, 1.0] # BUGFIX: black is hsl: 0,0,0 not 0,100,0
self.color_hue = color[0]
self.color_sat = color[1]
self.color_lum = color[2]
if len(color) > 3:
self.color_alph = color[3]
self.save()
def quiver_format(self):
format = [self.start_node().diagram_index, self.end_node().diagram_index]
format.append(self.notation if self.notation is not None else '')
format.append(self.alignment)
options = {
#'colour' : [self.color_hue, self.color_sat, self.color_lum, self.color_alph],
'label_position': self.label_position,
'offset' : self.offset,
'curve' : self.curve,
'shorten' : {
'source' : self.tail_shorten,
'target' : self.head_shorten,
},
'level' : self.num_lines,
'style' : {
'tail': {
'name' : self.TAIL_STYLE[self.tail_style],
'side' : self.SIDE[self.hook_tail_side],
},
'head': {
'name' : self.HEAD_STYLE[self.head_style],
'side' : self.SIDE[self.harpoon_head_side],
},
'body': {
'name' : self.BODY_STYLE[self.body_style],
}
},
'colour' : [self.color_hue, self.color_sat, self.color_lum, self.color_alph],
}
format.append(options)
format.append([self.color_hue, self.color_sat, self.color_lum, self.color_alph])
return format