rui_orig/detailsView.go

193 lines
5.4 KiB
Go
Raw Normal View History

2021-09-07 17:36:50 +03:00
package rui
import "strings"
// Constants for [DetailsView] specific properties and events
2021-09-07 17:36:50 +03:00
const (
// Summary is the constant for "summary" property tag.
//
// Used by `DetailsView`.
// The content of this property is used as the label for the disclosure widget.
//
// Supported types: `string`, `View`.
//
// `string` - Summary as a text.
// `View` - Summary as a view, in this case it can be quite complex if needed.
2024-11-13 12:56:39 +03:00
Summary PropertyName = "summary"
// Expanded is the constant for "expanded" property tag.
//
// Used by `DetailsView`.
// Controls the content expanded state of the details view. Default value is `false`.
//
// Supported types: `bool`, `int`, `string`.
//
// Values:
// `true` or `1` or "true", "yes", "on", "1" - Content is visible.
// `false` or `0` or "false", "no", "off", "0" - Content is collapsed(hidden).
2024-11-13 12:56:39 +03:00
Expanded PropertyName = "expanded"
2021-09-07 17:36:50 +03:00
)
// DetailsView represent a DetailsView view, which is a collapsible container of views
2021-09-07 17:36:50 +03:00
type DetailsView interface {
ViewsContainer
}
type detailsViewData struct {
viewsContainerData
}
// NewDetailsView create new DetailsView object and return it
func NewDetailsView(session Session, params Params) DetailsView {
view := new(detailsViewData)
view.init(session)
2021-09-07 17:36:50 +03:00
setInitParams(view, params)
return view
}
func newDetailsView(session Session) View {
2024-11-13 12:56:39 +03:00
return new(detailsViewData)
2021-09-07 17:36:50 +03:00
}
// Init initialize fields of DetailsView by default values
func (detailsView *detailsViewData) init(session Session) {
detailsView.viewsContainerData.init(session)
2021-09-07 17:36:50 +03:00
detailsView.tag = "DetailsView"
2024-11-13 12:56:39 +03:00
detailsView.set = detailsView.setFunc
detailsView.changed = detailsView.propertyChanged
2021-09-07 17:36:50 +03:00
//detailsView.systemClass = "ruiDetailsView"
}
func (detailsView *detailsViewData) Views() []View {
views := detailsView.viewsContainerData.Views()
2024-11-13 12:56:39 +03:00
if summary := detailsView.Get(Summary); summary != nil {
switch summary := summary.(type) {
case View:
return append([]View{summary}, views...)
}
}
return views
}
func (detailsView *detailsViewData) setFunc(tag PropertyName, value any) []PropertyName {
2021-09-07 17:36:50 +03:00
switch tag {
case Summary:
switch value := value.(type) {
case string:
2024-11-13 12:56:39 +03:00
detailsView.setRaw(Summary, value)
2021-09-07 17:36:50 +03:00
case View:
2024-11-13 12:56:39 +03:00
detailsView.setRaw(Summary, value)
value.setParentID(detailsView.htmlID())
2021-09-07 17:36:50 +03:00
case DataObject:
if view := CreateViewFromObject(detailsView.Session(), value); view != nil {
2024-11-13 12:56:39 +03:00
detailsView.setRaw(Summary, view)
view.setParentID(detailsView.htmlID())
2021-09-07 17:36:50 +03:00
} else {
2024-11-13 12:56:39 +03:00
return nil
2021-09-07 17:36:50 +03:00
}
default:
notCompatibleType(tag, value)
2024-11-13 12:56:39 +03:00
return nil
}
2024-11-13 12:56:39 +03:00
return []PropertyName{tag}
}
return detailsView.viewsContainerData.setFunc(tag, value)
2024-11-13 12:56:39 +03:00
}
func (detailsView *detailsViewData) propertyChanged(tag PropertyName) {
2024-11-13 12:56:39 +03:00
switch tag {
case Summary:
updateInnerHTML(detailsView.htmlID(), detailsView.Session())
2021-09-07 17:36:50 +03:00
case Expanded:
if IsDetailsExpanded(detailsView) {
detailsView.Session().updateProperty(detailsView.htmlID(), "open", "")
2024-11-13 12:56:39 +03:00
} else {
detailsView.Session().removeProperty(detailsView.htmlID(), "open")
2021-09-07 17:36:50 +03:00
}
2022-05-22 12:54:02 +03:00
case NotTranslate:
updateInnerHTML(detailsView.htmlID(), detailsView.Session())
2022-05-22 12:54:02 +03:00
default:
detailsView.viewsContainerData.propertyChanged(tag)
2021-09-07 17:36:50 +03:00
}
}
func (detailsView *detailsViewData) htmlTag() string {
return "details"
}
func (detailsView *detailsViewData) htmlProperties(self View, buffer *strings.Builder) {
detailsView.viewsContainerData.htmlProperties(self, buffer)
2021-11-20 16:53:45 +03:00
buffer.WriteString(` ontoggle="detailsEvent(this)"`)
if IsDetailsExpanded(detailsView) {
2021-09-07 17:36:50 +03:00
buffer.WriteString(` open`)
}
}
func (detailsView *detailsViewData) htmlSubviews(self View, buffer *strings.Builder) {
if value, ok := detailsView.properties[Summary]; ok {
switch value := value.(type) {
case string:
if !GetNotTranslate(detailsView) {
2022-05-22 12:54:02 +03:00
value, _ = detailsView.session.GetString(value)
}
2021-09-07 17:36:50 +03:00
buffer.WriteString("<summary>")
buffer.WriteString(value)
buffer.WriteString("</summary>")
case View:
2024-11-21 09:25:46 +03:00
if value.htmlTag() == "div" {
viewHTML(value, buffer, "summary")
} else {
buffer.WriteString(`<summary><div style="display: inline-block;">`)
viewHTML(value, buffer, "")
buffer.WriteString("</div></summary>")
}
2021-09-07 17:36:50 +03:00
}
}
detailsView.viewsContainerData.htmlSubviews(self, buffer)
}
2024-11-13 12:56:39 +03:00
func (detailsView *detailsViewData) handleCommand(self View, command PropertyName, data DataObject) bool {
2021-11-20 16:53:45 +03:00
if command == "details-open" {
if n, ok := dataIntProperty(data, "open"); ok {
detailsView.properties[Expanded] = (n != 0)
if listener, ok := detailsView.changeListener[Expanded]; ok {
listener(detailsView, Expanded)
2024-11-13 12:56:39 +03:00
}
2021-11-20 16:53:45 +03:00
}
return true
}
return detailsView.viewsContainerData.handleCommand(self, command, data)
}
2021-09-07 17:36:50 +03:00
// GetDetailsSummary returns a value of the Summary property of DetailsView.
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
func GetDetailsSummary(view View, subviewID ...string) View {
2024-11-24 16:43:31 +03:00
if view = getSubview(view, subviewID); view != nil {
2021-09-07 17:36:50 +03:00
if value := view.Get(Summary); value != nil {
switch value := value.(type) {
case string:
return NewTextView(view.Session(), Params{Text: value})
case View:
return value
}
}
}
return nil
}
// IsDetailsExpanded returns a value of the Expanded property of DetailsView.
// If the second argument (subviewID) is not specified or it is "" then a value from the first argument (view) is returned.
func IsDetailsExpanded(view View, subviewID ...string) bool {
2022-07-28 12:11:27 +03:00
return boolStyledProperty(view, subviewID, Expanded, false)
2021-09-07 17:36:50 +03:00
}