Compare commits

...

23 Commits

Author SHA1 Message Date
dbbe6c0600 TWBlue 0.81 has been officially released 2016-03-25 01:24:30 -06:00
3caef5fc81 Updated translations 2016-03-24 22:33:53 -06:00
7cd58708cc Added FightingGames as an official soundpack. @deng90 2016-03-24 22:32:28 -06:00
0814af3bf4 Added notes to the Qwitter soundpack 2016-03-24 22:30:52 -06:00
72ba5a74f5 Minor changes before the next release 2016-03-24 22:18:51 -06:00
cbc301141e Updated translation templates 2016-03-24 22:17:54 -06:00
f466516289 Merge pull request #72 from Oliver2213/next-gen-fork
Fix an error where the geolocate dialog wasn't loading properly
2016-03-23 23:44:01 -06:00
4eef236b1c Merge pull request #73 from Oliver2213/shortcutfix
Fix duplicate shortcut in the reply to tweet dialog
2016-03-23 23:43:24 -06:00
Blake Oliver
ce00083aa2 Fix duplicate shortcut in the reply to tweet dialog
Mention all is now alt+m, translate stays alt+t
2016-03-22 18:35:14 -04:00
Blake Oliver
f92e05ce72 Fix an error where the geolocate dialog wasn't loading properly
For some reason, a standard tweet dialog was being used to display this information, which comes along with spell check, translate, etc; functions a simple geolocate display box doesn't need.
The error was happening because the tweet show dialog was accepting (tweet, tweetList, is_tweet=True) as args, and the call to display the geodata was only providing geodata as tweet, and false as tweetList.
This method signature was erroring out because is_tweet was set to True by default; the False was being accepted as tweetList, which the method later tries to call __str__ which it doesn't have.
I could have just added the is_tweet keyword, but then I would need to change the signature so tweetList is set to none by default, update the method, bla, bla, bla. Too much work.
Instead I added another function in wxUI.commonMessageDialogs called view_geodata, which just accepts the data in question as an argument and displays that in a message box.
2016-03-22 11:21:27 -04:00
c02a11f269 Merge pull request #71 from Oliver2213/next-gen-fork
Add hotkeys for some dialogs, making navigation much faster
2016-03-20 10:47:22 -06:00
Blake Oliver
c79e659b74 Add hotkeys for some dialogs, making navigation much faster 2016-03-20 10:26:05 -04:00
da8009aea0 If a config file is bad formed, it should print errors in logs 2016-03-19 20:59:04 -06:00
2778d2e85d Fixed the chicken nugget keymap 2016-03-19 20:58:14 -06:00
ce9a50903c Changed tokens to the stable version 2016-03-19 20:08:48 -06:00
9a7d39c125 Don'w show relationship status if there is any relationship between user 2016-03-19 20:08:20 -06:00
89759e7d49 Merge branch 'next-gen' of https://github.com/manuelcortez/TWBlue into next-gen 2016-02-20 06:53:02 -06:00
7ca9d42f5f Added a new contributor. Welcome and thanks @ButchullaWoman! 2016-02-20 06:52:39 -06:00
Jose Manuel Delicado
6a6bec880c SessionManager.WXUI: now the dialog title is translatable 2016-02-20 13:51:12 +01:00
7b22c7d0f8 Added relationship information in user details dialogue. 2016-02-20 06:43:56 -06:00
058866831b Fixed an unhandled exception in updater 2016-02-20 06:34:26 -06:00
229f698e72 Added a mirror URL for checking updates if the main URL is not working 2016-02-19 09:15:46 -06:00
32067d3171 Added json files for the updater 2016-02-19 09:08:27 -06:00
85 changed files with 10222 additions and 7435 deletions

View File

@@ -34,4 +34,6 @@ Holly Scott-Gardner
Anibal Hernández Anibal Hernández
Sussan Leiva Sussan Leiva
Brian Hartgen Brian Hartgen
PEDRO REINA COLOBON PEDRO REINA COLOBON
Moora-Moora Arrilla
Blake Oliver

View File

