# Theming module

Define the variables (colors and some other stuff) that are used when drawing the interface.

Colors are numbers from -1 to 7 (if only 8 colors are supported) or -1 to 255 if 256 colors are available. If only 8 colors are available, all colors > 8 are converted using the table_256_to_16 dict.

XHTML-IM colors are converted to -1 -> 255 colors if available, or directly to -1 -> 8 if we are in 8-color-mode.

A pair_color is a background-foreground pair. All possible pairs are not created at startup, because that would create 256*256 pairs, and almost all of them would never be used.

A theme should define color tuples, like `(200, -1)`, and when they are to be used by poezio’s interface, they will be created once, and kept in a list for later usage. A color tuple is of the form `(foreground, background, optional)` A color of -1 means the default color. So if you do not want to have a background color, use `(x, -1)`. The optional third value of the tuple defines additional information. It is a string and can contain one or more of these characters:

- `b`: bold
- `u`: underlined
- `x`: blink

For example, `(200, 208, 'bu')` is bold, underlined and pink foreground on orange background.

A theme file is a python file containing one object named ‘theme’, which is an instance of a class (derived from the Theme class) defined in that same file. For example, in pinkytheme.py:

    import theming
    class PinkyTheme(theming.Theme):
        COLOR_NORMAL_TEXT = (200, -1)

    theme = PinkyTheme()

if the command ‘/theme pinkytheme’ is issued, we import the pinkytheme.py file and set the global variable ‘theme’ to pinkytheme.theme.

And in poezio’s code we just use `theme.COLOR_NORMAL_TEXT` etc

Since a theme inherites from the Theme class (defined here), if a color is not defined in a theme file, the color is the default one.

Some values in that class are a list of color tuple. For example `[(1, -1), (2, -1), (3, -1)]` Such a list SHOULD contain at least one color tuple. It is used for example to define color gradient, etc.

class `theming.``Theme`

  The theme class, from which all themes should inherit. All of the following values can be replaced in subclasses, in order to create a new theme.

  Do not edit this file if you want to change the theme to suit your needs. Create a new theme and share it if you think it can be useful for others.