Compare commits

...

26 Commits

Author SHA1 Message Date
53a9f04155 New snapshot 2015-08-10 09:28:47 -05:00
100f483a86 List with special characters are handled properly 2015-08-10 09:26:07 -05:00
bad468560a Saving unicode keys as string objects in cache database 2015-08-10 09:24:46 -05:00
eb0cf62a54 A better way to save keymaps 2015-08-10 09:21:51 -05:00
a016932ac7 Timelines fix 2015-08-08 09:42:55 -05:00
1706414171 Timelines order improvements 2015-08-07 16:44:33 -05:00
5f963aa66b Modified windows 10 keymap 2015-08-07 14:05:22 -05:00
25578e4fc6 Fixed #59 2015-08-07 09:05:59 -05:00
faec92ce6c Stream connection improvements 2015-08-06 13:54:26 -05:00
313e725ff2 Autocompletion now works in the actions dialogue 2015-08-06 13:16:55 -05:00
3f82a51ef9 Added a new contributor 2015-08-06 12:07:30 -05:00
d26ab9b910 Fixed bug when opening multiple timelines 2015-08-06 12:03:40 -05:00
aa42e056c0 Updated translation templates 2015-08-04 13:40:16 -05:00
fa6592ed1a Fixed a string 2015-08-04 13:39:57 -05:00
11b06accbb Merge pull request #61 from codeofdusk/stringcleanup
String Cleanup
2015-08-04 13:27:50 -05:00
Sukil Etxenike
915eb5802f Fixed Basque locale 2015-08-02 00:04:04 +02:00
Bill Dengler
4e943c7bee String cleanup. 2015-07-30 14:15:26 -04:00
Bill Dengler
692d75562e String cleanup. 2015-07-30 14:03:52 -04:00
4cce6d4318 Bugfixes 2015-07-30 11:19:20 -05:00
e55e15466d Fixed some bugs 2015-07-30 09:06:56 -05:00
370340de0b Twishort preferences are saved 2015-07-29 14:47:14 -05:00
10bc483887 Added a donation dialogue in some parts of the program 2015-07-29 14:05:26 -05:00
f66b2ccbad Added repeat item option to invisible interface 2015-07-29 13:45:57 -05:00
6460c20a97 Added copy to clipboard option 2015-07-29 08:40:07 -05:00
9f2c240fc1 Removed saving position in database for now 2015-07-17 17:23:30 -05:00
a4cbbfcb9f TWBlue does not break a word in multiline text 2015-07-13 17:39:02 -05:00
33 changed files with 726 additions and 1267 deletions

View File

@@ -34,3 +34,4 @@ Holly Scott-Gardner
Anibal Hernández Anibal Hernández
Sussan Leiva Sussan Leiva
Brian Hartgen Brian Hartgen
PEDRO REINA COLOBON

View File

@@ -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"""* 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"""* 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"""* 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"""
""")) """))
documentation.append(_(u"""##### Tweet menu""")) documentation.append(_(u"""##### Tweet menu"""))

View File

@@ -36,6 +36,7 @@ autoread_buffers = list(default=list(mentions, direct_messages, events))
spelling_language = string(default="") spelling_language = string(default="")
save_followers_in_autocompletion_db = boolean(default=False) save_followers_in_autocompletion_db = boolean(default=False)
save_friends_in_autocompletion_db = boolean(default=False) save_friends_in_autocompletion_db = boolean(default=False)
twishort_enabled = boolean(default=False)
[services] [services]
pocket_access_token = string(default="") pocket_access_token = string(default="")

View File

@@ -14,6 +14,7 @@ play_ready_sound = boolean(default=True)
speak_ready_msg = boolean(default=True) speak_ready_msg = boolean(default=True)
log_level = string(default="error") log_level = string(default="error")
load_keymap = string(default="default.keymap") load_keymap = string(default="default.keymap")
donation_dialog_displayed = boolean(default=False)
[proxy] [proxy]
server = string(default="") server = string(default="")

View File

@@ -5,7 +5,7 @@ if snapshot == False:
version = "0.80" version = "0.80"
update_url = 'http://twblue.es/updates/twblue_ngen.json' update_url = 'http://twblue.es/updates/twblue_ngen.json'
else: else:
version = "9.9" version = "10.2"
update_url = 'http://twblue.es/updates/snapshots_ngen.json' update_url = 'http://twblue.es/updates/snapshots_ngen.json'
author = u"Manuel Cortéz, Bill Dengler" author = u"Manuel Cortéz, Bill Dengler"
authorEmail = "manuel@manuelcortez.net" authorEmail = "manuel@manuelcortez.net"