@@ -12,10 +12,10 @@ SetCompress auto
SetCompressor /solid lzma SetCompressor /solid lzma
SetDatablockOptimize on SetDatablockOptimize on
VIAddVersionKey ProductName "TWBlue" VIAddVersionKey ProductName "TWBlue"
VIAddVersionKey LegalCopyright "Copyright 2015 Manuel Cortéz." VIAddVersionKey LegalCopyright "Copyright 2016 Manuel Cortéz."
VIAddVersionKey ProductVersion "0.80" VIAddVersionKey ProductVersion "0.81"
VIAddVersionKey FileVersion "0.80" VIAddVersionKey FileVersion "0.81"
VIProductVersion "0.80.0.0" VIProductVersion "0.81.0.0"
!insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_WELCOME
!define MUI_LICENSEPAGE_RADIOBUTTONS !define MUI_LICENSEPAGE_RADIOBUTTONS
!insertmacro MUI_PAGE_LICENSE "license.txt" !insertmacro MUI_PAGE_LICENSE "license.txt"

View File

@@ -1,12 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
name = 'TWBlue' name = 'TWBlue'
snapshot = True snapshot = False
if snapshot == False: if snapshot == False:
version = "0.80" version = "0.81"
update_url = 'http://twblue.es/updates/twblue_ngen.json' update_url = 'http://twblue.es/updates/twblue_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json'
else: else:
version = "10.99" version = "10.99"
update_url = 'http://twblue.es/updates/snapshots_ngen.json' update_url = 'http://twblue.es/updates/snapshots_ngen.json'
mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json'
author = u"Manuel Cortéz" author = u"Manuel Cortéz"
authorEmail = "manuel@manuelcortez.net" authorEmail = "manuel@manuelcortez.net"
copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz." copyright = u"Copyright (C) 2015, Technow S.L. \nCopyright (C) 2013-2015, Manuel cortéz."

View File

@@ -3,6 +3,9 @@ from configobj import ConfigObj, ParseError
from validate import Validator, ValidateError from validate import Validator, ValidateError
import os import os
import string import string
from logging import getLogger
log = getLogger("config_utils")
class ConfigLoadError(Exception): pass class ConfigLoadError(Exception): pass
def load_config(config_path, configspec_path=None, *args, **kwargs): def load_config(config_path, configspec_path=None, *args, **kwargs):
@@ -14,10 +17,12 @@ def load_config(config_path, configspec_path=None, *args, **kwargs):
except ParseError: except ParseError:
raise ConfigLoadError("Unable to load %r" % config_path) raise ConfigLoadError("Unable to load %r" % config_path)
validator = Validator() validator = Validator()
validated = config.validate(validator, copy=True) validated = config.validate(validator, preserve_errors=False, copy=True)
if validated == True: if validated == True:
config.write() config.write()
return config return config
else:
log.exception("Error in config file: {0}".format(validated,))
def is_blank(arg): def is_blank(arg):
"Check if a line is blank." "Check if a line is blank."
@@ -25,6 +30,7 @@ def is_blank(arg):
if c not in string.whitespace: if c not in string.whitespace:
return False return False
return True return True
def get_keys(path): def get_keys(path):
"Gets the keys of a configobj config file." "Gets the keys of a configobj config file."
res=[] res=[]

View File

@@ -923,7 +923,7 @@ class Controller(object):
x = tweet["coordinates"]["coordinates"][0] x = tweet["coordinates"]["coordinates"][0]
y = tweet["coordinates"]["coordinates"][1] y = tweet["coordinates"]["coordinates"][1]
address = geocoder.reverse_geocode(y, x) address = geocoder.reverse_geocode(y, x)
dlg = messages.viewTweet(address[0].__str__(), False) dlg = commonMessageDialogs.view_geodata(address[0].__str__())
else: else:
output.speak(_(u"There are no coordinates in this tweet")) output.speak(_(u"There are no coordinates in this tweet"))
except GeocoderError: except GeocoderError:

View File

