import streamlit as st
import json
from enum import Enum
config_json = {
"Timelines": {},
"Blocks": {}
}
class HudWidgetPosition(Enum):
Hidden = "Hidden"
StatusBarLeft = "Status bar (left)"
StatusBarCenter = "Status bar (center)"
StatusBarRight = "Status bar (right)"
InformationPanel = "Information panel"
class EnumProgressElementStyle(Enum):
Continuous = "Continuous"
# ...
class ShowAccuracyCheckFeedback(Enum):
Always = "Always"
Never = "Never"
class ShowCorrectTrialResponseFeedback(Enum):
Always = "Always"
OnError = "Only on error"
Never = "Never"
class StimulusType(Enum):
Digits = "Digits"
LowerCaseLetters = "Lowercase letters"
UpperCaseLetters = "Uppercase letters"
Symbols = "Symbols"
class DigitSpanBlock:
"""
UI to generate timeline config file for digit span.
"""
def render(self):
st.title("DigitSpan - Block Generator")
# st.help(DigitSpanBlock)
self.Name = st.sidebar.text_input('Block Name')
st.sidebar.header("Stimulus")
self.StimulusType = self.render_enum("Stimulus Type", StimulusType)
self.StimulusPackSize = st.sidebar.number_input("Stimulus pack size", min_value=1, max_value=1)
self.SequenceLength = st.sidebar.number_input("Sequence Length", min_value=1)
st.sidebar.header("Timing")
self.StimulusDisplayDuration = st.sidebar.number_input("Stimulus Display Duration")
self.InterstimulusInterval = st.sidebar.number_input("Interstimulus Interval (sec)", min_value=0)
self.RetentionDelay = st.sidebar.number_input("Retention Delay (sec)", min_value=0)
self.MaxIdleTime = st.sidebar.number_input("Max idle time (sec)",
min_value=self.StimulusDisplayDuration + self.InterstimulusInterval)
st.sidebar.header("UI")
self.BlockCounterPosition = self.render_enum("Block Counter", HudWidgetPosition)
self.ShowAccuracyCheckFeedback = self.render_enum("Show accuracy feedback", ShowAccuracyCheckFeedback)
self.ShowCorrectTrialResponseFeedback = self.render_enum("Show correct response",
ShowCorrectTrialResponseFeedback)
# show output in json format
__json = {}
__json.update(vars(self))
del __json['Name']
config_json["Blocks"] = {self.Name: __json}
st.json(config_json)
@staticmethod
def render_enum(text, cls):
options = list(map(lambda e: e.name, cls))
widget = st.sidebar.selectbox(
text,
options,
format_func=lambda k: cls[k].value)
return widget
if __name__ == "__main__":
DigitSpanBlock().render()