Ejemplo n.º 1
0
    def __init__(self, gui):
        global community, msgboard, chat

        GUI_Page.__init__(self, 'Messageboard')
        community = get_plugin_by_type(PLUGIN_TYPE_COMMUNITY)
        chat = get_plugin_by_type(PLUGIN_TYPE_MESSAGING)
        msgboard = get_plugin_by_type(PLUGIN_TYPE_MESSAGE_BOARD)

        self.notify = get_plugin_by_type(PLUGIN_TYPE_NOTIFICATION).notify

        self.main_gui = gui

        # Store Message_Page instances, key = sharemeta of the message
        self.message_pages = {}

        messageboard_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.MSGBOARD_ICON))

        community.community_gui.register_user_event(messageboard_icon, 'Msg board', self.start_messageboard_cb)
        community.community_gui.register_com_event(messageboard_icon, 'Msg board', self.start_messageboard_cb)

        self.message_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.MESSAGE_ICON))

        self.in_search_mode = False
        self.store = None
        self.search_store = None
        self.target = None

        # create widgets here
        self.create_action_list()
        self.message_list, self.message_view = self.create_message_list()

        self.search_hbox = gtk.HBox()
        self.search_entry = new_entry('Enter search keywords')
        self.search_entry.connect('activate', self.search_activate_cb)
        self.search_close = gtk.Button(stock=gtk.STOCK_CLOSE)
        self.search_close.connect('clicked', self.search_close_cb)
        self.search_now = gtk.Button(stock=gtk.STOCK_FIND)
        self.search_now.connect('clicked', self.search_now_cb)
        self.search_hbox.pack_start(self.search_entry, True, True)
        self.search_hbox.pack_start(self.search_close, False, True)
        self.search_hbox.pack_start(self.search_now, False, True)

        self.vbox = gtk.VBox()
        self.vbox.pack_start(self.message_list, True, True)
        self.vbox.pack_start(self.search_hbox, False, True)

        self.pack_start(self.vbox, True, True)
        self.pack_start(self.actions.get_widget(), False, True)

        self.show_all()
        self.search_hbox.hide()
        gui.add_page(self)

        gui.add_key_binding(gtk.gdk.CONTROL_MASK, gtk.keysyms.m, self.key_pressed_ctrl_m)

        msgboard.register_ui(self)

        self.watch_dialog = Watches_GUI(self.main_gui, msgboard.get_state, msgboard.modify_state)