@@ -31,6 +31,8 @@ class profileController(object):
def get_data(self, screen_name): def get_data(self, screen_name):
self.data = self.session.twitter.twitter.show_user(screen_name=screen_name) self.data = self.session.twitter.twitter.show_user(screen_name=screen_name)
if screen_name != self.session.db["user_name"]:
self.friendship_status = self.session.twitter.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name)
def fill_profile_fields(self): def fill_profile_fields(self):
self.dialog.set_name(self.data["name"]) self.dialog.set_name(self.data["name"])
@@ -90,6 +92,17 @@ class profileController(object):
if self.data["protected"] == True: protected = _(u"Yes") if self.data["protected"] == True: protected = _(u"Yes")
else: protected = _(u"No") else: protected = _(u"No")
string = string+ _(u"Protected: %s\n") % (protected) string = string+ _(u"Protected: %s\n") % (protected)
if hasattr(self, "friendship_status"):
relation = False
friendship = "Relationship: "
if self.friendship_status["relationship"]["target"]["followed_by"]:
friendship += _(u"You follow {0}. ").format(self.data["name"],)
relation = True
if self.friendship_status["relationship"]["target"]["following"]:
friendship += _(u"{0} is following you.").format(self.data["name"],)
relation = True
if relation == True:
string = string+friendship+"\n"
string = string+_(u"Followers: %s\n Friends: %s\n") % (self.data["followers_count"], self.data["friends_count"]) string = string+_(u"Followers: %s\n Friends: %s\n") % (self.data["followers_count"], self.data["friends_count"])
if self.data["verified"] == True: verified = _(u"Yes") if self.data["verified"] == True: verified = _(u"Yes")
else: verified = _(u"No") else: verified = _(u"No")

View File

@@ -17,7 +17,7 @@ send_dm = string(default="control+win+d")
user_details = string(default="control+win+shift+u") user_details = string(default="control+win+shift+u")
exit = string(default="control+win+q") exit = string(default="control+win+q")
open_timeline = string(default="control+win+u") open_timeline = string(default="control+win+u")
remove_buffer = string(default="control+win+backspace") remove_buffer = string(default="control+win+back")
audio = string(default="control+win+return") audio = string(default="control+win+return")
url = string(default="control+win+b") url = string(default="control+win+b")
go_home = string(default="control+win+home") go_home = string(default="control+win+home")
@@ -28,7 +28,7 @@ repeat_item = string(default="control+win+space")
copy_to_clipboard = string(default="control+win+shift+c") copy_to_clipboard = string(default="control+win+shift+c")
search = string(default="control+win+/") search = string(default="control+win+/")
find = string(default="control+win+shift+/") find = string(default="control+win+shift+/")
check_for_updates = string(default="alt+win+u) check_for_updates = string(default="alt+win+u")
list_manager = string(default="control+win+shift+l") list_manager = string(default="control+win+shift+l")
configuration = string(default="control+win+o") configuration = string(default="control+win+o")
accountConfiguration = string(default="control+win+shift+o") accountConfiguration = string(default="control+win+shift+o")

View File

@@ -5,16 +5,16 @@ import exceptions
from ctypes import c_char_p from ctypes import c_char_p
from libloader import load_library from libloader import load_library
import paths import paths
if application.snapshot == True: #if application.snapshot == True:
if platform.architecture()[0][:2] == "32": # if platform.architecture()[0][:2] == "32":
lib = load_library("snapshot_api_keys32", x86_path=paths.app_path("keys/lib")) # lib = load_library("snapshot_api_keys32", x86_path=paths.app_path("keys/lib"))
else: # else:
lib = load_library("snapshot_api_keys64", x64_path=paths.app_path("keys/lib")) # lib = load_library("snapshot_api_keys64", x64_path=paths.app_path("keys/lib"))
#else:
if platform.architecture()[0][:2] == "32":
lib = load_library("stable_api_keys32", x86_path=paths.app_path("keys/lib"))
else: else:
if platform.architecture()[0][:2] == "32": lib = load_library("stable_api_keys64", x64_path=paths.app_path("keys/lib"))
lib = load_library("stable_api_keys32", x86_path=paths.app_path("keys/lib"))
else:
lib = load_library("stable_api_keys64", x64_path=paths.app_path("keys/lib"))
# import linuxKeys # import linuxKeys
# lib = linuxKeys # lib = linuxKeys

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

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

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

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

View File

@@ -4,7 +4,7 @@ from multiplatform_widgets import widgets
import application import application
class sessionManagerWindow(wx.Dialog): class sessionManagerWindow(wx.Dialog):
def __init__(self): def __init__(self):
super(sessionManagerWindow, self).__init__(parent=None, title="Session manager", size=wx.DefaultSize) super(sessionManagerWindow, self).__init__(parent=None, title=_(u"Session manager"), size=wx.DefaultSize)
panel = wx.Panel(self) panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)
label = wx.StaticText(panel, -1, _(u"Accounts list"), size=wx.DefaultSize) label = wx.StaticText(panel, -1, _(u"Accounts list"), size=wx.DefaultSize)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
All the sounds used in the soundpack do not belong to us. They belong to the origenal creaters.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
All the sounds used in the soundpack do not belong to us. They belong to the origenal creaters.

