forked from mbk-lab/rui_orig
Added "image constants"
This commit is contained in:
parent
50cbb10bf6
commit
371079e27b
|
@ -239,7 +239,7 @@ func (image *backgroundImage) Get(tag string) interface{} {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (image *backgroundImage) cssStyle(session Session) string {
|
func (image *backgroundImage) cssStyle(session Session) string {
|
||||||
if src, ok := stringProperty(image, Source, session); ok && src != "" {
|
if src, ok := imageProperty(image, Source, session); ok && src != "" {
|
||||||
buffer := allocStringBuilder()
|
buffer := allocStringBuilder()
|
||||||
defer freeStringBuilder(buffer)
|
defer freeStringBuilder(buffer)
|
||||||
|
|
||||||
|
|
5
image.go
5
image.go
|
@ -128,5 +128,10 @@ func (manager *imageManager) imageLoadError(obj DataObject, session Session) {
|
||||||
|
|
||||||
// LoadImage starts the async image loading by url
|
// LoadImage starts the async image loading by url
|
||||||
func LoadImage(url string, onLoaded func(Image), session Session) Image {
|
func LoadImage(url string, onLoaded func(Image), session Session) Image {
|
||||||
|
if url != "" && url[0] == '@' {
|
||||||
|
if image, ok := session.ImageConstant(url[1:]); ok {
|
||||||
|
url = image
|
||||||
|
}
|
||||||
|
}
|
||||||
return session.imageManager().loadImage(url, onLoaded, session)
|
return session.imageManager().loadImage(url, onLoaded, session)
|
||||||
}
|
}
|
||||||
|
|
45
imageView.go
45
imageView.go
|
@ -109,8 +109,12 @@ func (imageView *imageViewData) set(tag string, value interface{}) bool {
|
||||||
if text, ok := value.(string); ok {
|
if text, ok := value.(string); ok {
|
||||||
imageView.properties[Source] = text
|
imageView.properties[Source] = text
|
||||||
if imageView.created {
|
if imageView.created {
|
||||||
updateProperty(imageView.htmlID(), "src", text, imageView.session)
|
src := text
|
||||||
if srcset := imageView.srcSet(text); srcset != "" {
|
if src != "" && src[0] == '@' {
|
||||||
|
src, _ = imageProperty(imageView, Source, imageView.session)
|
||||||
|
}
|
||||||
|
updateProperty(imageView.htmlID(), "src", src, imageView.session)
|
||||||
|
if srcset := imageView.srcSet(src); srcset != "" {
|
||||||
updateProperty(imageView.htmlID(), "srcset", srcset, imageView.session)
|
updateProperty(imageView.htmlID(), "srcset", srcset, imageView.session)
|
||||||
} else {
|
} else {
|
||||||
removeProperty(imageView.htmlID(), "srcset", imageView.session)
|
removeProperty(imageView.htmlID(), "srcset", imageView.session)
|
||||||
|
@ -179,15 +183,25 @@ func (imageView *imageViewData) closeHTMLTag() bool {
|
||||||
|
|
||||||
func (imageView *imageViewData) htmlProperties(self View, buffer *strings.Builder) {
|
func (imageView *imageViewData) htmlProperties(self View, buffer *strings.Builder) {
|
||||||
imageView.viewData.htmlProperties(self, buffer)
|
imageView.viewData.htmlProperties(self, buffer)
|
||||||
imageResource := GetImageViewSource(imageView, "")
|
|
||||||
if imageResource != "" {
|
if imageResource, ok := imageProperty(imageView, Source, imageView.Session()); ok && imageResource != "" {
|
||||||
buffer.WriteString(` src="`)
|
if imageResource[0] == '@' {
|
||||||
buffer.WriteString(imageResource)
|
if image, ok := imageView.Session().ImageConstant(imageResource[1:]); ok {
|
||||||
buffer.WriteString(`"`)
|
imageResource = image
|
||||||
if srcset := imageView.srcSet(imageResource); srcset != "" {
|
} else {
|
||||||
buffer.WriteString(` srcset="`)
|
imageResource = ""
|
||||||
buffer.WriteString(srcset)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if imageResource != "" {
|
||||||
|
buffer.WriteString(` src="`)
|
||||||
|
buffer.WriteString(imageResource)
|
||||||
buffer.WriteString(`"`)
|
buffer.WriteString(`"`)
|
||||||
|
if srcset := imageView.srcSet(imageResource); srcset != "" {
|
||||||
|
buffer.WriteString(` srcset="`)
|
||||||
|
buffer.WriteString(srcset)
|
||||||
|
buffer.WriteString(`"`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,9 +250,16 @@ func (imageView *imageViewData) cssStyle(self View, builder cssBuilder) {
|
||||||
// GetImageViewSource returns the image URL of an ImageView subview.
|
// GetImageViewSource returns the image URL of an ImageView subview.
|
||||||
// If the second argument (subviewID) is "" then a left position of the first argument (view) is returned
|
// If the second argument (subviewID) is "" then a left position of the first argument (view) is returned
|
||||||
func GetImageViewSource(view View, subviewID string) string {
|
func GetImageViewSource(view View, subviewID string) string {
|
||||||
if image, ok := stringProperty(view, Source, view.Session()); ok {
|
if subviewID != "" {
|
||||||
return image
|
view = ViewByID(view, subviewID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if view != nil {
|
||||||
|
if image, ok := imageProperty(view, Source, view.Session()); ok {
|
||||||
|
return image
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,23 @@ func stringProperty(properties Properties, tag string, session Session) (string,
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func imageProperty(properties Properties, tag string, session Session) (string, bool) {
|
||||||
|
if value := properties.getRaw(tag); value != nil {
|
||||||
|
if text, ok := value.(string); ok {
|
||||||
|
if text != "" && text[0] == '@' {
|
||||||
|
if image, ok := session.ImageConstant(text[1:]); ok {
|
||||||
|
return image, true
|
||||||
|
} else {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return text, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
func valueToSizeUnit(value interface{}, session Session) (SizeUnit, bool) {
|
func valueToSizeUnit(value interface{}, session Session) (SizeUnit, bool) {
|
||||||
if value != nil {
|
if value != nil {
|
||||||
switch value := value.(type) {
|
switch value := value.(type) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
@ -422,5 +423,6 @@ func AllImageResources() []string {
|
||||||
for image := range resources.images {
|
for image := range resources.images {
|
||||||
result = append(result, image)
|
result = append(result, image)
|
||||||
}
|
}
|
||||||
|
sort.Strings(result)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,10 @@ type Session interface {
|
||||||
Color(tag string) (Color, bool)
|
Color(tag string) (Color, bool)
|
||||||
// ColorTags returns the list of all available color constants
|
// ColorTags returns the list of all available color constants
|
||||||
ColorTags() []string
|
ColorTags() []string
|
||||||
|
// ImageConstant returns the image constant with "tag" name or "" if it is not exists
|
||||||
|
ImageConstant(tag string) (string, bool)
|
||||||
|
// ImageConstantTags returns the list of all available image constants
|
||||||
|
ImageConstantTags() []string
|
||||||
// SetCustomTheme set the custom theme
|
// SetCustomTheme set the custom theme
|
||||||
SetCustomTheme(name string) bool
|
SetCustomTheme(name string) bool
|
||||||
// UserAgent returns the "user-agent" text of the client browser
|
// UserAgent returns the "user-agent" text of the client browser
|
||||||
|
|
|
@ -186,6 +186,45 @@ func (session *sessionData) Color(tag string) (Color, bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (session *sessionData) ImageConstant(tag string) (string, bool) {
|
||||||
|
tags := []string{tag}
|
||||||
|
result := ""
|
||||||
|
theme := session.getCurrentTheme()
|
||||||
|
for {
|
||||||
|
ok := false
|
||||||
|
if session.darkTheme {
|
||||||
|
if theme.darkImages != nil {
|
||||||
|
result, ok = theme.darkImages[tag]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
if theme.images != nil {
|
||||||
|
result, ok = theme.images[tag]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
ErrorLogF(`"%v" image not found`, tag)
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
if result == "" || result[0] != '@' {
|
||||||
|
return result, true
|
||||||
|
}
|
||||||
|
|
||||||
|
tag = result[1:]
|
||||||
|
for _, t := range tags {
|
||||||
|
if t == tag {
|
||||||
|
ErrorLogF(`"%v" image is cyclic`, tag)
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tags = append(tags, tag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (session *sessionData) SetCustomTheme(name string) bool {
|
func (session *sessionData) SetCustomTheme(name string) bool {
|
||||||
if name == "" {
|
if name == "" {
|
||||||
if session.customTheme == nil {
|
if session.customTheme == nil {
|
||||||
|
@ -374,3 +413,21 @@ func (session *sessionData) ColorTags() []string {
|
||||||
sort.Strings(keys)
|
sort.Strings(keys)
|
||||||
return keys
|
return keys
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (session *sessionData) ImageConstantTags() []string {
|
||||||
|
theme := session.getCurrentTheme()
|
||||||
|
|
||||||
|
keys := make([]string, 0, len(theme.colors))
|
||||||
|
for k := range theme.images {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
for tag := range theme.darkImages {
|
||||||
|
if _, ok := theme.images[tag]; !ok {
|
||||||
|
keys = append(keys, tag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Strings(keys)
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
36
theme.go
36
theme.go
|
@ -111,6 +111,8 @@ type theme struct {
|
||||||
touchConstants map[string]string
|
touchConstants map[string]string
|
||||||
colors map[string]string
|
colors map[string]string
|
||||||
darkColors map[string]string
|
darkColors map[string]string
|
||||||
|
images map[string]string
|
||||||
|
darkImages map[string]string
|
||||||
styles map[string]Params
|
styles map[string]Params
|
||||||
mediaStyles []mediaStyle
|
mediaStyles []mediaStyle
|
||||||
}
|
}
|
||||||
|
@ -129,6 +131,8 @@ func (theme *theme) init() {
|
||||||
theme.touchConstants = map[string]string{}
|
theme.touchConstants = map[string]string{}
|
||||||
theme.colors = map[string]string{}
|
theme.colors = map[string]string{}
|
||||||
theme.darkColors = map[string]string{}
|
theme.darkColors = map[string]string{}
|
||||||
|
theme.images = map[string]string{}
|
||||||
|
theme.darkImages = map[string]string{}
|
||||||
theme.styles = map[string]Params{}
|
theme.styles = map[string]Params{}
|
||||||
theme.mediaStyles = []mediaStyle{}
|
theme.mediaStyles = []mediaStyle{}
|
||||||
}
|
}
|
||||||
|
@ -154,6 +158,14 @@ func (theme *theme) concat(anotherTheme *theme) {
|
||||||
theme.darkColors[tag] = color
|
theme.darkColors[tag] = color
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for tag, image := range anotherTheme.images {
|
||||||
|
theme.images[tag] = image
|
||||||
|
}
|
||||||
|
|
||||||
|
for tag, image := range anotherTheme.darkImages {
|
||||||
|
theme.darkImages[tag] = image
|
||||||
|
}
|
||||||
|
|
||||||
for tag, style := range anotherTheme.styles {
|
for tag, style := range anotherTheme.styles {
|
||||||
theme.styles[tag] = style
|
theme.styles[tag] = style
|
||||||
}
|
}
|
||||||
|
@ -308,6 +320,30 @@ func (theme *theme) parseThemeData(data DataObject) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "images":
|
||||||
|
if d.Type() == ObjectNode {
|
||||||
|
if obj := d.Object(); obj != nil {
|
||||||
|
objCount := obj.PropertyCount()
|
||||||
|
for k := 0; k < objCount; k++ {
|
||||||
|
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
|
||||||
|
theme.images[prop.Tag()] = prop.Text()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case "images:dark":
|
||||||
|
if d.Type() == ObjectNode {
|
||||||
|
if obj := d.Object(); obj != nil {
|
||||||
|
objCount := obj.PropertyCount()
|
||||||
|
for k := 0; k < objCount; k++ {
|
||||||
|
if prop := obj.Property(k); prop != nil && prop.Type() == TextNode {
|
||||||
|
theme.darkImages[prop.Tag()] = prop.Text()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case "styles":
|
case "styles":
|
||||||
if d.Type() == ArrayNode {
|
if d.Type() == ArrayNode {
|
||||||
arraySize := d.ArraySize()
|
arraySize := d.ArraySize()
|
||||||
|
|
Loading…
Reference in New Issue