pmacs3/bufferlist.py

145 lines
4.9 KiB
Python
Raw Normal View History

2007-03-06 10:05:38 -05:00
import sets
2007-06-04 23:05:33 -04:00
import window2
2007-03-06 10:05:38 -05:00
class Slot:
2007-06-04 03:29:37 -04:00
def __init__(self, height, width, offset):
2007-03-06 10:05:38 -05:00
self.height = height
self.width = width
self.offset = offset
2007-06-04 03:29:37 -04:00
self.window = None
2007-03-06 10:05:38 -05:00
def is_empty(self):
2007-06-04 03:29:37 -04:00
return self.window is None
2007-03-06 10:05:38 -05:00
def resize(self, height, width, offset):
self.height = height
self.width = width
self.offset = offset
2007-06-04 03:29:37 -04:00
if self.window is not None:
self.window.set_size(self.width, self.height)
def set(self, w):
self.window = w
w.set_size(self.width, self.height)
def unset(self):
if not self.is_empty():
old_w = self.window
self.window = None
return old_w
else:
return None
2007-03-06 10:05:38 -05:00
class BufferList:
def __init__(self, height, width, buffers=()):
2007-06-04 03:29:37 -04:00
self.height = height
self.width = width
self.buffers = sets.Set()
self.buffer_names = {}
2007-03-06 10:05:38 -05:00
self.hidden_buffers = []
2007-06-04 03:29:37 -04:00
self.slots = []
self.add_slot()
self.fit_slots()
2007-03-06 10:05:38 -05:00
for b in buffers:
self.add_buffer(b)
2007-06-04 03:29:37 -04:00
def fit_slots(self):
2007-06-04 23:05:33 -04:00
total = self.height - len(self.slots) + 1
heights = [total / len(self.slots)] * len(self.slots)
for i in range(0, total % len(self.slots)):
2007-06-04 03:29:37 -04:00
heights[i] += 1
offsets = [0]
for i in range(1, len(self.slots)):
2007-06-04 23:05:33 -04:00
offsets.insert(i, offsets[i - 1] + heights[i - 1] + 1)
2007-06-04 03:29:37 -04:00
for i in range(0, len(self.slots)):
self.slots[i].resize(heights[i], self.width, offsets[i])
def resize(self, height, width):
self.height = height
self.width = width
self.fit_slots()
def is_window_visible(self, w):
for slot in self.slots:
if w is slot.window:
return True
return False
def is_buffer_visible(self, b):
for slot in self.slots:
if slot.window is not None and b is slot.window.buffer:
return True
return False
2007-03-06 10:05:38 -05:00
# manipulate slots
2007-06-04 03:29:37 -04:00
def add_slot(self):
self.slots.append(Slot(self.height, self.width, 0))
self.fit_slots()
2007-03-06 10:05:38 -05:00
return len(self.slots) - 1
def empty_slot(self, i):
assert i > -1 and i < len(self.slots), "slot %d does not exist" % i
return self.slots[i].is_empty()
2007-06-04 03:29:37 -04:00
def unset_slot(self, i):
assert i > -1 and i < len(self.slots), "slot %d does not exist" % i
old_w = self.slots[i].unset()
if old_w is not None:
old_b = old_w.buffer
if not self.is_buffer_visible(old_b):
self.hidden_buffers.insert(0, old_b)
if len(old_b.windows) > 1:
old_b.remove_window(old_w)
2007-03-06 10:05:38 -05:00
def set_slot(self, i, b):
assert i > -1 and i < len(self.slots), "slot %d does not exist" % i
assert b in self.buffers, "buffer %s does not exist" % (b.name())
2007-06-04 23:05:33 -04:00
slot = self.slots[i]
2007-06-04 03:29:37 -04:00
self.unset_slot(i)
2007-03-06 10:05:38 -05:00
if b in self.hidden_buffers:
self.hidden_buffers.remove(b)
2007-06-04 03:29:37 -04:00
if self.is_window_visible(b.windows[0]):
app = b.windows[0].application
w = window2.Window(b, app, height=slot.height, width=slot.width)
else:
w = b.windows[0]
2007-06-04 23:05:33 -04:00
slot.set(w)
2007-06-04 03:29:37 -04:00
2007-03-06 10:05:38 -05:00
def remove_slot(self, i):
assert i > -1 and i < len(self.slots), "slot %d does not exist" % i
2007-06-04 03:29:37 -04:00
self.unset_slot(i)
2007-03-06 10:05:38 -05:00
del self.slots[i]
2007-06-04 03:29:37 -04:00
self.fit_slots()
2007-03-06 10:05:38 -05:00
# add/remove buffers
def add_buffer(self, b):
assert b not in self.buffers, "buffer %s already exists" % (b.name())
self.buffers.add(b)
self.buffer_names[b.name()] = b
self.hidden_buffers.append(b)
def has_buffer(self, b):
return b in self.buffers
def has_buffer_name(self, name):
return name in self.buffer_names
def get_buffer_by_name(self, name):
return self.buffer_names[name]
def get_buffer_by_path(self, path):
for b in self.buffers:
if hasattr(b, 'path') and b.path == path:
return b
return None
def remove_buffer(self, b):
assert b in self.buffers, "buffer %s does not exist" % (b.name())
2007-06-04 03:29:37 -04:00
for i in range(0, len(self.slots)):
slot = self.slots[i]
if self.slots[i].window is not None and self.slots[i].window.buffer is b:
self.unset_slot(i)
2007-03-06 10:05:38 -05:00
self.buffers.remove(b)
del self.buffer_names[b.name()]
if b in self.hidden_buffers:
self.hidden_buffers.remove(b)
# query buffers
def is_buffer_hidden(self, b):
assert b in self.buffers, "buffer %s does not exist" % (b.name())
return b in self.hidden_buffers
2007-06-04 03:29:37 -04:00
# def is_buffer_visible(self, b):
# assert b in self.buffers, "buffer %s does not exist" % (b.name())
# for slot in self.slots:
# if slot.buffer is b:
# return True
# return False