diff --git a/src/controller/mainController.py b/src/controller/mainController.py index 27ebc209..d9f53654 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -104,7 +104,7 @@ class Controller(object): def bind_other_events(self): """ Binds the local application events with their functions.""" log.debug("Binding other application events...") - pub.subscribe(self.editing_keystroke, "editing_keystroke") + pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed") pub.subscribe(self.manage_stream_errors, "stream-error") pub.subscribe(self.create_new_buffer, "create-new-buffer") pub.subscribe(self.restart_streams, "restart-streams") @@ -280,11 +280,22 @@ class Controller(object): search.timer.start() dlg.Destroy() - def edit_keystrokes(self, event=None): - dlg = keystrokeEditor.keystrokeEditor() - dlg.put_keystrokes(**config.app["keymap"]) - dlg.ShowModal() - dlg.Destroy() + def edit_keystrokes(self, *args, **kwargs): + editor = keystrokeEditor.KeystrokeEditor() + if editor.changed == True: + register = False + # determines if we need to reassign the keymap. + if self.showing == False: + register = True + elif config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == True: + register = True + # If there is a keyboard handler instance we need unregister all old keystrokes before register the new ones. + if hasattr(self, "keyboard_handler"): + keymap = {} + for i in editor.hold_map: + if hasattr(self, i): keymap[editor.hold_map[i]] = getattr(self, i) + self.unregister_invisible_keyboard_shorcuts(keymap) + self.invisible_shorcuts_changed(registered=register) def learn_sounds(self, *args, **kwargs): """ Opens the sounds tutorial for the current account.""" @@ -849,11 +860,11 @@ class Controller(object): if "followers" in buffer.session.settings["other_buffers"]["muted_buffers"]: return self.notify(buffer.session, play_sound=play_sound) buffer.add_new_item(data) + pub.sendMessage("restart-streams", streams=["main_stream"], session=buffer.session) def manage_friend(self, data, user): buffer = self.search_buffer("friends", user) buffer.add_new_item(data) - pub.sendMessage("restart-streams", streams=["main_stream"], session=buffer.session) def manage_unfollowing(self, item, user): buffer = self.search_buffer("friends", user) @@ -940,9 +951,17 @@ class Controller(object): def restart_streams(self, streams=[], session=None): for i in streams: - log.debug("Reconnecting the %s stream" % (i,)) + log.debug("Restarting the %s stream" % (i,)) session.remove_stream(i) session.check_connection() + def invisible_shorcuts_changed(self, registered): + if registered == True: + km = self.create_invisible_keyboard_shorcuts() + self.register_invisible_keyboard_shorcuts(km) + elif registered == False: + km = self.create_invisible_keyboard_shorcuts() + self.unregister_invisible_keyboard_shorcuts(km) + def __del__(self): config.app.write() \ No newline at end of file diff --git a/src/controller/userActionsController.py b/src/controller/userActionsController.py index 79bd3eb9..052fc161 100644 --- a/src/controller/userActionsController.py +++ b/src/controller/userActionsController.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from wxUI.dialogs import userActions +from pubsub import pub import re import widgetUtils import output @@ -23,6 +24,7 @@ class userActionsController(object): def follow(self, user): try: self.session.twitter.twitter.create_friendship(screen_name=user ) + pub.sendMessage("restart-streams", streams=["main_stream"], session=self.session) except TwythonError as err: output.speak("Error %s: %s" % (err.error_code, err.msg), True) @@ -35,12 +37,14 @@ class userActionsController(object): def mute(self, user): try: id = self.session.twitter.twitter.create_mute(screen_name=user ) + pub.sendMessage("restart-streams", streams=["main_stream"], session=self.session) except TwythonError as err: output.speak("Error %s: %s" % (err.error_code, err.msg), True) def unmute(self, user): try: id = self.session.twitter.twitter.destroy_mute(screen_name=user ) + pub.sendMessage("restart-streams", streams=["main_stream"], session=self.session) except TwythonError as err: output.speak("Error %s: %s" % (err.error_code, err.msg), True) @@ -53,12 +57,14 @@ class userActionsController(object): def block(self, user): try: id = self.session.twitter.twitter.create_block(screen_name=user ) + pub.sendMessage("restart-streams", streams=["main_stream"], session=self.session) except TwythonError as err: output.speak("Error %s: %s" % (err.error_code, err.msg), True) def unblock(self, user): try: id = self.session.twitter.twitter.destroy_block(screen_name=user ) + pub.sendMessage("restart-streams", streams=["main_stream"], session=self.session) except TwythonError as err: output.speak("Error %s: %s" % (err.error_code, err.msg), True) diff --git a/src/keystrokeEditor/__init__.py b/src/keystrokeEditor/__init__.py index 4723bc5b..aef2cc0f 100644 --- a/src/keystrokeEditor/__init__.py +++ b/src/keystrokeEditor/__init__.py @@ -1,3 +1 @@ -import platform -if platform.system() == "Windows": - from wxUI import * \ No newline at end of file +from keystrokeEditor import KeystrokeEditor \ No newline at end of file diff --git a/src/keystrokeEditor/constants.py b/src/keystrokeEditor/constants.py index 90758294..8585fe71 100644 --- a/src/keystrokeEditor/constants.py +++ b/src/keystrokeEditor/constants.py @@ -5,21 +5,23 @@ actions = { "down": _(u"Go down up on the current list"), "left": _(u"Go to the previous tab"), "right": _(u"Go to the next tab"), +"next_account": _(u"Changes to the next account"), +"previous_account": _(u"Changes to the previous account"), "conversation_up": _(u"Move up one tweet in the conversation"), "conversation_down": _(u"Move down one tweet in the conversation"), "show_hide": _(u"Show the graphical interface"), -"compose": _(u"New tweet"), -"reply": _(u"Reply to a tweet"), -"retweet": _(u"Retweet"), -"dm": _(u"Send direct message"), -"fav": _(u"Mark as favourite"), -"unfav": _(u"Remove from favourites"), +"post_tweet": _(u"New tweet"), +"post_reply": _(u"Reply to a tweet"), +"post_retweet": _(u"Retweet"), +"send_dm": _(u"Send direct message"), +"add_to_favourites": _(u"Mark as favourite"), +"remove_from_favourites": _(u"Remove from favourites"), "action": _(u"Open the actions dialogue"), "details": _(u"See user details"), -"view": _(u"Show tweet"), -"close": _(u"Quit"), +"view_item": _(u"Show tweet"), +"exit": _(u"Quit"), "open_timeline": _(u"Open user timeline"), -"delete_buffer": _(u"Remove buffer"), +"remove_buffer": _(u"Remove buffer"), "url": _(u"Open URL on the current tweet, or further information for a friend or follower"), "audio": _(u"Attempt to play audio"), "volume_up": _(u"Increase volume by 5%"), @@ -30,7 +32,7 @@ actions = { "go_page_down": _(u"Move 20 elements down on the current list"), "update_profile": _(u"Edit profile"), "delete": _(u"Remove a tweet or direct message"), -"clear_list": _(u"Empty the buffer removing all the elements"), +"clear_buffer": _(u"Empty the buffer removing all the elements"), "repeat_item": _(u"Listen the current message"), "copy_to_clipboard": _(u"Copy to clipboard"), "add_to_list": _(u"Add to list"), @@ -41,5 +43,8 @@ actions = { "search": _(u"Search on twitter"), "edit_keystrokes": _(u"Shows the keystroke editor"), "view_user_lists": _(u"Show lists for a specified user"), -"get_more_items": _(u"Loads more items for the current buffer"), +"get_more_items": _(u"loads previous items to any buffer"), +"reverse_geocode": _(u"Get location of any tweet"), +"view_reverse_geocode": _(u"Displays the tweet's location in a dialog"), +"get_trending_topics": _(u"Creates a buffer for displaying trends for a desired place"), } \ No newline at end of file diff --git a/src/keystrokeEditor/keystrokeEditor.py b/src/keystrokeEditor/keystrokeEditor.py new file mode 100644 index 00000000..a6aa52a2 --- /dev/null +++ b/src/keystrokeEditor/keystrokeEditor.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +import widgetUtils +import config +import wx_ui +import constants + +class KeystrokeEditor(object): + def __init__(self): + super(KeystrokeEditor, self).__init__() + self.changed = False # Change it if the keyboard shorcuts are reassigned. + self.dialog = wx_ui.keystrokeEditorDialog() + self.map = config.app["keymap"] + # we need to copy the keymap before modify it, for unregistering the old keystrokes if is needed. + self.hold_map = self.map.copy() + self.dialog.put_keystrokes(constants.actions, self.map) + widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke) + self.dialog.get_response() + + def edit_keystroke(self, *args, **kwargs): + action = self.dialog.actions[self.dialog.get_action()] + edit_dialog = wx_ui.editKeystrokeDialog() + self.set_keystroke(self.map[action], edit_dialog) + answer = edit_dialog.get_response() + if answer == widgetUtils.OK: + new_keystroke = self.get_edited_keystroke(edit_dialog) + print new_keystroke + if new_keystroke != self.map[action]: + self.changed = True + print "changed" + self.map[action] = new_keystroke + + def set_keystroke(self, keystroke, dialog): + for i in keystroke.split("+"): + if hasattr(dialog, i): + dialog.set(i, True) + dialog.set("key", keystroke.split("+")[-1]) + + def get_edited_keystroke(self, dialog): + keys = [] + if dialog.get("win") == False: + wx_ui.no_win_message() + return + if dialog.get("control") == True: + keys.append("control") +# if dialog.get("win") == True: + keys.append("win") + if dialog.get("alt") == True: + keys.append("alt") + if dialog.get("shift") == True: + keys.append("shift") + if dialog.get("key") != "": + keys.append(dialog.get("key")) + else: + wx_ui.no_key() + return + return "+".join(keys) diff --git a/src/keystrokeEditor/wxUI.py b/src/keystrokeEditor/wxUI.py deleted file mode 100644 index 4e50d8ee..00000000 --- a/src/keystrokeEditor/wxUI.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -import config -import wx -import constants -from multiplatform_widgets import widgets -from constants import actions -from pubsub import pub - -class keystrokeEditor(wx.Dialog): - def __init__(self): - super(keystrokeEditor, self).__init__(parent=None, id=-1, title=_(u"Keystroke editor")) - panel = wx.Panel(self) - self.actions = [] - sizer = wx.BoxSizer(wx.VERTICAL) - keysText = wx.StaticText(panel, -1, _(u"Select a keystroke to edit")) - self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450)) - self.keys.list.SetFocus() - firstSizer = wx.BoxSizer(wx.HORIZONTAL) - firstSizer.Add(keysText) - firstSizer.Add(self.keys.list) - edit = wx.Button(panel, -1, _(u"Edit")) - self.Bind(wx.EVT_BUTTON, self.edit, edit) - edit.SetDefault() - - close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) - secondSizer = wx.BoxSizer(wx.HORIZONTAL) - secondSizer.Add(edit) - secondSizer.Add(close) - sizer.Add(firstSizer) - sizer.Add(secondSizer) - panel.SetSizerAndFit(sizer) - - def put_keystrokes(self, **keystrokes): - for i in keystrokes: - action = actions[i] - self.actions.append(i) - keystroke = keystrokes[i] - self.keys.insert_item(False, *[action, keystroke]) - - def edit(self, ev): - action = self.actions[self.keys.get_selected()] - pub.sendMessage("editing_keystroke", action=action, parentDialog=self) - -class editKeystroke(wx.Dialog): - def __init__(self, action, keystroke, keyboard_handler): - super(editKeystroke, self).__init__(parent=None, id=-1, title=_(u"Editing keystroke")) - self.parent = parent - self.keyboard_handler = keyboard_handler - self.action = action - self.keystroke = keystroke - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.control = wx.CheckBox(panel, -1, _(u"Control")) - self.alt = wx.CheckBox(panel, -1, _(u"Alt")) - self.shift = wx.CheckBox(panel, -1, _(u"Shift")) - self.win = wx.CheckBox(panel, -1, _(u"Windows")) - sizer1 = wx.BoxSizer(wx.HORIZONTAL) - sizer1.Add(self.control) - sizer1.Add(self.alt) - sizer1.Add(self.shift) - sizer1.Add(self.win) - charLabel = wx.StaticText(panel, -1, _(u"Key")) - self.key = wx.TextCtrl(panel, -1) -# self.key.SetMaxLength(1) - sizer2 = wx.BoxSizer(wx.HORIZONTAL) - sizer2.Add(charLabel) - sizer2.Add(self.key) - ok = wx.Button(panel, wx.ID_OK, _(u"OK")) - ok.SetDefault() - self.Bind(wx.EVT_BUTTON, self.ok, ok) - cancel = wx.Button(panel, wx.ID_CANCEL) - sizer3 = wx.BoxSizer(wx.HORIZONTAL) - sizer3.Add(ok) - sizer3.Add(cancel) - sizer.Add(sizer1) - sizer.Add(sizer2) - sizer.Add(sizer3) - panel.SetSizerAndFit(sizer) - self.set_default() - - def set_default(self): - for i in self.keystroke.split("+"): - if hasattr(self, i): - key = getattr(self, i) - key.SetValue(True) - self.key.SetValue(self.keystroke.split("+")[-1]) - - def ok(self, ev): - keys = [] - if self.win.GetValue() == False: - wx.MessageDialog(self, _(u"You need to use the Windows key"), _(u"Invalid keystroke"), wx.OK|wx.ICON_ERROR).ShowModal() - return - if self.control.GetValue() == True: - keys.append("control") - if self.win.GetValue() == True: - keys.append("win") - if self.alt.GetValue() == True: - keys.append("alt") - if self.shift.GetValue() == True: - keys.append("shift") - if self.key.GetValue() != "": - keys.append(self.key.GetValue()) - else: - wx.MessageDialog(self, _(u"You must provide a character for the keystroke"), _(u"Invalid keystroke"), wx.ICON_ERROR).ShowModal() - return - config.main["keymap"][self.action] = "+".join(keys) - if self.keyboard_handler != None: - self.keyboard_handler.unregister_key(self.keystroke, getattr(self.parent, self.action)) - self.keyboard_handler.register_key(config.main["keymap"][self.action], getattr(self.parent, self.action)) - - self.EndModal(wx.ID_OK) \ No newline at end of file diff --git a/src/keystrokeEditor/wx_ui.py b/src/keystrokeEditor/wx_ui.py new file mode 100644 index 00000000..8bd3794d --- /dev/null +++ b/src/keystrokeEditor/wx_ui.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +import wx +from multiplatform_widgets import widgets +from wxUI.dialogs import baseDialog + +class keystrokeEditorDialog(baseDialog.BaseWXDialog): + def __init__(self): + super(keystrokeEditorDialog, self).__init__(parent=None, id=-1, title=_(u"Keystroke editor")) + panel = wx.Panel(self) + self.actions = [] + sizer = wx.BoxSizer(wx.VERTICAL) + keysText = wx.StaticText(panel, -1, _(u"Select a keystroke to edit")) + self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450)) + self.keys.list.SetFocus() + firstSizer = wx.BoxSizer(wx.HORIZONTAL) + firstSizer.Add(keysText) + firstSizer.Add(self.keys.list) + self.edit = wx.Button(panel, -1, _(u"Edit")) + self.edit.SetDefault() + + close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + secondSizer = wx.BoxSizer(wx.HORIZONTAL) + secondSizer.Add(self.edit) + secondSizer.Add(close) + sizer.Add(firstSizer) + sizer.Add(secondSizer) + panel.SetSizerAndFit(sizer) + + def put_keystrokes(self, actions, keystrokes): + for i in keystrokes: + action = actions[i] + self.actions.append(i) + keystroke = keystrokes[i] + self.keys.insert_item(False, *[action, keystroke]) + + def get_action(self): + return self.keys.get_selected() + +class editKeystrokeDialog(baseDialog.BaseWXDialog): + def __init__(self): + super(editKeystrokeDialog, self).__init__(parent=None, id=-1, title=_(u"Editing keystroke")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.control = wx.CheckBox(panel, -1, _(u"Control")) + self.alt = wx.CheckBox(panel, -1, _(u"Alt")) + self.shift = wx.CheckBox(panel, -1, _(u"Shift")) + self.win = wx.CheckBox(panel, -1, _(u"Windows")) + sizer1 = wx.BoxSizer(wx.HORIZONTAL) + sizer1.Add(self.control) + sizer1.Add(self.alt) + sizer1.Add(self.shift) + sizer1.Add(self.win) + charLabel = wx.StaticText(panel, -1, _(u"Key")) + self.key = wx.TextCtrl(panel, -1) + sizer2 = wx.BoxSizer(wx.HORIZONTAL) + sizer2.Add(charLabel) + sizer2.Add(self.key) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL) + sizer3 = wx.BoxSizer(wx.HORIZONTAL) + sizer3.Add(ok) + sizer3.Add(cancel) + sizer.Add(sizer1) + sizer.Add(sizer2) + sizer.Add(sizer3) + panel.SetSizerAndFit(sizer) + + +def no_win_message(): + return wx.MessageDialog(None, _(u"You need to use the Windows key"), _(u"Invalid keystroke"), wx.OK|wx.ICON_ERROR).ShowModal() + +def no_key(): + return wx.MessageDialog(None, _(u"You must provide a character for the keystroke"), _(u"Invalid keystroke"), wx.ICON_ERROR).ShowModal() \ No newline at end of file diff --git a/src/wxUI/dialogs/baseDialog.py b/src/wxUI/dialogs/baseDialog.py index e20b805b..aa1ad33f 100644 --- a/src/wxUI/dialogs/baseDialog.py +++ b/src/wxUI/dialogs/baseDialog.py @@ -13,4 +13,13 @@ class BaseWXDialog(wx.Dialog): if hasattr(control, "GetValue"): return getattr(control, "GetValue")() elif hasattr(control, "GetLabel"): return getattr(control, "GetLabel")() else: return -1 - else: return 0 \ No newline at end of file + else: return 0 + + def set(self, control, text): + if hasattr(self, control): + control = getattr(self, control) + if hasattr(control, "SetValue"): return getattr(control, "SetValue")(text) + elif hasattr(control, "SetLabel"): return getattr(control, "SetLabel")(text) + elif hasattr(control, "ChangeValue"): return getattr(control, "ChangeValue")(text) + else: return -1 + else: return 0