示例#1
0
def PyObjView(val, nm, frame, ctxt, tags):
    """
    PyObjView returns a gi.Widget representing the given Python value,
    with given name.
    frame = gi.Frame or layout to add widgets to -- also callback recv
    ctxt = context for this object (e.g., name of owning struct)
    """
    vw = 0
    fnm = ctxt + ":" + nm
    if isinstance(val, Enum):
        vw = gi.AddNewComboBox(frame, fnm)
        vw.SetText(nm)
        vw.SetPropStr("padding", "2px")
        vw.SetPropStr("margin", "2px")
        ItemsFromEnum(vw, val)
        vw.ComboSig.Connect(frame, SetEnumCB)
    elif isinstance(val, ClassViewObj):
        if HasTagValue(tags, "view", "inline"):
            sv = val.NewClassViewInline(fnm)
            sv.Config()
            frame.AddChild(sv.Lay)
            vw = sv.Lay
        else:
            vw = gi.AddNewAction(frame, fnm)
            vw.SetText(nm)
            vw.SetPropStr("padding", "2px")
            vw.SetPropStr("margin", "2px")
            vw.SetPropStr("border-radius", "4px")
            vw.ActionSig.Connect(frame, EditObjCB)
    elif isinstance(val, bool):
        vw = gi.AddNewCheckBox(frame, fnm)
        vw.SetChecked(val)
        vw.ButtonSig.Connect(frame, SetBoolValCB)
    elif isinstance(val, (int, float)):
        vw = gi.AddNewSpinBox(frame, fnm)
        vw.SetValue(val)
        if isinstance(val, int):
            vw.SpinBoxSig.Connect(frame, SetIntValCB)
            vw.Step = 1
        else:
            vw.SpinBoxSig.Connect(frame, SetFloatValCB)
        mv = TagValue(tags, "min")
        if mv != "":
            vw.SetMin(float(mv))
        mv = TagValue(tags, "max")
        if mv != "":
            vw.SetMax(float(mv))
        mv = TagValue(tags, "step")
        if mv != "":
            vw.Step = float(mv)
        mv = TagValue(tags, "format")
        if mv != "":
            vw.Format = mv
    else:
        vw = gi.AddNewTextField(frame, fnm)
        vw.SetText(str(val))
        vw.SetPropStr("min-width", "10em")
        vw.TextFieldSig.Connect(frame, SetStrValCB)
        mv = TagValue(tags, "width")
        if mv != "":
            vw.SetProp("width", units.NewCh(float(width)))
    if HasTagValue(tags, "inactive", "+"):
        vw.SetInactive()
    return vw
