示例#1
0
class TextTest(pyui.View):
    line = pyui.State(default="")
    lines = pyui.State(default="")
    text = pyui.State(default="")

    async def built(self):
        async with httpx.AsyncClient() as client:
            params = {"type": "meat-and-filler", "format": "text", "paras": 2}
            r = await client.get("https://baconipsum.com/api/", params=params)
            self.text = r.text

    def content(self):
        # fmt: off
        yield pyui.VStack(alignment=pyui.Alignment.LEADING)(
            pyui.Text("Enter some text below:"),
            pyui.TextField(self.line, placeholder="Single line text"),
            pyui.TextField(self.lines,
                           placeholder="Two line text input").lines(2),
            pyui.TextField(
                self.text,
                placeholder="All the text").lines(None).priority("high"),
            pyui.HStack()(
                pyui.Spacer(),
                pyui.Button("Submit", asset="button.primary"),
            ),
        ).padding(20)
示例#2
0
文件: demo.py 项目: dnettoRaw/pyui
class ListView(pyui.View):
    dynamic_items = pyui.State(default=[i + 1 for i in range(30)])
    selection = pyui.State(default=list)

    def create_row(self):
        self.dynamic_items.value = self.dynamic_items.value + ["New Item"]

    def clear(self):
        self.dynamic_items.value = []
        self.selection.value = []

    def content(self):
        # fmt: off
        yield pyui.HStack(alignment=pyui.Alignment.LEADING, spacing=20)(
            pyui.VStack(spacing=10, alignment=pyui.Alignment.LEADING)(
                pyui.ScrollView()(pyui.List(selection=self.selection)(
                    pyui.Text("First Row"),
                    pyui.ForEach(self.dynamic_items.value, lambda item:
                                 (pyui.Text(item), )),
                ), ).priority(pyui.Priority.HIGH),
                pyui.HStack()(
                    pyui.Spacer(),
                    pyui.Button("Clear", action=self.clear),
                    pyui.Button("+", action=self.create_row),
                ),
            ),
            pyui.Text("Selected rows: {}".format(self.selection.value)),
            pyui.Spacer(),
        )
示例#3
0
文件: picker.py 项目: dnettoRaw/pyui
class PickerTest(pyui.View):
    text = pyui.State(default="")
    selected = pyui.State(default=0)

    def content(self):
        # fmt: off
        yield pyui.VStack()(pyui.TextField(self.text, placeholder="Some text"),
                            pyui.Picker(selection=self.selected)(
                                pyui.Text("Item One"),
                                pyui.Text("Item Two"),
                                pyui.Text("Item Three"),
                            )).padding(20)
示例#4
0
class TodoMVC(pyui.View):
    items = pyui.State(default=TodoList)
    new_item = pyui.State(default="")
    selected_filter = pyui.State(default=0)

    @property
    def selected(self):
        yield from self.items.filter(self.selected_filter.value)

    @property
    def remaining_text(self):
        remain = self.items.remaining
        word = "item" if remain == 1 else "items"
        return "{} {} left".format(remain, word)

    async def add(self, title):
        self.items.add(title)
        self.new_item.value = ""

    def content(self):
        # fmt: off
        yield pyui.VStack(alignment=pyui.Alignment.LEADING)(
            pyui.HStack()(
                pyui.Toggle(self.items.all_complete, action=self.items.toggle_all),
                pyui.TextField(self.new_item, "What needs to be done?", action=self.add),
            ),
            pyui.ScrollView()(
                pyui.List(self.selected, builder=lambda item: (
                    pyui.HStack()(
                        pyui.Toggle(item.complete, label=item.text, action=(self.items.toggle, item))
                            .modify(ITEM_COMPLETE if item.complete else ITEM_ACTIVE),
                        pyui.Spacer(),
                        pyui.Button(action=(self.items.delete, item), asset=None)(
                            pyui.Icon("trash-alt")
                        ).font(size=12).padding(0)
                    )
                )),
            ).priority(pyui.Priority.HIGH),
            pyui.HStack(
                pyui.Text(self.remaining_text),
                pyui.Button(action=self.items.clear_complete, asset=None)(
                    pyui.Text("Clear Completed").color(60, 150, 255)
                ).padding(5).disable(not self.items.any_complete),
                pyui.Spacer(),
                # TODO: would be nice to pass SegmentedButton an enum?
                pyui.SegmentedButton(self.selected_filter)(
                    pyui.Text("All"),
                    pyui.Text("Active"),
                    pyui.Text("Completed"),
                ),
            )
        ).padding(20)
