mirror of https://github.com/anoshenko/rui.git
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 {
|
||||
if src, ok := stringProperty(image, Source, session); ok && src != "" {
|
||||
if src, ok := imageProperty(image, Source, session); ok && src != "" {
|
||||
buffer := allocStringBuilder()
|
||||
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
|
||||
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)
|
||||
}
|
||||
|
|
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 {
|
||||
imageView.properties[Source] = text
|
||||
if imageView.created {
|
||||
updateProperty(imageView.htmlID(), "src", text, imageView.session)
|
||||
if srcset := imageView.srcSet(text); srcset != "" {
|
||||
src := text
|
||||
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)
|
||||
} else {
|
||||
removeProperty(imageView.htmlID(), "srcset", imageView.session)
|
||||
|
@ -179,15 +183,25 @@ func (imageView *imageViewData) closeHTMLTag() bool {
|
|||
|
||||
func (imageView *imageViewData) htmlProperties(self View, buffer *strings.Builder) {
|
||||
imageView.viewData.htmlProperties(self, buffer)
|
||||
imageResource := GetImageViewSource(imageView, "")
|
||||
if imageResource != "" {
|
||||
buffer.WriteString(` src="`)
|
||||
buffer.WriteString(imageResource)
|
||||
buffer.WriteString(`"`)
|
||||
if srcset := imageView.srcSet(imageResource); srcset != "" {
|
||||
buffer.WriteString(` srcset="`)
|
||||
buffer.WriteString(srcset)
|
||||
|
||||
if imageResource, ok := imageProperty(imageView, Source, imageView.Session()); ok && imageResource != "" {
|
||||
if imageResource[0] == '@' {
|
||||
if image, ok := imageView.Session().ImageConstant(imageResource[1:]); ok {
|
||||
imageResource = image
|
||||
} else {
|
||||
imageResource = ""
|
||||
}
|
||||
}
|
||||
|
||||
if imageResource != "" {
|
||||
buffer.WriteString(` src="`)
|
||||
buffer.WriteString(imageResource)
|
||||
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.
|
||||
// If the second argument (subviewID) is "" then a left position of the first argument (view) is returned
|
||||
func GetImageViewSource(view View, subviewID string) string {
|
||||
if image, ok := stringProperty(view, Source, view.Session()); ok {
|
||||
return image
|
||||
if subviewID != "" {
|
||||
view = ViewByID(view, subviewID)
|
||||
}
|
||||
|
||||
if view != nil {
|
||||
if image, ok := imageProperty(view, Source, view.Session()); ok {
|
||||
return image
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,23 @@ func stringProperty(properties Properties, tag string, session Session) (string,
|
|||
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) {
|
||||
if value != nil {
|
||||
switch value := value.(type) {
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
@ -422,5 +423,6 @@ func AllImageResources() []string {
|
|||
for image := range resources.images {
|
||||
result = append(result, image)
|
||||
}
|
||||
sort.Strings(result)
|
||||
return result
|
||||
}
|
||||
|
|
|
@ -35,6 +35,10 @@ type Session interface {
|
|||
Color(tag string) (Color, bool)
|
||||
// ColorTags returns the list of all available color constants
|
||||
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(name string) bool
|
||||
// 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 {
|
||||
if name == "" {
|
||||
if session.customTheme == nil {
|
||||
|
@ -374,3 +413,21 @@ func (session *sessionData) ColorTags() []string {
|
|||
sort.Strings(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
|
||||
colors map[string]string
|
||||
darkColors map[string]string
|
||||
images map[string]string
|
||||
darkImages map[string]string
|
||||
styles map[string]Params
|
||||
mediaStyles []mediaStyle
|
||||
}
|
||||
|
@ -129,6 +131,8 @@ func (theme *theme) init() {
|
|||
theme.touchConstants = map[string]string{}
|
||||
theme.colors = map[string]string{}
|
||||
theme.darkColors = map[string]string{}
|
||||
theme.images = map[string]string{}
|
||||
theme.darkImages = map[string]string{}
|
||||
theme.styles = map[string]Params{}
|
||||
theme.mediaStyles = []mediaStyle{}
|
||||
}
|
||||
|
@ -154,6 +158,14 @@ func (theme *theme) concat(anotherTheme *theme) {
|
|||
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 {
|
||||
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":
|
||||
if d.Type() == ArrayNode {
|
||||
arraySize := d.ArraySize()
|
||||
|
|
Loading…
Reference in New Issue