コード例 #1
0
ファイル: elMail.py プロジェクト: gitter-badger/elMail
class eMail:
    ver = "0.4b"
    win_title = "eMail v%s" % ver
    mode = ""

    def _message(self, msg="", timeout=5):
        def inwin_close(*args, **kwarks):
            self.innerWin.hide()
            self.innerWinAnchor.hide()

        inwin_close()
        if not msg:
            return
        self.innerWin.content_set(self.innerWinAnchor)
        self.innerWinAnchor.text_set(self.__to_html(msg))
        self.innerWin.activate()
        if timeout != -1:
            ecore.timer_add(timeout, inwin_close)

    def composeNew(self, *args, **kwargs):
        _to = kwargs.get("_to", _("*****@*****.**"))
        _subject = kwargs.get("_subject", _("Subject!"))

        def _send(*args, **kwargs):
            self.backend.send(to_entry.entry_get(), subject_entry.entry_get(), text_entry.entry_get())
            inwin_close()

        def inwin_close(*args, **kwargs):
            innerWin.hide()

        innerWin = elementary.InnerWindow(self.win)
        innerMainBox = elementary.Box(innerWin)
        innerMainBox.size_hint_weight_set(1.0, 1.0)
        innerMainBox.size_hint_align_set(-1.0, -1.0)
        innerBox = elementary.Box(innerWin)

        def select_all(*args, **kwargs):
            args[0].select_all()

        to_entry = elementary.Entry(innerWin)
        to_entry.on_mouse_down_add(select_all)
        to_entry.single_line_set(True)
        to_entry.entry_set(_to)
        to_entry.show()
        subject_entry = elementary.Entry(innerWin)
        subject_entry.on_mouse_down_add(select_all)
        subject_entry.single_line_set(True)
        subject_entry.entry_set(_subject)
        subject_entry.show()
        text_entry = elementary.Entry(innerWin)
        text_entry.on_mouse_down_add(select_all)
        text_entry.entry_set(_("Insert here the email's text"))
        text_entry.show()
        innerBox.pack_end(to_entry)
        innerBox.pack_end(subject_entry)
        innerBox.pack_end(text_entry)

        innerBox.size_hint_weight_set(1.0, 1.0)
        innerBox.size_hint_align_set(-1.0, -1.0)
        btns = elementary.Box(innerWin)
        btns.horizontal_set(True)
        btns.size_hint_align_set(-1.0, -1.0)
        send_btn = elementary.Button(innerWin)
        send_btn._callback_add("clicked", _send)
        send_btn.size_hint_weight_set(1.0, 1.0)
        send_btn.size_hint_align_set(-1.0, -1.0)
        send_btn.label_set(_("Send"))
        close_btn = elementary.Button(innerWin)
        close_btn._callback_add("clicked", inwin_close)
        close_btn.size_hint_weight_set(1.0, 1.0)
        close_btn.size_hint_align_set(-1.0, -1.0)
        close_btn.label_set(_("Close"))
        btns.pack_end(send_btn)
        btns.pack_end(close_btn)
        innerMainBox.pack_end(innerBox)
        innerMainBox.pack_end(btns)
        innerWin.content_set(innerMainBox)
        innerMainBox.show()
        innerBox.show()
        send_btn.show()
        close_btn.show()
        btns.show()
        innerWin.activate()

    def __init__(self):
        self.backend = Backend()

    def __to_html(self, msg):
        msg = msg.replace("\n", "<br>")
        msg = msg.replace("\r", "")
        msg = msg.replace("<br/>", "<br>")
        return msg

    def _change_mode(self, mode, *args, **kwargs):
        if self.mode == mode:
            return
        self.mode = mode
        self._mainList_populate()

    def _show_messages(self, email_list, *args, **kwargs):
        innerWin = elementary.InnerWindow(self.win)
        innerMainBox = elementary.Box(innerWin)
        innerMainBox.size_hint_weight_set(1.0, 1.0)
        innerMainBox.size_hint_align_set(-1.0, -1.0)
        innerScroller = elementary.Scroller(innerWin)
        innerScroller.bounce_set(0, 1)
        innerScroller.size_hint_weight_set(1.0, 1.0)
        innerScroller.size_hint_align_set(-1.0, -1.0)
        innerBox = elementary.Box(innerWin)
        innerBox.size_hint_weight_set(1.0, 1.0)
        innerBox.size_hint_align_set(-1.0, -1.0)
        for i in email_list:
            msg = self.backend._get_message(i)
            b = elementary.Bubble(innerBox)
            b.size_hint_weight_set(1.0, 0.0)
            b.size_hint_align_set(-1.0, -1.0)
            mittente = msg["from"] if not msg["from"].find("<") else msg["from"][: msg["from"].find("<")]
            b.label_set("%s [%s]" % (mittente, msg["short_date"]))
            text = elementary.AnchorBlock(self.innerWin)
            text.text_set(self.__to_html(msg["text"]))
            text.size_hint_weight_set(1.0, 0.0)
            text.size_hint_align_set(-1.0, -1.0)
            b.content_set(text)
            b.show()
            innerBox.pack_end(b)
        innerScroller.content_set(innerBox)
        innerScroller.show()
        innerBox.show()
        innerMainBox.pack_end(innerScroller)
        btns_box = elementary.Box(innerWin)
        btns_box.horizontal_set(True)
        btns_box.homogenous_set(True)
        btns_box.size_hint_align_set(-1.0, -1.0)
        cls_btn = elementary.Button(innerWin)

        def inwin_close(*args, **kwarks):
            innerWin.hide()

        cls_btn.size_hint_weight_set(1.0, 1.0)
        cls_btn.size_hint_align_set(-1.0, -1.0)
        cls_btn.label_set(_("Close"))
        cls_btn._callback_add("clicked", inwin_close)
        cls_btn.show()
        reply_btn = elementary.Button(innerWin)

        def reply(*args, **kwarks):
            inwin_close()
            _from = msg["from"]
            _from = _from if not _from.find("<") else _from[_from.find("<") + 1 : -1]
            _subject = msg["subject"]
            self.composeNew(_to=_from, _subject="Re: %s" % _subject)

        reply_btn.size_hint_weight_set(1.0, 1.0)
        reply_btn.size_hint_align_set(-1.0, -1.0)
        reply_btn.label_set("Rispondi")
        reply_btn._callback_add("clicked", reply)
        reply_btn.show()
        btns_box.pack_end(reply_btn)
        btns_box.pack_end(cls_btn)
        btns_box.show()
        innerMainBox.pack_end(btns_box)
        innerMainBox.show()
        innerWin.content_set(innerMainBox)
        innerWin.activate()

    def _mainList_populate(self):
        filter = self.mode
        self.mainList.clear()
        if filter == "author":
            messages = self.backend._get_list(order_by="author")
            authors = messages.keys()
            authors.sort()
            for author in authors:
                email_list = []
                for message in messages[author]:
                    email_list.append(message["id"])
                self.mainList.item_append(author, None, None, partial(self._show_messages, email_list))
        elif filter == "thread":
            messages = self.backend._get_list(order_by="thread")
            threads = messages.keys()
            threads.sort()
            for thread in threads:
                email_list = []
                for message in messages[thread]:
                    email_list.append(message["id"])
                self.mainList.item_append(thread, None, None, partial(self._show_messages, email_list))
        else:
            for message in self.backend._get_list(order_by=""):
                self.mainList.item_append(
                    "[%s] %s" % (message["from"], message["subject"]),
                    None,
                    None,
                    partial(self._show_messages, (message["id"],)),
                )
        self.mainList.go()

    def sync(self, *args, **kwargs):
        self._message(_("Checking your inbox for new emails.."))
        ecore.timer_add(0.1, self.sync_init)

    def sync_init(self, *args, **kawargs):
        self.backend.sync_stepbystep_init()
        if self.backend.syncronizing:
            self.sync_nextstep()
        self._message()

    def sync_nextstep(self, *args, **kwargs):
        if self.backend.syncronizing:
            status = self.backend.sync_next()
            self._message(
                "%s<br><br><br>%s <a href=''>%s</a> %s <a href=''>%s</a>"
                % (_("Sync"), _("Emails retrieved:"), status[0], _("of"), status[1])
            )
            ecore.timer_add(0.1, self.sync_nextstep)
        else:
            self._mainList_populate()
            self._message()

    def quit(self, obj, event, data):
        elementary.exit()

    def initUi(self):
        self.win = elementary.Window(self.win_title, elementary.ELM_WIN_BASIC)
        self.win.title_set(self.win_title)
        self.win.callback_destroy_add(self.quit, None, None)
        ##
        self.innerWin = elementary.InnerWindow(self.win)
        self.innerWin.size_hint_weight_set(1.0, 1.0)
        self.innerWin.size_hint_align_set(-1.0, -1.0)
        self.innerWinAnchor = elementary.AnchorView(self.innerWin)
        ##
        self.bg = elementary.Background(self.win)
        self.bg.size_hint_weight_set(1.0, 1.0)
        ##
        self.mainBox = elementary.Box(self.win)
        self.mainBox.size_hint_weight_set(1.0, 1.0)
        ##
        self.mainFrame = elementary.Frame(self.win)
        self.mainFrame.size_hint_weight_set(1.0, 1.0)
        self.mainFrame.size_hint_align_set(-1.0, -1.0)
        self.mainFrame.label_set(self.win_title)
        ##
        self.mainList = elementary.List(self.win)
        self.mainList.size_hint_weight_set(1.0, 1.0)
        self.mainList.size_hint_align_set(-1.0, -1.0)
        self._mainList_populate()
        ##
        self.filterSelector = elementary.Hoversel(self.win)
        self.filterSelector.label_set(_("Show emails ordered by"))
        self.filterSelector.hover_parent_set(self.win)
        self.filterSelector.size_hint_weight_set(1.0, -1.0)
        self.filterSelector.size_hint_align_set(-1.0, -1.0)
        self.filterSelector.item_add(_("ordered by date"), "", elementary.ELM_ICON_NONE, partial(self._change_mode, ""))
        self.filterSelector.item_add(
            _("grouped by author"), "", elementary.ELM_ICON_NONE, partial(self._change_mode, "author")
        )
        self.filterSelector.item_add(
            _("grouped by thread"), "", elementary.ELM_ICON_NONE, partial(self._change_mode, "thread")
        )
        ##
        self.frameBox = elementary.Box(self.win)
        self.frameBox.size_hint_weight_set(1.0, 1.0)
        self.frameBox.pack_end(self.filterSelector)
        self.frameBox.pack_end(self.mainList)
        ##
        self.newButton = elementary.Button(self.win)
        self.newButton.label_set(_("New"))
        self.newButton._callback_add("clicked", self.composeNew)
        self.newButton.size_hint_weight_set(1.0, 1.0)
        self.newButton.size_hint_align_set(-1.0, -1.0)
        self.syncButton = elementary.Button(self.win)
        self.syncButton.label_set(_("Sync Inbox"))
        self.syncButton._callback_add("clicked", self.sync)
        self.syncButton.size_hint_weight_set(1.0, 1.0)
        self.syncButton.size_hint_align_set(-1.0, -1.0)
        self.actionsBox = elementary.Box(self.win)
        self.actionsBox.horizontal_set(True)
        self.actionsBox.homogenous_set(True)
        # self.actionsBox.size_hint_weight_set(1.0, 1.0)
        self.actionsBox.size_hint_align_set(-1.0, -1.0)
        self.actionsBox.pack_end(self.newButton)
        self.actionsBox.pack_end(self.syncButton)
        ##
        self.mainFrame.content_set(self.frameBox)
        self.mainBox.pack_end(self.mainFrame)
        self.mainBox.pack_end(self.actionsBox)
        self.win.resize_object_add(self.bg)
        self.win.resize_object_add(self.mainBox)
        self.win.resize_object_add(self.innerWin)
        ##
        self.bg.show()
        self.mainBox.show()
        self.mainFrame.show()
        self.frameBox.show()
        self.filterSelector.show()
        self.mainList.show()
        self.actionsBox.show()
        self.newButton.show()
        self.syncButton.show()
        self.win.show()