示例#5
0
文件: demo.py 项目: dnettoRaw/pyui
class BarChartView(pyui.View):
    bars = pyui.State(default=random_bars)

    def randomize(self):
        self.bars = random_bars(len(self.bars.value))

    def more_bars(self):
        self.bars = random_bars(len(self.bars.value) + 1)

    def fewer_bars(self):
        self.bars = random_bars(len(self.bars.value) - 1)

    def content(self):
        # fmt: off
        yield pyui.VStack(spacing=10)(
            pyui.Text("Bar Chart"),
            pyui.Spacer(),
            pyui.HStack(alignment=pyui.Alignment.TRAILING)(pyui.ForEach(
                self.bars.value, lambda height, idx:
                (pyui.Rectangle()
                 (pyui.Text("{:.0f}%".format(height * 100.0)).color(
                     230, 230, 230).background(0, 0, 0, 160).
                  padding(3).font(size=11).radius(2)).background(
                      random.randint(0, 255), random.randint(0, 255),
                      random.randint(0, 255)).size(height=height).animate(
                          pyui.spring(), 0.3, delay=0.03 * idx)))).priority(
                              pyui.Priority.HIGH),
            pyui.HStack()(
                pyui.Button("Fewer Bars", action=self.fewer_bars),
                pyui.Button("Randomize", action=self.randomize),
                pyui.Button("More Bars", action=self.more_bars),
            ),
        )
示例#6
0
class ProgressTest(pyui.View):
    current = pyui.State(default=50)

    def content(self):
        # fmt: off
        yield pyui.VStack()(
            pyui.Slider(self.current),
            pyui.ProgressBar(self.current),
            pyui.Text(self.current.value),
        ).padding(20)
示例#7
0
文件: demo.py 项目: dnettoRaw/pyui
class DescriptionView(pyui.View):
    description = pyui.State(str, default="")

    def content(self):
        # fmt: off
        yield pyui.VStack(alignment=pyui.Alignment.LEADING, spacing=5)(
            pyui.Text(self.lang),
            pyui.TextField(self.description,
                           "Description for {}".format(self.lang)),
        )
示例#8
0
文件: demo.py 项目: dnettoRaw/pyui
class ImageSizerView(pyui.View):
    scale = pyui.State(int, default=50)

    @property
    def pct(self):
        return self.scale.value / 100

    def content(self):
        # fmt: off
        yield pyui.VStack(
            pyui.Slider(self.scale, 1, 100),
            pyui.Image("images/python.png").size(width=self.pct,
                                                 height=self.pct),
        )
示例#9
0
文件: demo.py 项目: dnettoRaw/pyui
class FormView(pyui.View):
    language = pyui.State(str, default="")
    languages = pyui.State(default=["Python"])

    def new_language(self):
        self.languages = self.languages.value + [self.language.value]
        self.language = ""

    def content(self):
        # fmt: off
        fg = pyui.Environment(
            "text").color if self.language.value else sdl2.SDL_Color(
                150, 150, 150)
        yield pyui.VStack(spacing=20)(
            pyui.HStack()(
                pyui.TextField(self.language, "Add a new language"),
                pyui.Button(action=self.new_language)(pyui.Text(
                    "Add {}".format(self.language.value)).color(fg), ).disable(
                        self.language.value == ""),
                pyui.Spacer(),
            ),
            pyui.ForEach(self.languages.value, lambda lang:
                         (DescriptionView(lang=lang))),
        )
示例#10
0
文件: demo.py 项目: dnettoRaw/pyui
class TimestampView(pyui.View):
    timestamp = pyui.State(datetime.datetime, default=datetime.datetime.now)

    def update_timestamp(self):
        self.timestamp = datetime.datetime.now()

    def content(self):
        # fmt: off
        yield pyui.VStack()(pyui.HStack()(
            pyui.Text(self.timestamp.value.strftime("%H:%M:%S.%f")),
            pyui.Button(action=self.update_timestamp)(
                pyui.Image("images/python.svg").size(height=14),
                pyui.Text("Update"),
            ),
        ), )
示例#11
0
class SearchView(pyui.View):
    # Separate state since live-searching is slow.
    current_text = pyui.State(default="")

    def __init__(self, search_binding):
        super().__init__()
        self.search_binding = search_binding

    def search(self, text=None):
        self.search_binding.value = self.current_text.value

    def content(self):
        # fmt: off
        yield pyui.HStack()(
            pyui.TextField(self.current_text,
                           placeholder="Search icons",
                           action=self.search),
            pyui.Button("Search", action=self.search,
                        asset="button.primary").priority("high")).padding(10)
示例#12
0
class IconsView(pyui.View):
    search_text = pyui.State(default="")

    def filtered_icons(self):
        search = self.search_text.value.lower()
        for name in pyui.Icon.data["icons"]:
            if search == "" or search in name:
                yield name

    def content(self):
        # fmt: off
        yield pyui.VStack(spacing=0)(
            SearchView(self.search_text),
            pyui.ScrollView()(pyui.Grid(size=100, flex=True)(pyui.ForEach(
                self.filtered_icons(), lambda name:
                (pyui.Rectangle(pyui.VStack()
                                (pyui.Icon(name, size=32), pyui.Text(name).
                                 font(size=11))).background(30, 30, 30).
                 padding(5)))).position(pyui.Position.TOP_LEADING)))