示例#2
0
文件: widgets.py 项目: studiovc/gi
def mainrun():
    width = 1024
    height = 768

    # turn these on to see a traces of various stages of processing..
    # gi.Update2DTrace = True
    # gi.Render2DTrace = True
    # gi.Layout2DTrace = True
    # ki.SignalTrace = True

    gi.SetAppName("widgets")
    gi.SetAppAbout(
        'This is a demo of the main widgets and general functionality of the <b>GoGi</b> graphical interface system, within the <b>GoKi</b> tree framework.  See <a href="https://github.com/goki">GoKi on GitHub</a>. <p>The <a href="https://github.com/goki/gi/blob/master/examples/widgets/README.md">README</a> page for this example app has lots of further info.</p>'
    )

    win = gi.NewWindow2D("gogi-widgets-demo", "GoGi Widgets Demo", width,
                         height, True)  # True = pixel sizes

    icnm = "wedge-down"

    vp = win.WinViewport2D()
    updt = vp.UpdateStart()

    # style sheet
    css = ki.Props()
    bg = ki.Props()
    ki.SetPropStr(bg, "background-color", "#FFF0F0FF")
    ki.SetSubProps(css, "button", bg)
    cmbo = ki.Props()
    ki.SetPropStr(cmbo, "background-color", "#F0FFF0FF")
    ki.SetSubProps(css, "#combo", cmbo)
    hsld = ki.Props()
    ki.SetPropStr(hsld, "background-color", "#F0E0FFFF"),
    ki.SetSubProps(css, ".hslides", hsld)
    kbd = ki.Props()
    ki.SetPropStr(kbd, "color", "blue")
    ki.SetSubProps(css, "kbd", kbd)
    vp.CSS = css

    mfr = win.SetMainFrame()
    mfr.SetPropStr("spacing", "1ex")
    # mfr.SetProp("background-color", "linear-gradient(to top, red, lighter-80)")
    # mfr.SetProp("background-color", "linear-gradient(to right, red, orange, yellow, green, blue, indigo, violet)")
    # mfr.SetProp("background-color", "linear-gradient(to right, rgba(255,0,0,0), rgba(255,0,0,1))")
    # mfr.SetProp("background-color", "radial-gradient(red, lighter-80)")

    trow = gi.AddNewLayout(mfr, "trow", gi.LayoutHoriz)
    trow.SetStretchMaxWidth()

    # giedsc = gi.ActiveKeyMap().ChordForFun(gi.KeyFunGoGiEditor())
    # prsc = gi.ActiveKeyMap().ChordForFun(gi.KeyFunPrefs())

    giedsc = "Ctrl+Alt+I"
    prsc = "Alt+P"

    title = gi.AddNewLabel(
        trow, "title",
        'This is a <b>demonstration</b> of the <span style="color:red">various</span> <a href="https://github.com/goki/gi/gi">GoGi</a> <i>Widgets</i><br> <large>Shortcuts: <kbd>'
        + prsc + '</kbd> = Preferences, <kbd>' + giedsc +
        '</kbd> = Editor, <kbd>Ctrl/Cmd +/-</kbd> = zoom</large><br> See <a href="https://github.com/goki/gi/blob/master/examples/widgets/README.md">README</a> for detailed info and things to try.'
    )
    title.SetPropStr("white-space", "normal")  # wrap
    title.SetPropStr(
        "text-align", "center"
    )  # note: this also sets horizontal-align, which controls the "box" that the text is rendered in..
    title.SetPropStr("vertical-align", "center")
    title.SetPropStr("font-family", "Times New Roman, serif")
    title.SetPropStr("font-size", "x-large")
    # # title.SetProp("letter-spacing", 2)
    # title.SetProp("line-height", 1.5)
    title.SetStretchMaxWidth()
    title.SetStretchMaxHeight()

    # Buttons

    gi.AddNewSpace(mfr, "blspc")
    blrow = gi.AddNewLayout(mfr, "blrow", gi.LayoutHoriz)
    blab = gi.AddNewLabel(blrow, "blab", "Buttons:")
    blab.Selectable = True

    brow = gi.AddNewLayout(mfr, "brow", gi.LayoutHoriz)
    brow.SetPropStr("spacing", "2ex")

    brow.SetPropStr("horizontal-align", "left")
    # brow.SetProp("horizontal-align", gi.AlignJustify)
    brow.SetStretchMaxWidth()

    button1 = gi.AddNewButton(brow, "button1")
    # button1.SetProp("#icon", ki.Props{ # note: must come before SetIcon
    # "width":  units.NewValue(1.5, units.Em),
    # "height": units.NewValue(1.5, units.Em),
    # })
    button1.Tooltip = "press this <i>button</i> to pop up a dialog box"

    button1.SetIcon(icnm)
    button1.ButtonSig.Connect(win.This(), button1cb)

    button2 = gi.AddNewButton(brow, "button2")
    button2.SetText("Open GoGiEditor")
    # # button2.SetProp("background-color", "#EDF")
    button2.Tooltip = "This button will open the GoGi GUI editor where you can edit this very GUI and see it update dynamically as you change things"
    button2.ButtonSig.Connect(win.This(), button2cb)

    checkbox = gi.AddNewCheckBox(brow, "checkbox")
    checkbox.Text = "Toggle"

    # # note: receiver for menu items with shortcuts must be a Node2D or Window
    mb1 = gi.AddNewMenuButton(brow, "menubutton1")
    mb1.SetText("Menu Button")
    mb1.Menu.AddAction(
        gi.ActOpts(Label="Menu Item 1", Shortcut="Shift+Control+1", Data=1),
        win.This(), menu1cb)
    mi2 = mb1.Menu.AddAction(gi.ActOpts(Label="Menu Item 2", Data=2), go.nil,
                             go.nil)

    mi2.Menu.AddAction(gi.ActOpts(Label="Sub Menu Item 2", Data=2.1),
                       win.This(), menu1cb)

    mb1.Menu.AddSeparator("sep1")

    mb1.Menu.AddAction(
        gi.ActOpts(Label="Menu Item 3", Shortcut="Control+3", Data=3),
        win.This(), menu1cb)

    # //////////////////////////////////////////
    #       Sliders

    gi.AddNewSpace(mfr, "slspc")
    slrow = gi.AddNewLayout(mfr, "slrow", gi.LayoutHoriz)
    slab = gi.AddNewLabel(slrow, "slab", "Sliders:")

    srow = gi.AddNewLayout(mfr, "srow", gi.LayoutHoriz)
    srow.SetPropStr("spacing", "2ex")
    srow.SetPropStr("horizontal-align", "left")
    srow.SetStretchMaxWidth()

    slider1 = gi.AddNewSlider(srow, "slider1")
    slider1.Dim = gi.X
    slider1.Class = "hslides"
    slider1.Defaults()
    slider1.SetMinPrefWidth(units.NewValue(20, units.Em))
    slider1.SetMinPrefHeight(units.NewValue(2, units.Em))
    slider1.SetValue(0.5)
    slider1.Snap = True
    slider1.Tracking = True
    slider1.Icon = "widget-circlebutton-on"

    slider2 = gi.AddNewSlider(srow, "slider2")
    slider2.Dim = gi.Y
    slider2.Defaults()
    slider2.SetMinPrefHeight(units.NewValue(10, units.Em))
    slider2.SetMinPrefWidth(units.NewValue(1, units.Em))
    slider2.SetStretchMaxHeight()
    slider2.SetValue(0.5)

    slider1.SliderSig.Connect(win.This(), slidercb)
    slider2.SliderSig.Connect(win.This(), slidercb)

    scrollbar1 = gi.AddNewScrollBar(srow, "scrollbar1")
    scrollbar1.Dim = gi.X
    scrollbar1.Class = "hslides"
    scrollbar1.Defaults()
    scrollbar1.SetMinPrefWidth(units.NewValue(20, units.Em))
    scrollbar1.SetMinPrefHeight(units.NewValue(1, units.Em))
    scrollbar1.SetThumbValue(0.25)
    scrollbar1.SetValue(0.25)
    scrollbar1.Snap = True
    scrollbar1.Tracking = True
    scrollbar1.SliderSig.Connect(win.This(), scrollcb)

    scrollbar2 = gi.AddNewScrollBar(srow, "scrollbar2")
    scrollbar2.Dim = gi.Y
    scrollbar2.Defaults()
    scrollbar2.SetMinPrefHeight(units.NewValue(10, units.Em))
    scrollbar2.SetMinPrefWidth(units.NewValue(1, units.Em))
    scrollbar2.SetStretchMaxHeight()
    scrollbar2.SetThumbValue(0.1)
    scrollbar2.SetValue(0.5)
    scrollbar2.SliderSig.Connect(win.This(), scrollcb)

    # //////////////////////////////////////////
    # #      Text Widgets

    gi.AddNewSpace(mfr, "tlspc")
    txlrow = gi.AddNewLayout(mfr, "txlrow", gi.LayoutHoriz)
    txlab = gi.AddNewLabel(txlrow, "txlab", "Text Widgets:")
    txrow = gi.AddNewLayout(mfr, "txrow", gi.LayoutHoriz)
    txrow.SetPropStr("spacing", "2ex")
    # # txrow.SetProp("horizontal-align", gi.AlignJustify)
    txrow.SetStretchMaxWidth()

    edit1 = gi.AddNewTextField(txrow, "edit1")
    edit1.Placeholder = "Enter text here..."
    # edit1.SetText("Edit this text")
    edit1.SetPropStr("min-width", "20em")
    # edit1.SetCompleter(edit1, Complete, CompleteEdit) # gets us word demo completion
    edit1.TextFieldSig.Connect(win.This(), textcb)
    # edit1.SetProp("inactive", True)

    sb = gi.AddNewSpinBox(txrow, "spin")
    sb.Defaults()
    sb.HasMin = True
    sb.Min = 0.0
    sb.SpinBoxSig.Connect(win.This(), spinboxcb)

    cb = gi.AddNewComboBox(txrow, "combo")
    cbitms = go.Slice_string(["Item1", "AnotherItem", "Item3"])
    cb.ItemsFromStringList(cbitms, True, 50)
    cb.ComboSig.Connect(win.This(), combocb)

    # //////////////////////////////////////////
    # #      Main Menu

    appnm = gi.AppName()
    mmen = win.MainMenu
    mmen.ConfigMenus(go.Slice_string([appnm, "File", "Edit", "Window"]))

    amen = gi.Action(mmen.ChildByName(appnm, 0))
    # amen.Menu = make(gi.Menu, 0, 10)
    amen.Menu.AddAppMenu(win)

    # note: use KeyFunMenu* for standard shortcuts
    # Command in shortcuts is automatically translated into Control for
    # Linux, Windows or Meta for MacOS
    fmen = gi.Action(win.MainMenu.ChildByName("File", 0))
    fmen.Menu.AddAction(gi.ActOpts(Label="New", ShortcutKey=gi.KeyFunMenuNew),
                        win.This(), menu1cb)
    fmen.Menu.AddAction(
        gi.ActOpts(Label="Open", ShortcutKey=gi.KeyFunMenuOpen), win.This(),
        menu1cb)
    fmen.Menu.AddAction(
        gi.ActOpts(Label="Save", ShortcutKey=gi.KeyFunMenuSave), win.This(),
        menu1cb)
    fmen.Menu.AddAction(
        gi.ActOpts(Label="Save As..", ShortcutKey=gi.KeyFunMenuSaveAs),
        win.This(), menu1cb)
    fmen.Menu.AddSeparator("csep")
    fmen.Menu.AddAction(
        gi.ActOpts(Label="Close Window", ShortcutKey=gi.KeyFunMenuClose),
        win.This(), winclosecb)

    emen = gi.Action(win.MainMenu.ChildByName("Edit", 1))
    emen.Menu.AddCopyCutPaste(win)

    # inQuitPrompt = False
    # gi.SetQuitReqFunc(func() {
    # if inQuitPrompt {
    # return
    # }
    # inQuitPrompt = True
    # gi.PromptDialog(vp, gi.DlgOpts{Title: "Really Quit?",
    # Prompt: "Are you <i>sure</i> you want to quit?"}, True, True,
    # win.This(), func(recv, send ki.Ki, sig int64, data interface{}) {
    # if sig == int64(gi.DialogAccepted) {
    # gi.Quit()
    # } else {
    # inQuitPrompt = False
    # }
    # })
    # })

    # gi.SetQuitCleanFunc(func() {
    # print("Doing final Quit cleanup here..")
    # })

    # inClosePrompt = False
    # win.SetCloseReqFunc(func(w gi.Window) {
    # if inClosePrompt {
    # return
    # }
    # inClosePrompt = True
    # gi.PromptDialog(vp, gi.DlgOpts{Title: "Really Close Window?",
    # Prompt: "Are you <i>sure</i> you want to close the window?  This will Quit the App as well."}, True, True,
    # win.This(), func(recv, send ki.Ki, sig int64, data interface{}) {
    # if sig == int64(gi.DialogAccepted) {
    # gi.Quit()
    # } else {
    # inClosePrompt = False
    # }
    # })
    # })

    # win.SetCloseCleanFunc(func(w gi.Window) {
    # print("Doing final Close cleanup here..")
    # })

    win.MainMenuUpdated()
    vp.UpdateEndNoSig(updt)
    win.GoStartEventLoop()