diff --git a/application.py b/application.py index 9fff1f3..e715aff 100755 --- a/application.py +++ b/application.py @@ -625,8 +625,8 @@ class Application(object): self.highlight_chars(slot.y_offset + count, px-x + w.mode.lmargin, p2.x-x, fg, bg) break else: - self.highlight_chars(slot.y_offset + count, px-x + w.mode.lmargin, slot.width, fg, bg) - px += slot.width - px + x + self.highlight_chars(slot.y_offset + count, px-x + w.mode.lmargin, slot.width - 1, fg, bg) + px += slot.width - px + x - 1 if x + slot.width >= len(w.buffer.lines[y]): x = 0 y += 1 diff --git a/bufferlist.py b/bufferlist.py index 239e00f..9857117 100644 --- a/bufferlist.py +++ b/bufferlist.py @@ -27,6 +27,7 @@ class Slot(object): return None class VSlot(Slot): + size = 0 slots = [] heights = [] def __init__(self, height, width, y_offset=0, x_offset=0): @@ -45,24 +46,67 @@ class VSlot(Slot): self.y_offset = y_offset self.x_offset = x_offset percs = self.get_percs() - heights = [int(self.height * p) for p in percs] - assert sum(heights) <= self.height + self.heights = [int(self.height * p) for p in percs] + assert sum(self.heights) <= self.height i = 0 - while sum(heights) < self.height: - heights[i] += 1 + while sum(self.heights) < self.height: + self.heights[i] += 1 i = (i + 1) % self.height self.window.set_size(self.width, self.height) total = 0 - for i in range(0, heights): + for i in range(0, self.size): if self.slots[i] is not None: - (slot, height) = (self.slots[i], heights[i]) + (slot, height) = (self.slots[i], self.heights[i]) slot.resize(height, width, y_offset + total, x_offset) total += height - def set(self, w): + + def add_slot(self): + self.size += 1 + self.slots.append(Slot(self.height, self.width, 0)) + self.heights.append(0) + self.fit_slots() + 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() + 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) + + 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()) + slot = self.slots[i] + self.unset_slot(i) + + if b in self.hidden_buffers: + self.hidden_buffers.remove(b) + if self.is_window_visible(b.windows[0]): + app = b.windows[0].application + w = window.Window(b, app, height=slot.height, width=slot.width) + else: + w = b.windows[0] + slot.set(w) + + def remove_slot(self, i): + assert i > -1 and i < len(self.slots), "slot %d does not exist" % i + self.unset_slot(i) + del self.slots[i] + self.fit_slots() + + + + def set(self, i, w): self.window = w self.resize(self.height, self.width, self.y_offset, self.x_offset) w.set_size(self.width, self.height) - def unset(self): + def unset(self, i): if not self.is_empty(): old_w = self.window self.window = None