summaryrefslogtreecommitdiff
path: root/poezio/theming.py
diff options
context:
space:
mode:
Diffstat (limited to 'poezio/theming.py')
-rwxr-xr-xpoezio/theming.py273
1 files changed, 182 insertions, 91 deletions
diff --git a/poezio/theming.py b/poezio/theming.py
index d007e463..a3721f08 100755
--- a/poezio/theming.py
+++ b/poezio/theming.py
@@ -4,7 +4,6 @@
#
# Poezio is free software: you can redistribute it and/or modify
# it under the terms of the zlib license. See the COPYING file.
-
"""
Define the variables (colors and some other stuff) that are
used when drawing the interface.
@@ -80,6 +79,7 @@ from os import path
from importlib import machinery
finder = machinery.PathFinder()
+
class Theme(object):
"""
The theme class, from which all themes should inherit.
@@ -90,6 +90,7 @@ class Theme(object):
needs. Create a new theme and share it if you think it can be useful
for others.
"""
+
@classmethod
def color_role(cls, role):
role_mapping = {
@@ -104,34 +105,34 @@ class Theme(object):
@classmethod
def char_affiliation(cls, affiliation):
affiliation_mapping = {
- 'owner': cls.CHAR_AFFILIATION_OWNER,
- 'admin': cls.CHAR_AFFILIATION_ADMIN,
- 'member': cls.CHAR_AFFILIATION_MEMBER,
- 'none': cls.CHAR_AFFILIATION_NONE
+ 'owner': cls.CHAR_AFFILIATION_OWNER,
+ 'admin': cls.CHAR_AFFILIATION_ADMIN,
+ 'member': cls.CHAR_AFFILIATION_MEMBER,
+ 'none': cls.CHAR_AFFILIATION_NONE
}
return affiliation_mapping.get(affiliation, cls.CHAR_AFFILIATION_NONE)
@classmethod
def color_show(cls, show):
show_mapping = {
- 'xa': cls.COLOR_STATUS_XA,
- 'none': cls.COLOR_STATUS_NONE,
- 'dnd': cls.COLOR_STATUS_DND,
- 'away': cls.COLOR_STATUS_AWAY,
- 'chat': cls.COLOR_STATUS_CHAT,
- '': cls.COLOR_STATUS_ONLINE,
- 'available': cls.COLOR_STATUS_ONLINE,
- 'unavailable': cls.COLOR_STATUS_UNAVAILABLE,
+ 'xa': cls.COLOR_STATUS_XA,
+ 'none': cls.COLOR_STATUS_NONE,
+ 'dnd': cls.COLOR_STATUS_DND,
+ 'away': cls.COLOR_STATUS_AWAY,
+ 'chat': cls.COLOR_STATUS_CHAT,
+ '': cls.COLOR_STATUS_ONLINE,
+ 'available': cls.COLOR_STATUS_ONLINE,
+ 'unavailable': cls.COLOR_STATUS_UNAVAILABLE,
}
return show_mapping.get(show, cls.COLOR_STATUS_NONE)
@classmethod
def char_subscription(cls, sub, keep='incomplete'):
sub_mapping = {
- 'from': cls.CHAR_ROSTER_FROM,
- 'both': cls.CHAR_ROSTER_BOTH,
- 'none': cls.CHAR_ROSTER_NONE,
- 'to': cls.CHAR_ROSTER_TO,
+ 'from': cls.CHAR_ROSTER_FROM,
+ 'both': cls.CHAR_ROSTER_BOTH,
+ 'none': cls.CHAR_ROSTER_NONE,
+ 'to': cls.CHAR_ROSTER_TO,
}
if keep == 'incomplete' and sub == 'both':
return ''
@@ -141,7 +142,7 @@ class Theme(object):
# Message text color
COLOR_NORMAL_TEXT = (-1, -1)
- COLOR_INFORMATION_TEXT = (5, -1) # TODO
+ COLOR_INFORMATION_TEXT = (5, -1) # TODO
COLOR_WARNING_TEXT = (1, -1)
# Color of the commands in the help message
@@ -181,7 +182,6 @@ class Theme(object):
CHAR_AFFILIATION_MEMBER = '+'
CHAR_AFFILIATION_NONE = '-'
-
# XML Tab
CHAR_XML_IN = 'IN '
CHAR_XML_OUT = 'OUT'
@@ -238,42 +238,132 @@ class Theme(object):
# Setting more colors makes it harder to have two nicks with the same color,
# avoiding confusions.
LIST_COLOR_NICKNAMES = [
- (1, -1), (2, -1), (3, -1), (4, -1), (5, -1), (6, -1), (9, -1),
- (10, -1), (11, -1), (12, -1), (13, -1), (14, -1), (19, -1),
- (20, -1), (21, -1), (22, -1), (23, -1), (24, -1), (25, -1),
- (26, -1), (27, -1), (28, -1), (29, -1), (30, -1), (31, -1),
- (32, -1), (33, -1), (34, -1), (35, -1), (36, -1), (37, -1),
- (38, -1), (39, -1), (40, -1), (41, -1), (42, -1), (43, -1),
- (44, -1), (45, -1), (46, -1), (47, -1), (48, -1), (49, -1),
- (50, -1), (51, -1), (54, -1), (55, -1), (56, -1), (57, -1),
- (58, -1), (60, -1), (61, -1), (62, -1), (63, -1), (64, -1),
- (65, -1), (66, -1), (67, -1), (68, -1), (69, -1), (70, -1),
- (71, -1), (72, -1), (73, -1), (74, -1), (75, -1), (76, -1),
- (77, -1), (78, -1), (79, -1), (80, -1), (81, -1), (82, -1),
- (83, -1), (84, -1), (85, -1), (86, -1), (87, -1), (88, -1),
- (89, -1), (90, -1), (91, -1), (92, -1), (93, -1), (94, -1),
- (95, -1), (96, -1), (97, -1), (98, -1), (99, -1), (100, -1),
- (101, -1), (103, -1), (104, -1), (105, -1), (106, -1), (107, -1),
- (108, -1), (109, -1), (110, -1), (111, -1), (112, -1), (113, -1),
- (114, -1), (115, -1), (116, -1), (117, -1), (118, -1), (119, -1),
- (120, -1), (121, -1), (122, -1), (123, -1), (124, -1), (125, -1),
- (126, -1), (127, -1), (128, -1), (129, -1), (130, -1), (131, -1),
- (132, -1), (133, -1), (134, -1), (135, -1), (136, -1), (137, -1),
- (138, -1), (139, -1), (140, -1), (141, -1), (142, -1), (143, -1),
- (144, -1), (145, -1), (146, -1), (147, -1), (148, -1), (149, -1),
- (150, -1), (151, -1), (152, -1), (153, -1), (154, -1), (155, -1),
- (156, -1), (157, -1), (158, -1), (159, -1), (160, -1), (161, -1),
- (162, -1), (163, -1), (164, -1), (165, -1), (166, -1), (167, -1),
- (168, -1), (169, -1), (170, -1), (171, -1), (172, -1), (173, -1),
- (174, -1), (175, -1), (176, -1), (177, -1), (178, -1), (179, -1),
- (180, -1), (181, -1), (182, -1), (183, -1), (184, -1), (185, -1),
- (186, -1), (187, -1), (188, -1), (189, -1), (190, -1), (191, -1),
- (192, -1), (193, -1), (196, -1), (197, -1), (198, -1), (199, -1),
- (200, -1), (201, -1), (202, -1), (203, -1), (204, -1), (205, -1),
- (206, -1), (207, -1), (208, -1), (209, -1), (210, -1), (211, -1),
- (212, -1), (213, -1), (214, -1), (215, -1), (216, -1), (217, -1),
- (218, -1), (219, -1), (220, -1), (221, -1), (222, -1), (223, -1),
- (224, -1), (225, -1), (226, -1), (227, -1)]
+ (1, -1), (2, -1), (3, -1), (4, -1), (5, -1), (6, -1), (9, -1),
+ (10, -1), (11, -1), (12, -1), (13, -1), (14, -1), (19, -1), (20, -1),
+ (21, -1), (22, -1), (23, -1), (24, -1), (25, -1), (26, -1), (27, -1),
+ (28, -1), (29, -1), (30, -1), (31, -1), (32, -1), (33, -1), (34, -1),
+ (35, -1), (36, -1), (37, -1), (38, -1), (39, -1), (40, -1), (41, -1),
+ (42, -1), (43, -1), (44, -1), (45, -1), (46, -1), (47, -1), (48, -1),
+ (49, -1), (50, -1), (51, -1), (54, -1), (55, -1), (56, -1), (57, -1),
+ (58, -1), (60, -1), (61, -1), (62, -1), (63, -1), (64, -1), (65, -1),
+ (66, -1), (67, -1), (68, -1), (69, -1), (70, -1), (71, -1), (72, -1),
+ (73, -1), (74, -1), (75, -1), (76, -1), (77, -1), (78, -1), (79, -1),
+ (80, -1), (81, -1), (82, -1), (83, -1), (84, -1), (85, -1), (86, -1),
+ (87, -1), (88, -1), (89, -1), (90, -1), (91, -1), (92, -1), (93, -1),
+ (94, -1), (95, -1), (96, -1), (97, -1), (98, -1), (99, -1), (100, -1),
+ (101, -1), (103, -1), (104, -1), (105, -1), (106, -1), (107, -1), (108,
+ -1),
+ (109, -1), (110, -1), (111, -1), (112, -1), (113, -1), (114, -1), (115,
+ -1),
+ (116, -1), (117, -1), (118, -1), (119, -1), (120, -1), (121, -1), (122,
+ -1),
+ (123, -1), (124, -1), (125, -1), (126, -1), (127, -1), (128, -1), (129,
+ -1),
+ (130,
+ -1), (131,
+ -1), (132,
+ -1), (133,
+ -1), (134,
+ -1), (135,
+ -1), (136,
+ -1), (137,
+ -1), (138,
+ -1), (139,
+ -1), (140,
+ -1), (141,
+ -1),
+ (142,
+ -1), (143,
+ -1), (144,
+ -1), (145,
+ -1), (146,
+ -1), (147,
+ -1), (148,
+ -1), (149,
+ -1), (150,
+ -1), (151,
+ -1), (152,
+ -1), (153,
+ -1),
+ (154,
+ -1), (155,
+ -1), (156,
+ -1), (157,
+ -1), (158,
+ -1), (159,
+ -1), (160,
+ -1), (161,
+ -1), (162,
+ -1), (163,
+ -1), (164,
+ -1), (165,
+ -1),
+ (166,
+ -1), (167,
+ -1), (168,
+ -1), (169,
+ -1), (170,
+ -1), (171,
+ -1), (172,
+ -1), (173,
+ -1), (174,
+ -1), (175,
+ -1), (176,
+ -1), (177,
+ -1),
+ (178,
+ -1), (179,
+ -1), (180,
+ -1), (181,
+ -1), (182,
+ -1), (183,
+ -1), (184,
+ -1), (185,
+ -1), (186,
+ -1), (187,
+ -1), (188,
+ -1), (189,
+ -1),
+ (190,
+ -1), (191,
+ -1), (192,
+ -1), (193,
+ -1), (196,
+ -1), (197,
+ -1), (198,
+ -1), (199,
+ -1), (200,
+ -1), (201,
+ -1), (202,
+ -1), (203,
+ -1),
+ (204,
+ -1), (205,
+ -1), (206,
+ -1), (207,
+ -1), (208,
+ -1), (209,
+ -1), (210,
+ -1), (211,
+ -1), (212,
+ -1), (213,
+ -1), (214,
+ -1), (215,
+ -1),
+ (216,
+ -1), (217,
+ -1), (218,
+ -1), (219,
+ -1), (220,
+ -1), (221,
+ -1), (222,
+ -1), (223,
+ -1), (224,
+ -1), (225,
+ -1), (226,
+ -1), (227,
+ -1)
+ ]
# This is your own nickname
COLOR_OWN_NICK = (254, -1)
@@ -346,19 +436,20 @@ class Theme(object):
# Info messages color (the part before the ">")
INFO_COLORS = {
- 'info': (5, -1),
- 'error': (16, 1),
- 'warning': (1, -1),
- 'roster': (2, -1),
- 'help': (10, -1),
- 'headline': (11, -1, 'b'),
- 'tune': (6, -1),
- 'gaming': (6, -1),
- 'mood': (2, -1),
- 'activity': (3, -1),
- 'default': (7, -1),
+ 'info': (5, -1),
+ 'error': (16, 1),
+ 'warning': (1, -1),
+ 'roster': (2, -1),
+ 'help': (10, -1),
+ 'headline': (11, -1, 'b'),
+ 'tune': (6, -1),
+ 'gaming': (6, -1),
+ 'mood': (2, -1),
+ 'activity': (3, -1),
+ 'default': (7, -1),
}
+
# This is the default theme object, used if no theme is defined in the conf
theme = Theme()
@@ -369,37 +460,36 @@ theme = Theme()
curses_colors_dict = {}
table_256_to_16 = [
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
- 0, 4, 4, 4, 12, 12, 2, 6, 4, 4, 12, 12, 2, 2, 6, 4,
- 12, 12, 2, 2, 2, 6, 12, 12, 10, 10, 10, 10, 14, 12, 10, 10,
- 10, 10, 10, 14, 1, 5, 4, 4, 12, 12, 3, 8, 4, 4, 12, 12,
- 2, 2, 6, 4, 12, 12, 2, 2, 2, 6, 12, 12, 10, 10, 10, 10,
- 14, 12, 10, 10, 10, 10, 10, 14, 1, 1, 5, 4, 12, 12, 1, 1,
- 5, 4, 12, 12, 3, 3, 8, 4, 12, 12, 2, 2, 2, 6, 12, 12,
- 10, 10, 10, 10, 14, 12, 10, 10, 10, 10, 10, 14, 1, 1, 1, 5,
- 12, 12, 1, 1, 1, 5, 12, 12, 1, 1, 1, 5, 12, 12, 3, 3,
- 3, 7, 12, 12, 10, 10, 10, 10, 14, 12, 10, 10, 10, 10, 10, 14,
- 9, 9, 9, 9, 13, 12, 9, 9, 9, 9, 13, 12, 9, 9, 9, 9,
- 13, 12, 9, 9, 9, 9, 13, 12, 11, 11, 11, 11, 7, 12, 10, 10,
- 10, 10, 10, 14, 9, 9, 9, 9, 9, 13, 9, 9, 9, 9, 9, 13,
- 9, 9, 9, 9, 9, 13, 9, 9, 9, 9, 9, 13, 9, 9, 9, 9,
- 9, 13, 11, 11, 11, 11, 11, 15, 0, 0, 0, 0, 0, 0, 8, 8,
- 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 4, 4, 4, 12, 12,
+ 2, 6, 4, 4, 12, 12, 2, 2, 6, 4, 12, 12, 2, 2, 2, 6, 12, 12, 10, 10, 10, 10,
+ 14, 12, 10, 10, 10, 10, 10, 14, 1, 5, 4, 4, 12, 12, 3, 8, 4, 4, 12, 12, 2,
+ 2, 6, 4, 12, 12, 2, 2, 2, 6, 12, 12, 10, 10, 10, 10, 14, 12, 10, 10, 10,
+ 10, 10, 14, 1, 1, 5, 4, 12, 12, 1, 1, 5, 4, 12, 12, 3, 3, 8, 4, 12, 12, 2,
+ 2, 2, 6, 12, 12, 10, 10, 10, 10, 14, 12, 10, 10, 10, 10, 10, 14, 1, 1, 1,
+ 5, 12, 12, 1, 1, 1, 5, 12, 12, 1, 1, 1, 5, 12, 12, 3, 3, 3, 7, 12, 12, 10,
+ 10, 10, 10, 14, 12, 10, 10, 10, 10, 10, 14, 9, 9, 9, 9, 13, 12, 9, 9, 9, 9,
+ 13, 12, 9, 9, 9, 9, 13, 12, 9, 9, 9, 9, 13, 12, 11, 11, 11, 11, 7, 12, 10,
+ 10, 10, 10, 10, 14, 9, 9, 9, 9, 9, 13, 9, 9, 9, 9, 9, 13, 9, 9, 9, 9, 9,
+ 13, 9, 9, 9, 9, 9, 13, 9, 9, 9, 9, 9, 13, 11, 11, 11, 11, 11, 15, 0, 0, 0,
+ 0, 0, 0, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15
]
load_path = []
+
def color_256_to_16(color):
if color == -1:
return color
return table_256_to_16[color]
+
def dump_tuple(tup):
"""
Dump a tuple to a string of fg,bg,attr (optional)
"""
return ','.join(str(i) for i in tup)
+
def read_tuple(_str):
"""
Read a tuple dumped with dump_tumple
@@ -408,6 +498,7 @@ def read_tuple(_str):
char = attrs[2] if len(attrs) > 2 else '\0'
return (int(attrs[0]), int(attrs[1])), char
+
@functools.lru_cache(maxsize=128)
def to_curses_attr(color_tuple):
"""
@@ -451,31 +542,30 @@ def to_curses_attr(color_tuple):
curses_pair = curses_pair | curses.A_BLINK
return curses_pair
+
def get_theme():
"""
Returns the current theme
"""
return theme
+
def update_themes_dir(option=None, value=None):
global load_path
load_path = []
# import from the git sources
default_dir = path.join(
- path.dirname(path.dirname(__file__)),
- 'data/themes')
+ path.dirname(path.dirname(__file__)), 'data/themes')
if path.exists(default_dir):
load_path.append(default_dir)
# import from the user-defined prefs
themes_dir = path.expanduser(
- value or
- config.get('themes_dir') or
- path.join(os.environ.get('XDG_DATA_HOME') or
- path.join(os.environ.get('HOME'), '.local', 'share'),
- 'poezio', 'themes')
- )
+ value or config.get('themes_dir') or path.join(
+ os.environ.get('XDG_DATA_HOME')
+ or path.join(os.environ.get('HOME'), '.local', 'share'), 'poezio',
+ 'themes'))
try:
os.makedirs(themes_dir)
except OSError as e:
@@ -497,6 +587,7 @@ def update_themes_dir(option=None, value=None):
log.debug('Theme load path: %s', load_path)
+
def reload_theme():
theme_name = config.get('theme')
global theme
@@ -522,6 +613,7 @@ def reload_theme():
else:
return 'No theme present in the theme file'
+
if __name__ == '__main__':
# Display some nice text with nice colors
s = curses.initscr()
@@ -539,4 +631,3 @@ if __name__ == '__main__':
finally:
curses.endwin()
print()
-