mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-26 01:49:22 +00:00
Compare commits
46 Commits
snapshot9.
...
snapshot10
Author | SHA1 | Date | |
---|---|---|---|
2d35304ef0 | |||
4f0e6d758b | |||
bd4aa89c2b | |||
b046360293 | |||
6971fb3999 | |||
7b840f29c4 | |||
71fed7300b | |||
57315c3b6e | |||
3d3abc90e1 | |||
de7882e4cf | |||
![]() |
10190d61c0 | ||
bb6fa7cb46 | |||
80cb70c9a6 | |||
77d51aa51a | |||
![]() |
ebb4e22d02 | ||
4344a0df0c | |||
34ad0c5e47 | |||
704ade560a | |||
a4892cf847 | |||
e59661775a | |||
53a9f04155 | |||
100f483a86 | |||
bad468560a | |||
eb0cf62a54 | |||
a016932ac7 | |||
1706414171 | |||
5f963aa66b | |||
25578e4fc6 | |||
faec92ce6c | |||
313e725ff2 | |||
3f82a51ef9 | |||
d26ab9b910 | |||
aa42e056c0 | |||
fa6592ed1a | |||
11b06accbb | |||
![]() |
915eb5802f | ||
![]() |
4e943c7bee | ||
![]() |
692d75562e | ||
4cce6d4318 | |||
e55e15466d | |||
370340de0b | |||
10bc483887 | |||
f66b2ccbad | |||
6460c20a97 | |||
9f2c240fc1 | |||
a4cbbfcb9f |
@@ -34,3 +34,4 @@ Holly Scott-Gardner
|
||||
Anibal Hernández
|
||||
Sussan Leiva
|
||||
Brian Hartgen
|
||||
PEDRO REINA COLOBON
|
@@ -163,7 +163,7 @@ documentation.append(_(u"""* Lists Manager: This dialogue box allows you to mana
|
||||
documentation.append(_(u"""* Edit keystrokes: this opens a dialogue where you can see and edit the shortcuts used in the invisible interface."""))
|
||||
documentation.append(_(u"""* Account settings: Opens a dialogue box which lets you customize settings for the current account."""))
|
||||
documentation.append(_(u"""* Global settings: Opens a dialogue which lets you configure settings for the entire application."""))
|
||||
documentation.append(_(u"""* Quit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."""))
|
||||
documentation.append(_(u"""* Exit: asks whether you want to exit the program. If the answer is yes, it closes the application. If you do not want to be asked for confirmation before exiting, uncheck the checkbox from the global settings dialogue box."""))
|
||||
documentation.append(_(u"""
|
||||
"""))
|
||||
documentation.append(_(u"""##### Tweet menu"""))
|
||||
|
@@ -36,6 +36,7 @@ autoread_buffers = list(default=list(mentions, direct_messages, events))
|
||||
spelling_language = string(default="")
|
||||
save_followers_in_autocompletion_db = boolean(default=False)
|
||||
save_friends_in_autocompletion_db = boolean(default=False)
|
||||
twishort_enabled = boolean(default=False)
|
||||
|
||||
[services]
|
||||
pocket_access_token = string(default="")
|
@@ -14,6 +14,7 @@ play_ready_sound = boolean(default=True)
|
||||
speak_ready_msg = boolean(default=True)
|
||||
log_level = string(default="error")
|
||||
load_keymap = string(default="default.keymap")
|
||||
donation_dialog_displayed = boolean(default=False)
|
||||
|
||||
[proxy]
|
||||
server = string(default="")
|
||||
|
@@ -5,7 +5,7 @@ if snapshot == False:
|
||||
version = "0.80"
|
||||
update_url = 'http://twblue.es/updates/twblue_ngen.json'
|
||||
else:
|
||||
version = "9.9"
|
||||
version = "10.5"
|
||||
update_url = 'http://twblue.es/updates/snapshots_ngen.json'
|
||||
author = u"Manuel Cortéz, Bill Dengler"
|
||||
authorEmail = "manuel@manuelcortez.net"
|
||||
|
@@ -16,4 +16,4 @@ def setup ():
|
||||
app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC))
|
||||
log.debug("Loading keymap...")
|
||||
global keymap
|
||||
keymap = config_utils.load_config(paths.app_path("keymaps/"+app['app-settings']['load_keymap']), paths.app_path('keymaps/base.template'))
|
||||
keymap = config_utils.load_config(paths.config_path("keymap.keymap"), paths.app_path("keymaps/"+app['app-settings']['load_keymap']))
|
||||
|
@@ -2,7 +2,7 @@
|
||||
import platform
|
||||
if platform.system() == "Windows":
|
||||
import wx
|
||||
from wxUI import buffers, dialogs, commonMessageDialogs
|
||||
from wxUI import buffers, dialogs, commonMessageDialogs, menus
|
||||
import user
|
||||
elif platform.system() == "Linux":
|
||||
from gi.repository import Gtk
|
||||
@@ -127,8 +127,9 @@ class bufferController(object):
|
||||
def post_tweet(self, *args, **kwargs):
|
||||
title = _(u"Tweet")
|
||||
caption = _(u"Write the tweet here")
|
||||
tweet = messages.tweet(self.session, title, caption, "")
|
||||
tweet = messages.tweet(self.session, title, caption, "", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||
if tweet.message.get_response() == widgetUtils.OK:
|
||||
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
||||
text = tweet.message.get_text()
|
||||
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
||||
if tweet.image == None:
|
||||
@@ -141,6 +142,13 @@ class bufferController(object):
|
||||
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||
|
||||
def save_positions(self):
|
||||
try:
|
||||
self.session.db[self.name+"_pos"]=self.buffer.list.get_selected()
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
|
||||
class accountPanel(bufferController):
|
||||
def __init__(self, parent, name, account, account_id):
|
||||
super(accountPanel, self).__init__(parent, None, name)
|
||||
@@ -234,6 +242,10 @@ class baseBufferController(bufferController):
|
||||
uri = tweet["long_uri"]
|
||||
try:
|
||||
tweet = self.session.twitter.twitter.show_status(id=tweet_id)
|
||||
urls = utils.find_urls_in_text(tweet["text"])
|
||||
for url in range(0, len(urls)):
|
||||
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||||
except IndexError: pass
|
||||
except TwythonError as e:
|
||||
utils.twitter_error(e)
|
||||
return
|
||||
@@ -245,6 +257,10 @@ class baseBufferController(bufferController):
|
||||
id = tweets.get_id(l)
|
||||
try:
|
||||
tweet = self.session.twitter.twitter.show_status(id=id)
|
||||
urls = utils.find_urls_in_text(tweet["text"])
|
||||
for url in range(0, len(urls)):
|
||||
try: tweet["text"] = tweet["text"].replace(urls[url], tweet["entities"]["urls"][url]["expanded_url"])
|
||||
except IndexError: pass
|
||||
except TwythonError as e:
|
||||
utils.twitter_error(e)
|
||||
return
|
||||
@@ -356,6 +372,61 @@ class baseBufferController(bufferController):
|
||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
||||
widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
||||
# Replace for the correct way in other platforms.
|
||||
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||
|
||||
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||
if self.buffer.list.get_count() == 0: return
|
||||
if self.name == "sent_tweets" or self.name == "sent_direct_messages":
|
||||
menu = menus.sentPanelMenu()
|
||||
elif self.name == "direct_messages":
|
||||
menu = menus.dmPanelMenu()
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.direct_message, menuitem=menu.reply)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||
else:
|
||||
menu = menus.basePanelMenu()
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.reply, menuitem=menu.reply)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.retweet, menuitem=menu.retweet)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.fav, menuitem=menu.fav)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.unfav, menuitem=menu.unfav)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.url_, menuitem=menu.openUrl)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.audio, menuitem=menu.play)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
||||
if pos != 0:
|
||||
self.buffer.PopupMenu(menu, pos)
|
||||
else:
|
||||
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||
|
||||
def view(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="view_item")
|
||||
|
||||
def copy(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||
|
||||
def user_actions(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="follow")
|
||||
|
||||
def fav(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="add_to_favourites")
|
||||
|
||||
def unfav(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="remove_from_favourites")
|
||||
|
||||
def delete_item_(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="delete_item")
|
||||
|
||||
def url_(self, *args, **kwargs):
|
||||
self.url()
|
||||
|
||||
def show_menu_by_key(self, ev):
|
||||
if self.buffer.list.get_count() == 0:
|
||||
return
|
||||
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
|
||||
self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition())
|
||||
|
||||
def get_tweet(self):
|
||||
if self.session.db[self.name][self.buffer.list.get_selected()].has_key("retweeted_status"):
|
||||
@@ -374,8 +445,9 @@ class baseBufferController(bufferController):
|
||||
screen_name = tweet["user"]["screen_name"]
|
||||
id = tweet["id"]
|
||||
users = utils.get_all_mentioned(tweet, self.session.db)
|
||||
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), users)
|
||||
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), twishort_enabled=self.session.settings["mysc"]["twishort_enabled"], users=users)
|
||||
if message.message.get_response() == widgetUtils.OK:
|
||||
self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue()
|
||||
text = message.message.get_text()
|
||||
if len(text) > 140 and message.message.get("long_tweet") == True:
|
||||
if message.image == None:
|
||||
@@ -421,7 +493,7 @@ class baseBufferController(bufferController):
|
||||
self._retweet_with_comment(tweet, id)
|
||||
|
||||
def _retweet_with_comment(self, tweet, id, comment=''):
|
||||
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], tweet["text"]), max=116-len("@%s " % (tweet["user"]["screen_name"],)), messageType="retweet")
|
||||
retweet = messages.tweet(self.session, _(u"Retweet"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet["user"]["screen_name"], tweet["text"]), max=116, messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||
if comment != '':
|
||||
retweet.message.set_text(comment)
|
||||
if retweet.message.get_response() == widgetUtils.OK:
|
||||
@@ -455,10 +527,9 @@ class baseBufferController(bufferController):
|
||||
self.session.sound.play("audio.ogg")
|
||||
if utils.is_geocoded(tweet):
|
||||
self.session.sound.play("geo.ogg")
|
||||
self.session.db[str(self.name+"_pos")]=self.buffer.list.get_selected()
|
||||
|
||||
@_tweets_exist
|
||||
def audio(self,url=''):
|
||||
# @_tweets_exist
|
||||
def audio(self, url='', *args, **kwargs):
|
||||
if hasattr(sound.URLPlayer,'stream'):
|
||||
return sound.URLPlayer.stop_audio(delete=True)
|
||||
tweet = self.get_tweet()
|
||||
@@ -478,8 +549,8 @@ class baseBufferController(bufferController):
|
||||
except:
|
||||
log.error("Exception while executing audio method.")
|
||||
|
||||
@_tweets_exist
|
||||
def url(self,url='',announce=True):
|
||||
# @_tweets_exist
|
||||
def url(self, url='', announce=True, *args, **kwargs):
|
||||
if url == '':
|
||||
tweet = self.get_tweet()
|
||||
urls = utils.find_urls(tweet)
|
||||
@@ -597,6 +668,23 @@ class eventsBufferController(bufferController):
|
||||
if dlg == widgetUtils.YES:
|
||||
self.buffer.list.clear()
|
||||
|
||||
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||
if self.buffer.list.get_count() == 0: return
|
||||
menu = menus.eventsPanelMenu()
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove)
|
||||
if pos != 0:
|
||||
self.buffer.PopupMenu(menu, pos)
|
||||
else:
|
||||
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||
|
||||
def view(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="view_item")
|
||||
|
||||
def copy(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||
|
||||
class peopleBufferController(baseBufferController):
|
||||
def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs):
|
||||
super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel")
|
||||
@@ -707,6 +795,22 @@ class peopleBufferController(baseBufferController):
|
||||
def interact(self):
|
||||
user.profileController(self.session, user=self.get_right_tweet()["screen_name"])
|
||||
|
||||
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||
menu = menus.peoplePanelMenu()
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.direct_message, menuitem=menu.reply)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.details, menuitem=menu.details)
|
||||
# widgetUtils.connect_event(menu, widgetUtils.MENU, self.lists, menuitem=menu.lists)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||
if pos != 0:
|
||||
self.buffer.PopupMenu(menu, pos)
|
||||
else:
|
||||
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||
|
||||
def details(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="user_details")
|
||||
|
||||
class searchBufferController(baseBufferController):
|
||||
def start_stream(self):
|
||||
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
||||
@@ -813,6 +917,8 @@ class trendsBufferController(bufferController):
|
||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.retweet, self.buffer.retweet)
|
||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.direct_message, self.buffer.dm)
|
||||
# widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply)
|
||||
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu)
|
||||
widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key)
|
||||
|
||||
def get_message(self):
|
||||
return self.compose_function(self.trends[self.buffer.list.get_selected()])[0]
|
||||
@@ -830,6 +936,48 @@ class trendsBufferController(bufferController):
|
||||
def interact(self, *args, **kwargs):
|
||||
self.searchfunction(value=self.get_message())
|
||||
|
||||
def show_menu(self, ev, pos=0, *args, **kwargs):
|
||||
menu = menus.trendsPanelMenu()
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view)
|
||||
widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy)
|
||||
if pos != 0:
|
||||
self.buffer.PopupMenu(menu, pos)
|
||||
else:
|
||||
self.buffer.PopupMenu(menu, ev.GetPosition())
|
||||
|
||||
def view(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="view_item")
|
||||
|
||||
def copy(self, *args, **kwargs):
|
||||
pub.sendMessage("execute-action", action="copy_to_clipboard")
|
||||
|
||||
def tweet_about_this_trend(self, *args, **kwargs):
|
||||
if self.buffer.list.get_count() == 0: return
|
||||
title = _(u"Tweet")
|
||||
caption = _(u"Write the tweet here")
|
||||
tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
|
||||
tweet.message.set_cursor_at_end()
|
||||
if tweet.message.get_response() == widgetUtils.OK:
|
||||
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
|
||||
text = tweet.message.get_text()
|
||||
if len(text) > 140 and tweet.message.get("long_tweet") == True:
|
||||
if tweet.image == None:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text)
|
||||
else:
|
||||
text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1)
|
||||
if tweet.image == None:
|
||||
call_threaded(self.session.api_call, call_name="update_status", status=text)
|
||||
else:
|
||||
call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image)
|
||||
if hasattr(tweet.message, "destroy"): tweet.message.destroy()
|
||||
|
||||
def show_menu_by_key(self, ev):
|
||||
if self.buffer.list.get_count() == 0:
|
||||
return
|
||||
if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU:
|
||||
self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition())
|
||||
|
||||
class conversationBufferController(searchBufferController):
|
||||
|
||||
def start_stream(self, start=False):
|
||||
|
@@ -27,7 +27,7 @@ class listsController(object):
|
||||
name = dialog.get("name")
|
||||
description = dialog.get("description")
|
||||
p = dialog.get("public")
|
||||
if public == True:
|
||||
if p == True:
|
||||
mode = "public"
|
||||
else:
|
||||
mode = "private"
|
||||
@@ -73,4 +73,4 @@ class listsController(object):
|
||||
def open_list_as_buffer(self, *args, **kwargs):
|
||||
if self.dialog.lista.get_count() == 0: return
|
||||
list = self.session.db["lists"][self.dialog.get_item()]
|
||||
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["slug"])
|
||||
pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list["name"])
|
@@ -90,12 +90,14 @@ class Controller(object):
|
||||
""" Gets the last valid buffer for an account.
|
||||
account str: A twitter username.
|
||||
The last valid buffer is the last buffer that contains a session object assigned."""
|
||||
# results = self.get_buffers_for_account(account)
|
||||
results = self.get_buffers_for_account(account)
|
||||
return self.view.search(results[-1].name, results[-1].account)
|
||||
|
||||
def get_buffers_for_account(self, account):
|
||||
results = []
|
||||
[results.append(i) for i in self.buffers if i.account == account and i.invisible == True]
|
||||
buffers = self.view.get_buffers()
|
||||
[results.append(self.search_buffer(i.name, i.account)) for i in buffers if i.account == account and (i.type != "account")]
|
||||
return results
|
||||
|
||||
def bind_stream_events(self):
|
||||
@@ -123,10 +125,10 @@ class Controller(object):
|
||||
log.debug("Binding other application events...")
|
||||
pub.subscribe(self.logout_account, "logout")
|
||||
pub.subscribe(self.login_account, "login")
|
||||
pub.subscribe(self.manage_stream_errors, "stream-error")
|
||||
pub.subscribe(self.manage_stream_errors, "streamError")
|
||||
pub.subscribe(self.create_new_buffer, "create-new-buffer")
|
||||
pub.subscribe(self.restart_streams, "restart-streams")
|
||||
|
||||
pub.subscribe(self.execute_action, "execute-action")
|
||||
if system == "Windows":
|
||||
pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed")
|
||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
||||
@@ -233,7 +235,6 @@ class Controller(object):
|
||||
self.create_ignored_session_buffer(session_.sessions[i])
|
||||
continue
|
||||
self.create_buffers(session_.sessions[i])
|
||||
self.set_buffer_positions(session_.sessions[i])
|
||||
|
||||
# Connection checker executed each minute.
|
||||
self.checker_function = RepeatingTimer(60, self.check_connection)
|
||||
@@ -244,6 +245,7 @@ class Controller(object):
|
||||
for i in session_.sessions:
|
||||
if session_.sessions[i].is_logged == False: continue
|
||||
self.start_buffers(session_.sessions[i])
|
||||
self.set_buffer_positions(session_.sessions[i])
|
||||
if config.app["app-settings"]["play_ready_sound"] == True:
|
||||
session_.sessions[session_.sessions.keys()[0]].sound.play("ready.ogg")
|
||||
if config.app["app-settings"]["speak_ready_msg"] == True:
|
||||
@@ -261,6 +263,7 @@ class Controller(object):
|
||||
for i in session_.sessions:
|
||||
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
||||
session.login()
|
||||
session.db = dict()
|
||||
self.create_buffers(session, False)
|
||||
self.start_buffers(session)
|
||||
|
||||
@@ -284,11 +287,11 @@ class Controller(object):
|
||||
self.buffers.append(mentions)
|
||||
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
elif i == 'dm':
|
||||
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg")
|
||||
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", sound="dm_received.ogg", full_text=True)
|
||||
self.buffers.append(dm)
|
||||
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
elif i == 'sent_dm':
|
||||
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
||||
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", full_text=True)
|
||||
self.buffers.append(sent_dm)
|
||||
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
elif i == 'sent_tweets':
|
||||
@@ -358,40 +361,27 @@ class Controller(object):
|
||||
buffer.start_stream()
|
||||
buffer.searchfunction = self.search
|
||||
self.buffers.append(buffer)
|
||||
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||
buffer.timer = RepeatingTimer(300, buffer.start_stream)
|
||||
buffer.timer.start()
|
||||
|
||||
def set_buffer_positions(self,session):
|
||||
"Sets positions for buffers if values exist in the database."
|
||||
for i in self.buffers:
|
||||
if str(i.name+"_pos") in session.db and hasattr(i.buffer,'list'):
|
||||
if i.account == session.db["user_name"] and session.db.has_key(i.name+"_pos") and hasattr(i.buffer,'list'):
|
||||
i.buffer.list.select_item(session.db[str(i.name+"_pos")])
|
||||
|
||||
def logout_account(self, session_id):
|
||||
for i in session_.sessions:
|
||||
if session_.sessions[i].session_id == session_id: session = session_.sessions[i]
|
||||
user = session.db["user_name"]
|
||||
self.destroy_buffer("home_timeline", user)
|
||||
self.destroy_buffer("mentions", user)
|
||||
self.destroy_buffer("direct_messages", user)
|
||||
self.destroy_buffer("sent_direct_messages", user)
|
||||
self.destroy_buffer("sent_tweets", user)
|
||||
self.destroy_buffer("favourites", user)
|
||||
self.destroy_buffer("followers", user)
|
||||
self.destroy_buffer("friends", user)
|
||||
self.destroy_buffer("blocked", user)
|
||||
self.destroy_buffer("muted", user)
|
||||
self.destroy_buffer("events", user)
|
||||
self.destroy_buffer("timelines", user)
|
||||
for i in session.settings["other_buffers"]["timelines"]:
|
||||
self.destroy_buffer("%s-timeline" % (i,), user)
|
||||
self.destroy_buffer("favs_timelines", user)
|
||||
self.destroy_buffer("searches", user)
|
||||
for i in session.settings["other_buffers"]["tweet_searches"]:
|
||||
self.destroy_buffer("%s-searchterm" % (i,), user)
|
||||
for i in session.settings["other_buffers"]["trending_topic_buffers"]:
|
||||
self.destroy_buffer("%s_tt" % (i,), user)
|
||||
delete_buffers = []
|
||||
for i in self.buffers:
|
||||
if i.account == user and i.name != user:
|
||||
delete_buffers.append(i.name)
|
||||
for i in delete_buffers:
|
||||
self.destroy_buffer(i, user)
|
||||
session.db = None
|
||||
|
||||
def destroy_buffer(self, buffer_name, account):
|
||||
buffer = self.search_buffer(buffer_name, account)
|
||||
@@ -559,6 +549,7 @@ class Controller(object):
|
||||
self.exit_()
|
||||
|
||||
def exit_(self, *args, **kwargs):
|
||||
for i in self.buffers: i.save_positions()
|
||||
log.debug("Exiting...")
|
||||
log.debug("Saving global configuration...")
|
||||
config.app.write()
|
||||
@@ -696,6 +687,9 @@ class Controller(object):
|
||||
msg = messages.viewTweet(tweet, tweetsList)
|
||||
elif buffer.type == "account" or buffer.type == "empty":
|
||||
return
|
||||
elif buffer.name == "sent_tweets":
|
||||
tweet, tweetsList = buffer.get_full_tweet()
|
||||
msg = messages.viewTweet(tweet, tweetsList)
|
||||
else:
|
||||
non_tweet = buffer.get_formatted_message()
|
||||
msg = messages.viewTweet(non_tweet, [], False)
|
||||
@@ -713,8 +707,7 @@ class Controller(object):
|
||||
users = [tweet["screen_name"]]
|
||||
dlg = dialogs.userSelection.selectUserDialog(users=users, default=default)
|
||||
if dlg.get_response() == widgetUtils.OK:
|
||||
buffer = self.get_best_buffer()
|
||||
usr = utils.if_user_exists(buffer.session.twitter.twitter, dlg.get_user())
|
||||
usr = utils.if_user_exists(buff.session.twitter.twitter, dlg.get_user())
|
||||
if usr != None:
|
||||
if usr["protected"] == True:
|
||||
if usr["following"] == False:
|
||||
@@ -723,32 +716,38 @@ class Controller(object):
|
||||
answer = commonMessageDialogs.protected_user()
|
||||
if answer == widgetUtils.NO: return
|
||||
if dlg.get_action() == "tweets":
|
||||
if dlg.get_user() in buffer.session.settings["other_buffers"]["timelines"]:
|
||||
if usr["statuses_count"] == 0:
|
||||
commonMessageDialogs.no_tweets()
|
||||
return
|
||||
if dlg.get_user() in buff.session.settings["other_buffers"]["timelines"]:
|
||||
commonMessageDialogs.timeline_exist()
|
||||
return
|
||||
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (dlg.get_user(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||
tl = buffersController.baseBufferController(self.view.nb, "get_user_timeline", "%s-timeline" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||
tl.start_stream()
|
||||
pos=self.view.search("timelines", buffer.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos)
|
||||
pos=self.view.search("timelines", buff.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos+1)
|
||||
# self.buffers.insert(pos+1, tl)
|
||||
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos)
|
||||
buffer.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
||||
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buffer.session)
|
||||
buff.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
|
||||
pub.sendMessage("restart-streams", streams=["timelinesStream"], session=buff.session)
|
||||
buffer.session.sound.play("create_timeline.ogg")
|
||||
else:
|
||||
if usr["favourites_count"] == 0:
|
||||
commonMessageDialogs.no_favs()
|
||||
return
|
||||
if dlg.get_user() in buffer.session.settings["other_buffers"]["favourites_timelines"]:
|
||||
commonMessageDialogs.timeline_exist()
|
||||
return
|
||||
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (dlg.get_user(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||
pos=self.view.search("favs_timelines", buffer.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos)
|
||||
tl = buffersController.baseBufferController(self.view.nb, "get_favorites", "%s-favorite" % (dlg.get_user(),), buff.session, buff.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
|
||||
pos=self.view.search("favs_timelines", buff.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos+1)
|
||||
# self.buffers.insert(pos+1, tl)
|
||||
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Favourites timeline for {}").format(dlg.get_user()), pos=pos)
|
||||
tl.start_stream()
|
||||
tl.timer = RepeatingTimer(300, tl.start_stream)
|
||||
tl.timer.start()
|
||||
buffer.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
||||
buffer.session.sound.play("create_timeline.ogg")
|
||||
buff.session.settings["other_buffers"]["favourites_timelines"].append(dlg.get_user())
|
||||
buff.session.sound.play("create_timeline.ogg")
|
||||
else:
|
||||
commonMessageDialogs.user_not_exist()
|
||||
|
||||
@@ -920,13 +919,11 @@ class Controller(object):
|
||||
|
||||
def left(self, *args, **kwargs):
|
||||
buff = self.view.get_current_buffer_pos()
|
||||
print buff
|
||||
buffer = self.get_current_buffer()
|
||||
if not hasattr(buffer.buffer, "list"):
|
||||
output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True)
|
||||
return
|
||||
if buff == self.get_first_buffer(buffer.account) or buff == 0:
|
||||
print "This is the last buffer"
|
||||
self.view.change_buffer(self.get_last_buffer(buffer.account))
|
||||
else:
|
||||
self.view.change_buffer(buff-1)
|
||||
@@ -1199,9 +1196,16 @@ class Controller(object):
|
||||
log.debug("Starting the streaming endpoint")
|
||||
session.start_streaming()
|
||||
|
||||
def set_positions(self):
|
||||
for i in session_.sessions:
|
||||
self.set_buffer_positions(i)
|
||||
|
||||
def manage_stream_errors(self, session):
|
||||
log.error("An error ocurred with the stream for the %s session. It will be destroyed" % (session,))
|
||||
log.debug(" Restarting %s session streams. It will be destroyed" % (session,))
|
||||
s = session_.sessions[session]
|
||||
for i in self.buffers:
|
||||
if i.invisible == True and i.session.session_id == s.session_id and i.type != "people":
|
||||
i.start_stream()
|
||||
s.listen_stream_error()
|
||||
|
||||
def check_connection(self):
|
||||
@@ -1249,7 +1253,8 @@ class Controller(object):
|
||||
return
|
||||
tl = buffersController.listBufferController(self.view.nb, "get_list_statuses", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]))
|
||||
buff.session.lists.append(tl)
|
||||
self.buffers.append(tl)
|
||||
pos=self.view.search("lists", buff.session.db["user_name"])
|
||||
self.insert_buffer(tl, pos)
|
||||
self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"]))
|
||||
tl.start_stream()
|
||||
buff.session.settings["other_buffers"]["lists"].append(create)
|
||||
@@ -1334,28 +1339,18 @@ class Controller(object):
|
||||
os.chdir("../../")
|
||||
|
||||
def insert_buffer(self, buffer, position):
|
||||
# print ref_buf.name, ref_buf.account
|
||||
# if ref_buf.account != buffer.account or ref_buf.type == "account" or type(ref_buf) == buffers.emptyPanel:
|
||||
buffers = self.get_buffers_for_account(buffer.account)
|
||||
# ref_buf = self.buffers[position+1]
|
||||
empty = True
|
||||
for i in buffers[position+1:]:
|
||||
if i.type == "account" or i.invisible == False:
|
||||
empty = True
|
||||
else:
|
||||
empty = False
|
||||
if empty == True:
|
||||
self.buffers.append(buffer)
|
||||
print "account"
|
||||
else:
|
||||
self.buffers.insert(position+1, buffer)
|
||||
for i in self.buffers:
|
||||
print i.name, i.account
|
||||
self.buffers.insert(position, buffer)
|
||||
|
||||
def copy_to_clipboard(self, *args, **kwargs):
|
||||
output.copy(self.get_current_buffer().get_message())
|
||||
output.speak(_(u"Copied"))
|
||||
|
||||
def repeat_item(self, *args, **kwargs):
|
||||
output.speak(self.get_current_buffer().get_message())
|
||||
|
||||
def execute_action(self, action):
|
||||
if hasattr(self, action):
|
||||
getattr(self, action)()
|
||||
|
||||
def __del__(self):
|
||||
config.app.write()
|
||||
|
||||
def change_buffer(self, bufferPosition):
|
||||
buff = self.buffers[bufferPosition]
|
||||
newPos = self.view.search(buff.name, buff.account)
|
||||
self.view.change_buffer(newPos)
|
@@ -25,6 +25,7 @@ class basicTweet(object):
|
||||
widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck)
|
||||
widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach)
|
||||
# if system == "Windows":
|
||||
# if messageType != "dm":
|
||||
widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor)
|
||||
self.text_processor()
|
||||
widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten)
|
||||
@@ -97,6 +98,7 @@ class basicTweet(object):
|
||||
checker = SpellChecker.spellchecker.spellChecker(text, "")
|
||||
if hasattr(checker, "fixed_text"):
|
||||
self.message.set_text(checker.fixed_text)
|
||||
self.message.text_focus()
|
||||
|
||||
def attach(self, *args, **kwargs):
|
||||
def completed_callback():
|
||||
@@ -109,13 +111,17 @@ class basicTweet(object):
|
||||
output.speak(_(u"Unable to upload the audio"))
|
||||
dlg.cleanup()
|
||||
dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
|
||||
self.message.text_focus()
|
||||
|
||||
class tweet(basicTweet):
|
||||
def __init__(self, session, title, caption, text, messageType="tweet", max=140):
|
||||
def __init__(self, session, title, caption, text, twishort_enabled, messageType="tweet", max=140):
|
||||
super(tweet, self).__init__(session, title, caption, text, messageType, max)
|
||||
self.image = None
|
||||
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image)
|
||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
if twishort_enabled == False:
|
||||
try: self.message.long_tweet.SetValue(False)
|
||||
except AttributeError: pass
|
||||
|
||||
def upload_image(self, *args, **kwargs):
|
||||
if self.message.get("upload_image") == _(u"Discard image"):
|
||||
@@ -127,14 +133,15 @@ class tweet(basicTweet):
|
||||
self.image = self.message.get_image()
|
||||
if self.image != None:
|
||||
self.message.set("upload_image", _(u"Discard image"))
|
||||
self.message.text_focus()
|
||||
|
||||
def autocomplete_users(self, *args, **kwargs):
|
||||
c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id)
|
||||
c.show_menu()
|
||||
|
||||
class reply(tweet):
|
||||
def __init__(self, session, title, caption, text, users=None):
|
||||
super(reply, self).__init__(session, title, caption, text, messageType="reply")
|
||||
def __init__(self, session, title, caption, text, twishort_enabled, users=None):
|
||||
super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply")
|
||||
self.users = users
|
||||
if self.users != None and len(self.users) > 1:
|
||||
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)
|
||||
@@ -148,7 +155,7 @@ class reply(tweet):
|
||||
|
||||
class dm(basicTweet):
|
||||
def __init__(self, session, title, caption, text):
|
||||
super(dm, self).__init__(session, title, caption, text, messageType="dm")
|
||||
super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000)
|
||||
widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
|
||||
def autocomplete_users(self, *args, **kwargs):
|
||||
|
@@ -34,7 +34,7 @@ class globalSettingsController(object):
|
||||
if ".keymap" not in i:
|
||||
continue
|
||||
try:
|
||||
res[config_utils.load_config(paths.app_path('keymaps/'+i))['info']['name']]=i
|
||||
res[i[:-7]] =i
|
||||
except:
|
||||
log.exception("Exception while loading keymap " + i)
|
||||
return res
|
||||
@@ -79,6 +79,8 @@ class globalSettingsController(object):
|
||||
self.needs_restart = True
|
||||
if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]:
|
||||
config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()]
|
||||
kmFile = open(paths.config_path("keymap.keymap"), "w")
|
||||
kmFile.close()
|
||||
self.needs_restart = True
|
||||
|
||||
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):
|
||||
|
@@ -1,10 +1,11 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from wxUI.dialogs import userActions
|
||||
from pubsub import pub
|
||||
import re
|
||||
import widgetUtils
|
||||
import output
|
||||
from wxUI.dialogs import userActions
|
||||
from pubsub import pub
|
||||
from twython import TwythonError
|
||||
from extra import autocompletionUsers
|
||||
|
||||
class userActionsController(object):
|
||||
def __init__(self, buffer, users=[], default="follow"):
|
||||
@@ -12,9 +13,14 @@ class userActionsController(object):
|
||||
self.buffer = buffer
|
||||
self.session = buffer.session
|
||||
self.dialog = userActions.UserActionsDialog(users, default)
|
||||
widgetUtils.connect_event(self.dialog.autocompletion, widgetUtils.BUTTON_PRESSED, self.autocomplete_users)
|
||||
if self.dialog.get_response() == widgetUtils.OK:
|
||||
self.process_action()
|
||||
|
||||
def autocomplete_users(self, *args, **kwargs):
|
||||
c = autocompletionUsers.completion.autocompletionUsers(self.dialog, self.session.session_id)
|
||||
c.show_menu("dm")
|
||||
|
||||
def process_action(self):
|
||||
action = self.dialog.get_action()
|
||||
user = self.dialog.get_user()
|
||||
|
@@ -67,11 +67,13 @@ class GalicianLocale(Locale):
|
||||
class BasqueLocale(Locale):
|
||||
names = ['eu', 'eu_eu']
|
||||
past = 'duela {0}'
|
||||
future = '{0}' # I don't know what's the right phrase in Basque for the future.
|
||||
future = '{0} igarota'
|
||||
|
||||
timeframes = {
|
||||
'now': 'Orain',
|
||||
'seconds': 'segundu',
|
||||
# 'second': 'segundu bat',
|
||||
'seconds': 'segundu batzuk', # without specifying a number.
|
||||
#'seconds': '{0} segundu', # specifying a number
|
||||
'minute': 'minutu bat',
|
||||
'minutes': '{0} minutu',
|
||||
'hour': 'ordu bat',
|
||||
|
30
src/keymaps/Chicken Nugget.keymap
Normal file
30
src/keymaps/Chicken Nugget.keymap
Normal file
@@ -0,0 +1,30 @@
|
||||
[info]
|
||||
name = string(default="Chicken Nugget")
|
||||
desc = string(default="Remaps TWBlue shortcuts to their equivalents in Christopher Toth's Chicken Nugget Twitter client.")
|
||||
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||
|
||||
[keymap]
|
||||
up = string(default="control+win+up")
|
||||
down = string(default="control+win+down")
|
||||
left = string(default="control+win+left")
|
||||
right = string(default="control+win+right")
|
||||
open_conversation = string(default="control+win+c")
|
||||
show_hide = string(default="control+win+w")
|
||||
post_tweet = string(default="control+win+t")
|
||||
post_reply = string(default="control+win+r")
|
||||
post_retweet = string(default="control+win+shift+t")
|
||||
send_dm = string(default="control+win+d")
|
||||
user_details = string(default="control+win+shift+u")
|
||||
exit = string(default="control+win+q")
|
||||
open_timeline = string(default="control+win+u")
|
||||
remove_buffer = string(default="control+win+backspace")
|
||||
audio = string(default="control+win+return")
|
||||
url = string(default="control+win+b")
|
||||
go_home = string(default="control+win+home")
|
||||
go_end = string(default="control+win+end")
|
||||
delete = string(default="control+win+delete")
|
||||
clear_buffer = string(default="control+win+shift+delete")
|
||||
repeat_item = string(default="control+win+space")
|
||||
copy_to_clipboard = string(default="control+win+shift+c")
|
||||
search = string(default="control+win+/")
|
||||
find = string(default="control+win+shift+/")
|
@@ -1,30 +0,0 @@
|
||||
[info]
|
||||
name = Chicken Nugget
|
||||
desc = Remaps TWBlue shortcuts to their equivalents in Christopher Toth's Chicken Nugget Twitter client.
|
||||
author = Bill Dengler <codeofdusk@gmail.com>
|
||||
|
||||
[keymap]
|
||||
up = control+win+up
|
||||
down = control+win+down
|
||||
left = control+win+left
|
||||
right = control+win+right
|
||||
open_conversation = control+win+c
|
||||
show_hide = control+win+w
|
||||
post_tweet = control+win+t
|
||||
post_reply = control+win+r
|
||||
post_retweet = control+win+shift+t
|
||||
send_dm = control+win+d
|
||||
user_details = control+win+shift+u
|
||||
exit = control+win+q
|
||||
open_timeline = control+win+u
|
||||
remove_buffer = control+win+backspace
|
||||
audio = control+win+return
|
||||
secondary_interact = control+win+b
|
||||
go_home = control+win+home
|
||||
go_end = control+win+end
|
||||
delete = control+win+delete
|
||||
clear_buffer = control+win+shift+delete
|
||||
repeat_item = control+win+space
|
||||
copy_to_clipboard = control+win+shift+c
|
||||
search = control+win+/
|
||||
find = control+win+shift+/
|
@@ -1,48 +1,49 @@
|
||||
[info]
|
||||
name = Qwitter
|
||||
desc = A keymap which emulates Qwitter as closely as possible.
|
||||
author = Bill Dengler <codeofdusk@gmail.com>
|
||||
name = string(default="Qwitter")
|
||||
desc = string(default="A keymap which emulates Qwitter as closely as possible.")
|
||||
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||
|
||||
[keymap]
|
||||
up = control+win+up
|
||||
down = control+win+down
|
||||
left = control+win+left
|
||||
right = control+win+right
|
||||
next_account = control+win+shift+right
|
||||
previous_account = control+win+shift+left
|
||||
show_hide = control+win+w
|
||||
post_tweet = control+win+n
|
||||
post_reply = control+win+r
|
||||
post_retweet = control+win+shift+r
|
||||
send_dm = control+win+d
|
||||
add_to_favourites = alt+win+f
|
||||
remove_from_favourites = alt+shift+win+f
|
||||
follow = control+win+l
|
||||
user_details = control+win+shift+;
|
||||
view_item = control+win+v
|
||||
exit = control+win+f4
|
||||
open_timeline = control+win+i
|
||||
remove_buffer = "control+win+'"
|
||||
audio = control+win+return
|
||||
volume_up = control+win+alt+up
|
||||
volume_down = control+win+alt+down
|
||||
go_home = control+win+home
|
||||
go_end = control+win+end
|
||||
go_page_up = control+win+pageup
|
||||
go_page_down = control+win+pagedown
|
||||
update_profile = control+win+shift+p
|
||||
delete = control+win+delete
|
||||
clear_buffer = control+win+shift+delete
|
||||
repeat_item = control+win+space
|
||||
copy_to_clipboard = control+win+shift+c
|
||||
add_to_list = control+win+alt+l
|
||||
remove_from_list = control+win+alt+shift+l
|
||||
toggle_buffer_mute = control+win+alt+m
|
||||
toggle_session_mute = control+win+m
|
||||
search = control+win+/
|
||||
find = control+win+shift+/
|
||||
edit_keystrokes = control+win+k
|
||||
view_user_lists = win+alt+shift+l
|
||||
reverse_geocode = control+win+g
|
||||
view_reverse_geocode = control+win+shift+g
|
||||
get_trending_topics = control+win+shift+t
|
||||
up = string(default="control+win+up")
|
||||
down = string(default="control+win+down")
|
||||
left = string(default="control+win+left")
|
||||
right = string(default="control+win+right")
|
||||
next_account = string(default="control+win+shift+right")
|
||||
previous_account = string(default="control+win+shift+left")
|
||||
show_hide = string(default="control+win+w")
|
||||
post_tweet = string(default="control+win+n")
|
||||
post_reply = string(default="control+win+r")
|
||||
post_retweet = string(default="control+win+shift+r")
|
||||
send_dm = string(default="control+win+d")
|
||||
add_to_favourites = string(default="alt+win+f")
|
||||
remove_from_favourites = string(default="alt+shift+win+f")
|
||||
follow = string(default="control+win+l")
|
||||
user_details = string(default="control+win+shift+;")
|
||||
view_item = string(default="control+win+v")
|
||||
exit = string(default="control+win+f4")
|
||||
open_timeline = string(default="control+win+i")
|
||||
remove_buffer = '''string(default="control+win+'")'''
|
||||
url = string(default="control+win+return")
|
||||
audio = string(default="control+win+shift+return")
|
||||
volume_up = string(default="control+win+alt+up")
|
||||
volume_down = string(default="control+win+alt+down")
|
||||
go_home = string(default="control+win+home")
|
||||
go_end = string(default="control+win+end")
|
||||
go_page_up = string(default="control+win+pageup")
|
||||
go_page_down = string(default="control+win+pagedown")
|
||||
update_profile = string(default="control+win+shift+p")
|
||||
delete = string(default="control+win+delete")
|
||||
clear_buffer = string(default="control+win+shift+delete")
|
||||
repeat_item = string(default="control+win+space")
|
||||
copy_to_clipboard = string(default="control+win+shift+c")
|
||||
add_to_list = string(default="control+win+alt+l")
|
||||
remove_from_list = string(default="control+win+alt+shift+l")
|
||||
toggle_buffer_mute = string(default="control+win+alt+m")
|
||||
toggle_session_mute = string(default="control+win+m")
|
||||
search = string(default="control+win+/")
|
||||
find = string(default="control+win+shift+/")
|
||||
edit_keystrokes = string(default="control+win+k")
|
||||
view_user_lists = string(default="win+alt+shift+l")
|
||||
reverse_geocode = string(default="control+win+g")
|
||||
view_reverse_geocode = string(default="control+win+shift+g")
|
||||
get_trending_topics = string(default="control+win+shift+t")
|
||||
|
@@ -1,52 +0,0 @@
|
||||
[info]
|
||||
name = Windows 10 (experimental)
|
||||
desc = A keymap with remapped modifiers for Windows 10 compatibility.
|
||||
author = Bill Dengler <codeofdusk@gmail.com>
|
||||
|
||||
[keymap]
|
||||
up = alt+win+up
|
||||
down = alt+win+down
|
||||
left = alt+win+left
|
||||
right = alt+win+right
|
||||
next_account = alt+win+shift+right
|
||||
previous_account = alt+win+shift+left
|
||||
open_conversation = alt+win+c
|
||||
show_hide = alt+win+w
|
||||
post_tweet = alt+win+n
|
||||
post_reply = alt+win+r
|
||||
post_retweet = alt+win+shift+r
|
||||
send_dm = alt+win+d
|
||||
add_to_favourites = alt+win+f
|
||||
remove_from_favourites = alt+shift+win+f
|
||||
follow = alt+win+s
|
||||
user_details = alt+win+shift+n
|
||||
view_item = alt+win+v
|
||||
exit = alt+win+f4
|
||||
open_timeline = alt+win+i
|
||||
remove_buffer = alt+win+shift+i
|
||||
audio = alt+win+return
|
||||
secondary_interact = alt+shift+win+return
|
||||
|
||||
volume_up = alt+win+shift+up
|
||||
go_home = alt+win+home
|
||||
volume_down = alt+win+shift+down
|
||||
go_end = alt+win+end
|
||||
go_page_up = alt+win+pageup
|
||||
go_page_down = alt+win+pagedown
|
||||
update_profile = alt+win+p
|
||||
delete = alt+win+delete
|
||||
clear_buffer = alt+win+shift+delete
|
||||
repeat_item = alt+win+space
|
||||
copy_to_clipboard = alt+win+shift+c
|
||||
add_to_list = alt+win+a
|
||||
remove_from_list = alt+win+shift+a
|
||||
toggle_buffer_mute = alt+win+shift+m
|
||||
toggle_session_mute = alt+win+m
|
||||
toggle_autoread = alt+win+e
|
||||
search = alt+win+-
|
||||
edit_keystrokes = alt+win+k
|
||||
view_user_lists = alt+win+l
|
||||
get_more_items = alt+win+pageup
|
||||
reverse_geocode = alt+win+g
|
||||
view_reverse_geocode = alt+win+shift+g
|
||||
get_trending_topics = alt+win+t
|
51
src/keymaps/Windows 10.keymap
Normal file
51
src/keymaps/Windows 10.keymap
Normal file
@@ -0,0 +1,51 @@
|
||||
[info]
|
||||
name = string(default="Windows 10")
|
||||
desc = string(default="A keymap with remapped modifiers for Windows 10 compatibility.")
|
||||
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||
|
||||
[keymap]
|
||||
up = string(default="alt+win+up")
|
||||
down = string(default="alt+win+down")
|
||||
left = string(default="alt+win+left")
|
||||
right = string(default="alt+win+right")
|
||||
next_account = string(default="alt+win+shift+right")
|
||||
previous_account = string(default="alt+win+shift+left")
|
||||
open_conversation = string(default="alt+win+c")
|
||||
show_hide = string(default="alt+win+w")
|
||||
post_tweet = string(default="alt+win+n")
|
||||
post_reply = string(default="control+win+r")
|
||||
post_retweet = string(default="alt+win+shift+r")
|
||||
send_dm = string(default="alt+win+d")
|
||||
add_to_favourites = string(default="alt+win+f")
|
||||
remove_from_favourites = string(default="alt+shift+win+f")
|
||||
follow = string(default="alt+win+s")
|
||||
user_details = string(default="alt+win+shift+n")
|
||||
view_item = string(default="alt+win+v")
|
||||
exit = string(default="alt+win+f4")
|
||||
open_timeline = string(default="alt+win+i")
|
||||
remove_buffer = string(default="alt+win+shift+i")
|
||||
url = string(default="alt+win+return")
|
||||
audio = string(default="alt+shift+win+return")
|
||||
volume_up = string(default="alt+win+shift+up")
|
||||
go_home = string(default="alt+win+home")
|
||||
volume_down = string(default="alt+win+shift+down")
|
||||
go_end = string(default="alt+win+end")
|
||||
go_page_up = string(default="alt+win+pageup")
|
||||
go_page_down = string(default="alt+win+pagedown")
|
||||
update_profile = string(default="alt+win+p")
|
||||
delete = string(default="alt+win+delete")
|
||||
clear_buffer = string(default="alt+win+shift+delete")
|
||||
repeat_item = string(default="alt+win+space")
|
||||
copy_to_clipboard = string(default="alt+win+shift+c")
|
||||
add_to_list = string(default="alt+win+a")
|
||||
remove_from_list = string(default="alt+win+shift+a")
|
||||
toggle_buffer_mute = string(default="alt+win+shift+m")
|
||||
toggle_session_mute = string(default="alt+win+m")
|
||||
toggle_autoread = string(default="alt+win+e")
|
||||
search = string(default="alt+win+-")
|
||||
edit_keystrokes = string(default="alt+win+k")
|
||||
view_user_lists = string(default="alt+win+l")
|
||||
get_more_items = string(default="alt+win+pageup")
|
||||
reverse_geocode = string(default="alt+win+g")
|
||||
view_reverse_geocode = string(default="alt+win+shift+g")
|
||||
get_trending_topics = string(default="alt+win+t")
|
@@ -1,54 +1,52 @@
|
||||
[info]
|
||||
name = Default
|
||||
desc = TWBlue's default keymap.
|
||||
author = Bill Dengler <codeofdusk@gmail.com>
|
||||
name = string(default="Default")
|
||||
desc = string(default="TWBlue's default keymap.")
|
||||
author = string(default="Bill Dengler <codeofdusk@gmail.com>")
|
||||
|
||||
[keymap]
|
||||
up = control+win+up
|
||||
down = control+win+down
|
||||
left = control+win+left
|
||||
right = control+win+right
|
||||
next_account = control+win+shift+right
|
||||
previous_account = control+win+shift+left
|
||||
open_conversation = control+win+c
|
||||
show_hide = control+win+m
|
||||
post_tweet = control+win+n
|
||||
post_reply = control+win+r
|
||||
post_retweet = control+win+shift+r
|
||||
send_dm = control+win+d
|
||||
add_to_favourites = alt+win+f
|
||||
remove_from_favourites = alt+shift+win+f
|
||||
follow = control+win+s
|
||||
user_details = control+win+alt+n
|
||||
view_item = control+win+v
|
||||
exit = control+win+f4
|
||||
open_timeline = control+win+i
|
||||
remove_buffer = control+win+shift+i
|
||||
audio = control+alt+win+return
|
||||
url = control+win+return
|
||||
volume_up = control+win+alt+up
|
||||
volume_down = control+win+alt+down
|
||||
go_home = control+win+home
|
||||
go_end = control+win+end
|
||||
go_page_up = control+win+pageup
|
||||
go_page_down = control+win+pagedown
|
||||
update_profile = alt+win+p
|
||||
delete = control+win+delete
|
||||
clear_buffer = control+win+shift+delete
|
||||
repeat_item = control+win+space
|
||||
copy_to_clipboard = control+win+c
|
||||
add_to_list = control+win+a
|
||||
remove_from_list = control+win+shift+a
|
||||
toggle_buffer_mute = control+win+shift+m
|
||||
toggle_session_mute = alt+win+m
|
||||
toggle_autoread = control+win+e
|
||||
search = control+win+-
|
||||
edit_keystrokes = control+win+k
|
||||
view_user_lists = control+win+l
|
||||
get_more_items = alt+win+pageup
|
||||
reverse_geocode = control+win+g
|
||||
view_reverse_geocode = control+win+shift+g
|
||||
get_trending_topics = control+win+t
|
||||
find = control+win+{
|
||||
secondary_interact = control+win+alt+return
|
||||
interact = control+win+return
|
||||
up = string(default="control+win+up")
|
||||
down = string(default="control+win+down")
|
||||
left = string(default="control+win+left")
|
||||
right = string(default="control+win+right")
|
||||
next_account = string(default="control+win+shift+right")
|
||||
previous_account = string(default="control+win+shift+left")
|
||||
open_conversation = string(default="control+win+c")
|
||||
show_hide = string(default="control+win+m")
|
||||
post_tweet = string(default="control+win+n")
|
||||
post_reply = string(default="control+win+r")
|
||||
post_retweet = string(default="control+win+shift+r")
|
||||
send_dm = string(default="control+win+d")
|
||||
add_to_favourites = string(default="alt+win+f")
|
||||
remove_from_favourites = string(default="alt+shift+win+f")
|
||||
follow = string(default="control+win+s")
|
||||
user_details = string(default="control+win+alt+n")
|
||||
view_item = string(default="control+win+v")
|
||||
exit = string(default="control+win+f4")
|
||||
open_timeline = string(default="control+win+i")
|
||||
remove_buffer = string(default="control+win+shift+i")
|
||||
audio = string(default="control+alt+win+return")
|
||||
url = string(default="control+win+return")
|
||||
volume_up = string(default="control+win+alt+up")
|
||||
volume_down = string(default="control+win+alt+down")
|
||||
go_home = string(default="control+win+home")
|
||||
go_end = string(default="control+win+end")
|
||||
go_page_up = string(default="control+win+pageup")
|
||||
go_page_down = string(default="control+win+pagedown")
|
||||
update_profile = string(default="alt+win+p")
|
||||
delete = string(default="control+win+delete")
|
||||
clear_buffer = string(default="control+win+shift+delete")
|
||||
repeat_item = string(default="control+win+space")
|
||||
copy_to_clipboard = string(default="control+win+shift+c")
|
||||
add_to_list = string(default="control+win+a")
|
||||
remove_from_list = string(default="control+win+shift+a")
|
||||
toggle_buffer_mute = string(default="control+win+shift+m")
|
||||
toggle_session_mute = string(default="alt+win+m")
|
||||
toggle_autoread = string(default="control+win+e")
|
||||
search = string(default="control+win+-")
|
||||
edit_keystrokes = string(default="control+win+k")
|
||||
view_user_lists = string(default="control+win+l")
|
||||
get_more_items = string(default="alt+win+pageup")
|
||||
reverse_geocode = string(default="control+win+g")
|
||||
view_reverse_geocode = string(default="control+win+shift+g")
|
||||
get_trending_topics = string(default="control+win+t")
|
||||
find = string(default="control+win+{")
|
||||
|
@@ -3,6 +3,7 @@ import widgetUtils
|
||||
import config
|
||||
import wx_ui
|
||||
import constants
|
||||
from pubsub import pub
|
||||
|
||||
class KeystrokeEditor(object):
|
||||
def __init__(self):
|
||||
@@ -14,6 +15,7 @@ class KeystrokeEditor(object):
|
||||
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)
|
||||
widgetUtils.connect_event(self.dialog.execute, widgetUtils.BUTTON_PRESSED, self.execute_action)
|
||||
self.dialog.get_response()
|
||||
|
||||
def edit_keystroke(self, *args, **kwargs):
|
||||
@@ -52,3 +54,7 @@ class KeystrokeEditor(object):
|
||||
wx_ui.no_key()
|
||||
return
|
||||
return "+".join(keys)
|
||||
|
||||
def execute_action(self, *args, **kwargs):
|
||||
action = self.dialog.actions[self.dialog.get_action()]
|
||||
pub.sendMessage("execute-action", action=action)
|
@@ -13,18 +13,20 @@ class keystrokeEditorDialog(baseDialog.BaseWXDialog):
|
||||
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)
|
||||
firstSizer.Add(keysText, 0, wx.ALL, 5)
|
||||
firstSizer.Add(self.keys.list, 0, wx.ALL, 5)
|
||||
self.edit = wx.Button(panel, -1, _(u"Edit"))
|
||||
self.edit.SetDefault()
|
||||
|
||||
self.execute = wx.Button(panel, -1, _(u"Execute action"))
|
||||
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)
|
||||
secondSizer.Add(self.edit, 0, wx.ALL, 5)
|
||||
secondSizer.Add(self.execute, 0, wx.ALL, 5)
|
||||
secondSizer.Add(close, 0, wx.ALL, 5)
|
||||
sizer.Add(firstSizer, 0, wx.ALL, 5)
|
||||
sizer.Add(secondSizer, 0, wx.ALL, 5)
|
||||
panel.SetSizer(sizer)
|
||||
self.SetClientSize(sizer.CalcMin())
|
||||
|
||||
def put_keystrokes(self, actions, keystrokes):
|
||||
for i in keystrokes:
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
10
src/main.py
10
src/main.py
@@ -25,6 +25,8 @@ from mysc.thread_utils import call_threaded
|
||||
import fixes
|
||||
#extra variables to control the temporal stdout and stderr, while the final files are opened. We understand that some errors could happen while all outputs are closed, so let's try to avoid it.
|
||||
import widgetUtils
|
||||
import webbrowser
|
||||
from wxUI import commonMessageDialogs
|
||||
if system == "Windows":
|
||||
from logger import logger
|
||||
from update import updater
|
||||
@@ -63,6 +65,8 @@ def setup():
|
||||
from sessionmanager import sessionManager
|
||||
app = widgetUtils.mainLoopObject()
|
||||
if system == "Windows":
|
||||
if config.app["app-settings"]["donation_dialog_displayed"] == False:
|
||||
donation()
|
||||
updater.do_update()
|
||||
sm = sessionManager.sessionManagerController()
|
||||
sm.fill_list()
|
||||
@@ -82,4 +86,10 @@ def setup():
|
||||
GLib.idle_add(r.start)
|
||||
app.run()
|
||||
|
||||
def donation():
|
||||
dlg = commonMessageDialogs.donation()
|
||||
if dlg == widgetUtils.YES:
|
||||
webbrowser.open_new_tab("http://twblue.es/?q=donate")
|
||||
config.app["app-settings"]["donation_dialog_displayed"] = True
|
||||
|
||||
setup()
|
||||
|
@@ -24,7 +24,7 @@ def setup ():
|
||||
except:
|
||||
return logging.exception("Output: Error during initialization.")
|
||||
|
||||
def Copy(text):
|
||||
def copy(text):
|
||||
import win32clipboard
|
||||
#Copies text to the clipboard.
|
||||
win32clipboard.OpenClipboard()
|
||||
|
@@ -60,7 +60,7 @@ class Session(object):
|
||||
if self.db.has_key(name) == False:
|
||||
self.db[name] = []
|
||||
for i in data:
|
||||
if utils.find_item(i["id"], self.db[name]) == None:
|
||||
if utils.find_item(i["id"], self.db[name]) == None and utils.is_allowed(i, self.settings["twitter"]["ignored_clients"]) == True:
|
||||
if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i)
|
||||
else: self.db[name].insert(0, i)
|
||||
num = num+1
|
||||
@@ -119,7 +119,8 @@ class Session(object):
|
||||
# self.settings = None
|
||||
|
||||
def init_sound(self):
|
||||
self.sound = sound.soundSystem(self.settings["sound"])
|
||||
try: self.sound = sound.soundSystem(self.settings["sound"])
|
||||
except: pass
|
||||
|
||||
@_require_configuration
|
||||
def login(self, verify_credentials=True):
|
||||
@@ -344,6 +345,7 @@ class Session(object):
|
||||
self.logged = False
|
||||
self.twitter = twitter.twitter.twitter()
|
||||
self.login(False)
|
||||
pub.sendMessage("streamError", session=self.session_id)
|
||||
if self.reconnection_function_active == True: return
|
||||
self.reconnection_function_active = True
|
||||
if not hasattr(self, "main_stream"):
|
||||
@@ -381,10 +383,11 @@ class Session(object):
|
||||
if type(key) != str and type(key) != unicode:
|
||||
output.speak("Uh oh, while shelving the database, a key of type " + str(type(key)) + " has been found. It will be converted to type str, but this will cause all sorts of problems on deshelve. Please bring this to the attention of the " + application.name + " developers immediately. More information about the error will be written to the error log.",True)
|
||||
log.error("Uh oh, " + str(key) + " is of type " + str(type(key)) + "!")
|
||||
# Convert unicode objects to UTF-8 strings before shelve these objects.
|
||||
if type(value) == list and self.settings["general"]["persist_size"] != -1 and len(value) > self.settings["general"]["persist_size"]:
|
||||
shelf[str(key)]=value[self.settings["general"]["persist_size"]:]
|
||||
shelf[str(key.encode("utf-8"))]=value[self.settings["general"]["persist_size"]:]
|
||||
else:
|
||||
shelf[str(key)]=value
|
||||
shelf[str(key.encode("utf-8"))]=value
|
||||
shelf.close()
|
||||
except:
|
||||
output.speak("An exception occurred while shelving the " + application.name + " database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the " + application.name + " developers.",True)
|
||||
@@ -401,7 +404,7 @@ class Session(object):
|
||||
try:
|
||||
shelf=shelve.open(paths.config_path(shelfname),'c')
|
||||
for key,value in shelf.items():
|
||||
self.db[unicode(key)]=value
|
||||
self.db[key]=value
|
||||
shelf.close()
|
||||
except:
|
||||
output.speak("An exception occurred while deshelving the " + application.name + " database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the " + application.name + " developers.",True)
|
||||
|
@@ -28,7 +28,7 @@ class twitter(object):
|
||||
|
||||
def authorise(self, settings):
|
||||
authorisationHandler.logged = False
|
||||
port = random.randint(30000, 66000)
|
||||
port = random.randint(30000, 65535)
|
||||
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', port), authorisationHandler.handler)
|
||||
if config.app["proxy"]["server"] != "" and config.app["proxy"]["port"] != "":
|
||||
args = {"proxies": {"http": "http://{0}:{1}".format(config.app["proxy"]["server"], config.app["proxy"]["port"]),
|
||||
|
@@ -32,7 +32,7 @@ def find_item(id, listItem):
|
||||
|
||||
def find_list(name, lists):
|
||||
for i in range(0, len(lists)):
|
||||
if lists[i]["slug"] == name: return lists[i]["id"]
|
||||
if lists[i]["name"] == name: return lists[i]["id"]
|
||||
|
||||
def find_previous_reply(id, listItem):
|
||||
for i in range(0, len(listItem)):
|
||||
|
@@ -7,6 +7,9 @@ import os
|
||||
import platform
|
||||
import requests
|
||||
import tempfile
|
||||
from wxUI import commonMessageDialogs
|
||||
import widgetUtils
|
||||
import webbrowser
|
||||
try:
|
||||
import czipfile as zipfile
|
||||
except ImportError:
|
||||
@@ -20,13 +23,14 @@ def perform_update(endpoint, current_version, app_name='', password=None, update
|
||||
if not available_update:
|
||||
logger.debug("No update available")
|
||||
return False
|
||||
available_version = available_update['current_version']
|
||||
if not str(available_version) > str(current_version) or platform.system()+platform.architecture()[0][:2] not in available_update['downloads']:
|
||||
available_version = float(available_update['current_version'])
|
||||
if not float(available_version) > float(current_version) or platform.system()+platform.architecture()[0][:2] not in available_update['downloads']:
|
||||
logger.debug("No update for this architecture")
|
||||
return False
|
||||
available_description = available_update.get('description', None)
|
||||
update_url = available_update ['downloads'][platform.system()+platform.architecture()[0][:2]]
|
||||
logger.info("A new update is available. Version %s" % available_version)
|
||||
donation()
|
||||
if callable(update_available_callback) and not update_available_callback(version=available_version, description=available_description): #update_available_callback should return a falsy value to stop the process
|
||||
logger.info("User canceled update.")
|
||||
return
|
||||
@@ -114,3 +118,8 @@ def call_callback(callback, *args, **kwargs):
|
||||
callback(*args, **kwargs)
|
||||
# except:
|
||||
# logger.exception("Failed calling callback %r with args %r and kwargs %r" % (callback, args, kwargs))
|
||||
|
||||
def donation():
|
||||
dlg = commonMessageDialogs.donation()
|
||||
if dlg == widgetUtils.YES:
|
||||
webbrowser.open_new_tab("http://twblue.es/?q=donate")
|
@@ -1,4 +1,7 @@
|
||||
import wx
|
||||
import paths
|
||||
import languageHandler
|
||||
import sys
|
||||
|
||||
toolkit = "wx"
|
||||
|
||||
@@ -108,6 +111,15 @@ class mainLoopObject(wx.App):
|
||||
|
||||
def __init__(self):
|
||||
self.app = wx.App()
|
||||
self.lc = wx.Locale()
|
||||
lang=languageHandler.getLanguage()
|
||||
wxLang=self.lc.FindLanguageInfo(lang)
|
||||
if not wxLang and '_' in lang:
|
||||
wxLang=self.lc.FindLanguageInfo(lang.split('_')[0])
|
||||
if hasattr(sys,'frozen'):
|
||||
self.lc.AddCatalogLookupPathPrefix(paths.app_path("locales"))
|
||||
if wxLang:
|
||||
self.lc.Init(wxLang.Language)
|
||||
|
||||
def run(self):
|
||||
self.app.MainLoop()
|
||||
|
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import wx
|
||||
import application
|
||||
|
||||
def retweet_as_link(parent):
|
||||
return wx.MessageDialog(parent, _(u"This retweet is over 140 characters. Would you like to post it as a mention to the poster with your comments and a link to the original tweet?"), application.name, wx.YES_NO|wx.ICON_QUESTION).ShowModal()
|
||||
|
||||
@@ -8,7 +9,7 @@ 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()
|
||||
|
||||
def delete_tweet_dialog(parent):
|
||||
return wx.MessageDialog(parent, _(u"Do you really want to delete this message? It will be deleted from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO).ShowModal()
|
||||
return wx.MessageDialog(parent, _(u"Do you really want to delete this tweet? It will be deleted from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO).ShowModal()
|
||||
|
||||
def exit_dialog(parent):
|
||||
dlg = wx.MessageDialog(parent, _(u"Do you really want to close {0}?").format(application.name,), _(u"Exit"), wx.YES_NO|wx.ICON_QUESTION)
|
||||
@@ -18,10 +19,10 @@ def needs_restart():
|
||||
wx.MessageDialog(None, _(u" {0} must be restarted for these changes to take effect.").format(application.name,), _("Restart {0} ").format(application.name,), wx.OK).ShowModal()
|
||||
|
||||
def delete_user_from_db():
|
||||
return wx.MessageDialog(None, _(u"Are you sure you want to delete this user from the database? This user will not appear on the autocomplete results anymore."), _(u"Confirm"), wx.YES_NO|wx.ICON_QUESTION).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"Are you sure you want to delete this user from the database? This user will not appear in autocomplete results anymore."), _(u"Confirm"), wx.YES_NO|wx.ICON_QUESTION).ShowModal()
|
||||
|
||||
def get_ignored_client():
|
||||
entry = wx.TextEntryDialog(None, _(u"Enter the name of the client here"), _(u"Add a new ignored client"))
|
||||
entry = wx.TextEntryDialog(None, _(u"Enter the name of the client : "), _(u"Add client"))
|
||||
if entry.ShowModal() == wx.ID_OK:
|
||||
return entry.GetValue()
|
||||
return None
|
||||
@@ -31,19 +32,29 @@ def clear_list():
|
||||
return dlg.ShowModal()
|
||||
|
||||
def remove_buffer():
|
||||
return wx.MessageDialog(None, _(u"Do you really want to delete this timeline?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"Do you really want to destroy this buffer?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal()
|
||||
|
||||
def user_not_exist():
|
||||
return wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"That user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def timeline_exist():
|
||||
return wx.MessageDialog(None, _(u"There's currently a timeline for this user. You are not able to open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"A timeline for this user already exists. You can't open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def no_tweets():
|
||||
return wx.MessageDialog(None, _(u"This user has no tweets. You can't open a timeline for this user"), _(u"Error!"), wx.ICON_ERROR).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"This user has no tweets, so you can't open a timeline for them."), _(u"Error!"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def protected_user():
|
||||
return wx.MessageDialog(None, _(u"This is a protected Twitter user. It means you can not open a timeline using the Streaming API. The user's tweets will not update due to a twitter policy. Do you want to continue?"), _(u"Warning"), wx.ICON_WARNING|wx.YES_NO).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"This is a protected Twitter user, which means you can't open a timeline using the Streaming API. The user's tweets will not update due to a twitter policy. Do you want to continue?"), _(u"Warning"), wx.ICON_WARNING|wx.YES_NO).ShowModal()
|
||||
|
||||
def no_following():
|
||||
return wx.MessageDialog(None, _(u"This is a protected user account, you need follow to this user for viewing your tweets or favourites."), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
return wx.MessageDialog(None, _(u"This is a protected user account, you need to follow this user to view their tweets or favorites."), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def donation():
|
||||
dlg = wx.MessageDialog(None, _(u"If you like {0} we need your help to keep it going. Help us by donating to the project. This will help us pay for the server, the domain and some other things to ensure that {0} will be actively maintained. Your donation will give us the means to continue the development of {0}, and to keep {0} free. Would you like to donate now?").format(application.name), _(u"We need your help"), wx.ICON_QUESTION|wx.YES_NO)
|
||||
return dlg.ShowModal()
|
||||
|
||||
def no_tweets():
|
||||
return wx.MessageDialog(None, _(u"This user has no tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
||||
def no_favs():
|
||||
return wx.MessageDialog(None, _(u"This user has no favorited tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
|
||||
|
@@ -5,7 +5,6 @@ import widgetUtils
|
||||
class textLimited(widgetUtils.BaseDialog):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(textLimited, self).__init__(parent=None, *args, **kwargs)
|
||||
self.shift=False
|
||||
def createTextArea(self, message="", text=""):
|
||||
self.panel = wx.Panel(self)
|
||||
self.label = wx.StaticText(self.panel, -1, message)
|
||||
@@ -16,8 +15,7 @@ class textLimited(widgetUtils.BaseDialog):
|
||||
# dc.SetFont(font)
|
||||
# x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
|
||||
# self.text.SetSize((x, y))
|
||||
self.Bind(wx.EVT_TEXT_ENTER, self.on_enter)
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys)
|
||||
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text)
|
||||
self.text.SetFocus()
|
||||
self.textBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.textBox.Add(self.label, 0, wx.ALL, 5)
|
||||
@@ -46,14 +44,11 @@ class textLimited(widgetUtils.BaseDialog):
|
||||
def onSelect(self, ev):
|
||||
self.text.SelectAll()
|
||||
|
||||
def on_enter(self,event):
|
||||
if self.shift==False and hasattr(self,'okButton'):
|
||||
return wx.PostEvent(self.okButton.GetEventHandler(),wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK))
|
||||
def handle_keys(self, event):
|
||||
shift=event.ShiftDown()
|
||||
if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'okButton'):
|
||||
wx.PostEvent(self.okButton.GetEventHandler(), wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK))
|
||||
else:
|
||||
return self.text.WriteText('\n')
|
||||
|
||||
def handle_keys(self,event):
|
||||
self.shift=event.ShiftDown()
|
||||
event.Skip()
|
||||
|
||||
def set_cursor_at_end(self):
|
||||
@@ -221,6 +216,7 @@ class dm(textLimited):
|
||||
self.buttonsBox3.Add(cancelButton, 0, wx.ALL, 5)
|
||||
self.mainBox.Add(self.buttonsBox3, 0, wx.ALL, 5)
|
||||
self.panel.SetSizer(self.mainBox)
|
||||
# self.SetClientSize(self.mainBox.CalcMin())
|
||||
|
||||
def __init__(self, title, message, users):
|
||||
super(dm, self).__init__()
|
||||
|
@@ -10,8 +10,10 @@ class UserActionsDialog(wx.Dialog):
|
||||
userLabel = wx.StaticText(panel, -1, _(u"User"))
|
||||
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0])
|
||||
self.cb.SetFocus()
|
||||
self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users"))
|
||||
userSizer.Add(userLabel, 0, wx.ALL, 5)
|
||||
userSizer.Add(self.cb, 0, wx.ALL, 5)
|
||||
userSizer.Add(self.autocompletion, 0, wx.ALL, 5)
|
||||
actionSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
label2 = wx.StaticText(panel, -1, _(u"Action"))
|
||||
self.follow = wx.RadioButton(panel, -1, _(u"Follow"), style=wx.RB_GROUP)
|
||||
@@ -79,3 +81,9 @@ class UserActionsDialog(wx.Dialog):
|
||||
|
||||
def get_user(self):
|
||||
return self.cb.GetValue()
|
||||
|
||||
def get_position(self):
|
||||
return self.cb.GetPosition()
|
||||
|
||||
def popup_menu(self, menu):
|
||||
self.PopupMenu(menu, self.cb.GetPosition())
|
||||
|
@@ -10,8 +10,10 @@ class selectUserDialog(wx.Dialog):
|
||||
userLabel = wx.StaticText(panel, -1, _(u"User"))
|
||||
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0])
|
||||
self.cb.SetFocus()
|
||||
self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users"))
|
||||
userSizer.Add(userLabel, 0, wx.ALL, 5)
|
||||
userSizer.Add(self.cb, 0, wx.ALL, 5)
|
||||
userSizer.Add(self.autocompletion, 0, wx.ALL, 5)
|
||||
actionSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
label2 = wx.StaticText(panel, -1, _(u"Buffer type"))
|
||||
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
|
||||
@@ -49,3 +51,9 @@ class selectUserDialog(wx.Dialog):
|
||||
|
||||
def get_user(self):
|
||||
return self.cb.GetValue()
|
||||
|
||||
def get_position(self):
|
||||
return self.cb.GetPosition()
|
||||
|
||||
def popup_menu(self, menu):
|
||||
self.PopupMenu(menu, self.cb.GetPosition())
|
||||
|
@@ -26,8 +26,10 @@ class selectUserDialog(baseDialog.BaseWXDialog):
|
||||
userSizer = wx.BoxSizer()
|
||||
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize)
|
||||
self.cb.SetFocus()
|
||||
self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users"))
|
||||
userSizer.Add(wx.StaticText(panel, -1, _(u"User")), 0, wx.ALL, 5)
|
||||
userSizer.Add(self.cb)
|
||||
userSizer.Add(self.cb, 0, wx.ALL, 5)
|
||||
userSizer.Add(self.autocompletion, 0, wx.ALL, 5)
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
|
||||
ok.SetDefault()
|
||||
|
95
src/wxUI/menus.py
Normal file
95
src/wxUI/menus.py
Normal file
@@ -0,0 +1,95 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import wx
|
||||
|
||||
class basePanelMenu(wx.Menu):
|
||||
def __init__(self):
|
||||
super(basePanelMenu, self).__init__()
|
||||
self.retweet = wx.MenuItem(self, wx.NewId(), _(u"&Retweet"))
|
||||
self.AppendItem(self.retweet)
|
||||
self.reply = wx.MenuItem(self, wx.NewId(), _(u"Re&ply"))
|
||||
self.AppendItem(self.reply)
|
||||
self.fav = wx.MenuItem(self, wx.NewId(), _(u"Add to &favourites"))
|
||||
self.AppendItem(self.fav)
|
||||
self.unfav = wx.MenuItem(self, wx.NewId(), _(u"Remove from favo&urites"))
|
||||
self.AppendItem(self.unfav)
|
||||
self.openUrl = wx.MenuItem(self, wx.NewId(), _(u"&Open URL"))
|
||||
self.AppendItem(self.openUrl)
|
||||
self.play = wx.MenuItem(self, wx.NewId(), _(u"&Play audio"))
|
||||
self.AppendItem(self.play)
|
||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show tweet"))
|
||||
self.AppendItem(self.view)
|
||||
self.copy = wx.MenuItem(self, wx.NewId(), _(u"&Copy to clipboard"))
|
||||
self.AppendItem(self.copy)
|
||||
self.remove = wx.MenuItem(self, wx.NewId(), _(u"&Delete"))
|
||||
self.AppendItem(self.remove)
|
||||
self.userActions = wx.MenuItem(self, wx.NewId(), _(u"&User actions..."))
|
||||
self.AppendItem(self.userActions)
|
||||
|
||||
class dmPanelMenu(wx.Menu):
|
||||
def __init__(self):
|
||||
super(dmPanelMenu, self).__init__()
|
||||
self.reply = wx.MenuItem(self, wx.NewId(), _(u"Re&ply"))
|
||||
self.AppendItem(self.reply)
|
||||
self.openUrl = wx.MenuItem(self, wx.NewId(), _(u"&Open URL"))
|
||||
self.AppendItem(self.openUrl)
|
||||
self.play = wx.MenuItem(self, wx.NewId(), _(u"&Play audio"))
|
||||
self.AppendItem(self.play)
|
||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show direct message"))
|
||||
self.AppendItem(self.view)
|
||||
self.copy = wx.MenuItem(self, wx.NewId(), _(u"&Copy to clipboard"))
|
||||
self.AppendItem(self.copy)
|
||||
self.remove = wx.MenuItem(self, wx.NewId(), _(u"&Delete"))
|
||||
self.AppendItem(self.remove)
|
||||
self.userActions = wx.MenuItem(self, wx.NewId(), _(u"&User actions..."))
|
||||
self.AppendItem(self.userActions)
|
||||
|
||||
class sentPanelMenu(wx.Menu):
|
||||
def __init__(self):
|
||||
super(sentPanelMenu, self).__init__()
|
||||
self.openUrl = wx.MenuItem(self, wx.NewId(), _(u"&Open URL"))
|
||||
self.AppendItem(self.openUrl)
|
||||
self.play = wx.MenuItem(self, wx.NewId(), _(u"&Play audio"))
|
||||
self.AppendItem(self.play)
|
||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show tweet"))
|
||||
self.AppendItem(self.view)
|
||||
self.copy = wx.MenuItem(self, wx.NewId(), _(u"&Copy to clipboard"))
|
||||
self.AppendItem(self.copy)
|
||||
self.remove = wx.MenuItem(self, wx.NewId(), _(u"&Delete"))
|
||||
self.AppendItem(self.remove)
|
||||
|
||||
class eventsPanelMenu(wx.Menu):
|
||||
def __init__(self):
|
||||
super(eventsPanelMenu, self).__init__()
|
||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show event"))
|
||||
self.AppendItem(self.view)
|
||||
self.copy = wx.MenuItem(self, wx.NewId(), _(u"&Copy to clipboard"))
|
||||
self.AppendItem(self.copy)
|
||||
self.remove = wx.MenuItem(self, wx.NewId(), _(u"&Delete"))
|
||||
self.AppendItem(self.remove)
|
||||
|
||||
class peoplePanelMenu(wx.Menu):
|
||||
def __init__(self):
|
||||
super(peoplePanelMenu, self).__init__()
|
||||
self.reply = wx.MenuItem(self, wx.NewId(), _(u"Direct &message"))
|
||||
self.AppendItem(self.reply)
|
||||
self.lists = wx.MenuItem(self, wx.NewId(), _(u"&View lists"))
|
||||
self.AppendItem(self.lists)
|
||||
self.lists.Enable(False)
|
||||
self.details = wx.MenuItem(self, wx.NewId(), _(u"Show user &profile"))
|
||||
self.AppendItem(self.details)
|
||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show user"))
|
||||
self.AppendItem(self.view)
|
||||
self.copy = wx.MenuItem(self, wx.NewId(), _(u"&Copy to clipboard"))
|
||||
self.AppendItem(self.copy)
|
||||
self.userActions = wx.MenuItem(self, wx.NewId(), _(u"&User actions..."))
|
||||
self.AppendItem(self.userActions)
|
||||
|
||||
class trendsPanelMenu(wx.Menu):
|
||||
def __init__(self):
|
||||
super(trendsPanelMenu, self).__init__()
|
||||
self.tweetThisTrend = wx.MenuItem(self, wx.NewId(), _(u"&Tweet about this trend"))
|
||||
self.AppendItem(self.tweetThisTrend)
|
||||
self.view = wx.MenuItem(self, wx.NewId(), _(u"&Show item"))
|
||||
self.AppendItem(self.view)
|
||||
self.copy = wx.MenuItem(self, wx.NewId(), _(u"&Copy to clipboard"))
|
||||
self.AppendItem(self.copy)
|
@@ -126,6 +126,8 @@ class mainFrame(wx.Frame):
|
||||
self.SetClientSize(self.sizer.CalcMin())
|
||||
# print self.GetSize()
|
||||
|
||||
def get_buffers(self):
|
||||
return [self.nb.GetPage(i) for i in range(0, self.nb.GetPageCount())]
|
||||
|
||||
def search(self, name_, account):
|
||||
for i in range(0, self.nb.GetPageCount()):
|
||||
|
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2015-07-03 17:23+Hora de verano central (M<>xico)\n"
|
||||
"POT-Creation-Date: 2015-08-04 13:37+Hora de verano central (M<>xico)\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
1426
tools/twblue.pot
1426
tools/twblue.pot
File diff suppressed because it is too large
Load Diff
Submodule windows-dependencies updated: 0f65f42c9f...4d106f04f7
Reference in New Issue
Block a user