View File

@@ -2,14 +2,19 @@
import application import application
import update import update
import platform import platform
from wxUpdater import *
import logging import logging
import output import output
from requests.exceptions import ConnectionError
from wxUpdater import *
logger = logging.getLogger("updater") logger = logging.getLogger("updater")
def do_update(): def do_update(endpoint=application.update_url):
# try: try:
return update.perform_update(endpoint=application.update_url, current_version=application.version, app_name=application.name, update_available_callback=available_update_dialog, progress_callback=progress_callback, update_complete_callback=update_finished) update.perform_update(endpoint=endpoint, current_version=application.version, app_name=application.name, update_available_callback=available_update_dialog, progress_callback=progress_callback, update_complete_callback=update_finished)
# except: except ConnectionError:
# logger.exception("Update failed.") if endpoint == application.update_url:
# output.speak("An exception occurred while attempting to update " + application.name + ". If this message persists, contact the " + application.name + " developers. More information about the exception has been written to the error log.",True) logger.error("Update failed! Using mirror URL...")
return do_update(endpoint=application.mirror_update_url)
else:
logger.exception("Update failed.")
output.speak("An exception occurred while attempting to update " + application.name + ". If this message persists, contact the " + application.name + " developers. More information about the exception has been written to the error log.",True)

View File

@@ -64,3 +64,7 @@ def no_followers():
def no_friends(): def no_friends():
return wx.MessageDialog(None, _(u"This user has no friends. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() return wx.MessageDialog(None, _(u"This user has no friends. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal()
def view_geodata(geotext):
"""Specific message dialog to display geolocation data"""
return wx.MessageDialog(None, _(u"Geolocation data: {0}").format(geotext), _(u"Geo data for this tweet")).ShowModal()

View File

@@ -68,20 +68,20 @@ class tweet(textLimited):
self.mainBox = wx.BoxSizer(wx.VERTICAL) self.mainBox = wx.BoxSizer(wx.VERTICAL)
self.createTextArea(message, text) self.createTextArea(message, text)
self.mainBox.Add(self.textBox, 0, wx.ALL, 5) self.mainBox.Add(self.textBox, 0, wx.ALL, 5)
self.long_tweet = wx.CheckBox(self.panel, -1, _(u"Long tweet")) self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet"))
self.long_tweet.SetValue(True) self.long_tweet.SetValue(True)
self.upload_image = wx.Button(self.panel, -1, _(u"Upload image..."), size=wx.DefaultSize) self.upload_image = wx.Button(self.panel, -1, _(u"&Upload image..."), size=wx.DefaultSize)
self.spellcheck = wx.Button(self.panel, -1, _("Check spelling..."), size=wx.DefaultSize) self.spellcheck = wx.Button(self.panel, -1, _("Check &spelling..."), size=wx.DefaultSize)
self.attach = wx.Button(self.panel, -1, _(u"Attach audio..."), size=wx.DefaultSize) self.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), size=wx.DefaultSize)
self.shortenButton = wx.Button(self.panel, -1, _(u"Shorten URL"), size=wx.DefaultSize) self.shortenButton = wx.Button(self.panel, -1, _(u"Sh&orten URL"), size=wx.DefaultSize)
self.unshortenButton = wx.Button(self.panel, -1, _(u"Expand URL"), size=wx.DefaultSize) self.unshortenButton = wx.Button(self.panel, -1, _(u"&Expand URL"), size=wx.DefaultSize)
self.shortenButton.Disable() self.shortenButton.Disable()
self.unshortenButton.Disable() self.unshortenButton.Disable()
self.translateButton = wx.Button(self.panel, -1, _(u"Translate..."), size=wx.DefaultSize) self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize)
self.autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users")) self.autocompletionButton = wx.Button(self.panel, -1, _(u"&Autocomplete users"))
self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Send"), size=wx.DefaultSize) self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"&Send"), size=wx.DefaultSize)
self.okButton.SetDefault() self.okButton.SetDefault()
cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close"), size=wx.DefaultSize) cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"&Close"), size=wx.DefaultSize)
self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL)
self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10)
self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10)
@@ -234,7 +234,7 @@ class reply(tweet):
def __init__(self, title, message, text): def __init__(self, title, message, text):
super(reply, self).__init__(message, title, text) super(reply, self).__init__(message, title, text)
self.text.SetInsertionPoint(len(self.text.GetValue())) self.text.SetInsertionPoint(len(self.text.GetValue()))
self.mentionAll = wx.Button(self, -1, _(u"Men&tion to all"), size=wx.DefaultSize) self.mentionAll = wx.Button(self, -1, _(u"&Mention to all"), size=wx.DefaultSize)
self.mentionAll.Disable() self.mentionAll.Disable()
self.buttonsBox1.Add(self.mentionAll, 0, wx.ALL, 5) self.buttonsBox1.Add(self.mentionAll, 0, wx.ALL, 5)
self.buttonsBox1.Layout() self.buttonsBox1.Layout()

