4
ORIENTATION_SIDEBAR_LEFT = 0
5
ORIENTATION_SIDEBAR_RIGHT = 1
7
BOOK_TERMINAL = 'Terminal'
10
BOOK_PLUGIN = 'Plugin'
13
from pida.core.locale import Locale
14
locale = Locale('pida')
17
class BaseBookConfig(object):
19
def __init__(self, orientation):
20
self._orientation = orientation
22
def get_tabs_visible(self):
25
def get_tab_position(self):
28
def get_notebook_name(self):
29
raise NotImplementedError(_('Must at least define a notebook name'))
32
raise NotImplementedError(_('Must at leaste define a Name'))
34
def create_tab_label(self, icon, text):
35
if None in [icon, text]:
37
label = gtk.Label(text)
38
if self.get_tab_position() in [gtk.POS_TOP, gtk.POS_BOTTOM]:
43
b = b_factory(spacing=2)
52
class TerminalBookConfig(BaseBookConfig):
54
def get_notebook_name(self):
55
if self._orientation == ORIENTATION_SIDEBAR_LEFT:
64
class EditorBookConfig(BaseBookConfig):
66
def get_notebook_name(self):
67
if self._orientation == ORIENTATION_SIDEBAR_LEFT:
72
def get_tabs_visible(self):
79
class BufferBookConfig(BaseBookConfig):
81
def get_notebook_name(self):
82
if self._orientation == ORIENTATION_SIDEBAR_LEFT:
87
def get_tab_position(self):
88
if self._orientation == ORIENTATION_SIDEBAR_LEFT:
96
class PluginBookConfig(BaseBookConfig):
98
def get_notebook_name(self):
99
if self._orientation == ORIENTATION_SIDEBAR_LEFT:
104
def get_tab_position(self):
105
if self._orientation == ORIENTATION_SIDEBAR_LEFT:
113
class BookConfigurator(object):
115
def __init__(self, orientation):
116
self._orientation = orientation
119
self._widget_names = {}
126
book_config = conf(self._orientation)
127
self._configs[book_config.get_name()] = book_config
128
self._widget_names[book_config.get_notebook_name()] = book_config
130
def get_config(self, name):
132
return self._configs[name]
135
raise KeyError(_('No Notebook attests to having that name %s') % name)
137
def configure_book(self, name, book):
138
conf = self._widget_names[name]
139
self._books[conf.get_name()] = book
140
book.set_show_tabs(conf.get_tabs_visible())
141
book.set_tab_pos(conf.get_tab_position())
143
if conf.get_name() != BOOK_EDITOR:
144
# Cannot drag to the editor terminal for now
147
def get_book(self, name):
148
return self._books[name]
151
return self._books.items()
155
return self._books.keys()
158
class BookManager(object):
160
def __init__(self, configurator):
161
self._conf = configurator
163
for k in self._conf.get_names():
164
self._views[k] = dict()
166
def add_view(self, bookname, view):
167
if not self.has_view(view):
168
self._views[bookname][view.get_unique_id()] = view
169
book = self._get_book(bookname)
170
tab_label = self._create_tab_label(
172
view.create_tab_label_icon(),
173
view.get_tab_label_text())
174
book.append_page(view.get_toplevel(),
176
book.set_current_page(-1)
178
book.set_tab_detachable(view.get_toplevel(), True)
179
self._focus_page(bookname)
181
raise ValueError(_('This view is already in the manager'))
183
def remove_view(self, view):
184
book_name = self._get_book_for_view(view)
185
book = self._get_book(book_name)
186
book.remove(view.get_toplevel())
187
del self._views[book_name][view.get_unique_id()]
189
def move_view(self, bookname, view):
190
self.remove_view(view)
191
self.add_view(bookname, view)
193
def has_view(self, view):
194
return view.get_unique_id() in self._get_view_uids()
196
def next_page(self, bookname):
197
book = self._get_book(bookname)
198
if self._get_current_page(bookname) == book.get_n_pages() - 1:
199
book.set_current_page(0)
202
self._focus_page(bookname)
204
def prev_page(self, bookname):
205
book = self._get_book(bookname)
206
if self._get_current_page(bookname) == 0:
207
book.set_current_page(book.get_n_pages() - 1)
210
self._focus_page(bookname)
212
def _get_current_page(self, bookname):
213
return self._get_book(bookname).get_current_page()
215
def _focus_page(self, bookname):
216
book = self._get_book(bookname)
217
book.get_nth_page(book.get_current_page()).grab_focus()
219
def _get_book(self, name):
220
return self._conf.get_book(name)
222
def _get_book_for_view(self, view):
223
for name, views in self._views.items():
224
if view.get_unique_id() in views:
226
raise ValueError(_('View is not in any Notebook'))
228
def _get_view_uids(self):
230
for book in self._views.values():
231
uids.extend(book.keys())
234
def _create_tab_label(self, bookname, icon, text):
235
conf = self._conf.get_config(bookname)
236
return conf.create_tab_label(icon, text)