示例#13
0
class CalculatorView(pyui.View):
    result = pyui.State(str, default="0")
    formula = pyui.State(str, default="")

    async def textinput(self, ch):
        if ch in "0123456789.+-/*()":
            self.add(ch)
        elif ch.lower() == "c":
            self.clear()
        elif ch == "=":
            self.compute()

    async def keydown(self, key, mods):
        if key == sdl2.SDLK_RETURN:
            self.compute()

    def add(self, ch):
        self.formula = self.formula.value + ch

    def group(self, ch):
        self.formula = "(" + self.formula.value + ")"

    def compute(self, ch=None):
        try:
            num = eval(self.formula.value)
            if isinstance(num, float):
                self.result = "{:.3f}".format(num)
            elif isinstance(num, int):
                self.result = str(num)
            else:
                self.result = "NOPE"
        except Exception:
            self.result = "???"

    def clear(self, ch=None):
        self.formula = ""
        self.result = "0"

    def content(self):
        # fmt: off
        yield pyui.VStack(spacing=0)(pyui.HStack()(
            pyui.Spacer(),
            pyui.Text(self.formula.value).font(size=11).color(180, 180,
                                                              180).padding(
                                                                  5, 10, 0, 5),
        ), pyui.HStack()(
            pyui.Spacer(),
            pyui.Text(self.result.value).font(size=42).padding(5),
        ), pyui.Grid(axis=pyui.Axis.VERTICAL, spacing=2, num=4, cram=True)(
            CalcButton("C", self.clear, BTN_TOP),
            CalcButton("(", self.add, BTN_TOP),
            CalcButton(")", self.add, BTN_TOP),
            CalcButton("/", self.add, BTN_OPERATOR),
            CalcButton("7", self.add),
            CalcButton("8", self.add),
            CalcButton("9", self.add),
            CalcButton("*", self.add, BTN_OPERATOR),
            CalcButton("4", self.add),
            CalcButton("5", self.add),
            CalcButton("6", self.add),
            CalcButton("-", self.add, BTN_OPERATOR),
            CalcButton("1", self.add),
            CalcButton("2", self.add),
            CalcButton("3", self.add),
            CalcButton("+", self.add, BTN_OPERATOR),
            CalcButton("(…)", self.group),
            CalcButton("0", self.add),
            CalcButton(".", self.add),
            CalcButton("=", self.compute, BTN_OPERATOR),
        ))
示例#14
0
class GridTest(pyui.View):
    axis = pyui.State(default=1)
    item_count = pyui.State(int, default=50)
    size = pyui.State(default=100)
    num = pyui.State(default=4)
    size_or_num = pyui.State(default=0)
    flex = pyui.State(default=False)

    def content(self):
        # fmt: off
        if self.size_or_num.value == 0:
            size = None
            num = self.num.value
        else:
            size = self.size.value
            num = None
        yield pyui.HStack(alignment=pyui.Alignment.LEADING)(
            pyui.VStack(alignment=pyui.Alignment.LEADING)(
                pyui.Text("Axis"),
                pyui.SegmentedButton(self.axis)(
                    pyui.Text(pyui.Axis.HORIZONTAL.name),
                    pyui.Text(pyui.Axis.VERTICAL.name),
                ),
                pyui.HStack(
                    pyui.Text("Number of items"),
                    pyui.Spacer(),
                    pyui.Text(self.item_count.value).color(
                        128, 128, 128).priority("high"),
                ),
                pyui.Slider(self.item_count, maximum=200),
                pyui.Text("Fill rows/columns by"),
                pyui.SegmentedButton(self.size_or_num)(
                    pyui.Text("Number"),
                    pyui.Text("Size"),
                ),
                pyui.HStack(
                    pyui.Text("Items per row/column"),
                    pyui.Spacer(),
                    pyui.Text(self.num.value).color(128, 128,
                                                    128).priority("high"),
                ),
                pyui.Slider(self.num, minimum=1,
                            maximum=10).disable(self.size_or_num.value == 1),
                pyui.HStack(
                    pyui.Text("Item size"),
                    pyui.Spacer(),
                    pyui.Text(self.size.value).color(128, 128,
                                                     128).priority("high"),
                ),
                pyui.Slider(self.size, minimum=50,
                            maximum=200).disable(self.size_or_num.value == 0),
                pyui.Toggle(self.flex, label="Adjust size to fit").disable(
                    self.size_or_num.value == 0),
            ).padding(10).size(width=300),
            ItemGridView(
                item_count=self.item_count.value,
                size=size,
                num=num,
                axis=self.axis.value,
                flex=self.flex.value,
            ),
        )