View File

@@ -10,7 +10,7 @@ class searchDialog(baseDialog.BaseWXDialog):
panel = wx.Panel(self) panel = wx.Panel(self)
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)
self.SetTitle(_(u"Search on Twitter")) self.SetTitle(_(u"Search on Twitter"))
label = wx.StaticText(panel, -1, _(u"Search")) label = wx.StaticText(panel, -1, _(u"&Search"))
self.term = wx.TextCtrl(panel, -1, value) self.term = wx.TextCtrl(panel, -1, value)
dc = wx.WindowDC(self.term) dc = wx.WindowDC(self.term)
dc.SetFont(self.term.GetFont()) dc.SetFont(self.term.GetFont())
@@ -25,7 +25,7 @@ class searchDialog(baseDialog.BaseWXDialog):
radioSizer.Add(self.tweets, 0, wx.ALL, 5) radioSizer.Add(self.tweets, 0, wx.ALL, 5)
radioSizer.Add(self.users, 0, wx.ALL, 5) radioSizer.Add(self.users, 0, wx.ALL, 5)
sizer.Add(radioSizer, 0, wx.ALL, 5) sizer.Add(radioSizer, 0, wx.ALL, 5)
lang = wx.StaticText(panel, -1, _(u"Language for results: ")) lang = wx.StaticText(panel, -1, _(u"&Language for results: "))
langs = [x[1] for x in translator.translator.available_languages()] langs = [x[1] for x in translator.translator.available_languages()]
langs[:] = langs[1:] langs[:] = langs[1:]
langs.insert(0, _(u"any")) langs.insert(0, _(u"any"))
@@ -34,15 +34,15 @@ class searchDialog(baseDialog.BaseWXDialog):
langBox.Add(lang, 0, wx.ALL, 5) langBox.Add(lang, 0, wx.ALL, 5)
langBox.Add(self.lang, 0, wx.ALL, 5) langBox.Add(self.lang, 0, wx.ALL, 5)
sizer.Add(langBox, 0, wx.ALL, 5) sizer.Add(langBox, 0, wx.ALL, 5)
resulttype = wx.StaticText(panel, -1, _(U"Results type: ")) resulttype = wx.StaticText(panel, -1, _(U"Results &type: "))
self.resultstype = wx.ComboBox(panel, -1, choices=[_(u"Mixed"), _(u"Recent"), _(u"Popular")], value=_(u"Mixed"), style=wx.CB_READONLY) self.resultstype = wx.ComboBox(panel, -1, choices=[_(u"Mixed"), _(u"Recent"), _(u"Popular")], value=_(u"Mixed"), style=wx.CB_READONLY)
rBox = wx.BoxSizer(wx.HORIZONTAL) rBox = wx.BoxSizer(wx.HORIZONTAL)
rBox.Add(resulttype, 0, wx.ALL, 5) rBox.Add(resulttype, 0, wx.ALL, 5)
rBox.Add(self.resultstype, 0, wx.ALL, 5) rBox.Add(self.resultstype, 0, wx.ALL, 5)
sizer.Add(rBox, 0, wx.ALL, 5) sizer.Add(rBox, 0, wx.ALL, 5)
ok = wx.Button(panel, wx.ID_OK, _(u"OK")) ok = wx.Button(panel, wx.ID_OK, _(u"&OK"))
ok.SetDefault() ok.SetDefault()
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close"))
btnsizer = wx.BoxSizer() btnsizer = wx.BoxSizer()
btnsizer.Add(ok, 0, wx.ALL, 5) btnsizer.Add(ok, 0, wx.ALL, 5)
btnsizer.Add(cancel, 0, wx.ALL, 5) btnsizer.Add(cancel, 0, wx.ALL, 5)

