mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2024-11-22 11:18:08 -06:00
The keystroke editor now works properly
This commit is contained in:
parent
e7852e5e91
commit
b7193d16ee
@ -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()
|
@ -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)
|
||||
|
||||
|
@ -1,3 +1 @@
|
||||
import platform
|
||||
if platform.system() == "Windows":
|
||||
from wxUI import *
|
||||
from keystrokeEditor import KeystrokeEditor
|
@ -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"),
|
||||
}
|
56
src/keystrokeEditor/keystrokeEditor.py
Normal file
56
src/keystrokeEditor/keystrokeEditor.py
Normal file
@ -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)
|
@ -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)
|
74
src/keystrokeEditor/wx_ui.py
Normal file
74
src/keystrokeEditor/wx_ui.py
Normal file
@ -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()
|
@ -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
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user