diff --git a/src/controller/buffersController.py b/src/controller/buffersController.py index 3655b45e..6a222af1 100644 --- a/src/controller/buffersController.py +++ b/src/controller/buffersController.py @@ -10,6 +10,7 @@ import messages from twitter import compose, prettydate, utils from wxUI import buffers, dialogs, commonMessageDialogs from mysc.thread_utils import call_threaded +from twython import TwythonError class bufferController(object): def __init__(self, parent=None, function=None, session=None, *args, **kwargs): @@ -28,7 +29,7 @@ class bufferController(object): elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down" elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up" elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list" - elif ev.GetKeyCode() == wx.WXK_DELETE: event = "delete_item" + elif ev.GetKeyCode() == wx.WXK_DELETE: event = "destroy_status" else: event = None ev.Skip() @@ -76,6 +77,9 @@ class bufferController(object): def get_object(self): return self.buffer + def get_message(self): + pass + def set_list_position(self, reversed=False): if reversed == False: self.buffer.list.select_item(-1) @@ -91,6 +95,9 @@ class bufferController(object): def retweet(self): pass + def destroy_status(self): + pass + class accountPanel(bufferController): def __init__(self, parent, name, account): super(accountPanel, self).__init__(parent, None, name) @@ -133,6 +140,9 @@ class baseBufferController(bufferController): self.buffer.account = account self.bind_events() + def get_message(self): + return " ".join(self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"])[1:-2]) + def start_stream(self): val = self.session.call_paged(self.function, *self.args, **self.kwargs) number_of_items = self.session.order_buffer(self.name, val) @@ -257,18 +267,22 @@ class baseBufferController(bufferController): self.buffer.list.clear() dlg.Destroy() - def delete_item(self): - dlg = wx.MessageDialog(None, _(u"Do you really want to delete this message?"), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO) - if dlg.ShowModal() == widgetUtils.YES: - index = self.buffer.list.get_selected() - try: - self.session.twitter.twitter.destroy_status(id=self.session.db[self.name][index]["id"]) - self.session.db[self.name].pop(index) - self.buffer.list.remove_item(index) - if index > 0: - self.buffer.list.select_item(index-1) - except: - sound.player.play("error.ogg") + def destroy_status(self, *args, **kwargs): + index = self.buffer.list.get_selected() + if self.type == "events" or self.type == "people" or self.type == "empty" or self.type == "account": return + answer = commonMessageDialogs.delete_tweet_dialog(None) + if answer == widgetUtils.YES: +# try: + if self.name == "direct_messages": + self.session.twitter.twitter.destroy_direct_message(id=self.get_right_tweet()["id"]) + else: + self.session.twitter.twitter.destroy_status(id=self.get_right_tweet()["id"]) + self.session.db[self.name].pop(index) + self.buffer.list.remove_item(index) + if index > 0: + self.buffer.list.select_item(index-1) +# except TwythonError: +# sound.player.play("error.ogg") class eventsBufferController(bufferController): def __init__(self, parent, name, session, account, *args, **kwargs): @@ -280,6 +294,15 @@ class eventsBufferController(bufferController): self.buffer.account = self.account self.compose_function = compose.compose_event self.session = session + self.type = self.buffer.type + + def get_message(self): + if self.list.get_count() == 0: return _(u"Empty") + # fix this: + if platform.system() == "Windows": + return "%s. %s" % (self.buffer.list.list.GetItemText(self.buffer.list.get_selected()), self.buffer.list.list.GetItemText(self.buffer.list.get_selected(), 1)) + else: + return self.buffer.list.list.GetStringSelection() def add_new_item(self, item): tweet = self.compose_function(item, self.session.db["user_name"]) @@ -297,6 +320,9 @@ class peopleBufferController(baseBufferController): def onFocus(self, ev): pass + def get_message(self): + return " ".join(self.compose_function(self.get_tweet(), self.session.db, self.session.settings["general"]["relative_times"])) + def delete_item(self): pass def start_stream(self): diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 7a9c48bb..76d90df6 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- -from wxUI import (view, dialogs) +from wxUI import (view, dialogs, commonMessageDialogs) import buffersController import messages from sessionmanager import session from pubsub import pub import sound import output +from twython import TwythonError from mysc.thread_utils import call_threaded from mysc.repeating_timer import RepeatingTimer import config @@ -29,6 +30,12 @@ class Controller(object): for i in self.buffers: if i.name == name_ and i.account == user: return i + def get_current_buffer(self): + buffer = self.view.get_current_buffer() + if hasattr(buffer, "account"): + buffer = self.search_buffer(buffer.name, buffer.account) + return buffer + def get_best_buffer(self): # Gets the parent buffer to know what account is doing an action view_buffer = self.view.get_current_buffer() @@ -66,6 +73,8 @@ class Controller(object): widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_retweet, self.view.retweet) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_favourites, self.view.fav) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_favourites, self.view.unfav) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_item, self.view.view) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete) widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm) def __init__(self): @@ -206,8 +215,11 @@ class Controller(object): def show_details_for_user(self, user): pass - def delete(self): - pass + def delete(self, *args, **kwargs): + buffer = self.view.get_current_buffer() + if hasattr(buffer, "account"): + buffer = self.search_buffer(buffer.name, buffer.account) + buffer.destroy_status() def exit(self, *args, **kwargs): for item in session.sessions: @@ -233,7 +245,7 @@ class Controller(object): call_threaded(buffer.session.api_call, call_name="update_status_with_media", _sound="tweet_send.ogg", status=text, media=tweet.image) def post_reply(self, *args, **kwargs): - buffer = self.get_best_buffer() + buffer = self.get_current_buffer() if buffer.name == "sent_direct_messages" or buffer.name == "sent-tweets": return elif buffer.name == "direct_messages": buffer.direct_message() @@ -241,20 +253,20 @@ class Controller(object): buffer.reply() def send_dm(self, user): - buffer = self.get_best_buffer() + buffer = self.get_current_buffer() if buffer.name == "sent_direct_messages" or buffer.name == "sent-tweets": return else: buffer.direct_message() def post_retweet(self, *args, **kwargs): - buffer = self.get_best_buffer() + buffer = self.get_current_buffer() if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": return else: buffer.retweet() def add_to_favourites(self, *args, **kwargs): - buffer = self.get_best_buffer() + buffer = self.get_current_buffer() if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": return else: @@ -262,13 +274,28 @@ class Controller(object): call_threaded(buffer.session.api_call, call_name="create_favorite", _sound="favourite.ogg", id=id) def remove_from_favourites(self, *args, **kwargs): - buffer = self.get_best_buffer() + buffer = self.get_current_buffer() if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": return else: id = buffer.get_tweet()["id"] call_threaded(buffer.session.api_call, call_name="destroy_favorite", id=id) + def view_item(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search": + try: + tweet = buffer.get_right_tweet() + msg = messages.viewTweet(tweet, ) + except TwythonError: + non_tweet = buffer.get_message() + msg = messages.viewTweet(non_tweet, False) + elif buffer.type == "account" or buffer.type == "empty": + return + else: + non_tweet = buffer.get_message() + msg = messages.viewTweet(non_tweet, False) + def open_timeline(self, user, timeline_tipe): pass diff --git a/src/controller/messages.py b/src/controller/messages.py index a83d633a..c229edfe 100644 --- a/src/controller/messages.py +++ b/src/controller/messages.py @@ -127,4 +127,29 @@ class reply(tweet): class dm(basicTweet): def __init__(self, session, title, caption, text): - super(dm, self).__init__(session, title, caption, text, messageType="dm") \ No newline at end of file + super(dm, self).__init__(session, title, caption, text, messageType="dm") + +class viewTweet(basicTweet): + def __init__(self, tweet, is_tweet=True): + if is_tweet == True: + if tweet.has_key("retweeted_status"): + text = "rt @%s: %s" % (tweet["retweeted_status"]["user"]["screen_name"], tweet["retweeted_status"]["text"]) + else: + text = tweet["text"] + rt_count = str(tweet["retweet_count"]) + favs_count = str(tweet["favorite_count"]) + self.message = message.viewTweet(text, rt_count, favs_count) + self.message.set_title(len(text)) + else: + text = tweet + self.message = message.viewNonTweet(text) + widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) + widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) + if self.contain_urls() == True: + widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) + self.message.get_response() + + def contain_urls(self): + if len(utils.find_urls_in_text(self.message.get_text())) > 0: + return True + return False \ No newline at end of file diff --git a/src/wxUI/commonMessageDialogs.py b/src/wxUI/commonMessageDialogs.py index b0b20299..e71d5dde 100644 --- a/src/wxUI/commonMessageDialogs.py +++ b/src/wxUI/commonMessageDialogs.py @@ -2,4 +2,7 @@ import wx def retweet_question(parent): - return wx.MessageDialog(parent, _(u"Would you like to add a comment to this tweet?"), _("Retweet"), wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION).ShowModal() \ No newline at end of file + return wx.MessageDialog(parent, _(u"Would you like to add a comment to this tweet?"), _("Retweet"), wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION).ShowModal() + +def delete_tweet_dialog(parent): + return wx.MessageDialog(parent, _(u"Do you really want to delete this message? It will be eliminated from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO).ShowModal() diff --git a/src/wxUI/dialogs/message.py b/src/wxUI/dialogs/message.py index 3a741621..ca64e528 100644 --- a/src/wxUI/dialogs/message.py +++ b/src/wxUI/dialogs/message.py @@ -155,13 +155,15 @@ class reply(tweet): self.mainBox.Layout() self.SetClientSize(self.mainBox.CalcMin()) -class viewTweet(wx.Dialog): - def __init__(self, tweet): +class viewTweet(widgetUtils.BaseDialog): + def set_title(self, lenght): + self.SetTitle(_(u"Tweet - %i characters ") % (lenght,)) + + def __init__(self, text, rt_count, favs_count): super(viewTweet, self).__init__(None, size=(850,850)) - self.SetTitle(_(u"Tweet - %i characters ") % (len(tweet))) panel = wx.Panel(self) label = wx.StaticText(panel, -1, _(u"Tweet")) - self.text = wx.TextCtrl(panel, -1, tweet, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) dc = wx.WindowDC(self.text) dc.SetFont(self.text.GetFont()) (x, y, z) = dc.GetMultiLineTextExtent("0"*140) @@ -172,15 +174,81 @@ class viewTweet(wx.Dialog): textBox.Add(self.text, 1, wx.EXPAND, 5) mainBox = wx.BoxSizer(wx.VERTICAL) mainBox.Add(textBox, 0, wx.ALL, 5) - spellcheck = wx.Button(panel, -1, _("Spelling correction"), size=wx.DefaultSize) + rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: ")) + rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + rtBox = wx.BoxSizer(wx.HORIZONTAL) + rtBox.Add(rtCountLabel, 0, wx.ALL, 5) + rtBox.Add(rtCount, 0, wx.ALL, 5) + favsCountLabel = wx.StaticText(panel, -1, _(u"Favourites: ")) + favsCount = wx.TextCtrl(panel, -1, 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) + infoBox = wx.BoxSizer(wx.HORIZONTAL) + infoBox.Add(rtBox, 0, wx.ALL, 5) + infoBox.Add(favsBox, 0, wx.ALL, 5) + mainBox.Add(infoBox, 0, wx.ALL, 5) + self.spellcheck = wx.Button(panel, -1, _("Spelling correction"), size=wx.DefaultSize) self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize) self.unshortenButton.Disable() - translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize) + self.translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize) cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) + cancelButton.SetDefault() buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - buttonsBox.Add(spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) - buttonsBox.Add(translateButton, 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.NewId() + 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() + + def get_text(self): + return self.text.GetValue() + + def text_focus(self): + self.text.SetFocus() + + def onSelect(self, ev): + self.text.SelectAll() + +class viewNonTweet(widgetUtils.BaseDialog): + + def __init__(self, text): + super(viewNonTweet, self).__init__(None, size=(850,850)) + self.SetTitle(_(u"View")) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Item")) + self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.text) + dc.SetFont(self.text.GetFont()) + (x, y, z) = dc.GetMultiLineTextExtent("0"*140) + self.text.SetSize((x, y)) + 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) + self.spellcheck = wx.Button(panel, -1, _("Spelling correction"), size=wx.DefaultSize) + self.unshortenButton = wx.Button(panel, -1, _(u"Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Disable() + self.translateButton = wx.Button(panel, -1, _(u"Translate message"), size=wx.DefaultSize) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.unshortenButton, 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.NewId() @@ -193,4 +261,13 @@ class viewTweet(wx.Dialog): self.SetClientSize(mainBox.CalcMin()) def onSelect(self, ev): - self.text.SelectAll() \ No newline at end of file + self.text.SelectAll() + + def set_text(self, text): + self.text.ChangeValue() + + def get_text(self): + return self.text.GetValue() + + def text_focus(self): + self.text.SetFocus()