View File

@@ -12,9 +12,9 @@ class showUserProfile(baseDialog.BaseWXDialog):
self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(350, 250)) self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(350, 250))
self.text.SetFocus() self.text.SetFocus()
sizer.Add(self.text, 0, wx.ALL|wx.EXPAND, 5) sizer.Add(self.text, 0, wx.ALL|wx.EXPAND, 5)
self.url = wx.Button(panel, -1, _(u"Go to URL"), size=wx.DefaultSize) self.url = wx.Button(panel, -1, _(u"&Go to URL"), size=wx.DefaultSize)
self.url.Disable() self.url.Disable()
close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) close = wx.Button(panel, wx.ID_CANCEL, _(u"&Close"))
btnSizer = wx.BoxSizer(wx.HORIZONTAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL)
btnSizer.Add(self.url, 0, wx.ALL, 5) btnSizer.Add(self.url, 0, wx.ALL, 5)
btnSizer.Add(close, 0, wx.ALL, 5) btnSizer.Add(close, 0, wx.ALL, 5)

View File

@@ -17,15 +17,15 @@ class trendingTopicsDialog(baseDialog.BaseWXDialog):
radioSizer.Add(self.country, 0, wx.ALL, 5) radioSizer.Add(self.country, 0, wx.ALL, 5)
radioSizer.Add(self.city, 0, wx.ALL, 5) radioSizer.Add(self.city, 0, wx.ALL, 5)
sizer.Add(radioSizer, 0, wx.ALL, 5) sizer.Add(radioSizer, 0, wx.ALL, 5)
label = wx.StaticText(panel, -1, _(u"Location")) label = wx.StaticText(panel, -1, _(u"&Location"))
self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY) self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY)
locationBox = wx.BoxSizer(wx.HORIZONTAL) locationBox = wx.BoxSizer(wx.HORIZONTAL)
locationBox.Add(label, 0, wx.ALL, 5) locationBox.Add(label, 0, wx.ALL, 5)
locationBox.Add(self.location, 0, wx.ALL, 5) locationBox.Add(self.location, 0, wx.ALL, 5)
sizer.Add(locationBox, 0, wx.ALL, 5) sizer.Add(locationBox, 0, wx.ALL, 5)
ok = wx.Button(panel, wx.ID_OK, _(u"OK")) ok = wx.Button(panel, wx.ID_OK, _(u"&OK"))
ok.SetDefault() ok.SetDefault()
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close"))
btnsizer = wx.BoxSizer() btnsizer = wx.BoxSizer()
btnsizer.Add(ok, 0, wx.ALL, 5) btnsizer.Add(ok, 0, wx.ALL, 5)
btnsizer.Add(cancel, 0, wx.ALL, 5) btnsizer.Add(cancel, 0, wx.ALL, 5)

View File

