package main import ( "fmt" "math" "time" "github.com/anoshenko/rui" ) const controlsDemoText = ` ListLayout { width = 100%, height = 100%, orientation = vertical, padding = 16px, content = [ DetailsView { margin = 8px, summary = "Details title", content = "Details content" } ListLayout { orientation = horizontal, vertical-align = center, padding = 8px, border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, content = [ Checkbox { id = controlsCheckbox, content = "Checkbox" }, Button { id = controlsCheckboxButton, margin-left = 32px, content = "Check checkbox" }, ] }, ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, content = [ Button { id = controlsProgressDec, content = "<<" }, Button { id = controlsProgressInc, content = ">>", margin-left = 12px }, ProgressBar { id = controlsProgress, max = 100, value = 50, margin-left = 12px }, TextView { id = controlsProgressLabel, text = "50 / 100", margin-left = 12px }, ] }, ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, content = [ "Enter number (-5...10)", NumberPicker { id = controlsNumberEditor, type = editor, width = 80px, margin-left = 12px, min = -5, max = 10, step = 0.1, value = 0 }, NumberPicker { id = controlsNumberSlider, type = slider, width = 150px, margin-left = 12px, min = -5, max = 10, step = 0.1, value = 0 } ] }, ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, content = [ "Select color", ColorPicker { id = controlsColorPicker, value = #0000FF, margin = _{ left = 12px, right = 24px} }, "Result", View { id = controlsColorResult, width = 24px, height = 24px, margin-left = 12px, background-color = #0000FF } ] }, ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, content = [ "Select a time and date:", TimePicker { id = controlsTimePicker, min = "00:00", margin-left = 12px }, DatePicker { id = controlsDatePicker, min = "2001-01-01", margin-right = 24px }, "Result:", TextView { id = controlsDateResult, margin-left = 12px } ] }, ListLayout { orientation = horizontal, margin-top = 16px, padding = 8px, vertical-align = center, border = _{ width = 1px, style = solid, color = #FF000000 }, radius = 4px, content = [ View { id = controlsHiddable, width = 32px, height = 16px, margin-right = 16px, background-color = red }, "Visibility", DropDownList { id = controlsHiddableList, margin-left = 16px, current = 0, items = ["visible", "invisible", "gone"] }, ] }, Button { id = controlsMessage, margin-top = 16px, content = "Show message" } ] } ` func createControlsDemo(session rui.Session) rui.View { view := rui.CreateViewFromText(session, controlsDemoText) if view == nil { return nil } rui.Set(view, "controlsCheckbox", rui.CheckboxChangedEvent, func(checkbox rui.Checkbox, checked bool) { if checked { rui.Set(view, "controlsCheckboxButton", rui.Content, "Uncheck checkbox") } else { rui.Set(view, "controlsCheckboxButton", rui.Content, "Check checkbox") } }) rui.Set(view, "controlsCheckboxButton", rui.ClickEvent, func(rui.View) { checked := rui.IsCheckboxChecked(view, "controlsCheckbox") rui.Set(view, "controlsCheckbox", rui.Checked, !checked) }) setProgressBar := func(dx float64) { if value := rui.GetProgressBarValue(view, "controlsProgress"); value >= 0 { max := rui.GetProgressBarMax(view, "controlsProgress") newValue := math.Min(math.Max(0, value+dx), max) if newValue != value { rui.Set(view, "controlsProgress", rui.Value, newValue) rui.Set(view, "controlsProgressLabel", rui.Text, fmt.Sprintf("%g / %g", newValue, max)) } } } rui.Set(view, "controlsProgressDec", rui.ClickEvent, func(rui.View) { setProgressBar(-1) }) rui.Set(view, "controlsProgressInc", rui.ClickEvent, func(rui.View) { setProgressBar(+1) }) rui.Set(view, "controlsNumberEditor", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { rui.Set(view, "controlsNumberSlider", rui.Value, newValue) }) rui.Set(view, "controlsNumberSlider", rui.NumberChangedEvent, func(v rui.NumberPicker, newValue float64) { rui.Set(view, "controlsNumberEditor", rui.Value, newValue) }) rui.Set(view, "controlsColorPicker", rui.ColorChangedEvent, func(v rui.ColorPicker, newColor rui.Color) { rui.Set(view, "controlsColorResult", rui.BackgroundColor, newColor) }) rui.Set(view, "controlsTimePicker", rui.Value, demoTime) rui.Set(view, "controlsDatePicker", rui.Value, demoTime) rui.Set(view, "controlsTimePicker", rui.TimeChangedEvent, func(v rui.TimePicker, newDate time.Time) { demoTime = time.Date(demoTime.Year(), demoTime.Month(), demoTime.Day(), newDate.Hour(), newDate.Minute(), newDate.Second(), newDate.Nanosecond(), demoTime.Location()) rui.Set(view, "controlsDateResult", rui.Text, demoTime.Format(time.RFC1123)) }) rui.Set(view, "controlsDatePicker", rui.DateChangedEvent, func(v rui.DatePicker, newDate time.Time) { demoTime = time.Date(newDate.Year(), newDate.Month(), newDate.Day(), demoTime.Hour(), demoTime.Minute(), demoTime.Second(), demoTime.Nanosecond(), demoTime.Location()) rui.Set(view, "controlsDateResult", rui.Text, demoTime.Format(time.RFC1123)) }) rui.Set(view, "controlsMessage", rui.ClickEvent, func(rui.View) { rui.ShowMessage("Hello", "Hello world!!!", session) }) rui.Set(view, "controlsHiddableList", rui.DropDownEvent, func(list rui.DropDownList, number int) { rui.Set(view, "controlsHiddable", rui.Visibility, number) }) return view } var demoTime = time.Now()