I was actually considering CSS-like styling as well as XML config styling:

<configuration>
   <styling>
       <component name="id" type="type" width="200px" height="150px" 
border-width="2px" background-color="#3060CC" />
       ....
   </styling>
</configuration>

If I implement it like XML the name of the styling attributes would be the same 
as in CSS2.1 but this way other configurations can also be defined for the 
framework.

---- OriginalMessage ----
From: "Jake b" <ninmonk...@gmail.com>
To: pygame-users@seul.org
Sent: Fri, Jul 01, 2011, 06:53 PM
Subject: Re: [pygame] Pygame-UI: UI Component Framework for python and pygame

How do you plan on drawing?

You mentioned styling. I suggest using properties and values in the same format 
as CSS2.1 ( http://www.w3.org/TR/CSS21/ ), where possible.

This would allow more users to immediately style the UI, without having to know 
much of the iternals.
You can get quite complex looking results with a few simple properties: ( 
http://www.w3.org/TR/css3-background/#border-images )


Example: One single rectangle ends up like this:

 Details: uses an image sliced into 9 pieces.

 Here's a class I started, some if it is psuedo code, but you should get the 
idea.

# 2011/06/30 ninmonkey
# StyleCSS for ui.
import pygame
from pygame.locals import *
from pygame import Color

# valid size-types for font, border, width, etc.
valid_sizes = ['px', '%', 'pt', 'em']

# which CSS2 andor 3 properties actually do anything ATM.
implemented_css_properties = ['border-width',
    'border-width-top', 'border-width-right', 'border-width-bottom', 
'border-width-left',
    'font-size',
    'color', 'background-color']
# non-standard style info, that is implemented.
implemented_extra_properties = ['foo', 'bar', 'icon', 'alert-box']

class StyleCSS(object):
    """
    methods:
    members:
        default_size:   one of a valid_size, used on all values. ( border 
width, font size, etc..)
    """

    def __init__(self, parent):
        self.default_size = 'px'
        self.parent = parent
        # copy parent style data

    def clear(self):
        """reset / empty self, and reload values from parent style"""
        # reset, then reinit

    def set_property(self, prop, value):
        """based on property name, read value differently, and save data."""
        if not prop in self.implemented_css2_properties or
            not prop in self.implemented_extra_properties: return

        # based on property name
        if prop == 'color':
            # = pygame.Color(value)
        elif prop == 'border-width':
            #
        elif prop == 'border-left-width':
            # ...

    def load_as_str(self, strcss):
        """load a string containing real a string of real style.css text.

        note:
            expects style info, without selectors, and without brackets.
        example:
            strcss = "font-size: 20px; color-bg: grey; color: white;"

        Also:
            allows you to save presets, that can append eachother, saving to 
files, and mix-match like selectors can.  ( ie: content-main.css, 
inventory-window-base.css, inventory-bags.css, text-big.css, text-small.css, 
text-sans.css, text-serif.css)"""
        self.reset()

        # split to rules
        # collapse whitespace
        rules = strcss.split(';')
        # get (prop, str)
        for r in rules:
            prop, str = r.split(':')
            self.set_property(prop, str)

    def append_str(self, strcss):
        """like load_as_str() , but does NOT destroy current style info.
        convienence when needing multiple size unit types.
        """
        pass

# example use

class BaseWidgit():
    def __init__(self, ...):
        self.style = StyleCSS(parent.style)
        # defaults to *derives style* from parent,
        # then self only has to *override specific* values
        self.style.font_size = 20
        base_css = """font-size: 14px; font-family: Verdana, sans-serif;"""
        self.style.append_str(base_css)

class PlayerInventoryWindow(BaseWindow):
    def __init__(self, ...):
        self.style = StyleCSS(parent)
        self.style.load_as_str( filename='window-base.css' )

# example property use:
    # maybe not as needed, but would make some modifications easier.
    # like if player wants to change border-color: when player hover's.
    # or k_minus will increment: font-size += 2
    """
    = css property: border-width =
        format is: Top Right; and Top Right Bottom Left;

        border-width: 2 1;
        border-width: 2, 1, 2, 1;
    """
    # these are equivalent
    style.border_width = (2, 1)
    style.border_width = (2, 1, 2, 1)

    # they set all these.
    # same as expected for CSS2.1 spec
    style.border_top_width = 2
    style.border_right_width = 1
    style.border_bottom_width = 2
    style.border_left_width = 1
--
Jake

Reply via email to