@@ -7,32 +7,32 @@ class updateProfileDialog(baseDialog.BaseWXDialog):
super(updateProfileDialog, self).__init__(parent=None, id=-1) super(updateProfileDialog, self).__init__(parent=None, id=-1)
self.SetTitle(_(u"Update your profile")) self.SetTitle(_(u"Update your profile"))
panel = wx.Panel(self) panel = wx.Panel(self)
labelName = wx.StaticText(panel, -1, _(u"Name (20 characters maximum)")) labelName = wx.StaticText(panel, -1, _(u"&Name (20 characters maximum)"))
self.name = wx.TextCtrl(panel, -1) self.name = wx.TextCtrl(panel, -1)
self.name.SetFocus() self.name.SetFocus()
dc = wx.WindowDC(self.name) dc = wx.WindowDC(self.name)
dc.SetFont(self.name.GetFont()) dc.SetFont(self.name.GetFont())
self.name.SetSize(dc.GetTextExtent("0"*20)) self.name.SetSize(dc.GetTextExtent("0"*20))
labelLocation = wx.StaticText(panel, -1, _(u"Location")) labelLocation = wx.StaticText(panel, -1, _(u"&Location"))
self.location = wx.TextCtrl(panel, -1) self.location = wx.TextCtrl(panel, -1)
dc = wx.WindowDC(self.location) dc = wx.WindowDC(self.location)
dc.SetFont(self.location.GetFont()) dc.SetFont(self.location.GetFont())
self.location.SetSize(dc.GetTextExtent("0"*35)) self.location.SetSize(dc.GetTextExtent("0"*35))
labelUrl = wx.StaticText(panel, -1, _(u"Website")) labelUrl = wx.StaticText(panel, -1, _(u"&Website"))
self.url = wx.TextCtrl(panel, -1) self.url = wx.TextCtrl(panel, -1)
dc = wx.WindowDC(self.url) dc = wx.WindowDC(self.url)
dc.SetFont(self.url.GetFont()) dc.SetFont(self.url.GetFont())
self.url.SetSize(dc.GetTextExtent("0"*22)) self.url.SetSize(dc.GetTextExtent("0"*22))
labelDescription = wx.StaticText(panel, -1, _(u"Bio (160 characters maximum)")) labelDescription = wx.StaticText(panel, -1, _(u"&Bio (160 characters maximum)"))
self.description = wx.TextCtrl(panel, -1, size=(400, 400)) self.description = wx.TextCtrl(panel, -1, size=(400, 400))
dc = wx.WindowDC(self.description) dc = wx.WindowDC(self.description)
dc.SetFont(self.description.GetFont()) dc.SetFont(self.description.GetFont())
self.description.SetSize(dc.GetTextExtent("0"*160)) self.description.SetSize(dc.GetTextExtent("0"*160))
self.image = None self.image = None
self.upload_image = wx.Button(panel, -1, _(u"Upload a picture")) self.upload_image = wx.Button(panel, -1, _(u"Upload a &picture"))
self.ok = wx.Button(panel, wx.ID_OK, _(u"Update profile")) self.ok = wx.Button(panel, wx.ID_OK, _(u"&Update profile"))
self.ok.SetDefault() self.ok.SetDefault()
close = wx.Button(panel, wx.ID_CANCEL, _("Close")) close = wx.Button(panel, wx.ID_CANCEL, _("&Close"))
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)
nameBox = wx.BoxSizer(wx.HORIZONTAL) nameBox = wx.BoxSizer(wx.HORIZONTAL)
nameBox.Add(labelName, 0, wx.ALL, 5) nameBox.Add(labelName, 0, wx.ALL, 5)

View File

