diff options
Diffstat (limited to 'poezio/theming.py')
-rwxr-xr-x | poezio/theming.py | 273 |
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() - |