diff options
Diffstat (limited to 'services/console/lib/purk/windows.py')
-rw-r--r-- | services/console/lib/purk/windows.py | 298 |
1 files changed, 298 insertions, 0 deletions
diff --git a/services/console/lib/purk/windows.py b/services/console/lib/purk/windows.py new file mode 100644 index 0000000..22c783a --- /dev/null +++ b/services/console/lib/purk/windows.py @@ -0,0 +1,298 @@ +import gtk + +import irc +from conf import conf +import widgets + +#manager = widgets.UrkUITabs() + +def append(window, manager): + manager.add(window) + +def remove(window, manager): + manager.remove(window) + + # i don't want to have to call this + window.destroy() + +def new(wclass, network, id, core): + if network is None: + network = irc.dummy_network + + w = get(wclass, network, id, core) + if not w: + w = wclass(network, id, core) + append(w, core.manager) + + return w + +def get(windowclass, network, id, core): + if network: + id = network.norm_case(id) + + for w in core.manager: + if (type(w), w.network, w.id) == (windowclass, network, id): + return w + +def get_with(manager, wclass=None, network=None, id=None): + if network and id: + id = network.norm_case(id) + + for w in list(manager): + for to_find, found in ((wclass, type(w)), (network, w.network), (id, w.id)): + # to_find might be False but not None (if it's a DummyNetwork) + if to_find is not None and to_find != found: + break + else: + yield w + +def get_default(network, manager): + + window = manager.get_active() + if window.network == network: + return window + + # There can be only one... + for window in get_with(network=network): + return window + +class Window(gtk.VBox): + need_vbox_init = True + + def mutate(self, newclass, network, id): + isactive = self == manager.get_active() + self.hide() + + for child in self.get_children(): + self.remove(child) + + self.__class__ = newclass + self.__init__(network, id) + self.update() + if isactive: + self.activate() + + def transfer_text(self, _widget, event): + if event.string and not self.input.is_focus(): + self.input.grab_focus() + self.input.set_position(-1) + self.input.event(event) + + def write(self, text, activity_type=widgets.EVENT, line_ending='\n', fg=None): + if self.manager.get_active() != self: + self.activity = activity_type + self.output.write(text, line_ending, fg) + + def get_id(self): + if self.network: + return self.network.norm_case(self.rawid) + else: + return self.rawid + + def set_id(self, id): + self.rawid = id + self.update() + + id = property(get_id, set_id) + + def get_toplevel_title(self): + return self.rawid + + def get_title(self): + return self.rawid + + def get_activity(self): + return self.__activity + + def set_activity(self, value): + if value: + self.__activity.add(value) + else: + self.__activity = set() + self.update() + + activity = property(get_activity, set_activity) + + def focus(self): + pass + + def activate(self): + self.manager.set_active(self) + self.focus() + + def close(self): + self.events.trigger("Close", window=self) + remove(self, self.manager) + + def update(self): + self.manager.update(self) + + def __init__(self, network, id, core): + self.manager = core.manager + self.events = core.events + + if self.need_vbox_init: + #make sure we don't call this an extra time when mutating + gtk.VBox.__init__(self, False) + self.need_vbox_init = False + + if hasattr(self, "buffer"): + self.output = widgets.TextOutput(core, self, self.buffer) + else: + self.output = widgets.TextOutput(core, self) + self.buffer = self.output.get_buffer() + + if hasattr(self, "input"): + if self.input.parent: + self.input.parent.remove(self.input) + else: + self.input = widgets.TextInput(self, core) + + self.network = network + self.rawid = id + + self.__activity = set() + +class SimpleWindow(Window): + def __init__(self, network, id, core): + Window.__init__(self, network, id) + + self.focus = self.input.grab_focus + self.connect("key-press-event", self.transfer_text) + + self.pack_end(self.input, expand=False) + + topbox = gtk.ScrolledWindow() + topbox.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + topbox.add(self.output) + + self.pack_end(topbox) + + self.show_all() + +class StatusWindow(Window): + def get_toplevel_title(self): + return '%s - %s' % (self.network.me, self.get_title()) + + def get_title(self): + # Something about self.network.isupport + if self.network.status: + return "%s" % self.network.server + else: + return "[%s]" % self.network.server + + def __init__(self, network, id, core): + Window.__init__(self, network, id, core) + + self.nick_label = widgets.NickEditor(self, core) + + self.focus = self.input.grab_focus + self.connect("key-press-event", self.transfer_text) + self.manager = core.manager + botbox = gtk.HBox() + botbox.pack_start(self.input) + botbox.pack_end(self.nick_label, expand=False) + + self.pack_end(botbox, expand=False) + + topbox = gtk.ScrolledWindow() + topbox.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + topbox.add(self.output) + + self.pack_end(topbox) + + self.show_all() + +class QueryWindow(Window): + def __init__(self, network, id, core): + Window.__init__(self, network, id, core) + + self.nick_label = widgets.NickEditor(self, core) + + self.focus = self.input.grab_focus + self.connect("key-press-event", self.transfer_text) + + botbox = gtk.HBox() + botbox.pack_start(self.input) + botbox.pack_end(self.nick_label, expand=False) + + self.pack_end(botbox, expand=False) + + topbox = gtk.ScrolledWindow() + topbox.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + topbox.add(self.output) + + self.pack_end(topbox) + + self.show_all() + +def move_nicklist(paned, event): + paned._moving = ( + event.type == gtk.gdk._2BUTTON_PRESS, + paned.get_position() + ) + +def drop_nicklist(paned, event): + width = paned.allocation.width + pos = paned.get_position() + + double_click, nicklist_pos = paned._moving + + if double_click: + # if we're "hidden", then we want to unhide + if width - pos <= 10: + # get the normal nicklist width + conf_nicklist = conf.get("ui-gtk/nicklist-width", 200) + + # if the normal nicklist width is "hidden", then ignore it + if conf_nicklist <= 10: + paned.set_position(width - 200) + else: + paned.set_position(width - conf_nicklist) + + # else we hide + else: + paned.set_position(width) + + else: + if pos != nicklist_pos: + conf["ui-gtk/nicklist-width"] = width - pos - 6 + +class ChannelWindow(Window): + def __init__(self, network, id, core): + Window.__init__(self, network, id, core) + + self.nicklist = widgets.Nicklist(self, core) + self.nick_label = widgets.NickEditor(self, core) + + self.focus = self.input.grab_focus + self.connect("key-press-event", self.transfer_text) + + topbox = gtk.ScrolledWindow() + topbox.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + topbox.add(self.output) + + nlbox = gtk.ScrolledWindow() + nlbox.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + nlbox.add(self.nicklist) + + nlbox.set_size_request(conf.get("ui-gtk/nicklist-width", 112), -1) + + botbox = gtk.HBox() + botbox.pack_start(self.input) + botbox.pack_end(self.nick_label, expand=False) + + self.pack_end(botbox, expand=False) + + pane = gtk.HPaned() + pane.pack1(topbox, resize=True, shrink=False) + pane.pack2(nlbox, resize=False, shrink=True) + + self.nicklist.pos = None + + pane.connect("button-press-event", move_nicklist) + pane.connect("button-release-event", drop_nicklist) + + self.pack_end(pane) + + self.show_all() |