From 0f2353bfe009a79eeb863b433ce03169c270c832 Mon Sep 17 00:00:00 2001 From: Simon Vetter Date: Tue, 11 Sep 2012 01:04:20 +0200 Subject: [PATCH] User list --- cournal/mainwindow.glade | 103 +++++++++++++++++++++++++++++++-------- cournal/mainwindow.py | 35 +++++++++++++ cournal/network.py | 17 +++++++ cournal/server/server.py | 34 +++++++++++++ 4 files changed, 168 insertions(+), 21 deletions(-) diff --git a/cournal/mainwindow.glade b/cournal/mainwindow.glade index a4e35f4..ac79e0e 100644 --- a/cournal/mainwindow.glade +++ b/cournal/mainwindow.glade @@ -148,6 +148,29 @@ + + + False + True + False + _View + True + + + True + False + + + False + True + False + User list + + + + + + False @@ -367,27 +390,6 @@ 1 - - - True - - - True - True - always - in - - - - - - - - True - True - 2 - - True @@ -507,5 +509,64 @@ 3 + + + True + False + + + True + + + True + True + always + in + + + + + + + + True + True + 0 + + + + + 130 + True + True + userlist_store + + + + + + Users + + + + + False + True + 1 + + + + + True + True + 4 + + + + + + + + diff --git a/cournal/mainwindow.py b/cournal/mainwindow.py index c9a1c0f..02fef19 100644 --- a/cournal/mainwindow.py +++ b/cournal/mainwindow.py @@ -82,6 +82,7 @@ def __init__(self, **args): self.menu_import_xoj = builder.get_object("imagemenuitem_import_xoj") self.menu_quit = builder.get_object("imagemenuitem_quit") self.menu_about = builder.get_object("imagemenuitem_about") + self.menu_user_list = builder.get_object("imagemenuitem_userlist") # Toolbar: self.tool_open_pdf = builder.get_object("tool_open_pdf") @@ -119,6 +120,7 @@ def __init__(self, **args): self.menu_import_xoj.connect("activate", self.run_import_xoj_dialog) self.menu_quit.connect("activate", lambda _: self.destroy()) self.menu_about.connect("activate", self.run_about_dialog) + self.menu_user_list.connect("toggled", self.toggle_user_list) self.tool_open_pdf.connect("clicked", self.run_open_pdf_dialog) self.tool_save.connect("clicked", self.save) self.tool_connect.connect("clicked", self.run_connection_dialog) @@ -143,6 +145,39 @@ def __init__(self, **args): self.button_prev_page.connect("clicked", self.jump_to_prev_page) self.button_next_page.connect("clicked", self.jump_to_next_page) + # User list: + self.userlist_tree_view = builder.get_object("userlist_tree_view") + self.userlist_store = builder.get_object("userlist_store") + self.treeview_user_column = builder.get_object("treeview_user_column") + + self.cell = Gtk.CellRendererText() + self.treeview_user_column.pack_start(self.cell, True) + self.treeview_user_column.add_attribute(self.cell, "text", 0) + self.userlist_store.set_sort_column_id(0, Gtk.SortType.ASCENDING) + + def toggle_user_list(self, menuitem): + """ + Toggle user lists visibility + + Positional arguments: + menuitem -- triggeing menu item + """ + if menuitem.get_active(): + self.userlist_tree_view.set_visible(True) + else: + self.userlist_tree_view.set_visible(False) + + def got_user_list(self, users): + """ + Received user list from sever + + Positional arguments: + users -- user list + """ + self.userlist_store.clear() + for i in users: + self.userlist_store.append(None, [i]) + def connect_event(self): """ Called by the networking layer when a connection is established. diff --git a/cournal/network.py b/cournal/network.py index fc30a0c..bd2db38 100644 --- a/cournal/network.py +++ b/cournal/network.py @@ -156,6 +156,23 @@ def get_document_list(self): d.addErrback(self.disconnect) return d + def get_user_list(self): + """ + Request user list from server + """ + if self.is_connected: + d = self.server_document.callRemote("list_users") + return d + + def remote_user_list(self, users): + """ + User list request resonse + + Positional arguments: + users -- user list + """ + self.window.got_user_list(users) + def join_document_session(self, documentname): """ Joins a "document editing session". This means, that we will automatically diff --git a/cournal/server/server.py b/cournal/server/server.py index 54984b3..d3d794b 100755 --- a/cournal/server/server.py +++ b/cournal/server/server.py @@ -283,6 +283,15 @@ def perspective_list_documents(self): debug(2, _("User {} requested document list").format(self.name)) return list(self.server.documents.keys()) + + def perspective_list_users(self, document): + """ + Return a list of all our documents. + """ + debug(2, _("User {} requested user list for {}").format(self.name), document) + + return list(self.server.documents.keys()) + def perspective_join_document(self, documentname): """ @@ -343,6 +352,7 @@ def add_user(self, user): for pagenum in range(len(self.pages)): for stroke in self.pages[pagenum].strokes: user.call_remote("new_stroke", pagenum, stroke) + self.broadcast_user_list() def remove_user(self, user): """ @@ -352,6 +362,7 @@ def remove_user(self, user): user -- The concerning User object. """ self.users.remove(user) + self.broadcast_user_list() def broadcast(self, method, *args, except_user=None): """ @@ -368,6 +379,29 @@ def broadcast(self, method, *args, except_user=None): if user != except_user: user.call_remote(method, *args) + def broadcast_user_list(self): + """ + Broadcast user list to all clients. + """ + user_names = [] + for u in self.users: + user_names.append(u.name) + for u in self.users: + u.call_remote("user_list", user_names) + + def view_list_users(self, from_user): + """ + Send user name list to clients + + Positional arguments: + from_user -- user that sent the request + """ + user_names = [] + for u in self.users: + user_names.append(u.name) + #from_user.call_remote("user_list", user_names) + return user_names + def view_new_stroke(self, from_user, pagenum, stroke): """ Broadcast the stroke received from one to all other clients.