View File

@@ -16,4 +16,4 @@ def setup ():
app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC)) app = config_utils.load_config(paths.config_path(MAINFILE), paths.app_path(MAINSPEC))
log.debug("Loading keymap...") log.debug("Loading keymap...")
global 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']))

View File

@@ -127,8 +127,9 @@ class bufferController(object):
def post_tweet(self, *args, **kwargs): def post_tweet(self, *args, **kwargs):
title = _(u"Tweet") title = _(u"Tweet")
caption = _(u"Write the tweet here") 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: if tweet.message.get_response() == widgetUtils.OK:
self.session.settings["mysc"]["twishort_enabled"] = tweet.message.long_tweet.GetValue()
text = tweet.message.get_text() text = tweet.message.get_text()
if len(text) > 140 and tweet.message.get("long_tweet") == True: if len(text) > 140 and tweet.message.get("long_tweet") == True:
if tweet.image == None: if tweet.image == None:
@@ -374,8 +375,9 @@ class baseBufferController(bufferController):
screen_name = tweet["user"]["screen_name"] screen_name = tweet["user"]["screen_name"]
id = tweet["id"] id = tweet["id"]
users = utils.get_all_mentioned(tweet, self.session.db) 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: if message.message.get_response() == widgetUtils.OK:
self.session.settings["mysc"]["twishort_enabled"] = message.message.long_tweet.GetValue()
text = message.message.get_text() text = message.message.get_text()
if len(text) > 140 and message.message.get("long_tweet") == True: if len(text) > 140 and message.message.get("long_tweet") == True:
if message.image == None: if message.image == None:
@@ -421,7 +423,7 @@ class baseBufferController(bufferController):
self._retweet_with_comment(tweet, id) self._retweet_with_comment(tweet, id)
def _retweet_with_comment(self, tweet, id, comment=''): 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-len("@%s " % (tweet["user"]["screen_name"],)), messageType="retweet", twishort_enabled=self.session.settings["mysc"]["twishort_enabled"])
if comment != '': if comment != '':
retweet.message.set_text(comment) retweet.message.set_text(comment)
if retweet.message.get_response() == widgetUtils.OK: if retweet.message.get_response() == widgetUtils.OK:
@@ -455,7 +457,7 @@ class baseBufferController(bufferController):
self.session.sound.play("audio.ogg") self.session.sound.play("audio.ogg")
if utils.is_geocoded(tweet): if utils.is_geocoded(tweet):
self.session.sound.play("geo.ogg") self.session.sound.play("geo.ogg")
self.session.db[str(self.name+"_pos")]=self.buffer.list.get_selected() self.session.db[self.name+"_pos"]=self.buffer.list.get_selected()
@_tweets_exist @_tweets_exist
def audio(self,url=''): def audio(self,url=''):

View File

@@ -27,7 +27,7 @@ class listsController(object):
name = dialog.get("name") name = dialog.get("name")
description = dialog.get("description") description = dialog.get("description")
p = dialog.get("public") p = dialog.get("public")
if public == True: if p == True:
mode = "public" mode = "public"
else: else:
mode = "private" mode = "private"
@@ -73,4 +73,4 @@ class listsController(object):
def open_list_as_buffer(self, *args, **kwargs): def open_list_as_buffer(self, *args, **kwargs):
if self.dialog.lista.get_count() == 0: return if self.dialog.lista.get_count() == 0: return
list = self.session.db["lists"][self.dialog.get_item()] 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"])

View File

