Skip to content

Commit

Permalink
Process range and generator types in automatic_control
Browse files Browse the repository at this point in the history
  • Loading branch information
novoselt committed Jun 7, 2020
1 parent ccf1889 commit 6612cab
Showing 1 changed file with 62 additions and 63 deletions.
125 changes: 62 additions & 63 deletions interact_sagecell.py
Expand Up @@ -88,14 +88,19 @@ def f(n=(0,10,1)):
interact(f)
"""

import uuid
import sys

import inspect
import json
import sys
import uuid


from sage.misc.decorators import decorator_defaults


from misc import session_metadata


__interacts = {}


Expand Down Expand Up @@ -281,6 +286,7 @@ def __repr__(self):
except AttributeError:
pass


@decorator_defaults
def interact(f, controls=None, update=None, layout=None, locations=None,
output=True, readonly=False, automatic_labels=True):
Expand Down Expand Up @@ -1271,14 +1277,12 @@ def __init__(self, text="Update", value="", default="", width="", label=""):

def automatic_control(control, var=None):
"""
Guesses the desired interact control from the syntax of the parameter.
Guess the desired interact control from the syntax of the parameter.
:arg control: Parameter value.
:returns: An InteractControl object.
:rtype: InteractControl
"""
from types import GeneratorType
label = None
Expand All @@ -1287,7 +1291,6 @@ def automatic_control(control, var=None):
# For backwards compatibility, we check to see if
# auto_update=False as passed in. If so, we set up an
# UpdateButton. This should be deprecated.

if var=="auto_update" and control is False:
return UpdateButton()

Expand All @@ -1303,67 +1306,63 @@ def automatic_control(control, var=None):

# Checks for interact controls that are verbosely defined
if isinstance(control, InteractControl):
C = control
if label:
C.label = label
elif isinstance(control, str):
C = InputBox(default = control, label = label)
elif isinstance(control, bool):
C = Checkbox(default = control, label = label, raw = True)
elif isinstance(control, list):
if len(control)==1:
if isinstance(control[0], (list,tuple)) and len(control[0])==2:
buttonvalue, buttontext=control[0]
else:
buttonvalue, buttontext=control[0],str(control[0])
C = Button(value=buttonvalue, text=buttontext, default=buttonvalue, label=label)
else:
if len(control) <= 5:
selectortype = "button"
control.label = label
return control
if isinstance(control, str):
return InputBox(default=control, label=label)
if isinstance(control, bool):
return Checkbox(default=control, label=label, raw=True)
if isinstance(control, range):
control = list(control)
if isinstance(control, list):
if len(control) == 1:
if isinstance(control[0], (list, tuple)) and len(control[0]) == 2:
buttonvalue, buttontext = control[0]
else:
selectortype = "list"
C = Selector(selector_type=selectortype, default=default_value,
label=label, values=control)
elif isinstance(control, GeneratorType):
values=take(10000,control)
C = DiscreteSlider(default = default_value, values = values, label = label)
elif isinstance (control, tuple):
buttonvalue, buttontext = control[0], str(control[0])
return Button(value=buttonvalue, text=buttontext,
default=buttonvalue, label=label)
return Selector(control, default=default_value, label=label,
selector_type="button" if len(control) <= 5 else "list")
if isinstance(control, GeneratorType) or inspect.isgenerator(control):
return DiscreteSlider(take(10000, control),
default=default_value, label=label)
if isinstance (control, tuple):
if len(control) == 2:
C = ContinuousSlider(default=default_value,
interval=(control[0], control[1]), label = label)
elif len(control) == 3:
return ContinuousSlider(interval=(control[0], control[1]),
default=default_value, label=label)
if len(control) == 3:
from sage.arith.srange import srange
C = DiscreteSlider(default=default_value, values=srange(control[0],
control[1], control[2], include_endpoint=True), label=label)
else:
values=list(control)
C = DiscreteSlider(default = default_value, values = values, label = label)
else:
C = ExpressionBox(default = control, label=label)
try:
from sage.plot.colors import Color
from sage.structure.element import is_Vector, is_Matrix
from sage.all import parent
if is_Matrix(control):
nrows = control.nrows()
ncols = control.ncols()
default_value = control.list()
default_value = [[default_value[j * ncols + i]
for i in range(ncols)] for j in range(nrows)]
C = InputGrid(nrows = nrows, ncols = ncols, label = label,
default = default_value, adapter=parent(control))
elif is_Vector(control):
default_value = [control.list()]
nrows = 1
ncols = len(control)
C = InputGrid(nrows = nrows, ncols = ncols, label = label,
default = default_value, adapter=lambda x: parent(control)(x[0]))
elif isinstance(control, Color):
C = ColorSelector(default = control, label = label)
except:
pass

return C
return DiscreteSlider(
srange(control[0], control[1], control[2],
include_endpoint=True),
default=default_value, label=label)
return DiscreteSlider(list(control), default=default_value, label=label)
try:
from sage.plot.colors import Color
from sage.structure.element import is_Vector, is_Matrix
from sage.all import parent
if is_Matrix(control):
nrows = control.nrows()
ncols = control.ncols()
default_value = control.list()
default_value = [[default_value[j * ncols + i]
for i in range(ncols)] for j in range(nrows)]
return InputGrid(nrows=nrows, ncols=ncols, label=label,
default=default_value, adapter=parent(control))
if is_Vector(control):
nrows = 1
ncols = len(control)
default_value = [control.list()]
return InputGrid(nrows=nrows, ncols=ncols, label=label,
default=default_value,
adapter=lambda x: parent(control)(x[0]))
if isinstance(control, Color):
return ColorSelector(default=control, label=label)
except:
return ExpressionBox(default=control, label=label)


def closest_index(values, value):
if value is None:
Expand Down

0 comments on commit 6612cab

Please sign in to comment.