From 2a10f029f0428337fd6a61a2569363e272f7743f Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Thu, 10 Nov 2022 17:54:38 -0600 Subject: [PATCH] Added basic toot viewing (untested yet) --- src/controller/buffers/mastodon/base.py | 2 +- src/controller/mastodon/messages.py | 42 +++++++++++ src/wxUI/dialogs/mastodon/tootDialogs.py | 93 ++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/wxUI/dialogs/mastodon/tootDialogs.py diff --git a/src/controller/buffers/mastodon/base.py b/src/controller/buffers/mastodon/base.py index 95ca0740..8c383a3e 100644 --- a/src/controller/buffers/mastodon/base.py +++ b/src/controller/buffers/mastodon/base.py @@ -458,7 +458,7 @@ class BaseBuffer(base.Buffer): def view_item(self): toot = self.get_item() print(toot) - pass + msg = messages.viewToot(toot, offset_hours=self.session.db["utc_offset"], item_url=self.get_item_url()) def ocr_image(self): toot = self.get_item() diff --git a/src/controller/mastodon/messages.py b/src/controller/mastodon/messages.py index 64ad44e0..07884feb 100644 --- a/src/controller/mastodon/messages.py +++ b/src/controller/mastodon/messages.py @@ -1,7 +1,10 @@ # -*- coding: utf-8 -*- import widgetUtils import config +import output from controller.twitter import messages +from sessions.mastodon import templates +from wxUI.dialogs.mastodon import tootDialogs class toot(messages.tweet): def __init__(self, max=500, *args, **kwargs): @@ -47,3 +50,42 @@ class reply(toot): if self.message.checkboxes[i].GetValue() == True: people = people + "{0} ".format(self.message.checkboxes[i].GetLabel(),) return people + +class viewToot(toot): + def __init__(self, toot, offset_hours=0, date="", item_url=""): + if toot.reblog != None: + toot = toot.reblog + author = toot.account.display_name if toot.account.display_name != "" else toot.account.username + title = _(u"Toot from {}").format(author) + image_description = templates.process_image_descriptions(toot.media_attachments) + text = templates.process_text(toot, safe=False) + date = templates.process_date(toot.created_at, relative_times=False, offset_hours=offset_hours) + boost_count = str(toot.reblogs_count) + favs_count = str(toot.favourites_count) + # Gets the client from where this toot was made. + source_obj = toot.get("application") + if source_obj == None: + source = _("Remote instance") + else: + source = source_obj.get("name") + self.message = tootDialogs.viewToot(text=text, boosts_count=boost_count, favs_count=favs_count, source=source, date=date) + self.message.SetTitle(title) + if image_description != "": + self.message.image_description.Enable(True) + self.message.image_description.ChangeValue(image_description) + widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) + if item_url != "": + self.message.enable_button("share") + widgetUtils.connect_event(self.message.share, widgetUtils.BUTTON_PRESSED, self.share) + self.item_url = item_url + widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) + self.message.ShowModal() + + # We won't need text_processor in this dialog, so let's avoid it. + def text_processor(self): + pass + + def share(self, *args, **kwargs): + if hasattr(self, "item_url"): + output.copy(self.item_url) + output.speak(_("Link copied to clipboard.")) \ No newline at end of file diff --git a/src/wxUI/dialogs/mastodon/tootDialogs.py b/src/wxUI/dialogs/mastodon/tootDialogs.py new file mode 100644 index 00000000..a4f73971 --- /dev/null +++ b/src/wxUI/dialogs/mastodon/tootDialogs.py @@ -0,0 +1,93 @@ +""" GUI dialogs for tweet writing and displaying. """ +import wx + +class viewToot(wx.Dialog): + def set_title(self, lenght): + self.SetTitle(_("Toot - %i characters ") % (lenght,)) + + def __init__(self, text="", boosts_count=0, favs_count=0, source="", date="", privacy="", *args, **kwargs): + super(viewToot, self).__init__(parent=None, id=wx.ID_ANY, size=(850,850)) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _("Toot")) + self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + self.text.SetFocus() + textBox = wx.BoxSizer(wx.HORIZONTAL) + textBox.Add(label, 0, wx.ALL, 5) + textBox.Add(self.text, 1, wx.EXPAND, 5) + mainBox = wx.BoxSizer(wx.VERTICAL) + mainBox.Add(textBox, 0, wx.ALL, 5) + label2 = wx.StaticText(panel, -1, _("Image description")) + self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + self.image_description.Enable(False) + iBox = wx.BoxSizer(wx.HORIZONTAL) + iBox.Add(label2, 0, wx.ALL, 5) + iBox.Add(self.image_description, 1, wx.EXPAND, 5) + mainBox.Add(iBox, 0, wx.ALL, 5) + privacyLabel = wx.StaticText(panel, -1, _("Privacy")) + privacy = wx.TextCtrl(panel, -1, privacy, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + privacyBox = wx.BoxSizer(wx.HORIZONTAL) + privacyBox.Add(privacyLabel, 0, wx.ALL, 5) + privacyBox.Add(privacy, 0, wx.ALL, 5) + boostsCountLabel = wx.StaticText(panel, -1, _(u"Boosts: ")) + boostsCount = wx.TextCtrl(panel, -1, str(boosts_count), size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + boostBox = wx.BoxSizer(wx.HORIZONTAL) + boostBox.Add(boostsCountLabel, 0, wx.ALL, 5) + boostBox.Add(boostsCount, 0, wx.ALL, 5) + favsCountLabel = wx.StaticText(panel, -1, _("Favorites: ")) + favsCount = wx.TextCtrl(panel, -1, str(favs_count), size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + favsBox = wx.BoxSizer(wx.HORIZONTAL) + favsBox.Add(favsCountLabel, 0, wx.ALL, 5) + favsBox.Add(favsCount, 0, wx.ALL, 5) + sourceLabel = wx.StaticText(panel, -1, _("Source: ")) + source = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + sourceBox = wx.BoxSizer(wx.HORIZONTAL) + sourceBox.Add(sourceLabel, 0, wx.ALL, 5) + sourceBox.Add(source, 0, wx.ALL, 5) + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(date, 0, wx.ALL, 5) + infoBox = wx.BoxSizer(wx.HORIZONTAL) + infoBox.Add(privacyBox, 0, wx.ALL, 5) + infoBox.Add(boostBox, 0, wx.ALL, 5) + infoBox.Add(favsBox, 0, wx.ALL, 5) + infoBox.Add(sourceBox, 0, wx.ALL, 5) + mainBox.Add(infoBox, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) + self.share = wx.Button(panel, wx.ID_ANY, _("Copy link to clipboard")) + self.share.Enable(False) + self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) + self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + buttonsBox.Add(self.share, 0, wx.ALL, 5) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) + buttonsBox.Add(cancelButton, 0, wx.ALL, 5) + mainBox.Add(buttonsBox, 0, wx.ALL, 5) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + panel.SetSizer(mainBox) + self.SetClientSize(mainBox.CalcMin()) + + def set_text(self, text): + self.text.ChangeValue(text) + + def get_text(self): + return self.text.GetValue() + + def text_focus(self): + self.text.SetFocus() + + def onSelect(self, ev): + self.text.SelectAll() + + def enable_button(self, buttonName): + if hasattr(self, buttonName): + return getattr(self, buttonName).Enable()