@@ -90,12 +90,14 @@ class Controller(object):
""" Gets the last valid buffer for an account. """ Gets the last valid buffer for an account.
account str: A twitter username. account str: A twitter username.
The last valid buffer is the last buffer that contains a session object assigned.""" 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) results = self.get_buffers_for_account(account)
return self.view.search(results[-1].name, results[-1].account) return self.view.search(results[-1].name, results[-1].account)
def get_buffers_for_account(self, account): def get_buffers_for_account(self, account):
results = [] 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]
return results return results
def bind_stream_events(self): def bind_stream_events(self):
@@ -365,7 +367,7 @@ class Controller(object):
def set_buffer_positions(self,session): def set_buffer_positions(self,session):
"Sets positions for buffers if values exist in the database." "Sets positions for buffers if values exist in the database."
for i in self.buffers: for i in self.buffers:
if str(i.name+"_pos") in session.db and hasattr(i.buffer,'list'): if i.name+"_pos" in session.db and hasattr(i.buffer,'list'):
i.buffer.list.select_item(session.db[str(i.name+"_pos")]) i.buffer.list.select_item(session.db[str(i.name+"_pos")])
def logout_account(self, session_id): def logout_account(self, session_id):
@@ -696,6 +698,9 @@ class Controller(object):
msg = messages.viewTweet(tweet, tweetsList) msg = messages.viewTweet(tweet, tweetsList)
elif buffer.type == "account" or buffer.type == "empty": elif buffer.type == "account" or buffer.type == "empty":
return return
elif buffer.name == "sent_tweets":
tweet, tweetsList = buffer.get_full_tweet()
msg = messages.viewTweet(tweet, tweetsList)
else: else:
non_tweet = buffer.get_formatted_message() non_tweet = buffer.get_formatted_message()
msg = messages.viewTweet(non_tweet, [], False) msg = messages.viewTweet(non_tweet, [], False)
@@ -729,7 +734,7 @@ class Controller(object):
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(),), buffer.session, buffer.session.db["user_name"], bufferType=None, screen_name=dlg.get_user())
tl.start_stream() tl.start_stream()
pos=self.view.search("timelines", buffer.session.db["user_name"]) pos=self.view.search("timelines", buffer.session.db["user_name"])
self.insert_buffer(tl, pos) self.insert_buffer(tl, pos+1)
# self.buffers.insert(pos+1, tl) # self.buffers.insert(pos+1, tl)
self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos) 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()) buffer.session.settings["other_buffers"]["timelines"].append(dlg.get_user())
@@ -741,7 +746,7 @@ class Controller(object):
return 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()) 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"]) pos=self.view.search("favs_timelines", buffer.session.db["user_name"])
self.insert_buffer(tl, pos) self.insert_buffer(tl, pos+1)
# self.buffers.insert(pos+1, tl) # self.buffers.insert(pos+1, tl)
self.view.insert_buffer(buffer=tl.buffer, name=_(u"Favourites timeline for {}").format(dlg.get_user()), pos=pos) self.view.insert_buffer(buffer=tl.buffer, name=_(u"Favourites timeline for {}").format(dlg.get_user()), pos=pos)
tl.start_stream() tl.start_stream()
@@ -920,13 +925,11 @@ class Controller(object):
def left(self, *args, **kwargs): def left(self, *args, **kwargs):
buff = self.view.get_current_buffer_pos() buff = self.view.get_current_buffer_pos()
print buff
buffer = self.get_current_buffer() buffer = self.get_current_buffer()
if not hasattr(buffer.buffer, "list"): 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) output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True)
return return
if buff == self.get_first_buffer(buffer.account) or buff == 0: 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)) self.view.change_buffer(self.get_last_buffer(buffer.account))
else: else:
self.view.change_buffer(buff-1) self.view.change_buffer(buff-1)
@@ -1202,6 +1205,9 @@ class Controller(object):
def manage_stream_errors(self, session): def manage_stream_errors(self, session):
log.error("An error ocurred with the stream for the %s session. It will be destroyed" % (session,)) log.error("An error ocurred with the stream for the %s session. It will be destroyed" % (session,))
s = session_.sessions[session] s = session_.sessions[session]
for i in self.buffers:
if i.invisible == True and i.session.session_id == s.session_id:
i.start_stream()
s.listen_stream_error() s.listen_stream_error()
def check_connection(self): def check_connection(self):
@@ -1249,7 +1255,8 @@ class Controller(object):
return 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"])) 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) 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"])) 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() tl.start_stream()
buff.session.settings["other_buffers"]["lists"].append(create) buff.session.settings["other_buffers"]["lists"].append(create)
@@ -1334,28 +1341,14 @@ class Controller(object):
os.chdir("../../") os.chdir("../../")
def insert_buffer(self, buffer, position): def insert_buffer(self, buffer, position):
# print ref_buf.name, ref_buf.account self.buffers.insert(position, buffer)
# 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) def copy_to_clipboard(self, *args, **kwargs):
# ref_buf = self.buffers[position+1] output.copy(self.get_current_buffer().get_message())
empty = True output.speak(_(u"Copied"))
for i in buffers[position+1:]:
if i.type == "account" or i.invisible == False: def repeat_item(self, *args, **kwargs):
empty = True output.speak(self.get_current_buffer().get_message())
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
def __del__(self): def __del__(self):
config.app.write() 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)

View File

@@ -111,11 +111,14 @@ class basicTweet(object):
dlg = audioUploader.audioUploader(self.session.settings, completed_callback) dlg = audioUploader.audioUploader(self.session.settings, completed_callback)
class tweet(basicTweet): 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) super(tweet, self).__init__(session, title, caption, text, messageType, max)
self.image = None self.image = None
widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image) 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) 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): def upload_image(self, *args, **kwargs):
if self.message.get("upload_image") == _(u"Discard image"): if self.message.get("upload_image") == _(u"Discard image"):
@@ -133,8 +136,8 @@ class tweet(basicTweet):
c.show_menu() c.show_menu()
class reply(tweet): class reply(tweet):
def __init__(self, session, title, caption, text, users=None): def __init__(self, session, title, caption, text, twishort_enabled, users=None):
super(reply, self).__init__(session, title, caption, text, messageType="reply") super(reply, self).__init__(session, title, caption, text, twishort_enabled, messageType="reply")
self.users = users self.users = users
if self.users != None and len(self.users) > 1: if self.users != None and len(self.users) > 1:
widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all) widgetUtils.connect_event(self.message.mentionAll, widgetUtils.BUTTON_PRESSED, self.mention_all)

View File

@@ -34,7 +34,7 @@ class globalSettingsController(object):
if ".keymap" not in i: if ".keymap" not in i:
continue continue
try: try:
res[config_utils.load_config(paths.app_path('keymaps/'+i))['info']['name']]=i res[i[:-7]] =i
except: except:
log.exception("Exception while loading keymap " + i) log.exception("Exception while loading keymap " + i)
return res return res
@@ -79,6 +79,8 @@ class globalSettingsController(object):
self.needs_restart = True self.needs_restart = True
if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]: 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()] 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 self.needs_restart = True
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"): if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"):

View File

@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from wxUI.dialogs import userActions
from pubsub import pub
import re import re
import widgetUtils import widgetUtils
import output import output
from wxUI.dialogs import userActions
from pubsub import pub
from twython import TwythonError from twython import TwythonError
from extra import autocompletionUsers
class userActionsController(object): class userActionsController(object):
def __init__(self, buffer, users=[], default="follow"): def __init__(self, buffer, users=[], default="follow"):
@@ -12,9 +13,14 @@ class userActionsController(object):
self.buffer = buffer self.buffer = buffer
self.session = buffer.session self.session = buffer.session
self.dialog = userActions.UserActionsDialog(users, default) 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: if self.dialog.get_response() == widgetUtils.OK:
self.process_action() 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): def process_action(self):
action = self.dialog.get_action() action = self.dialog.get_action()
user = self.dialog.get_user() user = self.dialog.get_user()

View File

@@ -67,11 +67,13 @@ class GalicianLocale(Locale):
class BasqueLocale(Locale): class BasqueLocale(Locale):
names = ['eu', 'eu_eu'] names = ['eu', 'eu_eu']
past = 'duela {0}' past = 'duela {0}'
future = '{0}' # I don't know what's the right phrase in Basque for the future. future = '{0} igarota'
timeframes = { timeframes = {
'now': 'Orain', 'now': 'Orain',
'seconds': 'segundu', # 'second': 'segundu bat',
'seconds': 'segundu batzuk', # without specifying a number.
#'seconds': '{0} segundu', # specifying a number
'minute': 'minutu bat', 'minute': 'minutu bat',
'minutes': '{0} minutu', 'minutes': '{0} minutu',
'hour': 'ordu bat', 'hour': 'ordu bat',

View 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+/")

View File

@@ -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+/

View File

@@ -1,48 +1,49 @@
[info] [info]
name = Qwitter name = string(default="Qwitter")
desc = A keymap which emulates Qwitter as closely as possible. desc = string(default="A keymap which emulates Qwitter as closely as possible.")
author = Bill Dengler <codeofdusk@gmail.com> author = string(default="Bill Dengler <codeofdusk@gmail.com>")
[keymap] [keymap]
up = control+win+up up = string(default="control+win+up")
down = control+win+down down = string(default="control+win+down")
left = control+win+left left = string(default="control+win+left")
right = control+win+right right = string(default="control+win+right")
next_account = control+win+shift+right next_account = string(default="control+win+shift+right")
previous_account = control+win+shift+left previous_account = string(default="control+win+shift+left")
show_hide = control+win+w show_hide = string(default="control+win+w")
post_tweet = control+win+n post_tweet = string(default="control+win+n")
post_reply = control+win+r post_reply = string(default="control+win+r")
post_retweet = control+win+shift+r post_retweet = string(default="control+win+shift+r")
send_dm = control+win+d send_dm = string(default="control+win+d")
add_to_favourites = alt+win+f add_to_favourites = string(default="alt+win+f")
remove_from_favourites = alt+shift+win+f remove_from_favourites = string(default="alt+shift+win+f")
follow = control+win+l follow = string(default="control+win+l")
user_details = control+win+shift+; user_details = string(default="control+win+shift+;")
view_item = control+win+v view_item = string(default="control+win+v")
exit = control+win+f4 exit = string(default="control+win+f4")
open_timeline = control+win+i open_timeline = string(default="control+win+i")
remove_buffer = "control+win+'" remove_buffer = '''string(default="control+win+'")'''
audio = control+win+return url = string(default="control+win+return")
volume_up = control+win+alt+up audio = string(default="control+win+shift+return")
volume_down = control+win+alt+down volume_up = string(default="control+win+alt+up")
go_home = control+win+home volume_down = string(default="control+win+alt+down")
go_end = control+win+end go_home = string(default="control+win+home")
go_page_up = control+win+pageup go_end = string(default="control+win+end")
go_page_down = control+win+pagedown go_page_up = string(default="control+win+pageup")
update_profile = control+win+shift+p go_page_down = string(default="control+win+pagedown")
delete = control+win+delete update_profile = string(default="control+win+shift+p")
clear_buffer = control+win+shift+delete delete = string(default="control+win+delete")
repeat_item = control+win+space clear_buffer = string(default="control+win+shift+delete")
copy_to_clipboard = control+win+shift+c repeat_item = string(default="control+win+space")
add_to_list = control+win+alt+l copy_to_clipboard = string(default="control+win+shift+c")
remove_from_list = control+win+alt+shift+l add_to_list = string(default="control+win+alt+l")
toggle_buffer_mute = control+win+alt+m remove_from_list = string(default="control+win+alt+shift+l")
toggle_session_mute = control+win+m toggle_buffer_mute = string(default="control+win+alt+m")
search = control+win+/ toggle_session_mute = string(default="control+win+m")
find = control+win+shift+/ search = string(default="control+win+/")
edit_keystrokes = control+win+k find = string(default="control+win+shift+/")
view_user_lists = win+alt+shift+l edit_keystrokes = string(default="control+win+k")
reverse_geocode = control+win+g view_user_lists = string(default="win+alt+shift+l")
view_reverse_geocode = control+win+shift+g reverse_geocode = string(default="control+win+g")
get_trending_topics = control+win+shift+t view_reverse_geocode = string(default="control+win+shift+g")
get_trending_topics = string(default="control+win+shift+t")

View File

@@ -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

View 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")

View File

@@ -1,54 +1,52 @@
[info] [info]
name = Default name = string(default="Default")
desc = TWBlue's default keymap. desc = string(default="TWBlue's default keymap.")
author = Bill Dengler <codeofdusk@gmail.com> author = string(default="Bill Dengler <codeofdusk@gmail.com>")
[keymap] [keymap]
up = control+win+up up = string(default="control+win+up")
down = control+win+down down = string(default="control+win+down")
left = control+win+left left = string(default="control+win+left")
right = control+win+right right = string(default="control+win+right")
next_account = control+win+shift+right next_account = string(default="control+win+shift+right")
previous_account = control+win+shift+left previous_account = string(default="control+win+shift+left")
open_conversation = control+win+c open_conversation = string(default="control+win+c")
show_hide = control+win+m show_hide = string(default="control+win+m")
post_tweet = control+win+n post_tweet = string(default="control+win+n")
post_reply = control+win+r post_reply = string(default="control+win+r")
post_retweet = control+win+shift+r post_retweet = string(default="control+win+shift+r")
send_dm = control+win+d send_dm = string(default="control+win+d")
add_to_favourites = alt+win+f add_to_favourites = string(default="alt+win+f")
remove_from_favourites = alt+shift+win+f remove_from_favourites = string(default="alt+shift+win+f")
follow = control+win+s follow = string(default="control+win+s")
user_details = control+win+alt+n user_details = string(default="control+win+alt+n")
view_item = control+win+v view_item = string(default="control+win+v")
exit = control+win+f4 exit = string(default="control+win+f4")
open_timeline = control+win+i open_timeline = string(default="control+win+i")
remove_buffer = control+win+shift+i remove_buffer = string(default="control+win+shift+i")
audio = control+alt+win+return audio = string(default="control+alt+win+return")
url = control+win+return url = string(default="control+win+return")
volume_up = control+win+alt+up volume_up = string(default="control+win+alt+up")
volume_down = control+win+alt+down volume_down = string(default="control+win+alt+down")
go_home = control+win+home go_home = string(default="control+win+home")
go_end = control+win+end go_end = string(default="control+win+end")
go_page_up = control+win+pageup go_page_up = string(default="control+win+pageup")
go_page_down = control+win+pagedown go_page_down = string(default="control+win+pagedown")
update_profile = alt+win+p update_profile = string(default="alt+win+p")
delete = control+win+delete delete = string(default="control+win+delete")
clear_buffer = control+win+shift+delete clear_buffer = string(default="control+win+shift+delete")
repeat_item = control+win+space repeat_item = string(default="control+win+space")
copy_to_clipboard = control+win+c copy_to_clipboard = string(default="control+win+shift+c")
add_to_list = control+win+a add_to_list = string(default="control+win+a")
remove_from_list = control+win+shift+a remove_from_list = string(default="control+win+shift+a")
toggle_buffer_mute = control+win+shift+m toggle_buffer_mute = string(default="control+win+shift+m")
toggle_session_mute = alt+win+m toggle_session_mute = string(default="alt+win+m")
toggle_autoread = control+win+e toggle_autoread = string(default="control+win+e")
search = control+win+- search = string(default="control+win+-")
edit_keystrokes = control+win+k edit_keystrokes = string(default="control+win+k")
view_user_lists = control+win+l view_user_lists = string(default="control+win+l")
get_more_items = alt+win+pageup get_more_items = string(default="alt+win+pageup")
reverse_geocode = control+win+g reverse_geocode = string(default="control+win+g")
view_reverse_geocode = control+win+shift+g view_reverse_geocode = string(default="control+win+shift+g")
get_trending_topics = control+win+t get_trending_topics = string(default="control+win+t")
find = control+win+{ find = string(default="control+win+{")
secondary_interact = control+win+alt+return
interact = control+win+return

View File

@@ -25,6 +25,8 @@ from mysc.thread_utils import call_threaded
import fixes 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. #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 widgetUtils
import webbrowser
from wxUI import commonMessageDialogs
if system == "Windows": if system == "Windows":
from logger import logger from logger import logger
from update import updater from update import updater
@@ -63,6 +65,8 @@ def setup():
from sessionmanager import sessionManager from sessionmanager import sessionManager
app = widgetUtils.mainLoopObject() app = widgetUtils.mainLoopObject()
if system == "Windows": if system == "Windows":
if config.app["app-settings"]["donation_dialog_displayed"] == False:
donation()
updater.do_update() updater.do_update()
sm = sessionManager.sessionManagerController() sm = sessionManager.sessionManagerController()
sm.fill_list() sm.fill_list()
@@ -82,4 +86,10 @@ def setup():
GLib.idle_add(r.start) GLib.idle_add(r.start)
app.run() 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() setup()

View File

@@ -24,7 +24,7 @@ def setup ():
except: except:
return logging.exception("Output: Error during initialization.") return logging.exception("Output: Error during initialization.")
def Copy(text): def copy(text):
import win32clipboard import win32clipboard
#Copies text to the clipboard. #Copies text to the clipboard.
win32clipboard.OpenClipboard() win32clipboard.OpenClipboard()

View File

@@ -60,7 +60,7 @@ class Session(object):
if self.db.has_key(name) == False: if self.db.has_key(name) == False:
self.db[name] = [] self.db[name] = []
for i in data: 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) if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i)
else: self.db[name].insert(0, i) else: self.db[name].insert(0, i)
num = num+1 num = num+1
@@ -381,10 +381,11 @@ class Session(object):
if type(key) != str and type(key) != unicode: 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) 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)) + "!") 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"]: 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: else:
shelf[str(key)]=value shelf[str(key.encode("utf-8"))]=value
shelf.close() shelf.close()
except: 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) 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 +402,7 @@ class Session(object):
try: try:
shelf=shelve.open(paths.config_path(shelfname),'c') shelf=shelve.open(paths.config_path(shelfname),'c')
for key,value in shelf.items(): for key,value in shelf.items():
self.db[unicode(key)]=value self.db[key]=value
shelf.close() shelf.close()
except: 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) 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)

View File

@@ -28,7 +28,7 @@ class twitter(object):
def authorise(self, settings): def authorise(self, settings):
authorisationHandler.logged = False authorisationHandler.logged = False
port = random.randint(30000, 66000) port = random.randint(30000, 65535)
httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', port), authorisationHandler.handler) httpd = BaseHTTPServer.HTTPServer(('127.0.0.1', port), authorisationHandler.handler)
if config.app["proxy"]["server"] != "" and config.app["proxy"]["port"] != "": 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"]), args = {"proxies": {"http": "http://{0}:{1}".format(config.app["proxy"]["server"], config.app["proxy"]["port"]),

View File

@@ -32,7 +32,7 @@ def find_item(id, listItem):
def find_list(name, lists): def find_list(name, lists):
for i in range(0, len(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): def find_previous_reply(id, listItem):
for i in range(0, len(listItem)): for i in range(0, len(listItem)):

View File

@@ -7,6 +7,9 @@ import os
import platform import platform
import requests import requests
import tempfile import tempfile
from wxUI import commonMessageDialogs
import widgetUtils
import webbrowser
try: try:
import czipfile as zipfile import czipfile as zipfile
except ImportError: except ImportError:
@@ -20,13 +23,14 @@ def perform_update(endpoint, current_version, app_name='', password=None, update
if not available_update: if not available_update:
logger.debug("No update available") logger.debug("No update available")
return False return False
available_version = available_update['current_version'] available_version = float(available_update['current_version'])
if not str(available_version) > str(current_version) or platform.system()+platform.architecture()[0][:2] not in available_update['downloads']: 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") logger.debug("No update for this architecture")
return False return False
available_description = available_update.get('description', None) available_description = available_update.get('description', None)
update_url = available_update ['downloads'][platform.system()+platform.architecture()[0][:2]] update_url = available_update ['downloads'][platform.system()+platform.architecture()[0][:2]]
logger.info("A new update is available. Version %s" % available_version) 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 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.") logger.info("User canceled update.")
return return
@@ -114,3 +118,8 @@ def call_callback(callback, *args, **kwargs):
callback(*args, **kwargs) callback(*args, **kwargs)
# except: # except:
# logger.exception("Failed calling callback %r with args %r and kwargs %r" % (callback, args, kwargs)) # 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")

View File

@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import wx import wx
import application import application
def retweet_as_link(parent): 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() 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() 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): 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): 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) 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() 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(): 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(): 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: if entry.ShowModal() == wx.ID_OK:
return entry.GetValue() return entry.GetValue()
return None return None
@@ -31,19 +32,23 @@ def clear_list():
return dlg.ShowModal() return dlg.ShowModal()
def remove_buffer(): 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(): 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(): 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(): 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(): 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(): 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()

View File

@@ -5,7 +5,6 @@ import widgetUtils
class textLimited(widgetUtils.BaseDialog): class textLimited(widgetUtils.BaseDialog):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(textLimited, self).__init__(parent=None, *args, **kwargs) super(textLimited, self).__init__(parent=None, *args, **kwargs)
self.shift=False
def createTextArea(self, message="", text=""): def createTextArea(self, message="", text=""):
self.panel = wx.Panel(self) self.panel = wx.Panel(self)
self.label = wx.StaticText(self.panel, -1, message) self.label = wx.StaticText(self.panel, -1, message)
@@ -16,8 +15,7 @@ class textLimited(widgetUtils.BaseDialog):
# dc.SetFont(font) # dc.SetFont(font)
# x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") # x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
# self.text.SetSize((x, y)) # self.text.SetSize((x, y))
self.Bind(wx.EVT_TEXT_ENTER, self.on_enter) self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text)
self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys)
self.text.SetFocus() self.text.SetFocus()
self.textBox = wx.BoxSizer(wx.HORIZONTAL) self.textBox = wx.BoxSizer(wx.HORIZONTAL)
self.textBox.Add(self.label, 0, wx.ALL, 5) self.textBox.Add(self.label, 0, wx.ALL, 5)
@@ -46,15 +44,12 @@ class textLimited(widgetUtils.BaseDialog):
def onSelect(self, ev): def onSelect(self, ev):
self.text.SelectAll() self.text.SelectAll()
def on_enter(self,event): def handle_keys(self, event):
if self.shift==False and hasattr(self,'okButton'): shift=event.ShiftDown()
return wx.PostEvent(self.okButton.GetEventHandler(),wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK)) 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: else:
return self.text.WriteText('\n') event.Skip()
def handle_keys(self,event):
self.shift=event.ShiftDown()
event.Skip()
def set_cursor_at_end(self): def set_cursor_at_end(self):
self.text.SetInsertionPoint(len(self.text.GetValue())) self.text.SetInsertionPoint(len(self.text.GetValue()))

View File

@@ -10,8 +10,10 @@ class UserActionsDialog(wx.Dialog):
userLabel = wx.StaticText(panel, -1, _(u"User")) userLabel = wx.StaticText(panel, -1, _(u"User"))
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0]) self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0])
self.cb.SetFocus() self.cb.SetFocus()
self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users"))
userSizer.Add(userLabel, 0, wx.ALL, 5) userSizer.Add(userLabel, 0, wx.ALL, 5)
userSizer.Add(self.cb, 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) actionSizer = wx.BoxSizer(wx.VERTICAL)
label2 = wx.StaticText(panel, -1, _(u"Action")) label2 = wx.StaticText(panel, -1, _(u"Action"))
self.follow = wx.RadioButton(panel, -1, _(u"Follow"), style=wx.RB_GROUP) self.follow = wx.RadioButton(panel, -1, _(u"Follow"), style=wx.RB_GROUP)
@@ -79,3 +81,9 @@ class UserActionsDialog(wx.Dialog):
def get_user(self): def get_user(self):
return self.cb.GetValue() return self.cb.GetValue()
def get_position(self):
return self.cb.GetPosition()
def popup_menu(self, menu):
self.PopupMenu(menu, self.cb.GetPosition())

View File

@@ -10,8 +10,10 @@ class selectUserDialog(wx.Dialog):
userLabel = wx.StaticText(panel, -1, _(u"User")) userLabel = wx.StaticText(panel, -1, _(u"User"))
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0]) self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0])
self.cb.SetFocus() self.cb.SetFocus()
self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users"))
userSizer.Add(userLabel, 0, wx.ALL, 5) userSizer.Add(userLabel, 0, wx.ALL, 5)
userSizer.Add(self.cb, 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) actionSizer = wx.BoxSizer(wx.VERTICAL)
label2 = wx.StaticText(panel, -1, _(u"Buffer type")) label2 = wx.StaticText(panel, -1, _(u"Buffer type"))
self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP) self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP)
@@ -49,3 +51,9 @@ class selectUserDialog(wx.Dialog):
def get_user(self): def get_user(self):
return self.cb.GetValue() return self.cb.GetValue()
def get_position(self):
return self.cb.GetPosition()
def popup_menu(self, menu):
self.PopupMenu(menu, self.cb.GetPosition())

View File

@@ -26,8 +26,10 @@ class selectUserDialog(baseDialog.BaseWXDialog):
userSizer = wx.BoxSizer() userSizer = wx.BoxSizer()
self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize) self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize)
self.cb.SetFocus() 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(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) sizer = wx.BoxSizer(wx.VERTICAL)
ok = wx.Button(panel, wx.ID_OK, _(u"OK")) ok = wx.Button(panel, wx.ID_OK, _(u"OK"))
ok.SetDefault() ok.SetDefault()

View File

@@ -126,6 +126,8 @@ class mainFrame(wx.Frame):
self.SetClientSize(self.sizer.CalcMin()) self.SetClientSize(self.sizer.CalcMin())
# print self.GetSize() # 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): def search(self, name_, account):
for i in range(0, self.nb.GetPageCount()): for i in range(0, self.nb.GetPageCount()):

View File

@@ -5,7 +5,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

File diff suppressed because it is too large Load Diff