mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2025-08-26 01:49:22 +00:00
Compare commits
23 Commits
snapshot10
...
v0.81
Author | SHA1 | Date | |
---|---|---|---|
dbbe6c0600 | |||
3caef5fc81 | |||
7cd58708cc | |||
0814af3bf4 | |||
72ba5a74f5 | |||
cbc301141e | |||
f466516289 | |||
4eef236b1c | |||
![]() |
ce00083aa2 | ||
![]() |
f92e05ce72 | ||
c02a11f269 | |||
![]() |
c79e659b74 | ||
da8009aea0 | |||
2778d2e85d | |||
ce9a50903c | |||
9a7d39c125 | |||
89759e7d49 | |||
7ca9d42f5f | |||
![]() |
6a6bec880c | ||
7b22c7d0f8 | |||
058866831b | |||
229f698e72 | |||
32067d3171 |
@@ -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
|
@@ -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"
|
||||||
|
@@ -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."
|
||||||
|
@@ -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=[]
|
||||||
|
@@ -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:
|
||||||
|
@@ -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")
|
||||||
|
@@ -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")
|
||||||
|
@@ -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
@@ -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)
|
||||||
|
BIN
src/sounds/FightingGames/audio.ogg
Normal file
BIN
src/sounds/FightingGames/audio.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/create_timeline.ogg
Normal file
BIN
src/sounds/FightingGames/create_timeline.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/delete_timeline.ogg
Normal file
BIN
src/sounds/FightingGames/delete_timeline.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/dm_received.ogg
Normal file
BIN
src/sounds/FightingGames/dm_received.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/dm_sent.ogg
Normal file
BIN
src/sounds/FightingGames/dm_sent.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/error.ogg
Normal file
BIN
src/sounds/FightingGames/error.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/favourite.ogg
Normal file
BIN
src/sounds/FightingGames/favourite.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/favourites_timeline_updated.ogg
Normal file
BIN
src/sounds/FightingGames/favourites_timeline_updated.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/geo.ogg
Normal file
BIN
src/sounds/FightingGames/geo.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/limit.ogg
Normal file
BIN
src/sounds/FightingGames/limit.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/list_tweet.ogg
Normal file
BIN
src/sounds/FightingGames/list_tweet.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/max_length.ogg
Normal file
BIN
src/sounds/FightingGames/max_length.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/mention_received.ogg
Normal file
BIN
src/sounds/FightingGames/mention_received.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/new_event.ogg
Normal file
BIN
src/sounds/FightingGames/new_event.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/ready.ogg
Normal file
BIN
src/sounds/FightingGames/ready.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/reply_send.ogg
Normal file
BIN
src/sounds/FightingGames/reply_send.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/retweet_send.ogg
Normal file
BIN
src/sounds/FightingGames/retweet_send.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/search_updated.ogg
Normal file
BIN
src/sounds/FightingGames/search_updated.ogg
Normal file
Binary file not shown.
1
src/sounds/FightingGames/sound notes.txt
Normal file
1
src/sounds/FightingGames/sound notes.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
All the sounds used in the soundpack do not belong to us. They belong to the origenal creaters.
|
BIN
src/sounds/FightingGames/trends_updated.ogg
Normal file
BIN
src/sounds/FightingGames/trends_updated.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/tweet_received.ogg
Normal file
BIN
src/sounds/FightingGames/tweet_received.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/tweet_send.ogg
Normal file
BIN
src/sounds/FightingGames/tweet_send.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/tweet_timeline.ogg
Normal file
BIN
src/sounds/FightingGames/tweet_timeline.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/update_followers.ogg
Normal file
BIN
src/sounds/FightingGames/update_followers.ogg
Normal file
Binary file not shown.
BIN
src/sounds/FightingGames/volume_changed.ogg
Normal file
BIN
src/sounds/FightingGames/volume_changed.ogg
Normal file
Binary file not shown.
1
src/sounds/Qwitter/sound notes.txt
Normal file
1
src/sounds/Qwitter/sound notes.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
All the sounds used in the soundpack do not belong to us. They belong to the origenal creaters.
|
@@ -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)
|
@@ -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()
|
@@ -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()
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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
|
@@ -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"
|
||||||
|
2991
tools/twblue.pot
2991
tools/twblue.pot
File diff suppressed because it is too large
Load Diff
4
updates/snapshots.json
Normal file
4
updates/snapshots.json
Normal 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
5
updates/stable.json
Normal 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"}}
|
Reference in New Issue
Block a user