Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services/console/lib/purk/windows.py
diff options
context:
space:
mode:
Diffstat (limited to 'services/console/lib/purk/windows.py')
-rw-r--r--services/console/lib/purk/windows.py298
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()