@@ -7,7 +7,7 @@ class UserActionsDialog(wx.Dialog):
panel = wx.Panel(self) panel = wx.Panel(self)
userSizer = wx.BoxSizer() userSizer = wx.BoxSizer()
self.SetTitle(_(u"Action")) self.SetTitle(_(u"Action"))
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")) self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users"))
@@ -16,14 +16,14 @@ class UserActionsDialog(wx.Dialog):
userSizer.Add(self.autocompletion, 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"), name=_(u"Action"), style=wx.RB_GROUP)
self.unfollow = wx.RadioButton(panel, -1, _(u"Unfollow")) self.unfollow = wx.RadioButton(panel, -1, _(u"U&nfollow"))
self.mute = wx.RadioButton(panel, -1, _(u"Mute")) self.mute = wx.RadioButton(panel, -1, _(u"&Mute"))
self.unmute = wx.RadioButton(panel, -1, _(u"Unmute")) self.unmute = wx.RadioButton(panel, -1, _(u"Unmu&te"))
self.block = wx.RadioButton(panel, -1, _(u"Block")) self.block = wx.RadioButton(panel, -1, _(u"&Block"))
self.unblock = wx.RadioButton(panel, -1, _(u"Unblock")) self.unblock = wx.RadioButton(panel, -1, _(u"Unbl&ock"))
self.reportSpam = wx.RadioButton(panel, -1, _(u"Report as spam")) self.reportSpam = wx.RadioButton(panel, -1, _(u"&Report as spam"))
self.ignore_client = wx.RadioButton(panel, -1, _(u"Ignore tweets from this client")) self.ignore_client = wx.RadioButton(panel, -1, _(u"&Ignore tweets from this client"))
self.setup_default(default) self.setup_default(default)
hSizer = wx.BoxSizer(wx.HORIZONTAL) hSizer = wx.BoxSizer(wx.HORIZONTAL)
hSizer.Add(label2, 0, wx.ALL, 5) hSizer.Add(label2, 0, wx.ALL, 5)
@@ -37,9 +37,9 @@ class UserActionsDialog(wx.Dialog):
actionSizer.Add(self.ignore_client, 0, wx.ALL, 5) actionSizer.Add(self.ignore_client, 0, wx.ALL, 5)
hSizer.Add(actionSizer, 0, wx.ALL, 5) hSizer.Add(actionSizer, 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()
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close"))
btnsizer = wx.BoxSizer() btnsizer = wx.BoxSizer()
btnsizer.Add(ok) btnsizer.Add(ok)
btnsizer.Add(cancel) btnsizer.Add(cancel)

View File

@@ -16,10 +16,10 @@ class selectUserDialog(wx.Dialog):
userSizer.Add(self.autocompletion, 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)
self.favourites = wx.RadioButton(panel, -1, _(u"Likes")) self.favourites = wx.RadioButton(panel, -1, _(u"&Likes"))
self.followers = wx.RadioButton(panel, -1, _(u"Followers")) self.followers = wx.RadioButton(panel, -1, _(u"&Followers"))
self.friends = wx.RadioButton(panel, -1, _(u"Friends")) self.friends = wx.RadioButton(panel, -1, _(u"F&riends"))
self.setup_default(default) self.setup_default(default)
hSizer = wx.BoxSizer(wx.HORIZONTAL) hSizer = wx.BoxSizer(wx.HORIZONTAL)
hSizer.Add(label2, 0, wx.ALL, 5) hSizer.Add(label2, 0, wx.ALL, 5)
@@ -29,9 +29,9 @@ class selectUserDialog(wx.Dialog):
actionSizer.Add(self.friends, 0, wx.ALL, 5) actionSizer.Add(self.friends, 0, wx.ALL, 5)
hSizer.Add(actionSizer, 0, wx.ALL, 5) hSizer.Add(actionSizer, 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()
cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close"))
btnsizer = wx.BoxSizer() btnsizer = wx.BoxSizer()
btnsizer.Add(ok) btnsizer.Add(ok)
btnsizer.Add(cancel) btnsizer.Add(cancel)

View File

@@ -2,7 +2,7 @@
# Define paths for a regular use, if there are not paths for python32 or 64, these commands will be taken. # Define paths for a regular use, if there are not paths for python32 or 64, these commands will be taken.
pythonpath32="/C/python27x86" pythonpath32="/C/python27x86"
pythonpath64="/C/python27" pythonpath64="/C/python27"
nsyspath=$PROGRAMFILES/NSIS nsispath=$PROGRAMFILES/NSIS
help () { help () {
echo -e "$0 | usage:" echo -e "$0 | usage:"
@@ -52,6 +52,6 @@ $pythonpath64/python.exe "setup.py" "py2exe" "--quiet"
mv -f dist ../scripts/TWBlue64 mv -f dist ../scripts/TWBlue64
rm -rf build rm -rf build
cd ../scripts cd ../scripts
$nsispath/Unicode/makensis.exe "twblue.nsi" #$nsispath/Unicode/makensis.exe "twblue.nsi"
rm -rf TWBlue #rm -rf TWBlue
rm -rf TWBlue64 #rm -rf TWBlue64

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-11-27 08:24+Hora est<73>ndar central (M<>xico)\n" "POT-Creation-Date: 2016-03-24 01:11+Hora est<73>ndar 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

4
updates/snapshots.json Normal file
View File

@@ -0,0 +1,4 @@
{"current_version": "10.99",
"description": "Changes: Read the changelog from the help menu in the menu bar.",
"downloads":
{"Windows32": "http://twblue.es/pubs/twblue_snapshot.zip"}}

5
updates/stable.json Normal file
View File

@@ -0,0 +1,5 @@
{"current_version": "0.80",
"description": "The first version for the new generation of TWBlue.",
"downloads":
{"Windows32": "http://twblue.es/pubs/twblue_ngen_0.80_x86.zip",
"Windows64": "http://twblue.es/pubs/twblue_ngen_0.80_x64.zip"}}