Ejemplo n.º 2
0
class Messageboard_GUI(GUI_Page):

    MSGBOARD_ICON = '64px-msgboard_icon.png'
    MESSAGE_ICON = '64px-messaging_status_icon.png'
    REFRESH_ICON = '64px-refresh_icon.png'
    SEARCH_ICON = '64px-search_icon.png'
    NEW_MESSAGE_ICON = '64px-msgboard_icon.png'

    def __init__(self, gui):
        global community, msgboard, chat

        GUI_Page.__init__(self, 'Messageboard')
        community = get_plugin_by_type(PLUGIN_TYPE_COMMUNITY)
        chat = get_plugin_by_type(PLUGIN_TYPE_MESSAGING)
        msgboard = get_plugin_by_type(PLUGIN_TYPE_MESSAGE_BOARD)

        self.notify = get_plugin_by_type(PLUGIN_TYPE_NOTIFICATION).notify

        self.main_gui = gui

        # Store Message_Page instances, key = sharemeta of the message
        self.message_pages = {}

        messageboard_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.MSGBOARD_ICON))

        community.community_gui.register_user_event(messageboard_icon, 'Msg board', self.start_messageboard_cb)
        community.community_gui.register_com_event(messageboard_icon, 'Msg board', self.start_messageboard_cb)

        self.message_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.MESSAGE_ICON))

        self.in_search_mode = False
        self.store = None
        self.search_store = None
        self.target = None

        # create widgets here
        self.create_action_list()
        self.message_list, self.message_view = self.create_message_list()

        self.search_hbox = gtk.HBox()
        self.search_entry = new_entry('Enter search keywords')
        self.search_entry.connect('activate', self.search_activate_cb)
        self.search_close = gtk.Button(stock=gtk.STOCK_CLOSE)
        self.search_close.connect('clicked', self.search_close_cb)
        self.search_now = gtk.Button(stock=gtk.STOCK_FIND)
        self.search_now.connect('clicked', self.search_now_cb)
        self.search_hbox.pack_start(self.search_entry, True, True)
        self.search_hbox.pack_start(self.search_close, False, True)
        self.search_hbox.pack_start(self.search_now, False, True)

        self.vbox = gtk.VBox()
        self.vbox.pack_start(self.message_list, True, True)
        self.vbox.pack_start(self.search_hbox, False, True)

        self.pack_start(self.vbox, True, True)
        self.pack_start(self.actions.get_widget(), False, True)

        self.show_all()
        self.search_hbox.hide()
        gui.add_page(self)

        gui.add_key_binding(gtk.gdk.CONTROL_MASK, gtk.keysyms.m, self.key_pressed_ctrl_m)

        msgboard.register_ui(self)

        self.watch_dialog = Watches_GUI(self.main_gui, msgboard.get_state, msgboard.modify_state)

    def append_messages_to_store(self, store, metas):
        # Display hot messages first
        hot = []
        normal = []
        for meta in metas:
            if msgboard.is_hot(meta):
                hot.append((True, meta))
            else:
                normal.append((False, meta))

        for l in hot, normal:
            for (ishot, meta) in l:
                user = None
                uid = meta.get('src')
                if uid != None:
                    user = community.get_user(uid)
                if user == community.get_myself():
                    sender = 'Myself'
                elif user != None:
                    sender = pango_escape(user.tag())
                else:
                    sender = pango_escape(meta.get('from'))
                timestamp = msgtime(meta)
                subject = pango_escape(meta.get('subject'))
                if ishot:
                    line = '%s <span foreground="gray"><small>%s</small></span>\n<span foreground="red">[HOT] </span><b>%s</b>' % (sender, timestamp, subject)
                else:
                    line = '%s <span foreground="gray"><small>%s</small></span>\n<b>%s</b>' % (sender, timestamp, subject)
                icon = self.message_icon
                if user != None:
                    icon = get_user_profile_picture(user).scale_simple(64, 64, gtk.gdk.INTERP_BILINEAR)
                store.append([icon, line, meta])

    def key_pressed_ctrl_m(self, target, ctx):
        self.start_messageboard_cb(target)

    def create_action_list(self):
        new_message_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.NEW_MESSAGE_ICON))
        refresh_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.REFRESH_ICON))
        search_icon = gtk.gdk.pixbuf_new_from_file(join(get_dir(ICON_DIR), self.SEARCH_ICON))

        action_buttons = [(new_message_icon, 'Compose', self.create_new_cb),
                          (refresh_icon, 'Refresh / All\nMessages', self.refresh_cb),
                          (new_message_icon, 'My\nMessages', self.my_messages_cb),
                          (search_icon, 'Search', self.search_cb),
                          (search_icon, 'Watches', self.watches_cb),
                         ]

        self.actions = Action_List()

        for action in action_buttons:
            (icon, text, cb) = action
            self.actions.add_button(icon, text, cb)

    def watches_cb(self, widget):
        self.watch_dialog.show()

    def create_message_list(self):
        message_list = new_scrollarea()
        message_view = gtk.TreeView()
        message_view.set_headers_visible(False)

        cr1 = gtk.CellRendererPixbuf()
        cr2 = gtk.CellRendererText()

        col1 = gtk.TreeViewColumn('Message')
        col1.pack_start(cr1, False)        
        col1.pack_start(cr2, True)

        message_view.append_column(col1)
        col1.add_attribute(cr1, 'pixbuf', 0)
        col1.add_attribute(cr2, 'markup', 1)

        message_view.connect('row-activated', self.row_activated_cb)

        message_list.add(message_view)

        return message_list, message_view

    def create_new_cb(self, widget):
        # HACK: first try Hildon StackableWindow-style
        try:
            composer = Message_Composer(self)
        except:
            composer = Message_Composer(self.main_gui.get_main_window())
        composer.show_all()
        response = composer.run()
        
        if response == 1:
            sender = community.get_myself().tag()            
            subject = composer.get_subject()
            text = composer.get_text()
            cname = None
            if self.target != None:
                cname = self.target.get('name')
            self.publish_message(sender, subject, text, cname)

        composer.destroy()

    def refresh_cb(self, widget, showmine=False):
        if self.in_search_mode:
            self.search_close_cb(None)
        msgboard.query_messages(showmine=showmine, target=self.target)

    def my_messages_cb(self, widget):
        self.refresh_cb(widget, showmine=True)

    def search_cb(self, widget):
        self.in_search_mode = True
        self.search_hbox.show()
        self.search_entry.grab_focus()
        if self.search_store:
            self.message_view.set_model(self.search_store)

    def search_close_cb(self, widget):
        self.in_search_mode = False
        self.search_hbox.hide()
        if self.store:
            self.message_view.set_model(self.store)

    def search_now_cb(self, widget):
        self.search_activate_cb(self.search_entry)

    def search_activate_cb(self, entry):
        self.search_store = gtk.ListStore(gtk.gdk.Pixbuf, str, object)
        self.message_view.set_model(self.search_store)
        text = entry.get_text().strip()
        keywords = text.split(',')
        criteria = None
        if self.target != None:
            criteria = {'community': self.target.get('name')}
        msgboard.search(self.got_query_results, criteria=criteria, keywords=keywords)
        if len(text) > 0:
            msg = 'Searching for %s' % text
        else:
            msg = 'Searching for all messages'
        self.notify(msg, delay=500)

    def got_query_results(self, user, metas, ctx):
        self.append_messages_to_store(self.search_store, metas)

    def row_activated_cb(self, treeview, path, view_column):
        store = treeview.get_model()
        row_iter = store.get_iter(path)
        meta = store.get(row_iter, 2)[0]
        self.view_message(meta)

    def view_message(self, msg):
        page = self.message_pages.get(msg)
        if page == None:
            page = Message_Page(self, msg)
            self.message_pages[msg] = page
        self.main_gui.show_page(page)

    def start_messageboard_cb(self, target):
        if not isinstance(target, Community):
            target = None
        if target == community.get_default_community():
            target = None
        self.target = target
        msgboard.query_messages(target=self.target)
        subtitle = None
        if self.target != None:
            subtitle = target.get('name')
        self.set_page_title(subtitle, sub=True)
        self.main_gui.show_page(self)

    def update_message_list(self, metas):
        self.store = gtk.ListStore(gtk.gdk.Pixbuf, str, object)

        self.append_messages_to_store(self.store, metas)

        if not self.in_search_mode:
            self.message_view.set_model(self.store)

    def message_deleted_cb(self, meta):
        store = self.store
        if store == None:
            return

        for row in store:
            if row[2] == meta:
                store.remove(row.iter)

    def publish_message(self, sender, subject, msg, cname=None):
        d = {'from': sender,
             'subject': subject,
             'msg': msg,
             'timestart': int(time()),
            }
        if cname != None:
            d['community'] = cname
        msgboard.publish(d)
        self.refresh_cb(None)