summaryrefslogtreecommitdiff
path: root/src/windows/info_bar.py
blob: 9917fa6a2fe17c41ff89340b29fb1b7a39b2e13f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
Module defining the global info bar

This window is the one listing the current opened tabs in poezio.
The GlobalInfoBar can be either horizontal or vertical
(VerticalGlobalInfoBar).
"""
import logging
log = logging.getLogger(__name__)

import curses


from config import config
from . import Win, g_lock
from theming import get_theme, to_curses_attr

class GlobalInfoBar(Win):
    def __init__(self):
        Win.__init__(self)

    def refresh(self):
        log.debug('Refresh: %s', self.__class__.__name__)
        with g_lock:
            self._win.erase()
            self.addstr(0, 0, "[", to_curses_attr(get_theme().COLOR_INFORMATION_BAR))

            create_gaps = config.get('create_gaps', False)
            show_names = config.get('show_tab_names', False)
            show_nums = config.get('show_tab_numbers', True)
            use_nicks = config.get('use_tab_nicks', True)
            # ignore any remaining gap tabs if the feature is not enabled
            if create_gaps:
                sorted_tabs = self.core.tabs[:]
            else:
                sorted_tabs = [tab for tab in self.core.tabs if tab]

            for nb, tab in enumerate(sorted_tabs):
                if not tab: continue
                color = tab.color
                if not config.get('show_inactive_tabs', True) and\
                        color is get_theme().COLOR_TAB_NORMAL:
                    continue
                try:
                    if show_nums or not show_names:
                        self.addstr("%s" % str(nb), to_curses_attr(color))
                        if show_names:
                            self.addstr(' ', to_curses_attr(color))
                    if show_names:
                        if use_nicks:
                            self.addstr("%s" % str(tab.get_nick()), to_curses_attr(color))
                        else:
                            self.addstr("%s" % tab.name, to_curses_attr(color))
                    self.addstr("|", to_curses_attr(get_theme().COLOR_INFORMATION_BAR))
                except:             # end of line
                    break
            (y, x) = self._win.getyx()
            self.addstr(y, x-1, '] ', to_curses_attr(get_theme().COLOR_INFORMATION_BAR))
            (y, x) = self._win.getyx()
            remaining_size = self.width - x
            self.addnstr(' '*remaining_size, remaining_size,
                         to_curses_attr(get_theme().COLOR_INFORMATION_BAR))
            self._refresh()

class VerticalGlobalInfoBar(Win):
    def __init__(self, scr):
        Win.__init__(self)
        self._win = scr

    def refresh(self):
        with g_lock:
            height, width = self._win.getmaxyx()
            self._win.erase()
            sorted_tabs = [tab for tab in self.core.tabs if tab]
            if not config.get('show_inactive_tabs', True):
                sorted_tabs = [tab for tab in sorted_tabs if\
                                   tab.vertical_color != get_theme().COLOR_VERTICAL_TAB_NORMAL]
            nb_tabs = len(sorted_tabs)
            use_nicks = config.get('use_tab_nicks', True)
            if nb_tabs >= height:
                for y, tab in enumerate(sorted_tabs):
                    if tab.vertical_color == get_theme().COLOR_VERTICAL_TAB_CURRENT:
                        pos = y
                        break
                # center the current tab as much as possible
                if pos < height//2:
                    sorted_tabs = sorted_tabs[:height]
                elif nb_tabs - pos <= height//2:
                    sorted_tabs = sorted_tabs[-height:]
                else:
                    sorted_tabs = sorted_tabs[pos-height//2 : pos+height//2]
            for y, tab in enumerate(sorted_tabs):
                color = tab.vertical_color

                if not config.get('vertical_tab_list_sort', 'desc') != 'asc':
                    y = height - y - 1
                self.addstr(y, 0, "%2d" % tab.nb,
                        to_curses_attr(get_theme().COLOR_VERTICAL_TAB_NUMBER))
                self.addstr('.')
                if use_nicks:
                    self.addnstr("%s" % tab.get_nick(), width - 4, to_curses_attr(color))
                else:
                    self.addnstr("%s" % tab.name, width - 4, to_curses_attr(color))
            separator = to_curses_attr(get_theme().COLOR_VERTICAL_SEPARATOR)
            self._win.attron(separator)
            self._win.vline(0, width-1, curses.ACS_VLINE, height)
            self._win.attroff(separator)
            self._refresh()