From 39e1fb017cdad654f41d75d1ae282e58b40cb405 Mon Sep 17 00:00:00 2001 From: Manuel Cortez Date: Wed, 16 Jun 2021 16:18:41 -0500 Subject: [PATCH] Made code indentation to comply with PEP8 --- src/application.py | 14 +- src/audio_services/__init__.py | 34 +- src/audio_services/services.py | 44 +- src/audio_services/youtube_utils.py | 16 +- src/config.py | 22 +- src/config_utils.py | 112 +- src/controller/attach.py | 54 +- src/controller/buffers/__init__.py | 2 +- src/controller/buffers/baseBuffers.py | 326 +- src/controller/buffers/twitterBuffers.py | 2210 ++++++------ src/controller/filterController.py | 124 +- src/controller/listsController.py | 180 +- src/controller/mainController.py | 3066 ++++++++--------- src/controller/messages.py | 498 +-- src/controller/settings.py | 502 +-- src/controller/trendingTopics.py | 72 +- src/controller/user.py | 216 +- src/controller/userActionsController.py | 120 +- src/extra/AudioUploader/audioUploader.py | 256 +- src/extra/AudioUploader/transfer.py | 138 +- src/extra/AudioUploader/utils.py | 74 +- .../AudioUploader/wx_transfer_dialogs.py | 102 +- src/extra/AudioUploader/wx_ui.py | 98 +- src/extra/SoundsTutorial/gtk_ui.py | 36 +- src/extra/SoundsTutorial/reverse_sort.py | 4 +- src/extra/SoundsTutorial/soundsTutorial.py | 42 +- .../soundsTutorial_constants.py | 48 +- src/extra/SoundsTutorial/wx_ui.py | 46 +- src/extra/SpellChecker/__init__.py | 2 +- src/extra/SpellChecker/spellchecker.py | 112 +- src/extra/SpellChecker/wx_ui.py | 102 +- src/extra/autocompletionUsers/__init__.py | 2 +- src/extra/autocompletionUsers/completion.py | 80 +- src/extra/autocompletionUsers/manage.py | 66 +- src/extra/autocompletionUsers/settings.py | 92 +- src/extra/autocompletionUsers/storage.py | 70 +- src/extra/autocompletionUsers/wx_manage.py | 68 +- src/extra/autocompletionUsers/wx_menu.py | 36 +- src/extra/autocompletionUsers/wx_settings.py | 38 +- src/extra/ocr/OCRSpace.py | 56 +- src/extra/ocr/__init__.py | 2 +- src/extra/translator/__init__.py | 4 +- src/extra/translator/translator.py | 196 +- src/extra/translator/wx_ui.py | 42 +- src/fixes/__init__.py | 10 +- src/fixes/fix_libloader.py | 40 +- src/fixes/fix_requests.py | 6 +- src/fixes/fix_urllib3_warnings.py | 4 +- src/fixes/fix_win32com.py | 6 +- src/issueReporter/issueReporter.py | 72 +- src/issueReporter/wx_ui.py | 136 +- src/keyboard_handler/global_handler.py | 6 +- src/keyboard_handler/key_constants.py | 246 +- src/keyboard_handler/linux.py | 84 +- src/keyboard_handler/main.py | 146 +- src/keyboard_handler/osx.py | 70 +- src/keyboard_handler/windows.py | 58 +- src/keyboard_handler/wx_handler.py | 200 +- src/keys/__init__.py | 30 +- src/keys/linuxKeys.py | 4 +- src/keystrokeEditor/__init__.py | 2 +- src/keystrokeEditor/constants.py | 114 +- src/keystrokeEditor/keystrokeEditor.py | 92 +- src/keystrokeEditor/wx_ui.py | 132 +- src/languageHandler.py | 340 +- src/logger.py | 8 +- src/main.py | 204 +- src/multiplatform_widgets/__init__.py | 2 +- src/multiplatform_widgets/widgets.py | 138 +- src/mysc/autostart.py | 52 +- src/mysc/localization.py | 20 +- src/mysc/repeating_timer.py | 54 +- src/mysc/restart.py | 20 +- src/mysc/thread_utils.py | 20 +- src/notifier/__init__.py | 22 +- src/notifier/linux.py | 36 +- src/notifier/windows.py | 4 +- src/output.py | 42 +- src/paths.py | 82 +- src/sessionmanager/__init__.py | 2 +- src/sessionmanager/gtkUI.py | 88 +- src/sessionmanager/manager.py | 64 +- src/sessionmanager/sessionManager.py | 182 +- src/sessionmanager/wxUI.py | 120 +- src/sessions/__init__.py | 2 +- src/sessions/base.py | 178 +- src/sessions/session_exceptions.py | 2 +- src/sessions/twitter/__init__.py | 2 +- src/sessions/twitter/compose.py | 277 +- src/sessions/twitter/long_tweets/__init__.py | 2 +- src/sessions/twitter/long_tweets/tweets.py | 56 +- src/sessions/twitter/long_tweets/twishort.py | 136 +- src/sessions/twitter/session.py | 786 ++--- src/sessions/twitter/utils.py | 338 +- src/sessions/twitter/wxUI.py | 28 +- src/setup.py | 56 +- src/sound.py | 220 +- src/update/__init__.py | 14 +- src/update/update.py | 172 +- src/update/updater.py | 20 +- src/update/utils.py | 74 +- src/update/wxUpdater.py | 30 +- src/url_shortener/__main__.py | 48 +- src/url_shortener/shorteners/acortame.py | 40 +- src/url_shortener/shorteners/clckru.py | 22 +- src/url_shortener/shorteners/hkcim.py | 22 +- src/url_shortener/shorteners/isgd.py | 22 +- src/url_shortener/shorteners/onjme.py | 22 +- src/url_shortener/shorteners/tinyarrows.py | 22 +- src/url_shortener/shorteners/tinyurl.py | 22 +- src/url_shortener/shorteners/url_shortener.py | 64 +- src/url_shortener/shorteners/xedcc.py | 22 +- src/widgetUtils/__init__.py | 2 +- src/widgetUtils/gtkUtils.py | 170 +- src/widgetUtils/wxUtils.py | 102 +- src/wxUI/buffers/__init__.py | 2 +- src/wxUI/buffers/base.py | 72 +- src/wxUI/buffers/dm.py | 12 +- src/wxUI/buffers/events.py | 32 +- src/wxUI/buffers/favourites.py | 6 +- src/wxUI/buffers/lists.py | 6 +- src/wxUI/buffers/panels.py | 50 +- src/wxUI/buffers/people.py | 16 +- src/wxUI/buffers/trends.py | 52 +- src/wxUI/buffers/tweet_searches.py | 6 +- src/wxUI/buffers/user_searches.py | 14 +- src/wxUI/commonMessageDialogs.py | 72 +- src/wxUI/dialogs/attach.py | 76 +- src/wxUI/dialogs/baseDialog.py | 42 +- src/wxUI/dialogs/configuration.py | 716 ++-- src/wxUI/dialogs/filterDialogs.py | 250 +- src/wxUI/dialogs/find.py | 42 +- src/wxUI/dialogs/lists.py | 222 +- src/wxUI/dialogs/message.py | 808 ++--- src/wxUI/dialogs/search.py | 124 +- src/wxUI/dialogs/show_user.py | 40 +- src/wxUI/dialogs/trends.py | 74 +- src/wxUI/dialogs/update_profile.py | 170 +- src/wxUI/dialogs/urlList.py | 54 +- src/wxUI/dialogs/userActions.py | 158 +- src/wxUI/dialogs/userSelection.py | 110 +- src/wxUI/dialogs/utils.py | 46 +- src/wxUI/menus.py | 178 +- src/wxUI/sysTrayIcon.py | 36 +- src/wxUI/view.py | 320 +- 145 files changed, 9577 insertions(+), 9584 deletions(-) diff --git a/src/application.py b/src/application.py index bfd6a88a..41869e88 100644 --- a/src/application.py +++ b/src/application.py @@ -5,13 +5,13 @@ name = 'TWBlue' short_name='twblue' snapshot = True if snapshot == False: - version = "0.95" - update_url = 'https://twblue.es/updates/stable.php' - mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json' + version = "0.95" + update_url = 'https://twblue.es/updates/stable.php' + mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/stable.json' else: - version = "5" - update_url = 'https://twblue.es/updates/snapshot.php' - mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json' + version = "5" + update_url = 'https://twblue.es/updates/snapshot.php' + mirror_update_url = 'https://raw.githubusercontent.com/manuelcortez/TWBlue/next-gen/updates/snapshots.json' authors = ["Manuel Cortéz", "José Manuel Delicado"] authorEmail = "manuel@manuelcortez.net" copyright = "Copyright (C) 2013-2021, Manuel cortéz." @@ -19,4 +19,4 @@ description = name+" is an app designed to use Twitter simply and efficiently wh translators = ["Manuel Cortéz (English)", "Mohammed Al Shara, Hatoun Felemban (Arabic)", "Francisco Torres (Catalan)", "Manuel cortéz (Spanish)", "Sukil Etxenike Arizaleta (Basque)", "Jani Kinnunen (finnish)", "Oreonan (Français)", "Juan Buño (Galician)", "Steffen Schultz (German)", "Zvonimir Stanečić (Croatian)", "Robert Osztolykan (Hungarian)", "Christian Leo Mameli (Italian)", "Riku (Japanese)", "Paweł Masarczyk (Polish)", "Odenilton Júnior Santos (Portuguese)", "Florian Ionașcu, Nicușor Untilă (Romanian)", "Natalia Hedlund, Valeria Kuznetsova (Russian)", "Aleksandar Đurić (Serbian)", "Burak Yüksek (Turkish)"] url = u"https://twblue.es" report_bugs_url = "https://github.com/manuelcortez/twblue/issues" -supported_languages = [] \ No newline at end of file +supported_languages = [] diff --git a/src/audio_services/__init__.py b/src/audio_services/__init__.py index 4d092b4c..d33809cb 100644 --- a/src/audio_services/__init__.py +++ b/src/audio_services/__init__.py @@ -2,22 +2,22 @@ from __future__ import unicode_literals from functools import wraps def matches_url(url): - def url_setter(func): - @wraps(func) - def internal_url_setter(*args, **kwargs): - return func(*args, **kwargs) - internal_url_setter.url = url - return internal_url_setter - return url_setter + def url_setter(func): + @wraps(func) + def internal_url_setter(*args, **kwargs): + return func(*args, **kwargs) + internal_url_setter.url = url + return internal_url_setter + return url_setter def find_url_transformer(url): - from audio_services import services - funcs = [] - for i in dir(services): - possible = getattr(services, i) - if callable(possible) and hasattr(possible, 'url'): - funcs.append(possible) - for f in funcs: - if url.lower().startswith(f.url.lower()): - return f - return services.convert_generic_audio + from audio_services import services + funcs = [] + for i in dir(services): + possible = getattr(services, i) + if callable(possible) and hasattr(possible, 'url'): + funcs.append(possible) + for f in funcs: + if url.lower().startswith(f.url.lower()): + return f + return services.convert_generic_audio diff --git a/src/audio_services/services.py b/src/audio_services/services.py index eefde7d5..b19ab68d 100644 --- a/src/audio_services/services.py +++ b/src/audio_services/services.py @@ -5,37 +5,37 @@ from . import youtube_utils @matches_url('https://audioboom.com') def convert_audioboom(url): - if "audioboom.com" not in url.lower(): - raise TypeError('%r is not a valid URL' % url) - audio_id = url.split('.com/')[-1] - return 'https://audioboom.com/%s.mp3' % audio_id + if "audioboom.com" not in url.lower(): + raise TypeError('%r is not a valid URL' % url) + audio_id = url.split('.com/')[-1] + return 'https://audioboom.com/%s.mp3' % audio_id @matches_url ('https://soundcloud.com/') def convert_soundcloud (url): - client_id = "df8113ca95c157b6c9731f54b105b473" - with requests.get('http://api.soundcloud.com/resolve.json', client_id=client_id, url=url) as permalink: - if permalink.status_code==404: - raise TypeError('%r is not a valid URL' % permalink.url) - else: - resolved_url = permalink.url - with requests.get(resolved_url) as track_url: - track_data = track_url.json() + client_id = "df8113ca95c157b6c9731f54b105b473" + with requests.get('http://api.soundcloud.com/resolve.json', client_id=client_id, url=url) as permalink: + if permalink.status_code==404: + raise TypeError('%r is not a valid URL' % permalink.url) + else: + resolved_url = permalink.url + with requests.get(resolved_url) as track_url: + track_data = track_url.json() - if track_data ['streamable']: - return track_data ['stream_url'] + "?client_id=%s" %client_id - else: - raise TypeError('%r is not streamable' % url) + if track_data ['streamable']: + return track_data ['stream_url'] + "?client_id=%s" %client_id + else: + raise TypeError('%r is not streamable' % url) @matches_url ('https://www.youtube.com/watch') def convert_youtube_long (url): - return youtube_utils.get_video_url(url) + return youtube_utils.get_video_url(url) @matches_url ('http://anyaudio.net/listen') def convert_anyaudio(url): - values = url.split("audio=") - if len(values) != 2: - raise TypeError('%r is not streamable' % url) - return "http://anyaudio.net/audiodownload?audio=%s" % (values[1],) + values = url.split("audio=") + if len(values) != 2: + raise TypeError('%r is not streamable' % url) + return "http://anyaudio.net/audiodownload?audio=%s" % (values[1],) def convert_generic_audio(url): - return url + return url diff --git a/src/audio_services/youtube_utils.py b/src/audio_services/youtube_utils.py index 3c4430a9..7341cfbf 100644 --- a/src/audio_services/youtube_utils.py +++ b/src/audio_services/youtube_utils.py @@ -3,11 +3,11 @@ from __future__ import unicode_literals import youtube_dl def get_video_url(url): - ydl = youtube_dl.YoutubeDL({'quiet': True, 'format': 'bestaudio/best', 'outtmpl': u'%(id)s%(ext)s'}) - with ydl: - result = ydl.extract_info(url, download=False) - if 'entries' in result: - video = result['entries'][0] - else: - video = result - return video["formats"][0]["url"] + ydl = youtube_dl.YoutubeDL({'quiet': True, 'format': 'bestaudio/best', 'outtmpl': u'%(id)s%(ext)s'}) + with ydl: + result = ydl.extract_info(url, download=False) + if 'entries' in result: + video = result['entries'][0] + else: + video = result + return video["formats"][0]["url"] diff --git a/src/config.py b/src/config.py index a7e94eb6..1954c628 100644 --- a/src/config.py +++ b/src/config.py @@ -15,14 +15,14 @@ keymap=None changed_keymap = False def setup (): - global app - log.debug("Loading global app settings...") - app = config_utils.load_config(os.path.join(paths.config_path(), MAINFILE), os.path.join(paths.app_path(), MAINSPEC)) - log.debug("Loading keymap...") - global keymap - if float(platform.version()[:2]) >= 10 and app["app-settings"]["load_keymap"] == "default.keymap": - app["app-settings"]["load_keymap"] = "Windows 10.keymap" - app.write() - global changed_keymap - changed_keymap = True - keymap = config_utils.load_config(os.path.join(paths.config_path(), "keymap.keymap"), os.path.join(paths.app_path(), "keymaps/"+app['app-settings']['load_keymap']), copy=False) + global app + log.debug("Loading global app settings...") + app = config_utils.load_config(os.path.join(paths.config_path(), MAINFILE), os.path.join(paths.app_path(), MAINSPEC)) + log.debug("Loading keymap...") + global keymap + if float(platform.version()[:2]) >= 10 and app["app-settings"]["load_keymap"] == "default.keymap": + app["app-settings"]["load_keymap"] = "Windows 10.keymap" + app.write() + global changed_keymap + changed_keymap = True + keymap = config_utils.load_config(os.path.join(paths.config_path(), "keymap.keymap"), os.path.join(paths.app_path(), "keymaps/"+app['app-settings']['load_keymap']), copy=False) diff --git a/src/config_utils.py b/src/config_utils.py index f2cc10e6..fb0b2ccf 100644 --- a/src/config_utils.py +++ b/src/config_utils.py @@ -9,69 +9,69 @@ log = getLogger("config_utils") class ConfigLoadError(Exception): pass def load_config(config_path, configspec_path=None, copy=True, *args, **kwargs): - spec = ConfigObj(configspec_path, encoding='UTF8', list_values=False, _inspec=True) - try: - config = ConfigObj(infile=config_path, configspec=spec, create_empty=True, encoding='UTF8', *args, **kwargs) - except ParseError: - raise ConfigLoadError("Unable to load %r" % config_path) - validator = Validator() - validated = config.validate(validator, preserve_errors=False, copy=copy) - if validated == True: - config.write() - return config - else: - log.exception("Error in config file: {0}".format(validated,)) + spec = ConfigObj(configspec_path, encoding='UTF8', list_values=False, _inspec=True) + try: + config = ConfigObj(infile=config_path, configspec=spec, create_empty=True, encoding='UTF8', *args, **kwargs) + except ParseError: + raise ConfigLoadError("Unable to load %r" % config_path) + validator = Validator() + validated = config.validate(validator, preserve_errors=False, copy=copy) + if validated == True: + config.write() + return config + else: + log.exception("Error in config file: {0}".format(validated,)) def is_blank(arg): - "Check if a line is blank." - for c in arg: - if c not in string.whitespace: - return False - return True + "Check if a line is blank." + for c in arg: + if c not in string.whitespace: + return False + return True def get_keys(path): - "Gets the keys of a configobj config file." - res=[] - fin=open(path) - for line in fin: - if not is_blank(line): - res.append(line[0:line.find('=')].strip()) - fin.close() - return res + "Gets the keys of a configobj config file." + res=[] + fin=open(path) + for line in fin: + if not is_blank(line): + res.append(line[0:line.find('=')].strip()) + fin.close() + return res def hist(keys): - "Generates a histogram of an iterable." - res={} - for k in keys: - res[k]=res.setdefault(k,0)+1 - return res + "Generates a histogram of an iterable." + res={} + for k in keys: + res[k]=res.setdefault(k,0)+1 + return res def find_problems(hist): - "Takes a histogram and returns a list of items occurring more than once." - res=[] - for k,v in hist.items(): - if v>1: - res.append(k) - return res + "Takes a histogram and returns a list of items occurring more than once." + res=[] + for k,v in hist.items(): + if v>1: + res.append(k) + return res def clean_config(path): - "Cleans a config file. If duplicate values are found, delete all of them and just use the default." - orig=[] - cleaned=[] - fin=open(path) - for line in fin: - orig.append(line) - fin.close() - for p in find_problems(hist(get_keys(path))): - for o in orig: - o.strip() - if p not in o: - cleaned.append(o) - if len(cleaned) != 0: - cam=open(path,'w') - for c in cleaned: - cam.write(c) - cam.close() - return True - else: - return False \ No newline at end of file + "Cleans a config file. If duplicate values are found, delete all of them and just use the default." + orig=[] + cleaned=[] + fin=open(path) + for line in fin: + orig.append(line) + fin.close() + for p in find_problems(hist(get_keys(path))): + for o in orig: + o.strip() + if p not in o: + cleaned.append(o) + if len(cleaned) != 0: + cam=open(path,'w') + for c in cleaned: + cam.write(c) + cam.close() + return True + else: + return False diff --git a/src/controller/attach.py b/src/controller/attach.py index 666e55f3..08427142 100644 --- a/src/controller/attach.py +++ b/src/controller/attach.py @@ -8,33 +8,33 @@ from wxUI.dialogs import attach as gui log = logging.getLogger("controller.attach") class attach(object): - def __init__(self): - self.attachments = list() - self.dialog = gui.attachDialog() - widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image) - widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_attachment) - self.dialog.get_response() - log.debug("Attachments controller started.") + def __init__(self): + self.attachments = list() + self.dialog = gui.attachDialog() + widgetUtils.connect_event(self.dialog.photo, widgetUtils.BUTTON_PRESSED, self.upload_image) + widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_attachment) + self.dialog.get_response() + log.debug("Attachments controller started.") - def upload_image(self, *args, **kwargs): - image, description = self.dialog.get_image() - if image != None: - imageInfo = {"type": "photo", "file": image, "description": description} - log.debug("Image data to upload: %r" % (imageInfo,)) - self.attachments.append(imageInfo) - info = [_(u"Photo"), description] - self.dialog.attachments.insert_item(False, *info) - self.dialog.remove.Enable(True) + def upload_image(self, *args, **kwargs): + image, description = self.dialog.get_image() + if image != None: + imageInfo = {"type": "photo", "file": image, "description": description} + log.debug("Image data to upload: %r" % (imageInfo,)) + self.attachments.append(imageInfo) + info = [_(u"Photo"), description] + self.dialog.attachments.insert_item(False, *info) + self.dialog.remove.Enable(True) - def remove_attachment(self, *args, **kwargs): - current_item = self.dialog.attachments.get_selected() - log.debug("Removing item %d" % (current_item,)) - if current_item == -1: current_item = 0 - self.attachments.pop(current_item) - self.dialog.attachments.remove_item(current_item) - self.check_remove_status() - log.debug("Removed") + def remove_attachment(self, *args, **kwargs): + current_item = self.dialog.attachments.get_selected() + log.debug("Removing item %d" % (current_item,)) + if current_item == -1: current_item = 0 + self.attachments.pop(current_item) + self.dialog.attachments.remove_item(current_item) + self.check_remove_status() + log.debug("Removed") - def check_remove_status(self): - if len(self.attachments) == 0 and self.dialog.attachments.get_count() == 0: - self.dialog.remove.Enable(False) + def check_remove_status(self): + if len(self.attachments) == 0 and self.dialog.attachments.get_count() == 0: + self.dialog.remove.Enable(False) diff --git a/src/controller/buffers/__init__.py b/src/controller/buffers/__init__.py index 2900a6e9..4e7aa78c 100644 --- a/src/controller/buffers/__init__.py +++ b/src/controller/buffers/__init__.py @@ -5,4 +5,4 @@ * baseBuffers: Define a set of functions and structure to be expected in all buffers. New buffers should inherit its classes from one of the classes present here. * twitterBuffers: All other code, specific to Twitter. """ -from __future__ import unicode_literals \ No newline at end of file +from __future__ import unicode_literals diff --git a/src/controller/buffers/baseBuffers.py b/src/controller/buffers/baseBuffers.py index 2bb09c80..7437aa48 100644 --- a/src/controller/buffers/baseBuffers.py +++ b/src/controller/buffers/baseBuffers.py @@ -14,196 +14,196 @@ from wxUI import buffers log = logging.getLogger("controller.buffers.baseBuffers") def _items_exist(function): - """ A decorator to execute a function only if the selected buffer contains at least one item.""" - def function_(self, *args, **kwargs): - if self.buffer.list.get_count() > 0: - function(self, *args, **kwargs) - return function_ + """ A decorator to execute a function only if the selected buffer contains at least one item.""" + def function_(self, *args, **kwargs): + if self.buffer.list.get_count() > 0: + function(self, *args, **kwargs) + return function_ class buffer(object): - """ A basic buffer object. This should be the base class for all other derived buffers.""" + """ A basic buffer object. This should be the base class for all other derived buffers.""" - def __init__(self, parent=None, function=None, session=None, *args, **kwargs): - """Inits the main controller for this buffer: - @ parent wx.Treebook object: Container where we will put this buffer. - @ function str or None: function to be called periodically and update items on this buffer. - @ session sessionmanager.session object or None: Session handler for settings, database and data access. - """ - super(buffer, self).__init__() - self.function = function - # Compose_function will be used to render an object on this buffer. Normally, signature is as follows: - # compose_function(item, db, relative_times, show_screen_names=False, session=None) - # Read more about compose functions in twitter/compose.py. - self.compose_function = None - self.args = args - self.kwargs = kwargs - # This will be used as a reference to the wx.Panel object wich stores the buffer GUI. - self.buffer = None - # This should countains the account associated to this buffer. - self.account = "" - # This controls whether the start_stream function should be called when starting the program. - self.needs_init = True - # if this is set to False, the buffer will be ignored on the invisible interface. - self.invisible = False - # Control variable, used to track time of execution for calls to start_stream. - self.execution_time = 0 + def __init__(self, parent=None, function=None, session=None, *args, **kwargs): + """Inits the main controller for this buffer: + @ parent wx.Treebook object: Container where we will put this buffer. + @ function str or None: function to be called periodically and update items on this buffer. + @ session sessionmanager.session object or None: Session handler for settings, database and data access. + """ + super(buffer, self).__init__() + self.function = function + # Compose_function will be used to render an object on this buffer. Normally, signature is as follows: + # compose_function(item, db, relative_times, show_screen_names=False, session=None) + # Read more about compose functions in twitter/compose.py. + self.compose_function = None + self.args = args + self.kwargs = kwargs + # This will be used as a reference to the wx.Panel object wich stores the buffer GUI. + self.buffer = None + # This should countains the account associated to this buffer. + self.account = "" + # This controls whether the start_stream function should be called when starting the program. + self.needs_init = True + # if this is set to False, the buffer will be ignored on the invisible interface. + self.invisible = False + # Control variable, used to track time of execution for calls to start_stream. + self.execution_time = 0 - def clear_list(self): - pass + def clear_list(self): + pass - def get_event(self, ev): - """ Catch key presses in the WX interface and generate the corresponding event names.""" - if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio" - elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url" - elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down" - elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up" - elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list" - elif ev.GetKeyCode() == wx.WXK_DELETE: event = "destroy_status" - # Raise a Special event when pressed Shift+F10 because Wx==4.1.x does not seems to trigger this by itself. - # See https://github.com/manuelcortez/TWBlue/issues/353 - elif ev.GetKeyCode() == wx.WXK_F10 and ev.ShiftDown(): event = "show_menu" - else: - event = None - ev.Skip() - if event != None: - try: - ### ToDo: Remove after WX fixes issue #353 in the widgets. - if event == "show_menu": - return self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition()) - getattr(self, event)() - except AttributeError: - pass + def get_event(self, ev): + """ Catch key presses in the WX interface and generate the corresponding event names.""" + if ev.GetKeyCode() == wx.WXK_RETURN and ev.ControlDown(): event = "audio" + elif ev.GetKeyCode() == wx.WXK_RETURN: event = "url" + elif ev.GetKeyCode() == wx.WXK_F5: event = "volume_down" + elif ev.GetKeyCode() == wx.WXK_F6: event = "volume_up" + elif ev.GetKeyCode() == wx.WXK_DELETE and ev.ShiftDown(): event = "clear_list" + elif ev.GetKeyCode() == wx.WXK_DELETE: event = "destroy_status" + # Raise a Special event when pressed Shift+F10 because Wx==4.1.x does not seems to trigger this by itself. + # See https://github.com/manuelcortez/TWBlue/issues/353 + elif ev.GetKeyCode() == wx.WXK_F10 and ev.ShiftDown(): event = "show_menu" + else: + event = None + ev.Skip() + if event != None: + try: + ### ToDo: Remove after WX fixes issue #353 in the widgets. + if event == "show_menu": + return self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition()) + getattr(self, event)() + except AttributeError: + pass - def volume_down(self): - """ Decreases volume by 5%""" - if self.session.settings["sound"]["volume"] > 0.0: - if self.session.settings["sound"]["volume"] <= 0.05: - self.session.settings["sound"]["volume"] = 0.0 - else: - self.session.settings["sound"]["volume"] -=0.05 - sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100.0)) - self.session.sound.play("volume_changed.ogg") - self.session.settings.write() + def volume_down(self): + """ Decreases volume by 5%""" + if self.session.settings["sound"]["volume"] > 0.0: + if self.session.settings["sound"]["volume"] <= 0.05: + self.session.settings["sound"]["volume"] = 0.0 + else: + self.session.settings["sound"]["volume"] -=0.05 + sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100.0)) + self.session.sound.play("volume_changed.ogg") + self.session.settings.write() - def volume_up(self): - """ Increases volume by 5%.""" - if self.session.settings["sound"]["volume"] < 1.0: - if self.session.settings["sound"]["volume"] >= 0.95: - self.session.settings["sound"]["volume"] = 1.0 - else: - self.session.settings["sound"]["volume"] +=0.05 - sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100)) - self.session.sound.play("volume_changed.ogg") - self.session.settings.write() + def volume_up(self): + """ Increases volume by 5%.""" + if self.session.settings["sound"]["volume"] < 1.0: + if self.session.settings["sound"]["volume"] >= 0.95: + self.session.settings["sound"]["volume"] = 1.0 + else: + self.session.settings["sound"]["volume"] +=0.05 + sound.URLPlayer.player.audio_set_volume(int(self.session.settings["sound"]["volume"]*100)) + self.session.sound.play("volume_changed.ogg") + self.session.settings.write() - def start_stream(self, mandatory=False, play_sound=True): - pass + def start_stream(self, mandatory=False, play_sound=True): + pass - def get_more_items(self): - output.speak(_(u"This action is not supported for this buffer"), True) + def get_more_items(self): + output.speak(_(u"This action is not supported for this buffer"), True) - def put_items_on_list(self, items): - pass + def put_items_on_list(self, items): + pass - def remove_buffer(self): - return False + def remove_buffer(self): + return False - def remove_item(self, item): - f = self.buffer.list.get_selected() - self.buffer.list.remove_item(item) - self.buffer.list.select_item(f) + def remove_item(self, item): + f = self.buffer.list.get_selected() + self.buffer.list.remove_item(item) + self.buffer.list.select_item(f) - def bind_events(self): - pass + def bind_events(self): + pass - def get_object(self): - return self.buffer + def get_object(self): + return self.buffer - def get_message(self): - pass + def get_message(self): + pass - def set_list_position(self, reversed=False): - if reversed == False: - self.buffer.list.select_item(-1) - else: - self.buffer.list.select_item(0) + def set_list_position(self, reversed=False): + if reversed == False: + self.buffer.list.select_item(-1) + else: + self.buffer.list.select_item(0) - def reply(self): - pass + def reply(self): + pass - def send_message(self): - pass + def send_message(self): + pass - def share_item(self): - pass + def share_item(self): + pass - def destroy_status(self): - pass + def destroy_status(self): + pass - def post_status(self, *args, **kwargs): - pass + def post_status(self, *args, **kwargs): + pass - def save_positions(self): - try: - self.session.db[self.name+"_pos"]=self.buffer.list.get_selected() - except AttributeError: - pass + def save_positions(self): + try: + self.session.db[self.name+"_pos"]=self.buffer.list.get_selected() + except AttributeError: + pass class accountPanel(buffer): - def __init__(self, parent, name, account, account_id): - super(accountPanel, self).__init__(parent, None, name) - log.debug("Initializing buffer %s, account %s" % (name, account,)) - self.buffer = buffers.accountPanel(parent, name) - self.type = self.buffer.type - self.compose_function = None - self.session = None - self.needs_init = False - self.account = account - self.buffer.account = account - self.name = name - self.account_id = account_id + def __init__(self, parent, name, account, account_id): + super(accountPanel, self).__init__(parent, None, name) + log.debug("Initializing buffer %s, account %s" % (name, account,)) + self.buffer = buffers.accountPanel(parent, name) + self.type = self.buffer.type + self.compose_function = None + self.session = None + self.needs_init = False + self.account = account + self.buffer.account = account + self.name = name + self.account_id = account_id - def setup_account(self): - widgetUtils.connect_event(self.buffer, widgetUtils.CHECKBOX, self.autostart, menuitem=self.buffer.autostart_account) - if self.account_id in config.app["sessions"]["ignored_sessions"]: - self.buffer.change_autostart(False) - else: - self.buffer.change_autostart(True) - if not hasattr(self, "logged"): - self.buffer.change_login(login=False) - widgetUtils.connect_event(self.buffer.login, widgetUtils.BUTTON_PRESSED, self.logout) - else: - self.buffer.change_login(login=True) - widgetUtils.connect_event(self.buffer.login, widgetUtils.BUTTON_PRESSED, self.login) + def setup_account(self): + widgetUtils.connect_event(self.buffer, widgetUtils.CHECKBOX, self.autostart, menuitem=self.buffer.autostart_account) + if self.account_id in config.app["sessions"]["ignored_sessions"]: + self.buffer.change_autostart(False) + else: + self.buffer.change_autostart(True) + if not hasattr(self, "logged"): + self.buffer.change_login(login=False) + widgetUtils.connect_event(self.buffer.login, widgetUtils.BUTTON_PRESSED, self.logout) + else: + self.buffer.change_login(login=True) + widgetUtils.connect_event(self.buffer.login, widgetUtils.BUTTON_PRESSED, self.login) - def login(self, *args, **kwargs): - del self.logged - self.setup_account() - pub.sendMessage("login", session_id=self.account_id) + def login(self, *args, **kwargs): + del self.logged + self.setup_account() + pub.sendMessage("login", session_id=self.account_id) - def logout(self, *args, **kwargs): - self.logged = False - self.setup_account() - pub.sendMessage("logout", session_id=self.account_id) + def logout(self, *args, **kwargs): + self.logged = False + self.setup_account() + pub.sendMessage("logout", session_id=self.account_id) - def autostart(self, *args, **kwargs): - if self.account_id in config.app["sessions"]["ignored_sessions"]: - self.buffer.change_autostart(True) - config.app["sessions"]["ignored_sessions"].remove(self.account_id) - else: - self.buffer.change_autostart(False) - config.app["sessions"]["ignored_sessions"].append(self.account_id) - config.app.write() + def autostart(self, *args, **kwargs): + if self.account_id in config.app["sessions"]["ignored_sessions"]: + self.buffer.change_autostart(True) + config.app["sessions"]["ignored_sessions"].remove(self.account_id) + else: + self.buffer.change_autostart(False) + config.app["sessions"]["ignored_sessions"].append(self.account_id) + config.app.write() class emptyPanel(buffer): - def __init__(self, parent, name, account): - super(emptyPanel, self).__init__(parent=parent) - log.debug("Initializing buffer %s, account %s" % (name, account,)) - self.buffer = buffers.emptyPanel(parent, name) - self.type = self.buffer.type - self.compose_function = None - self.account = account - self.buffer.account = account - self.name = name - self.session = None - self.needs_init = True + def __init__(self, parent, name, account): + super(emptyPanel, self).__init__(parent=parent) + log.debug("Initializing buffer %s, account %s" % (name, account,)) + self.buffer = buffers.emptyPanel(parent, name) + self.type = self.buffer.type + self.compose_function = None + self.account = account + self.buffer.account = account + self.name = name + self.session = None + self.needs_init = True diff --git a/src/controller/buffers/twitterBuffers.py b/src/controller/buffers/twitterBuffers.py index 05870eef..0fdacac4 100644 --- a/src/controller/buffers/twitterBuffers.py +++ b/src/controller/buffers/twitterBuffers.py @@ -2,12 +2,12 @@ import time import platform if platform.system() == "Windows": - import wx - from wxUI import buffers, dialogs, commonMessageDialogs, menus - from controller import user + import wx + from wxUI import buffers, dialogs, commonMessageDialogs, menus + from controller import user elif platform.system() == "Linux": - from gi.repository import Gtk - from gtkUI import buffers, dialogs, commonMessageDialogs + from gi.repository import Gtk + from gtkUI import buffers, dialogs, commonMessageDialogs from controller import messages import widgetUtils import arrow @@ -29,1217 +29,1217 @@ from sessions.twitter.long_tweets import twishort, tweets log = logging.getLogger("controller.buffers") def _tweets_exist(function): - """ A decorator to execute a function only if the selected buffer contains at least one item.""" - def function_(self, *args, **kwargs): - if self.buffer.list.get_count() > 0: - function(self, *args, **kwargs) - return function_ + """ A decorator to execute a function only if the selected buffer contains at least one item.""" + def function_(self, *args, **kwargs): + if self.buffer.list.get_count() > 0: + function(self, *args, **kwargs) + return function_ class baseBufferController(baseBuffers.buffer): - def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, compose_func="compose_tweet", *args, **kwargs): - super(baseBufferController, self).__init__(parent, function, *args, **kwargs) - log.debug("Initializing buffer %s, account %s" % (name, account,)) - if bufferType != None: - self.buffer = getattr(buffers, bufferType)(parent, name) - else: - self.buffer = buffers.basePanel(parent, name) - self.invisible = True - self.name = name - self.type = self.buffer.type - self.session = sessionObject - self.compose_function = getattr(compose, compose_func) - log.debug("Compose_function: %s" % (self.compose_function,)) - self.account = account - self.buffer.account = account - self.bind_events() - self.sound = sound - if "-timeline" in self.name or "-favorite" in self.name: - self.finished_timeline = False - # Add a compatibility layer for username based timelines from config. - # ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory. - try: - int(self.kwargs["user_id"]) - except ValueError: - self.is_screen_name = True - self.kwargs["screen_name"] = self.kwargs["user_id"] - self.kwargs.pop("user_id") + def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, compose_func="compose_tweet", *args, **kwargs): + super(baseBufferController, self).__init__(parent, function, *args, **kwargs) + log.debug("Initializing buffer %s, account %s" % (name, account,)) + if bufferType != None: + self.buffer = getattr(buffers, bufferType)(parent, name) + else: + self.buffer = buffers.basePanel(parent, name) + self.invisible = True + self.name = name + self.type = self.buffer.type + self.session = sessionObject + self.compose_function = getattr(compose, compose_func) + log.debug("Compose_function: %s" % (self.compose_function,)) + self.account = account + self.buffer.account = account + self.bind_events() + self.sound = sound + if "-timeline" in self.name or "-favorite" in self.name: + self.finished_timeline = False + # Add a compatibility layer for username based timelines from config. + # ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory. + try: + int(self.kwargs["user_id"]) + except ValueError: + self.is_screen_name = True + self.kwargs["screen_name"] = self.kwargs["user_id"] + self.kwargs.pop("user_id") - def get_buffer_name(self): - """ Get buffer name from a set of different techniques.""" - # firstly let's take the easier buffers. - basic_buffers = dict(home_timeline=_(u"Home"), mentions=_(u"Mentions"), direct_messages=_(u"Direct messages"), sent_direct_messages=_(u"Sent direct messages"), sent_tweets=_(u"Sent tweets"), favourites=_(u"Likes"), followers=_(u"Followers"), friends=_(u"Friends"), blocked=_(u"Blocked users"), muted=_(u"Muted users")) - if self.name in list(basic_buffers.keys()): - return basic_buffers[self.name] - # Check user timelines - elif hasattr(self, "username"): - if "-timeline" in self.name: - return _(u"{username}'s timeline").format(username=self.username,) - elif "-favorite" in self.name: - return _(u"{username}'s likes").format(username=self.username,) - elif "-followers" in self.name: - return _(u"{username}'s followers").format(username=self.username,) - elif "-friends" in self.name: - return _(u"{username}'s friends").format(username=self.username,) - log.error("Error getting name for buffer %s" % (self.name,)) - return _(u"Unknown buffer") + def get_buffer_name(self): + """ Get buffer name from a set of different techniques.""" + # firstly let's take the easier buffers. + basic_buffers = dict(home_timeline=_(u"Home"), mentions=_(u"Mentions"), direct_messages=_(u"Direct messages"), sent_direct_messages=_(u"Sent direct messages"), sent_tweets=_(u"Sent tweets"), favourites=_(u"Likes"), followers=_(u"Followers"), friends=_(u"Friends"), blocked=_(u"Blocked users"), muted=_(u"Muted users")) + if self.name in list(basic_buffers.keys()): + return basic_buffers[self.name] + # Check user timelines + elif hasattr(self, "username"): + if "-timeline" in self.name: + return _(u"{username}'s timeline").format(username=self.username,) + elif "-favorite" in self.name: + return _(u"{username}'s likes").format(username=self.username,) + elif "-followers" in self.name: + return _(u"{username}'s followers").format(username=self.username,) + elif "-friends" in self.name: + return _(u"{username}'s friends").format(username=self.username,) + log.error("Error getting name for buffer %s" % (self.name,)) + return _(u"Unknown buffer") - def post_status(self, *args, **kwargs): - item = None - title = _(u"Tweet") - caption = _(u"Write the tweet here") - tweet = messages.tweet(self.session, title, caption, "") - if tweet.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = tweet.message.long_tweet.GetValue() - config.app.write() - text = tweet.message.get_text() - if len(text) > 280 and tweet.message.get("long_tweet") == True: - if not hasattr(tweet, "attachments"): - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) - else: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) - if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0: - item = self.session.api_call(call_name="update_status", status=text, _sound="tweet_send.ogg", tweet_mode="extended") - else: - call_threaded(self.post_with_media, text=text, attachments=tweet.attachments) - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - if hasattr(tweet.message, "destroy"): tweet.message.destroy() - self.session.settings.write() + def post_status(self, *args, **kwargs): + item = None + title = _(u"Tweet") + caption = _(u"Write the tweet here") + tweet = messages.tweet(self.session, title, caption, "") + if tweet.message.get_response() == widgetUtils.OK: + if config.app["app-settings"]["remember_mention_and_longtweet"]: + config.app["app-settings"]["longtweet"] = tweet.message.long_tweet.GetValue() + config.app.write() + text = tweet.message.get_text() + if len(text) > 280 and tweet.message.get("long_tweet") == True: + if not hasattr(tweet, "attachments"): + text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) + else: + text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) + if not hasattr(tweet, "attachments") or len(tweet.attachments) == 0: + item = self.session.api_call(call_name="update_status", status=text, _sound="tweet_send.ogg", tweet_mode="extended") + else: + call_threaded(self.post_with_media, text=text, attachments=tweet.attachments) + if item != None: + pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + if hasattr(tweet.message, "destroy"): tweet.message.destroy() + self.session.settings.write() - def post_with_media(self, text, attachments): - media_ids = [] - for i in attachments: - img = self.session.twitter.media_upload(i["file"]) - self.session.twitter.create_media_metadata(media_id=img.media_id, alt_text=i["description"]) - media_ids.append(img.media_id) - item = self.session.twitter.update_status(status=text, media_ids=media_ids) - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + def post_with_media(self, text, attachments): + media_ids = [] + for i in attachments: + img = self.session.twitter.media_upload(i["file"]) + self.session.twitter.create_media_metadata(media_id=img.media_id, alt_text=i["description"]) + media_ids.append(img.media_id) + item = self.session.twitter.update_status(status=text, media_ids=media_ids) + if item != None: + pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - def get_formatted_message(self): - if self.type == "dm" or self.name == "direct_messages": - return self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)[1] - return self.get_message() + def get_formatted_message(self): + if self.type == "dm" or self.name == "direct_messages": + return self.compose_function(self.get_right_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)[1] + return self.get_message() - def get_message(self): - tweet = self.get_right_tweet() - return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)) + def get_message(self): + tweet = self.get_right_tweet() + return " ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)) - def get_full_tweet(self): - tweet = self.get_right_tweet() - tweetsList = [] - tweet_id = tweet.id - message = None - if hasattr(tweet, "message"): - message = tweet.message - try: - tweet = self.session.twitter.get_status(id=tweet_id, include_ext_alt_text=True, tweet_mode="extended") - tweet.full_text = utils.expand_urls(tweet.full_text, tweet.entities) - except TweepError as e: - utils.twitter_error(e) - return - if message != None: - tweet.message = message - l = tweets.is_long(tweet) - while l != False: - tweetsList.append(tweet) - try: - tweet = self.session.twitter.get_status(id=l, include_ext_alt_text=True, tweet_mode="extended") - tweet.full_text = utils.expand_urls(tweet.full_text, tweet.entities) - except TweepError as e: - utils.twitter_error(e) - return - l = tweets.is_long(tweet) - if l == False: - tweetsList.append(tweet) - return (tweet, tweetsList) + def get_full_tweet(self): + tweet = self.get_right_tweet() + tweetsList = [] + tweet_id = tweet.id + message = None + if hasattr(tweet, "message"): + message = tweet.message + try: + tweet = self.session.twitter.get_status(id=tweet_id, include_ext_alt_text=True, tweet_mode="extended") + tweet.full_text = utils.expand_urls(tweet.full_text, tweet.entities) + except TweepError as e: + utils.twitter_error(e) + return + if message != None: + tweet.message = message + l = tweets.is_long(tweet) + while l != False: + tweetsList.append(tweet) + try: + tweet = self.session.twitter.get_status(id=l, include_ext_alt_text=True, tweet_mode="extended") + tweet.full_text = utils.expand_urls(tweet.full_text, tweet.entities) + except TweepError as e: + utils.twitter_error(e) + return + l = tweets.is_long(tweet) + if l == False: + tweetsList.append(tweet) + return (tweet, tweetsList) - def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): - # starts stream every 3 minutes. - current_time = time.time() - if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True: - self.execution_time = current_time - log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type)) - log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) - if self.name != "direct_messages": - val = self.session.call_paged(self.function, *self.args, **self.kwargs) - else: - # 50 results are allowed per API call, so let's assume max value can be 50. - # reference: https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events - if self.session.settings["general"]["max_tweets_per_call"] > 50: - count = 50 - else: - count = self.session.settings["general"]["max_tweets_per_call"] - # try to retrieve the cursor for the current buffer. - try: - val = getattr(self.session.twitter, self.function)(return_cursors=True, count=count, *self.args, **self.kwargs) - if type(val) == tuple: - val, cursor = val - if type(cursor) == tuple: - cursor = cursor[1] - self.session.db["cursors"][self.name] = cursor - results = [i for i in val] - val = results - val.reverse() - log.debug("Retrieved %d items from the cursored search on function %s." %(len(val), self.function)) - user_ids = [item.message_create["sender_id"] for item in val] - self.session.save_users(user_ids) - except TweepError as e: - log.error("Error %s: %s" % (e.api_code, e.reason)) - return - number_of_items = self.session.order_buffer(self.name, val) - log.debug("Number of items retrieved: %d" % (number_of_items,)) + def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): + # starts stream every 3 minutes. + current_time = time.time() + if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True: + self.execution_time = current_time + log.debug("Starting stream for buffer %s, account %s and type %s" % (self.name, self.account, self.type)) + log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) + if self.name != "direct_messages": + val = self.session.call_paged(self.function, *self.args, **self.kwargs) + else: + # 50 results are allowed per API call, so let's assume max value can be 50. + # reference: https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events + if self.session.settings["general"]["max_tweets_per_call"] > 50: + count = 50 + else: + count = self.session.settings["general"]["max_tweets_per_call"] + # try to retrieve the cursor for the current buffer. + try: + val = getattr(self.session.twitter, self.function)(return_cursors=True, count=count, *self.args, **self.kwargs) + if type(val) == tuple: + val, cursor = val + if type(cursor) == tuple: + cursor = cursor[1] + self.session.db["cursors"][self.name] = cursor + results = [i for i in val] + val = results + val.reverse() + log.debug("Retrieved %d items from the cursored search on function %s." %(len(val), self.function)) + user_ids = [item.message_create["sender_id"] for item in val] + self.session.save_users(user_ids) + except TweepError as e: + log.error("Error %s: %s" % (e.api_code, e.reason)) + return + number_of_items = self.session.order_buffer(self.name, val) + log.debug("Number of items retrieved: %d" % (number_of_items,)) - self.put_items_on_list(number_of_items) - if hasattr(self, "finished_timeline") and self.finished_timeline == False: - if "-timeline" in self.name: - self.username = val[0].user.screen_name - elif "-favorite" in self.name: - self.username = self.session.api_call("get_user", **self.kwargs).screen_name - self.finished_timeline = True - if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: - self.session.sound.play(self.sound) - # Autoread settings - if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: - self.auto_read(number_of_items) - return number_of_items + self.put_items_on_list(number_of_items) + if hasattr(self, "finished_timeline") and self.finished_timeline == False: + if "-timeline" in self.name: + self.username = val[0].user.screen_name + elif "-favorite" in self.name: + self.username = self.session.api_call("get_user", **self.kwargs).screen_name + self.finished_timeline = True + if number_of_items > 0 and self.name != "sent_tweets" and self.name != "sent_direct_messages" and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: + self.session.sound.play(self.sound) + # Autoread settings + if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: + self.auto_read(number_of_items) + return number_of_items - def auto_read(self, number_of_items): - if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - if self.session.settings["general"]["reverse_timelines"] == False: - tweet = self.session.db[self.name][-1] - else: - tweet = self.session.db[self.name][0] - output.speak(_(u"New tweet in {0}").format(self.get_buffer_name())) - output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))) - elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - output.speak(_(u"{0} new tweets in {1}.").format(number_of_items, self.get_buffer_name())) + def auto_read(self, number_of_items): + if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + if self.session.settings["general"]["reverse_timelines"] == False: + tweet = self.session.db[self.name][-1] + else: + tweet = self.session.db[self.name][0] + output.speak(_(u"New tweet in {0}").format(self.get_buffer_name())) + output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))) + elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + output.speak(_(u"{0} new tweets in {1}.").format(number_of_items, self.get_buffer_name())) - def get_more_items(self): - elements = [] - if self.session.settings["general"]["reverse_timelines"] == False: - last_id = self.session.db[self.name][0].id - else: - last_id = self.session.db[self.name][-1].id - try: - items = getattr(self.session.twitter, self.function)(max_id=last_id, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs) - except TweepError as e: - log.error("Error %s: %s" % (e.api_code, e.reason)) - return - if items == None: - return - for i in items: - if utils.is_allowed(i, self.session.settings, self.name) == True and utils.find_item(i.id, self.session.db[self.name]) == None: - i = self.session.check_quoted_status(i) - i = self.session.check_long_tweet(i) - elements.append(i) - if self.session.settings["general"]["reverse_timelines"] == False: - self.session.db[self.name].insert(0, i) - else: - self.session.db[self.name].append(i) - selection = self.buffer.list.get_selected() - log.debug("Retrieved %d items from cursored search in function %s." % (len(elements), self.function)) - if self.session.settings["general"]["reverse_timelines"] == False: - for i in elements: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(True, *tweet) - else: - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(False, *tweet) - self.buffer.list.select_item(selection) - output.speak(_(u"%s items retrieved") % (str(len(elements))), True) + def get_more_items(self): + elements = [] + if self.session.settings["general"]["reverse_timelines"] == False: + last_id = self.session.db[self.name][0].id + else: + last_id = self.session.db[self.name][-1].id + try: + items = getattr(self.session.twitter, self.function)(max_id=last_id, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs) + except TweepError as e: + log.error("Error %s: %s" % (e.api_code, e.reason)) + return + if items == None: + return + for i in items: + if utils.is_allowed(i, self.session.settings, self.name) == True and utils.find_item(i.id, self.session.db[self.name]) == None: + i = self.session.check_quoted_status(i) + i = self.session.check_long_tweet(i) + elements.append(i) + if self.session.settings["general"]["reverse_timelines"] == False: + self.session.db[self.name].insert(0, i) + else: + self.session.db[self.name].append(i) + selection = self.buffer.list.get_selected() + log.debug("Retrieved %d items from cursored search in function %s." % (len(elements), self.function)) + if self.session.settings["general"]["reverse_timelines"] == False: + for i in elements: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(True, *tweet) + else: + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(False, *tweet) + self.buffer.list.select_item(selection) + output.speak(_(u"%s items retrieved") % (str(len(elements))), True) - def remove_buffer(self, force=False): - if "-timeline" in self.name: - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]: - self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9]) - self.session.settings.write() - if self.name in self.session.db: - self.session.db.pop(self.name) - return True - elif dlg == widgetUtils.NO: - return False - elif "favorite" in self.name: - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-9] in self.session.settings["other_buffers"]["favourites_timelines"]: - self.session.settings["other_buffers"]["favourites_timelines"].remove(self.name[:-9]) - if self.name in self.session.db: - self.session.db.pop(self.name) - self.session.settings.write() - return True - elif dlg == widgetUtils.NO: - return False - else: - output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True) - return False + def remove_buffer(self, force=False): + if "-timeline" in self.name: + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-9] in self.session.settings["other_buffers"]["timelines"]: + self.session.settings["other_buffers"]["timelines"].remove(self.name[:-9]) + self.session.settings.write() + if self.name in self.session.db: + self.session.db.pop(self.name) + return True + elif dlg == widgetUtils.NO: + return False + elif "favorite" in self.name: + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-9] in self.session.settings["other_buffers"]["favourites_timelines"]: + self.session.settings["other_buffers"]["favourites_timelines"].remove(self.name[:-9]) + if self.name in self.session.db: + self.session.db.pop(self.name) + self.session.settings.write() + return True + elif dlg == widgetUtils.NO: + return False + else: + output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True) + return False - def remove_tweet(self, id): - if type(self.session.db[self.name]) == dict: return - for i in range(0, len(self.session.db[self.name])): - if self.session.db[self.name][i].id == id: - self.session.db[self.name].pop(i) - self.remove_item(i) + def remove_tweet(self, id): + if type(self.session.db[self.name]) == dict: return + for i in range(0, len(self.session.db[self.name])): + if self.session.db[self.name][i].id == id: + self.session.db[self.name].pop(i) + self.remove_item(i) - def put_items_on_list(self, number_of_items): - list_to_use = self.session.db[self.name] - if number_of_items == 0 and self.session.settings["general"]["persist_size"] == 0: return - log.debug("The list contains %d items " % (self.buffer.list.get_count(),)) - log.debug("Putting %d items on the list" % (number_of_items,)) - if self.buffer.list.get_count() == 0: - for i in list_to_use: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(False, *tweet) - self.buffer.set_position(self.session.settings["general"]["reverse_timelines"]) - elif self.buffer.list.get_count() > 0 and number_of_items > 0: - if self.session.settings["general"]["reverse_timelines"] == False: - items = list_to_use[len(list_to_use)-number_of_items:] - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(False, *tweet) - else: - items = list_to_use[0:number_of_items] - items.reverse() - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(True, *tweet) - log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),)) + def put_items_on_list(self, number_of_items): + list_to_use = self.session.db[self.name] + if number_of_items == 0 and self.session.settings["general"]["persist_size"] == 0: return + log.debug("The list contains %d items " % (self.buffer.list.get_count(),)) + log.debug("Putting %d items on the list" % (number_of_items,)) + if self.buffer.list.get_count() == 0: + for i in list_to_use: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(False, *tweet) + self.buffer.set_position(self.session.settings["general"]["reverse_timelines"]) + elif self.buffer.list.get_count() > 0 and number_of_items > 0: + if self.session.settings["general"]["reverse_timelines"] == False: + items = list_to_use[len(list_to_use)-number_of_items:] + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(False, *tweet) + else: + items = list_to_use[0:number_of_items] + items.reverse() + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(True, *tweet) + log.debug("Now the list contains %d items " % (self.buffer.list.get_count(),)) - def add_new_item(self, item): - tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - if self.session.settings["general"]["reverse_timelines"] == False: - self.buffer.list.insert_item(False, *tweet) - else: - self.buffer.list.insert_item(True, *tweet) - if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - output.speak(" ".join(tweet[:2]), speech=self.session.settings["reporting"]["speech_reporting"], braille=self.session.settings["reporting"]["braille_reporting"]) - #Improve performance on Windows + def add_new_item(self, item): + tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + if self.session.settings["general"]["reverse_timelines"] == False: + self.buffer.list.insert_item(False, *tweet) + else: + self.buffer.list.insert_item(True, *tweet) + if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + output.speak(" ".join(tweet[:2]), speech=self.session.settings["reporting"]["speech_reporting"], braille=self.session.settings["reporting"]["braille_reporting"]) + #Improve performance on Windows # if platform.system() == "Windows": # call_threaded(utils.is_audio,item) - def bind_events(self): - log.debug("Binding events...") - self.buffer.set_focus_function(self.onFocus) - widgetUtils.connect_event(self.buffer.list.list, widgetUtils.KEYPRESS, self.get_event) - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_status, self.buffer.tweet) + def bind_events(self): + log.debug("Binding events...") + self.buffer.set_focus_function(self.onFocus) + widgetUtils.connect_event(self.buffer.list.list, widgetUtils.KEYPRESS, self.get_event) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_status, self.buffer.tweet) # if self.type == "baseBuffer": - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.share_item, self.buffer.retweet) - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.send_message, self.buffer.dm) - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply) - # Replace for the correct way in other platforms. - widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu) - widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.share_item, self.buffer.retweet) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.send_message, self.buffer.dm) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.reply, self.buffer.reply) + # Replace for the correct way in other platforms. + widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu) + widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key) - def show_menu(self, ev, pos=0, *args, **kwargs): - if self.buffer.list.get_count() == 0: return - if self.name == "sent_tweets" or self.name == "direct_messages": - menu = menus.sentPanelMenu() - elif self.name == "direct_messages": - menu = menus.dmPanelMenu() - widgetUtils.connect_event(menu, widgetUtils.MENU, self.send_message, menuitem=menu.reply) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions) - else: - menu = menus.basePanelMenu() - widgetUtils.connect_event(menu, widgetUtils.MENU, self.reply, menuitem=menu.reply) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.share_item, menuitem=menu.retweet) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.fav, menuitem=menu.fav) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.unfav, menuitem=menu.unfav) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.url_, menuitem=menu.openUrl) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.audio, menuitem=menu.play) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove) - if hasattr(menu, "openInBrowser"): - widgetUtils.connect_event(menu, widgetUtils.MENU, self.open_in_browser, menuitem=menu.openInBrowser) - if pos != 0: - self.buffer.PopupMenu(menu, pos) - else: - self.buffer.PopupMenu(menu, ev.GetPosition()) + def show_menu(self, ev, pos=0, *args, **kwargs): + if self.buffer.list.get_count() == 0: return + if self.name == "sent_tweets" or self.name == "direct_messages": + menu = menus.sentPanelMenu() + elif self.name == "direct_messages": + menu = menus.dmPanelMenu() + widgetUtils.connect_event(menu, widgetUtils.MENU, self.send_message, menuitem=menu.reply) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions) + else: + menu = menus.basePanelMenu() + widgetUtils.connect_event(menu, widgetUtils.MENU, self.reply, menuitem=menu.reply) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.share_item, menuitem=menu.retweet) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.fav, menuitem=menu.fav) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.unfav, menuitem=menu.unfav) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.url_, menuitem=menu.openUrl) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.audio, menuitem=menu.play) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.destroy_status, menuitem=menu.remove) + if hasattr(menu, "openInBrowser"): + widgetUtils.connect_event(menu, widgetUtils.MENU, self.open_in_browser, menuitem=menu.openInBrowser) + if pos != 0: + self.buffer.PopupMenu(menu, pos) + else: + self.buffer.PopupMenu(menu, ev.GetPosition()) - def view(self, *args, **kwargs): - pub.sendMessage("execute-action", action="view_item") + def view(self, *args, **kwargs): + pub.sendMessage("execute-action", action="view_item") - def copy(self, *args, **kwargs): - pub.sendMessage("execute-action", action="copy_to_clipboard") + def copy(self, *args, **kwargs): + pub.sendMessage("execute-action", action="copy_to_clipboard") - def user_actions(self, *args, **kwargs): - pub.sendMessage("execute-action", action="follow") + def user_actions(self, *args, **kwargs): + pub.sendMessage("execute-action", action="follow") - def fav(self, *args, **kwargs): - pub.sendMessage("execute-action", action="add_to_favourites") + def fav(self, *args, **kwargs): + pub.sendMessage("execute-action", action="add_to_favourites") - def unfav(self, *args, **kwargs): - pub.sendMessage("execute-action", action="remove_from_favourites") + def unfav(self, *args, **kwargs): + pub.sendMessage("execute-action", action="remove_from_favourites") - def delete_item_(self, *args, **kwargs): - pub.sendMessage("execute-action", action="delete_item") + def delete_item_(self, *args, **kwargs): + pub.sendMessage("execute-action", action="delete_item") - def url_(self, *args, **kwargs): - self.url() + def url_(self, *args, **kwargs): + self.url() - def show_menu_by_key(self, ev): - if self.buffer.list.get_count() == 0: - return - if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU: - self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition()) + def show_menu_by_key(self, ev): + if self.buffer.list.get_count() == 0: + return + if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU: + self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition()) - def get_tweet(self): - if hasattr(self.session.db[self.name][self.buffer.list.get_selected()], "retweeted_status"): - tweet = self.session.db[self.name][self.buffer.list.get_selected()].retweeted_status - else: - tweet = self.session.db[self.name][self.buffer.list.get_selected()] - return tweet + def get_tweet(self): + if hasattr(self.session.db[self.name][self.buffer.list.get_selected()], "retweeted_status"): + tweet = self.session.db[self.name][self.buffer.list.get_selected()].retweeted_status + else: + tweet = self.session.db[self.name][self.buffer.list.get_selected()] + return tweet - def get_right_tweet(self): - tweet = self.session.db[self.name][self.buffer.list.get_selected()] - return tweet + def get_right_tweet(self): + tweet = self.session.db[self.name][self.buffer.list.get_selected()] + return tweet - @_tweets_exist - def reply(self, *args, **kwargs): - tweet = self.get_right_tweet() - screen_name = tweet.user.screen_name - id = tweet.id - twishort_enabled = hasattr(tweet, "twishort") - users = utils.get_all_mentioned(tweet, self.session.db, field="screen_name") - ids = utils.get_all_mentioned(tweet, self.session.db, field="id_str") - # Build the window title - if len(users) < 1: - title=_("Reply to {arg0}").format(arg0=screen_name) - else: - title=_("Reply") - message = messages.reply(self.session, title, _(u"Reply to %s") % (screen_name,), "", users=users, ids=ids) - if message.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() - if len(users) > 0: - config.app["app-settings"]["mention_all"] = message.message.mentionAll.GetValue() - config.app.write() - params = {"_sound": "reply_send.ogg", "in_reply_to_status_id": id, "tweet_mode": "extended"} - text = message.message.get_text() - if twishort_enabled == False: - excluded_ids = message.get_ids() - params["exclude_reply_user_ids"] =excluded_ids - params["auto_populate_reply_metadata"] =True - else: - mentioned_people = message.get_people() - text = "@"+screen_name+" "+mentioned_people+u" "+text - if len(text) > 280 and message.message.get("long_tweet") == True: - if message.image == None: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) - else: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) - params["status"] = text - if message.image == None: - params["call_name"] = "update_status" - else: - params["call_name"] = "update_status_with_media" - params["media"] = message.file - item = self.session.api_call(**params) - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - if hasattr(message.message, "destroy"): message.message.destroy() - self.session.settings.write() + @_tweets_exist + def reply(self, *args, **kwargs): + tweet = self.get_right_tweet() + screen_name = tweet.user.screen_name + id = tweet.id + twishort_enabled = hasattr(tweet, "twishort") + users = utils.get_all_mentioned(tweet, self.session.db, field="screen_name") + ids = utils.get_all_mentioned(tweet, self.session.db, field="id_str") + # Build the window title + if len(users) < 1: + title=_("Reply to {arg0}").format(arg0=screen_name) + else: + title=_("Reply") + message = messages.reply(self.session, title, _(u"Reply to %s") % (screen_name,), "", users=users, ids=ids) + if message.message.get_response() == widgetUtils.OK: + if config.app["app-settings"]["remember_mention_and_longtweet"]: + config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() + if len(users) > 0: + config.app["app-settings"]["mention_all"] = message.message.mentionAll.GetValue() + config.app.write() + params = {"_sound": "reply_send.ogg", "in_reply_to_status_id": id, "tweet_mode": "extended"} + text = message.message.get_text() + if twishort_enabled == False: + excluded_ids = message.get_ids() + params["exclude_reply_user_ids"] =excluded_ids + params["auto_populate_reply_metadata"] =True + else: + mentioned_people = message.get_people() + text = "@"+screen_name+" "+mentioned_people+u" "+text + if len(text) > 280 and message.message.get("long_tweet") == True: + if message.image == None: + text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) + else: + text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) + params["status"] = text + if message.image == None: + params["call_name"] = "update_status" + else: + params["call_name"] = "update_status_with_media" + params["media"] = message.file + item = self.session.api_call(**params) + if item != None: + pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + if hasattr(message.message, "destroy"): message.message.destroy() + self.session.settings.write() - @_tweets_exist - def send_message(self, *args, **kwargs): - tweet = self.get_right_tweet() - if self.type == "dm": - screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name - users = [screen_name] - elif self.type == "people": - screen_name = tweet.screen_name - users = [screen_name] - else: - screen_name = tweet.user.screen_name - users = utils.get_all_users(tweet, self.session.db) - dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users) - if dm.message.get_response() == widgetUtils.OK: - screen_name = dm.message.get("cb") - user = self.session.get_user_by_screen_name(screen_name) - recipient_id = user - text = dm.message.get_text() - val = self.session.api_call(call_name="send_direct_message", recipient_id=recipient_id, text=text) - if val != None: - if self.session.settings["general"]["reverse_timelines"] == False: - self.session.db["sent_direct_messages"].append(val) - else: - self.session.db["sent_direct_messages"].insert(0, val) - pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"]) - if hasattr(dm.message, "destroy"): dm.message.destroy() + @_tweets_exist + def send_message(self, *args, **kwargs): + tweet = self.get_right_tweet() + if self.type == "dm": + screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name + users = [screen_name] + elif self.type == "people": + screen_name = tweet.screen_name + users = [screen_name] + else: + screen_name = tweet.user.screen_name + users = utils.get_all_users(tweet, self.session.db) + dm = messages.dm(self.session, _(u"Direct message to %s") % (screen_name,), _(u"New direct message"), users) + if dm.message.get_response() == widgetUtils.OK: + screen_name = dm.message.get("cb") + user = self.session.get_user_by_screen_name(screen_name) + recipient_id = user + text = dm.message.get_text() + val = self.session.api_call(call_name="send_direct_message", recipient_id=recipient_id, text=text) + if val != None: + if self.session.settings["general"]["reverse_timelines"] == False: + self.session.db["sent_direct_messages"].append(val) + else: + self.session.db["sent_direct_messages"].insert(0, val) + pub.sendMessage("sent-dm", data=val, user=self.session.db["user_name"]) + if hasattr(dm.message, "destroy"): dm.message.destroy() - @_tweets_exist - def share_item(self, *args, **kwargs): - tweet = self.get_right_tweet() - id = tweet.id - if self.session.settings["general"]["retweet_mode"] == "ask": - answer = commonMessageDialogs.retweet_question(self.buffer) - if answer == widgetUtils.YES: - self._retweet_with_comment(tweet, id) - elif answer == widgetUtils.NO: - self._direct_retweet(id) - elif self.session.settings["general"]["retweet_mode"] == "direct": - self._direct_retweet(id) - else: - self._retweet_with_comment(tweet, id) + @_tweets_exist + def share_item(self, *args, **kwargs): + tweet = self.get_right_tweet() + id = tweet.id + if self.session.settings["general"]["retweet_mode"] == "ask": + answer = commonMessageDialogs.retweet_question(self.buffer) + if answer == widgetUtils.YES: + self._retweet_with_comment(tweet, id) + elif answer == widgetUtils.NO: + self._direct_retweet(id) + elif self.session.settings["general"]["retweet_mode"] == "direct": + self._direct_retweet(id) + else: + self._retweet_with_comment(tweet, id) - def _retweet_with_comment(self, tweet, id, comment=''): - # If quoting a retweet, let's quote the original tweet instead the retweet. - if hasattr(tweet, "retweeted_status"): - tweet = tweet.retweeted_status - if hasattr(tweet, "full_text"): - comments = tweet.full_text - else: - comments = tweet.text - retweet = messages.tweet(self.session, _(u"Quote"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet.user.screen_name, comments), max=256, messageType="retweet") - if comment != '': - retweet.message.set_text(comment) - if retweet.message.get_response() == widgetUtils.OK: - text = retweet.message.get_text() - text = text+" https://twitter.com/{0}/status/{1}".format(tweet.user.screen_name, id) - if retweet.image == None: - item = self.session.api_call(call_name="update_status", _sound="retweet_send.ogg", status=text, in_reply_to_status_id=id, tweet_mode="extended") - if item != None: - new_item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended") - pub.sendMessage("sent-tweet", data=new_item, user=self.session.db["user_name"]) - else: - call_threaded(self.session.api_call, call_name="update_status", _sound="retweet_send.ogg", status=text, media=retweet.image) - if hasattr(retweet.message, "destroy"): retweet.message.destroy() + def _retweet_with_comment(self, tweet, id, comment=''): + # If quoting a retweet, let's quote the original tweet instead the retweet. + if hasattr(tweet, "retweeted_status"): + tweet = tweet.retweeted_status + if hasattr(tweet, "full_text"): + comments = tweet.full_text + else: + comments = tweet.text + retweet = messages.tweet(self.session, _(u"Quote"), _(u"Add your comment to the tweet"), u"“@%s: %s ”" % (tweet.user.screen_name, comments), max=256, messageType="retweet") + if comment != '': + retweet.message.set_text(comment) + if retweet.message.get_response() == widgetUtils.OK: + text = retweet.message.get_text() + text = text+" https://twitter.com/{0}/status/{1}".format(tweet.user.screen_name, id) + if retweet.image == None: + item = self.session.api_call(call_name="update_status", _sound="retweet_send.ogg", status=text, in_reply_to_status_id=id, tweet_mode="extended") + if item != None: + new_item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended") + pub.sendMessage("sent-tweet", data=new_item, user=self.session.db["user_name"]) + else: + call_threaded(self.session.api_call, call_name="update_status", _sound="retweet_send.ogg", status=text, media=retweet.image) + if hasattr(retweet.message, "destroy"): retweet.message.destroy() - def _direct_retweet(self, id): - item = self.session.api_call(call_name="retweet", _sound="retweet_send.ogg", id=id) - if item != None: - # Retweets are returned as non-extended tweets, so let's get the object as extended - # just before sending the event message. See https://github.com/manuelcortez/TWBlue/issues/253 - item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended") - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + def _direct_retweet(self, id): + item = self.session.api_call(call_name="retweet", _sound="retweet_send.ogg", id=id) + if item != None: + # Retweets are returned as non-extended tweets, so let's get the object as extended + # just before sending the event message. See https://github.com/manuelcortez/TWBlue/issues/253 + item = self.session.twitter.get_status(id=item.id, include_ext_alt_text=True, tweet_mode="extended") + pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - def onFocus(self, *args, **kwargs): - tweet = self.get_tweet() - if platform.system() == "Windows" and self.session.settings["general"]["relative_times"] == True: - # fix this: - original_date = arrow.get(self.session.db[self.name][self.buffer.list.get_selected()].created_at, locale="en") - ts = original_date.humanize(locale=languageHandler.getLanguage()) - self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts) - if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet): - self.session.sound.play("audio.ogg") - if self.session.settings['sound']['indicate_geo'] and utils.is_geocoded(tweet): - self.session.sound.play("geo.ogg") - if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet): - self.session.sound.play("image.ogg") + def onFocus(self, *args, **kwargs): + tweet = self.get_tweet() + if platform.system() == "Windows" and self.session.settings["general"]["relative_times"] == True: + # fix this: + original_date = arrow.get(self.session.db[self.name][self.buffer.list.get_selected()].created_at, locale="en") + ts = original_date.humanize(locale=languageHandler.getLanguage()) + self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts) + if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet): + self.session.sound.play("audio.ogg") + if self.session.settings['sound']['indicate_geo'] and utils.is_geocoded(tweet): + self.session.sound.play("geo.ogg") + if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet): + self.session.sound.play("image.ogg") - def audio(self, url='', *args, **kwargs): - if sound.URLPlayer.player.is_playing(): - return sound.URLPlayer.stop_audio() - tweet = self.get_tweet() - if tweet == None: return - urls = utils.find_urls(tweet) - if len(urls) == 1: - url=urls[0] - elif len(urls) > 1: - urls_list = dialogs.urlList.urlList() - urls_list.populate_list(urls) - if urls_list.get_response() == widgetUtils.OK: - url=urls_list.get_string() - if hasattr(urls_list, "destroy"): urls_list.destroy() - if url != '': -# try: - sound.URLPlayer.play(url, self.session.settings["sound"]["volume"]) + def audio(self, url='', *args, **kwargs): + if sound.URLPlayer.player.is_playing(): + return sound.URLPlayer.stop_audio() + tweet = self.get_tweet() + if tweet == None: return + urls = utils.find_urls(tweet) + if len(urls) == 1: + url=urls[0] + elif len(urls) > 1: + urls_list = dialogs.urlList.urlList() + urls_list.populate_list(urls) + if urls_list.get_response() == widgetUtils.OK: + url=urls_list.get_string() + if hasattr(urls_list, "destroy"): urls_list.destroy() + if url != '': + # try: + sound.URLPlayer.play(url, self.session.settings["sound"]["volume"]) # except: # log.error("Exception while executing audio method.") # @_tweets_exist - def url(self, url='', announce=True, *args, **kwargs): - if url == '': - tweet = self.get_tweet() - urls = utils.find_urls(tweet) - if len(urls) == 1: - url=urls[0] - elif len(urls) > 1: - urls_list = dialogs.urlList.urlList() - urls_list.populate_list(urls) - if urls_list.get_response() == widgetUtils.OK: - url=urls_list.get_string() - if hasattr(urls_list, "destroy"): urls_list.destroy() - if url != '': - if announce: - output.speak(_(u"Opening URL..."), True) - webbrowser.open_new_tab(url) + def url(self, url='', announce=True, *args, **kwargs): + if url == '': + tweet = self.get_tweet() + urls = utils.find_urls(tweet) + if len(urls) == 1: + url=urls[0] + elif len(urls) > 1: + urls_list = dialogs.urlList.urlList() + urls_list.populate_list(urls) + if urls_list.get_response() == widgetUtils.OK: + url=urls_list.get_string() + if hasattr(urls_list, "destroy"): urls_list.destroy() + if url != '': + if announce: + output.speak(_(u"Opening URL..."), True) + webbrowser.open_new_tab(url) - def clear_list(self): - dlg = commonMessageDialogs.clear_list() - if dlg == widgetUtils.YES: - self.session.db[self.name] = [] - self.buffer.list.clear() + def clear_list(self): + dlg = commonMessageDialogs.clear_list() + if dlg == widgetUtils.YES: + self.session.db[self.name] = [] + self.buffer.list.clear() - @_tweets_exist - def destroy_status(self, *args, **kwargs): - index = self.buffer.list.get_selected() - if self.type == "events" or self.type == "people" or self.type == "empty" or self.type == "account": return - answer = commonMessageDialogs.delete_tweet_dialog(None) - if answer == widgetUtils.YES: - try: - if self.name == "direct_messages" or self.name == "sent_direct_messages": - self.session.twitter.destroy_direct_message(id=self.get_right_tweet().id) - self.session.db[self.name].pop(index) - else: - self.session.twitter.destroy_status(id=self.get_right_tweet().id) - self.session.db[self.name].pop(index) - self.buffer.list.remove_item(index) - except TweepError: - self.session.sound.play("error.ogg") + @_tweets_exist + def destroy_status(self, *args, **kwargs): + index = self.buffer.list.get_selected() + if self.type == "events" or self.type == "people" or self.type == "empty" or self.type == "account": return + answer = commonMessageDialogs.delete_tweet_dialog(None) + if answer == widgetUtils.YES: + try: + if self.name == "direct_messages" or self.name == "sent_direct_messages": + self.session.twitter.destroy_direct_message(id=self.get_right_tweet().id) + self.session.db[self.name].pop(index) + else: + self.session.twitter.destroy_status(id=self.get_right_tweet().id) + self.session.db[self.name].pop(index) + self.buffer.list.remove_item(index) + except TweepError: + self.session.sound.play("error.ogg") - @_tweets_exist - def user_details(self): - tweet = self.get_right_tweet() - if self.type == "dm": - users = [self.session.get_user(tweet.message_create["sender_id"]).screen_name] - elif self.type == "people": - users = [tweet.screen_name] - else: - users = utils.get_all_users(tweet, self.session.db) - dlg = dialogs.utils.selectUserDialog(title=_(u"User details"), users=users) - if dlg.get_response() == widgetUtils.OK: - user.profileController(session=self.session, user=dlg.get_user()) - if hasattr(dlg, "destroy"): dlg.destroy() + @_tweets_exist + def user_details(self): + tweet = self.get_right_tweet() + if self.type == "dm": + users = [self.session.get_user(tweet.message_create["sender_id"]).screen_name] + elif self.type == "people": + users = [tweet.screen_name] + else: + users = utils.get_all_users(tweet, self.session.db) + dlg = dialogs.utils.selectUserDialog(title=_(u"User details"), users=users) + if dlg.get_response() == widgetUtils.OK: + user.profileController(session=self.session, user=dlg.get_user()) + if hasattr(dlg, "destroy"): dlg.destroy() - def get_quoted_tweet(self, tweet): - quoted_tweet = self.session.twitter.get_status(id=tweet.id) - quoted_tweet.text = utils.find_urls_in_text(quoted_tweet.text, quoted_tweet.entities) - l = tweets.is_long(quoted_tweet) - id = tweets.get_id(l) - original_tweet = self.session.twitter.get_status(id=id) - original_tweet.text = utils.find_urls_in_text(original_tweet.text, original_tweet.entities) - return compose.compose_quoted_tweet(quoted_tweet, original_tweet, self.session.db, self.session.settings["general"]["relative_times"]) + def get_quoted_tweet(self, tweet): + quoted_tweet = self.session.twitter.get_status(id=tweet.id) + quoted_tweet.text = utils.find_urls_in_text(quoted_tweet.text, quoted_tweet.entities) + l = tweets.is_long(quoted_tweet) + id = tweets.get_id(l) + original_tweet = self.session.twitter.get_status(id=id) + original_tweet.text = utils.find_urls_in_text(original_tweet.text, original_tweet.entities) + return compose.compose_quoted_tweet(quoted_tweet, original_tweet, self.session.db, self.session.settings["general"]["relative_times"]) - def open_in_browser(self, *args, **kwargs): - tweet = self.get_tweet() - output.speak(_(u"Opening item in web browser...")) - url = "https://twitter.com/{screen_name}/status/{tweet_id}".format(screen_name=tweet.user.screen_name, tweet_id=tweet.id) - webbrowser.open(url) + def open_in_browser(self, *args, **kwargs): + tweet = self.get_tweet() + output.speak(_(u"Opening item in web browser...")) + url = "https://twitter.com/{screen_name}/status/{tweet_id}".format(screen_name=tweet.user.screen_name, tweet_id=tweet.id) + webbrowser.open(url) class directMessagesController(baseBufferController): - def get_more_items(self): - # 50 results are allowed per API call, so let's assume max value can be 50. - # reference: https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events - if self.session.settings["general"]["max_tweets_per_call"] > 50: - count = 50 - else: - count = self.session.settings["general"]["max_tweets_per_call"] - total = 0 - # try to retrieve the cursor for the current buffer. - cursor = self.session.db["cursors"].get(self.name) - try: - items = getattr(self.session.twitter, self.function)(return_cursors=True, cursor=cursor, count=count, *self.args, **self.kwargs) - if type(items) == tuple: - items, cursor = items - if type(cursor) == tuple: - cursor = cursor[1] - self.session.db["cursors"][self.name] = cursor - results = [i for i in items] - items = results - log.debug("Retrieved %d items for cursored search in function %s" % (len(items), self.function)) - except TweepError as e: - log.error("Error %s: %s" % (e.api_code, e.reason)) - return - if items == None: - return - sent = [] - received = [] - for i in items: - if int(i.message_create["sender_id"]) == self.session.db["user_id"]: - if self.session.settings["general"]["reverse_timelines"] == False: - self.session.db["sent_direct_messages"].insert(0, i) - sent.append(i) - else: - self.session.db["sent_direct_messages"].append(i) - sent.insert(0, i) - else: - if self.session.settings["general"]["reverse_timelines"] == False: - self.session.db[self.name].insert(0, i) - received.append(i) - else: - self.session.db[self.name].append(i) - received.insert(0, i) - total = total+1 - user_ids = [item.message_create["sender_id"] for item in items] - self.session.save_users(user_ids) - pub.sendMessage("more-sent-dms", data=sent, account=self.session.db["user_name"]) - selected = self.buffer.list.get_selected() - if self.session.settings["general"]["reverse_timelines"] == True: - for i in received: - if int(i.message_create["sender_id"]) == self.session.db["user_id"]: - continue - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(True, *tweet) - self.buffer.list.select_item(selected) - else: - for i in received: - if int(i.message_create["sender_id"]) == self.session.db["user_id"]: - continue - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(True, *tweet) - output.speak(_(u"%s items retrieved") % (total), True) + def get_more_items(self): + # 50 results are allowed per API call, so let's assume max value can be 50. + # reference: https://developer.twitter.com/en/docs/twitter-api/v1/direct-messages/sending-and-receiving/api-reference/list-events + if self.session.settings["general"]["max_tweets_per_call"] > 50: + count = 50 + else: + count = self.session.settings["general"]["max_tweets_per_call"] + total = 0 + # try to retrieve the cursor for the current buffer. + cursor = self.session.db["cursors"].get(self.name) + try: + items = getattr(self.session.twitter, self.function)(return_cursors=True, cursor=cursor, count=count, *self.args, **self.kwargs) + if type(items) == tuple: + items, cursor = items + if type(cursor) == tuple: + cursor = cursor[1] + self.session.db["cursors"][self.name] = cursor + results = [i for i in items] + items = results + log.debug("Retrieved %d items for cursored search in function %s" % (len(items), self.function)) + except TweepError as e: + log.error("Error %s: %s" % (e.api_code, e.reason)) + return + if items == None: + return + sent = [] + received = [] + for i in items: + if int(i.message_create["sender_id"]) == self.session.db["user_id"]: + if self.session.settings["general"]["reverse_timelines"] == False: + self.session.db["sent_direct_messages"].insert(0, i) + sent.append(i) + else: + self.session.db["sent_direct_messages"].append(i) + sent.insert(0, i) + else: + if self.session.settings["general"]["reverse_timelines"] == False: + self.session.db[self.name].insert(0, i) + received.append(i) + else: + self.session.db[self.name].append(i) + received.insert(0, i) + total = total+1 + user_ids = [item.message_create["sender_id"] for item in items] + self.session.save_users(user_ids) + pub.sendMessage("more-sent-dms", data=sent, account=self.session.db["user_name"]) + selected = self.buffer.list.get_selected() + if self.session.settings["general"]["reverse_timelines"] == True: + for i in received: + if int(i.message_create["sender_id"]) == self.session.db["user_id"]: + continue + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(True, *tweet) + self.buffer.list.select_item(selected) + else: + for i in received: + if int(i.message_create["sender_id"]) == self.session.db["user_id"]: + continue + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(True, *tweet) + output.speak(_(u"%s items retrieved") % (total), True) - @_tweets_exist - def reply(self, *args, **kwargs): - tweet = self.get_right_tweet() - screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name - message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,]) - if message.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() - config.app.write() - if message.image == None: - item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended") - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - else: - call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) - if hasattr(message.message, "destroy"): message.message.destroy() + @_tweets_exist + def reply(self, *args, **kwargs): + tweet = self.get_right_tweet() + screen_name = self.session.get_user(tweet.message_create["sender_id"]).screen_name + message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,]) + if message.message.get_response() == widgetUtils.OK: + if config.app["app-settings"]["remember_mention_and_longtweet"]: + config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() + config.app.write() + if message.image == None: + item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended") + if item != None: + pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + else: + call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) + if hasattr(message.message, "destroy"): message.message.destroy() - def onFocus(self, *args, **kwargs): - tweet = self.get_tweet() - if platform.system() == "Windows" and self.session.settings["general"]["relative_times"] == True: - # fix this: - original_date = arrow.get(int(tweet.created_timestamp)) - ts = original_date.humanize(locale=languageHandler.getLanguage()) - self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts) - if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet): - self.session.sound.play("audio.ogg") - if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet): - self.session.sound.play("image.ogg") + def onFocus(self, *args, **kwargs): + tweet = self.get_tweet() + if platform.system() == "Windows" and self.session.settings["general"]["relative_times"] == True: + # fix this: + original_date = arrow.get(int(tweet.created_timestamp)) + ts = original_date.humanize(locale=languageHandler.getLanguage()) + self.buffer.list.list.SetItem(self.buffer.list.get_selected(), 2, ts) + if self.session.settings['sound']['indicate_audio'] and utils.is_audio(tweet): + self.session.sound.play("audio.ogg") + if self.session.settings['sound']['indicate_img'] and utils.is_media(tweet): + self.session.sound.play("image.ogg") - def clear_list(self): - dlg = commonMessageDialogs.clear_list() - if dlg == widgetUtils.YES: - self.session.db[self.name] = [] - self.buffer.list.clear() + def clear_list(self): + dlg = commonMessageDialogs.clear_list() + if dlg == widgetUtils.YES: + self.session.db[self.name] = [] + self.buffer.list.clear() - def auto_read(self, number_of_items): - if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - if self.session.settings["general"]["reverse_timelines"] == False: - tweet = self.session.db[self.name][-1] - else: - tweet = self.session.db[self.name][0] - output.speak(_(u"New direct message")) - output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))) - elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - output.speak(_(u"{0} new direct messages.").format(number_of_items,)) + def auto_read(self, number_of_items): + if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + if self.session.settings["general"]["reverse_timelines"] == False: + tweet = self.session.db[self.name][-1] + else: + tweet = self.session.db[self.name][0] + output.speak(_(u"New direct message")) + output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))) + elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + output.speak(_(u"{0} new direct messages.").format(number_of_items,)) - def open_in_browser(self, *args, **kwargs): - output.speak(_(u"This action is not supported in the buffer yet.")) + def open_in_browser(self, *args, **kwargs): + output.speak(_(u"This action is not supported in the buffer yet.")) class sentDirectMessagesController(directMessagesController): - def __init__(self, *args, **kwargs): - super(sentDirectMessagesController, self).__init__(*args, **kwargs) - if ("sent_direct_messages" in self.session.db) == False: - self.session.db["sent_direct_messages"] = [] + def __init__(self, *args, **kwargs): + super(sentDirectMessagesController, self).__init__(*args, **kwargs) + if ("sent_direct_messages" in self.session.db) == False: + self.session.db["sent_direct_messages"] = [] - def get_more_items(self): - output.speak(_(u"Getting more items cannot be done in this buffer. Use the direct messages buffer instead.")) + def get_more_items(self): + output.speak(_(u"Getting more items cannot be done in this buffer. Use the direct messages buffer instead.")) - def start_stream(self, *args, **kwargs): - pass + def start_stream(self, *args, **kwargs): + pass - def put_more_items(self, items): - if self.session.settings["general"]["reverse_timelines"] == True: - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(False, *tweet) - else: - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) - self.buffer.list.insert_item(False, *tweet) + def put_more_items(self, items): + if self.session.settings["general"]["reverse_timelines"] == True: + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(False, *tweet) + else: + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session) + self.buffer.list.insert_item(False, *tweet) class listBufferController(baseBufferController): - def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs): - super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs) - self.users = [] - self.list_id = list_id - self.kwargs["list_id"] = list_id + def __init__(self, parent, function, name, sessionObject, account, sound=None, bufferType=None, list_id=None, *args, **kwargs): + super(listBufferController, self).__init__(parent, function, name, sessionObject, account, sound=None, bufferType=None, *args, **kwargs) + self.users = [] + self.list_id = list_id + self.kwargs["list_id"] = list_id - def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): - self.get_user_ids() - super(listBufferController, self).start_stream(mandatory, play_sound, avoid_autoreading) + def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): + self.get_user_ids() + super(listBufferController, self).start_stream(mandatory, play_sound, avoid_autoreading) - def get_user_ids(self): - for i in Cursor(self.session.twitter.list_members, list_id=self.list_id, include_entities=False, skip_status=True, count=5000).items(): - if i.id not in self.users: - self.users.append(i.id) + def get_user_ids(self): + for i in Cursor(self.session.twitter.list_members, list_id=self.list_id, include_entities=False, skip_status=True, count=5000).items(): + if i.id not in self.users: + self.users.append(i.id) - def remove_buffer(self, force=False): - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-5] in self.session.settings["other_buffers"]["lists"]: - self.session.settings["other_buffers"]["lists"].remove(self.name[:-5]) - if self.name in self.session.db: - self.session.db.pop(self.name) - self.session.settings.write() - return True - elif dlg == widgetUtils.NO: - return False + def remove_buffer(self, force=False): + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-5] in self.session.settings["other_buffers"]["lists"]: + self.session.settings["other_buffers"]["lists"].remove(self.name[:-5]) + if self.name in self.session.db: + self.session.db.pop(self.name) + self.session.settings.write() + return True + elif dlg == widgetUtils.NO: + return False class peopleBufferController(baseBufferController): - def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs): - super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs) - log.debug("Initializing buffer %s, account %s" % (name, account,)) - self.compose_function = compose.compose_followers_list - log.debug("Compose_function: %s" % (self.compose_function,)) - self.get_tweet = self.get_right_tweet - self.url = self.interact - if "-followers" in self.name or "-friends" in self.name: - self.finished_timeline = False - # Add a compatibility layer for username based timelines from config. - # ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory. - try: - int(self.kwargs["user_id"]) - except ValueError: - self.is_screen_name = True - self.kwargs["screen_name"] = self.kwargs["user_id"] - self.kwargs.pop("user_id") + def __init__(self, parent, function, name, sessionObject, account, bufferType=None, *args, **kwargs): + super(peopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs) + log.debug("Initializing buffer %s, account %s" % (name, account,)) + self.compose_function = compose.compose_followers_list + log.debug("Compose_function: %s" % (self.compose_function,)) + self.get_tweet = self.get_right_tweet + self.url = self.interact + if "-followers" in self.name or "-friends" in self.name: + self.finished_timeline = False + # Add a compatibility layer for username based timelines from config. + # ToDo: Remove this in some new versions of the client, when user ID timelines become mandatory. + try: + int(self.kwargs["user_id"]) + except ValueError: + self.is_screen_name = True + self.kwargs["screen_name"] = self.kwargs["user_id"] + self.kwargs.pop("user_id") - def remove_buffer(self, force=True): - if "-followers" in self.name: - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-10] in self.session.settings["other_buffers"]["followers_timelines"]: - self.session.settings["other_buffers"]["followers_timelines"].remove(self.name[:-10]) - if self.name in self.session.db: - self.session.db.pop(self.name) - self.session.settings.write() - return True - elif dlg == widgetUtils.NO: - return False - elif "-friends" in self.name: - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-8] in self.session.settings["other_buffers"]["friends_timelines"]: - self.session.settings["other_buffers"]["friends_timelines"].remove(self.name[:-8]) - if self.name in self.session.db: - self.session.db.pop(self.name) - self.session.settings.write() - return True - elif dlg == widgetUtils.NO: - return False - else: - output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True) - return False + def remove_buffer(self, force=True): + if "-followers" in self.name: + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-10] in self.session.settings["other_buffers"]["followers_timelines"]: + self.session.settings["other_buffers"]["followers_timelines"].remove(self.name[:-10]) + if self.name in self.session.db: + self.session.db.pop(self.name) + self.session.settings.write() + return True + elif dlg == widgetUtils.NO: + return False + elif "-friends" in self.name: + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-8] in self.session.settings["other_buffers"]["friends_timelines"]: + self.session.settings["other_buffers"]["friends_timelines"].remove(self.name[:-8]) + if self.name in self.session.db: + self.session.db.pop(self.name) + self.session.settings.write() + return True + elif dlg == widgetUtils.NO: + return False + else: + output.speak(_(u"This buffer is not a timeline; it can't be deleted."), True) + return False - def onFocus(self, ev): - pass + def onFocus(self, ev): + pass - def get_message(self): - return " ".join(self.compose_function(self.get_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)) + def get_message(self): + return " ".join(self.compose_function(self.get_tweet(), self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session)) - def delete_item(self): pass + def delete_item(self): pass - @_tweets_exist - def reply(self, *args, **kwargs): - tweet = self.get_right_tweet() - screen_name = tweet.screen_name - message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,]) - if message.message.get_response() == widgetUtils.OK: - if config.app["app-settings"]["remember_mention_and_longtweet"]: - config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() - config.app.write() - if message.image == None: - item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended") - if item != None: - pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) - else: - call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) - if hasattr(message.message, "destroy"): message.message.destroy() + @_tweets_exist + def reply(self, *args, **kwargs): + tweet = self.get_right_tweet() + screen_name = tweet.screen_name + message = messages.reply(self.session, _(u"Mention"), _(u"Mention to %s") % (screen_name,), "@%s " % (screen_name,), [screen_name,]) + if message.message.get_response() == widgetUtils.OK: + if config.app["app-settings"]["remember_mention_and_longtweet"]: + config.app["app-settings"]["longtweet"] = message.message.long_tweet.GetValue() + config.app.write() + if message.image == None: + item = self.session.api_call(call_name="update_status", _sound="reply_send.ogg", status=message.message.get_text(), tweet_mode="extended") + if item != None: + pub.sendMessage("sent-tweet", data=item, user=self.session.db["user_name"]) + else: + call_threaded(self.session.api_call, call_name="update_status_with_media", _sound="reply_send.ogg", status=message.message.get_text(), media=message.file) + if hasattr(message.message, "destroy"): message.message.destroy() - def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): - # starts stream every 3 minutes. - current_time = time.time() - if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True: - self.execution_time = current_time - log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,)) - log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) - try: - val = getattr(self.session.twitter, self.function)(return_cursors=True, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs) - if type(val) == tuple: - val, cursor = val - if type(cursor) == tuple: - cursor = cursor[1] - self.session.db["cursors"][self.name] = cursor - results = [i for i in val] - val = results - val.reverse() - log.debug("Retrieved %d items from cursored search in function %s" % (len(val), self.function)) - except TweepError as e: - log.error("Error %s: %s" % (e.api_code, e.reason)) - return - number_of_items = self.session.order_people(self.name, val) - log.debug("Number of items retrieved: %d" % (number_of_items,)) - self.put_items_on_list(number_of_items) - if hasattr(self, "finished_timeline") and self.finished_timeline == False: - self.username = self.session.api_call("get_user", **self.kwargs).screen_name - self.finished_timeline = True - if number_of_items > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: - self.session.sound.play(self.sound) - # Autoread settings - if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: - self.auto_read(number_of_items) - return number_of_items + def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): + # starts stream every 3 minutes. + current_time = time.time() + if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory==True: + self.execution_time = current_time + log.debug("Starting stream for %s buffer, %s account" % (self.name, self.account,)) + log.debug("args: %s, kwargs: %s" % (self.args, self.kwargs)) + try: + val = getattr(self.session.twitter, self.function)(return_cursors=True, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs) + if type(val) == tuple: + val, cursor = val + if type(cursor) == tuple: + cursor = cursor[1] + self.session.db["cursors"][self.name] = cursor + results = [i for i in val] + val = results + val.reverse() + log.debug("Retrieved %d items from cursored search in function %s" % (len(val), self.function)) + except TweepError as e: + log.error("Error %s: %s" % (e.api_code, e.reason)) + return + number_of_items = self.session.order_people(self.name, val) + log.debug("Number of items retrieved: %d" % (number_of_items,)) + self.put_items_on_list(number_of_items) + if hasattr(self, "finished_timeline") and self.finished_timeline == False: + self.username = self.session.api_call("get_user", **self.kwargs).screen_name + self.finished_timeline = True + if number_of_items > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: + self.session.sound.play(self.sound) + # Autoread settings + if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: + self.auto_read(number_of_items) + return number_of_items - def get_more_items(self): - try: - cursor = self.session.db["cursors"].get(self.name) - items = getattr(self.session.twitter, self.function)(return_cursors=True, users=True, cursor=cursor, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs) - if type(items) == tuple: - items, cursor = items - if type(cursor) == tuple: - cursor = cursor[1] - self.session.db["cursors"][self.name] = cursor - results = [i for i in items] - items = results - log.debug("Retrieved %d items from cursored search in function %s" % (len(items), self.function)) - except TweepError as e: - log.error("Error %s: %s" % (e.api_code, e.reason)) - return - if items == None: - return - for i in items: - if self.session.settings["general"]["reverse_timelines"] == False: - self.session.db[self.name].insert(0, i) - else: - self.session.db[self.name].append(i) - selected = self.buffer.list.get_selected() - if self.session.settings["general"]["reverse_timelines"] == True: - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session) - self.buffer.list.insert_item(True, *tweet) - self.buffer.list.select_item(selected) - else: - for i in items: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session) - self.buffer.list.insert_item(True, *tweet) - output.speak(_(u"%s items retrieved") % (len(items)), True) + def get_more_items(self): + try: + cursor = self.session.db["cursors"].get(self.name) + items = getattr(self.session.twitter, self.function)(return_cursors=True, users=True, cursor=cursor, count=self.session.settings["general"]["max_tweets_per_call"], *self.args, **self.kwargs) + if type(items) == tuple: + items, cursor = items + if type(cursor) == tuple: + cursor = cursor[1] + self.session.db["cursors"][self.name] = cursor + results = [i for i in items] + items = results + log.debug("Retrieved %d items from cursored search in function %s" % (len(items), self.function)) + except TweepError as e: + log.error("Error %s: %s" % (e.api_code, e.reason)) + return + if items == None: + return + for i in items: + if self.session.settings["general"]["reverse_timelines"] == False: + self.session.db[self.name].insert(0, i) + else: + self.session.db[self.name].append(i) + selected = self.buffer.list.get_selected() + if self.session.settings["general"]["reverse_timelines"] == True: + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session) + self.buffer.list.insert_item(True, *tweet) + self.buffer.list.select_item(selected) + else: + for i in items: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session) + self.buffer.list.insert_item(True, *tweet) + output.speak(_(u"%s items retrieved") % (len(items)), True) - def put_items_on_list(self, number_of_items): - log.debug("The list contains %d items" % (self.buffer.list.get_count(),)) + def put_items_on_list(self, number_of_items): + log.debug("The list contains %d items" % (self.buffer.list.get_count(),)) # log.debug("Putting %d items on the list..." % (number_of_items,)) - if self.buffer.list.get_count() == 0: - for i in self.session.db[self.name]: - tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session) - self.buffer.list.insert_item(False, *tweet) - self.buffer.set_position(self.session.settings["general"]["reverse_timelines"]) + if self.buffer.list.get_count() == 0: + for i in self.session.db[self.name]: + tweet = self.compose_function(i, self.session.db, self.session.settings["general"]["relative_times"], self.session) + self.buffer.list.insert_item(False, *tweet) + self.buffer.set_position(self.session.settings["general"]["reverse_timelines"]) # self.buffer.set_list_position() - elif self.buffer.list.get_count() > 0: - if self.session.settings["general"]["reverse_timelines"] == False: - for i in self.session.db[self.name][len(self.session.db[self.name])-number_of_items:]: - tweet = self.compose_function(i, self.session.db) - self.buffer.list.insert_item(False, *tweet) - else: - items = self.session.db[self.name][0:number_of_items] - items.reverse() - for i in items: - tweet = self.compose_function(i, self.session.db) - self.buffer.list.insert_item(True, *tweet) - log.debug("now the list contains %d items" % (self.buffer.list.get_count(),)) + elif self.buffer.list.get_count() > 0: + if self.session.settings["general"]["reverse_timelines"] == False: + for i in self.session.db[self.name][len(self.session.db[self.name])-number_of_items:]: + tweet = self.compose_function(i, self.session.db) + self.buffer.list.insert_item(False, *tweet) + else: + items = self.session.db[self.name][0:number_of_items] + items.reverse() + for i in items: + tweet = self.compose_function(i, self.session.db) + self.buffer.list.insert_item(True, *tweet) + log.debug("now the list contains %d items" % (self.buffer.list.get_count(),)) - def get_right_tweet(self): - tweet = self.session.db[self.name][self.buffer.list.get_selected()] - return tweet + def get_right_tweet(self): + tweet = self.session.db[self.name][self.buffer.list.get_selected()] + return tweet - def add_new_item(self, item): - tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"], self.session) - if self.session.settings["general"]["reverse_timelines"] == False: - self.buffer.list.insert_item(False, *tweet) - else: - self.buffer.list.insert_item(True, *tweet) - if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - output.speak(" ".join(tweet)) + def add_new_item(self, item): + tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"], self.session) + if self.session.settings["general"]["reverse_timelines"] == False: + self.buffer.list.insert_item(False, *tweet) + else: + self.buffer.list.insert_item(True, *tweet) + if self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + output.speak(" ".join(tweet)) - def clear_list(self): - dlg = commonMessageDialogs.clear_list() - if dlg == widgetUtils.YES: - self.session.db[self.name] = [] - self.session.db["cursors"][self.name] = -1 - self.buffer.list.clear() + def clear_list(self): + dlg = commonMessageDialogs.clear_list() + if dlg == widgetUtils.YES: + self.session.db[self.name] = [] + self.session.db["cursors"][self.name] = -1 + self.buffer.list.clear() - def interact(self): - user.profileController(self.session, user=self.get_right_tweet().screen_name) + def interact(self): + user.profileController(self.session, user=self.get_right_tweet().screen_name) - def show_menu(self, ev, pos=0, *args, **kwargs): - menu = menus.peoplePanelMenu() - widgetUtils.connect_event(menu, widgetUtils.MENU, self.send_message, menuitem=menu.reply) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.details, menuitem=menu.details) + def show_menu(self, ev, pos=0, *args, **kwargs): + menu = menus.peoplePanelMenu() + widgetUtils.connect_event(menu, widgetUtils.MENU, self.send_message, menuitem=menu.reply) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.user_actions, menuitem=menu.userActions) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.details, menuitem=menu.details) # widgetUtils.connect_event(menu, widgetUtils.MENU, self.lists, menuitem=menu.lists) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy) - if hasattr(menu, "openInBrowser"): - widgetUtils.connect_event(menu, widgetUtils.MENU, self.open_in_browser, menuitem=menu.openInBrowser) - if pos != 0: - self.buffer.PopupMenu(menu, pos) - else: - self.buffer.PopupMenu(menu, ev.GetPosition()) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy) + if hasattr(menu, "openInBrowser"): + widgetUtils.connect_event(menu, widgetUtils.MENU, self.open_in_browser, menuitem=menu.openInBrowser) + if pos != 0: + self.buffer.PopupMenu(menu, pos) + else: + self.buffer.PopupMenu(menu, ev.GetPosition()) - def details(self, *args, **kwargs): - pub.sendMessage("execute-action", action="user_details") + def details(self, *args, **kwargs): + pub.sendMessage("execute-action", action="user_details") - def auto_read(self, number_of_items): - if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - if self.session.settings["general"]["reverse_timelines"] == False: - tweet = self.session.db[self.name][-1] - else: - tweet = self.session.db[self.name][0] - output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))) - elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: - output.speak(_(u"{0} new followers.").format(number_of_items)) + def auto_read(self, number_of_items): + if number_of_items == 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + if self.session.settings["general"]["reverse_timelines"] == False: + tweet = self.session.db[self.name][-1] + else: + tweet = self.session.db[self.name][0] + output.speak(" ".join(self.compose_function(tweet, self.session.db, self.session.settings["general"]["relative_times"], self.session.settings["general"]["show_screen_names"], self.session))) + elif number_of_items > 1 and self.name in self.session.settings["other_buffers"]["autoread_buffers"] and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and self.session.settings["sound"]["session_mute"] == False: + output.speak(_(u"{0} new followers.").format(number_of_items)) - def open_in_browser(self, *args, **kwargs): - tweet = self.get_tweet() - output.speak(_(u"Opening item in web browser...")) - url = "https://twitter.com/{screen_name}".format(screen_name=tweet.screen_name) - webbrowser.open(url) + def open_in_browser(self, *args, **kwargs): + tweet = self.get_tweet() + output.speak(_(u"Opening item in web browser...")) + url = "https://twitter.com/{screen_name}".format(screen_name=tweet.screen_name) + webbrowser.open(url) class searchBufferController(baseBufferController): - def remove_buffer(self, force=False): - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]: - self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11]) - self.session.settings.write() - if self.name in self.session.db: - self.session.db.pop(self.name) - return True - elif dlg == widgetUtils.NO: - return False + def remove_buffer(self, force=False): + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]: + self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11]) + self.session.settings.write() + if self.name in self.session.db: + self.session.db.pop(self.name) + return True + elif dlg == widgetUtils.NO: + return False class searchPeopleBufferController(peopleBufferController): - """ This is identical to a normal peopleBufferController, except that uses the page parameter instead of a cursor.""" - def __init__(self, parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs): - super(searchPeopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs) - if ("page" in self.kwargs) == False: - self.page = 1 - else: - self.page = self.kwargs.pop("page") + """ This is identical to a normal peopleBufferController, except that uses the page parameter instead of a cursor.""" + def __init__(self, parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs): + super(searchPeopleBufferController, self).__init__(parent, function, name, sessionObject, account, bufferType="peoplePanel", *args, **kwargs) + if ("page" in self.kwargs) == False: + self.page = 1 + else: + self.page = self.kwargs.pop("page") - def get_more_items(self, *args, **kwargs): - # Add 1 to the page parameter, put it in kwargs and calls to get_more_items in the parent buffer. - self.page = self.page +1 - self.kwargs["page"] = self.page - super(searchPeopleBufferController, self).get_more_items(*args, **kwargs) - # remove the parameter again to make sure start_stream won't fetch items for this page indefinitely. - self.kwargs.pop("page") + def get_more_items(self, *args, **kwargs): + # Add 1 to the page parameter, put it in kwargs and calls to get_more_items in the parent buffer. + self.page = self.page +1 + self.kwargs["page"] = self.page + super(searchPeopleBufferController, self).get_more_items(*args, **kwargs) + # remove the parameter again to make sure start_stream won't fetch items for this page indefinitely. + self.kwargs.pop("page") - def remove_buffer(self, force=False): - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]: - self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11]) - self.session.settings.write() - if self.name in self.session.db: - self.session.db.pop(self.name) - return True - elif dlg == widgetUtils.NO: - return False + def remove_buffer(self, force=False): + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-11] in self.session.settings["other_buffers"]["tweet_searches"]: + self.session.settings["other_buffers"]["tweet_searches"].remove(self.name[:-11]) + self.session.settings.write() + if self.name in self.session.db: + self.session.db.pop(self.name) + return True + elif dlg == widgetUtils.NO: + return False class trendsBufferController(baseBuffers.buffer): - def __init__(self, parent, name, session, account, trendsFor, *args, **kwargs): - super(trendsBufferController, self).__init__(parent=parent, session=session) - self.trendsFor = trendsFor - self.session = session - self.account = account - self.invisible = True - self.buffer = buffers.trendsPanel(parent, name) - self.buffer.account = account - self.type = self.buffer.type - self.bind_events() - self.sound = "trends_updated.ogg" - self.trends = [] - self.name = name - self.buffer.name = name - self.compose_function = self.compose_function_ - self.get_formatted_message = self.get_message - self.reply = self.search_topic + def __init__(self, parent, name, session, account, trendsFor, *args, **kwargs): + super(trendsBufferController, self).__init__(parent=parent, session=session) + self.trendsFor = trendsFor + self.session = session + self.account = account + self.invisible = True + self.buffer = buffers.trendsPanel(parent, name) + self.buffer.account = account + self.type = self.buffer.type + self.bind_events() + self.sound = "trends_updated.ogg" + self.trends = [] + self.name = name + self.buffer.name = name + self.compose_function = self.compose_function_ + self.get_formatted_message = self.get_message + self.reply = self.search_topic - def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): - # starts stream every 3 minutes. - current_time = time.time() - if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True: - self.execution_time = current_time - try: - data = self.session.twitter.trends_place(id=self.trendsFor) - except TweepError as err: - log.error("Error %s: %s" % (err.api_code, err.reason)) - if not hasattr(self, "name_"): - self.name_ = data[0]["locations"][0]["name"] - self.trends = data[0]["trends"] - self.put_items_on_the_list() - if self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: - self.session.sound.play(self.sound) + def start_stream(self, mandatory=False, play_sound=True, avoid_autoreading=False): + # starts stream every 3 minutes. + current_time = time.time() + if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True: + self.execution_time = current_time + try: + data = self.session.twitter.trends_place(id=self.trendsFor) + except TweepError as err: + log.error("Error %s: %s" % (err.api_code, err.reason)) + if not hasattr(self, "name_"): + self.name_ = data[0]["locations"][0]["name"] + self.trends = data[0]["trends"] + self.put_items_on_the_list() + if self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: + self.session.sound.play(self.sound) - def put_items_on_the_list(self): - selected_item = self.buffer.list.get_selected() - self.buffer.list.clear() - for i in self.trends: - tweet = self.compose_function(i) - self.buffer.list.insert_item(False, *tweet) - self.buffer.set_position(self.session.settings["general"]["reverse_timelines"]) + def put_items_on_the_list(self): + selected_item = self.buffer.list.get_selected() + self.buffer.list.clear() + for i in self.trends: + tweet = self.compose_function(i) + self.buffer.list.insert_item(False, *tweet) + self.buffer.set_position(self.session.settings["general"]["reverse_timelines"]) - def compose_function_(self, trend): - return [trend["name"]] + def compose_function_(self, trend): + return [trend["name"]] - def bind_events(self): - log.debug("Binding events...") - self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event) - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.tweet_about_this_trend, self.buffer.tweetTrendBtn) - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_status, self.buffer.tweet) - widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu) - widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key) - widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.search_topic, self.buffer.search_topic) + def bind_events(self): + log.debug("Binding events...") + self.buffer.list.list.Bind(wx.EVT_CHAR_HOOK, self.get_event) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.tweet_about_this_trend, self.buffer.tweetTrendBtn) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.post_status, self.buffer.tweet) + widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_ITEM_RIGHT_CLICK, self.show_menu) + widgetUtils.connect_event(self.buffer.list.list, wx.EVT_LIST_KEY_DOWN, self.show_menu_by_key) + widgetUtils.connect_event(self.buffer, widgetUtils.BUTTON_PRESSED, self.search_topic, self.buffer.search_topic) - def get_message(self): - return self.compose_function(self.trends[self.buffer.list.get_selected()])[0] + def get_message(self): + return self.compose_function(self.trends[self.buffer.list.get_selected()])[0] - def remove_buffer(self, force=False): - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name[:-3] in self.session.settings["other_buffers"]["trending_topic_buffers"]: - self.session.settings["other_buffers"]["trending_topic_buffers"].remove(self.name[:-3]) - self.session.settings.write() - if self.name in self.session.db: - self.session.db.pop(self.name) - return True - elif dlg == widgetUtils.NO: - return False + def remove_buffer(self, force=False): + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name[:-3] in self.session.settings["other_buffers"]["trending_topic_buffers"]: + self.session.settings["other_buffers"]["trending_topic_buffers"].remove(self.name[:-3]) + self.session.settings.write() + if self.name in self.session.db: + self.session.db.pop(self.name) + return True + elif dlg == widgetUtils.NO: + return False - def url(self, *args, **kwargs): - self.tweet_about_this_trend() + def url(self, *args, **kwargs): + self.tweet_about_this_trend() - def search_topic(self, *args, **kwargs): - topic = self.trends[self.buffer.list.get_selected()]["name"] - pub.sendMessage("search", term=topic) + def search_topic(self, *args, **kwargs): + topic = self.trends[self.buffer.list.get_selected()]["name"] + pub.sendMessage("search", term=topic) - def show_menu(self, ev, pos=0, *args, **kwargs): - menu = menus.trendsPanelMenu() - widgetUtils.connect_event(menu, widgetUtils.MENU, self.search_topic, menuitem=menu.search_topic) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view) - widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy) - if pos != 0: - self.buffer.PopupMenu(menu, pos) - else: - self.buffer.PopupMenu(menu, ev.GetPosition()) + def show_menu(self, ev, pos=0, *args, **kwargs): + menu = menus.trendsPanelMenu() + widgetUtils.connect_event(menu, widgetUtils.MENU, self.search_topic, menuitem=menu.search_topic) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.tweet_about_this_trend, menuitem=menu.tweetThisTrend) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.view, menuitem=menu.view) + widgetUtils.connect_event(menu, widgetUtils.MENU, self.copy, menuitem=menu.copy) + if pos != 0: + self.buffer.PopupMenu(menu, pos) + else: + self.buffer.PopupMenu(menu, ev.GetPosition()) - def view(self, *args, **kwargs): - pub.sendMessage("execute-action", action="view_item") + def view(self, *args, **kwargs): + pub.sendMessage("execute-action", action="view_item") - def copy(self, *args, **kwargs): - pub.sendMessage("execute-action", action="copy_to_clipboard") + def copy(self, *args, **kwargs): + pub.sendMessage("execute-action", action="copy_to_clipboard") - def tweet_about_this_trend(self, *args, **kwargs): - if self.buffer.list.get_count() == 0: return - title = _(u"Tweet") - caption = _(u"Write the tweet here") - tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ") - tweet.message.set_cursor_at_end() - if tweet.message.get_response() == widgetUtils.OK: - text = tweet.message.get_text() - if len(text) > 280 and tweet.message.get("long_tweet") == True: - if tweet.image == None: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) - else: - text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) - if tweet.image == None: - call_threaded(self.session.api_call, call_name="update_status", status=text) - else: - call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image) - if hasattr(tweet.message, "destroy"): tweet.message.destroy() + def tweet_about_this_trend(self, *args, **kwargs): + if self.buffer.list.get_count() == 0: return + title = _(u"Tweet") + caption = _(u"Write the tweet here") + tweet = messages.tweet(self.session, title, caption, self.get_message()+ " ") + tweet.message.set_cursor_at_end() + if tweet.message.get_response() == widgetUtils.OK: + text = tweet.message.get_text() + if len(text) > 280 and tweet.message.get("long_tweet") == True: + if tweet.image == None: + text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text) + else: + text = twishort.create_tweet(self.session.settings["twitter"]["user_key"], self.session.settings["twitter"]["user_secret"], text, 1) + if tweet.image == None: + call_threaded(self.session.api_call, call_name="update_status", status=text) + else: + call_threaded(self.session.api_call, call_name="update_status_with_media", status=text, media=tweet.image) + if hasattr(tweet.message, "destroy"): tweet.message.destroy() - def show_menu_by_key(self, ev): - if self.buffer.list.get_count() == 0: - return - if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU: - self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition()) + def show_menu_by_key(self, ev): + if self.buffer.list.get_count() == 0: + return + if ev.GetKeyCode() == wx.WXK_WINDOWS_MENU: + self.show_menu(widgetUtils.MENU, pos=self.buffer.list.list.GetPosition()) - def open_in_browser(self, *args, **kwargs): - output.speak(_(u"This action is not supported in the buffer, yet.")) + def open_in_browser(self, *args, **kwargs): + output.speak(_(u"This action is not supported in the buffer, yet.")) class conversationBufferController(searchBufferController): - def start_stream(self, start=False, mandatory=False, play_sound=True, avoid_autoreading=False): - # starts stream every 3 minutes. - current_time = time.time() - if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True: - self.execution_time = current_time - if start == True: - self.statuses = [] - self.ids = [] - self.statuses.append(self.tweet) - self.ids.append(self.tweet.id) - tweet = self.tweet - while tweet.in_reply_to_status_id != None: - try: - tweet = self.session.twitter.get_status(id=tweet.in_reply_to_status_id, tweet_mode="extended") - except TweepError as err: - break - self.statuses.insert(0, tweet) - self.ids.append(tweet.id) - if tweet.in_reply_to_status_id == None: - self.kwargs["since_id"] = tweet.id - self.ids.append(tweet.id) - val2 = self.session.search(self.name, tweet_mode="extended", *self.args, **self.kwargs) - for i in val2: - if i.in_reply_to_status_id in self.ids: - self.statuses.append(i) - self.ids.append(i.id) - tweet = i - number_of_items = self.session.order_buffer(self.name, self.statuses) - log.debug("Number of items retrieved: %d" % (number_of_items,)) - self.put_items_on_list(number_of_items) - if number_of_items > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: - self.session.sound.play(self.sound) - # Autoread settings - if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: - self.auto_read(number_of_items) - return number_of_items + def start_stream(self, start=False, mandatory=False, play_sound=True, avoid_autoreading=False): + # starts stream every 3 minutes. + current_time = time.time() + if self.execution_time == 0 or current_time-self.execution_time >= 180 or mandatory == True: + self.execution_time = current_time + if start == True: + self.statuses = [] + self.ids = [] + self.statuses.append(self.tweet) + self.ids.append(self.tweet.id) + tweet = self.tweet + while tweet.in_reply_to_status_id != None: + try: + tweet = self.session.twitter.get_status(id=tweet.in_reply_to_status_id, tweet_mode="extended") + except TweepError as err: + break + self.statuses.insert(0, tweet) + self.ids.append(tweet.id) + if tweet.in_reply_to_status_id == None: + self.kwargs["since_id"] = tweet.id + self.ids.append(tweet.id) + val2 = self.session.search(self.name, tweet_mode="extended", *self.args, **self.kwargs) + for i in val2: + if i.in_reply_to_status_id in self.ids: + self.statuses.append(i) + self.ids.append(i.id) + tweet = i + number_of_items = self.session.order_buffer(self.name, self.statuses) + log.debug("Number of items retrieved: %d" % (number_of_items,)) + self.put_items_on_list(number_of_items) + if number_of_items > 0 and self.sound != None and self.session.settings["sound"]["session_mute"] == False and self.name not in self.session.settings["other_buffers"]["muted_buffers"] and play_sound == True: + self.session.sound.play(self.sound) + # Autoread settings + if avoid_autoreading == False and mandatory == True and number_of_items > 0 and self.name in self.session.settings["other_buffers"]["autoread_buffers"]: + self.auto_read(number_of_items) + return number_of_items - def remove_buffer(self, force=False): - if force == False: - dlg = commonMessageDialogs.remove_buffer() - else: - dlg = widgetUtils.YES - if dlg == widgetUtils.YES: - if self.name in self.session.db: - self.session.db.pop(self.name) - return True - elif dlg == widgetUtils.NO: - return False + def remove_buffer(self, force=False): + if force == False: + dlg = commonMessageDialogs.remove_buffer() + else: + dlg = widgetUtils.YES + if dlg == widgetUtils.YES: + if self.name in self.session.db: + self.session.db.pop(self.name) + return True + elif dlg == widgetUtils.NO: + return False diff --git a/src/controller/filterController.py b/src/controller/filterController.py index 5f6fa6ed..f1262d19 100644 --- a/src/controller/filterController.py +++ b/src/controller/filterController.py @@ -8,71 +8,71 @@ from wxUI.dialogs import filterDialogs from wxUI import commonMessageDialogs class filter(object): - def __init__(self, buffer, filter_title=None, if_word_exists=None, in_lang=None, regexp=None, word=None, in_buffer=None): - self.buffer = buffer - self.dialog = filterDialogs.filterDialog(languages=[i["name"] for i in application.supported_languages]) - if self.dialog.get_response() == widgetUtils.OK: - title = self.dialog.get("title") - contains = self.dialog.get("contains") - term = self.dialog.get("term") - regexp = self.dialog.get("regexp") - allow_rts = self.dialog.get("allow_rts") - allow_quotes = self.dialog.get("allow_quotes") - allow_replies = self.dialog.get("allow_replies") - load_language = self.dialog.get("load_language") - ignore_language = self.dialog.get("ignore_language") - lang_option = None - if ignore_language: - lang_option = False - elif load_language: - lang_option = True - langs = self.dialog.get_selected_langs() - langcodes = [] - for i in application.supported_languages: - if i["name"] in langs: - langcodes.append(i["code"]) - d = dict(in_buffer=self.buffer.name, word=term, regexp=regexp, in_lang=lang_option, languages=langcodes, if_word_exists=contains, allow_rts=allow_rts, allow_quotes=allow_quotes, allow_replies=allow_replies) - if title in self.buffer.session.settings["filters"]: - return commonMessageDialogs.existing_filter() - self.buffer.session.settings["filters"][title] = d - self.buffer.session.settings.write() + def __init__(self, buffer, filter_title=None, if_word_exists=None, in_lang=None, regexp=None, word=None, in_buffer=None): + self.buffer = buffer + self.dialog = filterDialogs.filterDialog(languages=[i["name"] for i in application.supported_languages]) + if self.dialog.get_response() == widgetUtils.OK: + title = self.dialog.get("title") + contains = self.dialog.get("contains") + term = self.dialog.get("term") + regexp = self.dialog.get("regexp") + allow_rts = self.dialog.get("allow_rts") + allow_quotes = self.dialog.get("allow_quotes") + allow_replies = self.dialog.get("allow_replies") + load_language = self.dialog.get("load_language") + ignore_language = self.dialog.get("ignore_language") + lang_option = None + if ignore_language: + lang_option = False + elif load_language: + lang_option = True + langs = self.dialog.get_selected_langs() + langcodes = [] + for i in application.supported_languages: + if i["name"] in langs: + langcodes.append(i["code"]) + d = dict(in_buffer=self.buffer.name, word=term, regexp=regexp, in_lang=lang_option, languages=langcodes, if_word_exists=contains, allow_rts=allow_rts, allow_quotes=allow_quotes, allow_replies=allow_replies) + if title in self.buffer.session.settings["filters"]: + return commonMessageDialogs.existing_filter() + self.buffer.session.settings["filters"][title] = d + self.buffer.session.settings.write() class filterManager(object): - def __init__(self, session): - self.session = session - self.dialog = filterDialogs.filterManagerDialog() - self.insert_filters(self.session.settings["filters"]) - if self.dialog.filters.get_count() == 0: - self.dialog.edit.Enable(False) - self.dialog.delete.Enable(False) - else: - widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_filter) - widgetUtils.connect_event(self.dialog.delete, widgetUtils.BUTTON_PRESSED, self.delete_filter) - response = self.dialog.get_response() + def __init__(self, session): + self.session = session + self.dialog = filterDialogs.filterManagerDialog() + self.insert_filters(self.session.settings["filters"]) + if self.dialog.filters.get_count() == 0: + self.dialog.edit.Enable(False) + self.dialog.delete.Enable(False) + else: + widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_filter) + widgetUtils.connect_event(self.dialog.delete, widgetUtils.BUTTON_PRESSED, self.delete_filter) + response = self.dialog.get_response() - def insert_filters(self, filters): - self.dialog.filters.clear() - for f in list(filters.keys()): - filterName = f - buffer = filters[f]["in_buffer"] - if filters[f]["if_word_exists"] == "True" and filters[f]["word"] != "": - filter_by_word = "True" - else: - filter_by_word = "False" - filter_by_lang = "" - if filters[f]["in_lang"] != "None": - filter_by_lang = "True" - b = [f, buffer, filter_by_word, filter_by_lang] - self.dialog.filters.insert_item(False, *b) + def insert_filters(self, filters): + self.dialog.filters.clear() + for f in list(filters.keys()): + filterName = f + buffer = filters[f]["in_buffer"] + if filters[f]["if_word_exists"] == "True" and filters[f]["word"] != "": + filter_by_word = "True" + else: + filter_by_word = "False" + filter_by_lang = "" + if filters[f]["in_lang"] != "None": + filter_by_lang = "True" + b = [f, buffer, filter_by_word, filter_by_lang] + self.dialog.filters.insert_item(False, *b) - def edit_filter(self, *args, **kwargs): - pass + def edit_filter(self, *args, **kwargs): + pass - def delete_filter(self, *args, **kwargs): - filter_title = self.dialog.filters.get_text_column(self.dialog.filters.get_selected(), 0) - response = commonMessageDialogs.delete_filter() - if response == widgetUtils.YES: - self.session.settings["filters"].pop(filter_title) - self.session.settings.write() - self.insert_filters(self.session.settings["filters"]) \ No newline at end of file + def delete_filter(self, *args, **kwargs): + filter_title = self.dialog.filters.get_text_column(self.dialog.filters.get_selected(), 0) + response = commonMessageDialogs.delete_filter() + if response == widgetUtils.YES: + self.session.settings["filters"].pop(filter_title) + self.session.settings.write() + self.insert_filters(self.session.settings["filters"]) diff --git a/src/controller/listsController.py b/src/controller/listsController.py index 776b0604..b1d49249 100644 --- a/src/controller/listsController.py +++ b/src/controller/listsController.py @@ -10,101 +10,101 @@ from pubsub import pub log = logging.getLogger("controller.listsController") class listsController(object): - def __init__(self, session, user=None): - super(listsController, self).__init__() - self.session = session - if user == None: - self.dialog = lists.listViewer() - self.dialog.populate_list(self.get_all_lists()) - widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.create_list) - widgetUtils.connect_event(self.dialog.editBtn, widgetUtils.BUTTON_PRESSED, self.edit_list) - widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list) - widgetUtils.connect_event(self.dialog.view, widgetUtils.BUTTON_PRESSED, self.open_list_as_buffer) - widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list) - else: - self.dialog = lists.userListViewer(user) - self.dialog.populate_list(self.get_user_lists(user)) - widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.subscribe) - widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.unsubscribe) - self.dialog.get_response() + def __init__(self, session, user=None): + super(listsController, self).__init__() + self.session = session + if user == None: + self.dialog = lists.listViewer() + self.dialog.populate_list(self.get_all_lists()) + widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.create_list) + widgetUtils.connect_event(self.dialog.editBtn, widgetUtils.BUTTON_PRESSED, self.edit_list) + widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list) + widgetUtils.connect_event(self.dialog.view, widgetUtils.BUTTON_PRESSED, self.open_list_as_buffer) + widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.remove_list) + else: + self.dialog = lists.userListViewer(user) + self.dialog.populate_list(self.get_user_lists(user)) + widgetUtils.connect_event(self.dialog.createBtn, widgetUtils.BUTTON_PRESSED, self.subscribe) + widgetUtils.connect_event(self.dialog.deleteBtn, widgetUtils.BUTTON_PRESSED, self.unsubscribe) + self.dialog.get_response() - def get_all_lists(self): - return [compose.compose_list(item) for item in self.session.db["lists"]] + def get_all_lists(self): + return [compose.compose_list(item) for item in self.session.db["lists"]] - def get_user_lists(self, user): - self.lists = self.session.twitter.lists_all(reverse=True, screen_name=user) - return [compose.compose_list(item) for item in self.lists] + def get_user_lists(self, user): + self.lists = self.session.twitter.lists_all(reverse=True, screen_name=user) + return [compose.compose_list(item) for item in self.lists] - def create_list(self, *args, **kwargs): - dialog = lists.createListDialog() - if dialog.get_response() == widgetUtils.OK: - name = dialog.get("name") - description = dialog.get("description") - p = dialog.get("public") - if p == True: - mode = "public" - else: - mode = "private" - try: - new_list = self.session.twitter.create_list(name=name, description=description, mode=mode) - self.session.db["lists"].append(new_list) - self.dialog.lista.insert_item(False, *compose.compose_list(new_list)) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) - log.exception("error %s: %s" % (e.api_code, e.reason)) - dialog.destroy() + def create_list(self, *args, **kwargs): + dialog = lists.createListDialog() + if dialog.get_response() == widgetUtils.OK: + name = dialog.get("name") + description = dialog.get("description") + p = dialog.get("public") + if p == True: + mode = "public" + else: + mode = "private" + try: + new_list = self.session.twitter.create_list(name=name, description=description, mode=mode) + self.session.db["lists"].append(new_list) + self.dialog.lista.insert_item(False, *compose.compose_list(new_list)) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) + log.exception("error %s: %s" % (e.api_code, e.reason)) + dialog.destroy() - def edit_list(self, *args, **kwargs): - if self.dialog.lista.get_count() == 0: return - list = self.session.db["lists"][self.dialog.get_item()] - dialog = lists.editListDialog(list) - if dialog.get_response() == widgetUtils.OK: - name = dialog.get("name") - description = dialog.get("description") - p = dialog.get("public") - if p == True: - mode = "public" - else: - mode = "private" - try: - self.session.twitter.update_list(list_id=list.id, name=name, description=description, mode=mode) - self.session.get_lists() - self.dialog.populate_list(self.get_all_lists(), True) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) - dialog.destroy() + def edit_list(self, *args, **kwargs): + if self.dialog.lista.get_count() == 0: return + list = self.session.db["lists"][self.dialog.get_item()] + dialog = lists.editListDialog(list) + if dialog.get_response() == widgetUtils.OK: + name = dialog.get("name") + description = dialog.get("description") + p = dialog.get("public") + if p == True: + mode = "public" + else: + mode = "private" + try: + self.session.twitter.update_list(list_id=list.id, name=name, description=description, mode=mode) + self.session.get_lists() + self.dialog.populate_list(self.get_all_lists(), True) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) + dialog.destroy() - def remove_list(self, *args, **kwargs): - if self.dialog.lista.get_count() == 0: return - list = self.session.db["lists"][self.dialog.get_item()].id - if lists.remove_list() == widgetUtils.YES: - try: - self.session.twitter.destroy_list(list_id=list) - self.session.db["lists"].pop(self.dialog.get_item()) - self.dialog.lista.remove_item(self.dialog.get_item()) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) + def remove_list(self, *args, **kwargs): + if self.dialog.lista.get_count() == 0: return + list = self.session.db["lists"][self.dialog.get_item()].id + if lists.remove_list() == widgetUtils.YES: + try: + self.session.twitter.destroy_list(list_id=list) + self.session.db["lists"].pop(self.dialog.get_item()) + self.dialog.lista.remove_item(self.dialog.get_item()) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) - def open_list_as_buffer(self, *args, **kwargs): - if self.dialog.lista.get_count() == 0: return - list = self.session.db["lists"][self.dialog.get_item()] - pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list.name) + def open_list_as_buffer(self, *args, **kwargs): + if self.dialog.lista.get_count() == 0: return + list = self.session.db["lists"][self.dialog.get_item()] + pub.sendMessage("create-new-buffer", buffer="list", account=self.session.db["user_name"], create=list.name) - def subscribe(self, *args, **kwargs): - if self.dialog.lista.get_count() == 0: return - list_id = self.lists[self.dialog.get_item()].id - try: - list = self.session.twitter.subscribe_list(list_id=list_id) - item = utils.find_item(list.id, self.session.db["lists"]) - self.session.db["lists"].append(list) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) + def subscribe(self, *args, **kwargs): + if self.dialog.lista.get_count() == 0: return + list_id = self.lists[self.dialog.get_item()].id + try: + list = self.session.twitter.subscribe_list(list_id=list_id) + item = utils.find_item(list.id, self.session.db["lists"]) + self.session.db["lists"].append(list) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) - def unsubscribe(self, *args, **kwargs): - if self.dialog.lista.get_count() == 0: return - list_id = self.lists[self.dialog.get_item()].id - try: - list = self.session.twitter.unsubscribe_list(list_id=list_id) - self.session.db["lists"].remove(list) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) + def unsubscribe(self, *args, **kwargs): + if self.dialog.lista.get_count() == 0: return + list_id = self.lists[self.dialog.get_item()].id + try: + list = self.session.twitter.unsubscribe_list(list_id=list_id) + self.session.db["lists"].remove(list) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) diff --git a/src/controller/mainController.py b/src/controller/mainController.py index de600aab..ed8bf128 100644 --- a/src/controller/mainController.py +++ b/src/controller/mainController.py @@ -6,20 +6,20 @@ import requests from audio_services import youtube_utils import arrow if system == "Windows": - from update import updater - from wxUI import (view, dialogs, commonMessageDialogs, sysTrayIcon) - from . import settings - from extra import SoundsTutorial, ocr - import keystrokeEditor - from keyboard_handler.wx_handler import WXKeyboardHandler - from . import userActionsController - from . import trendingTopics - from . import user - from . import listsController - from . import filterController + from update import updater + from wxUI import (view, dialogs, commonMessageDialogs, sysTrayIcon) + from . import settings + from extra import SoundsTutorial, ocr + import keystrokeEditor + from keyboard_handler.wx_handler import WXKeyboardHandler + from . import userActionsController + from . import trendingTopics + from . import user + from . import listsController + from . import filterController # from issueReporter import issueReporter elif system == "Linux": - from gtkUI import (view, commonMessageDialogs) + from gtkUI import (view, commonMessageDialogs) from sessions.twitter import utils, compose from sessionmanager import manager, sessionManager @@ -50,1577 +50,1577 @@ geocoder = pygeocoder.Geocoder() class Controller(object): - """ Main Controller for TWBlue. It manages the main window and sessions.""" + """ Main Controller for TWBlue. It manages the main window and sessions.""" - def search_buffer(self, name_, user): + def search_buffer(self, name_, user): - """ Searches a buffer. - name_ str: The name for the buffer - user str: The account for the buffer. - for example you may want to search the home_timeline buffer for the tw_blue2 user. - Return type: buffers.buffer object.""" - for i in self.buffers: - if i.name == name_ and i.account == user: return i + """ Searches a buffer. + name_ str: The name for the buffer + user str: The account for the buffer. + for example you may want to search the home_timeline buffer for the tw_blue2 user. + Return type: buffers.buffer object.""" + for i in self.buffers: + if i.name == name_ and i.account == user: return i - def get_current_buffer(self): - """ Get the current focused bufferObject. - Return type: buffers.buffer object.""" - buffer = self.view.get_current_buffer() - if hasattr(buffer, "account"): - buffer = self.search_buffer(buffer.name, buffer.account) - return buffer + def get_current_buffer(self): + """ Get the current focused bufferObject. + Return type: buffers.buffer object.""" + buffer = self.view.get_current_buffer() + if hasattr(buffer, "account"): + buffer = self.search_buffer(buffer.name, buffer.account) + return buffer - def get_best_buffer(self): - """ Get the best buffer for doing something using the session object. - This function is useful when you need to open a timeline or post a tweet, and the user is in a buffer without a session, for example the events buffer. - Return type: twitterBuffers.buffer object.""" - # Gets the parent buffer to know what account is doing an action - view_buffer = self.view.get_current_buffer() - # If the account has no session attached, we will need to search the first available non-empty buffer for that account to use its session. - if view_buffer.type == "account" or view_buffer.type == "empty": - buffer = self.get_first_buffer(view_buffer.account) - else: - buffer = self.search_buffer(view_buffer.name, view_buffer.account) - if buffer != None: return buffer + def get_best_buffer(self): + """ Get the best buffer for doing something using the session object. + This function is useful when you need to open a timeline or post a tweet, and the user is in a buffer without a session, for example the events buffer. + Return type: twitterBuffers.buffer object.""" + # Gets the parent buffer to know what account is doing an action + view_buffer = self.view.get_current_buffer() + # If the account has no session attached, we will need to search the first available non-empty buffer for that account to use its session. + if view_buffer.type == "account" or view_buffer.type == "empty": + buffer = self.get_first_buffer(view_buffer.account) + else: + buffer = self.search_buffer(view_buffer.name, view_buffer.account) + if buffer != None: return buffer - def get_first_buffer(self, account): - """ Gets the first valid buffer for an account. - account str: A twitter username. - The first valid buffer is the home timeline.""" - for i in self.buffers: - if i.account == account and i.invisible == True and i.session != None: - return i + def get_first_buffer(self, account): + """ Gets the first valid buffer for an account. + account str: A twitter username. + The first valid buffer is the home timeline.""" + for i in self.buffers: + if i.account == account and i.invisible == True and i.session != None: + return i - def get_last_buffer(self, account): - """ Gets the last valid buffer for an account. - account str: A twitter username. - The last valid buffer is the last buffer that contains a session object assigned.""" - results = self.get_buffers_for_account(account) - return results[-1] + def get_last_buffer(self, account): + """ Gets the last valid buffer for an account. + account str: A twitter username. + The last valid buffer is the last buffer that contains a session object assigned.""" + results = self.get_buffers_for_account(account) + return results[-1] - def get_first_buffer_index(self, account): - buff = self.get_first_buffer(account) - return self.view.search(buff.name, buff.account) + def get_first_buffer_index(self, account): + buff = self.get_first_buffer(account) + return self.view.search(buff.name, buff.account) - def get_last_buffer_index(self, account): - buff = self.get_last_buffer(account) - return self.view.search(buff.name, buff.account) + def get_last_buffer_index(self, account): + buff = self.get_last_buffer(account) + return self.view.search(buff.name, buff.account) - def get_buffers_for_account(self, account): - results = [] - buffers = self.view.get_buffers() - [results.append(self.search_buffer(i.name, i.account)) for i in buffers if i.account == account and (i.type != "account")] - return results + def get_buffers_for_account(self, account): + results = [] + buffers = self.view.get_buffers() + [results.append(self.search_buffer(i.name, i.account)) for i in buffers if i.account == account and (i.type != "account")] + return results - def bind_other_events(self): - """ Binds the local application events with their functions.""" - log.debug("Binding other application events...") - pub.subscribe(self.buffer_title_changed, "buffer-title-changed") - pub.subscribe(self.manage_sent_dm, "sent-dm") - widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_) - pub.subscribe(self.logout_account, "logout") - pub.subscribe(self.login_account, "login") - pub.subscribe(self.create_new_buffer, "create-new-buffer") - pub.subscribe(self.execute_action, "execute-action") - pub.subscribe(self.search_topic, "search") - pub.subscribe(self.update_sent_dms, "sent-dms-updated") - pub.subscribe(self.more_dms, "more-sent-dms") - pub.subscribe(self.manage_sent_tweets, "sent-tweet") - pub.subscribe(self.manage_friend, "friend") - pub.subscribe(self.manage_unfollowing, "unfollowing") - pub.subscribe(self.manage_favourite, "favourite") - pub.subscribe(self.manage_unfavourite, "unfavourite") - pub.subscribe(self.manage_blocked_user, "blocked-user") - pub.subscribe(self.manage_unblocked_user, "unblocked-user") - if system == "Windows": - pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed") - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.search, menuitem=self.view.menuitem_search) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.list_manager, menuitem=self.view.lists) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_trending_topics, menuitem=self.view.trends) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.filter, menuitem=self.view.filter) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.manage_filters, menuitem=self.view.manage_filters) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.find, menuitem=self.view.find) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.accountConfiguration, menuitem=self.view.account_settings) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.configuration, menuitem=self.view.prefs) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.ocr_image, menuitem=self.view.ocr) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.learn_sounds, menuitem=self.view.sounds_tutorial) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.exit, menuitem=self.view.close) - widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit) - if widgetUtils.toolkit == "wx": - log.debug("Binding the exit function...") - widgetUtils.connectExitFunction(self.exit_) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.edit_keystrokes, menuitem=self.view.keystroke_editor) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_tweet, self.view.compose) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_reply, self.view.reply) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_retweet, self.view.retweet) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_favourites, self.view.fav) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_favourites, self.view.unfav) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_item, self.view.view) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.reverse_geocode, menuitem=self.view.view_coordinates) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.follow, menuitem=self.view.follow) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_more_items, menuitem=self.view.load_previous_items) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.clear_buffer, menuitem=self.view.clear) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_buffer, self.view.deleteTl) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.check_for_updates, self.view.check_for_updates) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.about, menuitem=self.view.about) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.visit_website, menuitem=self.view.visit_website) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_soundpacks, menuitem=self.view.get_soundpacks) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.manage_accounts, self.view.manage_accounts) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_profile, menuitem=self.view.updateProfile) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.user_details, menuitem=self.view.details) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.toggle_autoread, menuitem=self.view.autoread) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.toggle_buffer_mute, self.view.mute_buffer) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_timeline, self.view.timeline) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_favs_timeline, self.view.favs) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_conversation, menuitem=self.view.view_conversation) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.seekLeft, menuitem=self.view.seekLeft) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.seekRight, menuitem=self.view.seekRight) - if widgetUtils.toolkit == "wx": - widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_documentation, self.view.doc) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_changelog, self.view.changelog) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_list, self.view.addToList) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_list, self.view.removeFromList) - widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_buffer, self.view.update_buffer) + def bind_other_events(self): + """ Binds the local application events with their functions.""" + log.debug("Binding other application events...") + pub.subscribe(self.buffer_title_changed, "buffer-title-changed") + pub.subscribe(self.manage_sent_dm, "sent-dm") + widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit_) + pub.subscribe(self.logout_account, "logout") + pub.subscribe(self.login_account, "login") + pub.subscribe(self.create_new_buffer, "create-new-buffer") + pub.subscribe(self.execute_action, "execute-action") + pub.subscribe(self.search_topic, "search") + pub.subscribe(self.update_sent_dms, "sent-dms-updated") + pub.subscribe(self.more_dms, "more-sent-dms") + pub.subscribe(self.manage_sent_tweets, "sent-tweet") + pub.subscribe(self.manage_friend, "friend") + pub.subscribe(self.manage_unfollowing, "unfollowing") + pub.subscribe(self.manage_favourite, "favourite") + pub.subscribe(self.manage_unfavourite, "unfavourite") + pub.subscribe(self.manage_blocked_user, "blocked-user") + pub.subscribe(self.manage_unblocked_user, "unblocked-user") + if system == "Windows": + pub.subscribe(self.invisible_shorcuts_changed, "invisible-shorcuts-changed") + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.search, menuitem=self.view.menuitem_search) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.list_manager, menuitem=self.view.lists) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_trending_topics, menuitem=self.view.trends) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.filter, menuitem=self.view.filter) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.manage_filters, menuitem=self.view.manage_filters) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.find, menuitem=self.view.find) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.accountConfiguration, menuitem=self.view.account_settings) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.configuration, menuitem=self.view.prefs) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.ocr_image, menuitem=self.view.ocr) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.learn_sounds, menuitem=self.view.sounds_tutorial) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.exit, menuitem=self.view.close) + widgetUtils.connect_event(self.view, widgetUtils.CLOSE_EVENT, self.exit) + if widgetUtils.toolkit == "wx": + log.debug("Binding the exit function...") + widgetUtils.connectExitFunction(self.exit_) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.edit_keystrokes, menuitem=self.view.keystroke_editor) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_tweet, self.view.compose) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_reply, self.view.reply) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_retweet, self.view.retweet) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_favourites, self.view.fav) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_favourites, self.view.unfav) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_item, self.view.view) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.reverse_geocode, menuitem=self.view.view_coordinates) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.delete, self.view.delete) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.follow, menuitem=self.view.follow) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.send_dm, self.view.dm) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_more_items, menuitem=self.view.load_previous_items) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_user_lists, menuitem=self.view.viewLists) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.clear_buffer, menuitem=self.view.clear) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_buffer, self.view.deleteTl) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.check_for_updates, self.view.check_for_updates) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.about, menuitem=self.view.about) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.visit_website, menuitem=self.view.visit_website) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.get_soundpacks, menuitem=self.view.get_soundpacks) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.manage_accounts, self.view.manage_accounts) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_profile, menuitem=self.view.updateProfile) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.user_details, menuitem=self.view.details) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.toggle_autoread, menuitem=self.view.autoread) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.toggle_buffer_mute, self.view.mute_buffer) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_timeline, self.view.timeline) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_favs_timeline, self.view.favs) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.open_conversation, menuitem=self.view.view_conversation) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.seekLeft, menuitem=self.view.seekLeft) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.seekRight, menuitem=self.view.seekRight) + if widgetUtils.toolkit == "wx": + widgetUtils.connect_event(self.view.nb, widgetUtils.NOTEBOOK_PAGE_CHANGED, self.buffer_changed) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.report_error, self.view.reportError) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_documentation, self.view.doc) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.view_changelog, self.view.changelog) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.add_to_list, self.view.addToList) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.remove_from_list, self.view.removeFromList) + widgetUtils.connect_event(self.view, widgetUtils.MENU, self.update_buffer, self.view.update_buffer) - def set_systray_icon(self): - self.systrayIcon = sysTrayIcon.SysTrayIcon() - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.post_tweet, menuitem=self.systrayIcon.tweet) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.configuration, menuitem=self.systrayIcon.global_settings) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.accountConfiguration, menuitem=self.systrayIcon.account_settings) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.update_profile, menuitem=self.systrayIcon.update_profile) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.show_hide, menuitem=self.systrayIcon.show_hide) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.check_for_updates, menuitem=self.systrayIcon.check_for_updates) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.view_documentation, menuitem=self.systrayIcon.doc) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.exit, menuitem=self.systrayIcon.exit) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_LEFT_CLICK, self.taskbar_left_click) - widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_RIGHT_CLICK, self.taskbar_right_click) + def set_systray_icon(self): + self.systrayIcon = sysTrayIcon.SysTrayIcon() + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.post_tweet, menuitem=self.systrayIcon.tweet) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.configuration, menuitem=self.systrayIcon.global_settings) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.accountConfiguration, menuitem=self.systrayIcon.account_settings) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.update_profile, menuitem=self.systrayIcon.update_profile) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.show_hide, menuitem=self.systrayIcon.show_hide) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.check_for_updates, menuitem=self.systrayIcon.check_for_updates) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.view_documentation, menuitem=self.systrayIcon.doc) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.MENU, self.exit, menuitem=self.systrayIcon.exit) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_LEFT_CLICK, self.taskbar_left_click) + widgetUtils.connect_event(self.systrayIcon, widgetUtils.TASKBAR_RIGHT_CLICK, self.taskbar_right_click) - def taskbar_left_click(self, *args, **kwargs): - if self.showing == True: - self.view.set_focus() - else: - self.show_hide() + def taskbar_left_click(self, *args, **kwargs): + if self.showing == True: + self.view.set_focus() + else: + self.show_hide() - def taskbar_right_click(self, *args, **kwargs): - self.systrayIcon.show_menu() + def taskbar_right_click(self, *args, **kwargs): + self.systrayIcon.show_menu() - def __init__(self): - super(Controller, self).__init__() - # Visibility state. - self.showing = True - # main window - self.view = view.mainFrame() - # buffers list. - self.buffers = [] - self.started = False - # accounts list. - self.accounts = [] - # This saves the current account (important in invisible mode) - self.current_account = "" - self.view.prepare() - self.bind_other_events() - if system == "Windows": - self.set_systray_icon() + def __init__(self): + super(Controller, self).__init__() + # Visibility state. + self.showing = True + # main window + self.view = view.mainFrame() + # buffers list. + self.buffers = [] + self.started = False + # accounts list. + self.accounts = [] + # This saves the current account (important in invisible mode) + self.current_account = "" + self.view.prepare() + self.bind_other_events() + if system == "Windows": + self.set_systray_icon() - def check_invisible_at_startup(self): - # Visibility check. It does only work for windows. - if system != "Windows": return - if config.app["app-settings"]["hide_gui"] == True: - self.show_hide() - self.view.Show() - self.view.Hide() - # Invisible keyboard Shorcuts check. - if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == True: - km = self.create_invisible_keyboard_shorcuts() - self.register_invisible_keyboard_shorcuts(km) + def check_invisible_at_startup(self): + # Visibility check. It does only work for windows. + if system != "Windows": return + if config.app["app-settings"]["hide_gui"] == True: + self.show_hide() + self.view.Show() + self.view.Hide() + # Invisible keyboard Shorcuts check. + if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == True: + km = self.create_invisible_keyboard_shorcuts() + self.register_invisible_keyboard_shorcuts(km) - def do_work(self): - """ Creates the buffer objects for all accounts. This does not starts the buffer streams, only creates the objects.""" - log.debug("Creating buffers for all sessions...") - for i in sessions.sessions: - log.debug("Working on session %s" % (i,)) - if sessions.sessions[i].is_logged == False: - self.create_ignored_session_buffer(sessions.sessions[i]) - continue - self.create_buffers(sessions.sessions[i]) + def do_work(self): + """ Creates the buffer objects for all accounts. This does not starts the buffer streams, only creates the objects.""" + log.debug("Creating buffers for all sessions...") + for i in sessions.sessions: + log.debug("Working on session %s" % (i,)) + if sessions.sessions[i].is_logged == False: + self.create_ignored_session_buffer(sessions.sessions[i]) + continue + self.create_buffers(sessions.sessions[i]) - # Connection checker executed each minute. - self.checker_function = RepeatingTimer(60, self.check_connection) + # Connection checker executed each minute. + self.checker_function = RepeatingTimer(60, self.check_connection) # self.checker_function.start() - self.save_db = RepeatingTimer(300, self.save_data_in_db) - self.save_db.start() - log.debug("Setting updates to buffers every %d seconds..." % (60*config.app["app-settings"]["update_period"],)) - self.update_buffers_function = RepeatingTimer(60*config.app["app-settings"]["update_period"], self.update_buffers) - self.update_buffers_function.start() - - def start(self): - """ Starts all buffer objects. Loads their items.""" - for i in sessions.sessions: - if sessions.sessions[i].is_logged == False: continue - self.start_buffers(sessions.sessions[i]) - self.set_buffer_positions(sessions.sessions[i]) - if config.app["app-settings"]["play_ready_sound"] == True: - sessions.sessions[list(sessions.sessions.keys())[0]].sound.play("ready.ogg") - if config.app["app-settings"]["speak_ready_msg"] == True: - output.speak(_(u"Ready")) - self.started = True - - def create_ignored_session_buffer(self, session): - self.accounts.append(session.settings["twitter"]["user_name"]) - account = baseBuffers.accountPanel(self.view.nb, session.settings["twitter"]["user_name"], session.settings["twitter"]["user_name"], session.session_id) - account.logged = False - account.setup_account() - self.buffers.append(account) - self.view.add_buffer(account.buffer , name=session.settings["twitter"]["user_name"]) - - def login_account(self, session_id): - for i in sessions.sessions: - if sessions.sessions[i].session_id == session_id: session = sessions.sessions[i] - session.login() - session.db = dict() - self.create_buffers(session, False) - self.start_buffers(session) - - def create_buffers(self, session, createAccounts=True): - """ Generates buffer objects for an user account. - session SessionObject: a sessionmanager.session.Session Object""" - session.get_user_info() - if createAccounts == True: - self.accounts.append(session.db["user_name"]) - account = baseBuffers.accountPanel(self.view.nb, session.db["user_name"], session.db["user_name"], session.session_id) - account.setup_account() - self.buffers.append(account) - self.view.add_buffer(account.buffer , name=session.db["user_name"]) - for i in session.settings['general']['buffer_order']: - if i == 'home': - home = twitterBuffers.baseBufferController(self.view.nb, "home_timeline", "home_timeline", session, session.db["user_name"], sound="tweet_received.ogg", tweet_mode="extended") - self.buffers.append(home) - self.view.insert_buffer(home.buffer, name=_(u"Home"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'mentions': - mentions = twitterBuffers.baseBufferController(self.view.nb, "mentions_timeline", "mentions", session, session.db["user_name"], sound="mention_received.ogg", tweet_mode="extended") - self.buffers.append(mentions) - self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'dm': - dm = twitterBuffers.directMessagesController(self.view.nb, "list_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", compose_func="compose_direct_message", sound="dm_received.ogg") - self.buffers.append(dm) - self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'sent_dm': - sent_dm = twitterBuffers.sentDirectMessagesController(self.view.nb, "", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", compose_func="compose_direct_message") - self.buffers.append(sent_dm) - self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'sent_tweets': - sent_tweets = twitterBuffers.baseBufferController(self.view.nb, "user_timeline", "sent_tweets", session, session.db["user_name"], screen_name=session.db["user_name"], tweet_mode="extended") - self.buffers.append(sent_tweets) - self.view.insert_buffer(sent_tweets.buffer, name=_(u"Sent tweets"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'favorites': - favourites = twitterBuffers.baseBufferController(self.view.nb, "favorites", "favourites", session, session.db["user_name"], sound="favourite.ogg", tweet_mode="extended") - self.buffers.append(favourites) - self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'followers': - followers = twitterBuffers.peopleBufferController(self.view.nb, "followers", "followers", session, session.db["user_name"], sound="update_followers.ogg", screen_name=session.db["user_name"]) - self.buffers.append(followers) - self.view.insert_buffer(followers.buffer, name=_(u"Followers"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'friends': - friends = twitterBuffers.peopleBufferController(self.view.nb, "friends", "friends", session, session.db["user_name"], screen_name=session.db["user_name"]) - self.buffers.append(friends) - self.view.insert_buffer(friends.buffer, name=_(u"Friends"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'blocks': - blocks = twitterBuffers.peopleBufferController(self.view.nb, "blocks", "blocked", session, session.db["user_name"]) - self.buffers.append(blocks) - self.view.insert_buffer(blocks.buffer, name=_(u"Blocked users"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - elif i == 'muted': - muted = twitterBuffers.peopleBufferController(self.view.nb, "mutes", "muted", session, session.db["user_name"]) - self.buffers.append(muted) - self.view.insert_buffer(muted.buffer, name=_(u"Muted users"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - timelines = baseBuffers.emptyPanel(self.view.nb, "timelines", session.db["user_name"]) - self.buffers.append(timelines) - self.view.insert_buffer(timelines.buffer , name=_(u"Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - for i in session.settings["other_buffers"]["timelines"]: - tl = twitterBuffers.baseBufferController(self.view.nb, "user_timeline", "%s-timeline" % (i,), session, session.db["user_name"], sound="tweet_timeline.ogg", bufferType=None, user_id=i, tweet_mode="extended") - self.buffers.append(tl) - self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"])) - favs_timelines = baseBuffers.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"]) - self.buffers.append(favs_timelines) - self.view.insert_buffer(favs_timelines.buffer , name=_(u"Likes timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - for i in session.settings["other_buffers"]["favourites_timelines"]: - tl = twitterBuffers.baseBufferController(self.view.nb, "favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=i, tweet_mode="extended") - self.buffers.append(tl) - self.view.insert_buffer(tl.buffer, name=_(u"Likes for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"])) - followers_timelines = baseBuffers.emptyPanel(self.view.nb, "followers_timelines", session.db["user_name"]) - self.buffers.append(followers_timelines) - self.view.insert_buffer(followers_timelines.buffer , name=_(u"Followers' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - for i in session.settings["other_buffers"]["followers_timelines"]: - tl = twitterBuffers.peopleBufferController(self.view.nb, "followers", "%s-followers" % (i,), session, session.db["user_name"], sound="new_event.ogg", user_id=i) - self.buffers.append(tl) - self.view.insert_buffer(tl.buffer, name=_(u"Followers for {}").format(i,), pos=self.view.search("followers_timelines", session.db["user_name"])) - friends_timelines = baseBuffers.emptyPanel(self.view.nb, "friends_timelines", session.db["user_name"]) - self.buffers.append(friends_timelines) - self.view.insert_buffer(friends_timelines.buffer , name=_(u"Friends' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - for i in session.settings["other_buffers"]["friends_timelines"]: - tl = twitterBuffers.peopleBufferController(self.view.nb, "friends", "%s-friends" % (i,), session, session.db["user_name"], sound="new_event.ogg", user_id=i) - self.buffers.append(tl) - self.view.insert_buffer(tl.buffer, name=_(u"Friends for {}").format(i,), pos=self.view.search("friends_timelines", session.db["user_name"])) - lists = baseBuffers.emptyPanel(self.view.nb, "lists", session.db["user_name"]) - self.buffers.append(lists) - self.view.insert_buffer(lists.buffer , name=_(u"Lists"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - for i in session.settings["other_buffers"]["lists"]: - tl = twitterBuffers.listBufferController(self.view.nb, "list_timeline", "%s-list" % (i,), session, session.db["user_name"], bufferType=None, sound="list_tweet.ogg", list_id=utils.find_list(i, session.db["lists"]), tweet_mode="extended") - session.lists.append(tl) - self.buffers.append(tl) - self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(i), pos=self.view.search("lists", session.db["user_name"])) - searches = baseBuffers.emptyPanel(self.view.nb, "searches", session.db["user_name"]) - self.buffers.append(searches) - self.view.insert_buffer(searches.buffer , name=_(u"Searches"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - for i in session.settings["other_buffers"]["tweet_searches"]: - tl = twitterBuffers.searchBufferController(self.view.nb, "search", "%s-searchterm" % (i,), session, session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=i, tweet_mode="extended") - self.buffers.append(tl) - self.view.insert_buffer(tl.buffer, name=_(u"Search for {}").format(i), pos=self.view.search("searches", session.db["user_name"])) - for i in session.settings["other_buffers"]["trending_topic_buffers"]: - buffer = twitterBuffers.trendsBufferController(self.view.nb, "%s_tt" % (i,), session, session.db["user_name"], i, sound="trends_updated.ogg") - buffer.start_stream(play_sound=False) - buffer.searchfunction = self.search - self.buffers.append(buffer) - self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"])) - - def set_buffer_positions(self, session): - "Sets positions for buffers if values exist in the database." - for i in self.buffers: - if i.account == session.db["user_name"] and i.name+"_pos" in session.db and hasattr(i.buffer,'list'): - i.buffer.list.select_item(session.db[str(i.name+"_pos")]) - - def logout_account(self, session_id): - for i in sessions.sessions: - if sessions.sessions[i].session_id == session_id: session = sessions.sessions[i] - user = session.db["user_name"] - delete_buffers = [] - for i in self.buffers: - if i.account == user and i.name != user: - delete_buffers.append(i.name) - for i in delete_buffers: - self.destroy_buffer(i, user) - session.db = None - - def destroy_buffer(self, buffer_name, account): - buffer = self.search_buffer(buffer_name, account) - if buffer == None: return - buff = self.view.search(buffer.name, buffer.account) - if buff == None: return - self.view.delete_buffer(buff) - self.buffers.remove(buffer) - del buffer - - def search_topic(self, term): - self.search(value=term) - - def search(self, event=None, value="", *args, **kwargs): - """ Searches words or users in twitter. This creates a new buffer containing the search results.""" - log.debug("Creating a new search...") - dlg = dialogs.search.searchDialog(value) - if dlg.get_response() == widgetUtils.OK and dlg.get("term") != "": - term = dlg.get("term") - buffer = self.get_best_buffer() - if dlg.get("tweets") == True: - if term not in buffer.session.settings["other_buffers"]["tweet_searches"]: - buffer.session.settings["other_buffers"]["tweet_searches"].append(term) - buffer.session.settings.write() - args = {"lang": dlg.get_language(), "result_type": dlg.get_result_type()} - search = twitterBuffers.searchBufferController(self.view.nb, "search", "%s-searchterm" % (term,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=term, tweet_mode="extended", **args) - else: - log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,)) - return - elif dlg.get("users") == True: - search = twitterBuffers.searchPeopleBufferController(self.view.nb, "search_users", "%s-searchUser" % (term,), buffer.session, buffer.session.db["user_name"], bufferType=None, sound="search_updated.ogg", q=term) - search.start_stream(mandatory=True) - pos=self.view.search("searches", buffer.session.db["user_name"]) - self.insert_buffer(search, pos) - self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos) - dlg.Destroy() - - def find(self, *args, **kwargs): - if 'string' in kwargs: - string=kwargs['string'] - else: - string='' - dlg = dialogs.find.findDialog(string) - if dlg.get_response() == widgetUtils.OK and dlg.get("string") != "": - string = dlg.get("string") - #If we still have an empty string for some reason (I.E. user clicked cancel, etc), return here. - if string == '': - log.debug("Find canceled.") - return - page = self.get_current_buffer() - if not hasattr(page.buffer, "list"): - output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) - return - count = page.buffer.list.get_count() - if count < 1: - output.speak(_(u"Empty buffer."), True) - return - start = page.buffer.list.get_selected() - for i in range(start, count): - if string.lower() in page.buffer.list.get_text_column(i, 1).lower(): - page.buffer.list.select_item(i) - return output.speak(page.get_message(), True) - output.speak(_(u"{0} not found.").format(string,), True) - - def filter(self, *args, **kwargs): - page = self.get_current_buffer() - if not hasattr(page.buffer, "list"): - output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) - return - # Let's prevent filtering of some buffers (people buffers, direct messages, events and sent items). - # ToDo: Remove events from here after August 16. - if (page.name == "direct_messages" or page.name == "sent_tweets" or page.name == "events") or page.type == "people": - output.speak(_(u"Filters cannot be applied on this buffer")) - return - new_filter = filterController.filter(page) - - def manage_filters(self, *args, **kwargs): - page = self.get_best_buffer() - manage_filters = filterController.filterManager(page.session) - - def seekLeft(self, *args, **kwargs): - try: - sound.URLPlayer.seek(-5000) - except: - output.speak("Unable to seek.",True) - - def seekRight(self, *args, **kwargs): - try: - sound.URLPlayer.seek(5000) - except: - output.speak("Unable to seek.",True) - - def edit_keystrokes(self, *args, **kwargs): - editor = keystrokeEditor.KeystrokeEditor() - if editor.changed == True: - config.keymap.write() - register = False - # determines if we need to reassign the keymap. - if self.showing == False: - register = True - elif config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == True: - register = True - # If there is a keyboard handler instance we need unregister all old keystrokes before register the new ones. - if hasattr(self, "keyboard_handler"): - keymap = {} - for i in editor.hold_map: - if hasattr(self, i): keymap[editor.hold_map[i]] = getattr(self, i) - self.unregister_invisible_keyboard_shorcuts(keymap) - self.invisible_shorcuts_changed(registered=register) - - def learn_sounds(self, *args, **kwargs): - """ Opens the sounds tutorial for the current account.""" - buffer = self.get_best_buffer() - SoundsTutorial.soundsTutorial(buffer.session) - - def view_user_lists(self, *args, **kwargs): - buff = self.get_best_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users) - if dlg.get_response() == widgetUtils.OK: - user = dlg.get_user() - else: - return - l = listsController.listsController(buff.session, user=user) - - def add_to_list(self, *args, **kwargs): - buff = self.get_best_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users) - if dlg.get_response() == widgetUtils.OK: - user = dlg.get_user() - else: - return - dlg = dialogs.lists.addUserListDialog() - dlg.populate_list([compose.compose_list(item) for item in buff.session.db["lists"]]) - if dlg.get_response() == widgetUtils.OK: - try: - list = buff.session.twitter.add_list_member(list_id=buff.session.db["lists"][dlg.get_item()].id, screen_name=user) - older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()].id, buff.session.db["lists"]) - listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()].name.lower()), buff.session.db["user_name"]) - if listBuffer != None: listBuffer.get_user_ids() - buff.session.db["lists"].pop(older_list) - buff.session.db["lists"].append(list) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) - - def remove_from_list(self, *args, **kwargs): - buff = self.get_best_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users) - if dlg.get_response() == widgetUtils.OK: - user = dlg.get_user() - else: - return - dlg = dialogs.lists.removeUserListDialog() - dlg.populate_list([compose.compose_list(item) for item in buff.session.db["lists"]]) - if dlg.get_response() == widgetUtils.OK: - try: - list = buff.session.twitter.remove_list_member(list_id=buff.session.db["lists"][dlg.get_item()].id, screen_name=user) - older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()].id, buff.session.db["lists"]) - listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()].name.lower()), buff.session.db["user_name"]) - if listBuffer != None: listBuffer.get_user_ids() - buff.session.db["lists"].pop(older_list) - buff.session.db["lists"].append(list) - except TweepError as e: - output.speak("error %s: %s" % (e.api_code, e.reason)) - - def list_manager(self, *args, **kwargs): - s = self.get_best_buffer().session - l = listsController.listsController(s) - - def configuration(self, *args, **kwargs): - """ Opens the global settings dialogue.""" - d = settings.globalSettingsController() - if d.response == widgetUtils.OK: - d.save_configuration() - if d.needs_restart == True: - commonMessageDialogs.needs_restart() - restart.restart_program() - - def accountConfiguration(self, *args, **kwargs): - """ Opens the account settings dialogue for the current account.""" - buff = self.get_best_buffer() - manager.manager.set_current_session(buff.session.session_id) - d = settings.accountSettingsController(buff, self) - if d.response == widgetUtils.OK: - d.save_configuration() - if d.needs_restart == True: - commonMessageDialogs.needs_restart() - buff.session.settings.write() - restart.restart_program() - - def report_error(self, *args, **kwargs): - r = issueReporter.reportBug(self.get_best_buffer().session.db["user_name"]) - - def check_for_updates(self, *args, **kwargs): - update = updater.do_update() - if update == False: - view.no_update_available() - - def delete(self, *args, **kwargs): - """ Deletes an item in the current buffer. - Users can only remove their tweets and direct messages, other users' tweets and people (followers, friends, blocked, etc) can not be removed using this method.""" - buffer = self.view.get_current_buffer() - if hasattr(buffer, "account"): - buffer = self.search_buffer(buffer.name, buffer.account) - buffer.destroy_status() - - def exit(self, *args, **kwargs): - if config.app["app-settings"]["ask_at_exit"] == True: - answer = commonMessageDialogs.exit_dialog(self.view) - if answer == widgetUtils.YES: - self.exit_() - else: - self.exit_() - - def exit_(self, *args, **kwargs): - for i in self.buffers: i.save_positions() - log.debug("Exiting...") - log.debug("Saving global configuration...") - for item in sessions.sessions: - if sessions.sessions[item].logged == False: continue - log.debug("Disconnecting streams for %s session" % (sessions.sessions[item].session_id,)) - sessions.sessions[item].sound.cleaner.cancel() - log.debug("Shelving database for " + sessions.sessions[item].session_id) - sessions.sessions[item].shelve() - if system == "Windows": - self.systrayIcon.RemoveIcon() - pidpath = os.path.join(os.getenv("temp"), "{}.pid".format(application.name)) - if os.path.exists(pidpath): - os.remove(pidpath) - widgetUtils.exit_application() - - def follow(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users) - - def unfollow(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users, "unfollow") - - def mute(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users, "mute") - - def unmute(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users, "unmute") - - def block(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users, "block") - - def unblock(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users, "unblock") - - def report(self, *args, **kwargs): - buff = self.get_current_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - u = userActionsController.userActionsController(buff, users, "report") - - def post_tweet(self, event=None): - buffer = self.get_best_buffer() - buffer.post_status() - - def post_reply(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.name == "direct_messages": - buffer.send_message() - else: - buffer.reply() - - def send_dm(self, *args, **kwargs): - buffer = self.get_current_buffer() - buffer.send_message() - - def post_retweet(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": - return - else: - buffer.share_item() - - def add_to_favourites(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": - return - else: - id = buffer.get_tweet().id - call_threaded(buffer.session.api_call, call_name="create_favorite", _sound="favourite.ogg", id=id) - - def remove_from_favourites(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": - return - else: - id = buffer.get_tweet().id - call_threaded(buffer.session.api_call, call_name="destroy_favorite", id=id) - - def toggle_like(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": - return - else: - id = buffer.get_tweet().id - tweet = buffer.session.twitter.get_status(id=id, include_ext_alt_text=True, tweet_mode="extended") - if tweet.favorited == False: - call_threaded(buffer.session.api_call, call_name="create_favorite", _sound="favourite.ogg", id=id) - else: - call_threaded(buffer.session.api_call, call_name="destroy_favorite", id=id) - - def view_item(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.type == "account" or buffer.type == "empty": - return - elif buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search": - tweet, tweetsList = buffer.get_full_tweet() - msg = messages.viewTweet(tweet, tweetsList, utc_offset=buffer.session.db["utc_offset"]) - elif buffer.type == "dm": - non_tweet = buffer.get_formatted_message() - item = buffer.get_right_tweet() - original_date = arrow.get(int(item.created_timestamp)) - date = original_date.shift(seconds=buffer.session.db["utc_offset"]).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage()) - msg = messages.viewTweet(non_tweet, [], False, date=date) - else: - non_tweet = buffer.get_formatted_message() - msg = messages.viewTweet(non_tweet, [], False) - - def open_in_browser(self, *args, **kwargs): - buffer = self.get_current_buffer() - if hasattr(buffer, "open_in_browser"): - buffer.open_in_browser() - - def open_favs_timeline(self, *args, **kwargs): - self.open_timeline(default="favourites") - - def open_timeline(self, default="tweets", *args, **kwargs): - buff = self.get_best_buffer() - if not hasattr(buff, "get_right_tweet"): return - tweet = buff.get_right_tweet() - if buff.type == "people": - users = [tweet.screen_name] - elif buff.type == "dm": - users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] - else: - users = utils.get_all_users(tweet, buff.session.db) - dlg = dialogs.userSelection.selectUserDialog(users=users, default=default) - if dlg.get_response() == widgetUtils.OK: - usr = utils.if_user_exists(buff.session.twitter, dlg.get_user()) - if usr != None: - if usr == dlg.get_user(): - commonMessageDialogs.suspended_user() - return - if usr.protected == True: - if usr.following == False: - commonMessageDialogs.no_following() - return - tl_type = dlg.get_action() - if tl_type == "tweets": - if usr.statuses_count == 0: - commonMessageDialogs.no_tweets() - return - if usr.id_str in buff.session.settings["other_buffers"]["timelines"]: - commonMessageDialogs.timeline_exist() - return - tl = twitterBuffers.baseBufferController(self.view.nb, "user_timeline", "%s-timeline" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="tweet_timeline.ogg", user_id=usr.id_str, tweet_mode="extended") - try: - tl.start_stream(play_sound=False) - except ValueError: - commonMessageDialogs.unauthorized() - return - pos=self.view.search("timelines", buff.session.db["user_name"]) - self.insert_buffer(tl, pos+1) - self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos) - buff.session.settings["other_buffers"]["timelines"].append(usr.id_str) - pub.sendMessage("buffer-title-changed", buffer=tl) - buff.session.sound.play("create_timeline.ogg") - elif tl_type == "favourites": - if usr.favourites_count == 0: - commonMessageDialogs.no_favs() - return - if usr.id_str in buff.session.settings["other_buffers"]["favourites_timelines"]: - commonMessageDialogs.timeline_exist() - return - tl = twitterBuffers.baseBufferController(self.view.nb, "favorites", "%s-favorite" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=usr.id_str, tweet_mode="extended") - try: - tl.start_stream(play_sound=False) - except ValueError: - commonMessageDialogs.unauthorized() - return - pos=self.view.search("favs_timelines", buff.session.db["user_name"]) - self.insert_buffer(tl, pos+1) - self.view.insert_buffer(buffer=tl.buffer, name=_(u"Likes for {}").format(dlg.get_user()), pos=pos) - buff.session.settings["other_buffers"]["favourites_timelines"].append(usr.id_str) - pub.sendMessage("buffer-title-changed", buffer=buff) - buff.session.sound.play("create_timeline.ogg") - elif tl_type == "followers": - if usr.followers_count == 0: - commonMessageDialogs.no_followers() - return - if usr.id_str in buff.session.settings["other_buffers"]["followers_timelines"]: - commonMessageDialogs.timeline_exist() - return - tl = twitterBuffers.peopleBufferController(self.view.nb, "followers", "%s-followers" % (usr.id_str,), buff.session, buff.session.db["user_name"], sound="new_event.ogg", user_id=usr.id_str) - try: - tl.start_stream(play_sound=False) - except ValueError: - commonMessageDialogs.unauthorized() - return - pos=self.view.search("followers_timelines", buff.session.db["user_name"]) - self.insert_buffer(tl, pos+1) - self.view.insert_buffer(buffer=tl.buffer, name=_(u"Followers for {}").format(dlg.get_user()), pos=pos) - buff.session.settings["other_buffers"]["followers_timelines"].append(usr.id_str) - buff.session.sound.play("create_timeline.ogg") - pub.sendMessage("buffer-title-changed", buffer=i) - elif tl_type == "friends": - if usr.friends_count == 0: - commonMessageDialogs.no_friends() - return - if usr.id_str in buff.session.settings["other_buffers"]["friends_timelines"]: - commonMessageDialogs.timeline_exist() - return - tl = twitterBuffers.peopleBufferController(self.view.nb, "friends", "%s-friends" % (usr.id_str,), buff.session, buff.session.db["user_name"], sound="new_event.ogg", user_id=usr.id_str) - try: - tl.start_stream(play_sound=False) - except ValueError: - commonMessageDialogs.unauthorized() - return - pos=self.view.search("friends_timelines", buff.session.db["user_name"]) - self.insert_buffer(tl, pos+1) - self.view.insert_buffer(buffer=tl.buffer, name=_(u"Friends for {}").format(dlg.get_user()), pos=pos) - buff.session.settings["other_buffers"]["friends_timelines"].append(usr.id_str) - buff.session.sound.play("create_timeline.ogg") - pub.sendMessage("buffer-title-changed", buffer=i) - else: - commonMessageDialogs.user_not_exist() - buff.session.settings.write() - - def open_conversation(self, *args, **kwargs): - buffer = self.get_current_buffer() - id = buffer.get_right_tweet().id_str - user = buffer.get_right_tweet().user.screen_name - search = twitterBuffers.conversationBufferController(self.view.nb, "search", "%s-searchterm" % (id,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", since_id=id, q="@{0}".format(user,)) - search.tweet = buffer.get_right_tweet() - search.start_stream(start=True) - pos=self.view.search("searches", buffer.session.db["user_name"]) - self.insert_buffer(search, pos) - self.view.insert_buffer(search.buffer, name=_(u"Conversation with {0}").format(user), pos=pos) - - def show_hide(self, *args, **kwargs): - km = self.create_invisible_keyboard_shorcuts() - if self.showing == True: - if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == False: - self.register_invisible_keyboard_shorcuts(km) - self.view.Hide() - self.fix_wrong_buffer() - self.showing = False - else: - if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == False: - self.unregister_invisible_keyboard_shorcuts(km) - self.view.Show() - self.showing = True - - def get_trending_topics(self, *args, **kwargs): - buff = self.get_best_buffer() - trends = trendingTopics.trendingTopicsController(buff.session) - if trends.dialog.get_response() == widgetUtils.OK: - woeid = trends.get_woeid() - if woeid in buff.session.settings["other_buffers"]["trending_topic_buffers"]: return - buffer = twitterBuffers.trendsBufferController(self.view.nb, "%s_tt" % (woeid,), buff.session, buff.account, woeid, sound="trends_updated.ogg") - buffer.searchfunction = self.search - pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"]) - self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (trends.get_string()), pos=pos) - self.buffers.append(buffer) - buffer.start_stream() - buffer.session.settings["other_buffers"]["trending_topic_buffers"].append(woeid) - buffer.session.settings.write() - - def reverse_geocode(self, event=None): - try: - tweet = self.get_current_buffer().get_tweet() - if tweet.coordinates != None: - x = tweet.coordinates["coordinates"][0] - y = tweet.coordinates["coordinates"][1] - address = geocoder.reverse_geocode(y, x, language = languageHandler.curLang) - if event == None: output.speak(address[0].__str__()) - else: self.view.show_address(address[0].__str__()) - else: - output.speak(_(u"There are no coordinates in this tweet")) - except GeocoderError: - output.speak(_(u"There are no results for the coordinates in this tweet")) - except ValueError: - output.speak(_(u"Error decoding coordinates. Try again later.")) - except KeyError: - pass - except AttributeError: - pass - - def view_reverse_geocode(self, event=None): - try: - tweet = self.get_current_buffer().get_right_tweet() - if tweet.coordinates != None: - x = tweet.coordinates["coordinates"][0] - y = tweet.coordinates["coordinates"][1] - address = geocoder.reverse_geocode(y, x, language = languageHandler.curLang) - dlg = commonMessageDialogs.view_geodata(address[0].__str__()) - else: - output.speak(_(u"There are no coordinates in this tweet")) - except GeocoderError: - output.speak(_(u"There are no results for the coordinates in this tweet")) - except ValueError: - output.speak(_(u"Error decoding coordinates. Try again later.")) - except KeyError: - pass - except AttributeError: - pass - - def get_more_items(self, *args, **kwargs): - self.get_current_buffer().get_more_items() - - def clear_buffer(self, *args, **kwargs): - self.get_current_buffer().clear_list() - - def remove_buffer(self, *args, **kwargs): - buffer = self.get_current_buffer() - if not hasattr(buffer, "account"): return - buff = self.view.search(buffer.name, buffer.account) - answer = buffer.remove_buffer() - if answer == False: return - log.debug("destroying buffer...") - if hasattr(buffer, "timer"): - log.debug("Stopping timer...") - buffer.timer.cancel() - log.debug("Timer cancelled.") - self.right() - self.view.delete_buffer(buff) - buffer.session.sound.play("delete_timeline.ogg") - self.buffers.remove(buffer) - del buffer - - def skip_buffer(self, forward=True): - buff = self.get_current_buffer() - if buff.invisible == False: - self.view.advance_selection(forward) - - def buffer_changed(self, *args, **kwargs): - buffer = self.get_current_buffer() - if buffer.account != self.current_account: - self.current_account = buffer.account - if not hasattr(buffer, "session") or buffer.session == None: return - muted = autoread = False - if buffer.name in buffer.session.settings["other_buffers"]["muted_buffers"]: - muted = True - elif buffer.name in buffer.session.settings["other_buffers"]["autoread_buffers"]: - autoread = True - self.view.check_menuitem("mute_buffer", muted) - self.view.check_menuitem("autoread", autoread) - - def fix_wrong_buffer(self): - buf = self.get_best_buffer() - if buf == None: - for i in self.accounts: - buffer = self.view.search("home_timeline", i) - if buffer != None: break - else: - buffer = self.view.search("home_timeline", buf.session.db["user_name"]) - if buffer!=None: - self.view.change_buffer(buffer) - - def up(self, *args, **kwargs): - page = self.get_current_buffer() - if not hasattr(page.buffer, "list"): - output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) - return - position = page.buffer.list.get_selected() - index = position-1 - try: - page.buffer.list.select_item(index) - except: - pass - if position == page.buffer.list.get_selected(): - page.session.sound.play("limit.ogg") - - try: - output.speak(page.get_message(), True) - except: - pass - - def down(self, *args, **kwargs): - page = self.get_current_buffer() - if not hasattr(page.buffer, "list"): - output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) - return - position = page.buffer.list.get_selected() - index = position+1 - try: - page.buffer.list.select_item(index) - except: - pass - if position == page.buffer.list.get_selected(): - page.session.sound.play("limit.ogg") - try: - output.speak(page.get_message(), True) - except: - pass - - def left(self, *args, **kwargs): - buff = self.view.get_current_buffer_pos() - buffer = self.get_current_buffer() - if not hasattr(buffer.buffer, "list"): - output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) - return - if buff == self.get_first_buffer_index(buffer.account) or buff == 0: - self.view.change_buffer(self.get_last_buffer_index(buffer.account)) - else: - self.view.change_buffer(buff-1) - while self.get_current_buffer().invisible == False: self.skip_buffer(False) - buffer = self.get_current_buffer() - if self.showing == True: buffer.buffer.set_focus_in_list() - try: - msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) - except: - msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) - output.speak(msg, True) - - def right(self, *args, **kwargs): - buff = self.view.get_current_buffer_pos() - buffer = self.get_current_buffer() - if not hasattr(buffer.buffer, "list"): - output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) - return - if buff == self.get_last_buffer_index(buffer.account) or buff+1 == self.view.get_buffer_count(): - self.view.change_buffer(self.get_first_buffer_index(buffer.account)) - else: - self.view.change_buffer(buff+1) - while self.get_current_buffer().invisible == False: self.skip_buffer(True) - buffer = self.get_current_buffer() - if self.showing == True: buffer.buffer.set_focus_in_list() - try: - msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) - except: - msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) - output.speak(msg, True) - - def next_account(self, *args, **kwargs): - index = self.accounts.index(self.current_account) - if index+1 == len(self.accounts): - index = 0 - else: - index = index+1 - account = self.accounts[index] - self.current_account = account - buffer_object = self.get_first_buffer(account) - if buffer_object == None: - output.speak(_(u"{0}: This account is not logged into Twitter.").format(account), True) - return - buff = self.view.search(buffer_object.name, account) - if buff == None: - output.speak(_(u"{0}: This account is not logged into Twitter.").format(account), True) - return - self.view.change_buffer(buff) - buffer = self.get_current_buffer() - if self.showing == True: buffer.buffer.set_focus_in_list() - try: - msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) - except: - msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) - output.speak(msg, True) - - def previous_account(self, *args, **kwargs): - index = self.accounts.index(self.current_account) - if index-1 < 0: - index = len(self.accounts)-1 - else: - index = index-1 - account = self.accounts[index] - self.current_account = account - buffer_object = self.get_first_buffer(account) - if buffer_object == None: - output.speak(_(u"{0}: This account is not logged into Twitter.").format(account), True) - return - buff = self.view.search(buffer_object.name, account) - if buff == None: - output.speak(_(u"{0}: This account is not logged into twitter.").format(account), True) - return - self.view.change_buffer(buff) - buffer = self.get_current_buffer() - if self.showing == True: buffer.buffer.set_focus_in_list() - try: - msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) - except: - msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) - output.speak(msg, True) - - def go_home(self): - buffer = self.get_current_buffer() - buffer.buffer.list.select_item(0) - try: - output.speak(buffer.get_message(), True) - except: - pass - - def go_end(self): - buffer = self.get_current_buffer() - buffer.buffer.list.select_item(buffer.buffer.list.get_count()-1) - try: - output.speak(buffer.get_message(), True) - except: - pass - - def go_page_up(self): - buffer = self.get_current_buffer() - if buffer.buffer.list.get_selected() <= 20: - index = 0 - else: - index = buffer.buffer.list.get_selected() - 20 - buffer.buffer.list.select_item(index) - try: - output.speak(buffer.get_message(), True) - except: - pass - - def go_page_down(self): - buffer = self.get_current_buffer() - if buffer.buffer.list.get_selected() >= buffer.buffer.list.get_count() - 20: - index = buffer.buffer.list.get_count()-1 - else: - index = buffer.buffer.list.get_selected() + 20 - buffer.buffer.list.select_item(index) - try: - output.speak(buffer.get_message(), True) - except: - pass - - def url(self, *args, **kwargs): - buffer = self.get_current_buffer() - buffer.url() - - def audio(self, *args, **kwargs): - self.get_current_buffer().audio() - - def volume_down(self, *args, **kwargs): - self.get_current_buffer().volume_down() - - def volume_up(self, *args, **kwargs): - self.get_current_buffer().volume_up() - - def create_invisible_keyboard_shorcuts(self): - keymap = {} - for i in config.keymap["keymap"]: - if hasattr(self, i): - keymap[config.keymap["keymap"][i]] = getattr(self, i) - return keymap - - def register_invisible_keyboard_shorcuts(self, keymap): - if config.changed_keymap: - commonMessageDialogs.changed_keymap() - self.keyboard_handler = WXKeyboardHandler(self.view) - self.keyboard_handler.register_keys(keymap) - - def unregister_invisible_keyboard_shorcuts(self, keymap): - try: - self.keyboard_handler.unregister_keys(keymap) - del self.keyboard_handler - except AttributeError: - pass - - def notify(self, session, play_sound=None, message=None, notification=False): - if session.settings["sound"]["session_mute"] == True: return - if play_sound != None: - session.sound.play(play_sound) - if message != None: - output.speak(message, speech=session.settings["reporting"]["speech_reporting"], braille=session.settings["reporting"]["braille_reporting"]) - - def manage_sent_dm(self, data, user): - buffer = self.search_buffer("sent_direct_messages", user) - if buffer == None: return - play_sound = "dm_sent.ogg" - if "sent_direct_messages" not in buffer.session.settings["other_buffers"]["muted_buffers"]: - self.notify(buffer.session, play_sound=play_sound) - buffer.add_new_item(data) - - def manage_sent_tweets(self, data, user): - buffer = self.search_buffer("sent_tweets", user) - if buffer == None: return + self.save_db = RepeatingTimer(300, self.save_data_in_db) + self.save_db.start() + log.debug("Setting updates to buffers every %d seconds..." % (60*config.app["app-settings"]["update_period"],)) + self.update_buffers_function = RepeatingTimer(60*config.app["app-settings"]["update_period"], self.update_buffers) + self.update_buffers_function.start() + + def start(self): + """ Starts all buffer objects. Loads their items.""" + for i in sessions.sessions: + if sessions.sessions[i].is_logged == False: continue + self.start_buffers(sessions.sessions[i]) + self.set_buffer_positions(sessions.sessions[i]) + if config.app["app-settings"]["play_ready_sound"] == True: + sessions.sessions[list(sessions.sessions.keys())[0]].sound.play("ready.ogg") + if config.app["app-settings"]["speak_ready_msg"] == True: + output.speak(_(u"Ready")) + self.started = True + + def create_ignored_session_buffer(self, session): + self.accounts.append(session.settings["twitter"]["user_name"]) + account = baseBuffers.accountPanel(self.view.nb, session.settings["twitter"]["user_name"], session.settings["twitter"]["user_name"], session.session_id) + account.logged = False + account.setup_account() + self.buffers.append(account) + self.view.add_buffer(account.buffer , name=session.settings["twitter"]["user_name"]) + + def login_account(self, session_id): + for i in sessions.sessions: + if sessions.sessions[i].session_id == session_id: session = sessions.sessions[i] + session.login() + session.db = dict() + self.create_buffers(session, False) + self.start_buffers(session) + + def create_buffers(self, session, createAccounts=True): + """ Generates buffer objects for an user account. + session SessionObject: a sessionmanager.session.Session Object""" + session.get_user_info() + if createAccounts == True: + self.accounts.append(session.db["user_name"]) + account = baseBuffers.accountPanel(self.view.nb, session.db["user_name"], session.db["user_name"], session.session_id) + account.setup_account() + self.buffers.append(account) + self.view.add_buffer(account.buffer , name=session.db["user_name"]) + for i in session.settings['general']['buffer_order']: + if i == 'home': + home = twitterBuffers.baseBufferController(self.view.nb, "home_timeline", "home_timeline", session, session.db["user_name"], sound="tweet_received.ogg", tweet_mode="extended") + self.buffers.append(home) + self.view.insert_buffer(home.buffer, name=_(u"Home"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'mentions': + mentions = twitterBuffers.baseBufferController(self.view.nb, "mentions_timeline", "mentions", session, session.db["user_name"], sound="mention_received.ogg", tweet_mode="extended") + self.buffers.append(mentions) + self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'dm': + dm = twitterBuffers.directMessagesController(self.view.nb, "list_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel", compose_func="compose_direct_message", sound="dm_received.ogg") + self.buffers.append(dm) + self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'sent_dm': + sent_dm = twitterBuffers.sentDirectMessagesController(self.view.nb, "", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel", compose_func="compose_direct_message") + self.buffers.append(sent_dm) + self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'sent_tweets': + sent_tweets = twitterBuffers.baseBufferController(self.view.nb, "user_timeline", "sent_tweets", session, session.db["user_name"], screen_name=session.db["user_name"], tweet_mode="extended") + self.buffers.append(sent_tweets) + self.view.insert_buffer(sent_tweets.buffer, name=_(u"Sent tweets"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'favorites': + favourites = twitterBuffers.baseBufferController(self.view.nb, "favorites", "favourites", session, session.db["user_name"], sound="favourite.ogg", tweet_mode="extended") + self.buffers.append(favourites) + self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'followers': + followers = twitterBuffers.peopleBufferController(self.view.nb, "followers", "followers", session, session.db["user_name"], sound="update_followers.ogg", screen_name=session.db["user_name"]) + self.buffers.append(followers) + self.view.insert_buffer(followers.buffer, name=_(u"Followers"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'friends': + friends = twitterBuffers.peopleBufferController(self.view.nb, "friends", "friends", session, session.db["user_name"], screen_name=session.db["user_name"]) + self.buffers.append(friends) + self.view.insert_buffer(friends.buffer, name=_(u"Friends"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'blocks': + blocks = twitterBuffers.peopleBufferController(self.view.nb, "blocks", "blocked", session, session.db["user_name"]) + self.buffers.append(blocks) + self.view.insert_buffer(blocks.buffer, name=_(u"Blocked users"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + elif i == 'muted': + muted = twitterBuffers.peopleBufferController(self.view.nb, "mutes", "muted", session, session.db["user_name"]) + self.buffers.append(muted) + self.view.insert_buffer(muted.buffer, name=_(u"Muted users"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + timelines = baseBuffers.emptyPanel(self.view.nb, "timelines", session.db["user_name"]) + self.buffers.append(timelines) + self.view.insert_buffer(timelines.buffer , name=_(u"Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + for i in session.settings["other_buffers"]["timelines"]: + tl = twitterBuffers.baseBufferController(self.view.nb, "user_timeline", "%s-timeline" % (i,), session, session.db["user_name"], sound="tweet_timeline.ogg", bufferType=None, user_id=i, tweet_mode="extended") + self.buffers.append(tl) + self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(i,), pos=self.view.search("timelines", session.db["user_name"])) + favs_timelines = baseBuffers.emptyPanel(self.view.nb, "favs_timelines", session.db["user_name"]) + self.buffers.append(favs_timelines) + self.view.insert_buffer(favs_timelines.buffer , name=_(u"Likes timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + for i in session.settings["other_buffers"]["favourites_timelines"]: + tl = twitterBuffers.baseBufferController(self.view.nb, "favorites", "%s-favorite" % (i,), session, session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=i, tweet_mode="extended") + self.buffers.append(tl) + self.view.insert_buffer(tl.buffer, name=_(u"Likes for {}").format(i,), pos=self.view.search("favs_timelines", session.db["user_name"])) + followers_timelines = baseBuffers.emptyPanel(self.view.nb, "followers_timelines", session.db["user_name"]) + self.buffers.append(followers_timelines) + self.view.insert_buffer(followers_timelines.buffer , name=_(u"Followers' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + for i in session.settings["other_buffers"]["followers_timelines"]: + tl = twitterBuffers.peopleBufferController(self.view.nb, "followers", "%s-followers" % (i,), session, session.db["user_name"], sound="new_event.ogg", user_id=i) + self.buffers.append(tl) + self.view.insert_buffer(tl.buffer, name=_(u"Followers for {}").format(i,), pos=self.view.search("followers_timelines", session.db["user_name"])) + friends_timelines = baseBuffers.emptyPanel(self.view.nb, "friends_timelines", session.db["user_name"]) + self.buffers.append(friends_timelines) + self.view.insert_buffer(friends_timelines.buffer , name=_(u"Friends' Timelines"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + for i in session.settings["other_buffers"]["friends_timelines"]: + tl = twitterBuffers.peopleBufferController(self.view.nb, "friends", "%s-friends" % (i,), session, session.db["user_name"], sound="new_event.ogg", user_id=i) + self.buffers.append(tl) + self.view.insert_buffer(tl.buffer, name=_(u"Friends for {}").format(i,), pos=self.view.search("friends_timelines", session.db["user_name"])) + lists = baseBuffers.emptyPanel(self.view.nb, "lists", session.db["user_name"]) + self.buffers.append(lists) + self.view.insert_buffer(lists.buffer , name=_(u"Lists"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + for i in session.settings["other_buffers"]["lists"]: + tl = twitterBuffers.listBufferController(self.view.nb, "list_timeline", "%s-list" % (i,), session, session.db["user_name"], bufferType=None, sound="list_tweet.ogg", list_id=utils.find_list(i, session.db["lists"]), tweet_mode="extended") + session.lists.append(tl) + self.buffers.append(tl) + self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(i), pos=self.view.search("lists", session.db["user_name"])) + searches = baseBuffers.emptyPanel(self.view.nb, "searches", session.db["user_name"]) + self.buffers.append(searches) + self.view.insert_buffer(searches.buffer , name=_(u"Searches"), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + for i in session.settings["other_buffers"]["tweet_searches"]: + tl = twitterBuffers.searchBufferController(self.view.nb, "search", "%s-searchterm" % (i,), session, session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=i, tweet_mode="extended") + self.buffers.append(tl) + self.view.insert_buffer(tl.buffer, name=_(u"Search for {}").format(i), pos=self.view.search("searches", session.db["user_name"])) + for i in session.settings["other_buffers"]["trending_topic_buffers"]: + buffer = twitterBuffers.trendsBufferController(self.view.nb, "%s_tt" % (i,), session, session.db["user_name"], i, sound="trends_updated.ogg") + buffer.start_stream(play_sound=False) + buffer.searchfunction = self.search + self.buffers.append(buffer) + self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (buffer.name_), pos=self.view.search(session.db["user_name"], session.db["user_name"])) + + def set_buffer_positions(self, session): + "Sets positions for buffers if values exist in the database." + for i in self.buffers: + if i.account == session.db["user_name"] and i.name+"_pos" in session.db and hasattr(i.buffer,'list'): + i.buffer.list.select_item(session.db[str(i.name+"_pos")]) + + def logout_account(self, session_id): + for i in sessions.sessions: + if sessions.sessions[i].session_id == session_id: session = sessions.sessions[i] + user = session.db["user_name"] + delete_buffers = [] + for i in self.buffers: + if i.account == user and i.name != user: + delete_buffers.append(i.name) + for i in delete_buffers: + self.destroy_buffer(i, user) + session.db = None + + def destroy_buffer(self, buffer_name, account): + buffer = self.search_buffer(buffer_name, account) + if buffer == None: return + buff = self.view.search(buffer.name, buffer.account) + if buff == None: return + self.view.delete_buffer(buff) + self.buffers.remove(buffer) + del buffer + + def search_topic(self, term): + self.search(value=term) + + def search(self, event=None, value="", *args, **kwargs): + """ Searches words or users in twitter. This creates a new buffer containing the search results.""" + log.debug("Creating a new search...") + dlg = dialogs.search.searchDialog(value) + if dlg.get_response() == widgetUtils.OK and dlg.get("term") != "": + term = dlg.get("term") + buffer = self.get_best_buffer() + if dlg.get("tweets") == True: + if term not in buffer.session.settings["other_buffers"]["tweet_searches"]: + buffer.session.settings["other_buffers"]["tweet_searches"].append(term) + buffer.session.settings.write() + args = {"lang": dlg.get_language(), "result_type": dlg.get_result_type()} + search = twitterBuffers.searchBufferController(self.view.nb, "search", "%s-searchterm" % (term,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", q=term, tweet_mode="extended", **args) + else: + log.error("A buffer for the %s search term is already created. You can't create a duplicate buffer." % (term,)) + return + elif dlg.get("users") == True: + search = twitterBuffers.searchPeopleBufferController(self.view.nb, "search_users", "%s-searchUser" % (term,), buffer.session, buffer.session.db["user_name"], bufferType=None, sound="search_updated.ogg", q=term) + search.start_stream(mandatory=True) + pos=self.view.search("searches", buffer.session.db["user_name"]) + self.insert_buffer(search, pos) + self.view.insert_buffer(search.buffer, name=_(u"Search for {}").format(term), pos=pos) + dlg.Destroy() + + def find(self, *args, **kwargs): + if 'string' in kwargs: + string=kwargs['string'] + else: + string='' + dlg = dialogs.find.findDialog(string) + if dlg.get_response() == widgetUtils.OK and dlg.get("string") != "": + string = dlg.get("string") + #If we still have an empty string for some reason (I.E. user clicked cancel, etc), return here. + if string == '': + log.debug("Find canceled.") + return + page = self.get_current_buffer() + if not hasattr(page.buffer, "list"): + output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) + return + count = page.buffer.list.get_count() + if count < 1: + output.speak(_(u"Empty buffer."), True) + return + start = page.buffer.list.get_selected() + for i in range(start, count): + if string.lower() in page.buffer.list.get_text_column(i, 1).lower(): + page.buffer.list.select_item(i) + return output.speak(page.get_message(), True) + output.speak(_(u"{0} not found.").format(string,), True) + + def filter(self, *args, **kwargs): + page = self.get_current_buffer() + if not hasattr(page.buffer, "list"): + output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) + return + # Let's prevent filtering of some buffers (people buffers, direct messages, events and sent items). + # ToDo: Remove events from here after August 16. + if (page.name == "direct_messages" or page.name == "sent_tweets" or page.name == "events") or page.type == "people": + output.speak(_(u"Filters cannot be applied on this buffer")) + return + new_filter = filterController.filter(page) + + def manage_filters(self, *args, **kwargs): + page = self.get_best_buffer() + manage_filters = filterController.filterManager(page.session) + + def seekLeft(self, *args, **kwargs): + try: + sound.URLPlayer.seek(-5000) + except: + output.speak("Unable to seek.",True) + + def seekRight(self, *args, **kwargs): + try: + sound.URLPlayer.seek(5000) + except: + output.speak("Unable to seek.",True) + + def edit_keystrokes(self, *args, **kwargs): + editor = keystrokeEditor.KeystrokeEditor() + if editor.changed == True: + config.keymap.write() + register = False + # determines if we need to reassign the keymap. + if self.showing == False: + register = True + elif config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == True: + register = True + # If there is a keyboard handler instance we need unregister all old keystrokes before register the new ones. + if hasattr(self, "keyboard_handler"): + keymap = {} + for i in editor.hold_map: + if hasattr(self, i): keymap[editor.hold_map[i]] = getattr(self, i) + self.unregister_invisible_keyboard_shorcuts(keymap) + self.invisible_shorcuts_changed(registered=register) + + def learn_sounds(self, *args, **kwargs): + """ Opens the sounds tutorial for the current account.""" + buffer = self.get_best_buffer() + SoundsTutorial.soundsTutorial(buffer.session) + + def view_user_lists(self, *args, **kwargs): + buff = self.get_best_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users) + if dlg.get_response() == widgetUtils.OK: + user = dlg.get_user() + else: + return + l = listsController.listsController(buff.session, user=user) + + def add_to_list(self, *args, **kwargs): + buff = self.get_best_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users) + if dlg.get_response() == widgetUtils.OK: + user = dlg.get_user() + else: + return + dlg = dialogs.lists.addUserListDialog() + dlg.populate_list([compose.compose_list(item) for item in buff.session.db["lists"]]) + if dlg.get_response() == widgetUtils.OK: + try: + list = buff.session.twitter.add_list_member(list_id=buff.session.db["lists"][dlg.get_item()].id, screen_name=user) + older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()].id, buff.session.db["lists"]) + listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()].name.lower()), buff.session.db["user_name"]) + if listBuffer != None: listBuffer.get_user_ids() + buff.session.db["lists"].pop(older_list) + buff.session.db["lists"].append(list) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) + + def remove_from_list(self, *args, **kwargs): + buff = self.get_best_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + dlg = dialogs.utils.selectUserDialog(_(u"Select the user"), users) + if dlg.get_response() == widgetUtils.OK: + user = dlg.get_user() + else: + return + dlg = dialogs.lists.removeUserListDialog() + dlg.populate_list([compose.compose_list(item) for item in buff.session.db["lists"]]) + if dlg.get_response() == widgetUtils.OK: + try: + list = buff.session.twitter.remove_list_member(list_id=buff.session.db["lists"][dlg.get_item()].id, screen_name=user) + older_list = utils.find_item(buff.session.db["lists"][dlg.get_item()].id, buff.session.db["lists"]) + listBuffer = self.search_buffer("%s-list" % (buff.session.db["lists"][dlg.get_item()].name.lower()), buff.session.db["user_name"]) + if listBuffer != None: listBuffer.get_user_ids() + buff.session.db["lists"].pop(older_list) + buff.session.db["lists"].append(list) + except TweepError as e: + output.speak("error %s: %s" % (e.api_code, e.reason)) + + def list_manager(self, *args, **kwargs): + s = self.get_best_buffer().session + l = listsController.listsController(s) + + def configuration(self, *args, **kwargs): + """ Opens the global settings dialogue.""" + d = settings.globalSettingsController() + if d.response == widgetUtils.OK: + d.save_configuration() + if d.needs_restart == True: + commonMessageDialogs.needs_restart() + restart.restart_program() + + def accountConfiguration(self, *args, **kwargs): + """ Opens the account settings dialogue for the current account.""" + buff = self.get_best_buffer() + manager.manager.set_current_session(buff.session.session_id) + d = settings.accountSettingsController(buff, self) + if d.response == widgetUtils.OK: + d.save_configuration() + if d.needs_restart == True: + commonMessageDialogs.needs_restart() + buff.session.settings.write() + restart.restart_program() + + def report_error(self, *args, **kwargs): + r = issueReporter.reportBug(self.get_best_buffer().session.db["user_name"]) + + def check_for_updates(self, *args, **kwargs): + update = updater.do_update() + if update == False: + view.no_update_available() + + def delete(self, *args, **kwargs): + """ Deletes an item in the current buffer. + Users can only remove their tweets and direct messages, other users' tweets and people (followers, friends, blocked, etc) can not be removed using this method.""" + buffer = self.view.get_current_buffer() + if hasattr(buffer, "account"): + buffer = self.search_buffer(buffer.name, buffer.account) + buffer.destroy_status() + + def exit(self, *args, **kwargs): + if config.app["app-settings"]["ask_at_exit"] == True: + answer = commonMessageDialogs.exit_dialog(self.view) + if answer == widgetUtils.YES: + self.exit_() + else: + self.exit_() + + def exit_(self, *args, **kwargs): + for i in self.buffers: i.save_positions() + log.debug("Exiting...") + log.debug("Saving global configuration...") + for item in sessions.sessions: + if sessions.sessions[item].logged == False: continue + log.debug("Disconnecting streams for %s session" % (sessions.sessions[item].session_id,)) + sessions.sessions[item].sound.cleaner.cancel() + log.debug("Shelving database for " + sessions.sessions[item].session_id) + sessions.sessions[item].shelve() + if system == "Windows": + self.systrayIcon.RemoveIcon() + pidpath = os.path.join(os.getenv("temp"), "{}.pid".format(application.name)) + if os.path.exists(pidpath): + os.remove(pidpath) + widgetUtils.exit_application() + + def follow(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users) + + def unfollow(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users, "unfollow") + + def mute(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users, "mute") + + def unmute(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users, "unmute") + + def block(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users, "block") + + def unblock(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users, "unblock") + + def report(self, *args, **kwargs): + buff = self.get_current_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + u = userActionsController.userActionsController(buff, users, "report") + + def post_tweet(self, event=None): + buffer = self.get_best_buffer() + buffer.post_status() + + def post_reply(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.name == "direct_messages": + buffer.send_message() + else: + buffer.reply() + + def send_dm(self, *args, **kwargs): + buffer = self.get_current_buffer() + buffer.send_message() + + def post_retweet(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": + return + else: + buffer.share_item() + + def add_to_favourites(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": + return + else: + id = buffer.get_tweet().id + call_threaded(buffer.session.api_call, call_name="create_favorite", _sound="favourite.ogg", id=id) + + def remove_from_favourites(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": + return + else: + id = buffer.get_tweet().id + call_threaded(buffer.session.api_call, call_name="destroy_favorite", id=id) + + def toggle_like(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.type == "dm" or buffer.type == "people" or buffer.type == "events": + return + else: + id = buffer.get_tweet().id + tweet = buffer.session.twitter.get_status(id=id, include_ext_alt_text=True, tweet_mode="extended") + if tweet.favorited == False: + call_threaded(buffer.session.api_call, call_name="create_favorite", _sound="favourite.ogg", id=id) + else: + call_threaded(buffer.session.api_call, call_name="destroy_favorite", id=id) + + def view_item(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.type == "account" or buffer.type == "empty": + return + elif buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search": + tweet, tweetsList = buffer.get_full_tweet() + msg = messages.viewTweet(tweet, tweetsList, utc_offset=buffer.session.db["utc_offset"]) + elif buffer.type == "dm": + non_tweet = buffer.get_formatted_message() + item = buffer.get_right_tweet() + original_date = arrow.get(int(item.created_timestamp)) + date = original_date.shift(seconds=buffer.session.db["utc_offset"]).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage()) + msg = messages.viewTweet(non_tweet, [], False, date=date) + else: + non_tweet = buffer.get_formatted_message() + msg = messages.viewTweet(non_tweet, [], False) + + def open_in_browser(self, *args, **kwargs): + buffer = self.get_current_buffer() + if hasattr(buffer, "open_in_browser"): + buffer.open_in_browser() + + def open_favs_timeline(self, *args, **kwargs): + self.open_timeline(default="favourites") + + def open_timeline(self, default="tweets", *args, **kwargs): + buff = self.get_best_buffer() + if not hasattr(buff, "get_right_tweet"): return + tweet = buff.get_right_tweet() + if buff.type == "people": + users = [tweet.screen_name] + elif buff.type == "dm": + users = [buff.session.get_user(tweet.message_create["sender_id"]).screen_name] + else: + users = utils.get_all_users(tweet, buff.session.db) + dlg = dialogs.userSelection.selectUserDialog(users=users, default=default) + if dlg.get_response() == widgetUtils.OK: + usr = utils.if_user_exists(buff.session.twitter, dlg.get_user()) + if usr != None: + if usr == dlg.get_user(): + commonMessageDialogs.suspended_user() + return + if usr.protected == True: + if usr.following == False: + commonMessageDialogs.no_following() + return + tl_type = dlg.get_action() + if tl_type == "tweets": + if usr.statuses_count == 0: + commonMessageDialogs.no_tweets() + return + if usr.id_str in buff.session.settings["other_buffers"]["timelines"]: + commonMessageDialogs.timeline_exist() + return + tl = twitterBuffers.baseBufferController(self.view.nb, "user_timeline", "%s-timeline" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="tweet_timeline.ogg", user_id=usr.id_str, tweet_mode="extended") + try: + tl.start_stream(play_sound=False) + except ValueError: + commonMessageDialogs.unauthorized() + return + pos=self.view.search("timelines", buff.session.db["user_name"]) + self.insert_buffer(tl, pos+1) + self.view.insert_buffer(tl.buffer, name=_(u"Timeline for {}").format(dlg.get_user()), pos=pos) + buff.session.settings["other_buffers"]["timelines"].append(usr.id_str) + pub.sendMessage("buffer-title-changed", buffer=tl) + buff.session.sound.play("create_timeline.ogg") + elif tl_type == "favourites": + if usr.favourites_count == 0: + commonMessageDialogs.no_favs() + return + if usr.id_str in buff.session.settings["other_buffers"]["favourites_timelines"]: + commonMessageDialogs.timeline_exist() + return + tl = twitterBuffers.baseBufferController(self.view.nb, "favorites", "%s-favorite" % (usr.id_str,), buff.session, buff.session.db["user_name"], bufferType=None, sound="favourites_timeline_updated.ogg", user_id=usr.id_str, tweet_mode="extended") + try: + tl.start_stream(play_sound=False) + except ValueError: + commonMessageDialogs.unauthorized() + return + pos=self.view.search("favs_timelines", buff.session.db["user_name"]) + self.insert_buffer(tl, pos+1) + self.view.insert_buffer(buffer=tl.buffer, name=_(u"Likes for {}").format(dlg.get_user()), pos=pos) + buff.session.settings["other_buffers"]["favourites_timelines"].append(usr.id_str) + pub.sendMessage("buffer-title-changed", buffer=buff) + buff.session.sound.play("create_timeline.ogg") + elif tl_type == "followers": + if usr.followers_count == 0: + commonMessageDialogs.no_followers() + return + if usr.id_str in buff.session.settings["other_buffers"]["followers_timelines"]: + commonMessageDialogs.timeline_exist() + return + tl = twitterBuffers.peopleBufferController(self.view.nb, "followers", "%s-followers" % (usr.id_str,), buff.session, buff.session.db["user_name"], sound="new_event.ogg", user_id=usr.id_str) + try: + tl.start_stream(play_sound=False) + except ValueError: + commonMessageDialogs.unauthorized() + return + pos=self.view.search("followers_timelines", buff.session.db["user_name"]) + self.insert_buffer(tl, pos+1) + self.view.insert_buffer(buffer=tl.buffer, name=_(u"Followers for {}").format(dlg.get_user()), pos=pos) + buff.session.settings["other_buffers"]["followers_timelines"].append(usr.id_str) + buff.session.sound.play("create_timeline.ogg") + pub.sendMessage("buffer-title-changed", buffer=i) + elif tl_type == "friends": + if usr.friends_count == 0: + commonMessageDialogs.no_friends() + return + if usr.id_str in buff.session.settings["other_buffers"]["friends_timelines"]: + commonMessageDialogs.timeline_exist() + return + tl = twitterBuffers.peopleBufferController(self.view.nb, "friends", "%s-friends" % (usr.id_str,), buff.session, buff.session.db["user_name"], sound="new_event.ogg", user_id=usr.id_str) + try: + tl.start_stream(play_sound=False) + except ValueError: + commonMessageDialogs.unauthorized() + return + pos=self.view.search("friends_timelines", buff.session.db["user_name"]) + self.insert_buffer(tl, pos+1) + self.view.insert_buffer(buffer=tl.buffer, name=_(u"Friends for {}").format(dlg.get_user()), pos=pos) + buff.session.settings["other_buffers"]["friends_timelines"].append(usr.id_str) + buff.session.sound.play("create_timeline.ogg") + pub.sendMessage("buffer-title-changed", buffer=i) + else: + commonMessageDialogs.user_not_exist() + buff.session.settings.write() + + def open_conversation(self, *args, **kwargs): + buffer = self.get_current_buffer() + id = buffer.get_right_tweet().id_str + user = buffer.get_right_tweet().user.screen_name + search = twitterBuffers.conversationBufferController(self.view.nb, "search", "%s-searchterm" % (id,), buffer.session, buffer.session.db["user_name"], bufferType="searchPanel", sound="search_updated.ogg", since_id=id, q="@{0}".format(user,)) + search.tweet = buffer.get_right_tweet() + search.start_stream(start=True) + pos=self.view.search("searches", buffer.session.db["user_name"]) + self.insert_buffer(search, pos) + self.view.insert_buffer(search.buffer, name=_(u"Conversation with {0}").format(user), pos=pos) + + def show_hide(self, *args, **kwargs): + km = self.create_invisible_keyboard_shorcuts() + if self.showing == True: + if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == False: + self.register_invisible_keyboard_shorcuts(km) + self.view.Hide() + self.fix_wrong_buffer() + self.showing = False + else: + if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == False: + self.unregister_invisible_keyboard_shorcuts(km) + self.view.Show() + self.showing = True + + def get_trending_topics(self, *args, **kwargs): + buff = self.get_best_buffer() + trends = trendingTopics.trendingTopicsController(buff.session) + if trends.dialog.get_response() == widgetUtils.OK: + woeid = trends.get_woeid() + if woeid in buff.session.settings["other_buffers"]["trending_topic_buffers"]: return + buffer = twitterBuffers.trendsBufferController(self.view.nb, "%s_tt" % (woeid,), buff.session, buff.account, woeid, sound="trends_updated.ogg") + buffer.searchfunction = self.search + pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"]) + self.view.insert_buffer(buffer.buffer, name=_(u"Trending topics for %s") % (trends.get_string()), pos=pos) + self.buffers.append(buffer) + buffer.start_stream() + buffer.session.settings["other_buffers"]["trending_topic_buffers"].append(woeid) + buffer.session.settings.write() + + def reverse_geocode(self, event=None): + try: + tweet = self.get_current_buffer().get_tweet() + if tweet.coordinates != None: + x = tweet.coordinates["coordinates"][0] + y = tweet.coordinates["coordinates"][1] + address = geocoder.reverse_geocode(y, x, language = languageHandler.curLang) + if event == None: output.speak(address[0].__str__()) + else: self.view.show_address(address[0].__str__()) + else: + output.speak(_(u"There are no coordinates in this tweet")) + except GeocoderError: + output.speak(_(u"There are no results for the coordinates in this tweet")) + except ValueError: + output.speak(_(u"Error decoding coordinates. Try again later.")) + except KeyError: + pass + except AttributeError: + pass + + def view_reverse_geocode(self, event=None): + try: + tweet = self.get_current_buffer().get_right_tweet() + if tweet.coordinates != None: + x = tweet.coordinates["coordinates"][0] + y = tweet.coordinates["coordinates"][1] + address = geocoder.reverse_geocode(y, x, language = languageHandler.curLang) + dlg = commonMessageDialogs.view_geodata(address[0].__str__()) + else: + output.speak(_(u"There are no coordinates in this tweet")) + except GeocoderError: + output.speak(_(u"There are no results for the coordinates in this tweet")) + except ValueError: + output.speak(_(u"Error decoding coordinates. Try again later.")) + except KeyError: + pass + except AttributeError: + pass + + def get_more_items(self, *args, **kwargs): + self.get_current_buffer().get_more_items() + + def clear_buffer(self, *args, **kwargs): + self.get_current_buffer().clear_list() + + def remove_buffer(self, *args, **kwargs): + buffer = self.get_current_buffer() + if not hasattr(buffer, "account"): return + buff = self.view.search(buffer.name, buffer.account) + answer = buffer.remove_buffer() + if answer == False: return + log.debug("destroying buffer...") + if hasattr(buffer, "timer"): + log.debug("Stopping timer...") + buffer.timer.cancel() + log.debug("Timer cancelled.") + self.right() + self.view.delete_buffer(buff) + buffer.session.sound.play("delete_timeline.ogg") + self.buffers.remove(buffer) + del buffer + + def skip_buffer(self, forward=True): + buff = self.get_current_buffer() + if buff.invisible == False: + self.view.advance_selection(forward) + + def buffer_changed(self, *args, **kwargs): + buffer = self.get_current_buffer() + if buffer.account != self.current_account: + self.current_account = buffer.account + if not hasattr(buffer, "session") or buffer.session == None: return + muted = autoread = False + if buffer.name in buffer.session.settings["other_buffers"]["muted_buffers"]: + muted = True + elif buffer.name in buffer.session.settings["other_buffers"]["autoread_buffers"]: + autoread = True + self.view.check_menuitem("mute_buffer", muted) + self.view.check_menuitem("autoread", autoread) + + def fix_wrong_buffer(self): + buf = self.get_best_buffer() + if buf == None: + for i in self.accounts: + buffer = self.view.search("home_timeline", i) + if buffer != None: break + else: + buffer = self.view.search("home_timeline", buf.session.db["user_name"]) + if buffer!=None: + self.view.change_buffer(buffer) + + def up(self, *args, **kwargs): + page = self.get_current_buffer() + if not hasattr(page.buffer, "list"): + output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) + return + position = page.buffer.list.get_selected() + index = position-1 + try: + page.buffer.list.select_item(index) + except: + pass + if position == page.buffer.list.get_selected(): + page.session.sound.play("limit.ogg") + + try: + output.speak(page.get_message(), True) + except: + pass + + def down(self, *args, **kwargs): + page = self.get_current_buffer() + if not hasattr(page.buffer, "list"): + output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) + return + position = page.buffer.list.get_selected() + index = position+1 + try: + page.buffer.list.select_item(index) + except: + pass + if position == page.buffer.list.get_selected(): + page.session.sound.play("limit.ogg") + try: + output.speak(page.get_message(), True) + except: + pass + + def left(self, *args, **kwargs): + buff = self.view.get_current_buffer_pos() + buffer = self.get_current_buffer() + if not hasattr(buffer.buffer, "list"): + output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) + return + if buff == self.get_first_buffer_index(buffer.account) or buff == 0: + self.view.change_buffer(self.get_last_buffer_index(buffer.account)) + else: + self.view.change_buffer(buff-1) + while self.get_current_buffer().invisible == False: self.skip_buffer(False) + buffer = self.get_current_buffer() + if self.showing == True: buffer.buffer.set_focus_in_list() + try: + msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) + except: + msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) + output.speak(msg, True) + + def right(self, *args, **kwargs): + buff = self.view.get_current_buffer_pos() + buffer = self.get_current_buffer() + if not hasattr(buffer.buffer, "list"): + output.speak(_(u"No session is currently in focus. Focus a session with the next or previous session shortcut."), True) + return + if buff == self.get_last_buffer_index(buffer.account) or buff+1 == self.view.get_buffer_count(): + self.view.change_buffer(self.get_first_buffer_index(buffer.account)) + else: + self.view.change_buffer(buff+1) + while self.get_current_buffer().invisible == False: self.skip_buffer(True) + buffer = self.get_current_buffer() + if self.showing == True: buffer.buffer.set_focus_in_list() + try: + msg = _(u"%s, %s of %s") % (self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) + except: + msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) + output.speak(msg, True) + + def next_account(self, *args, **kwargs): + index = self.accounts.index(self.current_account) + if index+1 == len(self.accounts): + index = 0 + else: + index = index+1 + account = self.accounts[index] + self.current_account = account + buffer_object = self.get_first_buffer(account) + if buffer_object == None: + output.speak(_(u"{0}: This account is not logged into Twitter.").format(account), True) + return + buff = self.view.search(buffer_object.name, account) + if buff == None: + output.speak(_(u"{0}: This account is not logged into Twitter.").format(account), True) + return + self.view.change_buffer(buff) + buffer = self.get_current_buffer() + if self.showing == True: buffer.buffer.set_focus_in_list() + try: + msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) + except: + msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) + output.speak(msg, True) + + def previous_account(self, *args, **kwargs): + index = self.accounts.index(self.current_account) + if index-1 < 0: + index = len(self.accounts)-1 + else: + index = index-1 + account = self.accounts[index] + self.current_account = account + buffer_object = self.get_first_buffer(account) + if buffer_object == None: + output.speak(_(u"{0}: This account is not logged into Twitter.").format(account), True) + return + buff = self.view.search(buffer_object.name, account) + if buff == None: + output.speak(_(u"{0}: This account is not logged into twitter.").format(account), True) + return + self.view.change_buffer(buff) + buffer = self.get_current_buffer() + if self.showing == True: buffer.buffer.set_focus_in_list() + try: + msg = _(u"%s. %s, %s of %s") % (buffer.account, self.view.get_buffer_text(), buffer.buffer.list.get_selected()+1, buffer.buffer.list.get_count()) + except: + msg = _(u"%s. Empty") % (self.view.get_buffer_text(),) + output.speak(msg, True) + + def go_home(self): + buffer = self.get_current_buffer() + buffer.buffer.list.select_item(0) + try: + output.speak(buffer.get_message(), True) + except: + pass + + def go_end(self): + buffer = self.get_current_buffer() + buffer.buffer.list.select_item(buffer.buffer.list.get_count()-1) + try: + output.speak(buffer.get_message(), True) + except: + pass + + def go_page_up(self): + buffer = self.get_current_buffer() + if buffer.buffer.list.get_selected() <= 20: + index = 0 + else: + index = buffer.buffer.list.get_selected() - 20 + buffer.buffer.list.select_item(index) + try: + output.speak(buffer.get_message(), True) + except: + pass + + def go_page_down(self): + buffer = self.get_current_buffer() + if buffer.buffer.list.get_selected() >= buffer.buffer.list.get_count() - 20: + index = buffer.buffer.list.get_count()-1 + else: + index = buffer.buffer.list.get_selected() + 20 + buffer.buffer.list.select_item(index) + try: + output.speak(buffer.get_message(), True) + except: + pass + + def url(self, *args, **kwargs): + buffer = self.get_current_buffer() + buffer.url() + + def audio(self, *args, **kwargs): + self.get_current_buffer().audio() + + def volume_down(self, *args, **kwargs): + self.get_current_buffer().volume_down() + + def volume_up(self, *args, **kwargs): + self.get_current_buffer().volume_up() + + def create_invisible_keyboard_shorcuts(self): + keymap = {} + for i in config.keymap["keymap"]: + if hasattr(self, i): + keymap[config.keymap["keymap"][i]] = getattr(self, i) + return keymap + + def register_invisible_keyboard_shorcuts(self, keymap): + if config.changed_keymap: + commonMessageDialogs.changed_keymap() + self.keyboard_handler = WXKeyboardHandler(self.view) + self.keyboard_handler.register_keys(keymap) + + def unregister_invisible_keyboard_shorcuts(self, keymap): + try: + self.keyboard_handler.unregister_keys(keymap) + del self.keyboard_handler + except AttributeError: + pass + + def notify(self, session, play_sound=None, message=None, notification=False): + if session.settings["sound"]["session_mute"] == True: return + if play_sound != None: + session.sound.play(play_sound) + if message != None: + output.speak(message, speech=session.settings["reporting"]["speech_reporting"], braille=session.settings["reporting"]["braille_reporting"]) + + def manage_sent_dm(self, data, user): + buffer = self.search_buffer("sent_direct_messages", user) + if buffer == None: return + play_sound = "dm_sent.ogg" + if "sent_direct_messages" not in buffer.session.settings["other_buffers"]["muted_buffers"]: + self.notify(buffer.session, play_sound=play_sound) + buffer.add_new_item(data) + + def manage_sent_tweets(self, data, user): + buffer = self.search_buffer("sent_tweets", user) + if buffer == None: return # if "sent_tweets" not in buffer.session.settings["other_buffers"]["muted_buffers"]: # self.notify(buffer.session, play_sound=play_sound) - data = buffer.session.check_quoted_status(data) - data = buffer.session.check_long_tweet(data) - if data == False: # Long tweet deleted from twishort. - return - if buffer.session.settings["general"]["reverse_timelines"] == False: - buffer.session.db[buffer.name].append(data) - else: - buffer.session.db[buffer.name].insert(0, data) - buffer.add_new_item(data) + data = buffer.session.check_quoted_status(data) + data = buffer.session.check_long_tweet(data) + if data == False: # Long tweet deleted from twishort. + return + if buffer.session.settings["general"]["reverse_timelines"] == False: + buffer.session.db[buffer.name].append(data) + else: + buffer.session.db[buffer.name].insert(0, data) + buffer.add_new_item(data) - def manage_friend(self, data, user): - buffer = self.search_buffer("friends", user) - if buffer == None: return - buffer.add_new_item(data) + def manage_friend(self, data, user): + buffer = self.search_buffer("friends", user) + if buffer == None: return + buffer.add_new_item(data) - def manage_unfollowing(self, item, user): - buffer = self.search_buffer("friends", user) - if buffer == None: return - buffer.remove_item(item) + def manage_unfollowing(self, item, user): + buffer = self.search_buffer("friends", user) + if buffer == None: return + buffer.remove_item(item) - def manage_favourite(self, data, user): - buffer = self.search_buffer("favourites", user) - if buffer == None: return - play_sound = "favourite.ogg" - if "favourites" not in buffer.session.settings["other_buffers"]["muted_buffers"]: - self.notify(buffer.session, play_sound=play_sound) - buffer.add_new_item(data) + def manage_favourite(self, data, user): + buffer = self.search_buffer("favourites", user) + if buffer == None: return + play_sound = "favourite.ogg" + if "favourites" not in buffer.session.settings["other_buffers"]["muted_buffers"]: + self.notify(buffer.session, play_sound=play_sound) + buffer.add_new_item(data) - def manage_unfavourite(self, item, user): - buffer = self.search_buffer("favourites", user) - if buffer == None: return - buffer.remove_item(item) + def manage_unfavourite(self, item, user): + buffer = self.search_buffer("favourites", user) + if buffer == None: return + buffer.remove_item(item) - def manage_blocked_user(self, data, user): - buffer = self.search_buffer("blocked", user) - if buffer == None: return - buffer.add_new_item(data) + def manage_blocked_user(self, data, user): + buffer = self.search_buffer("blocked", user) + if buffer == None: return + buffer.add_new_item(data) - def manage_unblocked_user(self, item, user): - buffer = self.search_buffer("blocked", user) - if buffer == None: return - buffer.remove_item(item) + def manage_unblocked_user(self, item, user): + buffer = self.search_buffer("blocked", user) + if buffer == None: return + buffer.remove_item(item) - def start_buffers(self, session): - log.debug("starting buffers... Session %s" % (session.session_id,)) - for i in self.buffers: - if i.session == session and i.needs_init == True: - if hasattr(i, "finished_timeline") and i.finished_timeline == False: - change_title = True - else: - change_title = False - try: - if "mentions" in i.name or "direct_messages" in i.name: - i.start_stream() - else: - i.start_stream(play_sound=False) - except TweepError as err: - log.exception("Error %s starting buffer %s on account %s, with args %r and kwargs %r due to the following reason: %s" % (err.api_code, i.name, i.account, i.args, i.kwargs, err.reason)) - # Determine if this error was caused by a block applied to the current user (IE permission errors). - errors_allowed = [130] - if (err.api_code != None and err.api_code not in errors_allowed) or (err.api_code == None and 'Not authorized' in err.reason): # A twitter error, so safely try to remove the buffer. - buff = self.view.search(i.name, i.account) - i.remove_buffer(force=True) - commonMessageDialogs.blocked_timeline() - if self.get_current_buffer() == i: - self.right() - self.view.delete_buffer(buff) - self.buffers.remove(i) - del i - continue - if change_title: - pub.sendMessage("buffer-title-changed", buffer=i) + def start_buffers(self, session): + log.debug("starting buffers... Session %s" % (session.session_id,)) + for i in self.buffers: + if i.session == session and i.needs_init == True: + if hasattr(i, "finished_timeline") and i.finished_timeline == False: + change_title = True + else: + change_title = False + try: + if "mentions" in i.name or "direct_messages" in i.name: + i.start_stream() + else: + i.start_stream(play_sound=False) + except TweepError as err: + log.exception("Error %s starting buffer %s on account %s, with args %r and kwargs %r due to the following reason: %s" % (err.api_code, i.name, i.account, i.args, i.kwargs, err.reason)) + # Determine if this error was caused by a block applied to the current user (IE permission errors). + errors_allowed = [130] + if (err.api_code != None and err.api_code not in errors_allowed) or (err.api_code == None and 'Not authorized' in err.reason): # A twitter error, so safely try to remove the buffer. + buff = self.view.search(i.name, i.account) + i.remove_buffer(force=True) + commonMessageDialogs.blocked_timeline() + if self.get_current_buffer() == i: + self.right() + self.view.delete_buffer(buff) + self.buffers.remove(i) + del i + continue + if change_title: + pub.sendMessage("buffer-title-changed", buffer=i) - def set_positions(self): - for i in sessions.sessions: - self.set_buffer_positions(i) + def set_positions(self): + for i in sessions.sessions: + self.set_buffer_positions(i) - def check_connection(self): - if self.started == False: - return - for i in sessions.sessions: - try: - if sessions.sessions[i].is_logged == False: continue - sessions.sessions[i].check_connection() - except TweepError: # We shouldn't allow this function to die. - pass + def check_connection(self): + if self.started == False: + return + for i in sessions.sessions: + try: + if sessions.sessions[i].is_logged == False: continue + sessions.sessions[i].check_connection() + except TweepError: # We shouldn't allow this function to die. + pass - def create_new_buffer(self, buffer, account, create): - buff = self.search_buffer("home_timeline", account) - if create == True: - if buffer == "favourites": - favourites = twitterBuffers.baseBufferController(self.view.nb, "favorites", "favourites", buff.session, buff.session.db["user_name"], tweet_mode="extended") - self.buffers.append(favourites) - self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) - favourites.start_stream(play_sound=False) - if buffer == "followers": - followers = twitterBuffers.peopleBufferController(self.view.nb, "followers", "followers", buff.session, buff.session.db["user_name"], screen_name=buff.session.db["user_name"]) - self.buffers.append(followers) - self.view.insert_buffer(followers.buffer, name=_(u"Followers"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) - followers.start_stream(play_sound=False) - elif buffer == "friends": - friends = twitterBuffers.peopleBufferController(self.view.nb, "friends", "friends", buff.session, buff.session.db["user_name"], screen_name=buff.session.db["user_name"]) - self.buffers.append(friends) - self.view.insert_buffer(friends.buffer, name=_(u"Friends"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) - friends.start_stream(play_sound=False) - elif buffer == "blocked": - blocks = twitterBuffers.peopleBufferController(self.view.nb, "blocks", "blocked", buff.session, buff.session.db["user_name"]) - self.buffers.append(blocks) - self.view.insert_buffer(blocks.buffer, name=_(u"Blocked users"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) - blocks.start_stream(play_sound=False) - elif buffer == "muted": - muted = twitterBuffers.peopleBufferController(self.view.nb, "mutes", "muted", buff.session, buff.session.db["user_name"]) - self.buffers.append(muted) - self.view.insert_buffer(muted.buffer, name=_(u"Muted users"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) - muted.start_stream(play_sound=False) - elif buffer == "events": - events = twitterBuffers.eventsBufferController(self.view.nb, "events", buff.session, buff.session.db["user_name"], bufferType="dmPanel", screen_name=buff.session.db["user_name"]) - self.buffers.append(events) - self.view.insert_buffer(events.buffer, name=_(u"Events"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) - elif create == False: - self.destroy_buffer(buffer, buff.session.db["user_name"]) - elif buffer == "list": - if create in buff.session.settings["other_buffers"]["lists"]: - output.speak(_(u"This list is already opened"), True) - return - tl = twitterBuffers.listBufferController(self.view.nb, "list_timeline", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]), tweet_mode="extended") - buff.session.lists.append(tl) - pos=self.view.search("lists", buff.session.db["user_name"]) - self.insert_buffer(tl, pos) - self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"])) - tl.start_stream(play_sound=False) - buff.session.settings["other_buffers"]["lists"].append(create) - buff.session.settings.write() + def create_new_buffer(self, buffer, account, create): + buff = self.search_buffer("home_timeline", account) + if create == True: + if buffer == "favourites": + favourites = twitterBuffers.baseBufferController(self.view.nb, "favorites", "favourites", buff.session, buff.session.db["user_name"], tweet_mode="extended") + self.buffers.append(favourites) + self.view.insert_buffer(favourites.buffer, name=_(u"Likes"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + favourites.start_stream(play_sound=False) + if buffer == "followers": + followers = twitterBuffers.peopleBufferController(self.view.nb, "followers", "followers", buff.session, buff.session.db["user_name"], screen_name=buff.session.db["user_name"]) + self.buffers.append(followers) + self.view.insert_buffer(followers.buffer, name=_(u"Followers"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + followers.start_stream(play_sound=False) + elif buffer == "friends": + friends = twitterBuffers.peopleBufferController(self.view.nb, "friends", "friends", buff.session, buff.session.db["user_name"], screen_name=buff.session.db["user_name"]) + self.buffers.append(friends) + self.view.insert_buffer(friends.buffer, name=_(u"Friends"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + friends.start_stream(play_sound=False) + elif buffer == "blocked": + blocks = twitterBuffers.peopleBufferController(self.view.nb, "blocks", "blocked", buff.session, buff.session.db["user_name"]) + self.buffers.append(blocks) + self.view.insert_buffer(blocks.buffer, name=_(u"Blocked users"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + blocks.start_stream(play_sound=False) + elif buffer == "muted": + muted = twitterBuffers.peopleBufferController(self.view.nb, "mutes", "muted", buff.session, buff.session.db["user_name"]) + self.buffers.append(muted) + self.view.insert_buffer(muted.buffer, name=_(u"Muted users"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + muted.start_stream(play_sound=False) + elif buffer == "events": + events = twitterBuffers.eventsBufferController(self.view.nb, "events", buff.session, buff.session.db["user_name"], bufferType="dmPanel", screen_name=buff.session.db["user_name"]) + self.buffers.append(events) + self.view.insert_buffer(events.buffer, name=_(u"Events"), pos=self.view.search(buff.session.db["user_name"], buff.session.db["user_name"])) + elif create == False: + self.destroy_buffer(buffer, buff.session.db["user_name"]) + elif buffer == "list": + if create in buff.session.settings["other_buffers"]["lists"]: + output.speak(_(u"This list is already opened"), True) + return + tl = twitterBuffers.listBufferController(self.view.nb, "list_timeline", create+"-list", buff.session, buff.session.db["user_name"], bufferType=None, list_id=utils.find_list(create, buff.session.db["lists"]), tweet_mode="extended") + buff.session.lists.append(tl) + pos=self.view.search("lists", buff.session.db["user_name"]) + self.insert_buffer(tl, pos) + self.view.insert_buffer(tl.buffer, name=_(u"List for {}").format(create), pos=self.view.search("lists", buff.session.db["user_name"])) + tl.start_stream(play_sound=False) + buff.session.settings["other_buffers"]["lists"].append(create) + buff.session.settings.write() - def invisible_shorcuts_changed(self, registered): - if registered == True: - km = self.create_invisible_keyboard_shorcuts() - self.register_invisible_keyboard_shorcuts(km) - elif registered == False: - km = self.create_invisible_keyboard_shorcuts() - self.unregister_invisible_keyboard_shorcuts(km) + def invisible_shorcuts_changed(self, registered): + if registered == True: + km = self.create_invisible_keyboard_shorcuts() + self.register_invisible_keyboard_shorcuts(km) + elif registered == False: + km = self.create_invisible_keyboard_shorcuts() + self.unregister_invisible_keyboard_shorcuts(km) - def about(self, *args, **kwargs): - self.view.about_dialog() + def about(self, *args, **kwargs): + self.view.about_dialog() - def get_soundpacks(self, *args, **kwargs): - # This should redirect users of other languages to the right version of the TWBlue website. - lang = languageHandler.curLang[:2] - url = application.url - final_url = "{0}/{1}/soundpacks".format(url, lang) - try: - response = requests.get(final_url) - except: - output.speak(_(u"An error happened while trying to connect to the server. Please try later.")) - return - # There is no twblue.es/en, so if English is the language used this should be False anyway. - if response.status_code == 200 and lang != "en": - webbrowser.open_new_tab(final_url) - else: - webbrowser.open_new_tab(application.url+"/soundpacks") + def get_soundpacks(self, *args, **kwargs): + # This should redirect users of other languages to the right version of the TWBlue website. + lang = languageHandler.curLang[:2] + url = application.url + final_url = "{0}/{1}/soundpacks".format(url, lang) + try: + response = requests.get(final_url) + except: + output.speak(_(u"An error happened while trying to connect to the server. Please try later.")) + return + # There is no twblue.es/en, so if English is the language used this should be False anyway. + if response.status_code == 200 and lang != "en": + webbrowser.open_new_tab(final_url) + else: + webbrowser.open_new_tab(application.url+"/soundpacks") - def visit_website(self, *args, **kwargs): - # This should redirect users of other languages to the right version of the TWBlue website. - lang = languageHandler.curLang[:2] - url = application.url - final_url = "{0}/{1}".format(url, lang) - try: - response = requests.get(final_url) - except: - output.speak(_(u"An error happened while trying to connect to the server. Please try later.")) - return - # There is no twblue.es/en, so if English is the language used this should be False anyway. - if response.status_code == 200 and lang != "en": - webbrowser.open_new_tab(final_url) - else: - webbrowser.open_new_tab(application.url) + def visit_website(self, *args, **kwargs): + # This should redirect users of other languages to the right version of the TWBlue website. + lang = languageHandler.curLang[:2] + url = application.url + final_url = "{0}/{1}".format(url, lang) + try: + response = requests.get(final_url) + except: + output.speak(_(u"An error happened while trying to connect to the server. Please try later.")) + return + # There is no twblue.es/en, so if English is the language used this should be False anyway. + if response.status_code == 200 and lang != "en": + webbrowser.open_new_tab(final_url) + else: + webbrowser.open_new_tab(application.url) - def manage_accounts(self, *args, **kwargs): - sm = sessionManager.sessionManagerController(started=True) - sm.fill_list() - sm.show() - for i in sm.new_sessions: - self.create_buffers(sessions.sessions[i]) - call_threaded(self.start_buffers, sessions.sessions[i]) - for i in sm.removed_sessions: - if sessions.sessions[i].logged == True: - self.logout_account(sessions.sessions[i].session_id) - self.destroy_buffer(sessions.sessions[i].settings["twitter"]["user_name"], sessions.sessions[i].settings["twitter"]["user_name"]) - self.accounts.remove(sessions.sessions[i].settings["twitter"]["user_name"]) - sessions.sessions.pop(i) + def manage_accounts(self, *args, **kwargs): + sm = sessionManager.sessionManagerController(started=True) + sm.fill_list() + sm.show() + for i in sm.new_sessions: + self.create_buffers(sessions.sessions[i]) + call_threaded(self.start_buffers, sessions.sessions[i]) + for i in sm.removed_sessions: + if sessions.sessions[i].logged == True: + self.logout_account(sessions.sessions[i].session_id) + self.destroy_buffer(sessions.sessions[i].settings["twitter"]["user_name"], sessions.sessions[i].settings["twitter"]["user_name"]) + self.accounts.remove(sessions.sessions[i].settings["twitter"]["user_name"]) + sessions.sessions.pop(i) - def update_profile(self, *args, **kwargs): - r = user.profileController(self.get_best_buffer().session) + def update_profile(self, *args, **kwargs): + r = user.profileController(self.get_best_buffer().session) - def user_details(self, *args, **kwargs): - buffer = self.get_current_buffer() - if not hasattr(buffer, "session") or buffer.session == None: return - if hasattr(buffer, "user_details"): - buffer.user_details() + def user_details(self, *args, **kwargs): + buffer = self.get_current_buffer() + if not hasattr(buffer, "session") or buffer.session == None: return + if hasattr(buffer, "user_details"): + buffer.user_details() - def toggle_autoread(self, *args, **kwargs): - buffer = self.get_current_buffer() - if hasattr(buffer, "session") and buffer.session == None: return - if buffer.name not in buffer.session.settings["other_buffers"]["autoread_buffers"]: - buffer.session.settings["other_buffers"]["autoread_buffers"].append(buffer.name) - output.speak(_(u"The auto-reading of new tweets is enabled for this buffer"), True) - elif buffer.name in buffer.session.settings["other_buffers"]["autoread_buffers"]: - buffer.session.settings["other_buffers"]["autoread_buffers"].remove(buffer.name) - output.speak(_(u"The auto-reading of new tweets is disabled for this buffer"), True) - buffer.session.settings.write() + def toggle_autoread(self, *args, **kwargs): + buffer = self.get_current_buffer() + if hasattr(buffer, "session") and buffer.session == None: return + if buffer.name not in buffer.session.settings["other_buffers"]["autoread_buffers"]: + buffer.session.settings["other_buffers"]["autoread_buffers"].append(buffer.name) + output.speak(_(u"The auto-reading of new tweets is enabled for this buffer"), True) + elif buffer.name in buffer.session.settings["other_buffers"]["autoread_buffers"]: + buffer.session.settings["other_buffers"]["autoread_buffers"].remove(buffer.name) + output.speak(_(u"The auto-reading of new tweets is disabled for this buffer"), True) + buffer.session.settings.write() - def toggle_session_mute(self, *args, **kwargs): - buffer = self.get_best_buffer() - if buffer.session.settings["sound"]["session_mute"] == False: - buffer.session.settings["sound"]["session_mute"] = True - output.speak(_(u"Session mute on"), True) - elif buffer.session.settings["sound"]["session_mute"] == True: - buffer.session.settings["sound"]["session_mute"] = False - output.speak(_(u"Session mute off"), True) - buffer.session.settings.write() + def toggle_session_mute(self, *args, **kwargs): + buffer = self.get_best_buffer() + if buffer.session.settings["sound"]["session_mute"] == False: + buffer.session.settings["sound"]["session_mute"] = True + output.speak(_(u"Session mute on"), True) + elif buffer.session.settings["sound"]["session_mute"] == True: + buffer.session.settings["sound"]["session_mute"] = False + output.speak(_(u"Session mute off"), True) + buffer.session.settings.write() - def toggle_buffer_mute(self, *args, **kwargs): - buffer = self.get_current_buffer() - if hasattr(buffer, "session") and buffer.session == None: return - if buffer.name not in buffer.session.settings["other_buffers"]["muted_buffers"]: - buffer.session.settings["other_buffers"]["muted_buffers"].append(buffer.name) - output.speak(_(u"Buffer mute on"), True) - elif buffer.name in buffer.session.settings["other_buffers"]["muted_buffers"]: - buffer.session.settings["other_buffers"]["muted_buffers"].remove(buffer.name) - output.speak(_(u"Buffer mute off"), True) - buffer.session.settings.write() + def toggle_buffer_mute(self, *args, **kwargs): + buffer = self.get_current_buffer() + if hasattr(buffer, "session") and buffer.session == None: return + if buffer.name not in buffer.session.settings["other_buffers"]["muted_buffers"]: + buffer.session.settings["other_buffers"]["muted_buffers"].append(buffer.name) + output.speak(_(u"Buffer mute on"), True) + elif buffer.name in buffer.session.settings["other_buffers"]["muted_buffers"]: + buffer.session.settings["other_buffers"]["muted_buffers"].remove(buffer.name) + output.speak(_(u"Buffer mute off"), True) + buffer.session.settings.write() - def view_documentation(self, *args, **kwargs): - lang = localization.get("documentation") - os.chdir("documentation/%s" % (lang,)) - webbrowser.open("manual.html") - os.chdir("../../") + def view_documentation(self, *args, **kwargs): + lang = localization.get("documentation") + os.chdir("documentation/%s" % (lang,)) + webbrowser.open("manual.html") + os.chdir("../../") - def view_changelog(self, *args, **kwargs): - if application.snapshot == True: - webbrowser.open("https://github.com/manuelcortez/twblue/blob/next-gen/doc/changelog.md") - else: - lang = localization.get("documentation") - os.chdir("documentation/%s" % (lang,)) - webbrowser.open("changelog.html") - os.chdir("../../") + def view_changelog(self, *args, **kwargs): + if application.snapshot == True: + webbrowser.open("https://github.com/manuelcortez/twblue/blob/next-gen/doc/changelog.md") + else: + lang = localization.get("documentation") + os.chdir("documentation/%s" % (lang,)) + webbrowser.open("changelog.html") + os.chdir("../../") - def insert_buffer(self, buffer, position): - self.buffers.insert(position, buffer) + def insert_buffer(self, buffer, position): + self.buffers.insert(position, buffer) - def copy_to_clipboard(self, *args, **kwargs): - output.copy(self.get_current_buffer().get_message()) - output.speak(_(u"Copied")) + def copy_to_clipboard(self, *args, **kwargs): + output.copy(self.get_current_buffer().get_message()) + output.speak(_(u"Copied")) - def repeat_item(self, *args, **kwargs): - output.speak(self.get_current_buffer().get_message()) + def repeat_item(self, *args, **kwargs): + output.speak(self.get_current_buffer().get_message()) - def execute_action(self, action): - if hasattr(self, action): - getattr(self, action)() + def execute_action(self, action): + if hasattr(self, action): + getattr(self, action)() - def update_buffers(self): - for i in self.buffers[:]: - if i.session != None and i.session.is_logged == True: - try: - i.start_stream(mandatory=True) - except TweepError as err: - log.exception("Error %s starting buffer %s on account %s, with args %r and kwargs %r due to the following reason: %s" % (err.api_code, i.name, i.account, i.args, i.kwargs, err.reason)) - # Determine if this error was caused by a block applied to the current user (IE permission errors). - errors_allowed = [130] - if (err.api_code != None and err.api_code not in errors_allowed) or (err.api_code == None and 'Not authorized' in err.reason): # A twitter error, so safely try to remove the buffer. - buff = self.view.search(i.name, i.account) - i.remove_buffer(force=True) - commonMessageDialogs.blocked_timeline() - if self.get_current_buffer() == i: - self.right() - self.view.delete_buffer(buff) - self.buffers.remove(i) - del i + def update_buffers(self): + for i in self.buffers[:]: + if i.session != None and i.session.is_logged == True: + try: + i.start_stream(mandatory=True) + except TweepError as err: + log.exception("Error %s starting buffer %s on account %s, with args %r and kwargs %r due to the following reason: %s" % (err.api_code, i.name, i.account, i.args, i.kwargs, err.reason)) + # Determine if this error was caused by a block applied to the current user (IE permission errors). + errors_allowed = [130] + if (err.api_code != None and err.api_code not in errors_allowed) or (err.api_code == None and 'Not authorized' in err.reason): # A twitter error, so safely try to remove the buffer. + buff = self.view.search(i.name, i.account) + i.remove_buffer(force=True) + commonMessageDialogs.blocked_timeline() + if self.get_current_buffer() == i: + self.right() + self.view.delete_buffer(buff) + self.buffers.remove(i) + del i - def update_buffer(self, *args, **kwargs): - bf = self.get_current_buffer() - if not hasattr(bf, "start_stream"): - output.speak(_(u"Unable to update this buffer.")) - return - else: - output.speak(_(u"Updating buffer...")) - n = bf.start_stream(mandatory=True, avoid_autoreading=True) - if n != None: - output.speak(_(u"{0} items retrieved").format(n,)) + def update_buffer(self, *args, **kwargs): + bf = self.get_current_buffer() + if not hasattr(bf, "start_stream"): + output.speak(_(u"Unable to update this buffer.")) + return + else: + output.speak(_(u"Updating buffer...")) + n = bf.start_stream(mandatory=True, avoid_autoreading=True) + if n != None: + output.speak(_(u"{0} items retrieved").format(n,)) - def buffer_title_changed(self, buffer): - if "-timeline" in buffer.name: - title = _(u"Timeline for {}").format(buffer.username,) - elif "-favorite" in buffer.name: - title = _(u"Likes for {}").format(buffer.username,) - elif "-followers" in buffer.name: - title = _(u"Followers for {}").format(buffer.username,) - elif "-friends" in buffer.name: - title = _(u"Friends for {}").format(buffer.username,) - buffer_index = self.view.search(buffer.name, buffer.account) - self.view.set_page_title(buffer_index, title) + def buffer_title_changed(self, buffer): + if "-timeline" in buffer.name: + title = _(u"Timeline for {}").format(buffer.username,) + elif "-favorite" in buffer.name: + title = _(u"Likes for {}").format(buffer.username,) + elif "-followers" in buffer.name: + title = _(u"Followers for {}").format(buffer.username,) + elif "-friends" in buffer.name: + title = _(u"Friends for {}").format(buffer.username,) + buffer_index = self.view.search(buffer.name, buffer.account) + self.view.set_page_title(buffer_index, title) - def ocr_image(self, *args, **kwargs): - buffer = self.get_current_buffer() - if hasattr(buffer, "get_right_tweet") == False: - output.speak(_(u"Invalid buffer")) - return - tweet = buffer.get_tweet() - media_list = [] - if hasattr(tweet, "entities") and tweet.entities.get("media") != None: - [media_list.append(i) for i in tweet.entities["media"] if i not in media_list] - elif hasattr(tweet, "retweeted_status") and tweet.retweeted_status.get("media") != None: - [media_list.append(i) for i in tweet.retweeted_status.entities["media"] if i not in media_list] - elif hasattr(tweet, "quoted_status") and tweet.quoted_status.entities.get("media") != None: - [media_list.append(i) for i in tweet.quoted_status.entities["media"] if i not in media_list] - if len(media_list) > 1: - image_list = [_(u"Picture {0}").format(i,) for i in range(0, len(media_list))] - dialog = dialogs.urlList.urlList(title=_(u"Select the picture")) - if dialog.get_response() == widgetUtils.OK: - img = media_list[dialog.get_item()] - else: - return - elif len(media_list) == 1: - img = media_list[0] - else: - output.speak(_(u"Invalid buffer")) - return - if buffer.session.settings["mysc"]["ocr_language"] != "": - ocr_lang = buffer.session.settings["mysc"]["ocr_language"] - else: - ocr_lang = ocr.OCRSpace.short_langs.index(tweet.lang) - ocr_lang = ocr.OCRSpace.OcrLangs[ocr_lang] - api = ocr.OCRSpace.OCRSpaceAPI() - try: - text = api.OCR_URL(img["media_url"], lang=ocr_lang) - except ocr.OCRSpace.APIError as er: - output.speak(_(u"Unable to extract text")) - return - msg = messages.viewTweet(text["ParsedText"], [], False) + def ocr_image(self, *args, **kwargs): + buffer = self.get_current_buffer() + if hasattr(buffer, "get_right_tweet") == False: + output.speak(_(u"Invalid buffer")) + return + tweet = buffer.get_tweet() + media_list = [] + if hasattr(tweet, "entities") and tweet.entities.get("media") != None: + [media_list.append(i) for i in tweet.entities["media"] if i not in media_list] + elif hasattr(tweet, "retweeted_status") and tweet.retweeted_status.get("media") != None: + [media_list.append(i) for i in tweet.retweeted_status.entities["media"] if i not in media_list] + elif hasattr(tweet, "quoted_status") and tweet.quoted_status.entities.get("media") != None: + [media_list.append(i) for i in tweet.quoted_status.entities["media"] if i not in media_list] + if len(media_list) > 1: + image_list = [_(u"Picture {0}").format(i,) for i in range(0, len(media_list))] + dialog = dialogs.urlList.urlList(title=_(u"Select the picture")) + if dialog.get_response() == widgetUtils.OK: + img = media_list[dialog.get_item()] + else: + return + elif len(media_list) == 1: + img = media_list[0] + else: + output.speak(_(u"Invalid buffer")) + return + if buffer.session.settings["mysc"]["ocr_language"] != "": + ocr_lang = buffer.session.settings["mysc"]["ocr_language"] + else: + ocr_lang = ocr.OCRSpace.short_langs.index(tweet.lang) + ocr_lang = ocr.OCRSpace.OcrLangs[ocr_lang] + api = ocr.OCRSpace.OCRSpaceAPI() + try: + text = api.OCR_URL(img["media_url"], lang=ocr_lang) + except ocr.OCRSpace.APIError as er: + output.speak(_(u"Unable to extract text")) + return + msg = messages.viewTweet(text["ParsedText"], [], False) - def update_sent_dms(self, total, account): - sent_dms = self.search_buffer("sent_direct_messages", account) - if sent_dms != None: - sent_dms.put_items_on_list(total) + def update_sent_dms(self, total, account): + sent_dms = self.search_buffer("sent_direct_messages", account) + if sent_dms != None: + sent_dms.put_items_on_list(total) - def more_dms(self, data, account): - sent_dms = self.search_buffer("sent_direct_messages", account) - if sent_dms != None: - sent_dms.put_more_items(data) + def more_dms(self, data, account): + sent_dms = self.search_buffer("sent_direct_messages", account) + if sent_dms != None: + sent_dms.put_more_items(data) - def save_data_in_db(self): - for i in sessions.sessions: - sessions.sessions[i].shelve() + def save_data_in_db(self): + for i in sessions.sessions: + sessions.sessions[i].shelve() diff --git a/src/controller/messages.py b/src/controller/messages.py index 5eac4e13..e4a7747c 100644 --- a/src/controller/messages.py +++ b/src/controller/messages.py @@ -12,281 +12,281 @@ import config from pubsub import pub from twitter_text import parse_tweet if system == "Windows": - from wxUI.dialogs import message, urlList - from wxUI import commonMessageDialogs - from extra import translator, SpellChecker, autocompletionUsers - from extra.AudioUploader import audioUploader + from wxUI.dialogs import message, urlList + from wxUI import commonMessageDialogs + from extra import translator, SpellChecker, autocompletionUsers + from extra.AudioUploader import audioUploader elif system == "Linux": - from gtkUI.dialogs import message + from gtkUI.dialogs import message from sessions.twitter import utils from . import attach class basicTweet(object): - """ This class handles the tweet main features. Other classes should derive from this class.""" - def __init__(self, session, title, caption, text, messageType="tweet", max=280, *args, **kwargs): - super(basicTweet, self).__init__() - self.max = max - self.title = title - self.session = session - self.message = getattr(message, messageType)(title, caption, text, *args, **kwargs) - widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) - widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach) - widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor) - widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten) - widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) - widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) - if hasattr(self.message, "long_tweet"): - widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor) - if config.app["app-settings"]["remember_mention_and_longtweet"]: - self.message.long_tweet.SetValue(config.app["app-settings"]["longtweet"]) - self.attachments = [] + """ This class handles the tweet main features. Other classes should derive from this class.""" + def __init__(self, session, title, caption, text, messageType="tweet", max=280, *args, **kwargs): + super(basicTweet, self).__init__() + self.max = max + self.title = title + self.session = session + self.message = getattr(message, messageType)(title, caption, text, *args, **kwargs) + widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) + widgetUtils.connect_event(self.message.attach, widgetUtils.BUTTON_PRESSED, self.attach) + widgetUtils.connect_event(self.message.text, widgetUtils.ENTERED_TEXT, self.text_processor) + widgetUtils.connect_event(self.message.shortenButton, widgetUtils.BUTTON_PRESSED, self.shorten) + widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) + widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) + if hasattr(self.message, "long_tweet"): + widgetUtils.connect_event(self.message.long_tweet, widgetUtils.CHECKBOX, self.text_processor) + if config.app["app-settings"]["remember_mention_and_longtweet"]: + self.message.long_tweet.SetValue(config.app["app-settings"]["longtweet"]) + self.attachments = [] - def translate(self, event=None): - dlg = translator.gui.translateDialog() - if dlg.get_response() == widgetUtils.OK: - text_to_translate = self.message.get_text() - language_dict = translator.translator.available_languages() - for k in language_dict: - if language_dict[k] == dlg.dest_lang.GetStringSelection(): - dst = k - msg = translator.translator.translate(text=text_to_translate, target=dst) - self.message.set_text(msg) - self.text_processor() - self.message.text_focus() - output.speak(_(u"Translated")) - else: - return + def translate(self, event=None): + dlg = translator.gui.translateDialog() + if dlg.get_response() == widgetUtils.OK: + text_to_translate = self.message.get_text() + language_dict = translator.translator.available_languages() + for k in language_dict: + if language_dict[k] == dlg.dest_lang.GetStringSelection(): + dst = k + msg = translator.translator.translate(text=text_to_translate, target=dst) + self.message.set_text(msg) + self.text_processor() + self.message.text_focus() + output.speak(_(u"Translated")) + else: + return - def shorten(self, event=None): - urls = utils.find_urls_in_text(self.message.get_text()) - if len(urls) == 0: - output.speak(_(u"There's no URL to be shortened")) - self.message.text_focus() - elif len(urls) == 1: - self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0]))) - output.speak(_(u"URL shortened")) - self.text_processor() - self.message.text_focus() - elif len(urls) > 1: - list_urls = urlList.urlList() - list_urls.populate_list(urls) - if list_urls.get_response() == widgetUtils.OK: - self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string()))) - output.speak(_(u"URL shortened")) - self.text_processor() - self.message.text_focus() + def shorten(self, event=None): + urls = utils.find_urls_in_text(self.message.get_text()) + if len(urls) == 0: + output.speak(_(u"There's no URL to be shortened")) + self.message.text_focus() + elif len(urls) == 1: + self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.shorten(urls[0]))) + output.speak(_(u"URL shortened")) + self.text_processor() + self.message.text_focus() + elif len(urls) > 1: + list_urls = urlList.urlList() + list_urls.populate_list(urls) + if list_urls.get_response() == widgetUtils.OK: + self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.shorten(list_urls.get_string()))) + output.speak(_(u"URL shortened")) + self.text_processor() + self.message.text_focus() - def unshorten(self, event=None): - urls = utils.find_urls_in_text(self.message.get_text()) - if len(urls) == 0: - output.speak(_(u"There's no URL to be expanded")) - self.message.text_focus() - elif len(urls) == 1: - self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0]))) - output.speak(_(u"URL expanded")) - self.text_processor() - self.message.text_focus() - elif len(urls) > 1: - list_urls = urlList.urlList() - list_urls.populate_list(urls) - if list_urls.get_response() == widgetUtils.OK: - self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string()))) - output.speak(_(u"URL expanded")) - self.text_processor() - self.message.text_focus() + def unshorten(self, event=None): + urls = utils.find_urls_in_text(self.message.get_text()) + if len(urls) == 0: + output.speak(_(u"There's no URL to be expanded")) + self.message.text_focus() + elif len(urls) == 1: + self.message.set_text(self.message.get_text().replace(urls[0], url_shortener.unshorten(urls[0]))) + output.speak(_(u"URL expanded")) + self.text_processor() + self.message.text_focus() + elif len(urls) > 1: + list_urls = urlList.urlList() + list_urls.populate_list(urls) + if list_urls.get_response() == widgetUtils.OK: + self.message.set_text(self.message.get_text().replace(urls[list_urls.get_item()], url_shortener.unshorten(list_urls.get_string()))) + output.speak(_(u"URL expanded")) + self.text_processor() + self.message.text_focus() - def text_processor(self, *args, **kwargs): - if len(self.message.get_text()) > 1: - self.message.enable_button("shortenButton") - self.message.enable_button("unshortenButton") - else: - self.message.disable_button("shortenButton") - self.message.disable_button("unshortenButton") - if self.message.get("long_tweet") == False: - text = self.message.get_text() - results = parse_tweet(text) - self.message.set_title(_(u"%s - %s of %d characters") % (self.title, results.weightedLength, self.max)) - if results.weightedLength > self.max: - self.session.sound.play("max_length.ogg") - else: - self.message.set_title(_(u"%s - %s characters") % (self.title, len(self.message.get_text()))) + def text_processor(self, *args, **kwargs): + if len(self.message.get_text()) > 1: + self.message.enable_button("shortenButton") + self.message.enable_button("unshortenButton") + else: + self.message.disable_button("shortenButton") + self.message.disable_button("unshortenButton") + if self.message.get("long_tweet") == False: + text = self.message.get_text() + results = parse_tweet(text) + self.message.set_title(_(u"%s - %s of %d characters") % (self.title, results.weightedLength, self.max)) + if results.weightedLength > self.max: + self.session.sound.play("max_length.ogg") + else: + self.message.set_title(_(u"%s - %s characters") % (self.title, len(self.message.get_text()))) - def spellcheck(self, event=None): - text = self.message.get_text() - checker = SpellChecker.spellchecker.spellChecker(text, "") - if hasattr(checker, "fixed_text"): - self.message.set_text(checker.fixed_text) - self.text_processor() - self.message.text_focus() + def spellcheck(self, event=None): + text = self.message.get_text() + checker = SpellChecker.spellchecker.spellChecker(text, "") + if hasattr(checker, "fixed_text"): + self.message.set_text(checker.fixed_text) + self.text_processor() + self.message.text_focus() - def attach(self, *args, **kwargs): - def completed_callback(dlg): - url = dlg.uploaderFunction.get_url() - pub.unsubscribe(dlg.uploaderDialog.update, "uploading") - dlg.uploaderDialog.destroy() - if "sndup.net/" in url: - self.message.set_text(self.message.get_text()+url+" #audio") - self.text_processor() - else: - commonMessageDialogs.common_error(url) + def attach(self, *args, **kwargs): + def completed_callback(dlg): + url = dlg.uploaderFunction.get_url() + pub.unsubscribe(dlg.uploaderDialog.update, "uploading") + dlg.uploaderDialog.destroy() + if "sndup.net/" in url: + self.message.set_text(self.message.get_text()+url+" #audio") + self.text_processor() + else: + commonMessageDialogs.common_error(url) - dlg.cleanup() - dlg = audioUploader.audioUploader(self.session.settings, completed_callback) - self.message.text_focus() + dlg.cleanup() + dlg = audioUploader.audioUploader(self.session.settings, completed_callback) + self.message.text_focus() class tweet(basicTweet): - def __init__(self, session, title, caption, text, max=280, messageType="tweet", *args, **kwargs): - super(tweet, self).__init__(session, title, caption, text, messageType, max, *args, **kwargs) - self.image = None - widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image) - widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) - self.text_processor() + def __init__(self, session, title, caption, text, max=280, messageType="tweet", *args, **kwargs): + super(tweet, self).__init__(session, title, caption, text, messageType, max, *args, **kwargs) + self.image = None + widgetUtils.connect_event(self.message.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image) + widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) + self.text_processor() - def upload_image(self, *args, **kwargs): - a = attach.attach() - if len(a.attachments) != 0: - self.attachments = a.attachments + def upload_image(self, *args, **kwargs): + a = attach.attach() + if len(a.attachments) != 0: + self.attachments = a.attachments - def autocomplete_users(self, *args, **kwargs): - c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id) - c.show_menu() + def autocomplete_users(self, *args, **kwargs): + c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id) + c.show_menu() class reply(tweet): - def __init__(self, session, title, caption, text, users=[], ids=[]): - super(reply, self).__init__(session, title, caption, text, messageType="reply", users=users) - self.ids = ids - self.users = users - if len(users) > 0: - widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all) - self.message.enable_button("mentionAll") - if config.app["app-settings"]["remember_mention_and_longtweet"]: - self.message.mentionAll.SetValue(config.app["app-settings"]["mention_all"]) - self.mention_all() - self.message.set_cursor_at_end() - self.text_processor() + def __init__(self, session, title, caption, text, users=[], ids=[]): + super(reply, self).__init__(session, title, caption, text, messageType="reply", users=users) + self.ids = ids + self.users = users + if len(users) > 0: + widgetUtils.connect_event(self.message.mentionAll, widgetUtils.CHECKBOX, self.mention_all) + self.message.enable_button("mentionAll") + if config.app["app-settings"]["remember_mention_and_longtweet"]: + self.message.mentionAll.SetValue(config.app["app-settings"]["mention_all"]) + self.mention_all() + self.message.set_cursor_at_end() + self.text_processor() - def mention_all(self, *args, **kwargs): - if self.message.mentionAll.GetValue() == True: - for i in self.message.checkboxes: - i.SetValue(True) - i.Hide() - else: - for i in self.message.checkboxes: - i.SetValue(False) - i.Show() + def mention_all(self, *args, **kwargs): + if self.message.mentionAll.GetValue() == True: + for i in self.message.checkboxes: + i.SetValue(True) + i.Hide() + else: + for i in self.message.checkboxes: + i.SetValue(False) + i.Show() - def get_ids(self): - excluded_ids = "" - for i in range(0, len(self.message.checkboxes)): - if self.message.checkboxes[i].GetValue() == False: - excluded_ids = excluded_ids + "{0},".format(self.ids[i],) - return excluded_ids + def get_ids(self): + excluded_ids = "" + for i in range(0, len(self.message.checkboxes)): + if self.message.checkboxes[i].GetValue() == False: + excluded_ids = excluded_ids + "{0},".format(self.ids[i],) + return excluded_ids - def get_people(self): - people = "" - for i in range(0, len(self.message.checkboxes)): - if self.message.checkboxes[i].GetValue() == True: - people = people + "{0} ".format(self.message.checkboxes[i].GetLabel(),) - return people + def get_people(self): + people = "" + for i in range(0, len(self.message.checkboxes)): + if self.message.checkboxes[i].GetValue() == True: + people = people + "{0} ".format(self.message.checkboxes[i].GetLabel(),) + return people class dm(basicTweet): - def __init__(self, session, title, caption, text): - super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000) - widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) - self.text_processor() - widgetUtils.connect_event(self.message.cb, widgetUtils.ENTERED_TEXT, self.user_changed) + def __init__(self, session, title, caption, text): + super(dm, self).__init__(session, title, caption, text, messageType="dm", max=10000) + widgetUtils.connect_event(self.message.autocompletionButton, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) + self.text_processor() + widgetUtils.connect_event(self.message.cb, widgetUtils.ENTERED_TEXT, self.user_changed) - def user_changed(self, *args, **kwargs): - self.title = _("Direct message to %s") % (self.message.get_user()) - self.text_processor() + def user_changed(self, *args, **kwargs): + self.title = _("Direct message to %s") % (self.message.get_user()) + self.text_processor() - def autocomplete_users(self, *args, **kwargs): - c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id) - c.show_menu("dm") + def autocomplete_users(self, *args, **kwargs): + c = autocompletionUsers.completion.autocompletionUsers(self.message, self.session.session_id) + c.show_menu("dm") class viewTweet(basicTweet): - def __init__(self, tweet, tweetList, is_tweet=True, utc_offset=0, date=""): - """ This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event. - param tweet: A dictionary that represents a full tweet or a string for non-tweets. - param tweetList: If is_tweet is set to True, this could be a list of quoted tweets. - param is_tweet: True or false, depending wether the passed object is a tweet or not.""" - if is_tweet == True: - self.title = _(u"Tweet") - image_description = [] - text = "" - for i in range(0, len(tweetList)): - # tweets with message keys are longer tweets, the message value is the full messaje taken from twishort. - if hasattr(tweetList[i], "message") and tweetList[i].is_quote_status == False: - value = "message" - else: - value = "full_text" - if hasattr(tweetList[i], "retweeted_status") and tweetList[i].is_quote_status == False: - if not hasattr(tweetList[i], "message"): - text = text + "rt @%s: %s\n" % (tweetList[i].retweeted_status.user.screen_name, tweetList[i].retweeted_status.full_text) - else: - text = text + "rt @%s: %s\n" % (tweetList[i].retweeted_status.user.screen_name, getattr(tweetList[i], value)) - else: - text = text + " @%s: %s\n" % (tweetList[i].user.screen_name, getattr(tweetList[i], value)) - # tweets with extended_entities could include image descriptions. - if hasattr(tweetList[i], "extended_entities") and "media" in tweetList[i].extended_entities: - for z in tweetList[i].extended_entities["media"]: - if "ext_alt_text" in z and z["ext_alt_text"] != None: - image_description.append(z["ext_alt_text"]) - if hasattr(tweetList[i], "retweeted_status") and hasattr(tweetList[i].retweeted_status, "extended_entities") and "media" in tweetList[i].retweeted_status["extended_entities"]: - for z in tweetList[i].retweeted_status.extended_entities["media"]: - if "ext_alt_text" in z and z["ext_alt_text"] != None: - image_description.append(z["ext_alt_text"]) - # set rt and likes counters. - rt_count = str(tweet.retweet_count) - favs_count = str(tweet.favorite_count) - # Gets the client from where this tweet was made. - source = tweet.source - original_date = arrow.get(tweet.created_at, locale="en") - date = original_date.shift(seconds=utc_offset).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage()) - if text == "": - if hasattr(tweet, "message"): - value = "message" - else: - value = "full_text" - if hasattr(tweet, "retweeted_status"): - if not hasattr(tweet, "message"): - text = "rt @%s: %s" % (tweet.retweeted_status.user.screen_name, tweet.retweeted_status.full_text) - else: - text = "rt @%s: %s" % (tweet.retweeted_status.user.screen_name, getattr(tweet, value)) - else: - text = getattr(tweet, value) - text = self.clear_text(text) - if hasattr(tweet, "extended_entities") and "media" in tweet.extended_entities: - for z in tweet.extended_entities["media"]: - if "ext_alt_text" in z and z["ext_alt_text"] != None: - image_description.append(z["ext_alt_text"]) - if hasattr(tweet, "retweeted_status") and hasattr(tweet.retweeted_status, "extended_entities") and "media" in tweet.retweeted_status.extended_entities: - for z in tweet.retweeted_status.extended_entities["media"]: - if "ext_alt_text" in z and z["ext_alt_text"] != None: - image_description.append(z["ext_alt_text"]) - self.message = message.viewTweet(text, rt_count, favs_count, source, date) - results = parse_tweet(text) - self.message.set_title(results.weightedLength) - [self.message.set_image_description(i) for i in image_description] - else: - self.title = _(u"View item") - text = tweet - self.message = message.viewNonTweet(text, date) - widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) - widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) - if self.contain_urls() == True: - self.message.enable_button("unshortenButton") - widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) - self.message.get_response() + def __init__(self, tweet, tweetList, is_tweet=True, utc_offset=0, date=""): + """ This represents a tweet displayer. However it could be used for showing something wich is not a tweet, like a direct message or an event. + param tweet: A dictionary that represents a full tweet or a string for non-tweets. + param tweetList: If is_tweet is set to True, this could be a list of quoted tweets. + param is_tweet: True or false, depending wether the passed object is a tweet or not.""" + if is_tweet == True: + self.title = _(u"Tweet") + image_description = [] + text = "" + for i in range(0, len(tweetList)): + # tweets with message keys are longer tweets, the message value is the full messaje taken from twishort. + if hasattr(tweetList[i], "message") and tweetList[i].is_quote_status == False: + value = "message" + else: + value = "full_text" + if hasattr(tweetList[i], "retweeted_status") and tweetList[i].is_quote_status == False: + if not hasattr(tweetList[i], "message"): + text = text + "rt @%s: %s\n" % (tweetList[i].retweeted_status.user.screen_name, tweetList[i].retweeted_status.full_text) + else: + text = text + "rt @%s: %s\n" % (tweetList[i].retweeted_status.user.screen_name, getattr(tweetList[i], value)) + else: + text = text + " @%s: %s\n" % (tweetList[i].user.screen_name, getattr(tweetList[i], value)) + # tweets with extended_entities could include image descriptions. + if hasattr(tweetList[i], "extended_entities") and "media" in tweetList[i].extended_entities: + for z in tweetList[i].extended_entities["media"]: + if "ext_alt_text" in z and z["ext_alt_text"] != None: + image_description.append(z["ext_alt_text"]) + if hasattr(tweetList[i], "retweeted_status") and hasattr(tweetList[i].retweeted_status, "extended_entities") and "media" in tweetList[i].retweeted_status["extended_entities"]: + for z in tweetList[i].retweeted_status.extended_entities["media"]: + if "ext_alt_text" in z and z["ext_alt_text"] != None: + image_description.append(z["ext_alt_text"]) + # set rt and likes counters. + rt_count = str(tweet.retweet_count) + favs_count = str(tweet.favorite_count) + # Gets the client from where this tweet was made. + source = tweet.source + original_date = arrow.get(tweet.created_at, locale="en") + date = original_date.shift(seconds=utc_offset).format(_(u"MMM D, YYYY. H:m"), locale=languageHandler.getLanguage()) + if text == "": + if hasattr(tweet, "message"): + value = "message" + else: + value = "full_text" + if hasattr(tweet, "retweeted_status"): + if not hasattr(tweet, "message"): + text = "rt @%s: %s" % (tweet.retweeted_status.user.screen_name, tweet.retweeted_status.full_text) + else: + text = "rt @%s: %s" % (tweet.retweeted_status.user.screen_name, getattr(tweet, value)) + else: + text = getattr(tweet, value) + text = self.clear_text(text) + if hasattr(tweet, "extended_entities") and "media" in tweet.extended_entities: + for z in tweet.extended_entities["media"]: + if "ext_alt_text" in z and z["ext_alt_text"] != None: + image_description.append(z["ext_alt_text"]) + if hasattr(tweet, "retweeted_status") and hasattr(tweet.retweeted_status, "extended_entities") and "media" in tweet.retweeted_status.extended_entities: + for z in tweet.retweeted_status.extended_entities["media"]: + if "ext_alt_text" in z and z["ext_alt_text"] != None: + image_description.append(z["ext_alt_text"]) + self.message = message.viewTweet(text, rt_count, favs_count, source, date) + results = parse_tweet(text) + self.message.set_title(results.weightedLength) + [self.message.set_image_description(i) for i in image_description] + else: + self.title = _(u"View item") + text = tweet + self.message = message.viewNonTweet(text, date) + widgetUtils.connect_event(self.message.spellcheck, widgetUtils.BUTTON_PRESSED, self.spellcheck) + widgetUtils.connect_event(self.message.translateButton, widgetUtils.BUTTON_PRESSED, self.translate) + if self.contain_urls() == True: + self.message.enable_button("unshortenButton") + widgetUtils.connect_event(self.message.unshortenButton, widgetUtils.BUTTON_PRESSED, self.unshorten) + self.message.get_response() - def contain_urls(self): - if len(utils.find_urls_in_text(self.message.get_text())) > 0: - return True - return False + def contain_urls(self): + if len(utils.find_urls_in_text(self.message.get_text())) > 0: + return True + return False - def clear_text(self, text): - urls = utils.find_urls_in_text(text) - for i in urls: - if "https://twitter.com/" in i: - text = text.replace(i, "\n") - return text + def clear_text(self, text): + urls = utils.find_urls_in_text(text) + for i in urls: + if "https://twitter.com/" in i: + text = text.replace(i, "\n") + return text diff --git a/src/controller/settings.py b/src/controller/settings.py index f1a3e728..b0c1efd3 100644 --- a/src/controller/settings.py +++ b/src/controller/settings.py @@ -24,202 +24,202 @@ from collections import OrderedDict from mysc import autostart as autostart_windows class globalSettingsController(object): - def __init__(self): - super(globalSettingsController, self).__init__() - self.dialog = configuration.configurationDialog() - self.create_config() - self.needs_restart = False - self.is_started = True + def __init__(self): + super(globalSettingsController, self).__init__() + self.dialog = configuration.configurationDialog() + self.create_config() + self.needs_restart = False + self.is_started = True - def make_kmmap(self): - res={} - for i in os.listdir(os.path.join(paths.app_path(), 'keymaps')): - if ".keymap" not in i: - continue - try: - res[i[:-7]] =i - except: - log.exception("Exception while loading keymap " + i) - return res + def make_kmmap(self): + res={} + for i in os.listdir(os.path.join(paths.app_path(), 'keymaps')): + if ".keymap" not in i: + continue + try: + res[i[:-7]] =i + except: + log.exception("Exception while loading keymap " + i) + return res - def create_config(self): - self.kmmap=self.make_kmmap() - self.langs = languageHandler.getAvailableLanguages() - langs = [] - [langs.append(i[1]) for i in self.langs] - self.codes = [] - [self.codes.append(i[0]) for i in self.langs] - id = self.codes.index(config.app["app-settings"]["language"]) - self.kmfriendlies=[] - self.kmnames=[] - for k,v in list(self.kmmap.items()): - self.kmfriendlies.append(k) - self.kmnames.append(v) - self.kmid=self.kmnames.index(config.app['app-settings']['load_keymap']) - self.dialog.create_general(langs,self.kmfriendlies) - self.dialog.general.language.SetSelection(id) - self.dialog.general.km.SetSelection(self.kmid) - if paths.mode == "installed": - self.dialog.set_value("general", "autostart", config.app["app-settings"]["autostart"]) - else: - self.dialog.general.autostart.Enable(False) - self.dialog.set_value("general", "ask_at_exit", config.app["app-settings"]["ask_at_exit"]) - self.dialog.set_value("general", "no_streaming", config.app["app-settings"]["no_streaming"]) - self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"]) - self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"]) - self.dialog.set_value("general", "handle_longtweets", config.app["app-settings"]["handle_longtweets"]) - self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"]) - self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"]) - self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"]) - self.dialog.set_value("general", "update_period", config.app["app-settings"]["update_period"]) - self.dialog.set_value("general", "check_for_updates", config.app["app-settings"]["check_for_updates"]) - self.dialog.set_value("general", "remember_mention_and_longtweet", config.app["app-settings"]["remember_mention_and_longtweet"]) - proxyTypes = [_("System default"), _("HTTP"), _("SOCKS v4"), _("SOCKS v4 with DNS support"), _("SOCKS v5"), _("SOCKS v5 with DNS support")] - self.dialog.create_proxy(proxyTypes) - try: - self.dialog.proxy.type.SetSelection(config.app["proxy"]["type"]) - except: - self.dialog.proxy.type.SetSelection(0) - self.dialog.set_value("proxy", "server", config.app["proxy"]["server"]) - self.dialog.set_value("proxy", "port", config.app["proxy"]["port"]) - self.dialog.set_value("proxy", "user", config.app["proxy"]["user"]) - self.dialog.set_value("proxy", "password", config.app["proxy"]["password"]) + def create_config(self): + self.kmmap=self.make_kmmap() + self.langs = languageHandler.getAvailableLanguages() + langs = [] + [langs.append(i[1]) for i in self.langs] + self.codes = [] + [self.codes.append(i[0]) for i in self.langs] + id = self.codes.index(config.app["app-settings"]["language"]) + self.kmfriendlies=[] + self.kmnames=[] + for k,v in list(self.kmmap.items()): + self.kmfriendlies.append(k) + self.kmnames.append(v) + self.kmid=self.kmnames.index(config.app['app-settings']['load_keymap']) + self.dialog.create_general(langs,self.kmfriendlies) + self.dialog.general.language.SetSelection(id) + self.dialog.general.km.SetSelection(self.kmid) + if paths.mode == "installed": + self.dialog.set_value("general", "autostart", config.app["app-settings"]["autostart"]) + else: + self.dialog.general.autostart.Enable(False) + self.dialog.set_value("general", "ask_at_exit", config.app["app-settings"]["ask_at_exit"]) + self.dialog.set_value("general", "no_streaming", config.app["app-settings"]["no_streaming"]) + self.dialog.set_value("general", "play_ready_sound", config.app["app-settings"]["play_ready_sound"]) + self.dialog.set_value("general", "speak_ready_msg", config.app["app-settings"]["speak_ready_msg"]) + self.dialog.set_value("general", "handle_longtweets", config.app["app-settings"]["handle_longtweets"]) + self.dialog.set_value("general", "use_invisible_shorcuts", config.app["app-settings"]["use_invisible_keyboard_shorcuts"]) + self.dialog.set_value("general", "disable_sapi5", config.app["app-settings"]["voice_enabled"]) + self.dialog.set_value("general", "hide_gui", config.app["app-settings"]["hide_gui"]) + self.dialog.set_value("general", "update_period", config.app["app-settings"]["update_period"]) + self.dialog.set_value("general", "check_for_updates", config.app["app-settings"]["check_for_updates"]) + self.dialog.set_value("general", "remember_mention_and_longtweet", config.app["app-settings"]["remember_mention_and_longtweet"]) + proxyTypes = [_("System default"), _("HTTP"), _("SOCKS v4"), _("SOCKS v4 with DNS support"), _("SOCKS v5"), _("SOCKS v5 with DNS support")] + self.dialog.create_proxy(proxyTypes) + try: + self.dialog.proxy.type.SetSelection(config.app["proxy"]["type"]) + except: + self.dialog.proxy.type.SetSelection(0) + self.dialog.set_value("proxy", "server", config.app["proxy"]["server"]) + self.dialog.set_value("proxy", "port", config.app["proxy"]["port"]) + self.dialog.set_value("proxy", "user", config.app["proxy"]["user"]) + self.dialog.set_value("proxy", "password", config.app["proxy"]["password"]) - self.dialog.realize() - self.response = self.dialog.get_response() + self.dialog.realize() + self.response = self.dialog.get_response() - def save_configuration(self): - if self.codes[self.dialog.general.language.GetSelection()] != config.app["app-settings"]["language"]: - config.app["app-settings"]["language"] = self.codes[self.dialog.general.language.GetSelection()] - languageHandler.setLanguage(config.app["app-settings"]["language"]) - self.needs_restart = True - if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]: - config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()] - kmFile = open(os.path.join(paths.config_path(), "keymap.keymap"), "w") - kmFile.close() - self.needs_restart = True - if config.app["app-settings"]["autostart"] != self.dialog.get_value("general", "autostart") and paths.mode == "installed": - config.app["app-settings"]["autostart"] = self.dialog.get_value("general", "autostart") - autostart_windows.setAutoStart(application.name, enable=self.dialog.get_value("general", "autostart")) - if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"): - config.app["app-settings"]["use_invisible_keyboard_shorcuts"] = self.dialog.get_value("general", "use_invisible_shorcuts") - pub.sendMessage("invisible-shorcuts-changed", registered=self.dialog.get_value("general", "use_invisible_shorcuts")) - if config.app["app-settings"]["no_streaming"] != self.dialog.get_value("general", "no_streaming"): - config.app["app-settings"]["no_streaming"] = self.dialog.get_value("general", "no_streaming") - self.needs_restart = True - if config.app["app-settings"]["update_period"] != self.dialog.get_value("general", "update_period"): - config.app["app-settings"]["update_period"] = self.dialog.get_value("general", "update_period") - self.needs_restart = True - config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5") - config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui") - config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit") - config.app["app-settings"]["handle_longtweets"] = self.dialog.get_value("general", "handle_longtweets") - config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound") - config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg") - config.app["app-settings"]["check_for_updates"] = self.dialog.get_value("general", "check_for_updates") - config.app["app-settings"]["remember_mention_and_longtweet"] = self.dialog.get_value("general", "remember_mention_and_longtweet") - if config.app["proxy"]["type"]!=self.dialog.get_value("proxy", "type") or config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"): - if self.is_started == True: - self.needs_restart = True - config.app["proxy"]["type"] = self.dialog.proxy.type.Selection - config.app["proxy"]["server"] = self.dialog.get_value("proxy", "server") - config.app["proxy"]["port"] = self.dialog.get_value("proxy", "port") - config.app["proxy"]["user"] = self.dialog.get_value("proxy", "user") - config.app["proxy"]["password"] = self.dialog.get_value("proxy", "password") - config.app.write() + def save_configuration(self): + if self.codes[self.dialog.general.language.GetSelection()] != config.app["app-settings"]["language"]: + config.app["app-settings"]["language"] = self.codes[self.dialog.general.language.GetSelection()] + languageHandler.setLanguage(config.app["app-settings"]["language"]) + self.needs_restart = True + if self.kmnames[self.dialog.general.km.GetSelection()] != config.app["app-settings"]["load_keymap"]: + config.app["app-settings"]["load_keymap"] =self.kmnames[self.dialog.general.km.GetSelection()] + kmFile = open(os.path.join(paths.config_path(), "keymap.keymap"), "w") + kmFile.close() + self.needs_restart = True + if config.app["app-settings"]["autostart"] != self.dialog.get_value("general", "autostart") and paths.mode == "installed": + config.app["app-settings"]["autostart"] = self.dialog.get_value("general", "autostart") + autostart_windows.setAutoStart(application.name, enable=self.dialog.get_value("general", "autostart")) + if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] != self.dialog.get_value("general", "use_invisible_shorcuts"): + config.app["app-settings"]["use_invisible_keyboard_shorcuts"] = self.dialog.get_value("general", "use_invisible_shorcuts") + pub.sendMessage("invisible-shorcuts-changed", registered=self.dialog.get_value("general", "use_invisible_shorcuts")) + if config.app["app-settings"]["no_streaming"] != self.dialog.get_value("general", "no_streaming"): + config.app["app-settings"]["no_streaming"] = self.dialog.get_value("general", "no_streaming") + self.needs_restart = True + if config.app["app-settings"]["update_period"] != self.dialog.get_value("general", "update_period"): + config.app["app-settings"]["update_period"] = self.dialog.get_value("general", "update_period") + self.needs_restart = True + config.app["app-settings"]["voice_enabled"] = self.dialog.get_value("general", "disable_sapi5") + config.app["app-settings"]["hide_gui"] = self.dialog.get_value("general", "hide_gui") + config.app["app-settings"]["ask_at_exit"] = self.dialog.get_value("general", "ask_at_exit") + config.app["app-settings"]["handle_longtweets"] = self.dialog.get_value("general", "handle_longtweets") + config.app["app-settings"]["play_ready_sound"] = self.dialog.get_value("general", "play_ready_sound") + config.app["app-settings"]["speak_ready_msg"] = self.dialog.get_value("general", "speak_ready_msg") + config.app["app-settings"]["check_for_updates"] = self.dialog.get_value("general", "check_for_updates") + config.app["app-settings"]["remember_mention_and_longtweet"] = self.dialog.get_value("general", "remember_mention_and_longtweet") + if config.app["proxy"]["type"]!=self.dialog.get_value("proxy", "type") or config.app["proxy"]["server"] != self.dialog.get_value("proxy", "server") or config.app["proxy"]["port"] != self.dialog.get_value("proxy", "port") or config.app["proxy"]["user"] != self.dialog.get_value("proxy", "user") or config.app["proxy"]["password"] != self.dialog.get_value("proxy", "password"): + if self.is_started == True: + self.needs_restart = True + config.app["proxy"]["type"] = self.dialog.proxy.type.Selection + config.app["proxy"]["server"] = self.dialog.get_value("proxy", "server") + config.app["proxy"]["port"] = self.dialog.get_value("proxy", "port") + config.app["proxy"]["user"] = self.dialog.get_value("proxy", "user") + config.app["proxy"]["password"] = self.dialog.get_value("proxy", "password") + config.app.write() class accountSettingsController(globalSettingsController): - def __init__(self, buffer, window): - self.user = buffer.session.db["user_name"] - self.buffer = buffer - self.window = window - self.config = buffer.session.settings - super(accountSettingsController, self).__init__() + def __init__(self, buffer, window): + self.user = buffer.session.db["user_name"] + self.buffer = buffer + self.window = window + self.config = buffer.session.settings + super(accountSettingsController, self).__init__() - def create_config(self): - self.dialog.create_general_account() - widgetUtils.connect_event(self.dialog.general.au, widgetUtils.BUTTON_PRESSED, self.manage_autocomplete) - self.dialog.set_value("general", "relative_time", self.config["general"]["relative_times"]) - self.dialog.set_value("general", "show_screen_names", self.config["general"]["show_screen_names"]) - self.dialog.set_value("general", "itemsPerApiCall", self.config["general"]["max_tweets_per_call"]) - self.dialog.set_value("general", "reverse_timelines", self.config["general"]["reverse_timelines"]) - rt = self.config["general"]["retweet_mode"] - if rt == "ask": - self.dialog.set_value("general", "retweet_mode", _(u"Ask")) - elif rt == "direct": - self.dialog.set_value("general", "retweet_mode", _(u"Retweet without comments")) - else: - self.dialog.set_value("general", "retweet_mode", _(u"Retweet with comments")) - self.dialog.set_value("general", "persist_size", str(self.config["general"]["persist_size"])) - self.dialog.create_reporting() - self.dialog.set_value("reporting", "speech_reporting", self.config["reporting"]["speech_reporting"]) - self.dialog.set_value("reporting", "braille_reporting", self.config["reporting"]["braille_reporting"]) - self.dialog.create_other_buffers() - buffer_values = self.get_buffers_list() - self.dialog.buffers.insert_buffers(buffer_values) - self.dialog.buffers.connect_hook_func(self.toggle_buffer_active) - widgetUtils.connect_event(self.dialog.buffers.toggle_state, widgetUtils.BUTTON_PRESSED, self.toggle_state) - widgetUtils.connect_event(self.dialog.buffers.up, widgetUtils.BUTTON_PRESSED, self.dialog.buffers.move_up) - widgetUtils.connect_event(self.dialog.buffers.down, widgetUtils.BUTTON_PRESSED, self.dialog.buffers.move_down) + def create_config(self): + self.dialog.create_general_account() + widgetUtils.connect_event(self.dialog.general.au, widgetUtils.BUTTON_PRESSED, self.manage_autocomplete) + self.dialog.set_value("general", "relative_time", self.config["general"]["relative_times"]) + self.dialog.set_value("general", "show_screen_names", self.config["general"]["show_screen_names"]) + self.dialog.set_value("general", "itemsPerApiCall", self.config["general"]["max_tweets_per_call"]) + self.dialog.set_value("general", "reverse_timelines", self.config["general"]["reverse_timelines"]) + rt = self.config["general"]["retweet_mode"] + if rt == "ask": + self.dialog.set_value("general", "retweet_mode", _(u"Ask")) + elif rt == "direct": + self.dialog.set_value("general", "retweet_mode", _(u"Retweet without comments")) + else: + self.dialog.set_value("general", "retweet_mode", _(u"Retweet with comments")) + self.dialog.set_value("general", "persist_size", str(self.config["general"]["persist_size"])) + self.dialog.create_reporting() + self.dialog.set_value("reporting", "speech_reporting", self.config["reporting"]["speech_reporting"]) + self.dialog.set_value("reporting", "braille_reporting", self.config["reporting"]["braille_reporting"]) + self.dialog.create_other_buffers() + buffer_values = self.get_buffers_list() + self.dialog.buffers.insert_buffers(buffer_values) + self.dialog.buffers.connect_hook_func(self.toggle_buffer_active) + widgetUtils.connect_event(self.dialog.buffers.toggle_state, widgetUtils.BUTTON_PRESSED, self.toggle_state) + widgetUtils.connect_event(self.dialog.buffers.up, widgetUtils.BUTTON_PRESSED, self.dialog.buffers.move_up) + widgetUtils.connect_event(self.dialog.buffers.down, widgetUtils.BUTTON_PRESSED, self.dialog.buffers.move_down) - self.dialog.create_ignored_clients(self.config["twitter"]["ignored_clients"]) - widgetUtils.connect_event(self.dialog.ignored_clients.add, widgetUtils.BUTTON_PRESSED, self.add_ignored_client) - widgetUtils.connect_event(self.dialog.ignored_clients.remove, widgetUtils.BUTTON_PRESSED, self.remove_ignored_client) - self.input_devices = sound_lib.input.Input.get_device_names() - self.output_devices = sound_lib.output.Output.get_device_names() - self.soundpacks = [] - [self.soundpacks.append(i) for i in os.listdir(paths.sound_path()) if os.path.isdir(os.path.join(paths.sound_path(), i)) == True ] - self.dialog.create_sound(self.input_devices, self.output_devices, self.soundpacks) - self.dialog.set_value("sound", "volumeCtrl", self.config["sound"]["volume"]*100) - self.dialog.set_value("sound", "input", self.config["sound"]["input_device"]) - self.dialog.set_value("sound", "output", self.config["sound"]["output_device"]) - self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"]) - self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"]) - self.dialog.set_value("sound", "indicate_audio", self.config["sound"]["indicate_audio"]) - self.dialog.set_value("sound", "indicate_geo", self.config["sound"]["indicate_geo"]) - self.dialog.set_value("sound", "indicate_img", self.config["sound"]["indicate_img"]) - self.dialog.create_extras(OCRSpace.translatable_langs) - self.dialog.set_value("extras", "sndup_apiKey", self.config["sound"]["sndup_api_key"]) - language_index = OCRSpace.OcrLangs.index(self.config["mysc"]["ocr_language"]) - self.dialog.extras.ocr_lang.SetSelection(language_index) - self.dialog.realize() - self.dialog.set_title(_(u"Account settings for %s") % (self.user,)) - self.response = self.dialog.get_response() + self.dialog.create_ignored_clients(self.config["twitter"]["ignored_clients"]) + widgetUtils.connect_event(self.dialog.ignored_clients.add, widgetUtils.BUTTON_PRESSED, self.add_ignored_client) + widgetUtils.connect_event(self.dialog.ignored_clients.remove, widgetUtils.BUTTON_PRESSED, self.remove_ignored_client) + self.input_devices = sound_lib.input.Input.get_device_names() + self.output_devices = sound_lib.output.Output.get_device_names() + self.soundpacks = [] + [self.soundpacks.append(i) for i in os.listdir(paths.sound_path()) if os.path.isdir(os.path.join(paths.sound_path(), i)) == True ] + self.dialog.create_sound(self.input_devices, self.output_devices, self.soundpacks) + self.dialog.set_value("sound", "volumeCtrl", self.config["sound"]["volume"]*100) + self.dialog.set_value("sound", "input", self.config["sound"]["input_device"]) + self.dialog.set_value("sound", "output", self.config["sound"]["output_device"]) + self.dialog.set_value("sound", "session_mute", self.config["sound"]["session_mute"]) + self.dialog.set_value("sound", "soundpack", self.config["sound"]["current_soundpack"]) + self.dialog.set_value("sound", "indicate_audio", self.config["sound"]["indicate_audio"]) + self.dialog.set_value("sound", "indicate_geo", self.config["sound"]["indicate_geo"]) + self.dialog.set_value("sound", "indicate_img", self.config["sound"]["indicate_img"]) + self.dialog.create_extras(OCRSpace.translatable_langs) + self.dialog.set_value("extras", "sndup_apiKey", self.config["sound"]["sndup_api_key"]) + language_index = OCRSpace.OcrLangs.index(self.config["mysc"]["ocr_language"]) + self.dialog.extras.ocr_lang.SetSelection(language_index) + self.dialog.realize() + self.dialog.set_title(_(u"Account settings for %s") % (self.user,)) + self.response = self.dialog.get_response() - def save_configuration(self): - if self.config["general"]["relative_times"] != self.dialog.get_value("general", "relative_time"): - self.needs_restart = True - self.config["general"]["relative_times"] = self.dialog.get_value("general", "relative_time") - self.config["general"]["show_screen_names"] = self.dialog.get_value("general", "show_screen_names") - self.config["general"]["max_tweets_per_call"] = self.dialog.get_value("general", "itemsPerApiCall") - if self.config["general"]["persist_size"] != self.dialog.get_value("general", "persist_size"): - if self.dialog.get_value("general", "persist_size") == '': - self.config["general"]["persist_size"] =-1 - else: - try: - self.config["general"]["persist_size"] = int(self.dialog.get_value("general", "persist_size")) - except ValueError: - output.speak("Invalid cache size, setting to default.",True) - self.config["general"]["persist_size"] =1764 + def save_configuration(self): + if self.config["general"]["relative_times"] != self.dialog.get_value("general", "relative_time"): + self.needs_restart = True + self.config["general"]["relative_times"] = self.dialog.get_value("general", "relative_time") + self.config["general"]["show_screen_names"] = self.dialog.get_value("general", "show_screen_names") + self.config["general"]["max_tweets_per_call"] = self.dialog.get_value("general", "itemsPerApiCall") + if self.config["general"]["persist_size"] != self.dialog.get_value("general", "persist_size"): + if self.dialog.get_value("general", "persist_size") == '': + self.config["general"]["persist_size"] =-1 + else: + try: + self.config["general"]["persist_size"] = int(self.dialog.get_value("general", "persist_size")) + except ValueError: + output.speak("Invalid cache size, setting to default.",True) + self.config["general"]["persist_size"] =1764 - if self.config["general"]["reverse_timelines"] != self.dialog.get_value("general", "reverse_timelines"): - self.needs_restart = True - self.config["general"]["reverse_timelines"] = self.dialog.get_value("general", "reverse_timelines") - rt = self.dialog.get_value("general", "retweet_mode") - if rt == _(u"Ask"): - self.config["general"]["retweet_mode"] = "ask" - elif rt == _(u"Retweet without comments"): - self.config["general"]["retweet_mode"] = "direct" - else: - self.config["general"]["retweet_mode"] = "comment" - buffers_list = self.dialog.buffers.get_list() - if buffers_list != self.config["general"]["buffer_order"]: - self.needs_restart = True - self.config["general"]["buffer_order"] = buffers_list - self.config["reporting"]["speech_reporting"] = self.dialog.get_value("reporting", "speech_reporting") - self.config["reporting"]["braille_reporting"] = self.dialog.get_value("reporting", "braille_reporting") - self.config["mysc"]["ocr_language"] = OCRSpace.OcrLangs[self.dialog.extras.ocr_lang.GetSelection()] + if self.config["general"]["reverse_timelines"] != self.dialog.get_value("general", "reverse_timelines"): + self.needs_restart = True + self.config["general"]["reverse_timelines"] = self.dialog.get_value("general", "reverse_timelines") + rt = self.dialog.get_value("general", "retweet_mode") + if rt == _(u"Ask"): + self.config["general"]["retweet_mode"] = "ask" + elif rt == _(u"Retweet without comments"): + self.config["general"]["retweet_mode"] = "direct" + else: + self.config["general"]["retweet_mode"] = "comment" + buffers_list = self.dialog.buffers.get_list() + if buffers_list != self.config["general"]["buffer_order"]: + self.needs_restart = True + self.config["general"]["buffer_order"] = buffers_list + self.config["reporting"]["speech_reporting"] = self.dialog.get_value("reporting", "speech_reporting") + self.config["reporting"]["braille_reporting"] = self.dialog.get_value("reporting", "braille_reporting") + self.config["mysc"]["ocr_language"] = OCRSpace.OcrLangs[self.dialog.extras.ocr_lang.GetSelection()] # if self.config["other_buffers"]["show_followers"] != self.dialog.get_value("buffers", "followers"): # self.config["other_buffers"]["show_followers"] = self.dialog.get_value("buffers", "followers") # pub.sendMessage("create-new-buffer", buffer="followers", account=self.user, create=self.config["other_buffers"]["show_followers"]) @@ -238,75 +238,75 @@ class accountSettingsController(globalSettingsController): # if self.config["other_buffers"]["show_events"] != self.dialog.get_value("buffers", "events"): # self.config["other_buffers"]["show_events"] = self.dialog.get_value("buffers", "events") # pub.sendMessage("create-new-buffer", buffer="events", account=self.user, create=self.config["other_buffers"]["show_events"]) - if self.config["sound"]["input_device"] != self.dialog.sound.get("input"): - self.config["sound"]["input_device"] = self.dialog.sound.get("input") - try: - self.buffer.session.sound.input.set_device(self.buffer.session.sound.input.find_device_by_name(self.config["sound"]["input_device"])) - except: - self.config["sound"]["input_device"] = "default" - if self.config["sound"]["output_device"] != self.dialog.sound.get("output"): - self.config["sound"]["output_device"] = self.dialog.sound.get("output") - try: - self.buffer.session.sound.output.set_device(self.buffer.session.sound.output.find_device_by_name(self.config["sound"]["output_device"])) - except: - self.config["sound"]["output_device"] = "default" - self.config["sound"]["volume"] = self.dialog.get_value("sound", "volumeCtrl")/100.0 - self.config["sound"]["session_mute"] = self.dialog.get_value("sound", "session_mute") - self.config["sound"]["current_soundpack"] = self.dialog.sound.get("soundpack") - self.config["sound"]["indicate_audio"] = self.dialog.get_value("sound", "indicate_audio") - self.config["sound"]["indicate_geo"] = self.dialog.get_value("sound", "indicate_geo") - self.config["sound"]["indicate_img"] = self.dialog.get_value("sound", "indicate_img") - self.config["sound"]["sndup_api_key"] = self.dialog.get_value("extras", "sndup_apiKey") - self.buffer.session.sound.config = self.config["sound"] - self.buffer.session.sound.check_soundpack() - self.config.write() + if self.config["sound"]["input_device"] != self.dialog.sound.get("input"): + self.config["sound"]["input_device"] = self.dialog.sound.get("input") + try: + self.buffer.session.sound.input.set_device(self.buffer.session.sound.input.find_device_by_name(self.config["sound"]["input_device"])) + except: + self.config["sound"]["input_device"] = "default" + if self.config["sound"]["output_device"] != self.dialog.sound.get("output"): + self.config["sound"]["output_device"] = self.dialog.sound.get("output") + try: + self.buffer.session.sound.output.set_device(self.buffer.session.sound.output.find_device_by_name(self.config["sound"]["output_device"])) + except: + self.config["sound"]["output_device"] = "default" + self.config["sound"]["volume"] = self.dialog.get_value("sound", "volumeCtrl")/100.0 + self.config["sound"]["session_mute"] = self.dialog.get_value("sound", "session_mute") + self.config["sound"]["current_soundpack"] = self.dialog.sound.get("soundpack") + self.config["sound"]["indicate_audio"] = self.dialog.get_value("sound", "indicate_audio") + self.config["sound"]["indicate_geo"] = self.dialog.get_value("sound", "indicate_geo") + self.config["sound"]["indicate_img"] = self.dialog.get_value("sound", "indicate_img") + self.config["sound"]["sndup_api_key"] = self.dialog.get_value("extras", "sndup_apiKey") + self.buffer.session.sound.config = self.config["sound"] + self.buffer.session.sound.check_soundpack() + self.config.write() - def toggle_state(self,*args,**kwargs): - return self.dialog.buffers.change_selected_item() + def toggle_state(self,*args,**kwargs): + return self.dialog.buffers.change_selected_item() - def manage_autocomplete(self, *args, **kwargs): - configuration = settings.autocompletionSettings(self.buffer.session.settings, self.buffer, self.window) + def manage_autocomplete(self, *args, **kwargs): + configuration = settings.autocompletionSettings(self.buffer.session.settings, self.buffer, self.window) - def add_ignored_client(self, *args, **kwargs): - client = commonMessageDialogs.get_ignored_client() - if client == None: return - if client not in self.config["twitter"]["ignored_clients"]: - self.config["twitter"]["ignored_clients"].append(client) - self.dialog.ignored_clients.append(client) + def add_ignored_client(self, *args, **kwargs): + client = commonMessageDialogs.get_ignored_client() + if client == None: return + if client not in self.config["twitter"]["ignored_clients"]: + self.config["twitter"]["ignored_clients"].append(client) + self.dialog.ignored_clients.append(client) - def remove_ignored_client(self, *args, **kwargs): - if self.dialog.ignored_clients.get_clients() == 0: return - id = self.dialog.ignored_clients.get_client_id() - self.config["twitter"]["ignored_clients"].pop(id) - self.dialog.ignored_clients.remove_(id) + def remove_ignored_client(self, *args, **kwargs): + if self.dialog.ignored_clients.get_clients() == 0: return + id = self.dialog.ignored_clients.get_client_id() + self.config["twitter"]["ignored_clients"].pop(id) + self.dialog.ignored_clients.remove_(id) - def get_buffers_list(self): - all_buffers=OrderedDict() - all_buffers['home']=_(u"Home") - all_buffers['mentions']=_(u"Mentions") - all_buffers['dm']=_(u"Direct Messages") - all_buffers['sent_dm']=_(u"Sent direct messages") - all_buffers['sent_tweets']=_(u"Sent tweets") - all_buffers['favorites']=_(u"Likes") - all_buffers['followers']=_(u"Followers") - all_buffers['friends']=_(u"Friends") - all_buffers['blocks']=_(u"Blocked users") - all_buffers['muted']=_(u"Muted users") - list_buffers = [] - hidden_buffers=[] - all_buffers_keys = list(all_buffers.keys()) - # Check buffers shown first. - for i in self.config["general"]["buffer_order"]: - if i in all_buffers_keys: - list_buffers.append((i, all_buffers[i], True)) - # This second pass will retrieve all hidden buffers. - for i in all_buffers_keys: - if i not in self.config["general"]["buffer_order"]: - hidden_buffers.append((i, all_buffers[i], False)) - list_buffers.extend(hidden_buffers) - return list_buffers + def get_buffers_list(self): + all_buffers=OrderedDict() + all_buffers['home']=_(u"Home") + all_buffers['mentions']=_(u"Mentions") + all_buffers['dm']=_(u"Direct Messages") + all_buffers['sent_dm']=_(u"Sent direct messages") + all_buffers['sent_tweets']=_(u"Sent tweets") + all_buffers['favorites']=_(u"Likes") + all_buffers['followers']=_(u"Followers") + all_buffers['friends']=_(u"Friends") + all_buffers['blocks']=_(u"Blocked users") + all_buffers['muted']=_(u"Muted users") + list_buffers = [] + hidden_buffers=[] + all_buffers_keys = list(all_buffers.keys()) + # Check buffers shown first. + for i in self.config["general"]["buffer_order"]: + if i in all_buffers_keys: + list_buffers.append((i, all_buffers[i], True)) + # This second pass will retrieve all hidden buffers. + for i in all_buffers_keys: + if i not in self.config["general"]["buffer_order"]: + hidden_buffers.append((i, all_buffers[i], False)) + list_buffers.extend(hidden_buffers) + return list_buffers - def toggle_buffer_active(self, ev): - change = self.dialog.buffers.get_event(ev) - if change == True: - self.dialog.buffers.change_selected_item() \ No newline at end of file + def toggle_buffer_active(self, ev): + change = self.dialog.buffers.get_event(ev) + if change == True: + self.dialog.buffers.change_selected_item() diff --git a/src/controller/trendingTopics.py b/src/controller/trendingTopics.py index 5b6bd270..58234204 100644 --- a/src/controller/trendingTopics.py +++ b/src/controller/trendingTopics.py @@ -3,43 +3,43 @@ from wxUI.dialogs import trends import widgetUtils class trendingTopicsController(object): - def __init__(self, session): - super(trendingTopicsController, self).__init__() - self.countries = {} - self.cities = {} - self.dialog = trends.trendingTopicsDialog() - self.information = session.twitter.trends_available() - self.split_information() - widgetUtils.connect_event(self.dialog.country, widgetUtils.RADIOBUTTON, self.get_places) - widgetUtils.connect_event(self.dialog.city, widgetUtils.RADIOBUTTON, self.get_places) - self.get_places() + def __init__(self, session): + super(trendingTopicsController, self).__init__() + self.countries = {} + self.cities = {} + self.dialog = trends.trendingTopicsDialog() + self.information = session.twitter.trends_available() + self.split_information() + widgetUtils.connect_event(self.dialog.country, widgetUtils.RADIOBUTTON, self.get_places) + widgetUtils.connect_event(self.dialog.city, widgetUtils.RADIOBUTTON, self.get_places) + self.get_places() - def split_information(self): - for i in self.information: - if i["placeType"]["name"] == "Country": - self.countries[i["name"]] = i["woeid"] - else: - self.cities[i["name"]] = i["woeid"] + def split_information(self): + for i in self.information: + if i["placeType"]["name"] == "Country": + self.countries[i["name"]] = i["woeid"] + else: + self.cities[i["name"]] = i["woeid"] - def get_places(self, event=None): - values = [] - if self.dialog.get_active() == "country": - for i in self.information: - if i["placeType"]["name"] == "Country": - values.append(i["name"]) - elif self.dialog.get_active() == "city": - for i in self.information: - if i["placeType"]["name"] != "Country": - values.append(i["name"]) - self.dialog.set(values) + def get_places(self, event=None): + values = [] + if self.dialog.get_active() == "country": + for i in self.information: + if i["placeType"]["name"] == "Country": + values.append(i["name"]) + elif self.dialog.get_active() == "city": + for i in self.information: + if i["placeType"]["name"] != "Country": + values.append(i["name"]) + self.dialog.set(values) - def get_woeid(self): - selected = self.dialog.get_item() - if self.dialog.get_active() == "country": - woeid = self.countries[selected] - else: - woeid = self.cities[selected] - return woeid + def get_woeid(self): + selected = self.dialog.get_item() + if self.dialog.get_active() == "country": + woeid = self.countries[selected] + else: + woeid = self.cities[selected] + return woeid - def get_string(self): - return self.dialog.get_item() \ No newline at end of file + def get_string(self): + return self.dialog.get_item() diff --git a/src/controller/user.py b/src/controller/user.py index 9293b5c7..755b21ba 100644 --- a/src/controller/user.py +++ b/src/controller/user.py @@ -10,119 +10,119 @@ from tweepy.error import TweepError from sessions.twitter import utils class profileController(object): - def __init__(self, session, user=None): - super(profileController, self).__init__() - self.file = None - self.session = session - self.user = user - if user == None: - self.get_data(screen_name=self.session.db["user_name"]) - self.dialog = update_profile.updateProfileDialog() - self.fill_profile_fields() - self.uploaded = False - widgetUtils.connect_event(self.dialog.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image) - else: - try: - self.get_data(screen_name=self.user) - except TweepError as err: - if err.api_code == 50: - wx.MessageDialog(None, _(u"That user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal() - if err.api_code == 403: - wx.MessageDialog(None, _(u"User has been suspended"), _(u"Error"), wx.ICON_ERROR).ShowModal() - log.error("error %d: %s" % (err.api_code, err.reason)) - return - self.dialog = show_user.showUserProfile() - string = self.get_user_info() - self.dialog.set("text", string) - self.dialog.set_title(_(u"Information for %s") % (self.data.screen_name)) - if self.data.url != None: - self.dialog.enable_url() - widgetUtils.connect_event(self.dialog.url, widgetUtils.BUTTON_PRESSED, self.visit_url) - if self.dialog.get_response() == widgetUtils.OK and self.user == None: - self.do_update() + def __init__(self, session, user=None): + super(profileController, self).__init__() + self.file = None + self.session = session + self.user = user + if user == None: + self.get_data(screen_name=self.session.db["user_name"]) + self.dialog = update_profile.updateProfileDialog() + self.fill_profile_fields() + self.uploaded = False + widgetUtils.connect_event(self.dialog.upload_image, widgetUtils.BUTTON_PRESSED, self.upload_image) + else: + try: + self.get_data(screen_name=self.user) + except TweepError as err: + if err.api_code == 50: + wx.MessageDialog(None, _(u"That user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal() + if err.api_code == 403: + wx.MessageDialog(None, _(u"User has been suspended"), _(u"Error"), wx.ICON_ERROR).ShowModal() + log.error("error %d: %s" % (err.api_code, err.reason)) + return + self.dialog = show_user.showUserProfile() + string = self.get_user_info() + self.dialog.set("text", string) + self.dialog.set_title(_(u"Information for %s") % (self.data.screen_name)) + if self.data.url != None: + self.dialog.enable_url() + widgetUtils.connect_event(self.dialog.url, widgetUtils.BUTTON_PRESSED, self.visit_url) + if self.dialog.get_response() == widgetUtils.OK and self.user == None: + self.do_update() - def get_data(self, screen_name): - self.data = self.session.twitter.get_user(screen_name=screen_name) - if screen_name != self.session.db["user_name"]: - self.friendship_status = self.session.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name) + def get_data(self, screen_name): + self.data = self.session.twitter.get_user(screen_name=screen_name) + if screen_name != self.session.db["user_name"]: + self.friendship_status = self.session.twitter.show_friendship(source_screen_name=self.session.db["user_name"], target_screen_name=screen_name) - def fill_profile_fields(self): - self.dialog.set_name(self.data.name) - if self.data.url != None: - self.dialog.set_url(self.data.url) - if len(self.data.location) > 0: - self.dialog.set_location(self.data.location) - if len(self.data.description) > 0: - self.dialog.set_description(self.data.description) + def fill_profile_fields(self): + self.dialog.set_name(self.data.name) + if self.data.url != None: + self.dialog.set_url(self.data.url) + if len(self.data.location) > 0: + self.dialog.set_location(self.data.location) + if len(self.data.description) > 0: + self.dialog.set_description(self.data.description) - def get_image(self): - file = self.dialog.upload_picture() - if file != None: - self.file = open(file, "rb") - self.uploaded = True - self.dialog.change_upload_button(self.uploaded) + def get_image(self): + file = self.dialog.upload_picture() + if file != None: + self.file = open(file, "rb") + self.uploaded = True + self.dialog.change_upload_button(self.uploaded) - def discard_image(self): - self.file = None - output.speak(_(u"Discarded")) - self.uploaded = False - self.dialog.change_upload_button(self.uploaded) + def discard_image(self): + self.file = None + output.speak(_(u"Discarded")) + self.uploaded = False + self.dialog.change_upload_button(self.uploaded) - def upload_image(self, *args, **kwargs): - if self.uploaded == False: - self.get_image() - elif self.uploaded == True: - self.discard_image() + def upload_image(self, *args, **kwargs): + if self.uploaded == False: + self.get_image() + elif self.uploaded == True: + self.discard_image() - def do_update(self): - if self.user != None: return - name = self.dialog.get("name") - description = self.dialog.get("description") - location = self.dialog.get("location") - url = self.dialog.get("url") - if self.file != None: - try: - self.session.twitter.update_profile_image(image=self.file) - except TweepError as e: - output.speak(u"Error %s. %s" % (e.api_code, e.reason)) - try: - self.session.twitter.update_profile(name=name, description=description, location=location, url=url) - except TweepError as e: - output.speak(u"Error %s. %s" % (e.api_code, e.reason)) + def do_update(self): + if self.user != None: return + name = self.dialog.get("name") + description = self.dialog.get("description") + location = self.dialog.get("location") + url = self.dialog.get("url") + if self.file != None: + try: + self.session.twitter.update_profile_image(image=self.file) + except TweepError as e: + output.speak(u"Error %s. %s" % (e.api_code, e.reason)) + try: + self.session.twitter.update_profile(name=name, description=description, location=location, url=url) + except TweepError as e: + output.speak(u"Error %s. %s" % (e.api_code, e.reason)) - def get_user_info(self): - string = u"" - string = string + _(u"Username: @%s\n") % (self.data.screen_name) - string = string + _(u"Name: %s\n") % (self.data.name) - if self.data.location != "": - string = string + _(u"Location: %s\n") % (self.data.location) - if self.data.url != None: - string = string+ _(u"URL: %s\n") % (self.data.entities["url"]["urls"][0]["expanded_url"]) - if self.data.description != "": - if self.data.entities.get("description") != None and self.data.entities["description"].get("urls"): - self.data.description = utils.expand_urls(self.data.description, self.data.entities["description"]) - string = string+ _(u"Bio: %s\n") % (self.data.description) - if self.data.protected == True: protected = _(u"Yes") - else: protected = _(u"No") - string = string+ _(u"Protected: %s\n") % (protected) - if hasattr(self, "friendship_status"): - relation = False - friendship = "Relationship: " - if self.friendship_status[0].following: - friendship += _(u"You follow {0}. ").format(self.data.name,) - relation = True - if self.friendship_status[1].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) - if self.data.verified == True: verified = _(u"Yes") - else: verified = _(u"No") - string = string+ _(u"Verified: %s\n") % (verified) - string = string+ _(u"Tweets: %s\n") % (self.data.statuses_count) - string = string+ _(u"Likes: %s") % (self.data.favourites_count) - return string + def get_user_info(self): + string = u"" + string = string + _(u"Username: @%s\n") % (self.data.screen_name) + string = string + _(u"Name: %s\n") % (self.data.name) + if self.data.location != "": + string = string + _(u"Location: %s\n") % (self.data.location) + if self.data.url != None: + string = string+ _(u"URL: %s\n") % (self.data.entities["url"]["urls"][0]["expanded_url"]) + if self.data.description != "": + if self.data.entities.get("description") != None and self.data.entities["description"].get("urls"): + self.data.description = utils.expand_urls(self.data.description, self.data.entities["description"]) + string = string+ _(u"Bio: %s\n") % (self.data.description) + if self.data.protected == True: protected = _(u"Yes") + else: protected = _(u"No") + string = string+ _(u"Protected: %s\n") % (protected) + if hasattr(self, "friendship_status"): + relation = False + friendship = "Relationship: " + if self.friendship_status[0].following: + friendship += _(u"You follow {0}. ").format(self.data.name,) + relation = True + if self.friendship_status[1].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) + if self.data.verified == True: verified = _(u"Yes") + else: verified = _(u"No") + string = string+ _(u"Verified: %s\n") % (verified) + string = string+ _(u"Tweets: %s\n") % (self.data.statuses_count) + string = string+ _(u"Likes: %s") % (self.data.favourites_count) + return string - def visit_url(self, *args, **kwargs): - webbrowser.open_new_tab(self.data.url) \ No newline at end of file + def visit_url(self, *args, **kwargs): + webbrowser.open_new_tab(self.data.url) diff --git a/src/controller/userActionsController.py b/src/controller/userActionsController.py index 54f4ba16..623dc818 100644 --- a/src/controller/userActionsController.py +++ b/src/controller/userActionsController.py @@ -7,73 +7,73 @@ from tweepy.error import TweepError from extra import autocompletionUsers class userActionsController(object): - def __init__(self, buffer, users=[], default="follow"): - super(userActionsController, self).__init__() - self.buffer = buffer - self.session = buffer.session - self.dialog = userActions.UserActionsDialog(users, default) - widgetUtils.connect_event(self.dialog.autocompletion, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) - if self.dialog.get_response() == widgetUtils.OK: - self.process_action() + def __init__(self, buffer, users=[], default="follow"): + super(userActionsController, self).__init__() + self.buffer = buffer + self.session = buffer.session + self.dialog = userActions.UserActionsDialog(users, default) + widgetUtils.connect_event(self.dialog.autocompletion, widgetUtils.BUTTON_PRESSED, self.autocomplete_users) + if self.dialog.get_response() == widgetUtils.OK: + self.process_action() - def autocomplete_users(self, *args, **kwargs): - c = autocompletionUsers.completion.autocompletionUsers(self.dialog, self.session.session_id) - c.show_menu("dm") + def autocomplete_users(self, *args, **kwargs): + c = autocompletionUsers.completion.autocompletionUsers(self.dialog, self.session.session_id) + c.show_menu("dm") - def process_action(self): - action = self.dialog.get_action() - user = self.dialog.get_user() - if user == "": return - getattr(self, action)(user) + def process_action(self): + action = self.dialog.get_action() + user = self.dialog.get_user() + if user == "": return + getattr(self, action)(user) - def follow(self, user): - try: - self.session.twitter.create_friendship(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def follow(self, user): + try: + self.session.twitter.create_friendship(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def unfollow(self, user): - try: - id = self.session.twitter.destroy_friendship(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def unfollow(self, user): + try: + id = self.session.twitter.destroy_friendship(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def mute(self, user): - try: - id = self.session.twitter.create_mute(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def mute(self, user): + try: + id = self.session.twitter.create_mute(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def unmute(self, user): - try: - id = self.session.twitter.destroy_mute(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def unmute(self, user): + try: + id = self.session.twitter.destroy_mute(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def report(self, user): - try: - id = self.session.twitter.report_spam(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def report(self, user): + try: + id = self.session.twitter.report_spam(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def block(self, user): - try: - id = self.session.twitter.create_block(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def block(self, user): + try: + id = self.session.twitter.create_block(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def unblock(self, user): - try: - id = self.session.twitter.destroy_block(screen_name=user ) - except TweepError as err: - output.speak("Error %s: %s" % (err.api_code, err.reason), True) + def unblock(self, user): + try: + id = self.session.twitter.destroy_block(screen_name=user ) + except TweepError as err: + output.speak("Error %s: %s" % (err.api_code, err.reason), True) - def ignore_client(self, user): - tweet = self.buffer.get_right_tweet() - if hasattr(tweet, "sender"): - output.speak(_(u"You can't ignore direct messages")) - return - client = tweet.source - if client not in self.session.settings["twitter"]["ignored_clients"]: - self.session.settings["twitter"]["ignored_clients"].append(client) - self.session.settings.write() \ No newline at end of file + def ignore_client(self, user): + tweet = self.buffer.get_right_tweet() + if hasattr(tweet, "sender"): + output.speak(_(u"You can't ignore direct messages")) + return + client = tweet.source + if client not in self.session.settings["twitter"]["ignored_clients"]: + self.session.settings["twitter"]["ignored_clients"].append(client) + self.session.settings.write() diff --git a/src/extra/AudioUploader/audioUploader.py b/src/extra/AudioUploader/audioUploader.py index 7f23fbbd..0ba6f82e 100644 --- a/src/extra/AudioUploader/audioUploader.py +++ b/src/extra/AudioUploader/audioUploader.py @@ -37,146 +37,146 @@ import logging log = logging.getLogger("extra.AudioUploader.audioUploader") class audioUploader(object): - def __init__(self, configFile, completed_callback): - self.config = configFile - super(audioUploader, self).__init__() - self.dialog = wx_ui.audioDialog(services=self.get_available_services()) - self.file = None - self.recorded = False - self.recording = None - self.playing = None - widgetUtils.connect_event(self.dialog.play, widgetUtils.BUTTON_PRESSED, self.on_play) - widgetUtils.connect_event(self.dialog.pause, widgetUtils.BUTTON_PRESSED, self.on_pause) - widgetUtils.connect_event(self.dialog.record, widgetUtils.BUTTON_PRESSED, self.on_record) - widgetUtils.connect_event(self.dialog.attach_exists, widgetUtils.BUTTON_PRESSED, self.on_attach_exists) - widgetUtils.connect_event(self.dialog.discard, widgetUtils.BUTTON_PRESSED, self.on_discard) - if self.dialog.get_response() == widgetUtils.OK: - self.postprocess() - log.debug("Uploading file %s to %s..." % (self.file, self.dialog.get("services"))) - self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file) - output.speak(_(u"Attaching...")) - if self.dialog.get("services") == "SNDUp": - base_url = "https://sndup.net/post.php" - if len(self.config["sound"]["sndup_api_key"]) > 0: - url = base_url + '?apikey=' + self.config['sound']['sndup_api_key'] - else: - url = base_url - self.uploaderFunction = transfer.Upload(obj=self, field='file', url=url, filename=self.file, completed_callback=completed_callback) - pub.subscribe(self.uploaderDialog.update, "uploading") - self.uploaderDialog.get_response(self.uploaderFunction.perform_threaded) + def __init__(self, configFile, completed_callback): + self.config = configFile + super(audioUploader, self).__init__() + self.dialog = wx_ui.audioDialog(services=self.get_available_services()) + self.file = None + self.recorded = False + self.recording = None + self.playing = None + widgetUtils.connect_event(self.dialog.play, widgetUtils.BUTTON_PRESSED, self.on_play) + widgetUtils.connect_event(self.dialog.pause, widgetUtils.BUTTON_PRESSED, self.on_pause) + widgetUtils.connect_event(self.dialog.record, widgetUtils.BUTTON_PRESSED, self.on_record) + widgetUtils.connect_event(self.dialog.attach_exists, widgetUtils.BUTTON_PRESSED, self.on_attach_exists) + widgetUtils.connect_event(self.dialog.discard, widgetUtils.BUTTON_PRESSED, self.on_discard) + if self.dialog.get_response() == widgetUtils.OK: + self.postprocess() + log.debug("Uploading file %s to %s..." % (self.file, self.dialog.get("services"))) + self.uploaderDialog = wx_transfer_dialogs.UploadDialog(self.file) + output.speak(_(u"Attaching...")) + if self.dialog.get("services") == "SNDUp": + base_url = "https://sndup.net/post.php" + if len(self.config["sound"]["sndup_api_key"]) > 0: + url = base_url + '?apikey=' + self.config['sound']['sndup_api_key'] + else: + url = base_url + self.uploaderFunction = transfer.Upload(obj=self, field='file', url=url, filename=self.file, completed_callback=completed_callback) + pub.subscribe(self.uploaderDialog.update, "uploading") + self.uploaderDialog.get_response(self.uploaderFunction.perform_threaded) - def get_available_services(self): - services = [] - services.append("SNDUp") - return services + def get_available_services(self): + services = [] + services.append("SNDUp") + return services - def on_pause(self, *args, **kwargs): - if self.dialog.get("pause") == _(u"Pause"): - self.recording.pause() - self.dialog.set("pause", _(u"&Resume")) - elif self.dialog.get("pause") == _(u"Resume"): - self.recording.play() - self.dialog.set("pause", _(U"&Pause")) + def on_pause(self, *args, **kwargs): + if self.dialog.get("pause") == _(u"Pause"): + self.recording.pause() + self.dialog.set("pause", _(u"&Resume")) + elif self.dialog.get("pause") == _(u"Resume"): + self.recording.play() + self.dialog.set("pause", _(U"&Pause")) - def on_record(self, *args, **kwargs): - if self.recording != None: - self.stop_recording() - self.dialog.disable_control("pause") - else: - self.start_recording() - self.dialog.enable_control("pause") + def on_record(self, *args, **kwargs): + if self.recording != None: + self.stop_recording() + self.dialog.disable_control("pause") + else: + self.start_recording() + self.dialog.enable_control("pause") - def start_recording(self): - self.dialog.disable_control("attach_exists") - self.file = tempfile.mktemp(suffix='.wav') - self.recording = sound.recording(self.file) - self.recording.play() - self.dialog.set("record", _(u"&Stop")) - output.speak(_(u"Recording")) + def start_recording(self): + self.dialog.disable_control("attach_exists") + self.file = tempfile.mktemp(suffix='.wav') + self.recording = sound.recording(self.file) + self.recording.play() + self.dialog.set("record", _(u"&Stop")) + output.speak(_(u"Recording")) - def stop_recording(self): - self.recording.stop() - self.recording.free() - output.speak(_(u"Stopped")) - self.recorded = True - self.dialog.set("record", _(u"&Record")) - self.file_attached() + def stop_recording(self): + self.recording.stop() + self.recording.free() + output.speak(_(u"Stopped")) + self.recorded = True + self.dialog.set("record", _(u"&Record")) + self.file_attached() - def file_attached(self): - self.dialog.set("pause", _(u"&Pause")) - self.dialog.disable_control("record") - self.dialog.enable_control("play") - self.dialog.enable_control("discard") - self.dialog.disable_control("attach_exists") - self.dialog.enable_control("attach") - self.dialog.play.SetFocus() + def file_attached(self): + self.dialog.set("pause", _(u"&Pause")) + self.dialog.disable_control("record") + self.dialog.enable_control("play") + self.dialog.enable_control("discard") + self.dialog.disable_control("attach_exists") + self.dialog.enable_control("attach") + self.dialog.play.SetFocus() - def on_discard(self, *args, **kwargs): - if self.playing: - self._stop() - if self.recording != None: - self.cleanup() - self.dialog.disable_control("attach") - self.dialog.disable_control("play") - self.file = None - self.dialog.enable_control("record") - self.dialog.enable_control("attach_exists") - self.dialog.record.SetFocus() - self.dialog.disable_control("discard") - self.recording = None - output.speak(_(u"Discarded")) + def on_discard(self, *args, **kwargs): + if self.playing: + self._stop() + if self.recording != None: + self.cleanup() + self.dialog.disable_control("attach") + self.dialog.disable_control("play") + self.file = None + self.dialog.enable_control("record") + self.dialog.enable_control("attach_exists") + self.dialog.record.SetFocus() + self.dialog.disable_control("discard") + self.recording = None + output.speak(_(u"Discarded")) - def on_play(self, *args, **kwargs): - if not self.playing: - call_threaded(self._play) - else: - self._stop() + def on_play(self, *args, **kwargs): + if not self.playing: + call_threaded(self._play) + else: + self._stop() - def _play(self): - output.speak(_(u"Playing...")) + def _play(self): + output.speak(_(u"Playing...")) # try: - self.playing = sound_lib.stream.FileStream(file=str(self.file), flags=sound_lib.stream.BASS_UNICODE) - self.playing.play() - self.dialog.set("play", _(u"&Stop")) - try: - while self.playing.is_playing: - pass - self.dialog.set("play", _(u"&Play")) - self.playing.free() - self.playing = None - except: - pass + self.playing = sound_lib.stream.FileStream(file=str(self.file), flags=sound_lib.stream.BASS_UNICODE) + self.playing.play() + self.dialog.set("play", _(u"&Stop")) + try: + while self.playing.is_playing: + pass + self.dialog.set("play", _(u"&Play")) + self.playing.free() + self.playing = None + except: + pass - def _stop(self): - output.speak(_(u"Stopped")) - self.playing.stop() - self.playing.free() - self.dialog.set("play", _(u"&Play")) - self.playing = None + def _stop(self): + output.speak(_(u"Stopped")) + self.playing.stop() + self.playing.free() + self.dialog.set("play", _(u"&Play")) + self.playing = None - def postprocess(self): - if self.file.lower().endswith('.wav'): - output.speak(_(u"Recoding audio...")) - sound.recode_audio(self.file) - self.wav_file = self.file - self.file = '%s.ogg' % self.file[:-4] + def postprocess(self): + if self.file.lower().endswith('.wav'): + output.speak(_(u"Recoding audio...")) + sound.recode_audio(self.file) + self.wav_file = self.file + self.file = '%s.ogg' % self.file[:-4] - def cleanup(self): - if self.playing and self.playing.is_playing: - self.playing.stop() - if self.recording != None: - if self.recording.is_playing: - self.recording.stop() - try: - self.recording.free() - except: - pass - os.remove(self.file) - if hasattr(self, 'wav_file'): - os.remove(self.wav_file) + def cleanup(self): + if self.playing and self.playing.is_playing: + self.playing.stop() + if self.recording != None: + if self.recording.is_playing: + self.recording.stop() + try: + self.recording.free() + except: + pass + os.remove(self.file) + if hasattr(self, 'wav_file'): + os.remove(self.wav_file) - def on_attach_exists(self, *args, **kwargs): - self.file = self.dialog.get_file() - if self.file != False: - self.file_attached() + def on_attach_exists(self, *args, **kwargs): + self.file = self.dialog.get_file() + if self.file != False: + self.file_attached() diff --git a/src/extra/AudioUploader/transfer.py b/src/extra/AudioUploader/transfer.py index a567f753..8c6bc670 100644 --- a/src/extra/AudioUploader/transfer.py +++ b/src/extra/AudioUploader/transfer.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import absolute_import -from __future__ import division -from __future__ import unicode_literals -from builtins import object -from past.utils import old_div +from __future__ import division +from __future__ import unicode_literals +from builtins import object +from past.utils import old_div import sys import threading import time @@ -15,74 +15,74 @@ from requests_toolbelt.multipart.encoder import MultipartEncoder, MultipartEncod import requests import os class Upload(object): - def __init__(self, field=None, obj=None, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, *args, **kwargs): - super(Upload, self).__init__(*args, **kwargs) - self.url=url - self.filename=filename - log.debug("Uploading audio to %s, filename %s" % (url, filename)) - self.start_time = None - self.completed_callback = completed_callback - self.background_thread = None - self.transfer_rate = 0 - self.local_filename=os.path.basename(self.filename) - if isinstance(self.local_filename, str): - self.local_filename=self.local_filename.encode(sys.getfilesystemencoding()) - self.fin=open(self.filename, 'rb') - self.m = MultipartEncoder(fields={field:(self.local_filename, self.fin, "application/octet-stream")}) - self.monitor = MultipartEncoderMonitor(self.m, self.progress_callback) - self.response=None - self.obj=obj - self.follow_location=follow_location - #the verbose parameter is deprecated and will be removed soon + def __init__(self, field=None, obj=None, url=None, filename=None, follow_location=True, completed_callback=None, verbose=False, *args, **kwargs): + super(Upload, self).__init__(*args, **kwargs) + self.url=url + self.filename=filename + log.debug("Uploading audio to %s, filename %s" % (url, filename)) + self.start_time = None + self.completed_callback = completed_callback + self.background_thread = None + self.transfer_rate = 0 + self.local_filename=os.path.basename(self.filename) + if isinstance(self.local_filename, str): + self.local_filename=self.local_filename.encode(sys.getfilesystemencoding()) + self.fin=open(self.filename, 'rb') + self.m = MultipartEncoder(fields={field:(self.local_filename, self.fin, "application/octet-stream")}) + self.monitor = MultipartEncoderMonitor(self.m, self.progress_callback) + self.response=None + self.obj=obj + self.follow_location=follow_location + #the verbose parameter is deprecated and will be removed soon - def elapsed_time(self): - if not self.start_time: - return 0 - return time.time() - self.start_time + def elapsed_time(self): + if not self.start_time: + return 0 + return time.time() - self.start_time - def progress_callback(self, monitor): - progress = {} - progress["total"] = monitor.len - progress["current"] = monitor.bytes_read - if progress["current"] == 0: - progress["percent"] = 0 - self.transfer_rate = 0 - else: - progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100) - self.transfer_rate = old_div(progress["current"], self.elapsed_time()) - progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate) - if self.transfer_rate: - progress["eta"] = old_div((progress["total"] - progress["current"]), self.transfer_rate) - else: - progress["eta"] = 0 - pub.sendMessage("uploading", data=progress) + def progress_callback(self, monitor): + progress = {} + progress["total"] = monitor.len + progress["current"] = monitor.bytes_read + if progress["current"] == 0: + progress["percent"] = 0 + self.transfer_rate = 0 + else: + progress["percent"] = int((float(progress["current"]) / progress["total"]) * 100) + self.transfer_rate = old_div(progress["current"], self.elapsed_time()) + progress["speed"] = '%s/s' % convert_bytes(self.transfer_rate) + if self.transfer_rate: + progress["eta"] = old_div((progress["total"] - progress["current"]), self.transfer_rate) + else: + progress["eta"] = 0 + pub.sendMessage("uploading", data=progress) - def perform_transfer(self): - log.debug("starting upload...") - self.start_time = time.time() - self.response=requests.post(url=self.url, data=self.monitor, headers={"Content-Type":self.m.content_type}, allow_redirects=self.follow_location, stream=True) - log.debug("Upload finished.") - self.complete_transfer() + def perform_transfer(self): + log.debug("starting upload...") + self.start_time = time.time() + self.response=requests.post(url=self.url, data=self.monitor, headers={"Content-Type":self.m.content_type}, allow_redirects=self.follow_location, stream=True) + log.debug("Upload finished.") + self.complete_transfer() - def perform_threaded(self, *args, **kwargs): - self.background_thread = threading.Thread(target=self.perform_transfer) - self.background_thread.daemon = True - self.background_thread.start() + def perform_threaded(self, *args, **kwargs): + self.background_thread = threading.Thread(target=self.perform_transfer) + self.background_thread.daemon = True + self.background_thread.start() - def complete_transfer(self): - if callable(self.completed_callback): - self.completed_callback(self.obj) - if hasattr(self,'fin') and callable(self.fin.close): - self.fin.close() + def complete_transfer(self): + if callable(self.completed_callback): + self.completed_callback(self.obj) + if hasattr(self,'fin') and callable(self.fin.close): + self.fin.close() - def get_url(self): - try: - data = self.response.json() - except: - return _("Error in file upload: {0}").format(self.data.content,) - if "url" in data and data["url"] != "0": - return data["url"] - elif "error" in data and data["error"] != "0": - return data["error"] - else: - return _("Error in file upload: {0}").format(self.data.content,) \ No newline at end of file + def get_url(self): + try: + data = self.response.json() + except: + return _("Error in file upload: {0}").format(self.data.content,) + if "url" in data and data["url"] != "0": + return data["url"] + elif "error" in data and data["error"] != "0": + return data["error"] + else: + return _("Error in file upload: {0}").format(self.data.content,) diff --git a/src/extra/AudioUploader/utils.py b/src/extra/AudioUploader/utils.py index 9ec89156..c9bbdc9a 100644 --- a/src/extra/AudioUploader/utils.py +++ b/src/extra/AudioUploader/utils.py @@ -3,42 +3,42 @@ from __future__ import unicode_literals from builtins import str def convert_bytes(n): - K, M, G, T, P = 1 << 10, 1 << 20, 1 << 30, 1 << 40, 1 << 50 - if n >= P: - return '%.2fPb' % (float(n) / T) - elif n >= T: - return '%.2fTb' % (float(n) / T) - elif n >= G: - return '%.2fGb' % (float(n) / G) - elif n >= M: - return '%.2fMb' % (float(n) / M) - elif n >= K: - return '%.2fKb' % (float(n) / K) - else: - return '%d' % n + K, M, G, T, P = 1 << 10, 1 << 20, 1 << 30, 1 << 40, 1 << 50 + if n >= P: + return '%.2fPb' % (float(n) / T) + elif n >= T: + return '%.2fTb' % (float(n) / T) + elif n >= G: + return '%.2fGb' % (float(n) / G) + elif n >= M: + return '%.2fMb' % (float(n) / M) + elif n >= K: + return '%.2fKb' % (float(n) / K) + else: + return '%d' % n def seconds_to_string(seconds, precision=0): - day = seconds // 86400 - hour = seconds // 3600 - min = (seconds // 60) % 60 - sec = seconds - (hour * 3600) - (min * 60) - sec_spec = "." + str(precision) + "f" - sec_string = sec.__format__(sec_spec) - string = "" - if day == 1: - string += _(u"%d day, ") % day - elif day >= 2: - string += _(u"%d days, ") % day - if (hour == 1): - string += _(u"%d hour, ") % hour - elif (hour >= 2): - string += _("%d hours, ") % hour - if (min == 1): - string += _(u"%d minute, ") % min - elif (min >= 2): - string += _(u"%d minutes, ") % min - if sec >= 0 and sec <= 2: - string += _(u"%s second") % sec_string - else: - string += _(u"%s seconds") % sec_string - return string \ No newline at end of file + day = seconds // 86400 + hour = seconds // 3600 + min = (seconds // 60) % 60 + sec = seconds - (hour * 3600) - (min * 60) + sec_spec = "." + str(precision) + "f" + sec_string = sec.__format__(sec_spec) + string = "" + if day == 1: + string += _(u"%d day, ") % day + elif day >= 2: + string += _(u"%d days, ") % day + if (hour == 1): + string += _(u"%d hour, ") % hour + elif (hour >= 2): + string += _("%d hours, ") % hour + if (min == 1): + string += _(u"%d minute, ") % min + elif (min >= 2): + string += _(u"%d minutes, ") % min + if sec >= 0 and sec <= 2: + string += _(u"%s second") % sec_string + else: + string += _(u"%s seconds") % sec_string + return string diff --git a/src/extra/AudioUploader/wx_transfer_dialogs.py b/src/extra/AudioUploader/wx_transfer_dialogs.py index b70d343e..fc14b201 100644 --- a/src/extra/AudioUploader/wx_transfer_dialogs.py +++ b/src/extra/AudioUploader/wx_transfer_dialogs.py @@ -7,57 +7,57 @@ import widgetUtils class UploadDialog(widgetUtils.BaseDialog): - def __init__(self, filename, *args, **kwargs): - super(UploadDialog, self).__init__(parent=None, id=wx.ID_ANY, *args, **kwargs) - self.pane = wx.Panel(self) - self.progress_bar = wx.Gauge(parent=self.pane) - fileBox = wx.BoxSizer(wx.HORIZONTAL) - fileLabel = wx.StaticText(self.pane, -1, _(u"File")) - self.file = wx.TextCtrl(self.pane, -1, value=filename, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(200, 100)) - self.file.SetFocus() - fileBox.Add(fileLabel) - fileBox.Add(self.file) - currentAmountBox = wx.BoxSizer(wx.HORIZONTAL) - current_amount_label = wx.StaticText(self.pane, -1, _(u"Transferred")) - self.current_amount = wx.TextCtrl(self.pane, -1, value='0', style=wx.TE_READONLY|wx.TE_MULTILINE) - currentAmountBox.Add(current_amount_label) - currentAmountBox.Add(self.current_amount) - totalSizeBox = wx.BoxSizer(wx.HORIZONTAL) - total_size_label = wx.StaticText(self.pane, -1, _(u"Total file size")) - self.total_size = wx.TextCtrl(self.pane, -1, value='0', style=wx.TE_READONLY|wx.TE_MULTILINE) - totalSizeBox.Add(total_size_label) - totalSizeBox.Add(self.total_size) - speedBox = wx.BoxSizer(wx.HORIZONTAL) - speedLabel = wx.StaticText(self.pane, -1, _(u"Transfer rate")) - self.speed = wx.TextCtrl(self.pane, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, value="0 Kb/s") - speedBox.Add(speedLabel) - speedBox.Add(self.speed) - etaBox = wx.BoxSizer(wx.HORIZONTAL) - etaLabel = wx.StaticText(self.pane, -1, _(u"Time left")) - self.eta = wx.TextCtrl(self.pane, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, value="Unknown", size=(200, 100)) - etaBox.Add(etaLabel) - etaBox.Add(self.eta) - self.create_buttons() - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(fileBox) - sizer.Add(currentAmountBox) - sizer.Add(totalSizeBox) - sizer.Add(speedBox) - sizer.Add(etaBox) - sizer.Add(self.progress_bar) - self.pane.SetSizerAndFit(sizer) + def __init__(self, filename, *args, **kwargs): + super(UploadDialog, self).__init__(parent=None, id=wx.ID_ANY, *args, **kwargs) + self.pane = wx.Panel(self) + self.progress_bar = wx.Gauge(parent=self.pane) + fileBox = wx.BoxSizer(wx.HORIZONTAL) + fileLabel = wx.StaticText(self.pane, -1, _(u"File")) + self.file = wx.TextCtrl(self.pane, -1, value=filename, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(200, 100)) + self.file.SetFocus() + fileBox.Add(fileLabel) + fileBox.Add(self.file) + currentAmountBox = wx.BoxSizer(wx.HORIZONTAL) + current_amount_label = wx.StaticText(self.pane, -1, _(u"Transferred")) + self.current_amount = wx.TextCtrl(self.pane, -1, value='0', style=wx.TE_READONLY|wx.TE_MULTILINE) + currentAmountBox.Add(current_amount_label) + currentAmountBox.Add(self.current_amount) + totalSizeBox = wx.BoxSizer(wx.HORIZONTAL) + total_size_label = wx.StaticText(self.pane, -1, _(u"Total file size")) + self.total_size = wx.TextCtrl(self.pane, -1, value='0', style=wx.TE_READONLY|wx.TE_MULTILINE) + totalSizeBox.Add(total_size_label) + totalSizeBox.Add(self.total_size) + speedBox = wx.BoxSizer(wx.HORIZONTAL) + speedLabel = wx.StaticText(self.pane, -1, _(u"Transfer rate")) + self.speed = wx.TextCtrl(self.pane, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, value="0 Kb/s") + speedBox.Add(speedLabel) + speedBox.Add(self.speed) + etaBox = wx.BoxSizer(wx.HORIZONTAL) + etaLabel = wx.StaticText(self.pane, -1, _(u"Time left")) + self.eta = wx.TextCtrl(self.pane, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, value="Unknown", size=(200, 100)) + etaBox.Add(etaLabel) + etaBox.Add(self.eta) + self.create_buttons() + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(fileBox) + sizer.Add(currentAmountBox) + sizer.Add(totalSizeBox) + sizer.Add(speedBox) + sizer.Add(etaBox) + sizer.Add(self.progress_bar) + self.pane.SetSizerAndFit(sizer) - def update(self, data): - wx.CallAfter(self.progress_bar.SetValue, data["percent"]) - wx.CallAfter(self.current_amount.SetValue, '%s (%d%%)' % (convert_bytes(data["current"]), data["percent"])) - wx.CallAfter(self.total_size.SetValue, convert_bytes(data["total"])) - wx.CallAfter(self.speed.SetValue, data["speed"]) - if data["eta"]: - wx.CallAfter(self.eta.SetValue, seconds_to_string(data["eta"])) + def update(self, data): + wx.CallAfter(self.progress_bar.SetValue, data["percent"]) + wx.CallAfter(self.current_amount.SetValue, '%s (%d%%)' % (convert_bytes(data["current"]), data["percent"])) + wx.CallAfter(self.total_size.SetValue, convert_bytes(data["total"])) + wx.CallAfter(self.speed.SetValue, data["speed"]) + if data["eta"]: + wx.CallAfter(self.eta.SetValue, seconds_to_string(data["eta"])) - def create_buttons(self): - self.cancel_button = wx.Button(parent=self.pane, id=wx.ID_CANCEL) + def create_buttons(self): + self.cancel_button = wx.Button(parent=self.pane, id=wx.ID_CANCEL) - def get_response(self, fn): - wx.CallAfter(fn, 0.01) - self.ShowModal() + def get_response(self, fn): + wx.CallAfter(fn, 0.01) + self.ShowModal() diff --git a/src/extra/AudioUploader/wx_ui.py b/src/extra/AudioUploader/wx_ui.py index 05fdbcc7..dc64dab4 100644 --- a/src/extra/AudioUploader/wx_ui.py +++ b/src/extra/AudioUploader/wx_ui.py @@ -24,56 +24,56 @@ import logging log = logging.getLogger("extra.AudioUploader.wx_UI") class audioDialog(widgetUtils.BaseDialog): - def __init__(self, services): - log.debug("creating audio dialog.") - super(audioDialog, self).__init__(None, -1, _(u"Attach audio")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - btnSizer = wx.BoxSizer(wx.HORIZONTAL) - btnSizer2 = wx.BoxSizer(wx.HORIZONTAL) + def __init__(self, services): + log.debug("creating audio dialog.") + super(audioDialog, self).__init__(None, -1, _(u"Attach audio")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer2 = wx.BoxSizer(wx.HORIZONTAL) - self.play = wx.Button(panel, -1, _(u"&Play")) - self.play.Disable() - self.pause = wx.Button(panel, -1, _(u"&Pause")) - self.pause.Disable() - self.record = wx.Button(panel, -1, _(u"&Record")) - self.record.SetFocus() - self.attach_exists = wx.Button(panel, -1, _(u"&Add an existing file")) - self.discard = wx.Button(panel, -1, _(u"&Discard")) - self.discard.Disable() - label = wx.StaticText(panel, -1, _(u"Upload to")) - self.services = wx.ComboBox(panel, -1, choices=services, value=services[0], style=wx.CB_READONLY) - servicesBox = wx.BoxSizer(wx.HORIZONTAL) - servicesBox.Add(label, 0, wx.ALL, 5) - servicesBox.Add(self.services, 0, wx.ALL, 5) - self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach")) - self.attach.Disable() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Cancel")) - btnSizer.Add(self.play, 0, wx.ALL, 5) - btnSizer.Add(self.pause, 0, wx.ALL, 5) - btnSizer.Add(self.record, 0, wx.ALL, 5) - btnSizer2.Add(self.attach_exists, 0, wx.ALL, 5) - btnSizer2.Add(self.discard, 0, wx.ALL, 5) - btnSizer2.Add(self.attach, 0, wx.ALL, 5) - btnSizer2.Add(cancel, 0, wx.ALL, 5) - sizer.Add(servicesBox, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - sizer.Add(btnSizer2, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + self.play = wx.Button(panel, -1, _(u"&Play")) + self.play.Disable() + self.pause = wx.Button(panel, -1, _(u"&Pause")) + self.pause.Disable() + self.record = wx.Button(panel, -1, _(u"&Record")) + self.record.SetFocus() + self.attach_exists = wx.Button(panel, -1, _(u"&Add an existing file")) + self.discard = wx.Button(panel, -1, _(u"&Discard")) + self.discard.Disable() + label = wx.StaticText(panel, -1, _(u"Upload to")) + self.services = wx.ComboBox(panel, -1, choices=services, value=services[0], style=wx.CB_READONLY) + servicesBox = wx.BoxSizer(wx.HORIZONTAL) + servicesBox.Add(label, 0, wx.ALL, 5) + servicesBox.Add(self.services, 0, wx.ALL, 5) + self.attach = wx.Button(panel, wx.ID_OK, _(u"Attach")) + self.attach.Disable() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Cancel")) + btnSizer.Add(self.play, 0, wx.ALL, 5) + btnSizer.Add(self.pause, 0, wx.ALL, 5) + btnSizer.Add(self.record, 0, wx.ALL, 5) + btnSizer2.Add(self.attach_exists, 0, wx.ALL, 5) + btnSizer2.Add(self.discard, 0, wx.ALL, 5) + btnSizer2.Add(self.attach, 0, wx.ALL, 5) + btnSizer2.Add(cancel, 0, wx.ALL, 5) + sizer.Add(servicesBox, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + sizer.Add(btnSizer2, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def enable_control(self, control): - log.debug("Enabling control %s" % (control,)) - if hasattr(self, control): - getattr(self, control).Enable() + def enable_control(self, control): + log.debug("Enabling control %s" % (control,)) + if hasattr(self, control): + getattr(self, control).Enable() - def disable_control(self, control): - log.debug("Disabling control %s" % (control,)) - if hasattr(self, control): - getattr(self, control).Disable() + def disable_control(self, control): + log.debug("Disabling control %s" % (control,)) + if hasattr(self, control): + getattr(self, control).Disable() - def get_file(self): - openFileDialog = wx.FileDialog(self, _(u"Select the audio file to be uploaded"), "", "", _("Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return False - return openFileDialog.GetPath() + def get_file(self): + openFileDialog = wx.FileDialog(self, _(u"Select the audio file to be uploaded"), "", "", _("Audio Files (*.mp3, *.ogg, *.wav)|*.mp3; *.ogg; *.wav"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return False + return openFileDialog.GetPath() diff --git a/src/extra/SoundsTutorial/gtk_ui.py b/src/extra/SoundsTutorial/gtk_ui.py index 450498a5..a5ffab02 100644 --- a/src/extra/SoundsTutorial/gtk_ui.py +++ b/src/extra/SoundsTutorial/gtk_ui.py @@ -4,23 +4,23 @@ from gi.repository import Gtk import widgetUtils class soundsTutorialDialog(Gtk.Dialog): - def __init__(self, actions): - super(soundsTutorialDialog, self).__init__("Sounds tutorial", None, 0, (Gtk.STOCK_CANCEL, widgetUtils.CANCEL)) - box = self.get_content_area() - label = Gtk.Label("Press enter for listen the sound") - self.list = widgetUtils.list("Action") - self.populate_actions(actions) - lBox = Gtk.Box(spacing=6) - lBox.add(label) - lBox.add(self.list.list) - box.add(lBox) - self.play = Gtk.Button("Play") - box.add(self.play) - self.show_all() + def __init__(self, actions): + super(soundsTutorialDialog, self).__init__("Sounds tutorial", None, 0, (Gtk.STOCK_CANCEL, widgetUtils.CANCEL)) + box = self.get_content_area() + label = Gtk.Label("Press enter for listen the sound") + self.list = widgetUtils.list("Action") + self.populate_actions(actions) + lBox = Gtk.Box(spacing=6) + lBox.add(label) + lBox.add(self.list.list) + box.add(lBox) + self.play = Gtk.Button("Play") + box.add(self.play) + self.show_all() - def populate_actions(self, actions): - for i in actions: - self.list.insert_item(i) + def populate_actions(self, actions): + for i in actions: + self.list.insert_item(i) - def get_selected(self): - return self.list.get_selected() \ No newline at end of file + def get_selected(self): + return self.list.get_selected() diff --git a/src/extra/SoundsTutorial/reverse_sort.py b/src/extra/SoundsTutorial/reverse_sort.py index 1094113e..27711174 100644 --- a/src/extra/SoundsTutorial/reverse_sort.py +++ b/src/extra/SoundsTutorial/reverse_sort.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals +from __future__ import unicode_literals #Reverse sort, by Bill Dengler for use in TWBlue http://twblue.es def invert_tuples(t): "Invert a list of tuples, so that the 0th element becomes the -1th, and the -1th becomes the 0th." @@ -9,4 +9,4 @@ def invert_tuples(t): def reverse_sort(t): "Sorts a list of tuples/lists by their last elements, not their first." - return invert_tuples(sorted(invert_tuples(t))) \ No newline at end of file + return invert_tuples(sorted(invert_tuples(t))) diff --git a/src/extra/SoundsTutorial/soundsTutorial.py b/src/extra/SoundsTutorial/soundsTutorial.py index 58b23590..4e679b1c 100644 --- a/src/extra/SoundsTutorial/soundsTutorial.py +++ b/src/extra/SoundsTutorial/soundsTutorial.py @@ -10,28 +10,28 @@ import logging log = logging.getLogger("extra.SoundsTutorial.soundsTutorial") from . import soundsTutorial_constants if platform.system() == "Windows": - from . import wx_ui as UI + from . import wx_ui as UI elif platform.system() == "Linux": - from . import gtk_ui as UI + from . import gtk_ui as UI class soundsTutorial(object): - def __init__(self, sessionObject): - log.debug("Creating sounds tutorial object...") - super(soundsTutorial, self).__init__() - self.session = sessionObject - self.actions = [] - log.debug("Loading actions for sounds tutorial...") - [self.actions.append(i[1]) for i in soundsTutorial_constants.actions] - self.files = [] - log.debug("Searching sound files...") - [self.files.append(i[0]) for i in soundsTutorial_constants.actions] - log.debug("Creating dialog...") - self.dialog = UI.soundsTutorialDialog(self.actions) - widgetUtils.connect_event(self.dialog.play, widgetUtils.BUTTON_PRESSED, self.on_play) - self.dialog.get_response() + def __init__(self, sessionObject): + log.debug("Creating sounds tutorial object...") + super(soundsTutorial, self).__init__() + self.session = sessionObject + self.actions = [] + log.debug("Loading actions for sounds tutorial...") + [self.actions.append(i[1]) for i in soundsTutorial_constants.actions] + self.files = [] + log.debug("Searching sound files...") + [self.files.append(i[0]) for i in soundsTutorial_constants.actions] + log.debug("Creating dialog...") + self.dialog = UI.soundsTutorialDialog(self.actions) + widgetUtils.connect_event(self.dialog.play, widgetUtils.BUTTON_PRESSED, self.on_play) + self.dialog.get_response() - def on_play(self, *args, **kwargs): - try: - self.session.sound.play(self.files[self.dialog.get_selection()]+".ogg") - except: - log.exception("Error playing the %s sound" % (self.files[self.dialog.items.GetSelection()],)) \ No newline at end of file + def on_play(self, *args, **kwargs): + try: + self.session.sound.play(self.files[self.dialog.get_selection()]+".ogg") + except: + log.exception("Error playing the %s sound" % (self.files[self.dialog.items.GetSelection()],)) diff --git a/src/extra/SoundsTutorial/soundsTutorial_constants.py b/src/extra/SoundsTutorial/soundsTutorial_constants.py index e28612dc..536add4d 100644 --- a/src/extra/SoundsTutorial/soundsTutorial_constants.py +++ b/src/extra/SoundsTutorial/soundsTutorial_constants.py @@ -5,27 +5,27 @@ from __future__ import unicode_literals from . import reverse_sort import application actions = reverse_sort.reverse_sort([ ("audio", _(u"Audio tweet.")), - ("create_timeline", _(u"User timeline buffer created.")), - ("delete_timeline", _(u"Buffer destroied.")), - ("dm_received", _(u"Direct message received.")), - ("dm_sent", _(u"Direct message sent.")), - ("error", _(u"Error.")), - ("favourite", _(u"Tweet liked.")), - ("favourites_timeline_updated", _(u"Likes buffer updated.")), - ("geo", _(u"Geotweet.")), -("image", _("Tweet contains one or more images")), -("limit", _(u"Boundary reached.")), - ("list_tweet", _(u"List updated.")), - ("max_length", _(u"Too many characters.")), - ("mention_received", _(u"Mention received.")), - ("new_event", _(u"New event.")), - ("ready", _(u"{0} is ready.").format(application.name,)), - ("reply_send", _(u"Mention sent.")), - ("retweet_send", _(u"Tweet retweeted.")), - ("search_updated", _(u"Search buffer updated.")), - ("tweet_received", _(u"Tweet received.")), - ("tweet_send", _(u"Tweet sent.")), - ("trends_updated", _(u"Trending topics buffer updated.")), - ("tweet_timeline", _(u"New tweet in user timeline buffer.")), - ("update_followers", _(u"New follower.")), - ("volume_changed", _(u"Volume changed."))]) + ("create_timeline", _(u"User timeline buffer created.")), + ("delete_timeline", _(u"Buffer destroied.")), + ("dm_received", _(u"Direct message received.")), + ("dm_sent", _(u"Direct message sent.")), + ("error", _(u"Error.")), + ("favourite", _(u"Tweet liked.")), + ("favourites_timeline_updated", _(u"Likes buffer updated.")), + ("geo", _(u"Geotweet.")), + ("image", _("Tweet contains one or more images")), + ("limit", _(u"Boundary reached.")), + ("list_tweet", _(u"List updated.")), + ("max_length", _(u"Too many characters.")), + ("mention_received", _(u"Mention received.")), + ("new_event", _(u"New event.")), + ("ready", _(u"{0} is ready.").format(application.name,)), + ("reply_send", _(u"Mention sent.")), + ("retweet_send", _(u"Tweet retweeted.")), + ("search_updated", _(u"Search buffer updated.")), + ("tweet_received", _(u"Tweet received.")), + ("tweet_send", _(u"Tweet sent.")), + ("trends_updated", _(u"Trending topics buffer updated.")), + ("tweet_timeline", _(u"New tweet in user timeline buffer.")), + ("update_followers", _(u"New follower.")), + ("volume_changed", _(u"Volume changed."))]) diff --git a/src/extra/SoundsTutorial/wx_ui.py b/src/extra/SoundsTutorial/wx_ui.py index ac2b0373..ebb6caf9 100644 --- a/src/extra/SoundsTutorial/wx_ui.py +++ b/src/extra/SoundsTutorial/wx_ui.py @@ -4,27 +4,27 @@ import wx import widgetUtils class soundsTutorialDialog(widgetUtils.BaseDialog): - def __init__(self, actions): - super(soundsTutorialDialog, self).__init__(None, -1) - self.SetTitle(_(u"Sounds tutorial")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - label = wx.StaticText(panel, -1, _(u"Press enter to listen to the sound for the selected event")) - self.items = wx.ListBox(panel, 1, choices=actions, style=wx.LB_SINGLE) - self.items.SetSelection(0) - listBox = wx.BoxSizer(wx.HORIZONTAL) - listBox.Add(label) - listBox.Add(self.items) - self.play = wx.Button(panel, 1, (u"Play")) - self.play.SetDefault() - close = wx.Button(panel, wx.ID_CANCEL) - btnBox = wx.BoxSizer(wx.HORIZONTAL) - btnBox.Add(self.play) - btnBox.Add(close) - sizer.Add(listBox) - sizer.Add(btnBox) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self, actions): + super(soundsTutorialDialog, self).__init__(None, -1) + self.SetTitle(_(u"Sounds tutorial")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(panel, -1, _(u"Press enter to listen to the sound for the selected event")) + self.items = wx.ListBox(panel, 1, choices=actions, style=wx.LB_SINGLE) + self.items.SetSelection(0) + listBox = wx.BoxSizer(wx.HORIZONTAL) + listBox.Add(label) + listBox.Add(self.items) + self.play = wx.Button(panel, 1, (u"Play")) + self.play.SetDefault() + close = wx.Button(panel, wx.ID_CANCEL) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(self.play) + btnBox.Add(close) + sizer.Add(listBox) + sizer.Add(btnBox) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def get_selection(self): - return self.items.GetSelection() \ No newline at end of file + def get_selection(self): + return self.items.GetSelection() diff --git a/src/extra/SpellChecker/__init__.py b/src/extra/SpellChecker/__init__.py index f1eb69de..cf120537 100644 --- a/src/extra/SpellChecker/__init__.py +++ b/src/extra/SpellChecker/__init__.py @@ -3,4 +3,4 @@ from __future__ import unicode_literals from . import spellchecker import platform if platform.system() == "Windows": - from .wx_ui import * \ No newline at end of file + from .wx_ui import * diff --git a/src/extra/SpellChecker/spellchecker.py b/src/extra/SpellChecker/spellchecker.py index f8b1bec4..29bf2512 100644 --- a/src/extra/SpellChecker/spellchecker.py +++ b/src/extra/SpellChecker/spellchecker.py @@ -19,69 +19,69 @@ from enchant import tokenize log = logging.getLogger("extra.SpellChecker.spellChecker") class spellChecker(object): - def __init__(self, text, dictionary): - super(spellChecker, self).__init__() - # Set Dictionary path if not set in a previous call to this method. - # Dictionary path will be located in user config, see https://github.com/manuelcortez/twblue/issues/208 + def __init__(self, text, dictionary): + super(spellChecker, self).__init__() + # Set Dictionary path if not set in a previous call to this method. + # Dictionary path will be located in user config, see https://github.com/manuelcortez/twblue/issues/208 # dict_path = enchant.get_param("enchant.myspell.dictionary.path") # if dict_path == None: # enchant.set_param("enchant.myspell.dictionary.path", os.path.join(paths.config_path(), "dicts")) # log.debug("Dictionary path set to %s" % (os.path.join(paths.config_path(), "dicts"),)) - log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,)) - self.active = True - try: - if config.app["app-settings"]["language"] == "system": - log.debug("Using the system language") - self.dict = enchant.DictWithPWL(languageHandler.curLang[:2], os.path.join(paths.config_path(), "wordlist.dict")) - else: - log.debug("Using language: %s" % (languageHandler.getLanguage(),)) - self.dict = enchant.DictWithPWL(languageHandler.getLanguage()[:2], os.path.join(paths.config_path(), "wordlist.dict")) - except DictNotFoundError: - log.exception("Dictionary for language %s not found." % (dictionary,)) - wx_ui.dict_not_found_error() - self.active = False - self.checker = SpellChecker(self.dict, filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter]) - self.checker.set_text(text) - if self.active == True: - log.debug("Creating dialog...") - self.dialog = wx_ui.spellCheckerDialog() - widgetUtils.connect_event(self.dialog.ignore, widgetUtils.BUTTON_PRESSED, self.ignore) - widgetUtils.connect_event(self.dialog.ignoreAll, widgetUtils.BUTTON_PRESSED, self.ignoreAll) - widgetUtils.connect_event(self.dialog.replace, widgetUtils.BUTTON_PRESSED, self.replace) - widgetUtils.connect_event(self.dialog.replaceAll, widgetUtils.BUTTON_PRESSED, self.replaceAll) - widgetUtils.connect_event(self.dialog.add, widgetUtils.BUTTON_PRESSED, self.add) - self.check() - self.dialog.get_response() - self.fixed_text = self.checker.get_text() + log.debug("Creating the SpellChecker object. Dictionary: %s" % (dictionary,)) + self.active = True + try: + if config.app["app-settings"]["language"] == "system": + log.debug("Using the system language") + self.dict = enchant.DictWithPWL(languageHandler.curLang[:2], os.path.join(paths.config_path(), "wordlist.dict")) + else: + log.debug("Using language: %s" % (languageHandler.getLanguage(),)) + self.dict = enchant.DictWithPWL(languageHandler.getLanguage()[:2], os.path.join(paths.config_path(), "wordlist.dict")) + except DictNotFoundError: + log.exception("Dictionary for language %s not found." % (dictionary,)) + wx_ui.dict_not_found_error() + self.active = False + self.checker = SpellChecker(self.dict, filters=[twitterFilter.TwitterFilter, tokenize.EmailFilter, tokenize.URLFilter]) + self.checker.set_text(text) + if self.active == True: + log.debug("Creating dialog...") + self.dialog = wx_ui.spellCheckerDialog() + widgetUtils.connect_event(self.dialog.ignore, widgetUtils.BUTTON_PRESSED, self.ignore) + widgetUtils.connect_event(self.dialog.ignoreAll, widgetUtils.BUTTON_PRESSED, self.ignoreAll) + widgetUtils.connect_event(self.dialog.replace, widgetUtils.BUTTON_PRESSED, self.replace) + widgetUtils.connect_event(self.dialog.replaceAll, widgetUtils.BUTTON_PRESSED, self.replaceAll) + widgetUtils.connect_event(self.dialog.add, widgetUtils.BUTTON_PRESSED, self.add) + self.check() + self.dialog.get_response() + self.fixed_text = self.checker.get_text() - def check(self): - try: - next(self.checker) - textToSay = _(u"Misspelled word: %s") % (self.checker.word,) - context = u"... %s %s %s" % (self.checker.leading_context(10), self.checker.word, self.checker.trailing_context(10)) - self.dialog.set_title(textToSay) - output.speak(textToSay) - self.dialog.set_word_and_suggestions(word=self.checker.word, context=context, suggestions=self.checker.suggest()) - except StopIteration: - log.debug("Process finished.") - wx_ui.finished() - self.dialog.Destroy() + def check(self): + try: + next(self.checker) + textToSay = _(u"Misspelled word: %s") % (self.checker.word,) + context = u"... %s %s %s" % (self.checker.leading_context(10), self.checker.word, self.checker.trailing_context(10)) + self.dialog.set_title(textToSay) + output.speak(textToSay) + self.dialog.set_word_and_suggestions(word=self.checker.word, context=context, suggestions=self.checker.suggest()) + except StopIteration: + log.debug("Process finished.") + wx_ui.finished() + self.dialog.Destroy() - def ignore(self, ev): - self.check() + def ignore(self, ev): + self.check() - def ignoreAll(self, ev): - self.checker.ignore_always(word=self.checker.word) - self.check() + def ignoreAll(self, ev): + self.checker.ignore_always(word=self.checker.word) + self.check() - def replace(self, ev): - self.checker.replace(self.dialog.get_selected_suggestion()) - self.check() + def replace(self, ev): + self.checker.replace(self.dialog.get_selected_suggestion()) + self.check() - def replaceAll(self, ev): - self.checker.replace_always(self.dialog.get_selected_suggestion()) - self.check() + def replaceAll(self, ev): + self.checker.replace_always(self.dialog.get_selected_suggestion()) + self.check() - def add(self, ev): - self.checker.add() - self.check() + def add(self, ev): + self.checker.add() + self.check() diff --git a/src/extra/SpellChecker/wx_ui.py b/src/extra/SpellChecker/wx_ui.py index 3a13e9f1..9c7159fd 100644 --- a/src/extra/SpellChecker/wx_ui.py +++ b/src/extra/SpellChecker/wx_ui.py @@ -21,63 +21,63 @@ import wx import application class spellCheckerDialog(wx.Dialog): - def __init__(self): - super(spellCheckerDialog, self).__init__(None, 1) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - word = wx.StaticText(panel, -1, _(u"Misspelled word")) - self.word = wx.TextCtrl(panel, -1) - wordBox = wx.BoxSizer(wx.HORIZONTAL) - wordBox.Add(word, 0, wx.ALL, 5) - wordBox.Add(self.word, 0, wx.ALL, 5) - context = wx.StaticText(panel, -1, _(u"Context")) - self.context = wx.TextCtrl(panel, -1) - contextBox = wx.BoxSizer(wx.HORIZONTAL) - contextBox.Add(context, 0, wx.ALL, 5) - contextBox.Add(self.context, 0, wx.ALL, 5) - suggest = wx.StaticText(panel, -1, _(u"Suggestions")) - self.suggestions = wx.ListBox(panel, -1, choices=[], style=wx.LB_SINGLE) - suggestionsBox = wx.BoxSizer(wx.HORIZONTAL) - suggestionsBox.Add(suggest, 0, wx.ALL, 5) - suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5) - self.ignore = wx.Button(panel, -1, _(u"&Ignore")) - self.ignoreAll = wx.Button(panel, -1, _(u"I&gnore all")) - self.replace = wx.Button(panel, -1, _(u"&Replace")) - self.replaceAll = wx.Button(panel, -1, _(u"R&eplace all")) - self.add = wx.Button(panel, -1, _(u"&Add to personal dictionary")) - close = wx.Button(panel, wx.ID_CANCEL) - btnBox = wx.BoxSizer(wx.HORIZONTAL) - btnBox.Add(self.ignore, 0, wx.ALL, 5) - btnBox.Add(self.ignoreAll, 0, wx.ALL, 5) - btnBox.Add(self.replace, 0, wx.ALL, 5) - btnBox.Add(self.replaceAll, 0, wx.ALL, 5) - btnBox.Add(self.add, 0, wx.ALL, 5) - btnBox.Add(close, 0, wx.ALL, 5) - sizer.Add(wordBox, 0, wx.ALL, 5) - sizer.Add(contextBox, 0, wx.ALL, 5) - sizer.Add(suggestionsBox, 0, wx.ALL, 5) - sizer.Add(btnBox, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(spellCheckerDialog, self).__init__(None, 1) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + word = wx.StaticText(panel, -1, _(u"Misspelled word")) + self.word = wx.TextCtrl(panel, -1) + wordBox = wx.BoxSizer(wx.HORIZONTAL) + wordBox.Add(word, 0, wx.ALL, 5) + wordBox.Add(self.word, 0, wx.ALL, 5) + context = wx.StaticText(panel, -1, _(u"Context")) + self.context = wx.TextCtrl(panel, -1) + contextBox = wx.BoxSizer(wx.HORIZONTAL) + contextBox.Add(context, 0, wx.ALL, 5) + contextBox.Add(self.context, 0, wx.ALL, 5) + suggest = wx.StaticText(panel, -1, _(u"Suggestions")) + self.suggestions = wx.ListBox(panel, -1, choices=[], style=wx.LB_SINGLE) + suggestionsBox = wx.BoxSizer(wx.HORIZONTAL) + suggestionsBox.Add(suggest, 0, wx.ALL, 5) + suggestionsBox.Add(self.suggestions, 0, wx.ALL, 5) + self.ignore = wx.Button(panel, -1, _(u"&Ignore")) + self.ignoreAll = wx.Button(panel, -1, _(u"I&gnore all")) + self.replace = wx.Button(panel, -1, _(u"&Replace")) + self.replaceAll = wx.Button(panel, -1, _(u"R&eplace all")) + self.add = wx.Button(panel, -1, _(u"&Add to personal dictionary")) + close = wx.Button(panel, wx.ID_CANCEL) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(self.ignore, 0, wx.ALL, 5) + btnBox.Add(self.ignoreAll, 0, wx.ALL, 5) + btnBox.Add(self.replace, 0, wx.ALL, 5) + btnBox.Add(self.replaceAll, 0, wx.ALL, 5) + btnBox.Add(self.add, 0, wx.ALL, 5) + btnBox.Add(close, 0, wx.ALL, 5) + sizer.Add(wordBox, 0, wx.ALL, 5) + sizer.Add(contextBox, 0, wx.ALL, 5) + sizer.Add(suggestionsBox, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def get_response(self): - return self.ShowModal() + def get_response(self): + return self.ShowModal() - def set_title(self, title): - return self.SetTitle(title) + def set_title(self, title): + return self.SetTitle(title) - def set_word_and_suggestions(self, word, context, suggestions): - self.word.SetValue(word) - self.context.ChangeValue(context) - self.suggestions.Set(suggestions) - self.suggestions.SetFocus() + def set_word_and_suggestions(self, word, context, suggestions): + self.word.SetValue(word) + self.context.ChangeValue(context) + self.suggestions.Set(suggestions) + self.suggestions.SetFocus() - def get_selected_suggestion(self): - return self.suggestions.GetStringSelection() + def get_selected_suggestion(self): + return self.suggestions.GetStringSelection() def dict_not_found_error(): - wx.MessageDialog(None, _(u"An error has occurred. There are no dictionaries available for the selected language in {0}").format(application.name,), _(u"Error"), wx.ICON_ERROR).ShowModal() + wx.MessageDialog(None, _(u"An error has occurred. There are no dictionaries available for the selected language in {0}").format(application.name,), _(u"Error"), wx.ICON_ERROR).ShowModal() def finished(): - wx.MessageDialog(None, _(u"Spell check complete."), application.name, style=wx.OK).ShowModal() + wx.MessageDialog(None, _(u"Spell check complete."), application.name, style=wx.OK).ShowModal() diff --git a/src/extra/autocompletionUsers/__init__.py b/src/extra/autocompletionUsers/__init__.py index cceb68cc..7a307a5e 100644 --- a/src/extra/autocompletionUsers/__init__.py +++ b/src/extra/autocompletionUsers/__init__.py @@ -2,4 +2,4 @@ from __future__ import absolute_import from __future__ import unicode_literals # -*- coding: utf-8 -*- -from . import completion, settings \ No newline at end of file +from . import completion, settings diff --git a/src/extra/autocompletionUsers/completion.py b/src/extra/autocompletionUsers/completion.py index 25875d8c..826dc699 100644 --- a/src/extra/autocompletionUsers/completion.py +++ b/src/extra/autocompletionUsers/completion.py @@ -4,44 +4,44 @@ from . import storage from . import wx_menu class autocompletionUsers(object): - def __init__(self, window, session_id): - super(autocompletionUsers, self).__init__() - self.window = window - self.db = storage.storage(session_id) + def __init__(self, window, session_id): + super(autocompletionUsers, self).__init__() + self.window = window + self.db = storage.storage(session_id) - def show_menu(self, mode="tweet"): - position = self.window.get_position() - if mode == "tweet": - text = self.window.get_text() - text = text[:position] - try: - pattern = text.split()[-1] - except IndexError: - output.speak(_(u"You have to start writing")) - return - if pattern.startswith("@") == True: - menu = wx_menu.menu(self.window.text, pattern[1:], mode=mode) - users = self.db.get_users(pattern[1:]) - if len(users) > 0: - menu.append_options(users) - self.window.popup_menu(menu) - menu.destroy() - else: - output.speak(_(u"There are no results in your users database")) - else: - output.speak(_(u"Autocompletion only works for users.")) - elif mode == "dm": - text = self.window.get_user() - try: - pattern = text.split()[-1] - except IndexError: - output.speak(_(u"You have to start writing")) - return - menu = wx_menu.menu(self.window.cb, pattern, mode=mode) - users = self.db.get_users(pattern) - if len(users) > 0: - menu.append_options(users) - self.window.popup_menu(menu) - menu.destroy() - else: - output.speak(_(u"There are no results in your users database")) \ No newline at end of file + def show_menu(self, mode="tweet"): + position = self.window.get_position() + if mode == "tweet": + text = self.window.get_text() + text = text[:position] + try: + pattern = text.split()[-1] + except IndexError: + output.speak(_(u"You have to start writing")) + return + if pattern.startswith("@") == True: + menu = wx_menu.menu(self.window.text, pattern[1:], mode=mode) + users = self.db.get_users(pattern[1:]) + if len(users) > 0: + menu.append_options(users) + self.window.popup_menu(menu) + menu.destroy() + else: + output.speak(_(u"There are no results in your users database")) + else: + output.speak(_(u"Autocompletion only works for users.")) + elif mode == "dm": + text = self.window.get_user() + try: + pattern = text.split()[-1] + except IndexError: + output.speak(_(u"You have to start writing")) + return + menu = wx_menu.menu(self.window.cb, pattern, mode=mode) + users = self.db.get_users(pattern) + if len(users) > 0: + menu.append_options(users) + self.window.popup_menu(menu) + menu.destroy() + else: + output.speak(_(u"There are no results in your users database")) diff --git a/src/extra/autocompletionUsers/manage.py b/src/extra/autocompletionUsers/manage.py index ae7dd957..1d724e4f 100644 --- a/src/extra/autocompletionUsers/manage.py +++ b/src/extra/autocompletionUsers/manage.py @@ -4,39 +4,39 @@ from . import storage, wx_manage from wxUI import commonMessageDialogs class autocompletionManage(object): - def __init__(self, session): - super(autocompletionManage, self).__init__() - self.session = session - self.dialog = wx_manage.autocompletionManageDialog() - self.database = storage.storage(self.session.session_id) - self.users = self.database.get_all_users() - self.dialog.put_users(self.users) - widgetUtils.connect_event(self.dialog.add, widgetUtils.BUTTON_PRESSED, self.add_user) - widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_user) - self.dialog.get_response() + def __init__(self, session): + super(autocompletionManage, self).__init__() + self.session = session + self.dialog = wx_manage.autocompletionManageDialog() + self.database = storage.storage(self.session.session_id) + self.users = self.database.get_all_users() + self.dialog.put_users(self.users) + widgetUtils.connect_event(self.dialog.add, widgetUtils.BUTTON_PRESSED, self.add_user) + widgetUtils.connect_event(self.dialog.remove, widgetUtils.BUTTON_PRESSED, self.remove_user) + self.dialog.get_response() - def update_list(self): - item = self.dialog.users.get_selected() - self.dialog.users.clear() - self.users = self.database.get_all_users() - self.dialog.put_users(self.users) - self.dialog.users.select_item(item) + def update_list(self): + item = self.dialog.users.get_selected() + self.dialog.users.clear() + self.users = self.database.get_all_users() + self.dialog.put_users(self.users) + self.dialog.users.select_item(item) - def add_user(self, *args, **kwargs): - usr = self.dialog.get_user() - if usr == False: - return - try: - data = self.session.twitter.twitter.get_user(screen_name=usr) - except: - self.dialog.show_invalid_user_error() - return - self.database.set_user(data.screen_name, data.name, 0) - self.update_list() + def add_user(self, *args, **kwargs): + usr = self.dialog.get_user() + if usr == False: + return + try: + data = self.session.twitter.twitter.get_user(screen_name=usr) + except: + self.dialog.show_invalid_user_error() + return + self.database.set_user(data.screen_name, data.name, 0) + self.update_list() - def remove_user(self, ev): - if commonMessageDialogs.delete_user_from_db() == widgetUtils.YES: - item = self.dialog.users.get_selected() - user = self.users[item] - self.database.remove_user(user[0]) - self.update_list() \ No newline at end of file + def remove_user(self, ev): + if commonMessageDialogs.delete_user_from_db() == widgetUtils.YES: + item = self.dialog.users.get_selected() + user = self.users[item] + self.database.remove_user(user[0]) + self.update_list() diff --git a/src/extra/autocompletionUsers/settings.py b/src/extra/autocompletionUsers/settings.py index 283c217c..d875fb0d 100644 --- a/src/extra/autocompletionUsers/settings.py +++ b/src/extra/autocompletionUsers/settings.py @@ -7,53 +7,53 @@ from . import storage from mysc.thread_utils import call_threaded class autocompletionSettings(object): - def __init__(self, config, buffer, window): - super(autocompletionSettings, self).__init__() - self.config = config - self.buffer = buffer - self.window = window - self.dialog = wx_settings.autocompletionSettingsDialog() - self.dialog.set("friends_buffer", self.config["mysc"]["save_friends_in_autocompletion_db"]) - self.dialog.set("followers_buffer", self.config["mysc"]["save_followers_in_autocompletion_db"]) - widgetUtils.connect_event(self.dialog.viewList, widgetUtils.BUTTON_PRESSED, self.view_list) - if self.dialog.get_response() == widgetUtils.OK: - call_threaded(self.add_users_to_database) + def __init__(self, config, buffer, window): + super(autocompletionSettings, self).__init__() + self.config = config + self.buffer = buffer + self.window = window + self.dialog = wx_settings.autocompletionSettingsDialog() + self.dialog.set("friends_buffer", self.config["mysc"]["save_friends_in_autocompletion_db"]) + self.dialog.set("followers_buffer", self.config["mysc"]["save_followers_in_autocompletion_db"]) + widgetUtils.connect_event(self.dialog.viewList, widgetUtils.BUTTON_PRESSED, self.view_list) + if self.dialog.get_response() == widgetUtils.OK: + call_threaded(self.add_users_to_database) - def add_users_to_database(self): - self.config["mysc"]["save_friends_in_autocompletion_db"] = self.dialog.get("friends_buffer") - self.config["mysc"]["save_followers_in_autocompletion_db"] = self.dialog.get("followers_buffer") - output.speak(_(u"Updating database... You can close this window now. A message will tell you when the process finishes.")) - database = storage.storage(self.buffer.session.session_id) - if self.dialog.get("followers_buffer") == True: - buffer = self.window.search_buffer("followers", self.config["twitter"]["user_name"]) - for i in buffer.session.db[buffer.name]: - database.set_user(i.screen_name, i.name, 1) - else: - database.remove_by_buffer(1) - if self.dialog.get("friends_buffer") == True: - buffer = self.window.search_buffer("friends", self.config["twitter"]["user_name"]) - for i in buffer.session.db[buffer.name]: - database.set_user(i.screen_name, i.name, 2) - else: - database.remove_by_buffer(2) - wx_settings.show_success_dialog() - self.dialog.destroy() - - def view_list(self, ev): - q = manage.autocompletionManage(self.buffer.session) + def add_users_to_database(self): + self.config["mysc"]["save_friends_in_autocompletion_db"] = self.dialog.get("friends_buffer") + self.config["mysc"]["save_followers_in_autocompletion_db"] = self.dialog.get("followers_buffer") + output.speak(_(u"Updating database... You can close this window now. A message will tell you when the process finishes.")) + database = storage.storage(self.buffer.session.session_id) + if self.dialog.get("followers_buffer") == True: + buffer = self.window.search_buffer("followers", self.config["twitter"]["user_name"]) + for i in buffer.session.db[buffer.name]: + database.set_user(i.screen_name, i.name, 1) + else: + database.remove_by_buffer(1) + if self.dialog.get("friends_buffer") == True: + buffer = self.window.search_buffer("friends", self.config["twitter"]["user_name"]) + for i in buffer.session.db[buffer.name]: + database.set_user(i.screen_name, i.name, 2) + else: + database.remove_by_buffer(2) + wx_settings.show_success_dialog() + self.dialog.destroy() + + def view_list(self, ev): + q = manage.autocompletionManage(self.buffer.session) def execute_at_startup(window, buffer, config): - database = storage.storage(buffer.session.session_id) - if config["mysc"]["save_followers_in_autocompletion_db"] == True and config["other_buffers"]["show_followers"] == True: - buffer = window.search_buffer("followers", config["twitter"]["user_name"]) - for i in buffer.session.db[buffer.name]: - database.set_user(i.screen_name, i.name, 1) - else: - database.remove_by_buffer(1) - if config["mysc"]["save_friends_in_autocompletion_db"] == True and config["other_buffers"]["show_friends"] == True: - buffer = window.search_buffer("friends", config["twitter"]["user_name"]) - for i in buffer.session.db[buffer.name]: - database.set_user(i.screen_name, i.name, 2) - else: - database.remove_by_buffer(2) \ No newline at end of file + database = storage.storage(buffer.session.session_id) + if config["mysc"]["save_followers_in_autocompletion_db"] == True and config["other_buffers"]["show_followers"] == True: + buffer = window.search_buffer("followers", config["twitter"]["user_name"]) + for i in buffer.session.db[buffer.name]: + database.set_user(i.screen_name, i.name, 1) + else: + database.remove_by_buffer(1) + if config["mysc"]["save_friends_in_autocompletion_db"] == True and config["other_buffers"]["show_friends"] == True: + buffer = window.search_buffer("friends", config["twitter"]["user_name"]) + for i in buffer.session.db[buffer.name]: + database.set_user(i.screen_name, i.name, 2) + else: + database.remove_by_buffer(2) diff --git a/src/extra/autocompletionUsers/storage.py b/src/extra/autocompletionUsers/storage.py index 4d5df88f..0b56781e 100644 --- a/src/extra/autocompletionUsers/storage.py +++ b/src/extra/autocompletionUsers/storage.py @@ -2,51 +2,51 @@ import os, sqlite3, paths class storage(object): - def __init__(self, session_id): - self.connection = sqlite3.connect(os.path.join(paths.config_path(), "%s/autocompletionUsers.dat" % (session_id))) - self.cursor = self.connection.cursor() - if self.table_exist("users") == False: - self.create_table() + def __init__(self, session_id): + self.connection = sqlite3.connect(os.path.join(paths.config_path(), "%s/autocompletionUsers.dat" % (session_id))) + self.cursor = self.connection.cursor() + if self.table_exist("users") == False: + self.create_table() - def table_exist(self, table): - ask = self.cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='%s'" % (table)) - answer = ask.fetchone() - if answer == None: - return False - else: - return True + def table_exist(self, table): + ask = self.cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='%s'" % (table)) + answer = ask.fetchone() + if answer == None: + return False + else: + return True - def get_all_users(self): - self.cursor.execute("""select * from users""") - return self.cursor.fetchall() + def get_all_users(self): + self.cursor.execute("""select * from users""") + return self.cursor.fetchall() - def get_users(self, term): - self.cursor.execute("""SELECT * FROM users WHERE user LIKE ?""", ('{}%'.format(term),)) - return self.cursor.fetchall() + def get_users(self, term): + self.cursor.execute("""SELECT * FROM users WHERE user LIKE ?""", ('{}%'.format(term),)) + return self.cursor.fetchall() - def set_user(self, screen_name, user_name, from_a_buffer): - self.cursor.execute("""insert or ignore into users values(?, ?, ?)""", (screen_name, user_name, from_a_buffer)) - self.connection.commit() + def set_user(self, screen_name, user_name, from_a_buffer): + self.cursor.execute("""insert or ignore into users values(?, ?, ?)""", (screen_name, user_name, from_a_buffer)) + self.connection.commit() - def remove_user(self, user): - self.cursor.execute("""DELETE FROM users WHERE user = ?""", (user,)) - self.connection.commit() - return self.cursor.fetchone() + def remove_user(self, user): + self.cursor.execute("""DELETE FROM users WHERE user = ?""", (user,)) + self.connection.commit() + return self.cursor.fetchone() - def remove_by_buffer(self, bufferType): - """ Removes all users saved on a buffer. BufferType is 0 for no buffer, 1 for friends and 2 for followers""" - self.cursor.execute("""DELETE FROM users WHERE from_a_buffer = ?""", (bufferType,)) - self.connection.commit() - return self.cursor.fetchone() + def remove_by_buffer(self, bufferType): + """ Removes all users saved on a buffer. BufferType is 0 for no buffer, 1 for friends and 2 for followers""" + self.cursor.execute("""DELETE FROM users WHERE from_a_buffer = ?""", (bufferType,)) + self.connection.commit() + return self.cursor.fetchone() - def create_table(self): - self.cursor.execute(""" + def create_table(self): + self.cursor.execute(""" create table users( user TEXT UNIQUE, name TEXT, from_a_buffer INTEGER )""") - def __del__(self): - self.cursor.close() - self.connection.close() \ No newline at end of file + def __del__(self): + self.cursor.close() + self.connection.close() diff --git a/src/extra/autocompletionUsers/wx_manage.py b/src/extra/autocompletionUsers/wx_manage.py index 3db4de67..6f34a681 100644 --- a/src/extra/autocompletionUsers/wx_manage.py +++ b/src/extra/autocompletionUsers/wx_manage.py @@ -5,40 +5,40 @@ from multiplatform_widgets import widgets import application class autocompletionManageDialog(widgetUtils.BaseDialog): - def __init__(self): - super(autocompletionManageDialog, self).__init__(parent=None, id=-1, title=_(u"Manage Autocompletion database")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - label = wx.StaticText(panel, -1, _(u"Editing {0} users database").format(application.name,)) - self.users = widgets.list(panel, _(u"Username"), _(u"Name"), style=wx.LC_REPORT) - sizer.Add(label, 0, wx.ALL, 5) - sizer.Add(self.users.list, 0, wx.ALL, 5) - self.add = wx.Button(panel, -1, _(u"Add user")) - self.remove = wx.Button(panel, -1, _(u"Remove user")) - optionsBox = wx.BoxSizer(wx.HORIZONTAL) - optionsBox.Add(self.add, 0, wx.ALL, 5) - optionsBox.Add(self.remove, 0, wx.ALL, 5) - sizer.Add(optionsBox, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK) - cancel = wx.Button(panel, wx.ID_CANCEL) - sizerBtn = wx.BoxSizer(wx.HORIZONTAL) - sizerBtn.Add(ok, 0, wx.ALL, 5) - sizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(sizerBtn, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(autocompletionManageDialog, self).__init__(parent=None, id=-1, title=_(u"Manage Autocompletion database")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(panel, -1, _(u"Editing {0} users database").format(application.name,)) + self.users = widgets.list(panel, _(u"Username"), _(u"Name"), style=wx.LC_REPORT) + sizer.Add(label, 0, wx.ALL, 5) + sizer.Add(self.users.list, 0, wx.ALL, 5) + self.add = wx.Button(panel, -1, _(u"Add user")) + self.remove = wx.Button(panel, -1, _(u"Remove user")) + optionsBox = wx.BoxSizer(wx.HORIZONTAL) + optionsBox.Add(self.add, 0, wx.ALL, 5) + optionsBox.Add(self.remove, 0, wx.ALL, 5) + sizer.Add(optionsBox, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK) + cancel = wx.Button(panel, wx.ID_CANCEL) + sizerBtn = wx.BoxSizer(wx.HORIZONTAL) + sizerBtn.Add(ok, 0, wx.ALL, 5) + sizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(sizerBtn, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def put_users(self, users): - for i in users: - j = [i[0], i[1]] - self.users.insert_item(False, *j) + def put_users(self, users): + for i in users: + j = [i[0], i[1]] + self.users.insert_item(False, *j) - def get_user(self): - usr = False - userDlg = wx.TextEntryDialog(None, _(u"Twitter username"), _(u"Add user to database")) - if userDlg.ShowModal() == wx.ID_OK: - usr = userDlg.GetValue() - return usr + def get_user(self): + usr = False + userDlg = wx.TextEntryDialog(None, _(u"Twitter username"), _(u"Add user to database")) + if userDlg.ShowModal() == wx.ID_OK: + usr = userDlg.GetValue() + return usr - def show_invalid_user_error(self): - wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error!"), wx.ICON_ERROR).ShowModal() \ No newline at end of file + def show_invalid_user_error(self): + wx.MessageDialog(None, _(u"The user does not exist"), _(u"Error!"), wx.ICON_ERROR).ShowModal() diff --git a/src/extra/autocompletionUsers/wx_menu.py b/src/extra/autocompletionUsers/wx_menu.py index 55d81458..065ff2a1 100644 --- a/src/extra/autocompletionUsers/wx_menu.py +++ b/src/extra/autocompletionUsers/wx_menu.py @@ -2,24 +2,24 @@ import wx class menu(wx.Menu): - def __init__(self, window, pattern, mode): - super(menu, self).__init__() - self.window = window - self.pattern = pattern - self.mode = mode + def __init__(self, window, pattern, mode): + super(menu, self).__init__() + self.window = window + self.pattern = pattern + self.mode = mode - def append_options(self, options): - for i in options: - item = wx.MenuItem(self, wx.ID_ANY, "%s (@%s)" % (i[1], i[0])) - self.AppendItem(item) - self.Bind(wx.EVT_MENU, lambda evt, temp=i[0]: self.select_text(evt, temp), item) + def append_options(self, options): + for i in options: + item = wx.MenuItem(self, wx.ID_ANY, "%s (@%s)" % (i[1], i[0])) + self.AppendItem(item) + self.Bind(wx.EVT_MENU, lambda evt, temp=i[0]: self.select_text(evt, temp), item) - def select_text(self, ev, text): - if self.mode == "tweet": - self.window.ChangeValue(self.window.GetValue().replace("@"+self.pattern, "@"+text+" ")) - elif self.mode == "dm": - self.window.SetValue(self.window.GetValue().replace(self.pattern, text)) - self.window.SetInsertionPointEnd() + def select_text(self, ev, text): + if self.mode == "tweet": + self.window.ChangeValue(self.window.GetValue().replace("@"+self.pattern, "@"+text+" ")) + elif self.mode == "dm": + self.window.SetValue(self.window.GetValue().replace(self.pattern, text)) + self.window.SetInsertionPointEnd() - def destroy(self): - self.Destroy() \ No newline at end of file + def destroy(self): + self.Destroy() diff --git a/src/extra/autocompletionUsers/wx_settings.py b/src/extra/autocompletionUsers/wx_settings.py index 068decf6..3d635935 100644 --- a/src/extra/autocompletionUsers/wx_settings.py +++ b/src/extra/autocompletionUsers/wx_settings.py @@ -4,24 +4,24 @@ import widgetUtils import application class autocompletionSettingsDialog(widgetUtils.BaseDialog): - def __init__(self): - super(autocompletionSettingsDialog, self).__init__(parent=None, id=-1, title=_(u"Autocomplete users' settings")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.followers_buffer = wx.CheckBox(panel, -1, _(u"Add users from followers buffer")) - self.friends_buffer = wx.CheckBox(panel, -1, _(u"Add users from friends buffer")) - sizer.Add(self.followers_buffer, 0, wx.ALL, 5) - sizer.Add(self.friends_buffer, 0, wx.ALL, 5) - self.viewList = wx.Button(panel, -1, _(u"Manage database...")) - sizer.Add(self.viewList, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK) - cancel = wx.Button(panel, wx.ID_CANCEL) - sizerBtn = wx.BoxSizer(wx.HORIZONTAL) - sizerBtn.Add(ok, 0, wx.ALL, 5) - sizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(sizerBtn, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(autocompletionSettingsDialog, self).__init__(parent=None, id=-1, title=_(u"Autocomplete users' settings")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.followers_buffer = wx.CheckBox(panel, -1, _(u"Add users from followers buffer")) + self.friends_buffer = wx.CheckBox(panel, -1, _(u"Add users from friends buffer")) + sizer.Add(self.followers_buffer, 0, wx.ALL, 5) + sizer.Add(self.friends_buffer, 0, wx.ALL, 5) + self.viewList = wx.Button(panel, -1, _(u"Manage database...")) + sizer.Add(self.viewList, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK) + cancel = wx.Button(panel, wx.ID_CANCEL) + sizerBtn = wx.BoxSizer(wx.HORIZONTAL) + sizerBtn.Add(ok, 0, wx.ALL, 5) + sizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(sizerBtn, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) def show_success_dialog(): - wx.MessageDialog(None, _(u"{0}'s database of users has been updated.").format(application.name,), _(u"Done"), wx.OK).ShowModal() \ No newline at end of file + wx.MessageDialog(None, _(u"{0}'s database of users has been updated.").format(application.name,), _(u"Done"), wx.OK).ShowModal() diff --git a/src/extra/ocr/OCRSpace.py b/src/extra/ocr/OCRSpace.py index ec7e21a1..cee5e7c3 100644 --- a/src/extra/ocr/OCRSpace.py +++ b/src/extra/ocr/OCRSpace.py @@ -9,37 +9,37 @@ short_langs = ["", "da", "du", "en", "fi", "fr", "de", "hu", "ko", "it", "ja", " OcrLangs = ["", "dan", "dut", "eng", "fin", "fre", "ger", "hun", "kor", "ita", "jpn", "pol", "por", "rus", "spa", "tur"] class APIError(Exception): - pass + pass class OCRSpaceAPI(object): - def __init__(self, key="4e72ae996f88957", url='https://api.ocr.space/parse/image'): - self.key = key - self.url = url + def __init__(self, key="4e72ae996f88957", url='https://api.ocr.space/parse/image'): + self.key = key + self.url = url - def OCR_URL(self, url, overlay=False, lang=None): - payload = { - 'url': url, - 'isOverlayRequired': overlay, - 'apikey': self.key, - } - if lang != None: - payload.update(language=lang) - r = requests.post(self.url, data=payload) - result = r.json()['ParsedResults'][0] - if result['ErrorMessage']: - raise APIError(result['ErrorMessage']) - return result + def OCR_URL(self, url, overlay=False, lang=None): + payload = { + 'url': url, + 'isOverlayRequired': overlay, + 'apikey': self.key, + } + if lang != None: + payload.update(language=lang) + r = requests.post(self.url, data=payload) + result = r.json()['ParsedResults'][0] + if result['ErrorMessage']: + raise APIError(result['ErrorMessage']) + return result - def OCR_file(self, fileobj, overlay=False): - payload = { - 'isOverlayRequired': overlay, - 'apikey': self.key, - 'lang': 'es', - } - r = requests.post(self.url, data=payload, files={'file': fileobj}) - results = r.json()['ParsedResults'] - if results[0]['ErrorMessage']: - raise APIError(results[0]['ErrorMessage']) - return results + def OCR_file(self, fileobj, overlay=False): + payload = { + 'isOverlayRequired': overlay, + 'apikey': self.key, + 'lang': 'es', + } + r = requests.post(self.url, data=payload, files={'file': fileobj}) + results = r.json()['ParsedResults'] + if results[0]['ErrorMessage']: + raise APIError(results[0]['ErrorMessage']) + return results diff --git a/src/extra/ocr/__init__.py b/src/extra/ocr/__init__.py index 48e76b1a..5617235f 100644 --- a/src/extra/ocr/__init__.py +++ b/src/extra/ocr/__init__.py @@ -2,4 +2,4 @@ from __future__ import absolute_import from __future__ import unicode_literals # -*- coding: utf-8 -*- -from . import OCRSpace \ No newline at end of file +from . import OCRSpace diff --git a/src/extra/translator/__init__.py b/src/extra/translator/__init__.py index 4b1845ea..07b41a1e 100644 --- a/src/extra/translator/__init__.py +++ b/src/extra/translator/__init__.py @@ -4,5 +4,5 @@ from __future__ import unicode_literals from . import translator import platform if platform.system() == "Windows": - from . import wx_ui as gui - \ No newline at end of file + from . import wx_ui as gui + diff --git a/src/extra/translator/translator.py b/src/extra/translator/translator.py index ae08a4e8..d9bc99dc 100644 --- a/src/extra/translator/translator.py +++ b/src/extra/translator/translator.py @@ -9,108 +9,108 @@ log = logging.getLogger("extras.translator") t = None def translate(text="", target="en"): - global t - log.debug("Received translation request for language %s, text=%s" % (target, text)) - if t == None: - t = Translator() - vars = dict(text=text, dest=target) - return t.translate(**vars).text + global t + log.debug("Received translation request for language %s, text=%s" % (target, text)) + if t == None: + t = Translator() + vars = dict(text=text, dest=target) + return t.translate(**vars).text supported_langs = None languages = { - "af": _(u"Afrikaans"), - "sq": _(u"Albanian"), - "am": _(u"Amharic"), - "ar": _(u"Arabic"), - "hy": _(u"Armenian"), - "az": _(u"Azerbaijani"), - "eu": _(u"Basque"), - "be": _(u"Belarusian"), - "bn": _(u"Bengali"), - "bh": _(u"Bihari"), - "bg": _(u"Bulgarian"), - "my": _(u"Burmese"), - "ca": _(u"Catalan"), - "chr": _(u"Cherokee"), - "zh": _(u"Chinese"), - "zh-CN": _(u"Chinese_simplified"), - "zh-TW": _(u"Chinese_traditional"), - "hr": _(u"Croatian"), - "cs": _(u"Czech"), - "da": _(u"Danish"), - "dv": _(u"Dhivehi"), - "nl": _(u"Dutch"), - "en": _(u"English"), - "eo": _(u"Esperanto"), - "et": _(u"Estonian"), - "tl": _(u"Filipino"), - "fi": _(u"Finnish"), - "fr": _(u"French"), - "gl": _(u"Galician"), - "ka": _(u"Georgian"), - "de": _(u"German"), - "el": _(u"Greek"), - "gn": _(u"Guarani"), - "gu": _(u"Gujarati"), - "iw": _(u"Hebrew"), - "hi": _(u"Hindi"), - "hu": _(u"Hungarian"), - "is": _(u"Icelandic"), - "id": _(u"Indonesian"), - "iu": _(u"Inuktitut"), - "ga": _(u"Irish"), - "it": _(u"Italian"), - "ja": _(u"Japanese"), - "kn": _(u"Kannada"), - "kk": _(u"Kazakh"), - "km": _(u"Khmer"), - "ko": _(u"Korean"), - "ku": _(u"Kurdish"), - "ky": _(u"Kyrgyz"), - "lo": _(u"Laothian"), - "lv": _(u"Latvian"), - "lt": _(u"Lithuanian"), - "mk": _(u"Macedonian"), - "ms": _(u"Malay"), - "ml": _(u"Malayalam"), - "mt": _(u"Maltese"), - "mr": _(u"Marathi"), - "mn": _(u"Mongolian"), - "ne": _(u"Nepali"), - "no": _(u"Norwegian"), - "or": _(u"Oriya"), - "ps": _(u"Pashto"), - "fa": _(u"Persian"), - "pl": _(u"Polish"), - "pt": _(u"Portuguese"), - "pa": _(u"Punjabi"), - "ro": _(u"Romanian"), - "ru": _(u"Russian"), - "sa": _(u"Sanskrit"), - "sr": _(u"Serbian"), - "sd": _(u"Sindhi"), - "si": _(u"Sinhalese"), - "sk": _(u"Slovak"), - "sl": _(u"Slovenian"), - "es": _(u"Spanish"), - "sw": _(u"Swahili"), - "sv": _(u"Swedish"), - "tg": _(u"Tajik"), - "ta": _(u"Tamil"), - "tl": _(u"Tagalog"), - "te": _(u"Telugu"), - "th": _(u"Thai"), - "bo": _(u"Tibetan"), - "tr": _(u"Turkish"), - "uk": _(u"Ukrainian"), - "ur": _(u"Urdu"), - "uz": _(u"Uzbek"), - "ug": _(u"Uighur"), - "vi": _(u"Vietnamese"), - "cy": _(u"Welsh"), - "yi": _(u"Yiddish") + "af": _(u"Afrikaans"), + "sq": _(u"Albanian"), + "am": _(u"Amharic"), + "ar": _(u"Arabic"), + "hy": _(u"Armenian"), + "az": _(u"Azerbaijani"), + "eu": _(u"Basque"), + "be": _(u"Belarusian"), + "bn": _(u"Bengali"), + "bh": _(u"Bihari"), + "bg": _(u"Bulgarian"), + "my": _(u"Burmese"), + "ca": _(u"Catalan"), + "chr": _(u"Cherokee"), + "zh": _(u"Chinese"), + "zh-CN": _(u"Chinese_simplified"), + "zh-TW": _(u"Chinese_traditional"), + "hr": _(u"Croatian"), + "cs": _(u"Czech"), + "da": _(u"Danish"), + "dv": _(u"Dhivehi"), + "nl": _(u"Dutch"), + "en": _(u"English"), + "eo": _(u"Esperanto"), + "et": _(u"Estonian"), + "tl": _(u"Filipino"), + "fi": _(u"Finnish"), + "fr": _(u"French"), + "gl": _(u"Galician"), + "ka": _(u"Georgian"), + "de": _(u"German"), + "el": _(u"Greek"), + "gn": _(u"Guarani"), + "gu": _(u"Gujarati"), + "iw": _(u"Hebrew"), + "hi": _(u"Hindi"), + "hu": _(u"Hungarian"), + "is": _(u"Icelandic"), + "id": _(u"Indonesian"), + "iu": _(u"Inuktitut"), + "ga": _(u"Irish"), + "it": _(u"Italian"), + "ja": _(u"Japanese"), + "kn": _(u"Kannada"), + "kk": _(u"Kazakh"), + "km": _(u"Khmer"), + "ko": _(u"Korean"), + "ku": _(u"Kurdish"), + "ky": _(u"Kyrgyz"), + "lo": _(u"Laothian"), + "lv": _(u"Latvian"), + "lt": _(u"Lithuanian"), + "mk": _(u"Macedonian"), + "ms": _(u"Malay"), + "ml": _(u"Malayalam"), + "mt": _(u"Maltese"), + "mr": _(u"Marathi"), + "mn": _(u"Mongolian"), + "ne": _(u"Nepali"), + "no": _(u"Norwegian"), + "or": _(u"Oriya"), + "ps": _(u"Pashto"), + "fa": _(u"Persian"), + "pl": _(u"Polish"), + "pt": _(u"Portuguese"), + "pa": _(u"Punjabi"), + "ro": _(u"Romanian"), + "ru": _(u"Russian"), + "sa": _(u"Sanskrit"), + "sr": _(u"Serbian"), + "sd": _(u"Sindhi"), + "si": _(u"Sinhalese"), + "sk": _(u"Slovak"), + "sl": _(u"Slovenian"), + "es": _(u"Spanish"), + "sw": _(u"Swahili"), + "sv": _(u"Swedish"), + "tg": _(u"Tajik"), + "ta": _(u"Tamil"), + "tl": _(u"Tagalog"), + "te": _(u"Telugu"), + "th": _(u"Thai"), + "bo": _(u"Tibetan"), + "tr": _(u"Turkish"), + "uk": _(u"Ukrainian"), + "ur": _(u"Urdu"), + "uz": _(u"Uzbek"), + "ug": _(u"Uighur"), + "vi": _(u"Vietnamese"), + "cy": _(u"Welsh"), + "yi": _(u"Yiddish") } def available_languages(): - return dict(sorted(languages.items(), key=lambda x: x[1])) + return dict(sorted(languages.items(), key=lambda x: x[1])) diff --git a/src/extra/translator/wx_ui.py b/src/extra/translator/wx_ui.py index 8b9672e3..e05af488 100644 --- a/src/extra/translator/wx_ui.py +++ b/src/extra/translator/wx_ui.py @@ -21,25 +21,25 @@ import wx from wxUI.dialogs import baseDialog class translateDialog(baseDialog.BaseWXDialog): - def __init__(self): - languages = [] - language_dict = translator.available_languages() - for k in language_dict: - languages.append(language_dict[k]) - super(translateDialog, self).__init__(None, -1, title=_(u"Translate message")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - staticDest = wx.StaticText(panel, -1, _(u"Target language")) - self.dest_lang = wx.ComboBox(panel, -1, choices=languages, style = wx.CB_READONLY) - self.dest_lang.SetFocus() - self.dest_lang.SetSelection(0) - listSizer = wx.BoxSizer(wx.HORIZONTAL) - listSizer.Add(staticDest) - listSizer.Add(self.dest_lang) - ok = wx.Button(panel, wx.ID_OK) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL) - self.SetEscapeId(wx.ID_CANCEL) + def __init__(self): + languages = [] + language_dict = translator.available_languages() + for k in language_dict: + languages.append(language_dict[k]) + super(translateDialog, self).__init__(None, -1, title=_(u"Translate message")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + staticDest = wx.StaticText(panel, -1, _(u"Target language")) + self.dest_lang = wx.ComboBox(panel, -1, choices=languages, style = wx.CB_READONLY) + self.dest_lang.SetFocus() + self.dest_lang.SetSelection(0) + listSizer = wx.BoxSizer(wx.HORIZONTAL) + listSizer.Add(staticDest) + listSizer.Add(self.dest_lang) + ok = wx.Button(panel, wx.ID_OK) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL) + self.SetEscapeId(wx.ID_CANCEL) - def get(self, control): - return getattr(self, control).GetSelection() \ No newline at end of file + def get(self, control): + return getattr(self, control).GetSelection() diff --git a/src/fixes/__init__.py b/src/fixes/__init__.py index 70834b1a..6f256431 100644 --- a/src/fixes/__init__.py +++ b/src/fixes/__init__.py @@ -9,11 +9,11 @@ from . import fix_urllib3_warnings # Avoiding some SSL warnings related to Twyth from . import fix_win32com #from . import fix_requests #fix cacert.pem location for TWBlue binary copies def setup(): - fix_arrow.fix() - if hasattr(sys, "frozen"): - fix_libloader.fix() - fix_win32com.fix() + fix_arrow.fix() + if hasattr(sys, "frozen"): + fix_libloader.fix() + fix_win32com.fix() # fix_requests.fix() # else: # fix_requests.fix(False) - fix_urllib3_warnings.fix() \ No newline at end of file + fix_urllib3_warnings.fix() diff --git a/src/fixes/fix_libloader.py b/src/fixes/fix_libloader.py index db214ed4..064440f7 100644 --- a/src/fixes/fix_libloader.py +++ b/src/fixes/fix_libloader.py @@ -16,27 +16,27 @@ log = logging.getLogger("fixes.fix_libloader") fixed=False def patched_getmodule(modname): - mod=__import__(modname) - return sys.modules[modname] + mod=__import__(modname) + return sys.modules[modname] def load_com(*names): - global fixed - if fixed==False: - gencache._GetModule=patched_getmodule - com.prepare_gencache() - fixed=True - result = None - for name in names: - try: - result = gencache.EnsureDispatch(name) - break - except com_error: - continue - if result is None: - raise com_error("Unable to load any of the provided com objects.") - return result + global fixed + if fixed==False: + gencache._GetModule=patched_getmodule + com.prepare_gencache() + fixed=True + result = None + for name in names: + try: + result = gencache.EnsureDispatch(name) + break + except com_error: + continue + if result is None: + raise com_error("Unable to load any of the provided com objects.") + return result def fix(): - log.debug("Applying fix for Libloader...") - com.load_com = load_com - log.debug("Load_com has been mapped correctly.") \ No newline at end of file + log.debug("Applying fix for Libloader...") + com.load_com = load_com + log.debug("Load_com has been mapped correctly.") diff --git a/src/fixes/fix_requests.py b/src/fixes/fix_requests.py index 49ff12e3..a1d88585 100644 --- a/src/fixes/fix_requests.py +++ b/src/fixes/fix_requests.py @@ -7,6 +7,6 @@ import logging log = logging.getLogger("fixes.fix_requests") def fix(): - log.debug("Applying fix for requests...") - os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(paths.app_path(), "certifi", "cacert.pem")#.encode(paths.fsencoding) -# log.debug("Changed CA path to %s" % (os.environ["REQUESTS_CA_BUNDLE"]))#.decode(paths.fsencoding))) \ No newline at end of file + log.debug("Applying fix for requests...") + os.environ["REQUESTS_CA_BUNDLE"] = os.path.join(paths.app_path(), "certifi", "cacert.pem")#.encode(paths.fsencoding) +# log.debug("Changed CA path to %s" % (os.environ["REQUESTS_CA_BUNDLE"]))#.decode(paths.fsencoding))) diff --git a/src/fixes/fix_urllib3_warnings.py b/src/fixes/fix_urllib3_warnings.py index 63ca2615..67c6d9ad 100644 --- a/src/fixes/fix_urllib3_warnings.py +++ b/src/fixes/fix_urllib3_warnings.py @@ -8,8 +8,8 @@ import six import urllib.request, urllib.parse, urllib.error def fix(): - urllib3.disable_warnings() - fields.format_header_param=patched_format_header_param + urllib3.disable_warnings() + fields.format_header_param=patched_format_header_param def patched_format_header_param(name, value): if not any(ch in value for ch in '"\\\r\n'): diff --git a/src/fixes/fix_win32com.py b/src/fixes/fix_win32com.py index a135c90a..bce06112 100644 --- a/src/fixes/fix_win32com.py +++ b/src/fixes/fix_win32com.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals import win32com.client def fix(): - if win32com.client.gencache.is_readonly == True: - win32com.client.gencache.is_readonly = False - win32com.client.gencache.Rebuild() \ No newline at end of file + if win32com.client.gencache.is_readonly == True: + win32com.client.gencache.is_readonly = False + win32com.client.gencache.Rebuild() diff --git a/src/issueReporter/issueReporter.py b/src/issueReporter/issueReporter.py index a4d074eb..db261b5e 100644 --- a/src/issueReporter/issueReporter.py +++ b/src/issueReporter/issueReporter.py @@ -27,40 +27,40 @@ from suds.client import Client import constants class reportBug(object): - def __init__(self, user_name): - self.user_name = user_name - self.categories = [_(u"General")] - self.reproducibilities = [_(u"always"), _(u"sometimes"), _(u"random"), _(u"have not tried"), _(u"unable to duplicate")] - self.severities = [_(u"block"), _(u"crash"), _(u"major"), _(u"minor"), _(u"tweak"), _(u"text"), _(u"trivial"), _(u"feature")] - self.dialog = wx_ui.reportBugDialog(self.categories, self.reproducibilities, self.severities) - widgetUtils.connect_event(self.dialog.ok, widgetUtils.BUTTON_PRESSED, self.send) - self.dialog.get_response() + def __init__(self, user_name): + self.user_name = user_name + self.categories = [_(u"General")] + self.reproducibilities = [_(u"always"), _(u"sometimes"), _(u"random"), _(u"have not tried"), _(u"unable to duplicate")] + self.severities = [_(u"block"), _(u"crash"), _(u"major"), _(u"minor"), _(u"tweak"), _(u"text"), _(u"trivial"), _(u"feature")] + self.dialog = wx_ui.reportBugDialog(self.categories, self.reproducibilities, self.severities) + widgetUtils.connect_event(self.dialog.ok, widgetUtils.BUTTON_PRESSED, self.send) + self.dialog.get_response() - def send(self, *args, **kwargs): - if self.dialog.get("summary") == "" or self.dialog.get("description") == "": - self.dialog.no_filled() - return - if self.dialog.get("agree") == False: - self.dialog.no_checkbox() - return - try: - client = Client(application.report_bugs_url) - issue = client.factory.create('IssueData') - issue.project.name = application.name - issue.project.id = 0 - issue.summary = self.dialog.get("summary"), - issue.description = "Reported by @%s on version %s (snapshot = %s)\n\n" % (self.user_name, application.version, application.snapshot) + self.dialog.get("description") - # to do: Create getters for category, severity and reproducibility in wx_UI. - issue.category = constants.categories[self.dialog.category.GetSelection()] - issue.reproducibility.name = constants.reproducibilities[self.dialog.reproducibility.GetSelection()] - issue.severity.name = constants.severities[self.dialog.severity.GetSelection()] - issue.priority.name = "normal" - issue.view_state.name = "public" - issue.resolution.name = "open" - issue.projection.name = "none" - issue.eta.name = "eta" - issue.status.name = "new" - id = client.service.mc_issue_add(keys.keyring.get("bts_user"), keys.keyring.get("bts_password"), issue) - self.dialog.success(id) - except: - self.dialog.error() + def send(self, *args, **kwargs): + if self.dialog.get("summary") == "" or self.dialog.get("description") == "": + self.dialog.no_filled() + return + if self.dialog.get("agree") == False: + self.dialog.no_checkbox() + return + try: + client = Client(application.report_bugs_url) + issue = client.factory.create('IssueData') + issue.project.name = application.name + issue.project.id = 0 + issue.summary = self.dialog.get("summary"), + issue.description = "Reported by @%s on version %s (snapshot = %s)\n\n" % (self.user_name, application.version, application.snapshot) + self.dialog.get("description") + # to do: Create getters for category, severity and reproducibility in wx_UI. + issue.category = constants.categories[self.dialog.category.GetSelection()] + issue.reproducibility.name = constants.reproducibilities[self.dialog.reproducibility.GetSelection()] + issue.severity.name = constants.severities[self.dialog.severity.GetSelection()] + issue.priority.name = "normal" + issue.view_state.name = "public" + issue.resolution.name = "open" + issue.projection.name = "none" + issue.eta.name = "eta" + issue.status.name = "new" + id = client.service.mc_issue_add(keys.keyring.get("bts_user"), keys.keyring.get("bts_password"), issue) + self.dialog.success(id) + except: + self.dialog.error() diff --git a/src/issueReporter/wx_ui.py b/src/issueReporter/wx_ui.py index 46ee715c..82d0c51c 100644 --- a/src/issueReporter/wx_ui.py +++ b/src/issueReporter/wx_ui.py @@ -21,75 +21,75 @@ import wx import widgetUtils import application class reportBugDialog(widgetUtils.BaseDialog): - def __init__(self, categories, reproducibilities, severities): - super(reportBugDialog, self).__init__(parent=None, id=wx.NewId()) - self.SetTitle(_(u"Report an error")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - categoryLabel = wx.StaticText(panel, -1, _(u"Select a category"), size=wx.DefaultSize) - self.category = wx.ComboBox(panel, -1, choices=categories, style=wx.CB_READONLY) - self.category.SetSelection(0) - categoryB = wx.BoxSizer(wx.HORIZONTAL) - categoryB.Add(categoryLabel, 0, wx.ALL, 5) - categoryB.Add(self.category, 0, wx.ALL, 5) - self.category.SetFocus() - sizer.Add(categoryB, 0, wx.ALL, 5) - summaryLabel = wx.StaticText(panel, -1, _(u"Briefly describe what happened. You will be able to thoroughly explain it later"), size=wx.DefaultSize) - self.summary = wx.TextCtrl(panel, -1) - dc = wx.WindowDC(self.summary) - dc.SetFont(self.summary.GetFont()) - self.summary.SetSize(dc.GetTextExtent("a"*80)) - summaryB = wx.BoxSizer(wx.HORIZONTAL) - summaryB.Add(summaryLabel, 0, wx.ALL, 5) - summaryB.Add(self.summary, 0, wx.ALL, 5) - sizer.Add(summaryB, 0, wx.ALL, 5) - descriptionLabel = wx.StaticText(panel, -1, _(u"Here, you can describe the bug in detail"), size=wx.DefaultSize) - self.description = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE) - dc = wx.WindowDC(self.description) - dc.SetFont(self.description.GetFont()) - (x, y, z) = dc.GetMultiLineTextExtent("0"*2000) - self.description.SetSize((x, y)) - descBox = wx.BoxSizer(wx.HORIZONTAL) - descBox.Add(descriptionLabel, 0, wx.ALL, 5) - descBox.Add(self.description, 0, wx.ALL, 5) - sizer.Add(descBox, 0, wx.ALL, 5) - reproducibilityLabel = wx.StaticText(panel, -1, _(u"how often does this bug happen?"), size=wx.DefaultSize) - self.reproducibility = wx.ComboBox(panel, -1, choices=reproducibilities, style=wx.CB_READONLY) - self.reproducibility.SetSelection(3) - reprB = wx.BoxSizer(wx.HORIZONTAL) - reprB.Add(reproducibilityLabel, 0, wx.ALL, 5) - reprB.Add(self.reproducibility, 0, wx.ALL, 5) - sizer.Add(reprB, 0, wx.ALL, 5) - severityLabel = wx.StaticText(panel, -1, _(u"Select the importance that you think this bug has")) - self.severity = wx.ComboBox(panel, -1, choices=severities, style=wx.CB_READONLY) - self.severity.SetSelection(3) - severityB = wx.BoxSizer(wx.HORIZONTAL) - severityB.Add(severityLabel, 0, wx.ALL, 5) - severityB.Add(self.severity, 0, wx.ALL, 5) - sizer.Add(severityB, 0, wx.ALL, 5) - self.agree = wx.CheckBox(panel, -1, _(u"I know that the {0} bug system will get my Twitter username to contact me and fix the bug quickly").format(application.name,)) - self.agree.SetValue(False) - sizer.Add(self.agree, 0, wx.ALL, 5) - self.ok = wx.Button(panel, wx.ID_OK, _(u"Send report")) - self.ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) - btnBox = wx.BoxSizer(wx.HORIZONTAL) - btnBox.Add(self.ok, 0, wx.ALL, 5) - btnBox.Add(cancel, 0, wx.ALL, 5) - sizer.Add(btnBox, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self, categories, reproducibilities, severities): + super(reportBugDialog, self).__init__(parent=None, id=wx.NewId()) + self.SetTitle(_(u"Report an error")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + categoryLabel = wx.StaticText(panel, -1, _(u"Select a category"), size=wx.DefaultSize) + self.category = wx.ComboBox(panel, -1, choices=categories, style=wx.CB_READONLY) + self.category.SetSelection(0) + categoryB = wx.BoxSizer(wx.HORIZONTAL) + categoryB.Add(categoryLabel, 0, wx.ALL, 5) + categoryB.Add(self.category, 0, wx.ALL, 5) + self.category.SetFocus() + sizer.Add(categoryB, 0, wx.ALL, 5) + summaryLabel = wx.StaticText(panel, -1, _(u"Briefly describe what happened. You will be able to thoroughly explain it later"), size=wx.DefaultSize) + self.summary = wx.TextCtrl(panel, -1) + dc = wx.WindowDC(self.summary) + dc.SetFont(self.summary.GetFont()) + self.summary.SetSize(dc.GetTextExtent("a"*80)) + summaryB = wx.BoxSizer(wx.HORIZONTAL) + summaryB.Add(summaryLabel, 0, wx.ALL, 5) + summaryB.Add(self.summary, 0, wx.ALL, 5) + sizer.Add(summaryB, 0, wx.ALL, 5) + descriptionLabel = wx.StaticText(panel, -1, _(u"Here, you can describe the bug in detail"), size=wx.DefaultSize) + self.description = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE) + dc = wx.WindowDC(self.description) + dc.SetFont(self.description.GetFont()) + (x, y, z) = dc.GetMultiLineTextExtent("0"*2000) + self.description.SetSize((x, y)) + descBox = wx.BoxSizer(wx.HORIZONTAL) + descBox.Add(descriptionLabel, 0, wx.ALL, 5) + descBox.Add(self.description, 0, wx.ALL, 5) + sizer.Add(descBox, 0, wx.ALL, 5) + reproducibilityLabel = wx.StaticText(panel, -1, _(u"how often does this bug happen?"), size=wx.DefaultSize) + self.reproducibility = wx.ComboBox(panel, -1, choices=reproducibilities, style=wx.CB_READONLY) + self.reproducibility.SetSelection(3) + reprB = wx.BoxSizer(wx.HORIZONTAL) + reprB.Add(reproducibilityLabel, 0, wx.ALL, 5) + reprB.Add(self.reproducibility, 0, wx.ALL, 5) + sizer.Add(reprB, 0, wx.ALL, 5) + severityLabel = wx.StaticText(panel, -1, _(u"Select the importance that you think this bug has")) + self.severity = wx.ComboBox(panel, -1, choices=severities, style=wx.CB_READONLY) + self.severity.SetSelection(3) + severityB = wx.BoxSizer(wx.HORIZONTAL) + severityB.Add(severityLabel, 0, wx.ALL, 5) + severityB.Add(self.severity, 0, wx.ALL, 5) + sizer.Add(severityB, 0, wx.ALL, 5) + self.agree = wx.CheckBox(panel, -1, _(u"I know that the {0} bug system will get my Twitter username to contact me and fix the bug quickly").format(application.name,)) + self.agree.SetValue(False) + sizer.Add(self.agree, 0, wx.ALL, 5) + self.ok = wx.Button(panel, wx.ID_OK, _(u"Send report")) + self.ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(self.ok, 0, wx.ALL, 5) + btnBox.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def no_filled(self): - wx.MessageDialog(self, _(u"You must fill out both fields"), _(u"Error"), wx.OK|wx.ICON_ERROR).ShowModal() + def no_filled(self): + wx.MessageDialog(self, _(u"You must fill out both fields"), _(u"Error"), wx.OK|wx.ICON_ERROR).ShowModal() - def no_checkbox(self): - wx.MessageDialog(self, _(u"You need to mark the checkbox to provide us your twitter username to contact you if it is necessary."), _(u"Error"), wx.ICON_ERROR).ShowModal() + def no_checkbox(self): + wx.MessageDialog(self, _(u"You need to mark the checkbox to provide us your twitter username to contact you if it is necessary."), _(u"Error"), wx.ICON_ERROR).ShowModal() - def success(self, id): - wx.MessageDialog(self, _(u"Thanks for reporting this bug! In future versions, you may be able to find it in the changes list. You've reported the bug number %i") % (id), _(u"reported"), wx.OK).ShowModal() - self.EndModal(wx.ID_OK) + def success(self, id): + wx.MessageDialog(self, _(u"Thanks for reporting this bug! In future versions, you may be able to find it in the changes list. You've reported the bug number %i") % (id), _(u"reported"), wx.OK).ShowModal() + self.EndModal(wx.ID_OK) - def error(self): - wx.MessageDialog(self, _(u"Something unexpected occurred while trying to report the bug. Please, try again later"), _(u"Error while reporting"), wx.ICON_ERROR|wx.OK).ShowModal() - self.EndModal(wx.ID_CANCEL) \ No newline at end of file + def error(self): + wx.MessageDialog(self, _(u"Something unexpected occurred while trying to report the bug. Please, try again later"), _(u"Error while reporting"), wx.ICON_ERROR|wx.OK).ShowModal() + self.EndModal(wx.ID_CANCEL) diff --git a/src/keyboard_handler/global_handler.py b/src/keyboard_handler/global_handler.py index d07062ac..b50e082e 100644 --- a/src/keyboard_handler/global_handler.py +++ b/src/keyboard_handler/global_handler.py @@ -1,8 +1,8 @@ from __future__ import absolute_import import platform if platform.system() == 'Linux': - from .linux import LinuxKeyboardHandler as GlobalKeyboardHandler + from .linux import LinuxKeyboardHandler as GlobalKeyboardHandler else: - from .wx_handler import WXKeyboardHandler as GlobalKeyboardHandler + from .wx_handler import WXKeyboardHandler as GlobalKeyboardHandler #elif platform.system() == 'Darwin': - #from osx import OSXKeyboardHandler as GlobalKeyboardHandler + #from osx import OSXKeyboardHandler as GlobalKeyboardHandler diff --git a/src/keyboard_handler/key_constants.py b/src/keyboard_handler/key_constants.py index c40491d4..6d88ffe9 100644 --- a/src/keyboard_handler/key_constants.py +++ b/src/keyboard_handler/key_constants.py @@ -1,127 +1,127 @@ keys = { - 'accept': 30, - 'add': 107, - 'apps': 93, - 'attn': 246, - 'back': 8, - 'browser_back': 166, - 'browser_forward': 167, - 'cancel': 3, - 'capital': 20, - 'clear': 12, - 'control': 17, - 'convert': 28, - 'crsel': 247, - 'decimal': 110, - 'delete': 46, - 'divide': 111, - 'down': 40, - 'end': 35, - 'ereof': 249, - 'escape': 27, - 'execute': 43, - 'exsel': 248, - 'f1': 112, - 'f10': 121, - 'f11': 122, - 'f12': 123, - 'f13': 124, - 'f14': 125, - 'f15': 126, - 'f16': 127, - 'f17': 128, - 'f18': 129, - 'f19': 130, - 'f2': 113, - 'f20': 131, - 'f21': 132, - 'f22': 133, - 'f23': 134, - 'f24': 135, - 'f3': 114, - 'f4': 115, - 'f5': 116, - 'f6': 117, - 'f7': 118, - 'f8': 119, - 'f9': 120, - 'final': 24, - 'hangeul': 21, - 'hangul': 21, - 'hanja': 25, - 'help': 47, - 'home': 36, - 'insert': 45, - 'junja': 23, - 'kana': 21, - 'kanji': 25, - 'lbutton': 1, - 'lcontrol': 162, - 'left': 37, - 'lmenu': 164, - 'lshift': 160, - 'lwin': 91, - 'mbutton': 4, - 'media_next_track': 176, - 'media_play_pause': 179, - 'media_prev_track': 177, - 'menu': 18, - 'modechange': 31, - 'multiply': 106, - 'next': 34, - 'noname': 252, - 'nonconvert': 29, - 'numlock': 144, - 'numpad0': 96, - 'numpad1': 97, - 'numpad2': 98, - 'numpad3': 99, - 'numpad4': 100, - 'numpad5': 101, - 'numpad6': 102, - 'numpad7': 103, - 'numpad8': 104, - 'numpad9': 105, - 'oem_clear': 254, - 'pa1': 253, - 'pagedown': 34, - 'pageup': 33, - 'pause': 19, - 'play': 250, - 'print': 42, - 'prior': 33, - 'processkey': 229, - 'rbutton': 2, - 'rcontrol': 163, - 'return': 13, - 'right': 39, - 'rmenu': 165, - 'rshift': 161, - 'rwin': 92, - 'scroll': 145, - 'select': 41, - 'separator': 108, - 'shift': 16, - 'snapshot': 44, - 'space': 32, - 'subtract': 109, - 'tab': 9, - 'up': 38, - 'volume_down': 174, - 'volume_mute': 173, - 'volume_up': 175, - 'xbutton1': 5, - 'xbutton2': 6, - 'zoom': 251, - '/': 191, - ';': 218, - '[': 219, - '\\': 220, - ']': 221, - '\'': 222, - '=': 187, - '-': 189, - ';': 186, + 'accept': 30, + 'add': 107, + 'apps': 93, + 'attn': 246, + 'back': 8, + 'browser_back': 166, + 'browser_forward': 167, + 'cancel': 3, + 'capital': 20, + 'clear': 12, + 'control': 17, + 'convert': 28, + 'crsel': 247, + 'decimal': 110, + 'delete': 46, + 'divide': 111, + 'down': 40, + 'end': 35, + 'ereof': 249, + 'escape': 27, + 'execute': 43, + 'exsel': 248, + 'f1': 112, + 'f10': 121, + 'f11': 122, + 'f12': 123, + 'f13': 124, + 'f14': 125, + 'f15': 126, + 'f16': 127, + 'f17': 128, + 'f18': 129, + 'f19': 130, + 'f2': 113, + 'f20': 131, + 'f21': 132, + 'f22': 133, + 'f23': 134, + 'f24': 135, + 'f3': 114, + 'f4': 115, + 'f5': 116, + 'f6': 117, + 'f7': 118, + 'f8': 119, + 'f9': 120, + 'final': 24, + 'hangeul': 21, + 'hangul': 21, + 'hanja': 25, + 'help': 47, + 'home': 36, + 'insert': 45, + 'junja': 23, + 'kana': 21, + 'kanji': 25, + 'lbutton': 1, + 'lcontrol': 162, + 'left': 37, + 'lmenu': 164, + 'lshift': 160, + 'lwin': 91, + 'mbutton': 4, + 'media_next_track': 176, + 'media_play_pause': 179, + 'media_prev_track': 177, + 'menu': 18, + 'modechange': 31, + 'multiply': 106, + 'next': 34, + 'noname': 252, + 'nonconvert': 29, + 'numlock': 144, + 'numpad0': 96, + 'numpad1': 97, + 'numpad2': 98, + 'numpad3': 99, + 'numpad4': 100, + 'numpad5': 101, + 'numpad6': 102, + 'numpad7': 103, + 'numpad8': 104, + 'numpad9': 105, + 'oem_clear': 254, + 'pa1': 253, + 'pagedown': 34, + 'pageup': 33, + 'pause': 19, + 'play': 250, + 'print': 42, + 'prior': 33, + 'processkey': 229, + 'rbutton': 2, + 'rcontrol': 163, + 'return': 13, + 'right': 39, + 'rmenu': 165, + 'rshift': 161, + 'rwin': 92, + 'scroll': 145, + 'select': 41, + 'separator': 108, + 'shift': 16, + 'snapshot': 44, + 'space': 32, + 'subtract': 109, + 'tab': 9, + 'up': 38, + 'volume_down': 174, + 'volume_mute': 173, + 'volume_up': 175, + 'xbutton1': 5, + 'xbutton2': 6, + 'zoom': 251, + '/': 191, + ';': 218, + '[': 219, + '\\': 220, + ']': 221, + '\'': 222, + '=': 187, + '-': 189, + ';': 186, } modifiers = {'alt': 1, 'control': 2, 'shift': 4, 'win': 8} diff --git a/src/keyboard_handler/linux.py b/src/keyboard_handler/linux.py index ba69d7ff..15f6ff7b 100644 --- a/src/keyboard_handler/linux.py +++ b/src/keyboard_handler/linux.py @@ -3,56 +3,56 @@ import threading import thread import pyatspi def parse(s): - """parse a string like control+f into (modifier, key). -Unknown modifiers will return ValueError.""" - m = 0 - lst = s.split('+') - if not len(lst): return (0, s) + """parse a string like control+f into (modifier, key). + Unknown modifiers will return ValueError.""" + m = 0 + lst = s.split('+') + if not len(lst): return (0, s) #Are these right? - d = { - "shift": 1< 1: #more than one key, parse error - raise ValueError, 'unknown modifier %s' % lst[0] - return (m, lst[0].lower()) + if len(lst) > 1: #more than one key, parse error + raise ValueError, 'unknown modifier %s' % lst[0] + return (m, lst[0].lower()) class AtspiThread(threading.Thread): - def run(self): - pyatspi.Registry.registerKeystrokeListener(handler, kind=(pyatspi.KEY_PRESSED_EVENT,), - mask=pyatspi.allModifiers()) - pyatspi.Registry.start() + def run(self): + pyatspi.Registry.registerKeystrokeListener(handler, kind=(pyatspi.KEY_PRESSED_EVENT,), + mask=pyatspi.allModifiers()) + pyatspi.Registry.start() #the keys we registered keys = {} def handler(e): - m,k = e.modifiers,e.event_string.lower() + m,k = e.modifiers,e.event_string.lower() #not sure why we can't catch control+f. Try to fix it. - if (not e.is_text) and e.id >= 97 <= 126: - k = chr(e.id) - if (m,k) not in keys: return False - thread.start_new(keys[(m,k)], ()) - return True #don't pass it on + if (not e.is_text) and e.id >= 97 <= 126: + k = chr(e.id) + if (m,k) not in keys: return False + thread.start_new(keys[(m,k)], ()) + return True #don't pass it on class LinuxKeyboardHandler(KeyboardHandler): - def __init__(self, *args, **kwargs): - KeyboardHandler.__init__(self, *args, **kwargs) - t = AtspiThread() - t.start() - def register_key(self, key, function): - """key will be a string, such as control+shift+f. -We need to convert that, using parse_key, -into modifier and key to put into our dictionary.""" + def __init__(self, *args, **kwargs): + KeyboardHandler.__init__(self, *args, **kwargs) + t = AtspiThread() + t.start() + def register_key(self, key, function): + """key will be a string, such as control+shift+f. + We need to convert that, using parse_key, + into modifier and key to put into our dictionary.""" #register key so we know if we have it on event receive. - t = parse(key) - keys[t] = function + t = parse(key) + keys[t] = function #if we got this far, the key is valid. - KeyboardHandler.register_key(self, key, function) + KeyboardHandler.register_key(self, key, function) - def unregister_key (self, key, function): - KeyboardHandler.unregister_key(self, key, function) - del keys[parse(key)] + def unregister_key (self, key, function): + KeyboardHandler.unregister_key(self, key, function) + del keys[parse(key)] diff --git a/src/keyboard_handler/main.py b/src/keyboard_handler/main.py index 000ee65d..0020bf7d 100644 --- a/src/keyboard_handler/main.py +++ b/src/keyboard_handler/main.py @@ -5,84 +5,84 @@ class KeyboardHandlerError (Exception): pass class KeyboardHandler(object): - def __init__(self, repeat_rate=0.0, *args, **kwargs): - self.repeat_rate = repeat_rate #How long between accepting the same keystroke? - self._last_key = None - self._last_keypress_time = 0 - super(KeyboardHandler, self).__init__(*args, **kwargs) - self.active_keys = {} - if not hasattr(self, 'replacement_mods'): - self.replacement_mods = {} - if not hasattr(self, 'replacement_keys'): - self.replacement_keys = {} + def __init__(self, repeat_rate=0.0, *args, **kwargs): + self.repeat_rate = repeat_rate #How long between accepting the same keystroke? + self._last_key = None + self._last_keypress_time = 0 + super(KeyboardHandler, self).__init__(*args, **kwargs) + self.active_keys = {} + if not hasattr(self, 'replacement_mods'): + self.replacement_mods = {} + if not hasattr(self, 'replacement_keys'): + self.replacement_keys = {} - def register_key (self, key, function): - if key in self.active_keys: - raise KeyboardHandlerError("Key %s is already registered to a function" % key) - if not callable(function): - raise TypeError("Must provide a callable to be invoked upon keypress") - self.active_keys[key] = function + def register_key (self, key, function): + if key in self.active_keys: + raise KeyboardHandlerError("Key %s is already registered to a function" % key) + if not callable(function): + raise TypeError("Must provide a callable to be invoked upon keypress") + self.active_keys[key] = function - def unregister_key (self, key, function): - try: - if self.active_keys[key] != function: - raise KeyboardHandlerError("key %s is not registered to that function" % key) - except KeyError: - raise KeyboardHandlerError("Key %s not currently registered" % key) - del(self.active_keys[key]) + def unregister_key (self, key, function): + try: + if self.active_keys[key] != function: + raise KeyboardHandlerError("key %s is not registered to that function" % key) + except KeyError: + raise KeyboardHandlerError("Key %s not currently registered" % key) + del(self.active_keys[key]) - def unregister_all_keys(self): - for key in list(self.active_keys): - self.unregister_key(key, self.active_keys[key]) + def unregister_all_keys(self): + for key in list(self.active_keys): + self.unregister_key(key, self.active_keys[key]) - def handle_key (self, key): - if self.repeat_rate and key == self._last_key and time.time() - self._last_keypress_time < self.repeat_rate: - return - try: - function = self.active_keys[key] - except KeyError: - return - self._last_key = key - self._last_keypress_time = time.time() - return function() + def handle_key (self, key): + if self.repeat_rate and key == self._last_key and time.time() - self._last_keypress_time < self.repeat_rate: + return + try: + function = self.active_keys[key] + except KeyError: + return + self._last_key = key + self._last_keypress_time = time.time() + return function() - def register_keys(self, keys): - """Given a mapping of keystrokes to functions, registers all keystrokes""" - for k in keys: - self.register_key(k, keys[k]) + def register_keys(self, keys): + """Given a mapping of keystrokes to functions, registers all keystrokes""" + for k in keys: + self.register_key(k, keys[k]) - def unregister_keys(self, keys): - """Given a mapping of keys to their functions, unregisters all provided keys.""" - for k in keys: - self.unregister_key(k, keys[k]) + def unregister_keys(self, keys): + """Given a mapping of keys to their functions, unregisters all provided keys.""" + for k in keys: + self.unregister_key(k, keys[k]) - def standardize_key(self, key): - """Takes a keystroke and places it in a standard case and order in a list.""" - working = key.split('+') - working = [i.lower() for i in working] - answer = [] - if "control" in working: - answer.append("control") - if "win" in working: - answer.append("win") - if "alt" in working: - answer.append("alt") - if "shift" in working: - answer.append("shift") - if working[-1] not in answer: - answer.append(working[-1]) - return answer + def standardize_key(self, key): + """Takes a keystroke and places it in a standard case and order in a list.""" + working = key.split('+') + working = [i.lower() for i in working] + answer = [] + if "control" in working: + answer.append("control") + if "win" in working: + answer.append("win") + if "alt" in working: + answer.append("alt") + if "shift" in working: + answer.append("shift") + if working[-1] not in answer: + answer.append(working[-1]) + return answer - def standardize_keymap(self, keymap): - """Given a keymap, returns the keymap standardized.""" - full = {} - for i in keymap: - answer = "" - new = self.standardize_key(keymap[i]) - for (c, j) in enumerate(new): - if c < len(new)-1: - answer = "%s%s+" % (answer, j) - else: - answer = "%s%s" % (answer, j) - full[i] = answer - return full + def standardize_keymap(self, keymap): + """Given a keymap, returns the keymap standardized.""" + full = {} + for i in keymap: + answer = "" + new = self.standardize_key(keymap[i]) + for (c, j) in enumerate(new): + if c < len(new)-1: + answer = "%s%s+" % (answer, j) + else: + answer = "%s%s" % (answer, j) + full[i] = answer + return full diff --git a/src/keyboard_handler/osx.py b/src/keyboard_handler/osx.py index 12884859..f63e85ad 100644 --- a/src/keyboard_handler/osx.py +++ b/src/keyboard_handler/osx.py @@ -12,45 +12,45 @@ kEventHotKeyReleasedSubtype = 9 class OSXKeyboardHandler(KeyboardHandler): - def __init__(self): - super(OSXKeyboardHandler, self).__init__() - self.replacement_keys = dict() - self.app = KeyboardCapturingNSApplication.alloc().init() - self._event_thread = Thread(target=AppHelper.runEventLoop) - self._event_thread.start() + def __init__(self): + super(OSXKeyboardHandler, self).__init__() + self.replacement_keys = dict() + self.app = KeyboardCapturingNSApplication.alloc().init() + self._event_thread = Thread(target=AppHelper.runEventLoop) + self._event_thread.start() - def register_key (self, key, function): - super(OSXKeyboardHandler, self).register_key(key, function) - k, m = self.parse_key(key) - key_id = RegisterEventHotKey(k, m, (0, 0), GetApplicationEventTarget(), 0) - self.key_ids[key] = key_id + def register_key (self, key, function): + super(OSXKeyboardHandler, self).register_key(key, function) + k, m = self.parse_key(key) + key_id = RegisterEventHotKey(k, m, (0, 0), GetApplicationEventTarget(), 0) + self.key_ids[key] = key_id - def unregister_key (self, key, function): - super(OSXKeyboardHandler, self).unregister_key(key, function) - key_id = self.key_ids[key] - raise NotImplementedError + def unregister_key (self, key, function): + super(OSXKeyboardHandler, self).unregister_key(key, function) + key_id = self.key_ids[key] + raise NotImplementedError - def parse_key (self, key): - key=key.split("+") - #replacements - #Modifier keys: - for index, item in enumerate(key[0:-1]): - if self.replacement_mods.has_key(item): - key[index] = self.replacement_mods[item] - if self.replacement_keys.has_key(key[-1]): - key[-1] = self.replacement_keys[key[-1]] - elif len(key[-1])==1: - key[-1] = ord(str(key[-1]))-36 - mods = 0 - for i in key[:-1]: - mods = mods|i - return [key[-1], mods] + def parse_key (self, key): + key=key.split("+") + #replacements + #Modifier keys: + for index, item in enumerate(key[0:-1]): + if self.replacement_mods.has_key(item): + key[index] = self.replacement_mods[item] + if self.replacement_keys.has_key(key[-1]): + key[-1] = self.replacement_keys[key[-1]] + elif len(key[-1])==1: + key[-1] = ord(str(key[-1]))-36 + mods = 0 + for i in key[:-1]: + mods = mods|i + return [key[-1], mods] class KeyboardCapturingNSApplication(NSApplication): - def sendEvent_(self, theEvent): - if theEvent.type() == NSSystemDefined and theEvent.subtype() == kEventHotKeyPressedSubtype: - self.activateIgnoringOtherApps_(True) - NSRunAlertPanel(u'Hot Key Pressed', u'Hot Key Pressed', None, None, None) - super(NSApplication, self).sendEvent_(theEvent) + def sendEvent_(self, theEvent): + if theEvent.type() == NSSystemDefined and theEvent.subtype() == kEventHotKeyPressedSubtype: + self.activateIgnoringOtherApps_(True) + NSRunAlertPanel(u'Hot Key Pressed', u'Hot Key Pressed', None, None, None) + super(NSApplication, self).sendEvent_(theEvent) diff --git a/src/keyboard_handler/windows.py b/src/keyboard_handler/windows.py index 4197400b..2411c38c 100644 --- a/src/keyboard_handler/windows.py +++ b/src/keyboard_handler/windows.py @@ -5,36 +5,36 @@ from main import KeyboardHandler class WindowsKeyboardHandler(KeyboardHandler): - def __init__ (self, *args, **kwargs): - super(WindowsKeyboardHandler, self).__init__(*args, **kwargs) - #Setup the replacement dictionaries. - for i in dir(win32con): - if i.startswith("VK_"): - key = i[3:].lower() - self.replacement_keys[key] = getattr(win32con, i) - elif i.startswith("MOD_"): - key = i[4:].lower() - self.replacement_mods[key] = getattr(win32con, i) - self.replacement_keys .update(dict(pageup=win32con.VK_PRIOR, pagedown=win32con.VK_NEXT)) + def __init__ (self, *args, **kwargs): + super(WindowsKeyboardHandler, self).__init__(*args, **kwargs) + #Setup the replacement dictionaries. + for i in dir(win32con): + if i.startswith("VK_"): + key = i[3:].lower() + self.replacement_keys[key] = getattr(win32con, i) + elif i.startswith("MOD_"): + key = i[4:].lower() + self.replacement_mods[key] = getattr(win32con, i) + self.replacement_keys .update(dict(pageup=win32con.VK_PRIOR, pagedown=win32con.VK_NEXT)) - def parse_key (self, keystroke, separator="+"): - keystroke = str(keystroke) #We don't want unicode - keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] - mods = 0 - for i in keystroke[:-1]: - mods = mods | i #or everything together - return (mods, keystroke[-1]) + def parse_key (self, keystroke, separator="+"): + keystroke = str(keystroke) #We don't want unicode + keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] + mods = 0 + for i in keystroke[:-1]: + mods = mods | i #or everything together + return (mods, keystroke[-1]) - def keycode_from_key(self, key): - if key in self.replacement_mods: - return self.replacement_mods[key] - if key in self.replacement_keys: - return self.replacement_keys[key] - if len(key) == 1: - return win32api.VkKeyScanEx(key, win32api.GetKeyboardLayout()) + def keycode_from_key(self, key): + if key in self.replacement_mods: + return self.replacement_mods[key] + if key in self.replacement_keys: + return self.replacement_keys[key] + if len(key) == 1: + return win32api.VkKeyScanEx(key, win32api.GetKeyboardLayout()) - def is_key_pressed(self, key): - """Returns if the given key was pressed. Requires an active message loop or will simply give if the key was pressed recently.""" - key = self.keycode_from_key(key) - return win32api.GetAsyncKeyState(key) + def is_key_pressed(self, key): + """Returns if the given key was pressed. Requires an active message loop or will simply give if the key was pressed recently.""" + key = self.keycode_from_key(key) + return win32api.GetAsyncKeyState(key) diff --git a/src/keyboard_handler/wx_handler.py b/src/keyboard_handler/wx_handler.py index 80609116..ff16db3d 100644 --- a/src/keyboard_handler/wx_handler.py +++ b/src/keyboard_handler/wx_handler.py @@ -10,121 +10,121 @@ from . import key_constants __all__ = ['WXKeyboardHandler', 'WXControlKeyboardHandler'] def call_after(func): - def wrapper(*args, **kwargs): - wx.CallAfter(func, *args, **kwargs) - functools.update_wrapper(wrapper, func) - return wrapper + def wrapper(*args, **kwargs): + wx.CallAfter(func, *args, **kwargs) + functools.update_wrapper(wrapper, func) + return wrapper class BaseWXKeyboardHandler(KeyboardHandler): - def __init__(self, *args, **kwargs): - super(BaseWXKeyboardHandler, self).__init__(*args, **kwargs) - #Setup the replacement dictionaries. - for i in dir(wx): - if i.startswith('WXK_'): - key = i[4:].lower() - self.replacement_keys[key] = getattr(wx, i) - elif i.startswith('MOD_'): - key = i[4:].lower() - self.replacement_mods[key] = getattr(wx, i) + def __init__(self, *args, **kwargs): + super(BaseWXKeyboardHandler, self).__init__(*args, **kwargs) + #Setup the replacement dictionaries. + for i in dir(wx): + if i.startswith('WXK_'): + key = i[4:].lower() + self.replacement_keys[key] = getattr(wx, i) + elif i.startswith('MOD_'): + key = i[4:].lower() + self.replacement_mods[key] = getattr(wx, i) - def parse_key (self, keystroke, separator="+"): - keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] - mods = 0 - for i in keystroke[:-1]: - mods = mods | i #or everything together - return (mods, keystroke[-1]) + def parse_key (self, keystroke, separator="+"): + keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] + mods = 0 + for i in keystroke[:-1]: + mods = mods | i #or everything together + return (mods, keystroke[-1]) + + def keycode_from_key(self, key): + result = None + if key in self.replacement_mods: + result = self.replacement_mods[key] + elif key in self.replacement_keys: + result = self.replacement_keys[key] + if result >= 277: + result -= 277 + elif len(key) == 1: + result = ord(key.upper()) + if result is None: + raise KeyboardHandlerError("Could not translate key %r into a valid keycode." % key) + return result - def keycode_from_key(self, key): - result = None - if key in self.replacement_mods: - result = self.replacement_mods[key] - elif key in self.replacement_keys: - result = self.replacement_keys[key] - if result >= 277: - result -= 277 - elif len(key) == 1: - result = ord(key.upper()) - if result is None: - raise KeyboardHandlerError("Could not translate key %r into a valid keycode." % key) - return result - class WXKeyboardHandler(BaseWXKeyboardHandler): - def __init__ (self, parent, *args, **kwargs): - super(WXKeyboardHandler, self).__init__(*args, **kwargs) - self.parent = parent - self.key_ids = {} - self.replacement_keys = key_constants.keys - self.replacement_mods = key_constants.modifiers + def __init__ (self, parent, *args, **kwargs): + super(WXKeyboardHandler, self).__init__(*args, **kwargs) + self.parent = parent + self.key_ids = {} + self.replacement_keys = key_constants.keys + self.replacement_mods = key_constants.modifiers - @call_after - def register_key(self, key, function): - super(WXKeyboardHandler, self).register_key(key, function) - key_id = wx.NewId() - parsed = self.parse_key(key) - res = self.parent.RegisterHotKey(key_id, *parsed) - if not res: - logger.warn("Failed to register hotkey: %s for function %r", key, function) - self.parent.Bind(wx.EVT_HOTKEY, lambda evt: self.process_key(evt, key_id), id=key_id) - self.key_ids[key] = key_id - return res + @call_after + def register_key(self, key, function): + super(WXKeyboardHandler, self).register_key(key, function) + key_id = wx.NewId() + parsed = self.parse_key(key) + res = self.parent.RegisterHotKey(key_id, *parsed) + if not res: + logger.warn("Failed to register hotkey: %s for function %r", key, function) + self.parent.Bind(wx.EVT_HOTKEY, lambda evt: self.process_key(evt, key_id), id=key_id) + self.key_ids[key] = key_id + return res - def parse_key (self, keystroke, separator="+"): - keystroke = str(keystroke) #We don't want unicode - keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] - mods = 0 - for i in keystroke[:-1]: - mods = mods | i #or everything together - return (mods, keystroke[-1]) + def parse_key (self, keystroke, separator="+"): + keystroke = str(keystroke) #We don't want unicode + keystroke = [self.keycode_from_key(i) for i in keystroke.split(separator)] + mods = 0 + for i in keystroke[:-1]: + mods = mods | i #or everything together + return (mods, keystroke[-1]) - @call_after - def unregister_key (self, key, function): - super(WXKeyboardHandler, self).unregister_key(key, function) - if key not in self.key_ids: - return #there's nothing we can do. - key_id = self.key_ids[key] - self.parent.UnregisterHotKey(key_id) - self.parent.Unbind( wx.EVT_HOTKEY, id=key_id) - self.key_ids.pop(key) + @call_after + def unregister_key (self, key, function): + super(WXKeyboardHandler, self).unregister_key(key, function) + if key not in self.key_ids: + return #there's nothing we can do. + key_id = self.key_ids[key] + self.parent.UnregisterHotKey(key_id) + self.parent.Unbind( wx.EVT_HOTKEY, id=key_id) + self.key_ids.pop(key) - def process_key (self, evt, id): - evt.Skip() - key_ids = self.key_ids.keys() - for i in key_ids: - if self.key_ids.get(i) == id: - self.handle_key(i) + def process_key (self, evt, id): + evt.Skip() + key_ids = self.key_ids.keys() + for i in key_ids: + if self.key_ids.get(i) == id: + self.handle_key(i) class WXControlKeyboardHandler(wx.StaticText, KeyboardHandler): - def __init__(self, parent=None, *a, **k): - wx.StaticText.__init__(self, parent=parent) - KeyboardHandler.__init__(self, *a, **k) - self.wx_replacements = {} - for i in [d for d in dir(wx) if d.startswith('WXK_')]: - self.wx_replacements[getattr(wx, i)] = i[4:].lower() - self.Bind(wx.EVT_KEY_DOWN, self.process_key, self) - self.SetFocus() + def __init__(self, parent=None, *a, **k): + wx.StaticText.__init__(self, parent=parent) + KeyboardHandler.__init__(self, *a, **k) + self.wx_replacements = {} + for i in [d for d in dir(wx) if d.startswith('WXK_')]: + self.wx_replacements[getattr(wx, i)] = i[4:].lower() + self.Bind(wx.EVT_KEY_DOWN, self.process_key, self) + self.SetFocus() - def process_key(self, evt): - keycode = evt.GetKeyCode() - keyname = self.wx_replacements.get(keycode, None) - modifiers = "" - replacements = ( (evt.ControlDown(), 'control+'), - (evt.AltDown(), 'alt+'), - (evt.ShiftDown(), 'shift+'), - (evt.MetaDown(), 'win+') - ) - for mod, ch in (replacements): - if mod: - modifiers += ch - if keyname is None: - if 27 < keycode < 256: - keyname = chr(keycode).lower() - else: - keyname = "(%s)unknown" % keycode - key = modifiers + keyname - self.handle_key(key) + def process_key(self, evt): + keycode = evt.GetKeyCode() + keyname = self.wx_replacements.get(keycode, None) + modifiers = "" + replacements = ( (evt.ControlDown(), 'control+'), + (evt.AltDown(), 'alt+'), + (evt.ShiftDown(), 'shift+'), + (evt.MetaDown(), 'win+') + ) + for mod, ch in (replacements): + if mod: + modifiers += ch + if keyname is None: + if 27 < keycode < 256: + keyname = chr(keycode).lower() + else: + keyname = "(%s)unknown" % keycode + key = modifiers + keyname + self.handle_key(key) diff --git a/src/keys/__init__.py b/src/keys/__init__.py index aa08bfc8..6c0a4990 100644 --- a/src/keys/__init__.py +++ b/src/keys/__init__.py @@ -14,9 +14,9 @@ import paths # 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=os.path.join(paths.app_path(), "keys", "lib")) + lib = load_library("stable_api_keys32", x86_path=os.path.join(paths.app_path(), "keys", "lib")) else: - lib = load_library("stable_api_keys64", x64_path=os.path.join(paths.app_path(), "keys", "lib")) + lib = load_library("stable_api_keys64", x64_path=os.path.join(paths.app_path(), "keys", "lib")) # import linuxKeys # lib = linuxKeys @@ -24,20 +24,20 @@ else: keyring = None def setup(): - global keyring - if keyring == None: - keyring = Keyring() + global keyring + if keyring == None: + keyring = Keyring() class Keyring(object): - def __init__(self): - super(Keyring, self).__init__() + def __init__(self): + super(Keyring, self).__init__() - def _call_method(self, function): - result = getattr(lib, function) - result = c_char_p(result.__call__()) - return result.value + def _call_method(self, function): + result = getattr(lib, function) + result = c_char_p(result.__call__()) + return result.value - def get(self, func): - if hasattr(application,func+"_override"): - return getattr(application,func+'_override') - return getattr(self, "_call_method")("get_"+func) + def get(self, func): + if hasattr(application,func+"_override"): + return getattr(application,func+'_override') + return getattr(self, "_call_method")("get_"+func) diff --git a/src/keys/linuxKeys.py b/src/keys/linuxKeys.py index 0baef390..4b6bb8d4 100644 --- a/src/keys/linuxKeys.py +++ b/src/keys/linuxKeys.py @@ -1,9 +1,9 @@ from __future__ import unicode_literals def get_api_key(): - return "8pDLbyOW3saYnvSZ4uLFg\0" + return "8pDLbyOW3saYnvSZ4uLFg\0" def get_api_secret(): - return "YsgdrzY9B4yyYvYsyee78rKI3GshjHpenVS9LnFJXY\0"; + return "YsgdrzY9B4yyYvYsyee78rKI3GshjHpenVS9LnFJXY\0"; #char *get_dropbox_api_key(){ #return "key\0"; diff --git a/src/keystrokeEditor/__init__.py b/src/keystrokeEditor/__init__.py index b8cf7680..10ba64c2 100644 --- a/src/keystrokeEditor/__init__.py +++ b/src/keystrokeEditor/__init__.py @@ -1,3 +1,3 @@ from __future__ import absolute_import from __future__ import unicode_literals -from .keystrokeEditor import KeystrokeEditor \ No newline at end of file +from .keystrokeEditor import KeystrokeEditor diff --git a/src/keystrokeEditor/constants.py b/src/keystrokeEditor/constants.py index 47cc0e97..b14616bc 100644 --- a/src/keystrokeEditor/constants.py +++ b/src/keystrokeEditor/constants.py @@ -1,60 +1,60 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals actions = { -"up": _(u"Go up in the current buffer"), -"down": _(u"Go down in the current buffer"), -"left": _(u"Go to the previous buffer"), -"right": _(u"Go to the next buffer"), -"next_account": _(u"Focus the next session"), -"previous_account": _(u"Focus the previous session"), -"show_hide": _(u"Show or hide the GUI"), -"post_tweet": _(u"New tweet"), -"post_reply": _(u"Reply"), -"post_retweet": _(u"Retweet"), -"send_dm": _(u"Send direct message"), -"add_to_favourites": _(u"Like a tweet"), -"toggle_like": _(u"Like/unlike a tweet"), -"remove_from_favourites": _(u"Unlike a tweet"), -"follow": _(u"Open the user actions dialogue"), -"user_details": _(u"See user details"), -"view_item": _(u"Show tweet"), -"exit": _(u"Quit"), -"open_timeline": _(u"Open user timeline"), -"remove_buffer": _(u"Destroy buffer"), -"interact": _(u"Interact with the currently focused tweet."), -"url": _(u"Open URL"), -"open_in_browser": _(u"View in Twitter"), -"volume_up": _(u"Increase volume by 5%"), -"volume_down": _(u"Decrease volume by 5%"), -"go_home": _(u"Jump to the first element of a buffer"), -"go_end": _(u"Jump to the last element of the current buffer"), -"go_page_up": _(u"Jump 20 elements up in the current buffer"), -"go_page_down": _(u"Jump 20 elements down in the current buffer"), -"update_profile": _(u"Edit profile"), -"delete": _(u"Delete a tweet or direct message"), -"clear_buffer": _(u"Empty the current buffer"), -"repeat_item": _(u"Repeat last item"), -"copy_to_clipboard": _(u"Copy to clipboard"), -"add_to_list": _(u"Add to list"), -"remove_from_list": _(u"Remove from list"), -"toggle_buffer_mute": _(u"Mute/unmute the active buffer"), -"toggle_session_mute": _(u"Mute/unmute the current session"), -"toggle_autoread": _(u"toggle the automatic reading of incoming tweets in the active buffer"), -"search": _(u"Search on twitter"), -"find": _(u"Find a string in the currently focused buffer"), -"edit_keystrokes": _(u"Show the keystroke editor"), -"view_user_lists": _(u"Show lists for a specified user"), -"get_more_items": _(u"load previous items"), -"reverse_geocode": _(u"Get geolocation"), -"view_reverse_geocode": _(u"Display the tweet's geolocation in a dialog"), -"get_trending_topics": _(u"Create a trending topics buffer"), -"open_conversation": _(u"View conversation"), -"check_for_updates": _(u"Check and download updates"), -"lists_manager": _(u"Opens the list manager, which allows you to create, edit, delete and open lists in buffers."), -"configuration": _(u"Opens the global settings dialogue"), -"list_manager": _(u"Opens the list manager"), -"accountConfiguration": _(u"Opens the account settings dialogue"), -"audio": _(u"Try to play an audio file"), -"update_buffer": _(u"Updates the buffer and retrieves possible lost items there."), -"ocr_image": _(u"Extracts the text from a picture and displays the result in a dialog."), -} \ No newline at end of file + "up": _(u"Go up in the current buffer"), + "down": _(u"Go down in the current buffer"), + "left": _(u"Go to the previous buffer"), + "right": _(u"Go to the next buffer"), + "next_account": _(u"Focus the next session"), + "previous_account": _(u"Focus the previous session"), + "show_hide": _(u"Show or hide the GUI"), + "post_tweet": _(u"New tweet"), + "post_reply": _(u"Reply"), + "post_retweet": _(u"Retweet"), + "send_dm": _(u"Send direct message"), + "add_to_favourites": _(u"Like a tweet"), + "toggle_like": _(u"Like/unlike a tweet"), + "remove_from_favourites": _(u"Unlike a tweet"), + "follow": _(u"Open the user actions dialogue"), + "user_details": _(u"See user details"), + "view_item": _(u"Show tweet"), + "exit": _(u"Quit"), + "open_timeline": _(u"Open user timeline"), + "remove_buffer": _(u"Destroy buffer"), + "interact": _(u"Interact with the currently focused tweet."), + "url": _(u"Open URL"), + "open_in_browser": _(u"View in Twitter"), + "volume_up": _(u"Increase volume by 5%"), + "volume_down": _(u"Decrease volume by 5%"), + "go_home": _(u"Jump to the first element of a buffer"), + "go_end": _(u"Jump to the last element of the current buffer"), + "go_page_up": _(u"Jump 20 elements up in the current buffer"), + "go_page_down": _(u"Jump 20 elements down in the current buffer"), + "update_profile": _(u"Edit profile"), + "delete": _(u"Delete a tweet or direct message"), + "clear_buffer": _(u"Empty the current buffer"), + "repeat_item": _(u"Repeat last item"), + "copy_to_clipboard": _(u"Copy to clipboard"), + "add_to_list": _(u"Add to list"), + "remove_from_list": _(u"Remove from list"), + "toggle_buffer_mute": _(u"Mute/unmute the active buffer"), + "toggle_session_mute": _(u"Mute/unmute the current session"), + "toggle_autoread": _(u"toggle the automatic reading of incoming tweets in the active buffer"), + "search": _(u"Search on twitter"), + "find": _(u"Find a string in the currently focused buffer"), + "edit_keystrokes": _(u"Show the keystroke editor"), + "view_user_lists": _(u"Show lists for a specified user"), + "get_more_items": _(u"load previous items"), + "reverse_geocode": _(u"Get geolocation"), + "view_reverse_geocode": _(u"Display the tweet's geolocation in a dialog"), + "get_trending_topics": _(u"Create a trending topics buffer"), + "open_conversation": _(u"View conversation"), + "check_for_updates": _(u"Check and download updates"), + "lists_manager": _(u"Opens the list manager, which allows you to create, edit, delete and open lists in buffers."), + "configuration": _(u"Opens the global settings dialogue"), + "list_manager": _(u"Opens the list manager"), + "accountConfiguration": _(u"Opens the account settings dialogue"), + "audio": _(u"Try to play an audio file"), + "update_buffer": _(u"Updates the buffer and retrieves possible lost items there."), + "ocr_image": _(u"Extracts the text from a picture and displays the result in a dialog."), +} diff --git a/src/keystrokeEditor/keystrokeEditor.py b/src/keystrokeEditor/keystrokeEditor.py index 215ed404..720e1b1b 100644 --- a/src/keystrokeEditor/keystrokeEditor.py +++ b/src/keystrokeEditor/keystrokeEditor.py @@ -9,53 +9,53 @@ from . import constants from pubsub import pub class KeystrokeEditor(object): - def __init__(self): - super(KeystrokeEditor, self).__init__() - self.changed = False # Change it if the keyboard shorcuts are reassigned. - self.dialog = wx_ui.keystrokeEditorDialog() - self.map = config.keymap["keymap"] - # we need to copy the keymap before modify it, for unregistering the old keystrokes if is needed. - self.hold_map = self.map.copy() - self.dialog.put_keystrokes(constants.actions, self.map) - widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke) - widgetUtils.connect_event(self.dialog.execute, widgetUtils.BUTTON_PRESSED, self.execute_action) - self.dialog.get_response() + def __init__(self): + super(KeystrokeEditor, self).__init__() + self.changed = False # Change it if the keyboard shorcuts are reassigned. + self.dialog = wx_ui.keystrokeEditorDialog() + self.map = config.keymap["keymap"] + # we need to copy the keymap before modify it, for unregistering the old keystrokes if is needed. + self.hold_map = self.map.copy() + self.dialog.put_keystrokes(constants.actions, self.map) + widgetUtils.connect_event(self.dialog.edit, widgetUtils.BUTTON_PRESSED, self.edit_keystroke) + widgetUtils.connect_event(self.dialog.execute, widgetUtils.BUTTON_PRESSED, self.execute_action) + self.dialog.get_response() - def edit_keystroke(self, *args, **kwargs): - action = self.dialog.actions[self.dialog.get_action()] - edit_dialog = wx_ui.editKeystrokeDialog() - self.set_keystroke(self.map[action], edit_dialog) - answer = edit_dialog.get_response() - if answer == widgetUtils.OK: - new_keystroke = self.get_edited_keystroke(edit_dialog) - if new_keystroke != self.map[action]: - self.changed = True - self.map[action] = new_keystroke - self.dialog.put_keystrokes(constants.actions, self.map) + def edit_keystroke(self, *args, **kwargs): + action = self.dialog.actions[self.dialog.get_action()] + edit_dialog = wx_ui.editKeystrokeDialog() + self.set_keystroke(self.map[action], edit_dialog) + answer = edit_dialog.get_response() + if answer == widgetUtils.OK: + new_keystroke = self.get_edited_keystroke(edit_dialog) + if new_keystroke != self.map[action]: + self.changed = True + self.map[action] = new_keystroke + self.dialog.put_keystrokes(constants.actions, self.map) - def set_keystroke(self, keystroke, dialog): - for i in keystroke.split("+"): - if hasattr(dialog, i): - dialog.set(i, True) - dialog.set("key", keystroke.split("+")[-1]) + def set_keystroke(self, keystroke, dialog): + for i in keystroke.split("+"): + if hasattr(dialog, i): + dialog.set(i, True) + dialog.set("key", keystroke.split("+")[-1]) - def get_edited_keystroke(self, dialog): - keys = [] - if dialog.get("control") == True: - keys.append("control") - if dialog.get("win") == True: - keys.append("win") - if dialog.get("alt") == True: - keys.append("alt") - if dialog.get("shift") == True: - keys.append("shift") - if dialog.get("key") != "": - keys.append(dialog.get("key")) - else: - wx_ui.no_key() - return - return "+".join(keys) + def get_edited_keystroke(self, dialog): + keys = [] + if dialog.get("control") == True: + keys.append("control") + if dialog.get("win") == True: + keys.append("win") + if dialog.get("alt") == True: + keys.append("alt") + if dialog.get("shift") == True: + keys.append("shift") + if dialog.get("key") != "": + keys.append(dialog.get("key")) + else: + wx_ui.no_key() + return + return "+".join(keys) - def execute_action(self, *args, **kwargs): - action = self.dialog.actions[self.dialog.get_action()] - pub.sendMessage("execute-action", action=action) \ No newline at end of file + def execute_action(self, *args, **kwargs): + action = self.dialog.actions[self.dialog.get_action()] + pub.sendMessage("execute-action", action=action) diff --git a/src/keystrokeEditor/wx_ui.py b/src/keystrokeEditor/wx_ui.py index 7fd7c5c0..51c03e69 100644 --- a/src/keystrokeEditor/wx_ui.py +++ b/src/keystrokeEditor/wx_ui.py @@ -5,78 +5,78 @@ from multiplatform_widgets import widgets from wxUI.dialogs import baseDialog class keystrokeEditorDialog(baseDialog.BaseWXDialog): - def __init__(self): - super(keystrokeEditorDialog, self).__init__(parent=None, id=-1, title=_(u"Keystroke editor")) - panel = wx.Panel(self) - self.actions = [] - sizer = wx.BoxSizer(wx.VERTICAL) - keysText = wx.StaticText(panel, -1, _(u"Select a keystroke to edit")) - self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450)) - self.keys.list.SetFocus() - firstSizer = wx.BoxSizer(wx.HORIZONTAL) - firstSizer.Add(keysText, 0, wx.ALL, 5) - firstSizer.Add(self.keys.list, 0, wx.ALL, 5) - self.edit = wx.Button(panel, -1, _(u"Edit")) - self.edit.SetDefault() - self.execute = wx.Button(panel, -1, _(u"Execute action")) - close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) - secondSizer = wx.BoxSizer(wx.HORIZONTAL) - secondSizer.Add(self.edit, 0, wx.ALL, 5) - secondSizer.Add(self.execute, 0, wx.ALL, 5) - secondSizer.Add(close, 0, wx.ALL, 5) - sizer.Add(firstSizer, 0, wx.ALL, 5) - sizer.Add(secondSizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(keystrokeEditorDialog, self).__init__(parent=None, id=-1, title=_(u"Keystroke editor")) + panel = wx.Panel(self) + self.actions = [] + sizer = wx.BoxSizer(wx.VERTICAL) + keysText = wx.StaticText(panel, -1, _(u"Select a keystroke to edit")) + self.keys = widgets.list(self, _(u"Action"), _(u"Keystroke"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(400, 450)) + self.keys.list.SetFocus() + firstSizer = wx.BoxSizer(wx.HORIZONTAL) + firstSizer.Add(keysText, 0, wx.ALL, 5) + firstSizer.Add(self.keys.list, 0, wx.ALL, 5) + self.edit = wx.Button(panel, -1, _(u"Edit")) + self.edit.SetDefault() + self.execute = wx.Button(panel, -1, _(u"Execute action")) + close = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + secondSizer = wx.BoxSizer(wx.HORIZONTAL) + secondSizer.Add(self.edit, 0, wx.ALL, 5) + secondSizer.Add(self.execute, 0, wx.ALL, 5) + secondSizer.Add(close, 0, wx.ALL, 5) + sizer.Add(firstSizer, 0, wx.ALL, 5) + sizer.Add(secondSizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def put_keystrokes(self, actions, keystrokes): - selection = self.keys.get_selected() - self.keys.clear() - for i in keystrokes: - if (i in actions) == False: - continue - action = actions[i] - self.actions.append(i) - keystroke = keystrokes[i] - self.keys.insert_item(False, *[action, keystroke]) - self.keys.select_item(selection) + def put_keystrokes(self, actions, keystrokes): + selection = self.keys.get_selected() + self.keys.clear() + for i in keystrokes: + if (i in actions) == False: + continue + action = actions[i] + self.actions.append(i) + keystroke = keystrokes[i] + self.keys.insert_item(False, *[action, keystroke]) + self.keys.select_item(selection) - def get_action(self): - return self.keys.get_selected() + def get_action(self): + return self.keys.get_selected() class editKeystrokeDialog(baseDialog.BaseWXDialog): - def __init__(self): - super(editKeystrokeDialog, self).__init__(parent=None, id=-1, title=_(u"Editing keystroke")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.control = wx.CheckBox(panel, -1, _(u"Control")) - self.alt = wx.CheckBox(panel, -1, _(u"Alt")) - self.shift = wx.CheckBox(panel, -1, _(u"Shift")) - self.win = wx.CheckBox(panel, -1, _(u"Windows")) - sizer1 = wx.BoxSizer(wx.HORIZONTAL) - sizer1.Add(self.control) - sizer1.Add(self.alt) - sizer1.Add(self.shift) - sizer1.Add(self.win) - charLabel = wx.StaticText(panel, -1, _(u"Key")) - self.key = wx.TextCtrl(panel, -1) - sizer2 = wx.BoxSizer(wx.HORIZONTAL) - sizer2.Add(charLabel) - sizer2.Add(self.key) - ok = wx.Button(panel, wx.ID_OK, _(u"OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL) - sizer3 = wx.BoxSizer(wx.HORIZONTAL) - sizer3.Add(ok) - sizer3.Add(cancel) - sizer.Add(sizer1) - sizer.Add(sizer2) - sizer.Add(sizer3) - panel.SetSizerAndFit(sizer) + def __init__(self): + super(editKeystrokeDialog, self).__init__(parent=None, id=-1, title=_(u"Editing keystroke")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.control = wx.CheckBox(panel, -1, _(u"Control")) + self.alt = wx.CheckBox(panel, -1, _(u"Alt")) + self.shift = wx.CheckBox(panel, -1, _(u"Shift")) + self.win = wx.CheckBox(panel, -1, _(u"Windows")) + sizer1 = wx.BoxSizer(wx.HORIZONTAL) + sizer1.Add(self.control) + sizer1.Add(self.alt) + sizer1.Add(self.shift) + sizer1.Add(self.win) + charLabel = wx.StaticText(panel, -1, _(u"Key")) + self.key = wx.TextCtrl(panel, -1) + sizer2 = wx.BoxSizer(wx.HORIZONTAL) + sizer2.Add(charLabel) + sizer2.Add(self.key) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL) + sizer3 = wx.BoxSizer(wx.HORIZONTAL) + sizer3.Add(ok) + sizer3.Add(cancel) + sizer.Add(sizer1) + sizer.Add(sizer2) + sizer.Add(sizer3) + panel.SetSizerAndFit(sizer) def no_win_message(): - return wx.MessageDialog(None, _(u"You need to use the Windows key"), _(u"Invalid keystroke"), wx.OK|wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"You need to use the Windows key"), _(u"Invalid keystroke"), wx.OK|wx.ICON_ERROR).ShowModal() def no_key(): - return wx.MessageDialog(None, _(u"You must provide a character for the keystroke"), _(u"Invalid keystroke"), wx.ICON_ERROR).ShowModal() \ No newline at end of file + return wx.MessageDialog(None, _(u"You must provide a character for the keystroke"), _(u"Invalid keystroke"), wx.ICON_ERROR).ShowModal() diff --git a/src/languageHandler.py b/src/languageHandler.py index d17aa61b..b0ea7fb5 100644 --- a/src/languageHandler.py +++ b/src/languageHandler.py @@ -12,7 +12,7 @@ import gettext import paths import platform import application - + #a few Windows locale constants LOCALE_SLANGUAGE=0x2 LOCALE_SLANGDISPLAYNAME=0x6f @@ -20,195 +20,195 @@ LOCALE_SLANGDISPLAYNAME=0x6f curLang="en" def localeNameToWindowsLCID(localeName): - """Retreave the Windows locale identifier (LCID) for the given locale name - @param localeName: a string of 2letterLanguage_2letterCountry or or just 2letterLanguage - @type localeName: string - @returns: a Windows LCID - @rtype: integer - """ - #Windows Vista is able to convert locale names to LCIDs - func_LocaleNameToLCID=getattr(ctypes.windll.kernel32,'LocaleNameToLCID',None) - if func_LocaleNameToLCID is not None: - localeName=localeName.replace('_','-') - LCID=func_LocaleNameToLCID(str(localeName),0) - else: #Windows doesn't have this functionality, manually search Python's windows_locale dictionary for the LCID - localeName=locale.normalize(localeName) - if '.' in localeName: - localeName=localeName.split('.')[0] - LCList=[x[0] for x in locale.windows_locale.items() if x[1]==localeName] - if len(LCList)>0: - LCID=LCList[0] - else: - LCID=0 - return LCID + """Retreave the Windows locale identifier (LCID) for the given locale name + @param localeName: a string of 2letterLanguage_2letterCountry or or just 2letterLanguage + @type localeName: string + @returns: a Windows LCID + @rtype: integer + """ + #Windows Vista is able to convert locale names to LCIDs + func_LocaleNameToLCID=getattr(ctypes.windll.kernel32,'LocaleNameToLCID',None) + if func_LocaleNameToLCID is not None: + localeName=localeName.replace('_','-') + LCID=func_LocaleNameToLCID(str(localeName),0) + else: #Windows doesn't have this functionality, manually search Python's windows_locale dictionary for the LCID + localeName=locale.normalize(localeName) + if '.' in localeName: + localeName=localeName.split('.')[0] + LCList=[x[0] for x in locale.windows_locale.items() if x[1]==localeName] + if len(LCList)>0: + LCID=LCList[0] + else: + LCID=0 + return LCID def getLanguageDescription(language): - """Finds out the description (localized full name) of a given local name""" - desc=None - if platform.system() == "Windows": - LCID=localeNameToWindowsLCID(language) - if LCID!=0: - buf=ctypes.create_unicode_buffer(1024) - if '_' not in language: - res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGDISPLAYNAME,buf,1024) - else: - res=0 - if res==0: - res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGUAGE,buf,1024) - desc=buf.value - elif platform.system() == "Linux" or not desc: - desc={ - "am":pgettext("languageName","Amharic"), - "an":pgettext("languageName","Aragonese"), - "es":pgettext("languageName","Spanish"), - "pt":pgettext("languageName","Portuguese"), - "ru":pgettext("languageName","Russian"), - "it":pgettext("languageName","italian"), - "tr":pgettext("languageName","Turkey"), - "gl":pgettext("languageName","Galician"), - "ca":pgettext("languageName","Catala"), - "eu":pgettext("languageName","Vasque"), - "pl":pgettext("languageName","polish"), - "ar":pgettext("languageName","Arabic"), - "ne":pgettext("languageName","Nepali"), - "sr":pgettext("languageName","Serbian (Latin)"), - "ja":pgettext("languageName","Japanese"), - }.get(language,None) - return desc + """Finds out the description (localized full name) of a given local name""" + desc=None + if platform.system() == "Windows": + LCID=localeNameToWindowsLCID(language) + if LCID!=0: + buf=ctypes.create_unicode_buffer(1024) + if '_' not in language: + res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGDISPLAYNAME,buf,1024) + else: + res=0 + if res==0: + res=ctypes.windll.kernel32.GetLocaleInfoW(LCID,LOCALE_SLANGUAGE,buf,1024) + desc=buf.value + elif platform.system() == "Linux" or not desc: + desc={ + "am":pgettext("languageName","Amharic"), + "an":pgettext("languageName","Aragonese"), + "es":pgettext("languageName","Spanish"), + "pt":pgettext("languageName","Portuguese"), + "ru":pgettext("languageName","Russian"), + "it":pgettext("languageName","italian"), + "tr":pgettext("languageName","Turkey"), + "gl":pgettext("languageName","Galician"), + "ca":pgettext("languageName","Catala"), + "eu":pgettext("languageName","Vasque"), + "pl":pgettext("languageName","polish"), + "ar":pgettext("languageName","Arabic"), + "ne":pgettext("languageName","Nepali"), + "sr":pgettext("languageName","Serbian (Latin)"), + "ja":pgettext("languageName","Japanese"), + }.get(language,None) + return desc def getAvailableLanguages(): - """generates a list of locale names, plus their full localized language and country names. - @rtype: list of tuples - """ - #Make a list of all the locales found in NVDA's locale dir - l=[x for x in os.listdir(paths.locale_path()) if not x.startswith('.')] - l=[x for x in l if os.path.isfile(os.path.join(paths.locale_path(), '%s/LC_MESSAGES/%s.po' % (x, application.short_name)))] - #Make sure that en (english) is in the list as it may not have any locale files, but is default - if 'en' not in l: - l.append('en') - l.sort() - #For each locale, ask Windows for its human readable display name - d=[] - for i in l: - desc=getLanguageDescription(i) - label="%s, %s"%(desc,i) if desc else i - d.append(label) - #include a 'user default, windows' language, which just represents the default language for this user account - l.append("system") - # Translators: the label for the Windows default NVDA interface language. - d.append(_("User default")) - #return a zipped up version of both the lists (a list with tuples of locale,label) - return list(zip(l,d)) + """generates a list of locale names, plus their full localized language and country names. + @rtype: list of tuples + """ + #Make a list of all the locales found in NVDA's locale dir + l=[x for x in os.listdir(paths.locale_path()) if not x.startswith('.')] + l=[x for x in l if os.path.isfile(os.path.join(paths.locale_path(), '%s/LC_MESSAGES/%s.po' % (x, application.short_name)))] + #Make sure that en (english) is in the list as it may not have any locale files, but is default + if 'en' not in l: + l.append('en') + l.sort() + #For each locale, ask Windows for its human readable display name + d=[] + for i in l: + desc=getLanguageDescription(i) + label="%s, %s"%(desc,i) if desc else i + d.append(label) + #include a 'user default, windows' language, which just represents the default language for this user account + l.append("system") + # Translators: the label for the Windows default NVDA interface language. + d.append(_("User default")) + #return a zipped up version of both the lists (a list with tuples of locale,label) + return list(zip(l,d)) def makePgettext(translations): - """Obtaina pgettext function for use with a gettext translations instance. - pgettext is used to support message contexts, - but Python 2.7's gettext module doesn't support this, - so NVDA must provide its own implementation. - """ - if isinstance(translations, gettext.GNUTranslations): - def pgettext(context, message): - message = str(message) - try: - # Look up the message with its context. - return translations._catalog["%s\x04%s" % (context, message)] - except KeyError: - return message - else: - def pgettext(context, message): - return str(message) - return pgettext + """Obtaina pgettext function for use with a gettext translations instance. + pgettext is used to support message contexts, + but Python 2.7's gettext module doesn't support this, + so NVDA must provide its own implementation. + """ + if isinstance(translations, gettext.GNUTranslations): + def pgettext(context, message): + message = str(message) + try: + # Look up the message with its context. + return translations._catalog["%s\x04%s" % (context, message)] + except KeyError: + return message + else: + def pgettext(context, message): + return str(message) + return pgettext def setLanguage(lang): - system = platform.system() - global curLang - try: - if lang=="system": - if system == "Windows": - windowsLCID=ctypes.windll.kernel32.GetUserDefaultUILanguage() - localeName=locale.windows_locale[windowsLCID] - elif system == "Darwin": - import Foundation - localeName = Foundation.NSLocale.currentLocale().identifier() - elif system == "Linux": - localeName = locale.getdefaultlocale()[0] - trans=gettext.translation(application.short_name, localedir=paths.locale_path(), languages=[localeName]) - curLang=localeName + system = platform.system() + global curLang + try: + if lang=="system": + if system == "Windows": + windowsLCID=ctypes.windll.kernel32.GetUserDefaultUILanguage() + localeName=locale.windows_locale[windowsLCID] + elif system == "Darwin": + import Foundation + localeName = Foundation.NSLocale.currentLocale().identifier() + elif system == "Linux": + localeName = locale.getdefaultlocale()[0] + trans=gettext.translation(application.short_name, localedir=paths.locale_path(), languages=[localeName]) + curLang=localeName # else: # localeName=locale.getdefaultlocale()[0] # trans=gettext.translation('twblue', localedir=paths.locale_path(), languages=[localeName]) # curLang=localeName - else: - trans=gettext.translation(application.short_name, localedir=paths.locale_path(), languages=[lang]) - curLang=lang - localeChanged=False - #Try setting Python's locale to lang + else: + trans=gettext.translation(application.short_name, localedir=paths.locale_path(), languages=[lang]) + curLang=lang + localeChanged=False + #Try setting Python's locale to lang # try: - if system == "Windows": - locale.setlocale(locale.LC_ALL, langToWindowsLocale(lang)) - localeChanged=True - else: - locale.setlocale(locale.LC_ALL, lang) - localeChanged=True + if system == "Windows": + locale.setlocale(locale.LC_ALL, langToWindowsLocale(lang)) + localeChanged=True + else: + locale.setlocale(locale.LC_ALL, lang) + localeChanged=True # except: # pass - if not localeChanged and '_' in lang: - #Python couldn'tsupport the language_country locale, just try language. - try: - locale.setlocale(locale.LC_ALL, lang.split('_')[0]) - except: - pass - #Set the windows locale for this thread (NVDA core) to this locale. - if system == "Windows": - LCID=localeNameToWindowsLCID(lang) - ctypes.windll.kernel32.SetThreadLocale(LCID) - except IOError: - trans=gettext.translation(application.short_name, fallback=True) - curLang="en" - if sys.version[0] == "3": - trans.install() - else: - trans.install(unicode=True) - # Install our pgettext function. + if not localeChanged and '_' in lang: + #Python couldn'tsupport the language_country locale, just try language. + try: + locale.setlocale(locale.LC_ALL, lang.split('_')[0]) + except: + pass + #Set the windows locale for this thread (NVDA core) to this locale. + if system == "Windows": + LCID=localeNameToWindowsLCID(lang) + ctypes.windll.kernel32.SetThreadLocale(LCID) + except IOError: + trans=gettext.translation(application.short_name, fallback=True) + curLang="en" + if sys.version[0] == "3": + trans.install() + else: + trans.install(unicode=True) + # Install our pgettext function. # __builtin__.__dict__["pgettext"] = makePgettext(trans) def getLanguage(): - return curLang + return curLang def normalizeLanguage(lang): - """ - Normalizes a language-dialect string in to a standard form we can deal with. - Converts any dash to underline, and makes sure that language is lowercase and dialect is upercase. - """ - lang=lang.replace('-','_') - ld=lang.split('_') - ld[0]=ld[0].lower() - #Filter out meta languages such as x-western - if ld[0]=='x': - return None - if len(ld)>=2: - ld[1]=ld[1].upper() - return "_".join(ld) + """ + Normalizes a language-dialect string in to a standard form we can deal with. + Converts any dash to underline, and makes sure that language is lowercase and dialect is upercase. + """ + lang=lang.replace('-','_') + ld=lang.split('_') + ld[0]=ld[0].lower() + #Filter out meta languages such as x-western + if ld[0]=='x': + return None + if len(ld)>=2: + ld[1]=ld[1].upper() + return "_".join(ld) def langToWindowsLocale(lang): - languages = {"en": "eng", - "ar": "ara", - "ca": "cat", -"de": "deu", - "es": "esp", - "fi": "fin", - "fr": "fre_FRA", - "gl": "glc", - "eu": "euq", - "hu": "hun", - "hr": "hrv", - "it": "ita", - "ja": "jpn", - "pl": "plk", - "pt": "ptb", - "ru": "rus", - "tr": "trk", - "sr": "eng", - } - return languages[lang] + languages = {"en": "eng", + "ar": "ara", + "ca": "cat", + "de": "deu", + "es": "esp", + "fi": "fin", + "fr": "fre_FRA", + "gl": "glc", + "eu": "euq", + "hu": "hun", + "hr": "hrv", + "it": "ita", + "ja": "jpn", + "pl": "plk", + "pt": "ptb", + "ru": "rus", + "tr": "trk", + "sr": "eng", + } + return languages[lang] diff --git a/src/logger.py b/src/logger.py index 89895b34..0e8293aa 100644 --- a/src/logger.py +++ b/src/logger.py @@ -37,9 +37,9 @@ error_handler.setLevel(logging.ERROR) logger.addHandler(error_handler) def handle_exception(exc_type, exc_value, exc_traceback): - if issubclass(exc_type, KeyboardInterrupt): - sys.__excepthook__(exc_type, exc_value, exc_traceback) - return - logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)) + if issubclass(exc_type, KeyboardInterrupt): + sys.__excepthook__(exc_type, exc_value, exc_traceback) + return + logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)) sys.excepthook = handle_exception diff --git a/src/main.py b/src/main.py index 0bb3c802..147155c9 100644 --- a/src/main.py +++ b/src/main.py @@ -7,19 +7,19 @@ from win32com.client import GetObject system = platform.system() if system == "Windows": - import sys - import os - #redirect the original stdout and stderr - stdout=sys.stdout - stderr=sys.stderr - sys.stdout = open(os.path.join(os.getenv("temp"), "stdout.log"), "w") - sys.stderr = open(os.path.join(os.getenv("temp"), "stderr.log"), "w") + import sys + import os + #redirect the original stdout and stderr + stdout=sys.stdout + stderr=sys.stderr + sys.stdout = open(os.path.join(os.getenv("temp"), "stdout.log"), "w") + sys.stderr = open(os.path.join(os.getenv("temp"), "stderr.log"), "w") import languageHandler import paths #check if TWBlue is installed (Windows only) # ToDo: Remove this soon as this is done already when importing the paths module. if os.path.exists(os.path.join(paths.app_path(), "Uninstall.exe")): - paths.mode="installed" + paths.mode="installed" import commandline import config import output @@ -32,114 +32,114 @@ import widgetUtils import webbrowser from wxUI import commonMessageDialogs if system == "Windows": - from logger import logger - from update import updater - stdout_temp=sys.stdout - stderr_temp=sys.stderr + from logger import logger + from update import updater + stdout_temp=sys.stdout + stderr_temp=sys.stderr #if it's a binary version - if hasattr(sys, 'frozen'): - sys.stderr = open(os.path.join(paths.logs_path(), "stderr.log"), 'w') - sys.stdout = open(os.path.join(paths.logs_path(), "stdout.log"), 'w') - else: - sys.stdout=stdout - sys.stderr=stderr - # We are running from source, let's prepare vlc module for that situation - if system=="Windows": - arch="x86" - if platform.architecture()[0][:2] == "64": - arch="x64" - os.environ['PYTHON_VLC_MODULE_PATH']=os.path.abspath(os.path.join(paths.app_path(), "..", "windows-dependencies", arch)) - os.environ['PYTHON_VLC_LIB_PATH']=os.path.abspath(os.path.join(paths.app_path(), "..", "windows-dependencies", arch, "libvlc.dll")) - #the final log files have been opened succesfully, let's close the temporary files - stdout_temp.close() - stderr_temp.close() - #finally, remove the temporary files. TW Blue doesn't need them anymore, and we will get more free space on the harddrive - os.remove(stdout_temp.name) - os.remove(stderr_temp.name) + if hasattr(sys, 'frozen'): + sys.stderr = open(os.path.join(paths.logs_path(), "stderr.log"), 'w') + sys.stdout = open(os.path.join(paths.logs_path(), "stdout.log"), 'w') + else: + sys.stdout=stdout + sys.stderr=stderr + # We are running from source, let's prepare vlc module for that situation + if system=="Windows": + arch="x86" + if platform.architecture()[0][:2] == "64": + arch="x64" + os.environ['PYTHON_VLC_MODULE_PATH']=os.path.abspath(os.path.join(paths.app_path(), "..", "windows-dependencies", arch)) + os.environ['PYTHON_VLC_LIB_PATH']=os.path.abspath(os.path.join(paths.app_path(), "..", "windows-dependencies", arch, "libvlc.dll")) + #the final log files have been opened succesfully, let's close the temporary files + stdout_temp.close() + stderr_temp.close() + #finally, remove the temporary files. TW Blue doesn't need them anymore, and we will get more free space on the harddrive + os.remove(stdout_temp.name) + os.remove(stderr_temp.name) import sound if system == "Linux": - from gi.repository import Gdk, GObject, GLib + from gi.repository import Gdk, GObject, GLib log = logging.getLogger("main") def setup(): - log.debug("Starting " + application.name + " %s" % (application.version,)) - config.setup() - proxy_setup() - log.debug("Using %s %s" % (platform.system(), platform.architecture()[0])) - log.debug("Application path is %s" % (paths.app_path(),)) - log.debug("config path is %s" % (paths.config_path(),)) - sound.setup() - languageHandler.setLanguage(config.app["app-settings"]["language"]) - fixes.setup() - output.setup() - keys.setup() - from controller import settings - from controller import mainController - from sessionmanager import sessionManager - app = widgetUtils.mainLoopObject() - check_pid() - if system == "Windows": - if config.app["app-settings"]["donation_dialog_displayed"] == False: - donation() - if config.app['app-settings']['check_for_updates']: - updater.do_update() - sm = sessionManager.sessionManagerController() - sm.fill_list() - if len(sm.sessions) == 0: sm.show() - else: - sm.do_ok() - if hasattr(sm.view, "destroy"): - sm.view.destroy() - del sm - r = mainController.Controller() - r.view.show() - r.do_work() - r.check_invisible_at_startup() - if system == "Windows": - call_threaded(r.start) - elif system == "Linux": - GLib.idle_add(r.start) - app.run() + log.debug("Starting " + application.name + " %s" % (application.version,)) + config.setup() + proxy_setup() + log.debug("Using %s %s" % (platform.system(), platform.architecture()[0])) + log.debug("Application path is %s" % (paths.app_path(),)) + log.debug("config path is %s" % (paths.config_path(),)) + sound.setup() + languageHandler.setLanguage(config.app["app-settings"]["language"]) + fixes.setup() + output.setup() + keys.setup() + from controller import settings + from controller import mainController + from sessionmanager import sessionManager + app = widgetUtils.mainLoopObject() + check_pid() + if system == "Windows": + if config.app["app-settings"]["donation_dialog_displayed"] == False: + donation() + if config.app['app-settings']['check_for_updates']: + updater.do_update() + sm = sessionManager.sessionManagerController() + sm.fill_list() + if len(sm.sessions) == 0: sm.show() + else: + sm.do_ok() + if hasattr(sm.view, "destroy"): + sm.view.destroy() + del sm + r = mainController.Controller() + r.view.show() + r.do_work() + r.check_invisible_at_startup() + if system == "Windows": + call_threaded(r.start) + elif system == "Linux": + GLib.idle_add(r.start) + app.run() def proxy_setup(): - if config.app["proxy"]["server"] != "" and config.app["proxy"]["type"] > 0: - log.debug("Loading proxy settings") - proxy_url = config.app["proxy"]["server"] + ":" + str(config.app["proxy"]["port"]) - if config.app["proxy"]["user"] != "" and config.app["proxy"]["password"] != "": - proxy_url = config.app["proxy"]["user"] + ":" + config.app["proxy"]["password"] + "@" + proxy_url - elif config.app["proxy"]["user"] != "" and config.proxyTypes[config.app["proxy"]["type"]] in ["socks4", "socks4a"]: - proxy_url = config.app["proxy"]["user"] + "@" + proxy_url - proxy_url = config.proxyTypes[config.app["proxy"]["type"]] + "://" + proxy_url - os.environ["HTTP_PROXY"] = proxy_url - os.environ["HTTPS_PROXY"] = proxy_url + if config.app["proxy"]["server"] != "" and config.app["proxy"]["type"] > 0: + log.debug("Loading proxy settings") + proxy_url = config.app["proxy"]["server"] + ":" + str(config.app["proxy"]["port"]) + if config.app["proxy"]["user"] != "" and config.app["proxy"]["password"] != "": + proxy_url = config.app["proxy"]["user"] + ":" + config.app["proxy"]["password"] + "@" + proxy_url + elif config.app["proxy"]["user"] != "" and config.proxyTypes[config.app["proxy"]["type"]] in ["socks4", "socks4a"]: + proxy_url = config.app["proxy"]["user"] + "@" + proxy_url + proxy_url = config.proxyTypes[config.app["proxy"]["type"]] + "://" + proxy_url + os.environ["HTTP_PROXY"] = proxy_url + os.environ["HTTPS_PROXY"] = proxy_url def donation(): - dlg = commonMessageDialogs.donation() - if dlg == widgetUtils.YES: - webbrowser.open_new_tab(_("https://twblue.es/donate")) - config.app["app-settings"]["donation_dialog_displayed"] = True + dlg = commonMessageDialogs.donation() + if dlg == widgetUtils.YES: + webbrowser.open_new_tab(_("https://twblue.es/donate")) + config.app["app-settings"]["donation_dialog_displayed"] = True def is_running(pid): - "Check if the process with ID pid is running. Adapted from https://stackoverflow.com/a/568589" - WMI = GetObject('winmgmts:') - processes = WMI.InstancesOf('Win32_Process') - return [process.Properties_('ProcessID').Value for process in processes if process.Properties_('ProcessID').Value == pid] + "Check if the process with ID pid is running. Adapted from https://stackoverflow.com/a/568589" + WMI = GetObject('winmgmts:') + processes = WMI.InstancesOf('Win32_Process') + return [process.Properties_('ProcessID').Value for process in processes if process.Properties_('ProcessID').Value == pid] def check_pid(): - "Insures that only one copy of the application is running at a time." - pidpath = os.path.join(os.getenv("temp"), "{}.pid".format(application.name)) - if os.path.exists(pidpath): - with open(pidpath) as fin: - pid = int(fin.read()) - if is_running(pid): - # Display warning dialog - commonMessageDialogs.common_error(_(u"{0} is already running. Close the other instance before starting this one. If you're sure that {0} isn't running, try deleting the file at {1}. If you're unsure of how to do this, contact the {0} developers.").format(application.name, pidpath)) - sys.exit(1) - else: - commonMessageDialogs.dead_pid() - # Write the new PID - with open(pidpath,"w") as cam: - cam.write(str(os.getpid())) + "Insures that only one copy of the application is running at a time." + pidpath = os.path.join(os.getenv("temp"), "{}.pid".format(application.name)) + if os.path.exists(pidpath): + with open(pidpath) as fin: + pid = int(fin.read()) + if is_running(pid): + # Display warning dialog + commonMessageDialogs.common_error(_(u"{0} is already running. Close the other instance before starting this one. If you're sure that {0} isn't running, try deleting the file at {1}. If you're unsure of how to do this, contact the {0} developers.").format(application.name, pidpath)) + sys.exit(1) + else: + commonMessageDialogs.dead_pid() + # Write the new PID + with open(pidpath,"w") as cam: + cam.write(str(os.getpid())) setup() diff --git a/src/multiplatform_widgets/__init__.py b/src/multiplatform_widgets/__init__.py index fe9bf3f2..f50f564e 100644 --- a/src/multiplatform_widgets/__init__.py +++ b/src/multiplatform_widgets/__init__.py @@ -1,3 +1,3 @@ from __future__ import absolute_import from __future__ import unicode_literals -from . import widgets \ No newline at end of file +from . import widgets diff --git a/src/multiplatform_widgets/widgets.py b/src/multiplatform_widgets/widgets.py index 5693c245..1a15e4ca 100644 --- a/src/multiplatform_widgets/widgets.py +++ b/src/multiplatform_widgets/widgets.py @@ -8,85 +8,85 @@ import logging log = logging.getLogger("multiplatform_widgets.widgets") class list(object): - def __init__(self, parent, *columns, **listArguments): - self.system = platform.system() - self.columns = columns - self.listArguments = listArguments - log.debug("Creating list: Columns: %s, arguments: %s" % (self.columns, self.listArguments)) - self.create_list(parent) + def __init__(self, parent, *columns, **listArguments): + self.system = platform.system() + self.columns = columns + self.listArguments = listArguments + log.debug("Creating list: Columns: %s, arguments: %s" % (self.columns, self.listArguments)) + self.create_list(parent) # self.set_size() - def set_windows_size(self, column, characters_max): -# it = wx.ListItem() -# dc = wx.WindowDC(self.list) -# dc.SetFont(it.GetFont()) -# (x, y) = dc.GetTextExtent("r"*characters_max) - self.list.SetColumnWidth(column, characters_max*2) + def set_windows_size(self, column, characters_max): + # it = wx.ListItem() + # dc = wx.WindowDC(self.list) + # dc.SetFont(it.GetFont()) + # (x, y) = dc.GetTextExtent("r"*characters_max) + self.list.SetColumnWidth(column, characters_max*2) - def set_size(self): - self.list.SetSize((self.list.GetBestSize()[0], 728)) + def set_size(self): + self.list.SetSize((self.list.GetBestSize()[0], 728)) # self.list.SetSize((1439, 1000)) - def create_list(self, parent): - if self.system == "Windows": - self.list = wx.ListCtrl(parent, -1, **self.listArguments) - for i in range(0, len(self.columns)): - self.list.InsertColumn(i, u"%s" % (self.columns[i])) - else: - self.list = wx.ListBox(parent, -1, choices=[]) + def create_list(self, parent): + if self.system == "Windows": + self.list = wx.ListCtrl(parent, -1, **self.listArguments) + for i in range(0, len(self.columns)): + self.list.InsertColumn(i, u"%s" % (self.columns[i])) + else: + self.list = wx.ListBox(parent, -1, choices=[]) - def insert_item(self, reversed, *item): - """ Inserts an item on the list, depending on the OS.""" - if self.system == "Windows": - if reversed == False: items = self.list.GetItemCount() - else: items = 0 - self.list.InsertItem(items, item[0]) - for i in range(1, len(self.columns)): - self.list.SetItem(items, i, item[i]) - else: - self.list.Append(" ".join(item)) + def insert_item(self, reversed, *item): + """ Inserts an item on the list, depending on the OS.""" + if self.system == "Windows": + if reversed == False: items = self.list.GetItemCount() + else: items = 0 + self.list.InsertItem(items, item[0]) + for i in range(1, len(self.columns)): + self.list.SetItem(items, i, item[i]) + else: + self.list.Append(" ".join(item)) - def remove_item(self, pos): - """ Deletes an item from the list.""" - if self.system == "Windows": - if pos > 0: self.list.Focus(pos-1) - self.list.DeleteItem(pos) - else: - if pos > 0: self.list.SetSelection(pos-1) - self.list.Delete(pos) + def remove_item(self, pos): + """ Deletes an item from the list.""" + if self.system == "Windows": + if pos > 0: self.list.Focus(pos-1) + self.list.DeleteItem(pos) + else: + if pos > 0: self.list.SetSelection(pos-1) + self.list.Delete(pos) - def clear(self): - if self.system == "Windows": - self.list.DeleteAllItems() - else: - self.list.Clear() + def clear(self): + if self.system == "Windows": + self.list.DeleteAllItems() + else: + self.list.Clear() - def get_selected(self): - if self.system == "Windows": - return self.list.GetFocusedItem() - else: - return self.list.GetSelection() + def get_selected(self): + if self.system == "Windows": + return self.list.GetFocusedItem() + else: + return self.list.GetSelection() - def select_item(self, pos): - if self.system == "Windows": - self.list.Focus(pos) - else: - self.list.SetSelection(pos) + def select_item(self, pos): + if self.system == "Windows": + self.list.Focus(pos) + else: + self.list.SetSelection(pos) - def get_count(self): - if self.system == "Windows": - selected = self.list.GetItemCount() - else: - selected = self.list.GetCount() - if selected == -1: - return 0 - else: - return selected + def get_count(self): + if self.system == "Windows": + selected = self.list.GetItemCount() + else: + selected = self.list.GetCount() + if selected == -1: + return 0 + else: + return selected - def get_text_column(self, indexId, column): - item = self.list.GetItem(indexId, column) - return item.GetText() + def get_text_column(self, indexId, column): + item = self.list.GetItem(indexId, column) + return item.GetText() - def set_text_column(self, indexId, column, text): - item = self.list.SetStringItem(indexId, column, text) - return item \ No newline at end of file + def set_text_column(self, indexId, column, text): + item = self.list.SetStringItem(indexId, column, text) + return item diff --git a/src/mysc/autostart.py b/src/mysc/autostart.py index 01a555f2..845bd0b8 100644 --- a/src/mysc/autostart.py +++ b/src/mysc/autostart.py @@ -10,35 +10,35 @@ from platform_utils import paths RUN_REGKEY = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Run" def is_installed(app_subkey): - """Checks if the currently running copy is installed or portable variant. Requires the name of the application subkey found under the uninstall section in Windows registry.""" + """Checks if the currently running copy is installed or portable variant. Requires the name of the application subkey found under the uninstall section in Windows registry.""" - try: - key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%s" % app_subkey) - inst_dir = winreg.QueryValueEx(key,"InstallLocation")[0] - except WindowsError: - return False - winreg.CloseKey(key) - try: - return os.stat(inst_dir) == os.stat(paths.app_path()) - except WindowsError: - return False + try: + key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\%s" % app_subkey) + inst_dir = winreg.QueryValueEx(key,"InstallLocation")[0] + except WindowsError: + return False + winreg.CloseKey(key) + try: + return os.stat(inst_dir) == os.stat(paths.app_path()) + except WindowsError: + return False def getAutoStart(app_name): - """Queries if the automatic startup should be set for the application or not, depending on it's current state.""" + """Queries if the automatic startup should be set for the application or not, depending on it's current state.""" - try: - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, RUN_REGKEY) - val = winreg.QueryValueEx(key, str(app_name))[0] - return os.stat(val) == os.stat(sys.argv[0]) - except (WindowsError, OSError): - return False + try: + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, RUN_REGKEY) + val = winreg.QueryValueEx(key, str(app_name))[0] + return os.stat(val) == os.stat(sys.argv[0]) + except (WindowsError, OSError): + return False def setAutoStart(app_name, enable=True): - """Configures automatic startup for the application, if the enable argument is set to True. If set to False, deletes the application AutoStart value.""" - if getAutoStart(app_name) == enable: - return - key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, RUN_REGKEY, 0, winreg.KEY_WRITE) - if enable: - winreg.SetValueEx(key, str(app_name), None, winreg.REG_SZ, paths.get_executable()) - else: - winreg.DeleteValue(key, str(app_name)) + """Configures automatic startup for the application, if the enable argument is set to True. If set to False, deletes the application AutoStart value.""" + if getAutoStart(app_name) == enable: + return + key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, RUN_REGKEY, 0, winreg.KEY_WRITE) + if enable: + winreg.SetValueEx(key, str(app_name), None, winreg.REG_SZ, paths.get_executable()) + else: + winreg.DeleteValue(key, str(app_name)) diff --git a/src/mysc/localization.py b/src/mysc/localization.py index 01a7357d..b6e360cc 100644 --- a/src/mysc/localization.py +++ b/src/mysc/localization.py @@ -5,14 +5,14 @@ import logging log = logging.getLogger("mysc.localization") def get(rootFolder): - log.debug("Getting documentation folder. RootFolder: %s" % (rootFolder,)) - defaultLocale = languageHandler.curLang - if len(defaultLocale) > 2: - defaultLocale = defaultLocale[:2] - log.debug("Locale: %s" % (defaultLocale,)) - if os.path.exists(rootFolder+"/"+defaultLocale): - return defaultLocale - else: - log.debug("The folder does not exist, using the English folder...") - return "en" + log.debug("Getting documentation folder. RootFolder: %s" % (rootFolder,)) + defaultLocale = languageHandler.curLang + if len(defaultLocale) > 2: + defaultLocale = defaultLocale[:2] + log.debug("Locale: %s" % (defaultLocale,)) + if os.path.exists(rootFolder+"/"+defaultLocale): + return defaultLocale + else: + log.debug("The folder does not exist, using the English folder...") + return "en" diff --git a/src/mysc/repeating_timer.py b/src/mysc/repeating_timer.py index 41b4a5c5..fcc3c021 100644 --- a/src/mysc/repeating_timer.py +++ b/src/mysc/repeating_timer.py @@ -4,34 +4,34 @@ import logging log = logging.getLogger("mysc.repeating_timer") class RepeatingTimer(threading.Thread): - """Call a function after a specified number of seconds, it will then repeat again after the specified number of seconds - Note: If the function provided takes time to execute, this time is NOT taken from the next wait period + """Call a function after a specified number of seconds, it will then repeat again after the specified number of seconds + Note: If the function provided takes time to execute, this time is NOT taken from the next wait period - t = RepeatingTimer(30.0, f, args=[], kwargs={}) - t.start() - t.cancel() # stop the timer's actions - """ + t = RepeatingTimer(30.0, f, args=[], kwargs={}) + t.start() + t.cancel() # stop the timer's actions + """ - def __init__(self, interval, function, daemon=True, *args, **kwargs): - threading.Thread.__init__(self) - self.daemon = daemon - self.interval = float(interval) - self.function = function - self.args = args - self.kwargs = kwargs - self.finished = threading.Event() + def __init__(self, interval, function, daemon=True, *args, **kwargs): + threading.Thread.__init__(self) + self.daemon = daemon + self.interval = float(interval) + self.function = function + self.args = args + self.kwargs = kwargs + self.finished = threading.Event() - def cancel(self): - """Stop the timer if it hasn't finished yet""" - log.debug("Stopping repeater for %s" % (self.function,)) - self.finished.set() - stop = cancel + def cancel(self): + """Stop the timer if it hasn't finished yet""" + log.debug("Stopping repeater for %s" % (self.function,)) + self.finished.set() + stop = cancel - def run(self): - while not self.finished.is_set(): - self.finished.wait(self.interval) - if not self.finished.is_set(): #In case someone has canceled while waiting - try: - self.function(*self.args, **self.kwargs) - except: - log.exception("Execution failed. Function: %r args: %r and kwargs: %r" % (self.function, self.args, self.kwargs)) + def run(self): + while not self.finished.is_set(): + self.finished.wait(self.interval) + if not self.finished.is_set(): #In case someone has canceled while waiting + try: + self.function(*self.args, **self.kwargs) + except: + log.exception("Execution failed. Function: %r args: %r and kwargs: %r" % (self.function, self.args, self.kwargs)) diff --git a/src/mysc/restart.py b/src/mysc/restart.py index cd1a0926..3ea9d14a 100644 --- a/src/mysc/restart.py +++ b/src/mysc/restart.py @@ -4,13 +4,13 @@ import sys, os import application def restart_program(): - """ Function that restarts the application if is executed.""" - args = sys.argv[:] - if not hasattr(sys, "frozen"): - args.insert(0, sys.executable) - if sys.platform == 'win32': - args = ['"%s"' % arg for arg in args] - pidpath = os.path.join(os.getenv("temp"), "{}.pid".format(application.name)) - if os.path.exists(pidpath): - os.remove(pidpath) - os.execv(sys.executable, args) \ No newline at end of file + """ Function that restarts the application if is executed.""" + args = sys.argv[:] + if not hasattr(sys, "frozen"): + args.insert(0, sys.executable) + if sys.platform == 'win32': + args = ['"%s"' % arg for arg in args] + pidpath = os.path.join(os.getenv("temp"), "{}.pid".format(application.name)) + if os.path.exists(pidpath): + os.remove(pidpath) + os.execv(sys.executable, args) diff --git a/src/mysc/thread_utils.py b/src/mysc/thread_utils.py index 05cd8564..39cdaa09 100644 --- a/src/mysc/thread_utils.py +++ b/src/mysc/thread_utils.py @@ -6,14 +6,14 @@ import wx from pubsub import pub def call_threaded(func, *args, **kwargs): - #Call the given function in a daemonized thread and return the thread. - def new_func(*a, **k): - try: - func(*a, **k) - except: - log.exception("Thread %d with function %r, args of %r, and kwargs of %r failed to run." % (threading.current_thread().ident, func, a, k)) + #Call the given function in a daemonized thread and return the thread. + def new_func(*a, **k): + try: + func(*a, **k) + except: + log.exception("Thread %d with function %r, args of %r, and kwargs of %r failed to run." % (threading.current_thread().ident, func, a, k)) # pass - thread = threading.Thread(target=new_func, args=args, kwargs=kwargs) - thread.daemon = True - thread.start() - return thread \ No newline at end of file + thread = threading.Thread(target=new_func, args=args, kwargs=kwargs) + thread.daemon = True + thread.start() + return thread diff --git a/src/notifier/__init__.py b/src/notifier/__init__.py index 6283342c..381ca60a 100644 --- a/src/notifier/__init__.py +++ b/src/notifier/__init__.py @@ -8,16 +8,16 @@ import platform notify = None def setup(): - global notify - if platform.system() == "Windows": - from . import windows - notify = windows.notification() - elif platform.system() == "Linux": - from . import linux - notify = linux.notification() + global notify + if platform.system() == "Windows": + from . import windows + notify = windows.notification() + elif platform.system() == "Linux": + from . import linux + notify = linux.notification() def send(title, text): - global notify - if not notify or notify is None: - setup() - notify.notify(title, text) \ No newline at end of file + global notify + if not notify or notify is None: + setup() + notify.notify(title, text) diff --git a/src/notifier/linux.py b/src/notifier/linux.py index 18d78203..91b2e217 100644 --- a/src/notifier/linux.py +++ b/src/notifier/linux.py @@ -5,23 +5,23 @@ import dbus import application class notifications(object): - """Supports notifications on Linux. - """ + """Supports notifications on Linux. + """ - def __init__(self): - super(notifications, self).__init__() - self.item = "org.freedesktop.Notifications" - self.path = "/org/freedesktop/Notifications" - self.interface = "org.freedesktop.Notifications" - self.app_name = application.name - self.id_num_to_replace = 0 - self.icon = "/usr/share/icons/Tango/32x32/status/sunny.png" + def __init__(self): + super(notifications, self).__init__() + self.item = "org.freedesktop.Notifications" + self.path = "/org/freedesktop/Notifications" + self.interface = "org.freedesktop.Notifications" + self.app_name = application.name + self.id_num_to_replace = 0 + self.icon = "/usr/share/icons/Tango/32x32/status/sunny.png" - def notify(self, title="", text=""): - actions_list = '' - hint = '' - time = 5000 # Use seconds x 1000 - bus = dbus.SessionBus() - notif = bus.get_object(self.item, self.path) - notify = dbus.Interface(notif, self.interface) - notify.Notify(self.app_name, self.id_num_to_replace, self.icon, title, text, actions_list, hint, time) \ No newline at end of file + def notify(self, title="", text=""): + actions_list = '' + hint = '' + time = 5000 # Use seconds x 1000 + bus = dbus.SessionBus() + notif = bus.get_object(self.item, self.path) + notify = dbus.Interface(notif, self.interface) + notify.Notify(self.app_name, self.id_num_to_replace, self.icon, title, text, actions_list, hint, time) diff --git a/src/notifier/windows.py b/src/notifier/windows.py index af7b22cc..a521c4a5 100644 --- a/src/notifier/windows.py +++ b/src/notifier/windows.py @@ -5,5 +5,5 @@ import wx class notification(object): - def notify(self, title, text): - wx.NotificationMessage(title, text).Show() \ No newline at end of file + def notify(self, title, text): + wx.NotificationMessage(title, text).Show() diff --git a/src/output.py b/src/output.py index 1bb2975f..75ac2c6b 100644 --- a/src/output.py +++ b/src/output.py @@ -8,28 +8,28 @@ import sys speaker = None def speak(text, interrupt=0, speech=True, braille=True): - global speaker - if not speaker: - setup() - if speech: - speaker.speak(text, interrupt) - if braille: - speaker.braille(text) + global speaker + if not speaker: + setup() + if speech: + speaker.speak(text, interrupt) + if braille: + speaker.braille(text) def setup (): - global speaker - logging.debug("Initializing output subsystem.") - try: -# speaker = speech.Speaker(speech.outputs.Sapi5()) -# else: - speaker = outputs.auto.Auto() - except: - return logging.exception("Output: Error during initialization.") + global speaker + logging.debug("Initializing output subsystem.") + try: + # speaker = speech.Speaker(speech.outputs.Sapi5()) + # else: + speaker = outputs.auto.Auto() + except: + return logging.exception("Output: Error during initialization.") def copy(text): - import win32clipboard - #Copies text to the clipboard. - win32clipboard.OpenClipboard() - win32clipboard.EmptyClipboard() - win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT) - win32clipboard.CloseClipboard() + import win32clipboard + #Copies text to the clipboard. + win32clipboard.OpenClipboard() + win32clipboard.EmptyClipboard() + win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT) + win32clipboard.CloseClipboard() diff --git a/src/paths.py b/src/paths.py index 61f454b2..1eeb67d5 100644 --- a/src/paths.py +++ b/src/paths.py @@ -10,58 +10,58 @@ directory = None fsencoding = sys.getfilesystemencoding() if len(glob.glob("Uninstall.exe")) > 0: # installed copy - mode= "installed" + mode= "installed" def app_path(): - return paths_.app_path() + return paths_.app_path() def config_path(): - global mode, directory - if mode == "portable": - if directory != None: path = os.path.join(directory, "config") - elif directory == None: path = os.path.join(app_path(), "config") - elif mode == "installed": - path = os.path.join(data_path(), "config") - if not os.path.exists(path): -# log.debug("%s path does not exist, creating..." % (path,)) - os.mkdir(path) - return path + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "config") + elif directory == None: path = os.path.join(app_path(), "config") + elif mode == "installed": + path = os.path.join(data_path(), "config") + if not os.path.exists(path): + # log.debug("%s path does not exist, creating..." % (path,)) + os.mkdir(path) + return path def logs_path(): - global mode, directory - if mode == "portable": - if directory != None: path = os.path.join(directory, "logs") - elif directory == None: path = os.path.join(app_path(), "logs") - elif mode == "installed": - path = os.path.join(data_path(), "logs") - if not os.path.exists(path): -# log.debug("%s path does not exist, creating..." % (path,)) - os.mkdir(path) - return path + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "logs") + elif directory == None: path = os.path.join(app_path(), "logs") + elif mode == "installed": + path = os.path.join(data_path(), "logs") + if not os.path.exists(path): + # log.debug("%s path does not exist, creating..." % (path,)) + os.mkdir(path) + return path def data_path(app_name='socializer'): - if platform.system() == "Windows": - data_path = os.path.join(os.getenv("AppData"), app_name) - else: - data_path = os.path.join(os.environ['HOME'], ".%s" % app_name) - if not os.path.exists(data_path): - os.mkdir(data_path) - return data_path + if platform.system() == "Windows": + data_path = os.path.join(os.getenv("AppData"), app_name) + else: + data_path = os.path.join(os.environ['HOME'], ".%s" % app_name) + if not os.path.exists(data_path): + os.mkdir(data_path) + return data_path def locale_path(): - return os.path.join(app_path(), "locales") + return os.path.join(app_path(), "locales") def sound_path(): - return os.path.join(app_path(), "sounds") + return os.path.join(app_path(), "sounds") def com_path(): - global mode, directory - if mode == "portable": - if directory != None: path = os.path.join(directory, "com_cache") - elif directory == None: path = os.path.join(app_path(), "com_cache") - elif mode == "installed": - path = os.path.join(data_path(), "com_cache") - if not os.path.exists(path): -# log.debug("%s path does not exist, creating..." % (path,)) - os.mkdir(path) - return path + global mode, directory + if mode == "portable": + if directory != None: path = os.path.join(directory, "com_cache") + elif directory == None: path = os.path.join(app_path(), "com_cache") + elif mode == "installed": + path = os.path.join(data_path(), "com_cache") + if not os.path.exists(path): + # log.debug("%s path does not exist, creating..." % (path,)) + os.mkdir(path) + return path diff --git a/src/sessionmanager/__init__.py b/src/sessionmanager/__init__.py index 77b12468..000da2cf 100644 --- a/src/sessionmanager/__init__.py +++ b/src/sessionmanager/__init__.py @@ -7,4 +7,4 @@ Contents of this package: manager: Handles multiple sessions, setting the configuration files and check if the session is valid. Part of the model. session: Creates a twitter session for an user. The other part of the model. """ -from __future__ import unicode_literals \ No newline at end of file +from __future__ import unicode_literals diff --git a/src/sessionmanager/gtkUI.py b/src/sessionmanager/gtkUI.py index aa0b4a18..a6f8a4f0 100644 --- a/src/sessionmanager/gtkUI.py +++ b/src/sessionmanager/gtkUI.py @@ -3,55 +3,55 @@ from gi.repository import Gtk import widgetUtils class sessionManagerWindow(widgetUtils.baseDialog): - def __init__(self): - super(sessionManagerWindow, self).__init__("Session Manager", None, 0, (Gtk.STOCK_OK, widgetUtils.OK, Gtk.STOCK_CANCEL, widgetUtils.CANCEL)) - self.list = widgetUtils.list("Session") - self.box.add(self.list.list) - btnBox = Gtk.Box(spacing=6) - self.new = Gtk.Button("New account") - self.remove = Gtk.Button("Remove account") - self.configuration = Gtk.Button("Configuration") - btnBox.add(self.new) - btnBox.add(self.remove) - btnBox.add(self.configuration) - self.box.add(btnBox) - self.show_all() + def __init__(self): + super(sessionManagerWindow, self).__init__("Session Manager", None, 0, (Gtk.STOCK_OK, widgetUtils.OK, Gtk.STOCK_CANCEL, widgetUtils.CANCEL)) + self.list = widgetUtils.list("Session") + self.box.add(self.list.list) + btnBox = Gtk.Box(spacing=6) + self.new = Gtk.Button("New account") + self.remove = Gtk.Button("Remove account") + self.configuration = Gtk.Button("Configuration") + btnBox.add(self.new) + btnBox.add(self.remove) + btnBox.add(self.configuration) + self.box.add(btnBox) + self.show_all() - def fill_list(self, sessionsList): - for i in sessionsList: - self.list.insert_item(False, i) - if self.list.get_count() > 0: - self.list.select_item(0) + def fill_list(self, sessionsList): + for i in sessionsList: + self.list.insert_item(False, i) + if self.list.get_count() > 0: + self.list.select_item(0) - def new_account_dialog(self): - dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "Authorization") - dialog.format_secondary_text("The request to authorize your Twitter account will be opened in your browser. You only need to do this once. Would you like to continue?") - answer = dialog.run() - dialog.destroy() - return answer + def new_account_dialog(self): + dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "Authorization") + dialog.format_secondary_text("The request to authorize your Twitter account will be opened in your browser. You only need to do this once. Would you like to continue?") + answer = dialog.run() + dialog.destroy() + return answer - def add_new_session_to_list(self): - total = self.list.get_count() - name = "Authorized account %d" % (total+1) - self.list.insert_item(name) - if self.list.get_count() == 1: - self.list.select_item(0) + def add_new_session_to_list(self): + total = self.list.get_count() + name = "Authorized account %d" % (total+1) + self.list.insert_item(name) + if self.list.get_count() == 1: + self.list.select_item(0) - def show_unauthorised_error(self): - dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Invalid user token") - dialog.format_secondary_text("Your access token is invalid or the authorization has failed. Please try again.") - answer = dialog.run() - return answer + def show_unauthorised_error(self): + dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR, Gtk.ButtonsType.CANCEL, "Invalid user token") + dialog.format_secondary_text("Your access token is invalid or the authorization has failed. Please try again.") + answer = dialog.run() + return answer - def remove_account_dialog(self): - dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "Remove account") - dialog.format_secondary_text("Do you really want delete this account?") - answer = dialog.run() - return answer + def remove_account_dialog(self): + dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "Remove account") + dialog.format_secondary_text("Do you really want delete this account?") + answer = dialog.run() + return answer - def get_selected(self): - return self.list.get_selected() + def get_selected(self): + return self.list.get_selected() - def remove_session(self, sessionID): - self.list.remove_item(sessionID) + def remove_session(self, sessionID): + self.list.remove_item(sessionID) diff --git a/src/sessionmanager/manager.py b/src/sessionmanager/manager.py index f0745cce..3ec251fe 100644 --- a/src/sessionmanager/manager.py +++ b/src/sessionmanager/manager.py @@ -11,41 +11,41 @@ from sessions import session_exceptions manager = None def setup(): - global manager - if not manager: - manager = sessionManager() + global manager + if not manager: + manager = sessionManager() class sessionManager(object): -# def __init__(self): -# FILE = "sessions.conf" -# SPEC = "app-configuration.defaults" -# try: -# self.main = Configuration(paths.config_path(FILE), paths.app_path(SPEC)) -# except ConfigurationResetException: -# pass + # def __init__(self): + # FILE = "sessions.conf" + # SPEC = "app-configuration.defaults" + # try: + # self.main = Configuration(paths.config_path(FILE), paths.app_path(SPEC)) + # except ConfigurationResetException: + # pass - def get_current_session(self): - if self.is_valid(config.app["sessions"]["current_session"]): - return config.app["sessions"]["current_session"] - else: - return False + def get_current_session(self): + if self.is_valid(config.app["sessions"]["current_session"]): + return config.app["sessions"]["current_session"] + else: + return False - def add_session(self, id): - log.debug("Adding a new session: %s" % (id,)) - path = os.path.join(paths.config_path(), id) - if not os.path.exists(path): - log.debug("Creating %s path" % (os.path.join(paths.config_path(), path),)) - os.mkdir(path) - config.app["sessions"]["sessions"].append(id) + def add_session(self, id): + log.debug("Adding a new session: %s" % (id,)) + path = os.path.join(paths.config_path(), id) + if not os.path.exists(path): + log.debug("Creating %s path" % (os.path.join(paths.config_path(), path),)) + os.mkdir(path) + config.app["sessions"]["sessions"].append(id) - def set_current_session(self, sessionID): - config.app["sessions"]["current_session"] = sessionID - config.app.write() + def set_current_session(self, sessionID): + config.app["sessions"]["current_session"] = sessionID + config.app.write() - def is_valid(self, id): - if not os.path.exists(os.path.join(paths.config_path(), id)): - raise session_exceptions.NonExistentSessionError("That session does not exist.") - config.app["sessions"]["current_session"] = "" - return False - else: - return True \ No newline at end of file + def is_valid(self, id): + if not os.path.exists(os.path.join(paths.config_path(), id)): + raise session_exceptions.NonExistentSessionError("That session does not exist.") + config.app["sessions"]["current_session"] = "" + return False + else: + return True diff --git a/src/sessionmanager/sessionManager.py b/src/sessionmanager/sessionManager.py index 73757e4f..e81892c8 100644 --- a/src/sessionmanager/sessionManager.py +++ b/src/sessionmanager/sessionManager.py @@ -4,10 +4,10 @@ import widgetUtils import platform import output if platform.system() == "Windows": - from . import wxUI as view - from controller import settings + from . import wxUI as view + from controller import settings elif platform.system() == "Linux": - from . import gtkUI as view + from . import gtkUI as view import paths import time import os @@ -21,106 +21,106 @@ from tweepy.error import TweepError log = logging.getLogger("sessionmanager.sessionManager") class sessionManagerController(object): - def __init__(self, started=False): - super(sessionManagerController, self).__init__() - log.debug("Setting up the session manager.") - self.started = started - manager.setup() - self.view = view.sessionManagerWindow() - widgetUtils.connect_event(self.view.new, widgetUtils.BUTTON_PRESSED, self.manage_new_account) - widgetUtils.connect_event(self.view.remove, widgetUtils.BUTTON_PRESSED, self.remove) - if self.started == False: - widgetUtils.connect_event(self.view.configuration, widgetUtils.BUTTON_PRESSED, self.configuration) - else: - self.view.hide_configuration() - self.new_sessions = {} - self.removed_sessions = [] + def __init__(self, started=False): + super(sessionManagerController, self).__init__() + log.debug("Setting up the session manager.") + self.started = started + manager.setup() + self.view = view.sessionManagerWindow() + widgetUtils.connect_event(self.view.new, widgetUtils.BUTTON_PRESSED, self.manage_new_account) + widgetUtils.connect_event(self.view.remove, widgetUtils.BUTTON_PRESSED, self.remove) + if self.started == False: + widgetUtils.connect_event(self.view.configuration, widgetUtils.BUTTON_PRESSED, self.configuration) + else: + self.view.hide_configuration() + self.new_sessions = {} + self.removed_sessions = [] - def fill_list(self): - sessionsList = [] - reserved_dirs = ["dicts"] - log.debug("Filling the sessions list.") - self.sessions = [] - for i in os.listdir(paths.config_path()): - if os.path.isdir(os.path.join(paths.config_path(), i)) and i not in reserved_dirs: - log.debug("Adding session %s" % (i,)) - strconfig = "%s/session.conf" % (os.path.join(paths.config_path(), i)) - config_test = config_utils.load_config(strconfig) - if len(config_test) == 0: - try: - log.debug("Deleting session %s" % (i,)) - shutil.rmtree(os.path.join(paths.config_path(), i)) - continue - except: - output.speak("An exception was raised while attempting to clean malformed session data. See the error log for details. If this message persists, contact the developers.",True) - os.exception("Exception thrown while removing malformed session") - continue - name = config_test["twitter"]["user_name"] - if config_test["twitter"]["user_key"] != "" and config_test["twitter"]["user_secret"] != "": - sessionsList.append(name) - self.sessions.append(i) - else: - try: - log.debug("Deleting session %s" % (i,)) - shutil.rmtree(os.path.join(paths.config_path(), i)) - except: - output.speak("An exception was raised while attempting to clean malformed session data. See the error log for details. If this message persists, contact the developers.",True) - os.exception("Exception thrown while removing malformed session") - self.view.fill_list(sessionsList) + def fill_list(self): + sessionsList = [] + reserved_dirs = ["dicts"] + log.debug("Filling the sessions list.") + self.sessions = [] + for i in os.listdir(paths.config_path()): + if os.path.isdir(os.path.join(paths.config_path(), i)) and i not in reserved_dirs: + log.debug("Adding session %s" % (i,)) + strconfig = "%s/session.conf" % (os.path.join(paths.config_path(), i)) + config_test = config_utils.load_config(strconfig) + if len(config_test) == 0: + try: + log.debug("Deleting session %s" % (i,)) + shutil.rmtree(os.path.join(paths.config_path(), i)) + continue + except: + output.speak("An exception was raised while attempting to clean malformed session data. See the error log for details. If this message persists, contact the developers.",True) + os.exception("Exception thrown while removing malformed session") + continue + name = config_test["twitter"]["user_name"] + if config_test["twitter"]["user_key"] != "" and config_test["twitter"]["user_secret"] != "": + sessionsList.append(name) + self.sessions.append(i) + else: + try: + log.debug("Deleting session %s" % (i,)) + shutil.rmtree(os.path.join(paths.config_path(), i)) + except: + output.speak("An exception was raised while attempting to clean malformed session data. See the error log for details. If this message persists, contact the developers.",True) + os.exception("Exception thrown while removing malformed session") + self.view.fill_list(sessionsList) - def show(self): - if self.view.get_response() == widgetUtils.OK: - self.do_ok() + def show(self): + if self.view.get_response() == widgetUtils.OK: + self.do_ok() # else: - self.view.destroy() + self.view.destroy() - def do_ok(self): - log.debug("Starting sessions...") - for i in self.sessions: - if (i in sessions.sessions) == True: continue - s = session.Session(i) - s.get_configuration() - if i not in config.app["sessions"]["ignored_sessions"]: - try: - s.login() - except TweepError: - self.show_auth_error(s.settings["twitter"]["user_name"]) - continue - sessions.sessions[i] = s - self.new_sessions[i] = s + def do_ok(self): + log.debug("Starting sessions...") + for i in self.sessions: + if (i in sessions.sessions) == True: continue + s = session.Session(i) + s.get_configuration() + if i not in config.app["sessions"]["ignored_sessions"]: + try: + s.login() + except TweepError: + self.show_auth_error(s.settings["twitter"]["user_name"]) + continue + sessions.sessions[i] = s + self.new_sessions[i] = s # self.view.destroy() - def show_auth_error(self, user_name): - error = view.auth_error(user_name) + def show_auth_error(self, user_name): + error = view.auth_error(user_name) - def manage_new_account(self, *args, **kwargs): - if self.view.new_account_dialog() == widgetUtils.YES: - location = (str(time.time())[-6:]) - log.debug("Creating session in the %s path" % (location,)) - s = session.Session(location) - manager.manager.add_session(location) - s.get_configuration() + def manage_new_account(self, *args, **kwargs): + if self.view.new_account_dialog() == widgetUtils.YES: + location = (str(time.time())[-6:]) + log.debug("Creating session in the %s path" % (location,)) + s = session.Session(location) + manager.manager.add_session(location) + s.get_configuration() # try: - s.authorise() - self.sessions.append(location) - self.view.add_new_session_to_list() - s.settings.write() + s.authorise() + self.sessions.append(location) + self.view.add_new_session_to_list() + s.settings.write() # except: # log.exception("Error authorising the session") # self.view.show_unauthorised_error() # return - def remove(self, *args, **kwargs): - if self.view.remove_account_dialog() == widgetUtils.YES: - selected_account = self.sessions[self.view.get_selected()] - self.view.remove_session(self.view.get_selected()) - self.removed_sessions.append(selected_account) - self.sessions.remove(selected_account) - shutil.rmtree(path=os.path.join(paths.config_path(), selected_account), ignore_errors=True) + def remove(self, *args, **kwargs): + if self.view.remove_account_dialog() == widgetUtils.YES: + selected_account = self.sessions[self.view.get_selected()] + self.view.remove_session(self.view.get_selected()) + self.removed_sessions.append(selected_account) + self.sessions.remove(selected_account) + shutil.rmtree(path=os.path.join(paths.config_path(), selected_account), ignore_errors=True) - def configuration(self, *args, **kwargs): - """ Opens the global settings dialogue.""" - d = settings.globalSettingsController() - if d.response == widgetUtils.OK: - d.save_configuration() + def configuration(self, *args, **kwargs): + """ Opens the global settings dialogue.""" + d = settings.globalSettingsController() + if d.response == widgetUtils.OK: + d.save_configuration() diff --git a/src/sessionmanager/wxUI.py b/src/sessionmanager/wxUI.py index fccfcdbf..6441f6e8 100644 --- a/src/sessionmanager/wxUI.py +++ b/src/sessionmanager/wxUI.py @@ -5,77 +5,77 @@ from multiplatform_widgets import widgets import application class sessionManagerWindow(wx.Dialog): - def __init__(self): - super(sessionManagerWindow, self).__init__(parent=None, title=_(u"Session manager"), size=wx.DefaultSize) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - label = wx.StaticText(panel, -1, _(u"Accounts list"), size=wx.DefaultSize) - listSizer = wx.BoxSizer(wx.HORIZONTAL) - self.list = widgets.list(panel, _(u"Account"), style=wx.LC_SINGLE_SEL|wx.LC_REPORT) - listSizer.Add(label, 0, wx.ALL, 5) - listSizer.Add(self.list.list, 0, wx.ALL, 5) - sizer.Add(listSizer, 0, wx.ALL, 5) - self.new = wx.Button(panel, -1, _(u"New account"), size=wx.DefaultSize) - self.remove = wx.Button(panel, -1, _(u"Remove account")) - self.configuration = wx.Button(panel, -1, _(u"Global Settings")) - ok = wx.Button(panel, wx.ID_OK, size=wx.DefaultSize) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, size=wx.DefaultSize) - buttons = wx.BoxSizer(wx.HORIZONTAL) - buttons.Add(self.new, 0, wx.ALL, 5) - buttons.Add(self.configuration, 0, wx.ALL, 5) - buttons.Add(ok, 0, wx.ALL, 5) - buttons.Add(cancel, 0, wx.ALL, 5) - sizer.Add(buttons, 0, wx.ALL, 5) - panel.SetSizer(sizer) - min = sizer.CalcMin() - self.SetClientSize(min) + def __init__(self): + super(sessionManagerWindow, self).__init__(parent=None, title=_(u"Session manager"), size=wx.DefaultSize) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(panel, -1, _(u"Accounts list"), size=wx.DefaultSize) + listSizer = wx.BoxSizer(wx.HORIZONTAL) + self.list = widgets.list(panel, _(u"Account"), style=wx.LC_SINGLE_SEL|wx.LC_REPORT) + listSizer.Add(label, 0, wx.ALL, 5) + listSizer.Add(self.list.list, 0, wx.ALL, 5) + sizer.Add(listSizer, 0, wx.ALL, 5) + self.new = wx.Button(panel, -1, _(u"New account"), size=wx.DefaultSize) + self.remove = wx.Button(panel, -1, _(u"Remove account")) + self.configuration = wx.Button(panel, -1, _(u"Global Settings")) + ok = wx.Button(panel, wx.ID_OK, size=wx.DefaultSize) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, size=wx.DefaultSize) + buttons = wx.BoxSizer(wx.HORIZONTAL) + buttons.Add(self.new, 0, wx.ALL, 5) + buttons.Add(self.configuration, 0, wx.ALL, 5) + buttons.Add(ok, 0, wx.ALL, 5) + buttons.Add(cancel, 0, wx.ALL, 5) + sizer.Add(buttons, 0, wx.ALL, 5) + panel.SetSizer(sizer) + min = sizer.CalcMin() + self.SetClientSize(min) - def fill_list(self, sessionsList): - for i in sessionsList: - self.list.insert_item(False, i) - if self.list.get_count() > 0: - self.list.select_item(0) - self.list.list.SetSize(self.list.list.GetBestSize()) + def fill_list(self, sessionsList): + for i in sessionsList: + self.list.insert_item(False, i) + if self.list.get_count() > 0: + self.list.select_item(0) + self.list.list.SetSize(self.list.list.GetBestSize()) - def ok(self, ev): - if self.list.get_count() == 0: - wx.MessageDialog(None, _(u"You need to configure an account."), _(u"Account Error"), wx.ICON_ERROR).ShowModal() - return - self.controller.do_ok() - self.EndModal(wx.ID_OK) + def ok(self, ev): + if self.list.get_count() == 0: + wx.MessageDialog(None, _(u"You need to configure an account."), _(u"Account Error"), wx.ICON_ERROR).ShowModal() + return + self.controller.do_ok() + self.EndModal(wx.ID_OK) - def new_account_dialog(self): - return wx.MessageDialog(self, _(u"The request to authorize your Twitter account will be opened in your browser. You only need to do this once. Would you like to continue?"), _(u"Authorization"), wx.YES_NO).ShowModal() + def new_account_dialog(self): + return wx.MessageDialog(self, _(u"The request to authorize your Twitter account will be opened in your browser. You only need to do this once. Would you like to continue?"), _(u"Authorization"), wx.YES_NO).ShowModal() - def add_new_session_to_list(self): - total = self.list.get_count() - name = _(u"Authorized account %d") % (total+1) - self.list.insert_item(False, name) - if self.list.get_count() == 1: - self.list.select_item(0) + def add_new_session_to_list(self): + total = self.list.get_count() + name = _(u"Authorized account %d") % (total+1) + self.list.insert_item(False, name) + if self.list.get_count() == 1: + self.list.select_item(0) - def show_unauthorised_error(self): - wx.MessageDialog(None, _(u"Your access token is invalid or the authorization has failed. Please try again."), _(u"Invalid user token"), wx.ICON_ERROR).ShowModal() + def show_unauthorised_error(self): + wx.MessageDialog(None, _(u"Your access token is invalid or the authorization has failed. Please try again."), _(u"Invalid user token"), wx.ICON_ERROR).ShowModal() - def get_response(self): - return self.ShowModal() + def get_response(self): + return self.ShowModal() - def remove_account_dialog(self): - return wx.MessageDialog(self, _(u"Do you really want to delete this account?"), _(u"Remove account"), wx.YES_NO).ShowModal() + def remove_account_dialog(self): + return wx.MessageDialog(self, _(u"Do you really want to delete this account?"), _(u"Remove account"), wx.YES_NO).ShowModal() - def get_selected(self): - return self.list.get_selected() + def get_selected(self): + return self.list.get_selected() - def remove_session(self, sessionID): - self.list.remove_item(sessionID) + def remove_session(self, sessionID): + self.list.remove_item(sessionID) - def hide_configuration(self): - self.configuration.Hide() + def hide_configuration(self): + self.configuration.Hide() - def destroy(self): - self.Destroy() + def destroy(self): + self.Destroy() def auth_error(user_name): - return wx.MessageDialog(None, _("TWBlue is unable to authenticate the account for {} in Twitter. It might be due to an invalid or expired token, revoqued access to the application, or after an account reactivation. Please remove the account manually from your Twitter sessions in order to stop seeing this message.").format(user_name,), _("Authentication error for session {}").format(user_name,), wx.OK).ShowModal() + return wx.MessageDialog(None, _("TWBlue is unable to authenticate the account for {} in Twitter. It might be due to an invalid or expired token, revoqued access to the application, or after an account reactivation. Please remove the account manually from your Twitter sessions in order to stop seeing this message.").format(user_name,), _("Authentication error for session {}").format(user_name,), wx.OK).ShowModal() diff --git a/src/sessions/__init__.py b/src/sessions/__init__.py index 4ab464c0..a9341e79 100644 --- a/src/sessions/__init__.py +++ b/src/sessions/__init__.py @@ -3,4 +3,4 @@ In TWBlue, a session module defines everything a social network needs to be used in the program.""" from __future__ import unicode_literals # let's define a global object for storing sessions across the program. -sessions = {} \ No newline at end of file +sessions = {} diff --git a/src/sessions/base.py b/src/sessions/base.py index 235245e8..597cacfc 100644 --- a/src/sessions/base.py +++ b/src/sessions/base.py @@ -18,103 +18,103 @@ from . import session_exceptions as Exceptions log = logging.getLogger("sessionmanager.session") class baseSession(object): - """ toDo: Decorators does not seem to be working when using them in an inherited class.""" + """ toDo: Decorators does not seem to be working when using them in an inherited class.""" - # Decorators. + # Decorators. - def _require_login(fn): - """ Decorator for checking if the user is logged in. - Some functions may need this to avoid making unneeded calls.""" - def f(self, *args, **kwargs): - if self.logged == True: - fn(self, *args, **kwargs) - else: - raise Exceptions.NotLoggedSessionError("You are not logged in yet.") - return f + def _require_login(fn): + """ Decorator for checking if the user is logged in. + Some functions may need this to avoid making unneeded calls.""" + def f(self, *args, **kwargs): + if self.logged == True: + fn(self, *args, **kwargs) + else: + raise Exceptions.NotLoggedSessionError("You are not logged in yet.") + return f - def _require_configuration(fn): - """ Check if the user has a configured session.""" - def f(self, *args, **kwargs): - if self.settings != None: - fn(self, *args, **kwargs) - else: - raise Exceptions.NotConfiguredSessionError("Not configured.") - return f + def _require_configuration(fn): + """ Check if the user has a configured session.""" + def f(self, *args, **kwargs): + if self.settings != None: + fn(self, *args, **kwargs) + else: + raise Exceptions.NotConfiguredSessionError("Not configured.") + return f - def __init__(self, session_id): - """ session_id (str): The name of the folder inside the config directory where the session is located.""" - super(baseSession, self).__init__() - self.session_id = session_id - self.logged = False - self.settings = None - self.db={} - - @property - def is_logged(self): - return self.logged + def __init__(self, session_id): + """ session_id (str): The name of the folder inside the config directory where the session is located.""" + super(baseSession, self).__init__() + self.session_id = session_id + self.logged = False + self.settings = None + self.db={} - def get_configuration(self): - """ Get settings for a session.""" - file_ = "%s/session.conf" % (self.session_id,) - log.debug("Creating config file %s" % (file_,)) - self.settings = config_utils.load_config(os.path.join(paths.config_path(), file_), os.path.join(paths.app_path(), "Conf.defaults")) - self.init_sound() - self.deshelve() + @property + def is_logged(self): + return self.logged - def init_sound(self): - try: self.sound = sound.soundSystem(self.settings["sound"]) - except: pass + def get_configuration(self): + """ Get settings for a session.""" + file_ = "%s/session.conf" % (self.session_id,) + log.debug("Creating config file %s" % (file_,)) + self.settings = config_utils.load_config(os.path.join(paths.config_path(), file_), os.path.join(paths.app_path(), "Conf.defaults")) + self.init_sound() + self.deshelve() - @_require_configuration - def login(self, verify_credentials=True): - pass + def init_sound(self): + try: self.sound = sound.soundSystem(self.settings["sound"]) + except: pass - @_require_configuration - def authorise(self): - pass + @_require_configuration + def login(self, verify_credentials=True): + pass - def shelve(self): - """Shelve the database to allow for persistance.""" - shelfname=os.path.join(paths.config_path(), str(self.session_id), "cache") - if self.settings["general"]["persist_size"] == 0: - if os.path.exists(shelfname+".dat"): - os.remove(shelfname+".dat") - return - try: - if not os.path.exists(shelfname+".dat"): - output.speak("Generating database, this might take a while.",True) - shelf=shelve.open(os.path.join(paths.config_path(), shelfname),'c') - for key, value in list(self.db.items()): - if type(key) != str and type(key) != str: - 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)) + "!") - if type(value) == list and self.settings["general"]["persist_size"] != -1 and len(value) > self.settings["general"]["persist_size"]: - shelf[key]=value[self.settings["general"]["persist_size"]:] - else: - shelf[key]=value - shelf.close() - except: - output.speak("An exception occurred while shelving the " + application.name + " database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the " + application.name + " developers.",True) - log.exception("Exception while shelving" + shelfname) - os.remove(shelfname) + @_require_configuration + def authorise(self): + pass - def deshelve(self): - """Import a shelved database.""" - shelfname=os.path.join(paths.config_path(), str(self.session_id)+"/cache") - if self.settings["general"]["persist_size"] == 0: - if os.path.exists(shelfname+".dat"): - os.remove(shelfname+".dat") - return - try: - shelf=shelve.open(os.path.join(paths.config_path(), shelfname),'c') - for key,value in list(shelf.items()): - self.db[key]=value - shelf.close() - except: - output.speak("An exception occurred while deshelving the " + application.name + " database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the " + application.name + " developers.",True) - log.exception("Exception while deshelving" + shelfname) - try: - os.remove(shelfname) - except: - pass + def shelve(self): + """Shelve the database to allow for persistance.""" + shelfname=os.path.join(paths.config_path(), str(self.session_id), "cache") + if self.settings["general"]["persist_size"] == 0: + if os.path.exists(shelfname+".dat"): + os.remove(shelfname+".dat") + return + try: + if not os.path.exists(shelfname+".dat"): + output.speak("Generating database, this might take a while.",True) + shelf=shelve.open(os.path.join(paths.config_path(), shelfname),'c') + for key, value in list(self.db.items()): + if type(key) != str and type(key) != str: + 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)) + "!") + if type(value) == list and self.settings["general"]["persist_size"] != -1 and len(value) > self.settings["general"]["persist_size"]: + shelf[key]=value[self.settings["general"]["persist_size"]:] + else: + shelf[key]=value + shelf.close() + except: + output.speak("An exception occurred while shelving the " + application.name + " database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the " + application.name + " developers.",True) + log.exception("Exception while shelving" + shelfname) + os.remove(shelfname) + + def deshelve(self): + """Import a shelved database.""" + shelfname=os.path.join(paths.config_path(), str(self.session_id)+"/cache") + if self.settings["general"]["persist_size"] == 0: + if os.path.exists(shelfname+".dat"): + os.remove(shelfname+".dat") + return + try: + shelf=shelve.open(os.path.join(paths.config_path(), shelfname),'c') + for key,value in list(shelf.items()): + self.db[key]=value + shelf.close() + except: + output.speak("An exception occurred while deshelving the " + application.name + " database. It will be deleted and rebuilt automatically. If this error persists, send the error log to the " + application.name + " developers.",True) + log.exception("Exception while deshelving" + shelfname) + try: + os.remove(shelfname) + except: + pass diff --git a/src/sessions/session_exceptions.py b/src/sessions/session_exceptions.py index e45f843a..9b16e287 100644 --- a/src/sessions/session_exceptions.py +++ b/src/sessions/session_exceptions.py @@ -6,4 +6,4 @@ class NonExistentSessionError(Exception): pass class NotLoggedSessionError(BaseException): pass class NotConfiguredSessionError(BaseException): pass class RequireCredentialsSessionError(BaseException): pass -class AlreadyAuthorisedError(BaseException): pass \ No newline at end of file +class AlreadyAuthorisedError(BaseException): pass diff --git a/src/sessions/twitter/__init__.py b/src/sessions/twitter/__init__.py index 7c68785e..40a96afc 100644 --- a/src/sessions/twitter/__init__.py +++ b/src/sessions/twitter/__init__.py @@ -1 +1 @@ -# -*- coding: utf-8 -*- \ No newline at end of file +# -*- coding: utf-8 -*- diff --git a/src/sessions/twitter/compose.py b/src/sessions/twitter/compose.py index 89dc6f16..e76a7034 100644 --- a/src/sessions/twitter/compose.py +++ b/src/sessions/twitter/compose.py @@ -1,11 +1,4 @@ # -*- coding: utf-8 -*- -from __future__ import absolute_import -from __future__ import unicode_literals -from future import standard_library -standard_library.install_aliases() -from builtins import str -from builtins import chr -from builtins import range import platform system = platform.system() from . import utils @@ -21,151 +14,151 @@ from .long_tweets import twishort, tweets log = logging.getLogger("compose") def StripChars(s): - """Converts any html entities in s to their unicode-decoded equivalents and returns a string.""" - entity_re = re.compile(r"&(#\d+|\w+);") - def matchFunc(match): - """Nested function to handle a match object. - If we match &blah; and it's not found, &blah; will be returned. - if we match #\d+, unichr(digits) will be returned. - Else, a unicode string will be returned.""" - if match.group(1).startswith('#'): return chr(int(match.group(1)[1:])) - replacement = html.entities.entitydefs.get(match.group(1), "&%s;" % match.group(1)) - return replacement - return str(entity_re.sub(matchFunc, s)) + """Converts any html entities in s to their unicode-decoded equivalents and returns a string.""" + entity_re = re.compile(r"&(#\d+|\w+);") + def matchFunc(match): + """Nested function to handle a match object. + If we match &blah; and it's not found, &blah; will be returned. + if we match #\d+, unichr(digits) will be returned. + Else, a unicode string will be returned.""" + if match.group(1).startswith('#'): return chr(int(match.group(1)[1:])) + replacement = html.entities.entitydefs.get(match.group(1), "&%s;" % match.group(1)) + return replacement + return str(entity_re.sub(matchFunc, s)) chars = "abcdefghijklmnopqrstuvwxyz" def compose_tweet(tweet, db, relative_times, show_screen_names=False, session=None): - """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" - if system == "Windows": - original_date = arrow.get(tweet.created_at, locale="en") - if relative_times == True: - ts = original_date.humanize(locale=languageHandler.curLang[:2]) - else: - ts = original_date.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) - else: - ts = tweet.created_at - if hasattr(tweet, "message"): - value = "message" - elif hasattr(tweet, "full_text"): - value = "full_text" - else: - value = "text" - if hasattr(tweet, "retweeted_status") and value != "message": - text = StripChars(getattr(tweet.retweeted_status, value)) - else: - text = StripChars(getattr(tweet, value)) - if show_screen_names: - user = tweet.user.screen_name - else: - user = tweet.user.name - source = re.sub(r"(?s)<.*?>", "", tweet.source) - if hasattr(tweet, "retweeted_status"): - if (hasattr(tweet, "message")) == False and tweet.retweeted_status.is_quote_status == False: - text = "RT @%s: %s" % (tweet.retweeted_status.user.screen_name, text) - elif tweet.retweeted_status.is_quote_status: - text = "%s" % (text) - else: - text = "RT @%s: %s" % (tweet.retweeted_status.user.screen_name, text) - if not hasattr(tweet, "message"): + """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" + if system == "Windows": + original_date = arrow.get(tweet.created_at, locale="en") + if relative_times == True: + ts = original_date.humanize(locale=languageHandler.curLang[:2]) + else: + ts = original_date.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) + else: + ts = tweet.created_at + if hasattr(tweet, "message"): + value = "message" + elif hasattr(tweet, "full_text"): + value = "full_text" + else: + value = "text" + if hasattr(tweet, "retweeted_status") and value != "message": + text = StripChars(getattr(tweet.retweeted_status, value)) + else: + text = StripChars(getattr(tweet, value)) + if show_screen_names: + user = tweet.user.screen_name + else: + user = tweet.user.name + source = re.sub(r"(?s)<.*?>", "", tweet.source) + if hasattr(tweet, "retweeted_status"): + if (hasattr(tweet, "message")) == False and tweet.retweeted_status.is_quote_status == False: + text = "RT @%s: %s" % (tweet.retweeted_status.user.screen_name, text) + elif tweet.retweeted_status.is_quote_status: + text = "%s" % (text) + else: + text = "RT @%s: %s" % (tweet.retweeted_status.user.screen_name, text) + if not hasattr(tweet, "message"): - if hasattr(tweet, "retweeted_status"): - text = utils.expand_urls(text, tweet.retweeted_status.entities) - else: - text = utils.expand_urls(text, tweet.entities) - if config.app['app-settings']['handle_longtweets']: pass - return [user+", ", text, ts+", ", source] + if hasattr(tweet, "retweeted_status"): + text = utils.expand_urls(text, tweet.retweeted_status.entities) + else: + text = utils.expand_urls(text, tweet.entities) + if config.app['app-settings']['handle_longtweets']: pass + return [user+", ", text, ts+", ", source] def compose_direct_message(item, db, relative_times, show_screen_names=False, session=None): - if system == "Windows": - # Let's remove the last 3 digits in the timestamp string. - # Twitter sends their "epoch" timestamp with 3 digits for milliseconds and arrow doesn't like it. - original_date = arrow.get(int(item.created_timestamp)) - if relative_times == True: - ts = original_date.humanize(locale=languageHandler.curLang[:2]) - else: - ts = original_date.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) - else: - ts = item.created_timestamp - text = StripChars(item.message_create["message_data"]["text"]) - source = "DM" - sender = session.get_user(item.message_create["sender_id"]) - if db["user_name"] == sender.screen_name: - if show_screen_names: - user = _(u"Dm to %s ") % (session.get_user(item.message_create["target"]["recipient_id"]).screen_name) - else: - user = _(u"Dm to %s ") % (session.get_user(item.message_create["target"]["recipient_id"]).name) - else: - if show_screen_names: - user = sender.screen_name - else: - user = sender.name - if text[-1] in chars: text=text+"." - text = utils.expand_urls(text, item.message_create["message_data"]["entities"]) - return [user+", ", text, ts+", ", source] + if system == "Windows": + # Let's remove the last 3 digits in the timestamp string. + # Twitter sends their "epoch" timestamp with 3 digits for milliseconds and arrow doesn't like it. + original_date = arrow.get(int(item.created_timestamp)) + if relative_times == True: + ts = original_date.humanize(locale=languageHandler.curLang[:2]) + else: + ts = original_date.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) + else: + ts = item.created_timestamp + text = StripChars(item.message_create["message_data"]["text"]) + source = "DM" + sender = session.get_user(item.message_create["sender_id"]) + if db["user_name"] == sender.screen_name: + if show_screen_names: + user = _(u"Dm to %s ") % (session.get_user(item.message_create["target"]["recipient_id"]).screen_name) + else: + user = _(u"Dm to %s ") % (session.get_user(item.message_create["target"]["recipient_id"]).name) + else: + if show_screen_names: + user = sender.screen_name + else: + user = sender.name + if text[-1] in chars: text=text+"." + text = utils.expand_urls(text, item.message_create["message_data"]["entities"]) + return [user+", ", text, ts+", ", source] def compose_quoted_tweet(quoted_tweet, original_tweet, show_screen_names=False, session=None): - """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" - if hasattr(quoted_tweet, "retweeted_status"): - if hasattr(quoted_tweet.retweeted_status, "full_text"): - value = "full_text" - else: - value = "text" - text = StripChars(getattr(quoted_tweet.retweeted_status, value)) - else: - if hasattr(quoted_tweet, "full_text"): - value = "full_text" - else: - value = "text" - text = StripChars(getattr(quoted_tweet, value)) - if show_screen_names: - quoting_user = quoted_tweet.user.screen_name - else: - quoting_user = quoted_tweet.user.name - source = quoted_tweet.source - if hasattr(quoted_tweet, "retweeted_status"): - text = "rt @%s: %s" % (quoted_tweet.retweeted_status.user.screen_name, text) - if text[-1] in chars: text=text+"." - original_user = original_tweet.user.screen_name - if hasattr(original_tweet, "message"): - original_text = original_tweet.message - elif hasattr(original_tweet, "full_text"): - original_text = StripChars(original_tweet.full_text) - else: - original_text = StripChars(original_tweet.text) - quoted_tweet.message = _(u"{0}. Quoted tweet from @{1}: {2}").format( text, original_user, original_text) - quoted_tweet = tweets.clear_url(quoted_tweet) - quoted_tweet.entities["urls"].extend(original_tweet.entities["urls"]) - return quoted_tweet + """ It receives a tweet and returns a list with the user, text for the tweet or message, date and the client where user is.""" + if hasattr(quoted_tweet, "retweeted_status"): + if hasattr(quoted_tweet.retweeted_status, "full_text"): + value = "full_text" + else: + value = "text" + text = StripChars(getattr(quoted_tweet.retweeted_status, value)) + else: + if hasattr(quoted_tweet, "full_text"): + value = "full_text" + else: + value = "text" + text = StripChars(getattr(quoted_tweet, value)) + if show_screen_names: + quoting_user = quoted_tweet.user.screen_name + else: + quoting_user = quoted_tweet.user.name + source = quoted_tweet.source + if hasattr(quoted_tweet, "retweeted_status"): + text = "rt @%s: %s" % (quoted_tweet.retweeted_status.user.screen_name, text) + if text[-1] in chars: text=text+"." + original_user = original_tweet.user.screen_name + if hasattr(original_tweet, "message"): + original_text = original_tweet.message + elif hasattr(original_tweet, "full_text"): + original_text = StripChars(original_tweet.full_text) + else: + original_text = StripChars(original_tweet.text) + quoted_tweet.message = _(u"{0}. Quoted tweet from @{1}: {2}").format( text, original_user, original_text) + quoted_tweet = tweets.clear_url(quoted_tweet) + quoted_tweet.entities["urls"].extend(original_tweet.entities["urls"]) + return quoted_tweet def compose_followers_list(tweet, db, relative_times=True, show_screen_names=False, session=None): - if system == "Windows": - original_date = arrow.get(tweet.created_at, locale="en") - if relative_times == True: - ts = original_date.humanize(locale=languageHandler.curLang[:2]) - else: - ts = original_date.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) - else: - ts = tweet.created_at - if hasattr(tweet, "status"): - if system == "Windows": - original_date2 = arrow.get(tweet.status.created_at, locale="en") - if relative_times: - ts2 = original_date2.humanize(locale=languageHandler.curLang[:2]) - else: - ts2 = original_date2.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) - else: - ts2 = _("Unavailable") - else: - ts2 = _("Unavailable") - return [_(u"%s (@%s). %s followers, %s friends, %s tweets. Last tweeted %s. Joined Twitter %s") % (tweet.name, tweet.screen_name, tweet.followers_count, tweet.friends_count, tweet.statuses_count, ts2, ts)] + if system == "Windows": + original_date = arrow.get(tweet.created_at, locale="en") + if relative_times == True: + ts = original_date.humanize(locale=languageHandler.curLang[:2]) + else: + ts = original_date.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) + else: + ts = tweet.created_at + if hasattr(tweet, "status"): + if system == "Windows": + original_date2 = arrow.get(tweet.status.created_at, locale="en") + if relative_times: + ts2 = original_date2.humanize(locale=languageHandler.curLang[:2]) + else: + ts2 = original_date2.shift(seconds=db["utc_offset"]).format(_(u"dddd, MMMM D, YYYY H:m:s"), locale=languageHandler.curLang[:2]) + else: + ts2 = _("Unavailable") + else: + ts2 = _("Unavailable") + return [_(u"%s (@%s). %s followers, %s friends, %s tweets. Last tweeted %s. Joined Twitter %s") % (tweet.name, tweet.screen_name, tweet.followers_count, tweet.friends_count, tweet.statuses_count, ts2, ts)] def compose_list(list): - name = list.name - if list.description == None: description = _(u"No description available") - else: description = list.description - user = list.user.name - members = str(list.member_count) - if list.mode == "private": status = _(u"private") - else: status = _(u"public") - return [name, description, user, members, status] + name = list.name + if list.description == None: description = _(u"No description available") + else: description = list.description + user = list.user.name + members = str(list.member_count) + if list.mode == "private": status = _(u"private") + else: status = _(u"public") + return [name, description, user, members, status] diff --git a/src/sessions/twitter/long_tweets/__init__.py b/src/sessions/twitter/long_tweets/__init__.py index 20e9c4c4..007ad61c 100644 --- a/src/sessions/twitter/long_tweets/__init__.py +++ b/src/sessions/twitter/long_tweets/__init__.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """ this package holds different modules to extract information regarding long tweets. A long tweet contains more than one tweet (such a quoted tweet), or is made via services like twishort.""" -from __future__ import unicode_literals \ No newline at end of file +from __future__ import unicode_literals diff --git a/src/sessions/twitter/long_tweets/tweets.py b/src/sessions/twitter/long_tweets/tweets.py index 3ab7140d..54d8d86d 100644 --- a/src/sessions/twitter/long_tweets/tweets.py +++ b/src/sessions/twitter/long_tweets/tweets.py @@ -20,33 +20,33 @@ from __future__ import unicode_literals from sessions.twitter import utils def is_long(tweet): - """ Check if the passed tweet contains a quote in its metadata. - tweet dict: a tweet dictionary. - returns True if a quote is detected, False otherwise.""" - if hasattr(tweet, "quoted_status_id") and hasattr(tweet, "quoted_status"): - return tweet.quoted_status_id - elif hasattr(tweet, "retweeted_status") and hasattr(tweet.retweeted_status, "quoted_status_id") and hasattr(tweet.retweeted_status, "quoted_status"): - return tweet.retweeted_status.quoted_status_id - return False + """ Check if the passed tweet contains a quote in its metadata. + tweet dict: a tweet dictionary. + returns True if a quote is detected, False otherwise.""" + if hasattr(tweet, "quoted_status_id") and hasattr(tweet, "quoted_status"): + return tweet.quoted_status_id + elif hasattr(tweet, "retweeted_status") and hasattr(tweet.retweeted_status, "quoted_status_id") and hasattr(tweet.retweeted_status, "quoted_status"): + return tweet.retweeted_status.quoted_status_id + return False def clear_url(tweet): - """ Reads data from a quoted tweet and removes the link to the Status from the tweet's text. - tweet dict: a tweet dictionary. - returns a tweet dictionary without the URL to the status ID in its text to display.""" - if hasattr(tweet, "retweeted_status"): - if hasattr(tweet.retweeted_status, "full_text"): - value = "full_text" - else: - value = "text" - urls = utils.find_urls_in_text(getattr(tweet.retweeted_status, value)) - try: tweet.message = tweet.message.replace(urls[-1], "") - except IndexError: pass - else: - if hasattr(tweet, "full_text"): - value = "full_text" - else: - value = "text" - urls = utils.find_urls_in_text(getattr(tweet, value)) - try: tweet.message = tweet.message.replace(urls[-1], "") - except IndexError: pass - return tweet \ No newline at end of file + """ Reads data from a quoted tweet and removes the link to the Status from the tweet's text. + tweet dict: a tweet dictionary. + returns a tweet dictionary without the URL to the status ID in its text to display.""" + if hasattr(tweet, "retweeted_status"): + if hasattr(tweet.retweeted_status, "full_text"): + value = "full_text" + else: + value = "text" + urls = utils.find_urls_in_text(getattr(tweet.retweeted_status, value)) + try: tweet.message = tweet.message.replace(urls[-1], "") + except IndexError: pass + else: + if hasattr(tweet, "full_text"): + value = "full_text" + else: + value = "text" + urls = utils.find_urls_in_text(getattr(tweet, value)) + try: tweet.message = tweet.message.replace(urls[-1], "") + except IndexError: pass + return tweet diff --git a/src/sessions/twitter/long_tweets/twishort.py b/src/sessions/twitter/long_tweets/twishort.py index 25878cf0..2f465cd3 100644 --- a/src/sessions/twitter/long_tweets/twishort.py +++ b/src/sessions/twitter/long_tweets/twishort.py @@ -28,77 +28,77 @@ from sessions.twitter import utils log = logging.getLogger("long_tweets.twishort") def get_twishort_uri(url): - """ Takes A twishort URl and returns the twishort ID. - url str: an url like http://twishort.com/id. - returns a twishort ID if the URL is valid, False otherwise.""" - try: - return url.split("twishort.com/")[1] - except ValueError: - return False + """ Takes A twishort URl and returns the twishort ID. + url str: an url like http://twishort.com/id. + returns a twishort ID if the URL is valid, False otherwise.""" + try: + return url.split("twishort.com/")[1] + except ValueError: + return False def is_long(tweet): - """ Check if the passed tweet is made with Twishort. - returns True if is a long tweet, False otherwise.""" - long = False - for url in range(0, len(tweet.entities["urls"])): - try: - if tweet.entities["urls"][url] != None and "twishort.com" in tweet.entities["urls"][url]["expanded_url"]: - long = get_twishort_uri(tweet.entities["urls"][url]["expanded_url"]) - except IndexError: - pass - # sometimes Twitter returns URL's with None objects, so let's take it. - # see https://github.com/manuelcortez/TWBlue/issues/103 - except TypeError: - pass - if long == False and hasattr(tweet, "retweeted_status"): - for url in range(0, len(tweet.retweeted_status.entities["urls"])): - try: - if tweet.retweeted_status.entities["urls"][url] != None and "twishort.com" in tweet.retweeted_status.entities["urls"][url]["expanded_url"]: - long = get_twishort_uri(tweet.retweeted_status.entities["urls"][url]["expanded_url"]) - except IndexError: - pass - except TypeError: - pass - return long + """ Check if the passed tweet is made with Twishort. + returns True if is a long tweet, False otherwise.""" + long = False + for url in range(0, len(tweet.entities["urls"])): + try: + if tweet.entities["urls"][url] != None and "twishort.com" in tweet.entities["urls"][url]["expanded_url"]: + long = get_twishort_uri(tweet.entities["urls"][url]["expanded_url"]) + except IndexError: + pass + # sometimes Twitter returns URL's with None objects, so let's take it. + # see https://github.com/manuelcortez/TWBlue/issues/103 + except TypeError: + pass + if long == False and hasattr(tweet, "retweeted_status"): + for url in range(0, len(tweet.retweeted_status.entities["urls"])): + try: + if tweet.retweeted_status.entities["urls"][url] != None and "twishort.com" in tweet.retweeted_status.entities["urls"][url]["expanded_url"]: + long = get_twishort_uri(tweet.retweeted_status.entities["urls"][url]["expanded_url"]) + except IndexError: + pass + except TypeError: + pass + return long def get_full_text(uri): - """ Get Twishort's full text. - uri str: Twishort's identifier. - returns the contents of the tweet.""" - try: - r = requests.get("http://api.twishort.com/1.1/get.json", params={"uri": uri, "api_key": keys.keyring.get("twishort_api_key")}) - msg = r.json()["text"] - # Try to parse possible HTML entities. - from sessions.twitter.compose import StripChars - msg = StripChars(msg) - return msg - except: - return False + """ Get Twishort's full text. + uri str: Twishort's identifier. + returns the contents of the tweet.""" + try: + r = requests.get("http://api.twishort.com/1.1/get.json", params={"uri": uri, "api_key": keys.keyring.get("twishort_api_key")}) + msg = r.json()["text"] + # Try to parse possible HTML entities. + from sessions.twitter.compose import StripChars + msg = StripChars(msg) + return msg + except: + return False def create_tweet(user_token, user_secret, text, media=0): - """ Send a tweet to be extended by using Twishort. - user_token, user_secret str: Twitter user access key and secret, used by TWBlue to authorise against Twitter. - text str: Tweet text, max 10000 characters. - media int: Not used currently. - Returns text to be placed in the Tweet if the post has been succeeded, 0 otherwise.""" - twitter = OAuth1Session(keys.keyring.get("api_key"), client_secret=keys.keyring.get("api_secret"), resource_owner_key=user_token, resource_owner_secret=user_secret) - twishort_key=keys.keyring.get("twishort_api_key") - x_auth_service_provider = "https://api.twitter.com/1.1/account/verify_credentials.json" - twishort_post_url = "http://api.twishort.com/1.1/post.json" - twishort_update_ids_url = "http://api.twishort.com/1.1/update_ids.json" - r=requests.Request('GET', x_auth_service_provider) - prep=twitter.prepare_request(r) - resp=twitter.send(prep) - twitter.headers={ - 'X-Auth-Service-Provider':x_auth_service_provider, - 'X-Verify-Credentials-Authorization':prep.headers['Authorization'], - } - data = {'api_key':twishort_key, - "text": text.encode("utf-8"), - "media": media} - response = twitter.post(twishort_post_url, data=data) - try: - return response.json()["text_to_tweet"] - except: - print("There was a problem creating a long tweet") - return 0 \ No newline at end of file + """ Send a tweet to be extended by using Twishort. + user_token, user_secret str: Twitter user access key and secret, used by TWBlue to authorise against Twitter. + text str: Tweet text, max 10000 characters. + media int: Not used currently. + Returns text to be placed in the Tweet if the post has been succeeded, 0 otherwise.""" + twitter = OAuth1Session(keys.keyring.get("api_key"), client_secret=keys.keyring.get("api_secret"), resource_owner_key=user_token, resource_owner_secret=user_secret) + twishort_key=keys.keyring.get("twishort_api_key") + x_auth_service_provider = "https://api.twitter.com/1.1/account/verify_credentials.json" + twishort_post_url = "http://api.twishort.com/1.1/post.json" + twishort_update_ids_url = "http://api.twishort.com/1.1/update_ids.json" + r=requests.Request('GET', x_auth_service_provider) + prep=twitter.prepare_request(r) + resp=twitter.send(prep) + twitter.headers={ + 'X-Auth-Service-Provider':x_auth_service_provider, + 'X-Verify-Credentials-Authorization':prep.headers['Authorization'], + } + data = {'api_key':twishort_key, + "text": text.encode("utf-8"), + "media": media} + response = twitter.post(twishort_post_url, data=data) + try: + return response.json()["text_to_tweet"] + except: + print("There was a problem creating a long tweet") + return 0 diff --git a/src/sessions/twitter/session.py b/src/sessions/twitter/session.py index 7dd1fb79..1cdbece0 100644 --- a/src/sessions/twitter/session.py +++ b/src/sessions/twitter/session.py @@ -22,432 +22,432 @@ from .wxUI import authorisationDialog log = logging.getLogger("sessions.twitterSession") class Session(base.baseSession): - """ A session object where we will save configuration, the twitter object and a local storage for saving the items retrieved through the Twitter API methods""" + """ A session object where we will save configuration, the twitter object and a local storage for saving the items retrieved through the Twitter API methods""" - def order_buffer(self, name, data, ignore_older=True): - """ Put new items in the local database. - name str: The name for the buffer stored in the dictionary. - data list: A list with tweets. - ignore_older bool: if set to True, items older than the first element on the list will be ignored. - returns the number of items that have been added in this execution""" - if name == "direct_messages": - return self.order_direct_messages(data) - num = 0 - last_id = None - if (name in self.db) == False: - self.db[name] = [] - if ("users" in self.db) == False: - self.db["users"] = {} - if ignore_older and len(self.db[name]) > 0: - if self.settings["general"]["reverse_timelines"] == False: - last_id = self.db[name][0].id - else: - last_id = self.db[name][-1].id - for i in data: - if ignore_older and last_id != None: - if i.id < last_id: - log.error("Ignoring an older tweet... Last id: {0}, tweet id: {1}".format(last_id, i.id)) - continue - if utils.find_item(i.id, self.db[name]) == None and utils.is_allowed(i, self.settings, name) == True: - i = self.check_quoted_status(i) - i = self.check_long_tweet(i) - if i == False: continue - if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i) - else: self.db[name].insert(0, i) - num = num+1 - if hasattr(i, "user"): - if (i.user.id in self.db["users"]) == False: - self.db["users"][i.user.id] = i.user - return num + def order_buffer(self, name, data, ignore_older=True): + """ Put new items in the local database. + name str: The name for the buffer stored in the dictionary. + data list: A list with tweets. + ignore_older bool: if set to True, items older than the first element on the list will be ignored. + returns the number of items that have been added in this execution""" + if name == "direct_messages": + return self.order_direct_messages(data) + num = 0 + last_id = None + if (name in self.db) == False: + self.db[name] = [] + if ("users" in self.db) == False: + self.db["users"] = {} + if ignore_older and len(self.db[name]) > 0: + if self.settings["general"]["reverse_timelines"] == False: + last_id = self.db[name][0].id + else: + last_id = self.db[name][-1].id + for i in data: + if ignore_older and last_id != None: + if i.id < last_id: + log.error("Ignoring an older tweet... Last id: {0}, tweet id: {1}".format(last_id, i.id)) + continue + if utils.find_item(i.id, self.db[name]) == None and utils.is_allowed(i, self.settings, name) == True: + i = self.check_quoted_status(i) + i = self.check_long_tweet(i) + if i == False: continue + if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i) + else: self.db[name].insert(0, i) + num = num+1 + if hasattr(i, "user"): + if (i.user.id in self.db["users"]) == False: + self.db["users"][i.user.id] = i.user + return num - def order_people(self, name, data): - """ Put new items on the local database. Useful for cursored buffers (followers, friends, users of a list and searches) - name str: The name for the buffer stored in the dictionary. - data list: A list with items and some information about cursors. - returns the number of items that have been added in this execution""" - num = 0 - if (name in self.db) == False: - self.db[name] = [] - for i in data: - if utils.find_item(i.id, self.db[name]) == None: - if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i) - else: self.db[name].insert(0, i) - num = num+1 - return num + def order_people(self, name, data): + """ Put new items on the local database. Useful for cursored buffers (followers, friends, users of a list and searches) + name str: The name for the buffer stored in the dictionary. + data list: A list with items and some information about cursors. + returns the number of items that have been added in this execution""" + num = 0 + if (name in self.db) == False: + self.db[name] = [] + for i in data: + if utils.find_item(i.id, self.db[name]) == None: + if self.settings["general"]["reverse_timelines"] == False: self.db[name].append(i) + else: self.db[name].insert(0, i) + num = num+1 + return num - def order_direct_messages(self, data): - """ Add incoming and sent direct messages to their corresponding database items. - data list: A list of direct messages to add. - returns the number of incoming messages processed in this execution, and sends an event with data regarding amount of sent direct messages added.""" - incoming = 0 - sent = 0 - if ("direct_messages" in self.db) == False: - self.db["direct_messages"] = [] - for i in data: - # Twitter returns sender_id as str, which must be converted to int in order to match to our user_id object. - if int(i.message_create["sender_id"]) == self.db["user_id"]: - if "sent_direct_messages" in self.db and utils.find_item(i.id, self.db["sent_direct_messages"]) == None: - if self.settings["general"]["reverse_timelines"] == False: self.db["sent_direct_messages"].append(i) - else: self.db["sent_direct_messages"].insert(0, i) - sent = sent+1 - else: - if utils.find_item(i.id, self.db["direct_messages"]) == None: - if self.settings["general"]["reverse_timelines"] == False: self.db["direct_messages"].append(i) - else: self.db["direct_messages"].insert(0, i) - incoming = incoming+1 - pub.sendMessage("sent-dms-updated", total=sent, account=self.db["user_name"]) - return incoming + def order_direct_messages(self, data): + """ Add incoming and sent direct messages to their corresponding database items. + data list: A list of direct messages to add. + returns the number of incoming messages processed in this execution, and sends an event with data regarding amount of sent direct messages added.""" + incoming = 0 + sent = 0 + if ("direct_messages" in self.db) == False: + self.db["direct_messages"] = [] + for i in data: + # Twitter returns sender_id as str, which must be converted to int in order to match to our user_id object. + if int(i.message_create["sender_id"]) == self.db["user_id"]: + if "sent_direct_messages" in self.db and utils.find_item(i.id, self.db["sent_direct_messages"]) == None: + if self.settings["general"]["reverse_timelines"] == False: self.db["sent_direct_messages"].append(i) + else: self.db["sent_direct_messages"].insert(0, i) + sent = sent+1 + else: + if utils.find_item(i.id, self.db["direct_messages"]) == None: + if self.settings["general"]["reverse_timelines"] == False: self.db["direct_messages"].append(i) + else: self.db["direct_messages"].insert(0, i) + incoming = incoming+1 + pub.sendMessage("sent-dms-updated", total=sent, account=self.db["user_name"]) + return incoming - def __init__(self, *args, **kwargs): - super(Session, self).__init__(*args, **kwargs) - # Adds here the optional cursors objects. - cursors = dict(direct_messages=-1) - self.db["cursors"] = cursors - self.reconnection_function_active = False - self.counter = 0 - self.lists = [] + def __init__(self, *args, **kwargs): + super(Session, self).__init__(*args, **kwargs) + # Adds here the optional cursors objects. + cursors = dict(direct_messages=-1) + self.db["cursors"] = cursors + self.reconnection_function_active = False + self.counter = 0 + self.lists = [] # @_require_configuration - def login(self, verify_credentials=True): - """ Log into twitter using credentials from settings. - if the user account isn't authorised, it needs to call self.authorise() before login.""" - if self.settings["twitter"]["user_key"] != None and self.settings["twitter"]["user_secret"] != None: - try: - log.debug("Logging in to twitter...") - self.auth = tweepy.OAuthHandler(keyring.get("api_key"), keyring.get("api_secret")) - self.auth.set_access_token(self.settings["twitter"]["user_key"], self.settings["twitter"]["user_secret"]) - self.twitter = tweepy.API(self.auth) - if verify_credentials == True: - self.credentials = self.twitter.verify_credentials() - self.logged = True - log.debug("Logged.") - self.counter = 0 - except IOError: - log.error("The login attempt failed.") - self.logged = False - else: - self.logged = False - raise Exceptions.RequireCredentialsSessionError + def login(self, verify_credentials=True): + """ Log into twitter using credentials from settings. + if the user account isn't authorised, it needs to call self.authorise() before login.""" + if self.settings["twitter"]["user_key"] != None and self.settings["twitter"]["user_secret"] != None: + try: + log.debug("Logging in to twitter...") + self.auth = tweepy.OAuthHandler(keyring.get("api_key"), keyring.get("api_secret")) + self.auth.set_access_token(self.settings["twitter"]["user_key"], self.settings["twitter"]["user_secret"]) + self.twitter = tweepy.API(self.auth) + if verify_credentials == True: + self.credentials = self.twitter.verify_credentials() + self.logged = True + log.debug("Logged.") + self.counter = 0 + except IOError: + log.error("The login attempt failed.") + self.logged = False + else: + self.logged = False + raise Exceptions.RequireCredentialsSessionError # @_require_configuration - def authorise(self): - """ Authorises a Twitter account. This function needs to be called for each new session, after self.get_configuration() and before self.login()""" - if self.logged == True: - raise Exceptions.AlreadyAuthorisedError("The authorisation process is not needed at this time.") - else: - self.auth = tweepy.OAuthHandler(keyring.get("api_key"), keyring.get("api_secret")) - redirect_url = self.auth.get_authorization_url() - webbrowser.open_new_tab(redirect_url) - self.authorisation_dialog = authorisationDialog() - self.authorisation_dialog.cancel.Bind(wx.EVT_BUTTON, self.authorisation_cancelled) - self.authorisation_dialog.ok.Bind(wx.EVT_BUTTON, self.authorisation_accepted) - self.authorisation_dialog.ShowModal() + def authorise(self): + """ Authorises a Twitter account. This function needs to be called for each new session, after self.get_configuration() and before self.login()""" + if self.logged == True: + raise Exceptions.AlreadyAuthorisedError("The authorisation process is not needed at this time.") + else: + self.auth = tweepy.OAuthHandler(keyring.get("api_key"), keyring.get("api_secret")) + redirect_url = self.auth.get_authorization_url() + webbrowser.open_new_tab(redirect_url) + self.authorisation_dialog = authorisationDialog() + self.authorisation_dialog.cancel.Bind(wx.EVT_BUTTON, self.authorisation_cancelled) + self.authorisation_dialog.ok.Bind(wx.EVT_BUTTON, self.authorisation_accepted) + self.authorisation_dialog.ShowModal() - def verify_authorisation(self, pincode): - self.auth.get_access_token(pincode) - self.settings["twitter"]["user_key"] = self.auth.access_token - self.settings["twitter"]["user_secret"] = self.auth.access_token_secret - self.settings.write() - del self.auth + def verify_authorisation(self, pincode): + self.auth.get_access_token(pincode) + self.settings["twitter"]["user_key"] = self.auth.access_token + self.settings["twitter"]["user_secret"] = self.auth.access_token_secret + self.settings.write() + del self.auth - def authorisation_cancelled(self, *args, **kwargs): - """ Destroy the authorization dialog. """ - self.authorisation_dialog.Destroy() - del self.authorisation_dialog + def authorisation_cancelled(self, *args, **kwargs): + """ Destroy the authorization dialog. """ + self.authorisation_dialog.Destroy() + del self.authorisation_dialog - def authorisation_accepted(self, *args, **kwargs): - """ Gets the PIN code entered by user and validate it through Twitter.""" - pincode = self.authorisation_dialog.text.GetValue() - self.verify_authorisation(pincode) - self.authorisation_dialog.Destroy() + def authorisation_accepted(self, *args, **kwargs): + """ Gets the PIN code entered by user and validate it through Twitter.""" + pincode = self.authorisation_dialog.text.GetValue() + self.verify_authorisation(pincode) + self.authorisation_dialog.Destroy() - def get_more_items(self, update_function, users=False, dm=False, name=None, *args, **kwargs): - """ Get more items for twitter objects. - update_function str: function to call for getting more items. Must be member of self.twitter. - users, dm bool: If any of these is set to True, the function will treat items as users or dm (they need different handling). - name str: name of the database item to put new element in.""" - results = [] - if "cursor" in kwargs and kwargs["cursor"] == 0: - output.speak(_(u"There are no more items to retrieve in this buffer.")) - return - data = getattr(self.twitter, update_function)(*args, **kwargs) - if users == True: - if type(data) == dict and "next_cursor" in data: - if "next_cursor" in data: # There are more objects to retrieve. - self.db[name]["cursor"] = data["next_cursor"] - else: # Set cursor to 0, wich means no more items available. - self.db[name]["cursor"] = 0 - for i in data["users"]: results.append(i) - elif type(data) == list: - results.extend(data[1:]) - elif dm == True: - if "next_cursor" in data: # There are more objects to retrieve. - self.db[name]["cursor"] = data["next_cursor"] - else: # Set cursor to 0, wich means no more items available. - self.db[name]["cursor"] = 0 - for i in data["events"]: results.append(i) - else: - results.extend(data[1:]) - return results + def get_more_items(self, update_function, users=False, dm=False, name=None, *args, **kwargs): + """ Get more items for twitter objects. + update_function str: function to call for getting more items. Must be member of self.twitter. + users, dm bool: If any of these is set to True, the function will treat items as users or dm (they need different handling). + name str: name of the database item to put new element in.""" + results = [] + if "cursor" in kwargs and kwargs["cursor"] == 0: + output.speak(_(u"There are no more items to retrieve in this buffer.")) + return + data = getattr(self.twitter, update_function)(*args, **kwargs) + if users == True: + if type(data) == dict and "next_cursor" in data: + if "next_cursor" in data: # There are more objects to retrieve. + self.db[name]["cursor"] = data["next_cursor"] + else: # Set cursor to 0, wich means no more items available. + self.db[name]["cursor"] = 0 + for i in data["users"]: results.append(i) + elif type(data) == list: + results.extend(data[1:]) + elif dm == True: + if "next_cursor" in data: # There are more objects to retrieve. + self.db[name]["cursor"] = data["next_cursor"] + else: # Set cursor to 0, wich means no more items available. + self.db[name]["cursor"] = 0 + for i in data["events"]: results.append(i) + else: + results.extend(data[1:]) + return results - def api_call(self, call_name, action="", _sound=None, report_success=False, report_failure=True, preexec_message="", *args, **kwargs): - """ Make a call to the Twitter API. If there is a connectionError or another exception not related to Twitter, It will call the method again at least 25 times, waiting a while between calls. Useful for post methods. - If twitter returns an error, it will not call the method anymore. - call_name str: The method to call - action str: What you are doing on twitter, it will be reported to the user if report_success is set to True. - for example "following @tw_blue2" will be reported as "following @tw_blue2 succeeded". - _sound str: a sound to play if the call is executed properly. - report_success and report_failure bool: These are self explanatory. True or False. - preexec_message str: A message to speak to the user while the method is running, example: "trying to follow x user".""" - finished = False - tries = 0 - if preexec_message: - output.speak(preexec_message, True) - while finished==False and tries < 25: - try: - val = getattr(self.twitter, call_name)(*args, **kwargs) - finished = True - except TweepError as e: - output.speak(e.reason) - val = None - if e.error_code != 403 and e.error_code != 404: - tries = tries+1 - time.sleep(5) - elif report_failure and hasattr(e, 'reason'): - output.speak(_("%s failed. Reason: %s") % (action, e.reason)) - finished = True + def api_call(self, call_name, action="", _sound=None, report_success=False, report_failure=True, preexec_message="", *args, **kwargs): + """ Make a call to the Twitter API. If there is a connectionError or another exception not related to Twitter, It will call the method again at least 25 times, waiting a while between calls. Useful for post methods. + If twitter returns an error, it will not call the method anymore. + call_name str: The method to call + action str: What you are doing on twitter, it will be reported to the user if report_success is set to True. + for example "following @tw_blue2" will be reported as "following @tw_blue2 succeeded". + _sound str: a sound to play if the call is executed properly. + report_success and report_failure bool: These are self explanatory. True or False. + preexec_message str: A message to speak to the user while the method is running, example: "trying to follow x user".""" + finished = False + tries = 0 + if preexec_message: + output.speak(preexec_message, True) + while finished==False and tries < 25: + try: + val = getattr(self.twitter, call_name)(*args, **kwargs) + finished = True + except TweepError as e: + output.speak(e.reason) + val = None + if e.error_code != 403 and e.error_code != 404: + tries = tries+1 + time.sleep(5) + elif report_failure and hasattr(e, 'reason'): + output.speak(_("%s failed. Reason: %s") % (action, e.reason)) + finished = True # except: # tries = tries + 1 # time.sleep(5) - if report_success: - output.speak(_("%s succeeded.") % action) - if _sound != None: self.sound.play(_sound) - return val + if report_success: + output.speak(_("%s succeeded.") % action) + if _sound != None: self.sound.play(_sound) + return val - def search(self, name, *args, **kwargs): - """ Search in twitter, passing args and kwargs as arguments to the Twython function.""" - tl = self.twitter.search(*args, **kwargs) - tl.reverse() - return tl + def search(self, name, *args, **kwargs): + """ Search in twitter, passing args and kwargs as arguments to the Twython function.""" + tl = self.twitter.search(*args, **kwargs) + tl.reverse() + return tl # @_require_login - def get_favourites_timeline(self, name, *args, **kwargs): - """ Gets favourites for the authenticated user or a friend or follower. - name str: Name for storage in the database. - args and kwargs are passed directly to the Twython function.""" - tl = self.call_paged("favorites", *args, **kwargs) - return self.order_buffer(name, tl) + def get_favourites_timeline(self, name, *args, **kwargs): + """ Gets favourites for the authenticated user or a friend or follower. + name str: Name for storage in the database. + args and kwargs are passed directly to the Twython function.""" + tl = self.call_paged("favorites", *args, **kwargs) + return self.order_buffer(name, tl) - def call_paged(self, update_function, *args, **kwargs): - """ Makes a call to the Twitter API methods several times. Useful for get methods. - this function is needed for retrieving more than 200 items. - update_function str: The function to call. This function must be child of self.twitter - args and kwargs are passed to update_function. - returns a list with all items retrieved.""" - max = 0 - results = [] - data = getattr(self.twitter, update_function)(count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) - results.extend(data) - for i in range(0, max): - if i == 0: max_id = results[-1].id - else: max_id = results[0].id - data = getattr(self.twitter, update_function)(max_id=max_id, count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) - results.extend(data) - results.reverse() - return results + def call_paged(self, update_function, *args, **kwargs): + """ Makes a call to the Twitter API methods several times. Useful for get methods. + this function is needed for retrieving more than 200 items. + update_function str: The function to call. This function must be child of self.twitter + args and kwargs are passed to update_function. + returns a list with all items retrieved.""" + max = 0 + results = [] + data = getattr(self.twitter, update_function)(count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) + results.extend(data) + for i in range(0, max): + if i == 0: max_id = results[-1].id + else: max_id = results[0].id + data = getattr(self.twitter, update_function)(max_id=max_id, count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) + results.extend(data) + results.reverse() + return results # @_require_login - def get_user_info(self): - """ Retrieves some information required by TWBlue for setup.""" - f = self.twitter.get_settings() - sn = f["screen_name"] - self.settings["twitter"]["user_name"] = sn - self.db["user_name"] = sn - self.db["user_id"] = self.twitter.get_user(screen_name=sn).id - try: - self.db["utc_offset"] = f["time_zone"]["utc_offset"] - except KeyError: - self.db["utc_offset"] = -time.timezone - # Get twitter's supported languages and save them in a global variable - #so we won't call to this method once per session. - if len(application.supported_languages) == 0: - application.supported_languages = self.twitter.supported_languages() - self.get_lists() - self.get_muted_users() - self.settings.write() + def get_user_info(self): + """ Retrieves some information required by TWBlue for setup.""" + f = self.twitter.get_settings() + sn = f["screen_name"] + self.settings["twitter"]["user_name"] = sn + self.db["user_name"] = sn + self.db["user_id"] = self.twitter.get_user(screen_name=sn).id + try: + self.db["utc_offset"] = f["time_zone"]["utc_offset"] + except KeyError: + self.db["utc_offset"] = -time.timezone + # Get twitter's supported languages and save them in a global variable + #so we won't call to this method once per session. + if len(application.supported_languages) == 0: + application.supported_languages = self.twitter.supported_languages() + self.get_lists() + self.get_muted_users() + self.settings.write() # @_require_login - def get_lists(self): - """ Gets the lists that the user is subscribed to and stores them in the database. Returns None.""" - self.db["lists"] = self.twitter.lists_all(reverse=True) + def get_lists(self): + """ Gets the lists that the user is subscribed to and stores them in the database. Returns None.""" + self.db["lists"] = self.twitter.lists_all(reverse=True) # @_require_login - def get_muted_users(self): - """ Gets muted users (oh really?).""" - self.db["muted_users"] = self.twitter.mutes_ids() + def get_muted_users(self): + """ Gets muted users (oh really?).""" + self.db["muted_users"] = self.twitter.mutes_ids() # @_require_login - def get_stream(self, name, function, *args, **kwargs): - """ Retrieves the items for a regular stream. - name str: Name to save items to the database. - function str: A function to get the items.""" - last_id = -1 - if name in self.db: - try: - if self.db[name][0]["id"] > self.db[name][-1]["id"]: - last_id = self.db[name][0]["id"] - else: - last_id = self.db[name][-1]["id"] - except IndexError: - pass - tl = self.call_paged(function, sinze_id=last_id, *args, **kwargs) - self.order_buffer(name, tl) + def get_stream(self, name, function, *args, **kwargs): + """ Retrieves the items for a regular stream. + name str: Name to save items to the database. + function str: A function to get the items.""" + last_id = -1 + if name in self.db: + try: + if self.db[name][0]["id"] > self.db[name][-1]["id"]: + last_id = self.db[name][0]["id"] + else: + last_id = self.db[name][-1]["id"] + except IndexError: + pass + tl = self.call_paged(function, sinze_id=last_id, *args, **kwargs) + self.order_buffer(name, tl) - def get_cursored_stream(self, name, function, items="users", get_previous=False, *args, **kwargs): - """ Gets items for API calls that require using cursors to paginate the results. - name str: Name to save it in the database. - function str: Function that provides the items. - items: When the function returns the list with results, items will tell how the order function should be look. for example get_followers_list returns a list and users are under list["users"], here the items should point to "users". - get_previous bool: wether this function will be used to get previous items in a buffer or load the buffer from scratch. - returns number of items retrieved.""" - items_ = [] - try: - if "cursor" in self.db[name] and get_previous: - cursor = self.db[name]["cursor"] - else: - cursor = -1 - except KeyError: - cursor = -1 - if cursor != -1: - tl = getattr(self.twitter, function)(cursor=cursor, count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) - else: - tl = getattr(self.twitter, function)(count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) - tl[items].reverse() - num = self.order_cursored_buffer(name, tl[items]) - # Recently, Twitter's new endpoints have cursor if there are more results. - if "next_cursor" in tl: - self.db[name]["cursor"] = tl["next_cursor"] - else: - self.db[name]["cursor"] = 0 - return num + def get_cursored_stream(self, name, function, items="users", get_previous=False, *args, **kwargs): + """ Gets items for API calls that require using cursors to paginate the results. + name str: Name to save it in the database. + function str: Function that provides the items. + items: When the function returns the list with results, items will tell how the order function should be look. for example get_followers_list returns a list and users are under list["users"], here the items should point to "users". + get_previous bool: wether this function will be used to get previous items in a buffer or load the buffer from scratch. + returns number of items retrieved.""" + items_ = [] + try: + if "cursor" in self.db[name] and get_previous: + cursor = self.db[name]["cursor"] + else: + cursor = -1 + except KeyError: + cursor = -1 + if cursor != -1: + tl = getattr(self.twitter, function)(cursor=cursor, count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) + else: + tl = getattr(self.twitter, function)(count=self.settings["general"]["max_tweets_per_call"], *args, **kwargs) + tl[items].reverse() + num = self.order_cursored_buffer(name, tl[items]) + # Recently, Twitter's new endpoints have cursor if there are more results. + if "next_cursor" in tl: + self.db[name]["cursor"] = tl["next_cursor"] + else: + self.db[name]["cursor"] = 0 + return num - def check_connection(self): - """ Restart the Twitter object every 5 executions. It is useful for dealing with requests timeout and other oddities.""" - log.debug("Executing check connection...") - self.counter += 1 - if self.counter >= 4: - log.debug("Restarting connection after 5 minutes.") - del self.twitter - self.logged = False - self.login(False) - self.counter = 0 + def check_connection(self): + """ Restart the Twitter object every 5 executions. It is useful for dealing with requests timeout and other oddities.""" + log.debug("Executing check connection...") + self.counter += 1 + if self.counter >= 4: + log.debug("Restarting connection after 5 minutes.") + del self.twitter + self.logged = False + self.login(False) + self.counter = 0 - def check_quoted_status(self, tweet): - """ Helper for get_quoted_tweet. Get a quoted status inside a tweet and create a special tweet with all info available. - tweet dict: A tweet dictionary. - Returns a quoted tweet or the original tweet if is not a quote""" - status = tweets.is_long(tweet) - if status != False and config.app["app-settings"]["handle_longtweets"]: - quoted_tweet = self.get_quoted_tweet(tweet) - return quoted_tweet - return tweet + def check_quoted_status(self, tweet): + """ Helper for get_quoted_tweet. Get a quoted status inside a tweet and create a special tweet with all info available. + tweet dict: A tweet dictionary. + Returns a quoted tweet or the original tweet if is not a quote""" + status = tweets.is_long(tweet) + if status != False and config.app["app-settings"]["handle_longtweets"]: + quoted_tweet = self.get_quoted_tweet(tweet) + return quoted_tweet + return tweet - def get_quoted_tweet(self, tweet): - """ Process a tweet and extract all information related to the quote. """ - quoted_tweet = tweet - if hasattr(tweet, "full_text"): - value = "full_text" - else: - value = "text" - setattr(quoted_tweet, value, utils.expand_urls(getattr(quoted_tweet, value), quoted_tweet.entities)) - if quoted_tweet.is_quote_status == True and hasattr(quoted_tweet, "quoted_status"): - original_tweet = quoted_tweet.quoted_status - elif hasattr(quoted_tweet, "retweeted_status") and quoted_tweet.retweeted_status.is_quote_status == True and hasattr(quoted_tweet.retweeted_status, "quoted_status"): - original_tweet = quoted_tweet.retweeted_status.quoted_status - else: - return quoted_tweet - original_tweet = self.check_long_tweet(original_tweet) - if hasattr(original_tweet, "full_text"): - value = "full_text" - elif hasattr(original_tweet, "message"): - value = "message" - else: - value = "text" - setattr(original_tweet, value, utils.expand_urls(getattr(original_tweet, value), original_tweet.entities)) - return compose.compose_quoted_tweet(quoted_tweet, original_tweet) + def get_quoted_tweet(self, tweet): + """ Process a tweet and extract all information related to the quote. """ + quoted_tweet = tweet + if hasattr(tweet, "full_text"): + value = "full_text" + else: + value = "text" + setattr(quoted_tweet, value, utils.expand_urls(getattr(quoted_tweet, value), quoted_tweet.entities)) + if quoted_tweet.is_quote_status == True and hasattr(quoted_tweet, "quoted_status"): + original_tweet = quoted_tweet.quoted_status + elif hasattr(quoted_tweet, "retweeted_status") and quoted_tweet.retweeted_status.is_quote_status == True and hasattr(quoted_tweet.retweeted_status, "quoted_status"): + original_tweet = quoted_tweet.retweeted_status.quoted_status + else: + return quoted_tweet + original_tweet = self.check_long_tweet(original_tweet) + if hasattr(original_tweet, "full_text"): + value = "full_text" + elif hasattr(original_tweet, "message"): + value = "message" + else: + value = "text" + setattr(original_tweet, value, utils.expand_urls(getattr(original_tweet, value), original_tweet.entities)) + return compose.compose_quoted_tweet(quoted_tweet, original_tweet) - def check_long_tweet(self, tweet): - """ Process a tweet and add extra info if it's a long tweet made with Twyshort. - tweet dict: a tweet object. - returns a tweet with a new argument message, or original tweet if it's not a long tweet.""" - long = twishort.is_long(tweet) - if long != False and config.app["app-settings"]["handle_longtweets"]: - message = twishort.get_full_text(long) - if hasattr(tweet, "quoted_status"): - tweet.quoted_status.message = message - if tweet.quoted_status.message == False: return False - tweet.quoted_status.twishort = True - for i in tweet.quoted_status.entities["user_mentions"]: - if "@%s" % (i["screen_name"]) not in tweet.quoted_status.message and i["screen_name"] != tweet.user.screen_name: - if hasattr(tweet.quoted_status, "retweeted_status") and tweet.retweeted_status.user.screen_name == i["screen_name"]: - continue - tweet.quoted_status.message = u"@%s %s" % (i["screen_name"], tweet.message) - else: - tweet.message = message - if tweet.message == False: return False - tweet.twishort = True - for i in tweet.entities["user_mentions"]: - if "@%s" % (i["screen_name"]) not in tweet.message and i["screen_name"] != tweet.user.screen_name: - if hasattr(tweet, "retweeted_status") and tweet.retweeted_status.user.screen_name == i["screen_name"]: - continue - return tweet + def check_long_tweet(self, tweet): + """ Process a tweet and add extra info if it's a long tweet made with Twyshort. + tweet dict: a tweet object. + returns a tweet with a new argument message, or original tweet if it's not a long tweet.""" + long = twishort.is_long(tweet) + if long != False and config.app["app-settings"]["handle_longtweets"]: + message = twishort.get_full_text(long) + if hasattr(tweet, "quoted_status"): + tweet.quoted_status.message = message + if tweet.quoted_status.message == False: return False + tweet.quoted_status.twishort = True + for i in tweet.quoted_status.entities["user_mentions"]: + if "@%s" % (i["screen_name"]) not in tweet.quoted_status.message and i["screen_name"] != tweet.user.screen_name: + if hasattr(tweet.quoted_status, "retweeted_status") and tweet.retweeted_status.user.screen_name == i["screen_name"]: + continue + tweet.quoted_status.message = u"@%s %s" % (i["screen_name"], tweet.message) + else: + tweet.message = message + if tweet.message == False: return False + tweet.twishort = True + for i in tweet.entities["user_mentions"]: + if "@%s" % (i["screen_name"]) not in tweet.message and i["screen_name"] != tweet.user.screen_name: + if hasattr(tweet, "retweeted_status") and tweet.retweeted_status.user.screen_name == i["screen_name"]: + continue + return tweet - def get_user(self, id): - """ Returns an user object associated with an ID. - id str: User identifier, provided by Twitter. - returns a tweepy user object.""" - if ("users" in self.db) == False or (id in self.db["users"]) == False: - try: - user = self.twitter.get_user(id=id) - except TweepError as err: - user = UserModel(None) - user.screen_name = "deleted_user" - user.id = id - user.name = _("Deleted account") - user.id_str = id - self.db["users"][user.id_str] = user - return user - else: - return self.db["users"][id] + def get_user(self, id): + """ Returns an user object associated with an ID. + id str: User identifier, provided by Twitter. + returns a tweepy user object.""" + if ("users" in self.db) == False or (id in self.db["users"]) == False: + try: + user = self.twitter.get_user(id=id) + except TweepError as err: + user = UserModel(None) + user.screen_name = "deleted_user" + user.id = id + user.name = _("Deleted account") + user.id_str = id + self.db["users"][user.id_str] = user + return user + else: + return self.db["users"][id] - def get_user_by_screen_name(self, screen_name): - """ Returns an user identifier associated with a screen_name. - screen_name str: User name, such as tw_blue2, provided by Twitter. - returns an user ID.""" - if ("users" in self.db) == False: - user = utils.if_user_exists(self.twitter, screen_name) - self.db["users"][user["id_str"]] = user - return user["id_str"] - else: - for i in list(self.db["users"].keys()): - if self.db["users"][i].screen_name == screen_name: - return self.db["users"][i].id_str - user = utils.if_user_exists(self.twitter, screen_name) - self.db["users"][user.id_str] = user - return user.id_str + def get_user_by_screen_name(self, screen_name): + """ Returns an user identifier associated with a screen_name. + screen_name str: User name, such as tw_blue2, provided by Twitter. + returns an user ID.""" + if ("users" in self.db) == False: + user = utils.if_user_exists(self.twitter, screen_name) + self.db["users"][user["id_str"]] = user + return user["id_str"] + else: + for i in list(self.db["users"].keys()): + if self.db["users"][i].screen_name == screen_name: + return self.db["users"][i].id_str + user = utils.if_user_exists(self.twitter, screen_name) + self.db["users"][user.id_str] = user + return user.id_str - def save_users(self, user_ids): - """ Adds all new users to the users database. """ - if len(user_ids) == 0: - return - log.debug("Received %d user IDS to be added in the database." % (len(user_ids))) - users_to_retrieve = [user_id for user_id in user_ids if user_id not in self.db["users"]] - # Remove duplicates - users_to_retrieve = list(dict.fromkeys(users_to_retrieve)) - if len(users_to_retrieve) == 0: - return - log.debug("TWBlue will get %d new users from Twitter." % (len(users_to_retrieve))) - users = self.twitter.lookup_users(user_ids=users_to_retrieve, tweet_mode="extended") - for user in users: - self.db["users"][user.id_str] = user - log.debug("Added %d new users" % (len(users))) \ No newline at end of file + def save_users(self, user_ids): + """ Adds all new users to the users database. """ + if len(user_ids) == 0: + return + log.debug("Received %d user IDS to be added in the database." % (len(user_ids))) + users_to_retrieve = [user_id for user_id in user_ids if user_id not in self.db["users"]] + # Remove duplicates + users_to_retrieve = list(dict.fromkeys(users_to_retrieve)) + if len(users_to_retrieve) == 0: + return + log.debug("TWBlue will get %d new users from Twitter." % (len(users_to_retrieve))) + users = self.twitter.lookup_users(user_ids=users_to_retrieve, tweet_mode="extended") + for user in users: + self.db["users"][user.id_str] = user + log.debug("Added %d new users" % (len(users))) diff --git a/src/sessions/twitter/utils.py b/src/sessions/twitter/utils.py index 57e02f3a..2e44f21b 100644 --- a/src/sessions/twitter/utils.py +++ b/src/sessions/twitter/utils.py @@ -19,198 +19,198 @@ url_re2 = re.compile("(?:\w+://|www\.)[^ ,.?!#%=+][^ \\n\\t]*") bad_chars = '\'\\\n.,[](){}:;"' def find_urls_in_text(text): - return url_re2.findall(text) + return url_re2.findall(text) def find_urls (tweet): - urls = [] - # Let's add URLS from tweet entities. - if hasattr(tweet, "message_create"): - entities = tweet.message_create["message_data"]["entities"] - else: - entities = tweet.entities - for i in entities["urls"]: - if i["expanded_url"] not in urls: - urls.append(i["expanded_url"]) - if hasattr(tweet, "quoted_status"): - for i in tweet.quoted_status.entities["urls"]: - if i["expanded_url"] not in urls: - urls.append(i["expanded_url"]) - if hasattr(tweet, "retweeted_status"): - for i in tweet.retweeted_status.entities["urls"]: - if i["expanded_url"] not in urls: - urls.append(i["expanded_url"]) - if hasattr(tweet["retweeted_status"], "quoted_status"): - for i in tweet.retweeted_status.quoted_status.entities["urls"]: - if i["expanded_url"] not in urls: - urls.append(i["expanded_url"]) - if hasattr(tweet, "message"): - i = "message" - elif hasattr(tweet, "full_text"): - i = "full_text" - else: - i = "text" - if hasattr(tweet, "message_create"): - extracted_urls = find_urls_in_text(tweet.message_create["message_data"]["text"]) - else: - extracted_urls = find_urls_in_text(getattr(tweet, i)) - # Don't include t.co links (mostly they are photos or shortened versions of already added URLS). - for i in extracted_urls: - if i not in urls and "https://t.co" not in i: - urls.append(i) - return urls + urls = [] + # Let's add URLS from tweet entities. + if hasattr(tweet, "message_create"): + entities = tweet.message_create["message_data"]["entities"] + else: + entities = tweet.entities + for i in entities["urls"]: + if i["expanded_url"] not in urls: + urls.append(i["expanded_url"]) + if hasattr(tweet, "quoted_status"): + for i in tweet.quoted_status.entities["urls"]: + if i["expanded_url"] not in urls: + urls.append(i["expanded_url"]) + if hasattr(tweet, "retweeted_status"): + for i in tweet.retweeted_status.entities["urls"]: + if i["expanded_url"] not in urls: + urls.append(i["expanded_url"]) + if hasattr(tweet["retweeted_status"], "quoted_status"): + for i in tweet.retweeted_status.quoted_status.entities["urls"]: + if i["expanded_url"] not in urls: + urls.append(i["expanded_url"]) + if hasattr(tweet, "message"): + i = "message" + elif hasattr(tweet, "full_text"): + i = "full_text" + else: + i = "text" + if hasattr(tweet, "message_create"): + extracted_urls = find_urls_in_text(tweet.message_create["message_data"]["text"]) + else: + extracted_urls = find_urls_in_text(getattr(tweet, i)) + # Don't include t.co links (mostly they are photos or shortened versions of already added URLS). + for i in extracted_urls: + if i not in urls and "https://t.co" not in i: + urls.append(i) + return urls def find_item(id, listItem): - for i in range(0, len(listItem)): - if listItem[i].id == id: return i - return None + for i in range(0, len(listItem)): + if listItem[i].id == id: return i + return None def find_list(name, lists): - for i in range(0, len(lists)): - if lists[i].name == name: return lists[i].id + for i in range(0, len(lists)): + if lists[i].name == name: return lists[i].id def is_audio(tweet): - try: - if len(find_urls(tweet)) < 1: - return False - if hasattr(tweet, "message_create"): - entities = tweet.message_create["message_data"]["entities"] - else: - entities = tweet.entities - if len(entities["hashtags"]) > 0: - for i in entities["hashtags"]: - if i["text"] == "audio": - return True - except IndexError: - print(tweet.entities["hashtags"]) - log.exception("Exception while executing is_audio hashtag algorithm") + try: + if len(find_urls(tweet)) < 1: + return False + if hasattr(tweet, "message_create"): + entities = tweet.message_create["message_data"]["entities"] + else: + entities = tweet.entities + if len(entities["hashtags"]) > 0: + for i in entities["hashtags"]: + if i["text"] == "audio": + return True + except IndexError: + print(tweet.entities["hashtags"]) + log.exception("Exception while executing is_audio hashtag algorithm") def is_geocoded(tweet): - if hasattr(tweet, "coordinates") and tweet.coordinates != None: - return True + if hasattr(tweet, "coordinates") and tweet.coordinates != None: + return True def is_media(tweet): - if hasattr(tweet, "message_create"): - entities = tweet.message_create["message_data"]["entities"] - else: - entities = tweet.entities - if entities.get("media") == None: - return False - for i in entities["media"]: - if i.get("type") != None and i.get("type") == "photo": - return True - return False + if hasattr(tweet, "message_create"): + entities = tweet.message_create["message_data"]["entities"] + else: + entities = tweet.entities + if entities.get("media") == None: + return False + for i in entities["media"]: + if i.get("type") != None and i.get("type") == "photo": + return True + return False def get_all_mentioned(tweet, conf, field="screen_name"): - """ Gets all users that have been mentioned.""" - results = [] - for i in tweet.entities["user_mentions"]: - if i["screen_name"] != conf["user_name"] and i["screen_name"] != tweet.user.screen_name: - if i.get(field) not in results: - results.append(i.get(field)) - return results + """ Gets all users that have been mentioned.""" + results = [] + for i in tweet.entities["user_mentions"]: + if i["screen_name"] != conf["user_name"] and i["screen_name"] != tweet.user.screen_name: + if i.get(field) not in results: + results.append(i.get(field)) + return results def get_all_users(tweet, conf): - string = [] - if hasattr(tweet, "retweeted_status"): - string.append(tweet.user.screen_name) - tweet = tweet.retweeted_status - if hasattr(tweet, "sender"): - string.append(tweet.sender.screen_name) - else: - if tweet.user.screen_name != conf["user_name"]: - string.append(tweet.user.screen_name) - for i in tweet.entities["user_mentions"]: - if i["screen_name"] != conf["user_name"] and i["screen_name"] != tweet.user.screen_name: - if i["screen_name"] not in string: - string.append(i["screen_name"]) - if len(string) == 0: - string.append(tweet.user.screen_name) - return string + string = [] + if hasattr(tweet, "retweeted_status"): + string.append(tweet.user.screen_name) + tweet = tweet.retweeted_status + if hasattr(tweet, "sender"): + string.append(tweet.sender.screen_name) + else: + if tweet.user.screen_name != conf["user_name"]: + string.append(tweet.user.screen_name) + for i in tweet.entities["user_mentions"]: + if i["screen_name"] != conf["user_name"] and i["screen_name"] != tweet.user.screen_name: + if i["screen_name"] not in string: + string.append(i["screen_name"]) + if len(string) == 0: + string.append(tweet.user.screen_name) + return string def if_user_exists(twitter, user): - try: - data = twitter.get_user(screen_name=user) - return data - except TweepError as err: - if err.api_code == 50: - return None - else: - return user + try: + data = twitter.get_user(screen_name=user) + return data + except TweepError as err: + if err.api_code == 50: + return None + else: + return user def is_allowed(tweet, settings, buffer_name): - clients = settings["twitter"]["ignored_clients"] - if hasattr(tweet, "sender"): return True - allowed = True - tweet_data = {} - if hasattr(tweet, "retweeted_status"): - tweet_data["retweet"] = True - if tweet.in_reply_to_status_id_str != None: - tweet_data["reply"] = True - if hasattr(tweet, "quoted_status"): - tweet_data["quote"] = True - if hasattr(tweet, "retweeted_status"): - tweet = tweet.retweeted_status - source = tweet.source - for i in clients: - if i.lower() == source.lower(): - return False - return filter_tweet(tweet, tweet_data, settings, buffer_name) + clients = settings["twitter"]["ignored_clients"] + if hasattr(tweet, "sender"): return True + allowed = True + tweet_data = {} + if hasattr(tweet, "retweeted_status"): + tweet_data["retweet"] = True + if tweet.in_reply_to_status_id_str != None: + tweet_data["reply"] = True + if hasattr(tweet, "quoted_status"): + tweet_data["quote"] = True + if hasattr(tweet, "retweeted_status"): + tweet = tweet.retweeted_status + source = tweet.source + for i in clients: + if i.lower() == source.lower(): + return False + return filter_tweet(tweet, tweet_data, settings, buffer_name) def filter_tweet(tweet, tweet_data, settings, buffer_name): - if hasattr(tweet, "full_text"): - value = "full_text" - else: - value = "text" - for i in settings["filters"]: - if settings["filters"][i]["in_buffer"] == buffer_name: - regexp = settings["filters"][i]["regexp"] - word = settings["filters"][i]["word"] - # Added if/else for compatibility reasons. - if "allow_rts" in settings["filters"][i]: - allow_rts = settings["filters"][i]["allow_rts"] - else: - allow_rts = "True" - if "allow_quotes" in settings["filters"][i]: - allow_quotes = settings["filters"][i]["allow_quotes"] - else: - allow_quotes = "True" - if "allow_replies" in settings["filters"][i]: - allow_replies = settings["filters"][i]["allow_replies"] - else: - allow_replies = "True" - if allow_rts == "False" and "retweet" in tweet_data: - return False - if allow_quotes == "False" and "quote" in tweet_data: - return False - if allow_replies == "False" and "reply" in tweet_data: - return False - if word != "" and settings["filters"][i]["if_word_exists"]: - if word in getattr(tweet, value): - return False - elif word != "" and settings["filters"][i]["if_word_exists"] == False: - if word not in getattr(tweet, value): - return False - if settings["filters"][i]["in_lang"] == "True": - if getattr(tweet, lang) not in settings["filters"][i]["languages"]: - return False - elif settings["filters"][i]["in_lang"] == "False": - if tweet.lang in settings["filters"][i]["languages"]: - return False - return True + if hasattr(tweet, "full_text"): + value = "full_text" + else: + value = "text" + for i in settings["filters"]: + if settings["filters"][i]["in_buffer"] == buffer_name: + regexp = settings["filters"][i]["regexp"] + word = settings["filters"][i]["word"] + # Added if/else for compatibility reasons. + if "allow_rts" in settings["filters"][i]: + allow_rts = settings["filters"][i]["allow_rts"] + else: + allow_rts = "True" + if "allow_quotes" in settings["filters"][i]: + allow_quotes = settings["filters"][i]["allow_quotes"] + else: + allow_quotes = "True" + if "allow_replies" in settings["filters"][i]: + allow_replies = settings["filters"][i]["allow_replies"] + else: + allow_replies = "True" + if allow_rts == "False" and "retweet" in tweet_data: + return False + if allow_quotes == "False" and "quote" in tweet_data: + return False + if allow_replies == "False" and "reply" in tweet_data: + return False + if word != "" and settings["filters"][i]["if_word_exists"]: + if word in getattr(tweet, value): + return False + elif word != "" and settings["filters"][i]["if_word_exists"] == False: + if word not in getattr(tweet, value): + return False + if settings["filters"][i]["in_lang"] == "True": + if getattr(tweet, lang) not in settings["filters"][i]["languages"]: + return False + elif settings["filters"][i]["in_lang"] == "False": + if tweet.lang in settings["filters"][i]["languages"]: + return False + return True def twitter_error(error): - if error.api_code == 179: - msg = _(u"Sorry, you are not authorised to see this status.") - elif error.api_code == 144: - msg = _(u"No status found with that ID") - else: - msg = _(u"Error code {0}").format(error.api_code,) - output.speak(msg) + if error.api_code == 179: + msg = _(u"Sorry, you are not authorised to see this status.") + elif error.api_code == 144: + msg = _(u"No status found with that ID") + else: + msg = _(u"Error code {0}").format(error.api_code,) + output.speak(msg) def expand_urls(text, entities): - """ Expand all URLS present in text with information found in entities""" - urls = find_urls_in_text(text) - for url in entities["urls"]: - if url["url"] in text: - text = text.replace(url["url"], url["expanded_url"]) - return text + """ Expand all URLS present in text with information found in entities""" + urls = find_urls_in_text(text) + for url in entities["urls"]: + if url["url"] in text: + text = text.replace(url["url"], url["expanded_url"]) + return text diff --git a/src/sessions/twitter/wxUI.py b/src/sessions/twitter/wxUI.py index 787e6581..a765e72c 100644 --- a/src/sessions/twitter/wxUI.py +++ b/src/sessions/twitter/wxUI.py @@ -1,18 +1,18 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals import wx - + class authorisationDialog(wx.Dialog): - def __init__(self): - super(authorisationDialog, self).__init__(parent=None, title=_(u"Authorising account...")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - static = wx.StaticText(panel, wx.NewId(), _(u"Enter your PIN code here")) - self.text = wx.TextCtrl(panel, -1) - self.ok = wx.Button(panel, wx.ID_OK) - self.cancel = wx.Button(panel, wx.ID_CANCEL) - sizer.Add(self.text, 0, wx.ALL, 5) - sizer.Add(self.cancel, 0, wx.ALL, 5) - panel.SetSizer(sizer) - min = sizer.CalcMin() - self.SetClientSize(min) \ No newline at end of file + def __init__(self): + super(authorisationDialog, self).__init__(parent=None, title=_(u"Authorising account...")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + static = wx.StaticText(panel, wx.NewId(), _(u"Enter your PIN code here")) + self.text = wx.TextCtrl(panel, -1) + self.ok = wx.Button(panel, wx.ID_OK) + self.cancel = wx.Button(panel, wx.ID_CANCEL) + sizer.Add(self.text, 0, wx.ALL, 5) + sizer.Add(self.cancel, 0, wx.ALL, 5) + panel.SetSizer(sizer) + min = sizer.CalcMin() + self.SetClientSize(min) diff --git a/src/setup.py b/src/setup.py index 1a5b013a..c6043db8 100644 --- a/src/setup.py +++ b/src/setup.py @@ -7,44 +7,44 @@ from cx_Freeze import setup, Executable from requests import certs def get_architecture_files(): - if platform.architecture()[0][:2] == "32": - return ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe", "../windows-dependencies/x86/libvlc.dll", "../windows-dependencies/x86/libvlccore.dll", "../windows-dependencies/x86/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw32/share/enchant/hunspell"], ["../windows-dependencies/x86/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x86/Microsoft.VC142.MFC", "."]] - elif platform.architecture()[0][:2] == "64": - return ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x64/bootstrap.exe", "../windows-dependencies/x64/libvlc.dll", "../windows-dependencies/x64/libvlccore.dll", "../windows-dependencies/x64/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw64/share/enchant/hunspell"], ["../windows-dependencies/x64/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x64/Microsoft.VC142.MFC", "."]] + if platform.architecture()[0][:2] == "32": + return ["../windows-dependencies/x86/oggenc2.exe", "../windows-dependencies/x86/bootstrap.exe", "../windows-dependencies/x86/libvlc.dll", "../windows-dependencies/x86/libvlccore.dll", "../windows-dependencies/x86/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw32/share/enchant/hunspell"], ["../windows-dependencies/x86/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x86/Microsoft.VC142.MFC", "."]] + elif platform.architecture()[0][:2] == "64": + return ["../windows-dependencies/x64/oggenc2.exe", "../windows-dependencies/x64/bootstrap.exe", "../windows-dependencies/x64/libvlc.dll", "../windows-dependencies/x64/libvlccore.dll", "../windows-dependencies/x64/plugins", ["../windows-dependencies/dictionaries", "lib/enchant/data/mingw64/share/enchant/hunspell"], ["../windows-dependencies/x64/Microsoft.VC142.CRT", "."], ["../windows-dependencies/x64/Microsoft.VC142.MFC", "."]] def find_sound_lib_datafiles(): - import os - import platform - import sound_lib - path = os.path.join(sound_lib.__path__[0], 'lib') - if platform.architecture()[0] == '32bit' or platform.system() == 'Darwin': - arch = 'x86' - else: - arch = 'x64' - dest_dir = os.path.join('sound_lib', 'lib', arch) - source = os.path.join(path, arch) - return (source, dest_dir) + import os + import platform + import sound_lib + path = os.path.join(sound_lib.__path__[0], 'lib') + if platform.architecture()[0] == '32bit' or platform.system() == 'Darwin': + arch = 'x86' + else: + arch = 'x64' + dest_dir = os.path.join('sound_lib', 'lib', arch) + source = os.path.join(path, arch) + return (source, dest_dir) def find_accessible_output2_datafiles(): - import os - import accessible_output2 - path = os.path.join(accessible_output2.__path__[0], 'lib') - dest_dir = os.path.join('accessible_output2', 'lib') - return (path, dest_dir) + import os + import accessible_output2 + path = os.path.join(accessible_output2.__path__[0], 'lib') + dest_dir = os.path.join('accessible_output2', 'lib') + return (path, dest_dir) base = None if sys.platform == 'win32': base = 'Win32GUI' build_exe_options = dict( - build_exe="dist", - optimize=1, - includes=["enchant.tokenize.en"], # This is not handled automatically by cx_freeze. - include_msvcr=True, - replace_paths = [("*", "")], - include_files=["icon.ico", "conf.defaults", "app-configuration.defaults", "keymaps", "locales", "sounds", "documentation", ("keys/lib", "keys/lib"), find_sound_lib_datafiles(), find_accessible_output2_datafiles()]+get_architecture_files(), - packages=["wxUI"], - ) + build_exe="dist", + optimize=1, + includes=["enchant.tokenize.en"], # This is not handled automatically by cx_freeze. + include_msvcr=True, + replace_paths = [("*", "")], + include_files=["icon.ico", "conf.defaults", "app-configuration.defaults", "keymaps", "locales", "sounds", "documentation", ("keys/lib", "keys/lib"), find_sound_lib_datafiles(), find_accessible_output2_datafiles()]+get_architecture_files(), + packages=["wxUI"], +) executables = [ Executable('main.py', base=base, targetName="twblue") diff --git a/src/sound.py b/src/sound.py index 859001c7..1cd8ad78 100644 --- a/src/sound.py +++ b/src/sound.py @@ -15,11 +15,11 @@ from audio_services import youtube_utils import application system = platform.system() if system=="Windows" and not hasattr(sys, 'frozen'): # We are running from source on Windows - current_dir=os.getcwd() - os.chdir(os.environ['PYTHON_VLC_MODULE_PATH']) + current_dir=os.getcwd() + os.chdir(os.environ['PYTHON_VLC_MODULE_PATH']) import vlc if system=="Windows" and not hasattr(sys, 'frozen'): # Restore the original folder - os.chdir(current_dir) + os.chdir(current_dir) import sound_lib.output, sound_lib.input, sound_lib.stream, sound_lib.recording from mysc.repeating_timer import RepeatingTimer from mysc.thread_utils import call_threaded @@ -29,132 +29,132 @@ URLPlayer = None log = original_logger.getLogger("sound") def setup(): - global URLPlayer - if not URLPlayer: - log.debug("creating stream URL player...") - URLPlayer = URLStream() + global URLPlayer + if not URLPlayer: + log.debug("creating stream URL player...") + URLPlayer = URLStream() def recode_audio(filename, quality=4.5): - global system - if system == "Windows": subprocess.call(r'"%s" -q %r "%s"' % (os.path.join(paths.app_path(), 'oggenc2.exe'), quality, filename)) + global system + if system == "Windows": subprocess.call(r'"%s" -q %r "%s"' % (os.path.join(paths.app_path(), 'oggenc2.exe'), quality, filename)) def recording(filename): -# try: - val = sound_lib.recording.WaveRecording(filename=filename) + # try: + val = sound_lib.recording.WaveRecording(filename=filename) # except sound_lib.main.BassError: # sound_lib.input.Input() # val = sound_lib.recording.WaveRecording(filename=filename) - return val + return val class soundSystem(object): - def check_soundpack(self): - """ Checks if the folder where live the current soundpack exists.""" - self.soundpack_OK = False - if os.path.exists(os.path.join(paths.sound_path(), self.config["current_soundpack"])): - self.path = os.path.join(paths.sound_path(), self.config["current_soundpack"]) - self.soundpack_OK = True - elif os.path.exists(os.path.join(paths.sound_path(), "default")): - log.error("The soundpack does not exist, using default...") - self.path = os.path.join(paths.sound_path(), "default") - self.soundpack_OK = True - else: - log.error("The current soundpack could not be found and the default soundpack has been deleted, " + application.name + " will not play sounds.") - self.soundpack_OK = False + def check_soundpack(self): + """ Checks if the folder where live the current soundpack exists.""" + self.soundpack_OK = False + if os.path.exists(os.path.join(paths.sound_path(), self.config["current_soundpack"])): + self.path = os.path.join(paths.sound_path(), self.config["current_soundpack"]) + self.soundpack_OK = True + elif os.path.exists(os.path.join(paths.sound_path(), "default")): + log.error("The soundpack does not exist, using default...") + self.path = os.path.join(paths.sound_path(), "default") + self.soundpack_OK = True + else: + log.error("The current soundpack could not be found and the default soundpack has been deleted, " + application.name + " will not play sounds.") + self.soundpack_OK = False - def __init__(self, soundConfig): - """ Sound Player.""" - self.config = soundConfig - # Set the output and input default devices. - try: - self.output = sound_lib.output.Output() - self.input = sound_lib.input.Input() - except: - pass - # Try to use the selected device from the configuration. It can fail if the machine does not has a mic. - try: - log.debug("Setting input and output devices...") - self.output.set_device(self.output.find_device_by_name(self.config["output_device"])) - self.input.set_device(self.input.find_device_by_name(self.config["input_device"])) - except: - log.error("Error in input or output devices, using defaults...") - self.config["output_device"] = "Default" - self.config["input_device"] = "Default" + def __init__(self, soundConfig): + """ Sound Player.""" + self.config = soundConfig + # Set the output and input default devices. + try: + self.output = sound_lib.output.Output() + self.input = sound_lib.input.Input() + except: + pass + # Try to use the selected device from the configuration. It can fail if the machine does not has a mic. + try: + log.debug("Setting input and output devices...") + self.output.set_device(self.output.find_device_by_name(self.config["output_device"])) + self.input.set_device(self.input.find_device_by_name(self.config["input_device"])) + except: + log.error("Error in input or output devices, using defaults...") + self.config["output_device"] = "Default" + self.config["input_device"] = "Default" - self.files = [] - self.cleaner = RepeatingTimer(60, self.clear_list) - self.cleaner.start() - self.check_soundpack() + self.files = [] + self.cleaner = RepeatingTimer(60, self.clear_list) + self.cleaner.start() + self.check_soundpack() - def clear_list(self): - if len(self.files) == 0: return - try: - for i in range(0, len(self.files)): - if self.files[i].is_playing == False: - self.files[i].free() - self.files.pop(i) - except IndexError: - pass + def clear_list(self): + if len(self.files) == 0: return + try: + for i in range(0, len(self.files)): + if self.files[i].is_playing == False: + self.files[i].free() + self.files.pop(i) + except IndexError: + pass - def play(self, sound, argument=False): - if self.soundpack_OK == False: return - if self.config["session_mute"] == True: return - sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound)) - sound_object.volume = float(self.config["volume"]) - self.files.append(sound_object) - sound_object.play() + def play(self, sound, argument=False): + if self.soundpack_OK == False: return + if self.config["session_mute"] == True: return + sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound)) + sound_object.volume = float(self.config["volume"]) + self.files.append(sound_object) + sound_object.play() class URLStream(object): - """ URL Stream Player implementation.""" + """ URL Stream Player implementation.""" - def __init__(self): - # URL status. Should be True after URL expansion and transformation. - self.prepared = False - log.debug("URL Player initialized") - # LibVLC controls. - self.instance = vlc.Instance() - self.player = self.instance.media_player_new() + def __init__(self): + # URL status. Should be True after URL expansion and transformation. + self.prepared = False + log.debug("URL Player initialized") + # LibVLC controls. + self.instance = vlc.Instance() + self.player = self.instance.media_player_new() - def prepare(self, url): - """ Takes an URL and prepares it to be streamed. This function will try to unshorten the passed URL and, if needed, to transform it into a valid URL.""" - log.debug("Preparing URL: %s" % (url,)) - self.prepared = False - self.url = url_shortener.unshorten(url) - if self.url == None: - self.url = url - log.debug("Expanded URL: %s" % (self.url,)) - if self.url != None: - transformer = audio_services.find_url_transformer(self.url) - transformed_url = transformer(self.url) - self.url = transformed_url - log.debug("Transformed URL: %s. Prepared" % (self.url,)) - self.prepared = True + def prepare(self, url): + """ Takes an URL and prepares it to be streamed. This function will try to unshorten the passed URL and, if needed, to transform it into a valid URL.""" + log.debug("Preparing URL: %s" % (url,)) + self.prepared = False + self.url = url_shortener.unshorten(url) + if self.url == None: + self.url = url + log.debug("Expanded URL: %s" % (self.url,)) + if self.url != None: + transformer = audio_services.find_url_transformer(self.url) + transformed_url = transformer(self.url) + self.url = transformed_url + log.debug("Transformed URL: %s. Prepared" % (self.url,)) + self.prepared = True - def seek(self, step): - pos=self.player.get_time() - pos+=step - pos=self.player.set_time(pos) + def seek(self, step): + pos=self.player.get_time() + pos+=step + pos=self.player.set_time(pos) - def playpause(self): - if self.player.is_playing() == True: - self.player.pause() - else: - self.player.play() + def playpause(self): + if self.player.is_playing() == True: + self.player.pause() + else: + self.player.play() - def play(self, url=None, volume=1.0, announce=True): - if announce: - output.speak(_(u"Playing...")) - log.debug("Attempting to play an URL...") - if url != None: - self.prepare(url) - if self.prepared == True: - media = self.instance.media_new(self.url) - self.player.set_media(media) - self.player.audio_set_volume(int(volume*100)) - self.player.play() - log.debug("played") - self.prepared=False + def play(self, url=None, volume=1.0, announce=True): + if announce: + output.speak(_(u"Playing...")) + log.debug("Attempting to play an URL...") + if url != None: + self.prepare(url) + if self.prepared == True: + media = self.instance.media_new(self.url) + self.player.set_media(media) + self.player.audio_set_volume(int(volume*100)) + self.player.play() + log.debug("played") + self.prepared=False - def stop_audio(self): - output.speak(_(u"Stopped."), True) - self.player.stop() + def stop_audio(self): + output.speak(_(u"Stopped."), True) + self.player.stop() diff --git a/src/update/__init__.py b/src/update/__init__.py index 3c5275a4..443025e3 100644 --- a/src/update/__init__.py +++ b/src/update/__init__.py @@ -4,10 +4,10 @@ import os.path import platform def find_datafiles(): - system = platform.system() - if system == 'Windows': - file_ext = '*.exe' - else: - file_ext = '*.sh' - path = os.path.abspath(os.path.join(__path__[0], 'bootstrappers', file_ext)) - return [('', glob.glob(path))] + system = platform.system() + if system == 'Windows': + file_ext = '*.exe' + else: + file_ext = '*.sh' + path = os.path.abspath(os.path.join(__path__[0], 'bootstrappers', file_ext)) + return [('', glob.glob(path))] diff --git a/src/update/update.py b/src/update/update.py index ce5cfced..64bfd7de 100644 --- a/src/update/update.py +++ b/src/update/update.py @@ -12,116 +12,116 @@ from wxUI import commonMessageDialogs import widgetUtils import webbrowser try: - import czipfile as zipfile + import czipfile as zipfile except ImportError: - import zipfile + import zipfile from platform_utils import paths def perform_update(endpoint, current_version, app_name='', password=None, update_available_callback=None, progress_callback=None, update_complete_callback=None): - requests_session = create_requests_session(app_name=app_name, version=current_version) - available_update = find_update(endpoint, requests_session=requests_session) - if not available_update: - logger.debug("No update available") - return False - available_version = float(available_update['current_version']) - if not float(available_version) > float(current_version) or platform.system()+platform.architecture()[0][:2] not in available_update['downloads']: - logger.debug("No update for this architecture") - return False - available_description = available_update.get('description', None) - available_date = available_update.get('date', None) - update_url = available_update ['downloads'][platform.system()+platform.architecture()[0][:2]] - logger.info("A new update is available. Version %s" % available_version) - donation() - if callable(update_available_callback) and not update_available_callback(version=available_version, description=available_description, date=available_date): #update_available_callback should return a falsy value to stop the process - logger.info("User canceled update.") - return - base_path = tempfile.mkdtemp() - download_path = os.path.join(base_path, 'update.zip') - update_path = os.path.join(base_path, 'update') - downloaded = download_update(update_url, download_path, requests_session=requests_session, progress_callback=progress_callback) - extracted = extract_update(downloaded, update_path, password=password) - bootstrap_path = move_bootstrap(extracted) - execute_bootstrap(bootstrap_path, extracted) - logger.info("Update prepared for installation.") - if callable(update_complete_callback): - update_complete_callback() + requests_session = create_requests_session(app_name=app_name, version=current_version) + available_update = find_update(endpoint, requests_session=requests_session) + if not available_update: + logger.debug("No update available") + return False + available_version = float(available_update['current_version']) + if not float(available_version) > float(current_version) or platform.system()+platform.architecture()[0][:2] not in available_update['downloads']: + logger.debug("No update for this architecture") + return False + available_description = available_update.get('description', None) + available_date = available_update.get('date', None) + update_url = available_update ['downloads'][platform.system()+platform.architecture()[0][:2]] + logger.info("A new update is available. Version %s" % available_version) + donation() + if callable(update_available_callback) and not update_available_callback(version=available_version, description=available_description, date=available_date): #update_available_callback should return a falsy value to stop the process + logger.info("User canceled update.") + return + base_path = tempfile.mkdtemp() + download_path = os.path.join(base_path, 'update.zip') + update_path = os.path.join(base_path, 'update') + downloaded = download_update(update_url, download_path, requests_session=requests_session, progress_callback=progress_callback) + extracted = extract_update(downloaded, update_path, password=password) + bootstrap_path = move_bootstrap(extracted) + execute_bootstrap(bootstrap_path, extracted) + logger.info("Update prepared for installation.") + if callable(update_complete_callback): + update_complete_callback() def create_requests_session(app_name=None, version=None): - user_agent = '' - session = requests.session() - if app_name: - user_agent = ' %s/%r' % (app_name, version) - session.headers['User-Agent'] = session.headers['User-Agent'] + user_agent - return session + user_agent = '' + session = requests.session() + if app_name: + user_agent = ' %s/%r' % (app_name, version) + session.headers['User-Agent'] = session.headers['User-Agent'] + user_agent + return session def find_update(endpoint, requests_session): - response = requests_session.get(endpoint) - response.raise_for_status() - content = response.json() - return content + response = requests_session.get(endpoint) + response.raise_for_status() + content = response.json() + return content def download_update(update_url, update_destination, requests_session, progress_callback=None, chunk_size=io.DEFAULT_BUFFER_SIZE): - total_downloaded = total_size = 0 - with io.open(update_destination, 'w+b') as outfile: - download = requests_session.get(update_url, stream=True) - total_size = int(download.headers.get('content-length', 0)) - logger.debug("Total update size: %d" % total_size) - download.raise_for_status() - for chunk in download.iter_content(chunk_size): - outfile.write(chunk) - total_downloaded += len(chunk) - if callable(progress_callback): - call_callback(progress_callback, total_downloaded, total_size) - logger.debug("Update downloaded") - return update_destination + total_downloaded = total_size = 0 + with io.open(update_destination, 'w+b') as outfile: + download = requests_session.get(update_url, stream=True) + total_size = int(download.headers.get('content-length', 0)) + logger.debug("Total update size: %d" % total_size) + download.raise_for_status() + for chunk in download.iter_content(chunk_size): + outfile.write(chunk) + total_downloaded += len(chunk) + if callable(progress_callback): + call_callback(progress_callback, total_downloaded, total_size) + logger.debug("Update downloaded") + return update_destination def extract_update(update_archive, destination, password=None): - """Given an update archive, extracts it. Returns the directory to which it has been extracted""" - with contextlib.closing(zipfile.ZipFile(update_archive)) as archive: - if password: - archive.setpassword(password) - archive.extractall(path=destination) - logger.debug("Update extracted") - return destination + """Given an update archive, extracts it. Returns the directory to which it has been extracted""" + with contextlib.closing(zipfile.ZipFile(update_archive)) as archive: + if password: + archive.setpassword(password) + archive.extractall(path=destination) + logger.debug("Update extracted") + return destination def move_bootstrap(extracted_path): - working_path = os.path.abspath(os.path.join(extracted_path, '..')) - if platform.system() == 'Darwin': - extracted_path = os.path.join(extracted_path, 'Contents', 'Resources') - downloaded_bootstrap = os.path.join(extracted_path, bootstrap_name()) - new_bootstrap_path = os.path.join(working_path, bootstrap_name()) - os.rename(downloaded_bootstrap, new_bootstrap_path) - return new_bootstrap_path + working_path = os.path.abspath(os.path.join(extracted_path, '..')) + if platform.system() == 'Darwin': + extracted_path = os.path.join(extracted_path, 'Contents', 'Resources') + downloaded_bootstrap = os.path.join(extracted_path, bootstrap_name()) + new_bootstrap_path = os.path.join(working_path, bootstrap_name()) + os.rename(downloaded_bootstrap, new_bootstrap_path) + return new_bootstrap_path def execute_bootstrap(bootstrap_path, source_path): - arguments = r'"%s" "%s" "%s" "%s"' % (os.getpid(), source_path, paths.app_path(), paths.get_executable()) - if platform.system() == 'Windows': - import win32api - win32api.ShellExecute(0, 'open', bootstrap_path, arguments, '', 5) - else: - import subprocess - make_executable(bootstrap_path) - subprocess.Popen(['%s %s' % (bootstrap_path, arguments)], shell=True) - logger.info("Bootstrap executed") + arguments = r'"%s" "%s" "%s" "%s"' % (os.getpid(), source_path, paths.app_path(), paths.get_executable()) + if platform.system() == 'Windows': + import win32api + win32api.ShellExecute(0, 'open', bootstrap_path, arguments, '', 5) + else: + import subprocess + make_executable(bootstrap_path) + subprocess.Popen(['%s %s' % (bootstrap_path, arguments)], shell=True) + logger.info("Bootstrap executed") def bootstrap_name(): - if platform.system() == 'Windows': return 'bootstrap.exe' - if platform.system() == 'Darwin': return 'bootstrap-mac.sh' - return 'bootstrap-lin.sh' + if platform.system() == 'Windows': return 'bootstrap.exe' + if platform.system() == 'Darwin': return 'bootstrap-mac.sh' + return 'bootstrap-lin.sh' def make_executable(path): - import stat - st = os.stat(path) - os.chmod(path, st.st_mode | stat.S_IEXEC) + import stat + st = os.stat(path) + os.chmod(path, st.st_mode | stat.S_IEXEC) def call_callback(callback, *args, **kwargs): -# try: - callback(*args, **kwargs) + # try: + callback(*args, **kwargs) # except: # logger.exception("Failed calling callback %r with args %r and kwargs %r" % (callback, args, kwargs)) def donation(): - dlg = commonMessageDialogs.donation() - if dlg == widgetUtils.YES: - webbrowser.open_new_tab("http://twblue.es/?q=donate") \ No newline at end of file + dlg = commonMessageDialogs.donation() + if dlg == widgetUtils.YES: + webbrowser.open_new_tab("http://twblue.es/?q=donate") diff --git a/src/update/updater.py b/src/update/updater.py index 9cc20af2..2bef784b 100644 --- a/src/update/updater.py +++ b/src/update/updater.py @@ -11,13 +11,13 @@ from .wxUpdater import * logger = logging.getLogger("updater") def do_update(endpoint=application.update_url): - try: - result = 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: - if endpoint == application.update_url: - 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) - return result \ No newline at end of file + try: + result = 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: + if endpoint == application.update_url: + 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) + return result diff --git a/src/update/utils.py b/src/update/utils.py index 9ec89156..c9bbdc9a 100644 --- a/src/update/utils.py +++ b/src/update/utils.py @@ -3,42 +3,42 @@ from __future__ import unicode_literals from builtins import str def convert_bytes(n): - K, M, G, T, P = 1 << 10, 1 << 20, 1 << 30, 1 << 40, 1 << 50 - if n >= P: - return '%.2fPb' % (float(n) / T) - elif n >= T: - return '%.2fTb' % (float(n) / T) - elif n >= G: - return '%.2fGb' % (float(n) / G) - elif n >= M: - return '%.2fMb' % (float(n) / M) - elif n >= K: - return '%.2fKb' % (float(n) / K) - else: - return '%d' % n + K, M, G, T, P = 1 << 10, 1 << 20, 1 << 30, 1 << 40, 1 << 50 + if n >= P: + return '%.2fPb' % (float(n) / T) + elif n >= T: + return '%.2fTb' % (float(n) / T) + elif n >= G: + return '%.2fGb' % (float(n) / G) + elif n >= M: + return '%.2fMb' % (float(n) / M) + elif n >= K: + return '%.2fKb' % (float(n) / K) + else: + return '%d' % n def seconds_to_string(seconds, precision=0): - day = seconds // 86400 - hour = seconds // 3600 - min = (seconds // 60) % 60 - sec = seconds - (hour * 3600) - (min * 60) - sec_spec = "." + str(precision) + "f" - sec_string = sec.__format__(sec_spec) - string = "" - if day == 1: - string += _(u"%d day, ") % day - elif day >= 2: - string += _(u"%d days, ") % day - if (hour == 1): - string += _(u"%d hour, ") % hour - elif (hour >= 2): - string += _("%d hours, ") % hour - if (min == 1): - string += _(u"%d minute, ") % min - elif (min >= 2): - string += _(u"%d minutes, ") % min - if sec >= 0 and sec <= 2: - string += _(u"%s second") % sec_string - else: - string += _(u"%s seconds") % sec_string - return string \ No newline at end of file + day = seconds // 86400 + hour = seconds // 3600 + min = (seconds // 60) % 60 + sec = seconds - (hour * 3600) - (min * 60) + sec_spec = "." + str(precision) + "f" + sec_string = sec.__format__(sec_spec) + string = "" + if day == 1: + string += _(u"%d day, ") % day + elif day >= 2: + string += _(u"%d days, ") % day + if (hour == 1): + string += _(u"%d hour, ") % hour + elif (hour >= 2): + string += _("%d hours, ") % hour + if (min == 1): + string += _(u"%d minute, ") % min + elif (min >= 2): + string += _(u"%d minutes, ") % min + if sec >= 0 and sec <= 2: + string += _(u"%s second") % sec_string + else: + string += _(u"%s seconds") % sec_string + return string diff --git a/src/update/wxUpdater.py b/src/update/wxUpdater.py index 437e0a41..6ba6fd2a 100644 --- a/src/update/wxUpdater.py +++ b/src/update/wxUpdater.py @@ -11,25 +11,25 @@ from . import utils progress_dialog = None def available_update_dialog(version, description, date): - dialog = wx.MessageDialog(None, _(u"There's a new %s version available, released on %s. Would you like to download it now?\n\n %s version: %s\n\nChanges:\n%s") % (application.name, date, application.name, version, description), _(u"New version for %s") % application.name, style=wx.YES|wx.NO|wx.ICON_WARNING) - if dialog.ShowModal() == wx.ID_YES: - return True - else: - return False + dialog = wx.MessageDialog(None, _(u"There's a new %s version available, released on %s. Would you like to download it now?\n\n %s version: %s\n\nChanges:\n%s") % (application.name, date, application.name, version, description), _(u"New version for %s") % application.name, style=wx.YES|wx.NO|wx.ICON_WARNING) + if dialog.ShowModal() == wx.ID_YES: + return True + else: + return False def create_progress_dialog(): - return wx.ProgressDialog(_(u"Download in Progress"), _(u"Downloading the new version..."), parent=None, maximum=100) + return wx.ProgressDialog(_(u"Download in Progress"), _(u"Downloading the new version..."), parent=None, maximum=100) def progress_callback(total_downloaded, total_size): - global progress_dialog - if progress_dialog == None: - progress_dialog = create_progress_dialog() - progress_dialog.Show() - if total_downloaded == total_size: - progress_dialog.Destroy() - else: - progress_dialog.Update(old_div((total_downloaded*100),total_size), _(u"Updating... %s of %s") % (str(utils.convert_bytes(total_downloaded)), str(utils.convert_bytes(total_size)))) + global progress_dialog + if progress_dialog == None: + progress_dialog = create_progress_dialog() + progress_dialog.Show() + if total_downloaded == total_size: + progress_dialog.Destroy() + else: + progress_dialog.Update(old_div((total_downloaded*100),total_size), _(u"Updating... %s of %s") % (str(utils.convert_bytes(total_downloaded)), str(utils.convert_bytes(total_size)))) def update_finished(): - ms = wx.MessageDialog(None, _(u"The update has been downloaded and installed successfully. Press OK to continue."), _(u"Done!")).ShowModal() \ No newline at end of file + ms = wx.MessageDialog(None, _(u"The update has been downloaded and installed successfully. Press OK to continue."), _(u"Done!")).ShowModal() diff --git a/src/url_shortener/__main__.py b/src/url_shortener/__main__.py index 51ccf8d8..7e3dcf05 100644 --- a/src/url_shortener/__main__.py +++ b/src/url_shortener/__main__.py @@ -4,43 +4,43 @@ from . import shorteners def service_selecter (func): - @wraps(func) - def wrapper (*args, **kwargs): - tmp = dict(kwargs) - if 'service' in tmp: - del(tmp['service']) - kwargs['service'] = find_service(kwargs['service'], **tmp) or default_service() - else: - kwargs['service'] = default_service() - return func(*args, **kwargs) - return wrapper + @wraps(func) + def wrapper (*args, **kwargs): + tmp = dict(kwargs) + if 'service' in tmp: + del(tmp['service']) + kwargs['service'] = find_service(kwargs['service'], **tmp) or default_service() + else: + kwargs['service'] = default_service() + return func(*args, **kwargs) + return wrapper @service_selecter def shorten (url, service=None, **kwargs): - return service(**kwargs).shorten(url) + return service(**kwargs).shorten(url) @service_selecter def unshorten (url, service=None, **kwargs): - return service(**kwargs).unshorten(url) + return service(**kwargs).unshorten(url) def default_service (): - return shorteners.AcortameShortener + return shorteners.AcortameShortener def find_service (service, **kwargs): - for i in shorteners.__all__: - obj = getattr(shorteners, i)(**kwargs) - if obj.name.lower() == service.lower(): - return getattr(shorteners, i) + for i in shorteners.__all__: + obj = getattr(shorteners, i)(**kwargs) + if obj.name.lower() == service.lower(): + return getattr(shorteners, i) def list_services (): - return [getattr(shorteners, i)().name for i in shorteners.__all__] + return [getattr(shorteners, i)().name for i in shorteners.__all__] def unshorten_any (url): - """Unshortens an URL using any available unshortener. Check to see if unshortened URL was created by a shortener (nested) and unshorten if so.""" - unshortened_url = shorteners.URLShortener().unshorten(url) - # None is returned if URL not unshortened - if unshortened_url: - return unshorten_any(unshortened_url) - return url + """Unshortens an URL using any available unshortener. Check to see if unshortened URL was created by a shortener (nested) and unshorten if so.""" + unshortened_url = shorteners.URLShortener().unshorten(url) + # None is returned if URL not unshortened + if unshortened_url: + return unshorten_any(unshortened_url) + return url diff --git a/src/url_shortener/shorteners/acortame.py b/src/url_shortener/shorteners/acortame.py index fda92ce5..e7adafb6 100644 --- a/src/url_shortener/shorteners/acortame.py +++ b/src/url_shortener/shorteners/acortame.py @@ -5,26 +5,26 @@ from . url_shortener import URLShortener import requests import urllib.request, urllib.parse, urllib.error class AcortameShortener (URLShortener): - def __init__(self, *args, **kwargs): - self.name = "acorta.me" - super(AcortameShortener, self).__init__(*args, **kwargs) + def __init__(self, *args, **kwargs): + self.name = "acorta.me" + super(AcortameShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("https://acorta.me/api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("https://acorta.me/api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'acorta.me' in url + def created_url (self, url): + return 'acorta.me' in url - def unshorten (self, url): - if not 'acorta.me' in url: - #use generic expand method - return super(AcortameShortener, self).unshorten(url) - answer = url - api = requests.get ("https://acorta.me/api.php?action=expand&format=simple&shorturl=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def unshorten (self, url): + if not 'acorta.me' in url: + #use generic expand method + return super(AcortameShortener, self).unshorten(url) + answer = url + api = requests.get ("https://acorta.me/api.php?action=expand&format=simple&shorturl=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer diff --git a/src/url_shortener/shorteners/clckru.py b/src/url_shortener/shorteners/clckru.py index 9d6ce136..9c527ea1 100644 --- a/src/url_shortener/shorteners/clckru.py +++ b/src/url_shortener/shorteners/clckru.py @@ -7,16 +7,16 @@ from . url_shortener import URLShortener class ClckruShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "clck.ru" - super(ClckruShortener, self).__init__(*args, **kwargs) + def __init__ (self, *args, **kwargs): + self.name = "clck.ru" + super(ClckruShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("http://clck.ru/--?url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("http://clck.ru/--?url=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'clck.ru' in url + def created_url (self, url): + return 'clck.ru' in url diff --git a/src/url_shortener/shorteners/hkcim.py b/src/url_shortener/shorteners/hkcim.py index 43b4d608..29ecd9ea 100644 --- a/src/url_shortener/shorteners/hkcim.py +++ b/src/url_shortener/shorteners/hkcim.py @@ -6,16 +6,16 @@ import requests from . url_shortener import URLShortener class HKCShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "HKC.im" - super(HKCShortener, self).__init__(*args, **kwargs) + def __init__ (self, *args, **kwargs): + self.name = "HKC.im" + super(HKCShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("http://hkc.im/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("http://hkc.im/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'hkc.im' in url.lower() + def created_url (self, url): + return 'hkc.im' in url.lower() diff --git a/src/url_shortener/shorteners/isgd.py b/src/url_shortener/shorteners/isgd.py index 006089de..ee817360 100644 --- a/src/url_shortener/shorteners/isgd.py +++ b/src/url_shortener/shorteners/isgd.py @@ -7,16 +7,16 @@ from . url_shortener import URLShortener class IsgdShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "Is.gd" - super(IsgdShortener, self).__init__(*args, **kwargs) + def __init__ (self, *args, **kwargs): + self.name = "Is.gd" + super(IsgdShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("http://is.gd/api.php?longurl=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("http://is.gd/api.php?longurl=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'is.gd' in url + def created_url (self, url): + return 'is.gd' in url diff --git a/src/url_shortener/shorteners/onjme.py b/src/url_shortener/shorteners/onjme.py index c2da3043..c6a21315 100644 --- a/src/url_shortener/shorteners/onjme.py +++ b/src/url_shortener/shorteners/onjme.py @@ -6,16 +6,16 @@ import requests from . url_shortener import URLShortener class OnjmeShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "Onj.me" - super(OnjmeShortener, self).__init__(*args, **kwargs) + def __init__ (self, *args, **kwargs): + self.name = "Onj.me" + super(OnjmeShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("http://onj.me/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("http://onj.me/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'onj.me' in url.lower() + def created_url (self, url): + return 'onj.me' in url.lower() diff --git a/src/url_shortener/shorteners/tinyarrows.py b/src/url_shortener/shorteners/tinyarrows.py index a544d7be..45a8990c 100644 --- a/src/url_shortener/shorteners/tinyarrows.py +++ b/src/url_shortener/shorteners/tinyarrows.py @@ -6,16 +6,16 @@ import requests from . url_shortener import URLShortener class TinyArrowsShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "TinyArro.ws" - super(TinyArrowsShortener, self).__init__(*args, **kwargs) + def __init__ (self, *args, **kwargs): + self.name = "TinyArro.ws" + super(TinyArrowsShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get("http://tinyarro.ws/api-create.php?utfpure=1&url=%s" % urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer.decode('UTF-8') + def _shorten (self, url): + answer = url + api = requests.get("http://tinyarro.ws/api-create.php?utfpure=1&url=%s" % urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer.decode('UTF-8') - def created_url(self, url): - return "tinyarro.ws" in url + def created_url(self, url): + return "tinyarro.ws" in url diff --git a/src/url_shortener/shorteners/tinyurl.py b/src/url_shortener/shorteners/tinyurl.py index a762ff4e..0a5703a3 100644 --- a/src/url_shortener/shorteners/tinyurl.py +++ b/src/url_shortener/shorteners/tinyurl.py @@ -5,16 +5,16 @@ from .url_shortener import URLShortener import requests import urllib.request, urllib.parse, urllib.error class TinyurlShortener (URLShortener): - def __init__(self, *args, **kwargs): - self.name = "TinyURL.com" - super(TinyurlShortener, self).__init__(*args, **kwargs) + def __init__(self, *args, **kwargs): + self.name = "TinyURL.com" + super(TinyurlShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("http://tinyurl.com/api-create.php?url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("http://tinyurl.com/api-create.php?url=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'tinyurl.com' in url + def created_url (self, url): + return 'tinyurl.com' in url diff --git a/src/url_shortener/shorteners/url_shortener.py b/src/url_shortener/shorteners/url_shortener.py index dad0e355..cf1d6f76 100644 --- a/src/url_shortener/shorteners/url_shortener.py +++ b/src/url_shortener/shorteners/url_shortener.py @@ -4,41 +4,41 @@ import requests class URLShortener (object): - def __init__ (self, *args, **kwargs): - #Stub out arguments, silly object. :( - return super(URLShortener, self).__init__() + def __init__ (self, *args, **kwargs): + #Stub out arguments, silly object. :( + return super(URLShortener, self).__init__() - def shorten (self, url): - if self.created_url(url): - return url - else: - return self._shorten(url) + def shorten (self, url): + if self.created_url(url): + return url + else: + return self._shorten(url) - def _shorten (self, url): - raise NotImplementedError + def _shorten (self, url): + raise NotImplementedError - def created_url (self, url): - """Returns a boolean indicating whether or not this shortener created a provided url""" - raise NotImplementedError + def created_url (self, url): + """Returns a boolean indicating whether or not this shortener created a provided url""" + raise NotImplementedError - def unshorten(self, url): - try: - r=requests.head(url) - if 'location' in list(r.headers.keys()): - if 'dropbox.com' in r.headers['location']: - return handle_dropbox(r.headers['location']) - else: - return r.headers['location'] - else: # if the head method does not work, use get instead. Performance may decrease - r=requests.get(url, allow_redirects=False, stream=True) - # release the connection without downloading the content, we only need the response headers - r.close() - return r.headers['location'] - except: - return url #we cannot expand + def unshorten(self, url): + try: + r=requests.head(url) + if 'location' in list(r.headers.keys()): + if 'dropbox.com' in r.headers['location']: + return handle_dropbox(r.headers['location']) + else: + return r.headers['location'] + else: # if the head method does not work, use get instead. Performance may decrease + r=requests.get(url, allow_redirects=False, stream=True) + # release the connection without downloading the content, we only need the response headers + r.close() + return r.headers['location'] + except: + return url #we cannot expand def handle_dropbox(url): - if url.endswith("dl=1"): - return url - else: - return url.replace("dl=0", "dl=1") + if url.endswith("dl=1"): + return url + else: + return url.replace("dl=0", "dl=1") diff --git a/src/url_shortener/shorteners/xedcc.py b/src/url_shortener/shorteners/xedcc.py index 8b2d2fb5..117b4f7c 100644 --- a/src/url_shortener/shorteners/xedcc.py +++ b/src/url_shortener/shorteners/xedcc.py @@ -6,16 +6,16 @@ import requests from . url_shortener import URLShortener class XedccShortener (URLShortener): - def __init__ (self, *args, **kwargs): - self.name = "Xed.cc" - super(XedccShortener, self).__init__(*args, **kwargs) + def __init__ (self, *args, **kwargs): + self.name = "Xed.cc" + super(XedccShortener, self).__init__(*args, **kwargs) - def _shorten (self, url): - answer = url - api = requests.get ("http://xed.cc/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) - if api.status_code == 200: - answer = api.text - return answer + def _shorten (self, url): + answer = url + api = requests.get ("http://xed.cc/yourls-api.php?action=shorturl&format=simple&url=" + urllib.parse.quote(url)) + if api.status_code == 200: + answer = api.text + return answer - def created_url (self, url): - return 'xed.cc' in url.lower() + def created_url (self, url): + return 'xed.cc' in url.lower() diff --git a/src/widgetUtils/__init__.py b/src/widgetUtils/__init__.py index 86202b09..8c88f5ee 100644 --- a/src/widgetUtils/__init__.py +++ b/src/widgetUtils/__init__.py @@ -2,6 +2,6 @@ from __future__ import absolute_import from __future__ import unicode_literals import platform if platform.system() == "Windows": - from .wxUtils import * + from .wxUtils import * #elif platform.system() == "Linux": # from gtkUtils import * diff --git a/src/widgetUtils/gtkUtils.py b/src/widgetUtils/gtkUtils.py index bec88129..6902d324 100644 --- a/src/widgetUtils/gtkUtils.py +++ b/src/widgetUtils/gtkUtils.py @@ -31,116 +31,116 @@ MENU = "activate" CHECKBOX = "toggled" def exit_application(): - """ Closes the current window cleanly. """ - Gtk.main_quit() + """ Closes the current window cleanly. """ + Gtk.main_quit() def connect_event(parent, event, func, menuitem=None, *args, **kwargs): - """ Connects an event to a function. - parent Gtk.widget: The widget that will listen for the event. - event widgetUtils.event: The event that will be listened for the parent. The event should be one of the widgetUtils events. - function func: The function that will be connected to the event.""" - if menuitem == None: - return getattr(parent, "connect")(event, func, *args, **kwargs) - else: - return getattr(menuitem, "connect")(event, func, *args, **kwargs) + """ Connects an event to a function. + parent Gtk.widget: The widget that will listen for the event. + event widgetUtils.event: The event that will be listened for the parent. The event should be one of the widgetUtils events. + function func: The function that will be connected to the event.""" + if menuitem == None: + return getattr(parent, "connect")(event, func, *args, **kwargs) + else: + return getattr(menuitem, "connect")(event, func, *args, **kwargs) class list(object): - def __init__(self, *columns, **listArguments): - self.columns = columns - self.list_arguments = listArguments - self.create_list() + def __init__(self, *columns, **listArguments): + self.columns = columns + self.list_arguments = listArguments + self.create_list() - def create_list(self): - columns = [] - [columns.append(str) for i in self.columns] - self.store = Gtk.ListStore(*columns) - self.list = Gtk.TreeView(model=self.store) - renderer = Gtk.CellRendererText() - for i in range(0, len(self.columns)): - column = Gtk.TreeViewColumn(self.columns[i], renderer, text=i) + def create_list(self): + columns = [] + [columns.append(str) for i in self.columns] + self.store = Gtk.ListStore(*columns) + self.list = Gtk.TreeView(model=self.store) + renderer = Gtk.CellRendererText() + for i in range(0, len(self.columns)): + column = Gtk.TreeViewColumn(self.columns[i], renderer, text=i) # column.set_sort_column_id(i) - self.list.append_column(column) + self.list.append_column(column) - def insert_item(self, reversed=False, *item): - if reversed == False: - self.store.append(row=item) - else: - self.store.insert(position=0, row=item) + def insert_item(self, reversed=False, *item): + if reversed == False: + self.store.append(row=item) + else: + self.store.insert(position=0, row=item) - def get_selected(self): - tree_selection = self.list.get_selection() - (model, pathlist) = tree_selection.get_selected_rows() - return int(pathlist[0].to_string() ) + def get_selected(self): + tree_selection = self.list.get_selection() + (model, pathlist) = tree_selection.get_selected_rows() + return int(pathlist[0].to_string() ) - def select_item(self, item): - tree_selection = self.list.get_selection() - tree_selection.select_path(item) + def select_item(self, item): + tree_selection = self.list.get_selection() + tree_selection.select_path(item) - def remove_item(self, item): - self.store.remove(self.store.get_iter(item)) + def remove_item(self, item): + self.store.remove(self.store.get_iter(item)) - def get_count(self): - return len(self.store) + def get_count(self): + return len(self.store) class baseDialog(Gtk.Dialog): - def __init__(self, *args, **kwargs): - super(baseDialog, self).__init__(*args, **kwargs) - self.box = self.get_content_area() + def __init__(self, *args, **kwargs): + super(baseDialog, self).__init__(*args, **kwargs) + self.box = self.get_content_area() - def get_response(self): - answer = self.run() - return answer + def get_response(self): + answer = self.run() + return answer class buffer(GObject.GObject): - name = GObject.property(type=str) + name = GObject.property(type=str) - def __init__(self, obj): - super(buffer, self).__init__() - self.buffer = obj + def __init__(self, obj): + super(buffer, self).__init__() + self.buffer = obj class notebook(object): - def __init__(self): - self.store = Gtk.TreeStore(buffer.__gtype__) - self.view = Gtk.TreeView() - self.view.set_model(self.store) + def __init__(self): + self.store = Gtk.TreeStore(buffer.__gtype__) + self.view = Gtk.TreeView() + self.view.set_model(self.store) - column = Gtk.TreeViewColumn("Buffer") - cell = Gtk.CellRendererText() - column.pack_start(cell, True) - column.set_cell_data_func(cell, self.get_buffer) - self.view.append_column(column) + column = Gtk.TreeViewColumn("Buffer") + cell = Gtk.CellRendererText() + column.pack_start(cell, True) + column.set_cell_data_func(cell, self.get_buffer) + self.view.append_column(column) - def get_current_page(self): - tree_selection = self.view.get_selection() - (model, pathlist) = tree_selection.get_selected_rows() - iter = pathlist[0] - return self.store[iter][0].buffer + def get_current_page(self): + tree_selection = self.view.get_selection() + (model, pathlist) = tree_selection.get_selected_rows() + iter = pathlist[0] + return self.store[iter][0].buffer - def get_buffer(self, column, cell, model, iter, data): - cell.set_property('text', self.store.get_value(iter, 0).name) + def get_buffer(self, column, cell, model, iter, data): + cell.set_property('text', self.store.get_value(iter, 0).name) - def match_func(self, row, name_, account): - name = name_ - account = account - iter = self.store.get_iter(row.path) - if self.store[iter][0].buffer.name == name and self.store[iter][0].buffer.account == account: - return (row.path, iter) - else: - return (None, None) + def match_func(self, row, name_, account): + name = name_ + account = account + iter = self.store.get_iter(row.path) + if self.store[iter][0].buffer.name == name and self.store[iter][0].buffer.account == account: + return (row.path, iter) + else: + return (None, None) - def search(self, rows, name_, account): - if not rows: return None - for row in rows: - (path, iter) = self.match_func(row, name_, account) - if iter != None: - return (path, iter) - (result_path, result_iter) = self.search(row.iterchildren(), name_, account) - if result_path: return (result_path, result_iter) - return (None, None) + def search(self, rows, name_, account): + if not rows: return None + for row in rows: + (path, iter) = self.match_func(row, name_, account) + if iter != None: + return (path, iter) + (result_path, result_iter) = self.search(row.iterchildren(), name_, account) + if result_path: return (result_path, result_iter) + return (None, None) class mainLoopObject(object): - def run(self): - GObject.type_register(buffer) - Gtk.main() + def run(self): + GObject.type_register(buffer) + Gtk.main() diff --git a/src/widgetUtils/wxUtils.py b/src/widgetUtils/wxUtils.py index 10c43362..9eb453ec 100644 --- a/src/widgetUtils/wxUtils.py +++ b/src/widgetUtils/wxUtils.py @@ -59,71 +59,71 @@ TASKBAR_RIGHT_CLICK = wx.adv.EVT_TASKBAR_RIGHT_DOWN TASKBAR_LEFT_CLICK = wx.adv.EVT_TASKBAR_LEFT_DOWN def exit_application(): - """ Closes the current window cleanly. """ - wx.GetApp().ExitMainLoop() + """ Closes the current window cleanly. """ + wx.GetApp().ExitMainLoop() def connect_event(parent, event, func, menuitem=None, *args, **kwargs): - """ Connects an event to a function. - parent wx.window: The widget that will listen for the event. - event widgetUtils.event: The event that will be listened for the parent. The event should be one of the widgetUtils events. - function func: The function that will be connected to the event.""" - if menuitem == None: - return getattr(parent, "Bind")(event, func, *args, **kwargs) - else: - return getattr(parent, "Bind")(event, func, menuitem, *args, **kwargs) + """ Connects an event to a function. + parent wx.window: The widget that will listen for the event. + event widgetUtils.event: The event that will be listened for the parent. The event should be one of the widgetUtils events. + function func: The function that will be connected to the event.""" + if menuitem == None: + return getattr(parent, "Bind")(event, func, *args, **kwargs) + else: + return getattr(parent, "Bind")(event, func, menuitem, *args, **kwargs) def connectExitFunction(exitFunction): - """ This connect the events in WX when an user is turning off the machine.""" - wx.GetApp().Bind(wx.EVT_QUERY_END_SESSION, exitFunction) - wx.GetApp().Bind(wx.EVT_END_SESSION, exitFunction) + """ This connect the events in WX when an user is turning off the machine.""" + wx.GetApp().Bind(wx.EVT_QUERY_END_SESSION, exitFunction) + wx.GetApp().Bind(wx.EVT_END_SESSION, exitFunction) class BaseDialog(wx.Dialog): - def __init__(self, *args, **kwargs): - super(BaseDialog, self).__init__(*args, **kwargs) + def __init__(self, *args, **kwargs): + super(BaseDialog, self).__init__(*args, **kwargs) - def get_response(self): - return self.ShowModal() + def get_response(self): + return self.ShowModal() - def get(self, control): - if hasattr(self, control): - control = getattr(self, control) - if hasattr(control, "GetValue"): return getattr(control, "GetValue")() - elif hasattr(control, "GetLabel"): return getattr(control, "GetLabel")() - else: return -1 - else: return 0 + def get(self, control): + if hasattr(self, control): + control = getattr(self, control) + if hasattr(control, "GetValue"): return getattr(control, "GetValue")() + elif hasattr(control, "GetLabel"): return getattr(control, "GetLabel")() + else: return -1 + else: return 0 - def set(self, control, text): - if hasattr(self, control): - control = getattr(self, control) - if hasattr(control, "SetValue"): return getattr(control, "SetValue")(text) - elif hasattr(control, "SetLabel"): return getattr(control, "SetLabel")(text) - elif hasattr(control, "ChangeValue"): return getattr(control, "ChangeValue")(text) - else: return -1 - else: return 0 + def set(self, control, text): + if hasattr(self, control): + control = getattr(self, control) + if hasattr(control, "SetValue"): return getattr(control, "SetValue")(text) + elif hasattr(control, "SetLabel"): return getattr(control, "SetLabel")(text) + elif hasattr(control, "ChangeValue"): return getattr(control, "ChangeValue")(text) + else: return -1 + else: return 0 - def destroy(self): - self.Destroy() + def destroy(self): + self.Destroy() - def set_title(self, title): - self.SetTitle(title) + def set_title(self, title): + self.SetTitle(title) - def get_title(self): - return self.GetTitle() + def get_title(self): + return self.GetTitle() class mainLoopObject(wx.App): - def __init__(self): - self.app = wx.App() - self.lc = wx.Locale() - lang=languageHandler.getLanguage() - wxLang=self.lc.FindLanguageInfo(lang) - if not wxLang and '_' in lang: - wxLang=self.lc.FindLanguageInfo(lang.split('_')[0]) - if hasattr(sys,'frozen'): - self.lc.AddCatalogLookupPathPrefix(os.path.join(paths.app_path(), "locales")) - if wxLang: - self.lc.Init(wxLang.Language) + def __init__(self): + self.app = wx.App() + self.lc = wx.Locale() + lang=languageHandler.getLanguage() + wxLang=self.lc.FindLanguageInfo(lang) + if not wxLang and '_' in lang: + wxLang=self.lc.FindLanguageInfo(lang.split('_')[0]) + if hasattr(sys,'frozen'): + self.lc.AddCatalogLookupPathPrefix(os.path.join(paths.app_path(), "locales")) + if wxLang: + self.lc.Init(wxLang.Language) - def run(self): - self.app.MainLoop() + def run(self): + self.app.MainLoop() diff --git a/src/wxUI/buffers/__init__.py b/src/wxUI/buffers/__init__.py index cc9de3f1..2825b5fb 100644 --- a/src/wxUI/buffers/__init__.py +++ b/src/wxUI/buffers/__init__.py @@ -10,4 +10,4 @@ from .panels import accountPanel, emptyPanel from .people import peoplePanel from .trends import trendsPanel from .tweet_searches import searchPanel -from .user_searches import searchUsersPanel \ No newline at end of file +from .user_searches import searchUsersPanel diff --git a/src/wxUI/buffers/base.py b/src/wxUI/buffers/base.py index 32287f9d..657caee3 100644 --- a/src/wxUI/buffers/base.py +++ b/src/wxUI/buffers/base.py @@ -4,43 +4,43 @@ import wx from multiplatform_widgets import widgets class basePanel(wx.Panel): - - def set_focus_function(self, f): - self.list.list.Bind(wx.EVT_LIST_ITEM_FOCUSED, f) - def create_list(self): - self.list = widgets.list(self, _(u"User"), _(u"Text"), _(u"Date"), _(u"Client"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) - self.list.set_windows_size(0, 60) - self.list.set_windows_size(1, 320) - self.list.set_windows_size(2, 110) - self.list.set_windows_size(3, 84) - self.list.set_size() + def set_focus_function(self, f): + self.list.list.Bind(wx.EVT_LIST_ITEM_FOCUSED, f) - def __init__(self, parent, name): - super(basePanel, self).__init__(parent) - self.name = name - self.type = "baseBuffer" - self.sizer = wx.BoxSizer(wx.VERTICAL) - self.create_list() - self.tweet = wx.Button(self, -1, _(u"Tweet")) - self.retweet = wx.Button(self, -1, _(u"Retweet")) - self.reply = wx.Button(self, -1, _(u"Reply")) - self.dm = wx.Button(self, -1, _(u"Direct message")) - btnSizer = wx.BoxSizer(wx.HORIZONTAL) - btnSizer.Add(self.tweet, 0, wx.ALL, 5) - btnSizer.Add(self.retweet, 0, wx.ALL, 5) - btnSizer.Add(self.reply, 0, wx.ALL, 5) - btnSizer.Add(self.dm, 0, wx.ALL, 5) - self.sizer.Add(btnSizer, 0, wx.ALL, 5) - self.sizer.Add(self.list.list, 0, wx.ALL|wx.EXPAND, 5) - self.SetSizer(self.sizer) - self.SetClientSize(self.sizer.CalcMin()) + def create_list(self): + self.list = widgets.list(self, _(u"User"), _(u"Text"), _(u"Date"), _(u"Client"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) + self.list.set_windows_size(0, 60) + self.list.set_windows_size(1, 320) + self.list.set_windows_size(2, 110) + self.list.set_windows_size(3, 84) + self.list.set_size() - def set_position(self, reversed=False): - if reversed == False: - self.list.select_item(self.list.get_count()-1) - else: - self.list.select_item(0) + def __init__(self, parent, name): + super(basePanel, self).__init__(parent) + self.name = name + self.type = "baseBuffer" + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.create_list() + self.tweet = wx.Button(self, -1, _(u"Tweet")) + self.retweet = wx.Button(self, -1, _(u"Retweet")) + self.reply = wx.Button(self, -1, _(u"Reply")) + self.dm = wx.Button(self, -1, _(u"Direct message")) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.Add(self.tweet, 0, wx.ALL, 5) + btnSizer.Add(self.retweet, 0, wx.ALL, 5) + btnSizer.Add(self.reply, 0, wx.ALL, 5) + btnSizer.Add(self.dm, 0, wx.ALL, 5) + self.sizer.Add(btnSizer, 0, wx.ALL, 5) + self.sizer.Add(self.list.list, 0, wx.ALL|wx.EXPAND, 5) + self.SetSizer(self.sizer) + self.SetClientSize(self.sizer.CalcMin()) - def set_focus_in_list(self): - self.list.list.SetFocus() \ No newline at end of file + def set_position(self, reversed=False): + if reversed == False: + self.list.select_item(self.list.get_count()-1) + else: + self.list.select_item(0) + + def set_focus_in_list(self): + self.list.list.SetFocus() diff --git a/src/wxUI/buffers/dm.py b/src/wxUI/buffers/dm.py index 13ea457f..85cf7d11 100644 --- a/src/wxUI/buffers/dm.py +++ b/src/wxUI/buffers/dm.py @@ -5,9 +5,9 @@ import wx from .base import basePanel class dmPanel(basePanel): - def __init__(self, parent, name): - """ Class to DM'S. Reply and retweet buttons are not showed and they have your delete method for dm's.""" - super(dmPanel, self).__init__(parent, name) - self.retweet.Disable() - self.reply.Disable() - self.type = "dm" \ No newline at end of file + def __init__(self, parent, name): + """ Class to DM'S. Reply and retweet buttons are not showed and they have your delete method for dm's.""" + super(dmPanel, self).__init__(parent, name) + self.retweet.Disable() + self.reply.Disable() + self.type = "dm" diff --git a/src/wxUI/buffers/events.py b/src/wxUI/buffers/events.py index aaa9411c..9df06178 100644 --- a/src/wxUI/buffers/events.py +++ b/src/wxUI/buffers/events.py @@ -4,22 +4,22 @@ import wx from multiplatform_widgets import widgets class eventsPanel(wx.Panel): - """ Buffer to show events. Different than tweets or people.""" + """ Buffer to show events. Different than tweets or people.""" - def __init__(self, parent, name): - self.type = "event" - super(eventsPanel, self).__init__(parent) - self.name = name - sizer = wx.BoxSizer() - self.list = widgets.list(self, _(u"Date"), _(u"Event"), size=(600,600), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) - self.tweet = wx.Button(self, -1, _(u"Tweet")) - self.delete_event = wx.Button(self, -1, _(u"Remove event")) + def __init__(self, parent, name): + self.type = "event" + super(eventsPanel, self).__init__(parent) + self.name = name + sizer = wx.BoxSizer() + self.list = widgets.list(self, _(u"Date"), _(u"Event"), size=(600,600), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) + self.tweet = wx.Button(self, -1, _(u"Tweet")) + self.delete_event = wx.Button(self, -1, _(u"Remove event")) - def set_position(self, reversed=False): - if reversed == False: - self.list.select_item(self.list.get_count()-1) - else: - self.list.select_item(0) + def set_position(self, reversed=False): + if reversed == False: + self.list.select_item(self.list.get_count()-1) + else: + self.list.select_item(0) - def set_focus_in_list(self): - self.list.list.SetFocus() \ No newline at end of file + def set_focus_in_list(self): + self.list.list.SetFocus() diff --git a/src/wxUI/buffers/favourites.py b/src/wxUI/buffers/favourites.py index cc61e303..41ba04ae 100644 --- a/src/wxUI/buffers/favourites.py +++ b/src/wxUI/buffers/favourites.py @@ -5,6 +5,6 @@ import wx from .base import basePanel class favsPanel(basePanel): - def __init__(self, parent, name): - super(favsPanel, self).__init__(parent, name) - self.type = "favourites_timeline" \ No newline at end of file + def __init__(self, parent, name): + super(favsPanel, self).__init__(parent, name) + self.type = "favourites_timeline" diff --git a/src/wxUI/buffers/lists.py b/src/wxUI/buffers/lists.py index 9c31e95c..55c25813 100644 --- a/src/wxUI/buffers/lists.py +++ b/src/wxUI/buffers/lists.py @@ -5,6 +5,6 @@ import wx from .base import basePanel class listPanel(basePanel): - def __init__(self, parent, name): - super(listPanel, self).__init__(parent, name) - self.type = "list" + def __init__(self, parent, name): + super(listPanel, self).__init__(parent, name) + self.type = "list" diff --git a/src/wxUI/buffers/panels.py b/src/wxUI/buffers/panels.py index 5bd02498..f0ccfd4f 100644 --- a/src/wxUI/buffers/panels.py +++ b/src/wxUI/buffers/panels.py @@ -4,33 +4,33 @@ import wx from multiplatform_widgets import widgets class accountPanel(wx.Panel): - def __init__(self, parent, name=None): - super(accountPanel, self).__init__(parent=parent) - self.name = name - self.type = "account" - sizer = wx.BoxSizer(wx.VERTICAL) - self.login = wx.Button(self, -1, _(u"Login")) - sizer.Add(self.login, 0, wx.ALL, 5) - self.autostart_account = wx.CheckBox(self, -1, _(u"Log in automatically")) - sizer.Add(self.autostart_account, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent, name=None): + super(accountPanel, self).__init__(parent=parent) + self.name = name + self.type = "account" + sizer = wx.BoxSizer(wx.VERTICAL) + self.login = wx.Button(self, -1, _(u"Login")) + sizer.Add(self.login, 0, wx.ALL, 5) + self.autostart_account = wx.CheckBox(self, -1, _(u"Log in automatically")) + sizer.Add(self.autostart_account, 0, wx.ALL, 5) + self.SetSizer(sizer) - def change_login(self, login=True): - if login == True: - self.login.SetLabel(_(u"Login")) - else: - self.login.SetLabel(_(u"Logout")) + def change_login(self, login=True): + if login == True: + self.login.SetLabel(_(u"Login")) + else: + self.login.SetLabel(_(u"Logout")) - def change_autostart(self, autostart=True): - self.autostart_account.SetValue(autostart) + def change_autostart(self, autostart=True): + self.autostart_account.SetValue(autostart) - def get_autostart(self): - return self.autostart_account.GetValue() + def get_autostart(self): + return self.autostart_account.GetValue() class emptyPanel(wx.Panel): - def __init__(self, parent, name): - super(emptyPanel, self).__init__(parent=parent, name=name) - self.name = name - self.type = "account" - sizer = wx.BoxSizer(wx.VERTICAL) - self.SetSizer(sizer) + def __init__(self, parent, name): + super(emptyPanel, self).__init__(parent=parent, name=name) + self.name = name + self.type = "account" + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetSizer(sizer) diff --git a/src/wxUI/buffers/people.py b/src/wxUI/buffers/people.py index 25490be4..b2248f84 100644 --- a/src/wxUI/buffers/people.py +++ b/src/wxUI/buffers/people.py @@ -6,13 +6,13 @@ from multiplatform_widgets import widgets from .base import basePanel class peoplePanel(basePanel): - """ Buffer used to show people.""" + """ Buffer used to show people.""" - def create_list(self): - self.list = widgets.list(self, _(u"User"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(800, 800)) + def create_list(self): + self.list = widgets.list(self, _(u"User"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(800, 800)) - def __init__(self, parent, name): - super(peoplePanel, self).__init__(parent, name) - self.type = "people" - self.reply.SetLabel(_(u"Mention")) - self.retweet.Disable() + def __init__(self, parent, name): + super(peoplePanel, self).__init__(parent, name) + self.type = "people" + self.reply.SetLabel(_(u"Mention")) + self.retweet.Disable() diff --git a/src/wxUI/buffers/trends.py b/src/wxUI/buffers/trends.py index 51058e78..975a88ca 100644 --- a/src/wxUI/buffers/trends.py +++ b/src/wxUI/buffers/trends.py @@ -4,31 +4,31 @@ import wx from multiplatform_widgets import widgets class trendsPanel(wx.Panel): - def create_list(self): - """ Returns the list for put the tweets here.""" - self.list = widgets.list(self, _(u"Trending topic"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) - self.list.set_windows_size(0, 30) - self.list.set_size() + def create_list(self): + """ Returns the list for put the tweets here.""" + self.list = widgets.list(self, _(u"Trending topic"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL|wx.LC_VRULES) + self.list.set_windows_size(0, 30) + self.list.set_size() - def __init__(self, parent, name): - super(trendsPanel, self).__init__(parent) - self.type = "trends" - self.sizer = wx.BoxSizer(wx.VERTICAL) - self.create_list() - self.tweet = wx.Button(self, -1, _(u"Tweet")) - self.tweetTrendBtn = wx.Button(self, -1, _(u"Tweet about this trend")) - self.search_topic = wx.Button(self, -1, _(u"Search topic")) - btnSizer = wx.BoxSizer(wx.HORIZONTAL) - btnSizer.Add(self.tweet, 0, wx.ALL, 5) - btnSizer.Add(self.tweetTrendBtn, 0, wx.ALL, 5) - btnSizer.Add(self.search_topic, 0, wx.ALL, 5) - self.sizer.Add(btnSizer, 0, wx.ALL, 5) - self.sizer.Add(self.list.list, 0, wx.ALL, 5) - self.SetSizer(self.sizer) + def __init__(self, parent, name): + super(trendsPanel, self).__init__(parent) + self.type = "trends" + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.create_list() + self.tweet = wx.Button(self, -1, _(u"Tweet")) + self.tweetTrendBtn = wx.Button(self, -1, _(u"Tweet about this trend")) + self.search_topic = wx.Button(self, -1, _(u"Search topic")) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.Add(self.tweet, 0, wx.ALL, 5) + btnSizer.Add(self.tweetTrendBtn, 0, wx.ALL, 5) + btnSizer.Add(self.search_topic, 0, wx.ALL, 5) + self.sizer.Add(btnSizer, 0, wx.ALL, 5) + self.sizer.Add(self.list.list, 0, wx.ALL, 5) + self.SetSizer(self.sizer) + + def set_position(self, reversed=False): + if reversed == False: + self.list.select_item(self.list.get_count()-1) + else: + self.list.select_item(0) - def set_position(self, reversed=False): - if reversed == False: - self.list.select_item(self.list.get_count()-1) - else: - self.list.select_item(0) - \ No newline at end of file diff --git a/src/wxUI/buffers/tweet_searches.py b/src/wxUI/buffers/tweet_searches.py index 6862e482..df6560f0 100644 --- a/src/wxUI/buffers/tweet_searches.py +++ b/src/wxUI/buffers/tweet_searches.py @@ -5,6 +5,6 @@ import wx from .base import basePanel class searchPanel(basePanel): - def __init__(self, parent, name): - super(searchPanel, self).__init__(parent, name) - self.type = "search" + def __init__(self, parent, name): + super(searchPanel, self).__init__(parent, name) + self.type = "search" diff --git a/src/wxUI/buffers/user_searches.py b/src/wxUI/buffers/user_searches.py index 651c2a55..26292fd1 100644 --- a/src/wxUI/buffers/user_searches.py +++ b/src/wxUI/buffers/user_searches.py @@ -6,11 +6,11 @@ from .tweet_searches import searchPanel from multiplatform_widgets import widgets class searchUsersPanel(searchPanel): - def create_list(self): - """ Returns the list for put the tweets here.""" - self.list = widgets.list(self, _(u"User"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(800, 800)) + def create_list(self): + """ Returns the list for put the tweets here.""" + self.list = widgets.list(self, _(u"User"), style=wx.LC_REPORT|wx.LC_SINGLE_SEL, size=(800, 800)) - def __init__(self, parent, name): - super(searchUsersPanel, self).__init__(parent, name) - self.create_list() - self.type = "user_searches" \ No newline at end of file + def __init__(self, parent, name): + super(searchUsersPanel, self).__init__(parent, name) + self.create_list() + self.type = "user_searches" diff --git a/src/wxUI/commonMessageDialogs.py b/src/wxUI/commonMessageDialogs.py index 8288af68..277ceca7 100644 --- a/src/wxUI/commonMessageDialogs.py +++ b/src/wxUI/commonMessageDialogs.py @@ -4,92 +4,92 @@ import wx import application def retweet_as_link(parent): - return wx.MessageDialog(parent, _(u"This retweet is over 140 characters. Would you like to post it as a mention to the poster with your comments and a link to the original tweet?"), application.name, wx.YES_NO|wx.ICON_QUESTION).ShowModal() + 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() 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): - 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() + return wx.MessageDialog(parent, _(u"Do you really want to delete this tweet? It will be deleted from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO).ShowModal() def exit_dialog(parent): - dlg = wx.MessageDialog(parent, _(u"Do you really want to close {0}?").format(application.name,), _(u"Exit"), wx.YES_NO|wx.ICON_QUESTION) - return dlg.ShowModal() + dlg = wx.MessageDialog(parent, _(u"Do you really want to close {0}?").format(application.name,), _(u"Exit"), wx.YES_NO|wx.ICON_QUESTION) + return dlg.ShowModal() 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(): - 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() + return wx.MessageDialog(None, _(u"Are you sure you want to delete this user from the database? This user will not appear in autocomplete results anymore."), _(u"Confirm"), wx.YES_NO|wx.ICON_QUESTION).ShowModal() def get_ignored_client(): - entry = wx.TextEntryDialog(None, _(u"Enter the name of the client : "), _(u"Add client")) - if entry.ShowModal() == wx.ID_OK: - return entry.GetValue() - return None + entry = wx.TextEntryDialog(None, _(u"Enter the name of the client : "), _(u"Add client")) + if entry.ShowModal() == wx.ID_OK: + return entry.GetValue() + return None def clear_list(): - dlg = wx.MessageDialog(None, _(u"Do you really want to empty this buffer? It's items will be removed from the list but not from Twitter"), _(u"Empty buffer"), wx.ICON_QUESTION|wx.YES_NO) - return dlg.ShowModal() + dlg = wx.MessageDialog(None, _(u"Do you really want to empty this buffer? It's items will be removed from the list but not from Twitter"), _(u"Empty buffer"), wx.ICON_QUESTION|wx.YES_NO) + return dlg.ShowModal() def remove_buffer(): - return wx.MessageDialog(None, _(u"Do you really want to destroy this buffer?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal() + return wx.MessageDialog(None, _(u"Do you really want to destroy this buffer?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal() def user_not_exist(): - return wx.MessageDialog(None, _(u"That user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"That user does not exist"), _(u"Error"), wx.ICON_ERROR).ShowModal() def timeline_exist(): - return wx.MessageDialog(None, _(u"A timeline for this user already exists. You can't open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"A timeline for this user already exists. You can't open another"), _(u"Existing timeline"), wx.ICON_ERROR).ShowModal() def no_tweets(): - return wx.MessageDialog(None, _(u"This user has no tweets, so you can't open a timeline for them."), _(u"Error!"), wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"This user has no tweets, so you can't open a timeline for them."), _(u"Error!"), wx.ICON_ERROR).ShowModal() def protected_user(): - return wx.MessageDialog(None, _(u"This is a protected Twitter user, 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() + return wx.MessageDialog(None, _(u"This is a protected Twitter user, which means you can't open a timeline using the Streaming API. The user's tweets will not update due to a twitter policy. Do you want to continue?"), _(u"Warning"), wx.ICON_WARNING|wx.YES_NO).ShowModal() def no_following(): - return wx.MessageDialog(None, _(u"This is a protected user account, you need to follow this user to view their tweets or likes."), _(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 likes."), _(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() + dlg = wx.MessageDialog(None, _(u"If you like {0} we need your help to keep it going. Help us by donating to the project. This will help us pay for the server, the domain and some other things to ensure that {0} will be actively maintained. Your donation will give us the means to continue the development of {0}, and to keep {0} free. Would you like to donate now?").format(application.name), _(u"We need your help"), wx.ICON_QUESTION|wx.YES_NO) + return dlg.ShowModal() def no_tweets(): - return wx.MessageDialog(None, _(u"This user has no tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"This user has no tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() def no_favs(): - return wx.MessageDialog(None, _(u"This user has no favorited tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"This user has no favorited tweets. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() def no_followers(): - return wx.MessageDialog(None, _(u"This user has no followers. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() + return wx.MessageDialog(None, _(u"This user has no followers. {0} can't create a timeline.").format(application.name), _(u"Error"), wx.ICON_ERROR).ShowModal() 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() + """Specific message dialog to display geolocation data""" + return wx.MessageDialog(None, _(u"Geolocation data: {0}").format(geotext), _(u"Geo data for this tweet")).ShowModal() def changed_keymap(): - return wx.MessageDialog(None, _(u"TWBlue has detected that you're running windows 10 and has changed the default keymap to the Windows 10 keymap. It means that some keyboard shorcuts could be different. Please check the keystroke editor by pressing Alt+Win+K to see all available keystrokes for this keymap."), _(u"Information"), wx.OK).ShowModal() + return wx.MessageDialog(None, _(u"TWBlue has detected that you're running windows 10 and has changed the default keymap to the Windows 10 keymap. It means that some keyboard shorcuts could be different. Please check the keystroke editor by pressing Alt+Win+K to see all available keystrokes for this keymap."), _(u"Information"), wx.OK).ShowModal() def unauthorized(): - return wx.MessageDialog(None, _(u"You have been blocked from viewing this content"), _(u"Error"), wx.OK).ShowModal() + return wx.MessageDialog(None, _(u"You have been blocked from viewing this content"), _(u"Error"), wx.OK).ShowModal() def blocked_timeline(): - return wx.MessageDialog(None, _(u"You have been blocked from viewing someone's content. In order to avoid conflicts with the full session, TWBlue will remove the affected timeline."), _(u"Error"), wx.OK).ShowModal() - + return wx.MessageDialog(None, _(u"You have been blocked from viewing someone's content. In order to avoid conflicts with the full session, TWBlue will remove the affected timeline."), _(u"Error"), wx.OK).ShowModal() + def suspended_user(): - return wx.MessageDialog(None, _(u"TWBlue cannot load this timeline because the user has been suspended from Twitter."), _(u"Error"), wx.OK).ShowModal() + return wx.MessageDialog(None, _(u"TWBlue cannot load this timeline because the user has been suspended from Twitter."), _(u"Error"), wx.OK).ShowModal() def delete_filter(): - return wx.MessageDialog(None, _(u"Do you really want to delete this filter?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal() + return wx.MessageDialog(None, _(u"Do you really want to delete this filter?"), _(u"Attention"), style=wx.ICON_QUESTION|wx.YES_NO).ShowModal() def existing_filter(): - return wx.MessageDialog(None, _(u"This filter already exists. Please use a different title"), _(u"Error"), wx.OK).ShowModal() + return wx.MessageDialog(None, _(u"This filter already exists. Please use a different title"), _(u"Error"), wx.OK).ShowModal() def common_error(reason): - return wx.MessageDialog(None, reason, _(u"Error"), wx.OK).ShowModal() + return wx.MessageDialog(None, reason, _(u"Error"), wx.OK).ShowModal() def dead_pid(): - return wx.MessageDialog(None, _(u"{0} quit unexpectedly the last time it was run. If the problem persists, please report it to the {0} developers.").format(application.name), _(u"Warning"), wx.OK).ShowModal() \ No newline at end of file + return wx.MessageDialog(None, _(u"{0} quit unexpectedly the last time it was run. If the problem persists, please report it to the {0} developers.").format(application.name), _(u"Warning"), wx.OK).ShowModal() diff --git a/src/wxUI/dialogs/attach.py b/src/wxUI/dialogs/attach.py index ea8d35c1..0b20a422 100644 --- a/src/wxUI/dialogs/attach.py +++ b/src/wxUI/dialogs/attach.py @@ -6,43 +6,43 @@ import widgetUtils from multiplatform_widgets import widgets class attachDialog(widgetUtils.BaseDialog): - def __init__(self): - super(attachDialog, self).__init__(None, title=_(u"Add an attachment")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - lbl1 = wx.StaticText(panel, wx.ID_ANY, _(u"Attachments")) - self.attachments = widgets.list(panel, _(u"Type"), _(u"Title"), style=wx.LC_REPORT) - box = wx.BoxSizer(wx.HORIZONTAL) - box.Add(lbl1, 0, wx.ALL, 5) - box.Add(self.attachments.list, 0, wx.ALL, 5) - sizer.Add(box, 0, wx.ALL, 5) - static = wx.StaticBox(panel, label=_(u"Add attachments")) - self.photo = wx.Button(panel, wx.ID_ANY, _(u"&Photo")) - self.remove = wx.Button(panel, wx.ID_ANY, _(u"Remove attachment")) - self.remove.Enable(False) - btnsizer = wx.StaticBoxSizer(static, wx.HORIZONTAL) - btnsizer.Add(self.photo, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK) - ok.SetDefault() - cancelBtn = wx.Button(panel, wx.ID_CANCEL) - btnSizer = wx.BoxSizer() - btnSizer.Add(ok, 0, wx.ALL, 5) - btnSizer.Add(cancelBtn, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(attachDialog, self).__init__(None, title=_(u"Add an attachment")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + lbl1 = wx.StaticText(panel, wx.ID_ANY, _(u"Attachments")) + self.attachments = widgets.list(panel, _(u"Type"), _(u"Title"), style=wx.LC_REPORT) + box = wx.BoxSizer(wx.HORIZONTAL) + box.Add(lbl1, 0, wx.ALL, 5) + box.Add(self.attachments.list, 0, wx.ALL, 5) + sizer.Add(box, 0, wx.ALL, 5) + static = wx.StaticBox(panel, label=_(u"Add attachments")) + self.photo = wx.Button(panel, wx.ID_ANY, _(u"&Photo")) + self.remove = wx.Button(panel, wx.ID_ANY, _(u"Remove attachment")) + self.remove.Enable(False) + btnsizer = wx.StaticBoxSizer(static, wx.HORIZONTAL) + btnsizer.Add(self.photo, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK) + ok.SetDefault() + cancelBtn = wx.Button(panel, wx.ID_CANCEL) + btnSizer = wx.BoxSizer() + btnSizer.Add(ok, 0, wx.ALL, 5) + btnSizer.Add(cancelBtn, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return (None, None) - dsc = self.ask_description() - return (openFileDialog.GetPath(), dsc) + def get_image(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return (None, None) + dsc = self.ask_description() + return (openFileDialog.GetPath(), dsc) - def ask_description(self): - dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description")) - dlg.ShowModal() - result = dlg.GetValue() - dlg.Destroy() - return result + def ask_description(self): + dlg = wx.TextEntryDialog(self, _(u"please provide a description"), _(u"Description")) + dlg.ShowModal() + result = dlg.GetValue() + dlg.Destroy() + return result diff --git a/src/wxUI/dialogs/baseDialog.py b/src/wxUI/dialogs/baseDialog.py index 01fe8b49..20480d9e 100644 --- a/src/wxUI/dialogs/baseDialog.py +++ b/src/wxUI/dialogs/baseDialog.py @@ -2,28 +2,28 @@ from __future__ import unicode_literals import wx class BaseWXDialog(wx.Dialog): - def __init__(self, *args, **kwargs): - super(BaseWXDialog, self).__init__(*args, **kwargs) + def __init__(self, *args, **kwargs): + super(BaseWXDialog, self).__init__(*args, **kwargs) - def get_response(self): - return self.ShowModal() + def get_response(self): + return self.ShowModal() - def get(self, control): - if hasattr(self, control): - control = getattr(self, control) - if hasattr(control, "GetValue"): return getattr(control, "GetValue")() - elif hasattr(control, "GetLabel"): return getattr(control, "GetLabel")() - else: return -1 - else: return 0 + def get(self, control): + if hasattr(self, control): + control = getattr(self, control) + if hasattr(control, "GetValue"): return getattr(control, "GetValue")() + elif hasattr(control, "GetLabel"): return getattr(control, "GetLabel")() + else: return -1 + else: return 0 - def set(self, control, text): - if hasattr(self, control): - control = getattr(self, control) - if hasattr(control, "SetValue"): return getattr(control, "SetValue")(text) - elif hasattr(control, "SetLabel"): return getattr(control, "SetLabel")(text) - elif hasattr(control, "ChangeValue"): return getattr(control, "ChangeValue")(text) - else: return -1 - else: return 0 + def set(self, control, text): + if hasattr(self, control): + control = getattr(self, control) + if hasattr(control, "SetValue"): return getattr(control, "SetValue")(text) + elif hasattr(control, "SetLabel"): return getattr(control, "SetLabel")(text) + elif hasattr(control, "ChangeValue"): return getattr(control, "ChangeValue")(text) + else: return -1 + else: return 0 - def set_title(self, title): - self.SetTitle(title) + def set_title(self, title): + self.SetTitle(title) diff --git a/src/wxUI/dialogs/configuration.py b/src/wxUI/dialogs/configuration.py index def44926..147bba1d 100644 --- a/src/wxUI/dialogs/configuration.py +++ b/src/wxUI/dialogs/configuration.py @@ -12,403 +12,403 @@ from . import baseDialog from multiplatform_widgets import widgets class general(wx.Panel, baseDialog.BaseWXDialog): - def __init__(self, parent, languages,keymaps): - super(general, self).__init__(parent) - sizer = wx.BoxSizer(wx.VERTICAL) - language = wx.StaticText(self, -1, _(u"Language")) - self.language = wx.ListBox(self, -1, choices=languages) - self.language.SetSize(self.language.GetBestSize()) - langBox = wx.BoxSizer(wx.HORIZONTAL) - langBox.Add(language, 0, wx.ALL, 5) - langBox.Add(self.language, 0, wx.ALL, 5) - sizer.Add(langBox, 0, wx.ALL, 5) - self.autostart = wx.CheckBox(self, -1, _(u"Run {0} at Windows startup").format(application.name,)) - self.ask_at_exit = wx.CheckBox(self, -1, _(U"ask before exiting {0}").format(application.name,)) - sizer.Add(self.autostart, 0, wx.ALL, 5) - sizer.Add(self.ask_at_exit, 0, wx.ALL, 5) - self.no_streaming = wx.CheckBox(self, -1, _(U"Disable Streaming functions")) - sizer.Add(self.no_streaming, 0, wx.ALL, 5) - updatePeriodBox = wx.BoxSizer(wx.HORIZONTAL) - updatePeriodBox.Add(wx.StaticText(self, -1, _(u"Buffer update interval, in minutes")), 0, wx.ALL, 5) - self.update_period = wx.SpinCtrl(self, wx.ID_ANY) - self.update_period.SetRange(1, 30) - self.update_period.SetSize(self.update_period.GetBestSize()) - updatePeriodBox.Add(self.update_period, 0, wx.ALL, 5) - sizer.Add(updatePeriodBox, 0, wx.ALL, 5) - self.play_ready_sound = wx.CheckBox(self, -1, _(U"Play a sound when {0} launches").format(application.name,)) - sizer.Add(self.play_ready_sound, 0, wx.ALL, 5) - self.speak_ready_msg = wx.CheckBox(self, -1, _(U"Speak a message when {0} launches").format(application.name,)) - sizer.Add(self.speak_ready_msg, 0, wx.ALL, 5) - self.use_invisible_shorcuts = wx.CheckBox(self, -1, _(u"Use invisible interface's keyboard shortcuts while GUI is visible")) - sizer.Add(self.use_invisible_shorcuts, 0, wx.ALL, 5) - self.disable_sapi5 = wx.CheckBox(self, -1, _(u"Activate Sapi5 when any other screen reader is not being run")) - sizer.Add(self.disable_sapi5, 0, wx.ALL, 5) - self.hide_gui = wx.CheckBox(self, -1, _(u"Hide GUI on launch")) - sizer.Add(self.hide_gui, 0, wx.ALL, 5) - self.handle_longtweets = wx.CheckBox(self, wx.ID_ANY, _(u"Use Codeofdusk's longtweet handlers (may decrease client performance)")) - sizer.Add(self.handle_longtweets, 0, wx.ALL, 5) - self.remember_mention_and_longtweet = wx.CheckBox(self, -1, _(u"Remember state for mention all and long tweet")) - sizer.Add(self.remember_mention_and_longtweet, 0, wx.ALL, 5) - kmbox = wx.BoxSizer(wx.VERTICAL) - km_label = wx.StaticText(self, -1, _(u"Keymap")) - self.km = wx.ComboBox(self, -1, choices=keymaps, style=wx.CB_READONLY) - self.km.SetSize(self.km.GetBestSize()) - kmbox.Add(km_label, 0, wx.ALL, 5) - kmbox.Add(self.km, 0, wx.ALL, 5) - self.check_for_updates = wx.CheckBox(self, -1, _(U"Check for updates when {0} launches").format(application.name,)) - sizer.Add(self.check_for_updates, 0, wx.ALL, 5) - sizer.Add(kmbox, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent, languages,keymaps): + super(general, self).__init__(parent) + sizer = wx.BoxSizer(wx.VERTICAL) + language = wx.StaticText(self, -1, _(u"Language")) + self.language = wx.ListBox(self, -1, choices=languages) + self.language.SetSize(self.language.GetBestSize()) + langBox = wx.BoxSizer(wx.HORIZONTAL) + langBox.Add(language, 0, wx.ALL, 5) + langBox.Add(self.language, 0, wx.ALL, 5) + sizer.Add(langBox, 0, wx.ALL, 5) + self.autostart = wx.CheckBox(self, -1, _(u"Run {0} at Windows startup").format(application.name,)) + self.ask_at_exit = wx.CheckBox(self, -1, _(U"ask before exiting {0}").format(application.name,)) + sizer.Add(self.autostart, 0, wx.ALL, 5) + sizer.Add(self.ask_at_exit, 0, wx.ALL, 5) + self.no_streaming = wx.CheckBox(self, -1, _(U"Disable Streaming functions")) + sizer.Add(self.no_streaming, 0, wx.ALL, 5) + updatePeriodBox = wx.BoxSizer(wx.HORIZONTAL) + updatePeriodBox.Add(wx.StaticText(self, -1, _(u"Buffer update interval, in minutes")), 0, wx.ALL, 5) + self.update_period = wx.SpinCtrl(self, wx.ID_ANY) + self.update_period.SetRange(1, 30) + self.update_period.SetSize(self.update_period.GetBestSize()) + updatePeriodBox.Add(self.update_period, 0, wx.ALL, 5) + sizer.Add(updatePeriodBox, 0, wx.ALL, 5) + self.play_ready_sound = wx.CheckBox(self, -1, _(U"Play a sound when {0} launches").format(application.name,)) + sizer.Add(self.play_ready_sound, 0, wx.ALL, 5) + self.speak_ready_msg = wx.CheckBox(self, -1, _(U"Speak a message when {0} launches").format(application.name,)) + sizer.Add(self.speak_ready_msg, 0, wx.ALL, 5) + self.use_invisible_shorcuts = wx.CheckBox(self, -1, _(u"Use invisible interface's keyboard shortcuts while GUI is visible")) + sizer.Add(self.use_invisible_shorcuts, 0, wx.ALL, 5) + self.disable_sapi5 = wx.CheckBox(self, -1, _(u"Activate Sapi5 when any other screen reader is not being run")) + sizer.Add(self.disable_sapi5, 0, wx.ALL, 5) + self.hide_gui = wx.CheckBox(self, -1, _(u"Hide GUI on launch")) + sizer.Add(self.hide_gui, 0, wx.ALL, 5) + self.handle_longtweets = wx.CheckBox(self, wx.ID_ANY, _(u"Use Codeofdusk's longtweet handlers (may decrease client performance)")) + sizer.Add(self.handle_longtweets, 0, wx.ALL, 5) + self.remember_mention_and_longtweet = wx.CheckBox(self, -1, _(u"Remember state for mention all and long tweet")) + sizer.Add(self.remember_mention_and_longtweet, 0, wx.ALL, 5) + kmbox = wx.BoxSizer(wx.VERTICAL) + km_label = wx.StaticText(self, -1, _(u"Keymap")) + self.km = wx.ComboBox(self, -1, choices=keymaps, style=wx.CB_READONLY) + self.km.SetSize(self.km.GetBestSize()) + kmbox.Add(km_label, 0, wx.ALL, 5) + kmbox.Add(self.km, 0, wx.ALL, 5) + self.check_for_updates = wx.CheckBox(self, -1, _(U"Check for updates when {0} launches").format(application.name,)) + sizer.Add(self.check_for_updates, 0, wx.ALL, 5) + sizer.Add(kmbox, 0, wx.ALL, 5) + self.SetSizer(sizer) class proxy(wx.Panel, baseDialog.BaseWXDialog): - def __init__(self, parent, proxyTypes): - super(proxy, self).__init__(parent) - sizer = wx.BoxSizer(wx.VERTICAL) - type=wx.StaticText(self, wx.ID_ANY, _(u"Proxy type: ")) - self.type=wx.ComboBox(self, -1, choices=proxyTypes, style=wx.CB_READONLY) - self.type.SetSize(self.type.GetBestSize()) - typeBox = wx.BoxSizer(wx.HORIZONTAL) - typeBox.Add(type, 0, wx.ALL, 5) - typeBox.Add(self.type, 0, wx.ALL, 5) - sizer.Add(typeBox, 0, wx.ALL, 5) - lbl = wx.StaticText(self, wx.ID_ANY, _(u"Proxy server: ")) - self.server = wx.TextCtrl(self, -1) - serverBox = wx.BoxSizer(wx.HORIZONTAL) - serverBox.Add(lbl, 0, wx.ALL, 5) - serverBox.Add(self.server, 0, wx.ALL, 5) - sizer.Add(serverBox, 0, wx.ALL, 5) - lbl = wx.StaticText(self, wx.ID_ANY, _(u"Port: ")) - self.port = wx.SpinCtrl(self, wx.ID_ANY, min=1, max=65535) - portBox = wx.BoxSizer(wx.HORIZONTAL) - portBox.Add(lbl, 0, wx.ALL, 5) - portBox.Add(self.port, 0, wx.ALL, 5) - sizer.Add(portBox, 0, wx.ALL, 5) - lbl = wx.StaticText(self, wx.ID_ANY, _(u"User: ")) - self.user = wx.TextCtrl(self, wx.ID_ANY) - userBox = wx.BoxSizer(wx.HORIZONTAL) - userBox.Add(lbl, 0, wx.ALL, 5) - userBox.Add(self.user, 0, wx.ALL, 5) - sizer.Add(userBox, 0, wx.ALL, 5) - lbl = wx.StaticText(self, wx.ID_ANY, _(u"Password: ")) - self.password = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_PASSWORD) - passwordBox = wx.BoxSizer(wx.HORIZONTAL) - passwordBox.Add(lbl, 0, wx.ALL, 5) - passwordBox.Add(self.password, 0, wx.ALL, 5) - sizer.Add(serverBox, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent, proxyTypes): + super(proxy, self).__init__(parent) + sizer = wx.BoxSizer(wx.VERTICAL) + type=wx.StaticText(self, wx.ID_ANY, _(u"Proxy type: ")) + self.type=wx.ComboBox(self, -1, choices=proxyTypes, style=wx.CB_READONLY) + self.type.SetSize(self.type.GetBestSize()) + typeBox = wx.BoxSizer(wx.HORIZONTAL) + typeBox.Add(type, 0, wx.ALL, 5) + typeBox.Add(self.type, 0, wx.ALL, 5) + sizer.Add(typeBox, 0, wx.ALL, 5) + lbl = wx.StaticText(self, wx.ID_ANY, _(u"Proxy server: ")) + self.server = wx.TextCtrl(self, -1) + serverBox = wx.BoxSizer(wx.HORIZONTAL) + serverBox.Add(lbl, 0, wx.ALL, 5) + serverBox.Add(self.server, 0, wx.ALL, 5) + sizer.Add(serverBox, 0, wx.ALL, 5) + lbl = wx.StaticText(self, wx.ID_ANY, _(u"Port: ")) + self.port = wx.SpinCtrl(self, wx.ID_ANY, min=1, max=65535) + portBox = wx.BoxSizer(wx.HORIZONTAL) + portBox.Add(lbl, 0, wx.ALL, 5) + portBox.Add(self.port, 0, wx.ALL, 5) + sizer.Add(portBox, 0, wx.ALL, 5) + lbl = wx.StaticText(self, wx.ID_ANY, _(u"User: ")) + self.user = wx.TextCtrl(self, wx.ID_ANY) + userBox = wx.BoxSizer(wx.HORIZONTAL) + userBox.Add(lbl, 0, wx.ALL, 5) + userBox.Add(self.user, 0, wx.ALL, 5) + sizer.Add(userBox, 0, wx.ALL, 5) + lbl = wx.StaticText(self, wx.ID_ANY, _(u"Password: ")) + self.password = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_PASSWORD) + passwordBox = wx.BoxSizer(wx.HORIZONTAL) + passwordBox.Add(lbl, 0, wx.ALL, 5) + passwordBox.Add(self.password, 0, wx.ALL, 5) + sizer.Add(serverBox, 0, wx.ALL, 5) + self.SetSizer(sizer) class generalAccount(wx.Panel, baseDialog.BaseWXDialog): - def __init__(self, parent): - super(generalAccount, self).__init__(parent) - sizer = wx.BoxSizer(wx.VERTICAL) - self.au = wx.Button(self, wx.ID_ANY, _(u"Autocompletion settings...")) - sizer.Add(self.au, 0, wx.ALL, 5) - self.relative_time = wx.CheckBox(self, wx.ID_ANY, _(U"Relative timestamps")) - sizer.Add(self.relative_time, 0, wx.ALL, 5) - tweetsPerCallBox = wx.BoxSizer(wx.HORIZONTAL) - tweetsPerCallBox.Add(wx.StaticText(self, -1, _(u"Items on each API call")), 0, wx.ALL, 5) - self.itemsPerApiCall = wx.SpinCtrl(self, wx.ID_ANY) - self.itemsPerApiCall.SetRange(0, 200) - self.itemsPerApiCall.SetSize(self.itemsPerApiCall.GetBestSize()) - tweetsPerCallBox.Add(self.itemsPerApiCall, 0, wx.ALL, 5) - sizer.Add(tweetsPerCallBox, 0, wx.ALL, 5) - self.reverse_timelines = wx.CheckBox(self, wx.ID_ANY, _(u"Inverted buffers: The newest tweets will be shown at the beginning while the oldest at the end")) - sizer.Add(self.reverse_timelines, 0, wx.ALL, 5) - lbl = wx.StaticText(self, wx.ID_ANY, _(u"Retweet mode")) - self.retweet_mode = wx.ComboBox(self, wx.ID_ANY, choices=[_(u"Ask"), _(u"Retweet without comments"), _(u"Retweet with comments")], style=wx.CB_READONLY) - rMode = wx.BoxSizer(wx.HORIZONTAL) - rMode.Add(lbl, 0, wx.ALL, 5) - rMode.Add(self.retweet_mode, 0, wx.ALL, 5) - sizer.Add(rMode, 0, wx.ALL, 5) - self.show_screen_names = wx.CheckBox(self, wx.ID_ANY, _(U"Show screen names instead of full names")) - sizer.Add(self.show_screen_names, 0, wx.ALL, 5) - PersistSizeLabel = wx.StaticText(self, -1, _(u"Number of items per buffer to cache in database (0 to disable caching, blank for unlimited)")) - self.persist_size = wx.TextCtrl(self, -1) - sizer.Add(PersistSizeLabel, 0, wx.ALL, 5) - sizer.Add(self.persist_size, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent): + super(generalAccount, self).__init__(parent) + sizer = wx.BoxSizer(wx.VERTICAL) + self.au = wx.Button(self, wx.ID_ANY, _(u"Autocompletion settings...")) + sizer.Add(self.au, 0, wx.ALL, 5) + self.relative_time = wx.CheckBox(self, wx.ID_ANY, _(U"Relative timestamps")) + sizer.Add(self.relative_time, 0, wx.ALL, 5) + tweetsPerCallBox = wx.BoxSizer(wx.HORIZONTAL) + tweetsPerCallBox.Add(wx.StaticText(self, -1, _(u"Items on each API call")), 0, wx.ALL, 5) + self.itemsPerApiCall = wx.SpinCtrl(self, wx.ID_ANY) + self.itemsPerApiCall.SetRange(0, 200) + self.itemsPerApiCall.SetSize(self.itemsPerApiCall.GetBestSize()) + tweetsPerCallBox.Add(self.itemsPerApiCall, 0, wx.ALL, 5) + sizer.Add(tweetsPerCallBox, 0, wx.ALL, 5) + self.reverse_timelines = wx.CheckBox(self, wx.ID_ANY, _(u"Inverted buffers: The newest tweets will be shown at the beginning while the oldest at the end")) + sizer.Add(self.reverse_timelines, 0, wx.ALL, 5) + lbl = wx.StaticText(self, wx.ID_ANY, _(u"Retweet mode")) + self.retweet_mode = wx.ComboBox(self, wx.ID_ANY, choices=[_(u"Ask"), _(u"Retweet without comments"), _(u"Retweet with comments")], style=wx.CB_READONLY) + rMode = wx.BoxSizer(wx.HORIZONTAL) + rMode.Add(lbl, 0, wx.ALL, 5) + rMode.Add(self.retweet_mode, 0, wx.ALL, 5) + sizer.Add(rMode, 0, wx.ALL, 5) + self.show_screen_names = wx.CheckBox(self, wx.ID_ANY, _(U"Show screen names instead of full names")) + sizer.Add(self.show_screen_names, 0, wx.ALL, 5) + PersistSizeLabel = wx.StaticText(self, -1, _(u"Number of items per buffer to cache in database (0 to disable caching, blank for unlimited)")) + self.persist_size = wx.TextCtrl(self, -1) + sizer.Add(PersistSizeLabel, 0, wx.ALL, 5) + sizer.Add(self.persist_size, 0, wx.ALL, 5) + self.SetSizer(sizer) class reporting(wx.Panel, baseDialog.BaseWXDialog): - def __init__(self, parent): - super(reporting, self).__init__(parent) - sizer = wx.BoxSizer(wx.VERTICAL) - self.speech_reporting = wx.CheckBox(self, wx.ID_ANY, _(U"Enable automatic speech feedback")) - sizer.Add(self.speech_reporting, 0, wx.ALL, 5) - self.braille_reporting = wx.CheckBox(self, wx.ID_ANY, _(U"Enable automatic Braille feedback")) - sizer.Add(self.braille_reporting, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent): + super(reporting, self).__init__(parent) + sizer = wx.BoxSizer(wx.VERTICAL) + self.speech_reporting = wx.CheckBox(self, wx.ID_ANY, _(U"Enable automatic speech feedback")) + sizer.Add(self.speech_reporting, 0, wx.ALL, 5) + self.braille_reporting = wx.CheckBox(self, wx.ID_ANY, _(U"Enable automatic Braille feedback")) + sizer.Add(self.braille_reporting, 0, wx.ALL, 5) + self.SetSizer(sizer) class other_buffers(wx.Panel): - def __init__(self, parent): - super(other_buffers, self).__init__(parent) - sizer = wx.BoxSizer(wx.VERTICAL) - self.buffers = widgets.list(self, _(u"Buffer"), _(u"Name"), _(u"Status"), style=wx.LC_SINGLE_SEL|wx.LC_REPORT) - sizer.Add(self.buffers.list, 0, wx.ALL, 5) - btnSizer = wx.BoxSizer(wx.HORIZONTAL) - self.toggle_state = wx.Button(self, -1, _(u"Show/hide")) - self.up = wx.Button(self, -1, _(u"Move up")) - self.down = wx.Button(self, -1, _(u"Move down")) - btnSizer.Add(self.toggle_state, 0, wx.ALL, 5) - btnSizer.Add(self.up, 0, wx.ALL, 5) - btnSizer.Add(self.down, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent): + super(other_buffers, self).__init__(parent) + sizer = wx.BoxSizer(wx.VERTICAL) + self.buffers = widgets.list(self, _(u"Buffer"), _(u"Name"), _(u"Status"), style=wx.LC_SINGLE_SEL|wx.LC_REPORT) + sizer.Add(self.buffers.list, 0, wx.ALL, 5) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + self.toggle_state = wx.Button(self, -1, _(u"Show/hide")) + self.up = wx.Button(self, -1, _(u"Move up")) + self.down = wx.Button(self, -1, _(u"Move down")) + btnSizer.Add(self.toggle_state, 0, wx.ALL, 5) + btnSizer.Add(self.up, 0, wx.ALL, 5) + btnSizer.Add(self.down, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + self.SetSizer(sizer) - def insert_buffers(self, buffers): - for i in buffers: - if i[2] == True: - self.buffers.insert_item(False, *[i[0], i[1], _(u"Show")]) - else: - self.buffers.insert_item(False, *[i[0], i[1], _(u"Hide")]) + def insert_buffers(self, buffers): + for i in buffers: + if i[2] == True: + self.buffers.insert_item(False, *[i[0], i[1], _(u"Show")]) + else: + self.buffers.insert_item(False, *[i[0], i[1], _(u"Hide")]) - def connect_hook_func(self, func): - self.buffers.list.Bind(wx.EVT_CHAR_HOOK, func) + def connect_hook_func(self, func): + self.buffers.list.Bind(wx.EVT_CHAR_HOOK, func) - def move_up(self, *args, **kwargs): - current = self.buffers.get_selected() - if current == -1: - output.speak(_(u"Select a buffer first."), True) - return False - if self.buffers.get_text_column(current, 2) == _(u"Hide"): - output.speak(_(u"The buffer is hidden, show it first."), True) - return False - if current <= 0: - output.speak(_(u"The buffer is already at the top of the list."), True) - return False - current_text = self.buffers.get_text_column(self.buffers.get_selected(), 0) - current_name = self.buffers.get_text_column(self.buffers.get_selected(), 1) - current_text_state = self.buffers.get_text_column(self.buffers.get_selected(), 2) - text_above = self.buffers.get_text_column(self.buffers.get_selected()-1, 0) - name_above = self.buffers.get_text_column(self.buffers.get_selected()-1, 1) - text_above_state = self.buffers.get_text_column(self.buffers.get_selected()-1, 2) - self.buffers.set_text_column(self.buffers.get_selected()-1, 0, current_text) - self.buffers.set_text_column(self.buffers.get_selected()-1, 1, current_name) - self.buffers.set_text_column(self.buffers.get_selected()-1, 2, current_text_state) - self.buffers.set_text_column(self.buffers.get_selected(), 0, text_above) - self.buffers.set_text_column(self.buffers.get_selected(), 1, name_above) - self.buffers.set_text_column(self.buffers.get_selected(), 2, text_above_state) + def move_up(self, *args, **kwargs): + current = self.buffers.get_selected() + if current == -1: + output.speak(_(u"Select a buffer first."), True) + return False + if self.buffers.get_text_column(current, 2) == _(u"Hide"): + output.speak(_(u"The buffer is hidden, show it first."), True) + return False + if current <= 0: + output.speak(_(u"The buffer is already at the top of the list."), True) + return False + current_text = self.buffers.get_text_column(self.buffers.get_selected(), 0) + current_name = self.buffers.get_text_column(self.buffers.get_selected(), 1) + current_text_state = self.buffers.get_text_column(self.buffers.get_selected(), 2) + text_above = self.buffers.get_text_column(self.buffers.get_selected()-1, 0) + name_above = self.buffers.get_text_column(self.buffers.get_selected()-1, 1) + text_above_state = self.buffers.get_text_column(self.buffers.get_selected()-1, 2) + self.buffers.set_text_column(self.buffers.get_selected()-1, 0, current_text) + self.buffers.set_text_column(self.buffers.get_selected()-1, 1, current_name) + self.buffers.set_text_column(self.buffers.get_selected()-1, 2, current_text_state) + self.buffers.set_text_column(self.buffers.get_selected(), 0, text_above) + self.buffers.set_text_column(self.buffers.get_selected(), 1, name_above) + self.buffers.set_text_column(self.buffers.get_selected(), 2, text_above_state) - def move_down(self, *args, **kwargs): - current = self.buffers.get_selected() - if current == -1: - output.speak(_(u"Select a buffer first."), True) - return False - if self.buffers.get_text_column(current, 2) == _(u"Hide"): - output.speak(_(u"The buffer is hidden, show it first."), True) - return False - if current+1 >= self.buffers.get_count(): - output.speak(_(u"The buffer is already at the bottom of the list."), True) - return False - current_text = self.buffers.get_text_column(self.buffers.get_selected(), 0) - current_name = self.buffers.get_text_column(self.buffers.get_selected(), 1) - current_text_state = self.buffers.get_text_column(self.buffers.get_selected(), 2) - text_below = self.buffers.get_text_column(self.buffers.get_selected()+1, 0) - name_below = self.buffers.get_text_column(self.buffers.get_selected()+1, 1) - text_below_state = self.buffers.get_text_column(self.buffers.get_selected()+1, 2) - self.buffers.set_text_column(self.buffers.get_selected()+1, 0, current_text) - self.buffers.set_text_column(self.buffers.get_selected()+1, 1, current_name) - self.buffers.set_text_column(self.buffers.get_selected()+1, 2, current_text_state) - self.buffers.set_text_column(self.buffers.get_selected(), 0, text_below) - self.buffers.set_text_column(self.buffers.get_selected(), 1, name_below) - self.buffers.set_text_column(self.buffers.get_selected(), 2, text_below_state) + def move_down(self, *args, **kwargs): + current = self.buffers.get_selected() + if current == -1: + output.speak(_(u"Select a buffer first."), True) + return False + if self.buffers.get_text_column(current, 2) == _(u"Hide"): + output.speak(_(u"The buffer is hidden, show it first."), True) + return False + if current+1 >= self.buffers.get_count(): + output.speak(_(u"The buffer is already at the bottom of the list."), True) + return False + current_text = self.buffers.get_text_column(self.buffers.get_selected(), 0) + current_name = self.buffers.get_text_column(self.buffers.get_selected(), 1) + current_text_state = self.buffers.get_text_column(self.buffers.get_selected(), 2) + text_below = self.buffers.get_text_column(self.buffers.get_selected()+1, 0) + name_below = self.buffers.get_text_column(self.buffers.get_selected()+1, 1) + text_below_state = self.buffers.get_text_column(self.buffers.get_selected()+1, 2) + self.buffers.set_text_column(self.buffers.get_selected()+1, 0, current_text) + self.buffers.set_text_column(self.buffers.get_selected()+1, 1, current_name) + self.buffers.set_text_column(self.buffers.get_selected()+1, 2, current_text_state) + self.buffers.set_text_column(self.buffers.get_selected(), 0, text_below) + self.buffers.set_text_column(self.buffers.get_selected(), 1, name_below) + self.buffers.set_text_column(self.buffers.get_selected(), 2, text_below_state) - def get_event(self, ev): - if ev.GetKeyCode() == wx.WXK_SPACE: - return True - else: - ev.Skip() - return False + def get_event(self, ev): + if ev.GetKeyCode() == wx.WXK_SPACE: + return True + else: + ev.Skip() + return False - def change_selected_item(self): - current = self.buffers.get_selected() - text = self.buffers.get_text_column(current, 2) - if text == _(u"Show"): - self.buffers.set_text_column(current, 2, _(u"Hide")) - else: - self.buffers.set_text_column(current, 2, _(u"Show")) - output.speak(self.buffers.get_text_column(current, 2),True) - def get_list(self): - buffers_list = [] - for i in range(0, self.buffers.get_count()): - if self.buffers.get_text_column(i, 2) == _(u"Show"): - buffers_list.append(self.buffers.get_text_column(i, 0)) - return buffers_list + def change_selected_item(self): + current = self.buffers.get_selected() + text = self.buffers.get_text_column(current, 2) + if text == _(u"Show"): + self.buffers.set_text_column(current, 2, _(u"Hide")) + else: + self.buffers.set_text_column(current, 2, _(u"Show")) + output.speak(self.buffers.get_text_column(current, 2),True) + def get_list(self): + buffers_list = [] + for i in range(0, self.buffers.get_count()): + if self.buffers.get_text_column(i, 2) == _(u"Show"): + buffers_list.append(self.buffers.get_text_column(i, 0)) + return buffers_list class ignoredClients(wx.Panel): - def __init__(self, parent, choices): - super(ignoredClients, self).__init__(parent=parent) - sizer = wx.BoxSizer(wx.VERTICAL) - label = wx.StaticText(self, -1, _(u"Ignored clients")) - self.clients = wx.ListBox(self, -1, choices=choices) - self.clients.SetSize(self.clients.GetBestSize()) - clientsBox = wx.BoxSizer(wx.HORIZONTAL) - clientsBox.Add(label, 0, wx.ALL, 5) - clientsBox.Add(self.clients, 0, wx.ALL, 5) - self.add = wx.Button(self, -1, _(u"Add client")) - self.remove = wx.Button(self, -1, _(u"Remove client")) - btnBox = wx.BoxSizer(wx.HORIZONTAL) - btnBox.Add(self.add, 0, wx.ALL, 5) - btnBox.Add(self.remove, 0, wx.ALL, 5) - sizer.Add(clientsBox, 0, wx.ALL, 5) - sizer.Add(btnBox, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent, choices): + super(ignoredClients, self).__init__(parent=parent) + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(self, -1, _(u"Ignored clients")) + self.clients = wx.ListBox(self, -1, choices=choices) + self.clients.SetSize(self.clients.GetBestSize()) + clientsBox = wx.BoxSizer(wx.HORIZONTAL) + clientsBox.Add(label, 0, wx.ALL, 5) + clientsBox.Add(self.clients, 0, wx.ALL, 5) + self.add = wx.Button(self, -1, _(u"Add client")) + self.remove = wx.Button(self, -1, _(u"Remove client")) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(self.add, 0, wx.ALL, 5) + btnBox.Add(self.remove, 0, wx.ALL, 5) + sizer.Add(clientsBox, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + self.SetSizer(sizer) - def append(self, client): - self.clients.Append(client) + def append(self, client): + self.clients.Append(client) - def get_clients(self): - return self.clients.GetCount() + def get_clients(self): + return self.clients.GetCount() - def get_client_id(self): - return self.clients.GetSelection() + def get_client_id(self): + return self.clients.GetSelection() - def remove_(self, id): - self.clients.Delete(id) + def remove_(self, id): + self.clients.Delete(id) class sound(wx.Panel): - def __init__(self, parent, input_devices, output_devices, soundpacks): - wx.Panel.__init__(self, parent) - sizer = wx.BoxSizer(wx.VERTICAL) - volume = wx.StaticText(self, -1, _(u"Volume")) - self.volumeCtrl = wx.Slider(self) - # Connect a key handler here to handle volume slider being inverted when moving with up and down arrows. - # see https://github.com/manuelcortez/TWBlue/issues/261 - widgetUtils.connect_event(self.volumeCtrl, widgetUtils.KEYPRESS, self.on_keypress) - self.volumeCtrl.SetRange(0, 100) - self.volumeCtrl.SetSize(self.volumeCtrl.GetBestSize()) - volumeBox = wx.BoxSizer(wx.HORIZONTAL) - volumeBox.Add(volume, 0, wx.ALL, 5) - volumeBox.Add(self.volumeCtrl, 0, wx.ALL, 5) - sizer.Add(volumeBox, 0, wx.ALL, 5) - self.session_mute = wx.CheckBox(self, -1, _(u"Session mute")) - sizer.Add(self.session_mute, 0, wx.ALL, 5) - output_label = wx.StaticText(self, -1, _(u"Output device")) - self.output = wx.ComboBox(self, -1, choices=output_devices, style=wx.CB_READONLY) - self.output.SetSize(self.output.GetBestSize()) - outputBox = wx.BoxSizer(wx.HORIZONTAL) - outputBox.Add(output_label, 0, wx.ALL, 5) - outputBox.Add(self.output, 0, wx.ALL, 5) - sizer.Add(outputBox, 0, wx.ALL, 5) - input_label = wx.StaticText(self, -1, _(u"Input device")) - self.input = wx.ComboBox(self, -1, choices=input_devices, style=wx.CB_READONLY) - self.input.SetSize(self.input.GetBestSize()) - inputBox = wx.BoxSizer(wx.HORIZONTAL) - inputBox.Add(input_label, 0, wx.ALL, 5) - inputBox.Add(self.input, 0, wx.ALL, 5) - sizer.Add(inputBox, 0, wx.ALL, 5) - soundBox = wx.BoxSizer(wx.VERTICAL) - soundpack_label = wx.StaticText(self, -1, _(u"Sound pack")) - self.soundpack = wx.ComboBox(self, -1, choices=soundpacks, style=wx.CB_READONLY) - self.soundpack.SetSize(self.soundpack.GetBestSize()) - soundBox.Add(soundpack_label, 0, wx.ALL, 5) - soundBox.Add(self.soundpack, 0, wx.ALL, 5) - sizer.Add(soundBox, 0, wx.ALL, 5) - self.indicate_audio = wx.CheckBox(self, -1, _(u"Indicate audio tweets with sound")) - sizer.Add(self.indicate_audio, 0, wx.ALL, 5) - self.indicate_geo = wx.CheckBox(self, -1, _(u"Indicate geotweets with sound")) - sizer.Add(self.indicate_geo, 0, wx.ALL, 5) - self.indicate_img = wx.CheckBox(self, -1, _(u"Indicate tweets containing images with sound")) - sizer.Add(self.indicate_img, 0, wx.ALL, 5) - self.SetSizer(sizer) + def __init__(self, parent, input_devices, output_devices, soundpacks): + wx.Panel.__init__(self, parent) + sizer = wx.BoxSizer(wx.VERTICAL) + volume = wx.StaticText(self, -1, _(u"Volume")) + self.volumeCtrl = wx.Slider(self) + # Connect a key handler here to handle volume slider being inverted when moving with up and down arrows. + # see https://github.com/manuelcortez/TWBlue/issues/261 + widgetUtils.connect_event(self.volumeCtrl, widgetUtils.KEYPRESS, self.on_keypress) + self.volumeCtrl.SetRange(0, 100) + self.volumeCtrl.SetSize(self.volumeCtrl.GetBestSize()) + volumeBox = wx.BoxSizer(wx.HORIZONTAL) + volumeBox.Add(volume, 0, wx.ALL, 5) + volumeBox.Add(self.volumeCtrl, 0, wx.ALL, 5) + sizer.Add(volumeBox, 0, wx.ALL, 5) + self.session_mute = wx.CheckBox(self, -1, _(u"Session mute")) + sizer.Add(self.session_mute, 0, wx.ALL, 5) + output_label = wx.StaticText(self, -1, _(u"Output device")) + self.output = wx.ComboBox(self, -1, choices=output_devices, style=wx.CB_READONLY) + self.output.SetSize(self.output.GetBestSize()) + outputBox = wx.BoxSizer(wx.HORIZONTAL) + outputBox.Add(output_label, 0, wx.ALL, 5) + outputBox.Add(self.output, 0, wx.ALL, 5) + sizer.Add(outputBox, 0, wx.ALL, 5) + input_label = wx.StaticText(self, -1, _(u"Input device")) + self.input = wx.ComboBox(self, -1, choices=input_devices, style=wx.CB_READONLY) + self.input.SetSize(self.input.GetBestSize()) + inputBox = wx.BoxSizer(wx.HORIZONTAL) + inputBox.Add(input_label, 0, wx.ALL, 5) + inputBox.Add(self.input, 0, wx.ALL, 5) + sizer.Add(inputBox, 0, wx.ALL, 5) + soundBox = wx.BoxSizer(wx.VERTICAL) + soundpack_label = wx.StaticText(self, -1, _(u"Sound pack")) + self.soundpack = wx.ComboBox(self, -1, choices=soundpacks, style=wx.CB_READONLY) + self.soundpack.SetSize(self.soundpack.GetBestSize()) + soundBox.Add(soundpack_label, 0, wx.ALL, 5) + soundBox.Add(self.soundpack, 0, wx.ALL, 5) + sizer.Add(soundBox, 0, wx.ALL, 5) + self.indicate_audio = wx.CheckBox(self, -1, _(u"Indicate audio tweets with sound")) + sizer.Add(self.indicate_audio, 0, wx.ALL, 5) + self.indicate_geo = wx.CheckBox(self, -1, _(u"Indicate geotweets with sound")) + sizer.Add(self.indicate_geo, 0, wx.ALL, 5) + self.indicate_img = wx.CheckBox(self, -1, _(u"Indicate tweets containing images with sound")) + sizer.Add(self.indicate_img, 0, wx.ALL, 5) + self.SetSizer(sizer) - def on_keypress(self, event, *args, **kwargs): - """ Invert movement of up and down arrow keys when dealing with a wX Slider. - See https://github.com/manuelcortez/TWBlue/issues/261 - and http://trac.wxwidgets.org/ticket/2068 - """ - keycode = event.GetKeyCode() - if keycode == wx.WXK_UP: - return self.volumeCtrl.SetValue(self.volumeCtrl.GetValue()+1) - elif keycode == wx.WXK_DOWN: - return self.volumeCtrl.SetValue(self.volumeCtrl.GetValue()-1) - event.Skip() + def on_keypress(self, event, *args, **kwargs): + """ Invert movement of up and down arrow keys when dealing with a wX Slider. + See https://github.com/manuelcortez/TWBlue/issues/261 + and http://trac.wxwidgets.org/ticket/2068 + """ + keycode = event.GetKeyCode() + if keycode == wx.WXK_UP: + return self.volumeCtrl.SetValue(self.volumeCtrl.GetValue()+1) + elif keycode == wx.WXK_DOWN: + return self.volumeCtrl.SetValue(self.volumeCtrl.GetValue()-1) + event.Skip() - def get(self, control): - return getattr(self, control).GetStringSelection() + def get(self, control): + return getattr(self, control).GetStringSelection() class extrasPanel(wx.Panel): - def __init__(self, parent, ocr_languages=[], translation_languages=[]): - super(extrasPanel, self).__init__(parent) - mainSizer = wx.BoxSizer(wx.VERTICAL) - OCRBox = wx.StaticBox(self, label=_(u"Language for OCR")) - self.ocr_lang = wx.ListBox(self, -1, choices=ocr_languages) - self.ocr_lang.SetSize(self.ocr_lang.GetBestSize()) - ocrLanguageSizer = wx.StaticBoxSizer(OCRBox, wx.HORIZONTAL) - ocrLanguageSizer.Add(self.ocr_lang, 0, wx.ALL, 5) - mainSizer.Add(ocrLanguageSizer, 0, wx.ALL, 5) - lbl = wx.StaticText(self, wx.ID_ANY, _(u"API Key for SndUp")) - self.sndup_apiKey = wx.TextCtrl(self, -1) - sndupBox = wx.BoxSizer(wx.HORIZONTAL) - sndupBox.Add(lbl, 0, wx.ALL, 5) - sndupBox.Add(self.sndup_apiKey, 0, wx.ALL, 5) - mainSizer.Add(sndupBox, 0, wx.ALL, 5) - self.SetSizer(mainSizer) + def __init__(self, parent, ocr_languages=[], translation_languages=[]): + super(extrasPanel, self).__init__(parent) + mainSizer = wx.BoxSizer(wx.VERTICAL) + OCRBox = wx.StaticBox(self, label=_(u"Language for OCR")) + self.ocr_lang = wx.ListBox(self, -1, choices=ocr_languages) + self.ocr_lang.SetSize(self.ocr_lang.GetBestSize()) + ocrLanguageSizer = wx.StaticBoxSizer(OCRBox, wx.HORIZONTAL) + ocrLanguageSizer.Add(self.ocr_lang, 0, wx.ALL, 5) + mainSizer.Add(ocrLanguageSizer, 0, wx.ALL, 5) + lbl = wx.StaticText(self, wx.ID_ANY, _(u"API Key for SndUp")) + self.sndup_apiKey = wx.TextCtrl(self, -1) + sndupBox = wx.BoxSizer(wx.HORIZONTAL) + sndupBox.Add(lbl, 0, wx.ALL, 5) + sndupBox.Add(self.sndup_apiKey, 0, wx.ALL, 5) + mainSizer.Add(sndupBox, 0, wx.ALL, 5) + self.SetSizer(mainSizer) class configurationDialog(baseDialog.BaseWXDialog): - def set_title(self, title): - self.SetTitle(title) + def set_title(self, title): + self.SetTitle(title) - def __init__(self): - super(configurationDialog, self).__init__(None, -1) - self.panel = wx.Panel(self) - self.SetTitle(_(u"{0} preferences").format(application.name,)) - self.sizer = wx.BoxSizer(wx.VERTICAL) - self.notebook = wx.Notebook(self.panel) + def __init__(self): + super(configurationDialog, self).__init__(None, -1) + self.panel = wx.Panel(self) + self.SetTitle(_(u"{0} preferences").format(application.name,)) + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.notebook = wx.Notebook(self.panel) - def create_general(self, languageList,keymaps): - self.general = general(self.notebook, languageList,keymaps) - self.notebook.AddPage(self.general, _(u"General")) - self.general.SetFocus() + def create_general(self, languageList,keymaps): + self.general = general(self.notebook, languageList,keymaps) + self.notebook.AddPage(self.general, _(u"General")) + self.general.SetFocus() - def create_proxy(self, proxyTypes): - self.proxy = proxy(self.notebook, proxyTypes) - self.notebook.AddPage(self.proxy, _(u"Proxy")) + def create_proxy(self, proxyTypes): + self.proxy = proxy(self.notebook, proxyTypes) + self.notebook.AddPage(self.proxy, _(u"Proxy")) - def create_general_account(self): - self.general = generalAccount(self.notebook) - self.notebook.AddPage(self.general, _(u"General")) - self.general.SetFocus() + def create_general_account(self): + self.general = generalAccount(self.notebook) + self.notebook.AddPage(self.general, _(u"General")) + self.general.SetFocus() - def create_reporting(self): - self.reporting = reporting(self.notebook) - self.notebook.AddPage(self.reporting, _(u"Feedback")) + def create_reporting(self): + self.reporting = reporting(self.notebook) + self.notebook.AddPage(self.reporting, _(u"Feedback")) - def create_other_buffers(self): - self.buffers = other_buffers(self.notebook) - self.notebook.AddPage(self.buffers, _(u"Buffers")) + def create_other_buffers(self): + self.buffers = other_buffers(self.notebook) + self.notebook.AddPage(self.buffers, _(u"Buffers")) - def create_ignored_clients(self, ignored_clients_list): - self.ignored_clients = ignoredClients(self.notebook, ignored_clients_list) - self.notebook.AddPage(self.ignored_clients, _(u"Ignored clients")) + def create_ignored_clients(self, ignored_clients_list): + self.ignored_clients = ignoredClients(self.notebook, ignored_clients_list) + self.notebook.AddPage(self.ignored_clients, _(u"Ignored clients")) - def create_sound(self, output_devices, input_devices, soundpacks): - self.sound = sound(self.notebook, output_devices, input_devices, soundpacks) - self.notebook.AddPage(self.sound, _(u"Sound")) + def create_sound(self, output_devices, input_devices, soundpacks): + self.sound = sound(self.notebook, output_devices, input_devices, soundpacks) + self.notebook.AddPage(self.sound, _(u"Sound")) - def create_extras(self, ocr_languages=[], translator_languages=[]): - self.extras = extrasPanel(self.notebook, ocr_languages, translator_languages) - self.notebook.AddPage(self.extras, _(u"Extras")) + def create_extras(self, ocr_languages=[], translator_languages=[]): + self.extras = extrasPanel(self.notebook, ocr_languages, translator_languages) + self.notebook.AddPage(self.extras, _(u"Extras")) - def realize(self): - self.sizer.Add(self.notebook, 0, wx.ALL, 5) - ok_cancel_box = wx.BoxSizer(wx.HORIZONTAL) - ok = wx.Button(self.panel, wx.ID_OK, _(u"Save")) - ok.SetDefault() - cancel = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close")) - self.SetEscapeId(cancel.GetId()) - ok_cancel_box.Add(ok, 0, wx.ALL, 5) - ok_cancel_box.Add(cancel, 0, wx.ALL, 5) - self.sizer.Add(ok_cancel_box, 0, wx.ALL, 5) - self.panel.SetSizer(self.sizer) - self.SetClientSize(self.sizer.CalcMin()) + def realize(self): + self.sizer.Add(self.notebook, 0, wx.ALL, 5) + ok_cancel_box = wx.BoxSizer(wx.HORIZONTAL) + ok = wx.Button(self.panel, wx.ID_OK, _(u"Save")) + ok.SetDefault() + cancel = wx.Button(self.panel, wx.ID_CANCEL, _(u"Close")) + self.SetEscapeId(cancel.GetId()) + ok_cancel_box.Add(ok, 0, wx.ALL, 5) + ok_cancel_box.Add(cancel, 0, wx.ALL, 5) + self.sizer.Add(ok_cancel_box, 0, wx.ALL, 5) + self.panel.SetSizer(self.sizer) + self.SetClientSize(self.sizer.CalcMin()) - def get_value(self, panel, key): - p = getattr(self, panel) - return getattr(p, key).GetValue() + def get_value(self, panel, key): + p = getattr(self, panel) + return getattr(p, key).GetValue() - def set_value(self, panel, key, value): - p = getattr(self, panel) - control = getattr(p, key) - getattr(control, "SetValue")(value) + def set_value(self, panel, key, value): + p = getattr(self, panel) + control = getattr(p, key) + getattr(control, "SetValue")(value) diff --git a/src/wxUI/dialogs/filterDialogs.py b/src/wxUI/dialogs/filterDialogs.py index edff9d6a..bf7f45b2 100644 --- a/src/wxUI/dialogs/filterDialogs.py +++ b/src/wxUI/dialogs/filterDialogs.py @@ -8,139 +8,139 @@ import widgetUtils from multiplatform_widgets import widgets class filterDialog(baseDialog.BaseWXDialog): - def __init__(self, value="", languages=[]): - super(filterDialog, self).__init__(None, -1) - self.langs_list = languages - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.SetTitle(_(u"Create a filter for this buffer")) - label = wx.StaticText(panel, wx.ID_ANY, _(u"Filter title")) - self.title = wx.TextCtrl(panel, -1, value) - dc = wx.WindowDC(self.title) - dc.SetFont(self.title.GetFont()) - self.title.SetSize(dc.GetTextExtent("0"*40)) - tsizer = wx.BoxSizer(wx.HORIZONTAL) - tsizer.Add(label, 0, wx.ALL, 5) - tsizer.Add(self.title, 0, wx.ALL, 5) - sizer.Add(tsizer, 0, wx.ALL, 5) - staticbox = wx.StaticBox(panel, label=_(u"Filter by word")) - self.contains = wx.RadioButton(panel, -1, _(u"Ignore tweets wich contain the following word"), style=wx.RB_GROUP) - self.doesnt_contain = wx.RadioButton(panel, -1, _(u"Ignore tweets without the following word")) - radioSizer1 = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) - radioSizer1.Add(self.contains, 0, wx.ALL, 5) - radioSizer1.Add(self.doesnt_contain, 0, wx.ALL, 5) - sizer.Add(radioSizer1, 0, wx.ALL, 5) - label = wx.StaticText(panel, -1, _(u"word")) - self.term = wx.TextCtrl(panel, -1, value) - dc = wx.WindowDC(self.term) - dc.SetFont(self.term.GetFont()) - self.term.SetSize(dc.GetTextExtent("0"*40)) - self.allow_rts = wx.CheckBox(panel, wx.ID_ANY, _(u"Allow retweets")) - self.allow_quotes = wx.CheckBox(panel, wx.ID_ANY, _(u"Allow quoted tweets")) - self.allow_replies = wx.CheckBox(panel, wx.ID_ANY, _(u"Allow replies")) - self.allow_rts.SetValue(True) - self.allow_quotes.SetValue(True) - self.allow_replies.SetValue(True) - bsizer = wx.BoxSizer(wx.HORIZONTAL) - bsizer.Add(label, 0, wx.ALL, 5) - bsizer.Add(self.term, 0, wx.ALL, 5) - sizer.Add(bsizer, 0, wx.ALL, 5) - self.regexp = wx.CheckBox(panel, wx.ID_ANY, _(u"Use this term as a regular expression")) - sizer.Add(self.regexp, 0, wx.ALL, 5) - staticbox = wx.StaticBox(panel, label=_(u"Filter by language")) - self.load_language = wx.RadioButton(panel, -1, _(u"Load tweets in the following languages"), style=wx.RB_GROUP) - self.ignore_language = wx.RadioButton(panel, -1, _(u"Ignore tweets in the following languages")) - self.skip_language_filtering = wx.RadioButton(panel, -1, _(u"Don't filter by language")) - self.skip_language_filtering.SetValue(True) - widgetUtils.connect_event(self.load_language, widgetUtils.RADIOBUTTON, self.show_language_options) - widgetUtils.connect_event(self.ignore_language, widgetUtils.RADIOBUTTON, self.show_language_options) - widgetUtils.connect_event(self.skip_language_filtering, widgetUtils.RADIOBUTTON, self.hide_language_options) - radioSizer2 = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) - radioSizer2.Add(self.load_language, 0, wx.ALL, 5) - radioSizer2.Add(self.ignore_language, 0, wx.ALL, 5) - radioSizer2.Add(self.skip_language_filtering, 0, wx.ALL, 5) - sizer.Add(radioSizer2, 0, wx.ALL, 5) - self.indexes = [] - langsLabel = wx.StaticText(panel, -1, _(u"Supported languages")) - self.cb = wx.ComboBox(panel, -1, choices=languages, value=languages[0]) - langsSizer = wx.BoxSizer() - langsSizer.Add(langsLabel, 0, wx.ALL, 5) - langsSizer.Add(self.cb, 0, wx.ALL, 5) - self.add = wx.Button(panel, wx.ID_ANY, _(u"Add selected language to filter")) - self.add.Bind(wx.EVT_BUTTON, self.add_lang) - langsSizer.Add(self.add, 0, wx.ALL, 5) - sizer.Add(langsSizer, 0, wx.ALL, 5) - lbl = wx.StaticText(panel, wx.ID_ANY, _(u"Selected languages")) - self.langs = wx.ListBox(panel, -1) - self.remove = wx.Button(panel, wx.ID_ANY, _(u"Remove")) - self.remove.Bind(wx.EVT_BUTTON, self.remove_lang) - selectionSizer = wx.BoxSizer(wx.HORIZONTAL) - selectionSizer.Add(lbl, 0, wx.ALL, 5) - selectionSizer.Add(self.langs, 0, wx.ALL, 5) - selectionSizer.Add(self.remove, 0, wx.ALL, 5) - sizer.Add(selectionSizer, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK, _(u"OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok, 0, wx.ALL, 5) - btnsizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.hide_language_options() - self.SetClientSize(sizer.CalcMin()) + def __init__(self, value="", languages=[]): + super(filterDialog, self).__init__(None, -1) + self.langs_list = languages + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(_(u"Create a filter for this buffer")) + label = wx.StaticText(panel, wx.ID_ANY, _(u"Filter title")) + self.title = wx.TextCtrl(panel, -1, value) + dc = wx.WindowDC(self.title) + dc.SetFont(self.title.GetFont()) + self.title.SetSize(dc.GetTextExtent("0"*40)) + tsizer = wx.BoxSizer(wx.HORIZONTAL) + tsizer.Add(label, 0, wx.ALL, 5) + tsizer.Add(self.title, 0, wx.ALL, 5) + sizer.Add(tsizer, 0, wx.ALL, 5) + staticbox = wx.StaticBox(panel, label=_(u"Filter by word")) + self.contains = wx.RadioButton(panel, -1, _(u"Ignore tweets wich contain the following word"), style=wx.RB_GROUP) + self.doesnt_contain = wx.RadioButton(panel, -1, _(u"Ignore tweets without the following word")) + radioSizer1 = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) + radioSizer1.Add(self.contains, 0, wx.ALL, 5) + radioSizer1.Add(self.doesnt_contain, 0, wx.ALL, 5) + sizer.Add(radioSizer1, 0, wx.ALL, 5) + label = wx.StaticText(panel, -1, _(u"word")) + self.term = wx.TextCtrl(panel, -1, value) + dc = wx.WindowDC(self.term) + dc.SetFont(self.term.GetFont()) + self.term.SetSize(dc.GetTextExtent("0"*40)) + self.allow_rts = wx.CheckBox(panel, wx.ID_ANY, _(u"Allow retweets")) + self.allow_quotes = wx.CheckBox(panel, wx.ID_ANY, _(u"Allow quoted tweets")) + self.allow_replies = wx.CheckBox(panel, wx.ID_ANY, _(u"Allow replies")) + self.allow_rts.SetValue(True) + self.allow_quotes.SetValue(True) + self.allow_replies.SetValue(True) + bsizer = wx.BoxSizer(wx.HORIZONTAL) + bsizer.Add(label, 0, wx.ALL, 5) + bsizer.Add(self.term, 0, wx.ALL, 5) + sizer.Add(bsizer, 0, wx.ALL, 5) + self.regexp = wx.CheckBox(panel, wx.ID_ANY, _(u"Use this term as a regular expression")) + sizer.Add(self.regexp, 0, wx.ALL, 5) + staticbox = wx.StaticBox(panel, label=_(u"Filter by language")) + self.load_language = wx.RadioButton(panel, -1, _(u"Load tweets in the following languages"), style=wx.RB_GROUP) + self.ignore_language = wx.RadioButton(panel, -1, _(u"Ignore tweets in the following languages")) + self.skip_language_filtering = wx.RadioButton(panel, -1, _(u"Don't filter by language")) + self.skip_language_filtering.SetValue(True) + widgetUtils.connect_event(self.load_language, widgetUtils.RADIOBUTTON, self.show_language_options) + widgetUtils.connect_event(self.ignore_language, widgetUtils.RADIOBUTTON, self.show_language_options) + widgetUtils.connect_event(self.skip_language_filtering, widgetUtils.RADIOBUTTON, self.hide_language_options) + radioSizer2 = wx.StaticBoxSizer(staticbox, wx.HORIZONTAL) + radioSizer2.Add(self.load_language, 0, wx.ALL, 5) + radioSizer2.Add(self.ignore_language, 0, wx.ALL, 5) + radioSizer2.Add(self.skip_language_filtering, 0, wx.ALL, 5) + sizer.Add(radioSizer2, 0, wx.ALL, 5) + self.indexes = [] + langsLabel = wx.StaticText(panel, -1, _(u"Supported languages")) + self.cb = wx.ComboBox(panel, -1, choices=languages, value=languages[0]) + langsSizer = wx.BoxSizer() + langsSizer.Add(langsLabel, 0, wx.ALL, 5) + langsSizer.Add(self.cb, 0, wx.ALL, 5) + self.add = wx.Button(panel, wx.ID_ANY, _(u"Add selected language to filter")) + self.add.Bind(wx.EVT_BUTTON, self.add_lang) + langsSizer.Add(self.add, 0, wx.ALL, 5) + sizer.Add(langsSizer, 0, wx.ALL, 5) + lbl = wx.StaticText(panel, wx.ID_ANY, _(u"Selected languages")) + self.langs = wx.ListBox(panel, -1) + self.remove = wx.Button(panel, wx.ID_ANY, _(u"Remove")) + self.remove.Bind(wx.EVT_BUTTON, self.remove_lang) + selectionSizer = wx.BoxSizer(wx.HORIZONTAL) + selectionSizer.Add(lbl, 0, wx.ALL, 5) + selectionSizer.Add(self.langs, 0, wx.ALL, 5) + selectionSizer.Add(self.remove, 0, wx.ALL, 5) + sizer.Add(selectionSizer, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.hide_language_options() + self.SetClientSize(sizer.CalcMin()) - def get_lang(self): - return self.cb.GetValue() + def get_lang(self): + return self.cb.GetValue() - def add_lang(self, *args, **kwargs): - selection = self.get_lang() - if selection in self.langs_list: - self.langs.Append(selection) - self.indexes.append(selection) + def add_lang(self, *args, **kwargs): + selection = self.get_lang() + if selection in self.langs_list: + self.langs.Append(selection) + self.indexes.append(selection) - def remove_lang(self, *args, **kwargs): - n = self.langs.GetSelection() - v = self.langs.GetStringSelection() - self.langs.Delete(n) - self.indexes.remove(v) + def remove_lang(self, *args, **kwargs): + n = self.langs.GetSelection() + v = self.langs.GetStringSelection() + self.langs.Delete(n) + self.indexes.remove(v) - def get_selected_langs(self): - return self.indexes + def get_selected_langs(self): + return self.indexes - def hide_language_options(self, *args, **kwargs): - for i in [self.cb, self.add, self.langs, self.remove]: - i.Hide() + def hide_language_options(self, *args, **kwargs): + for i in [self.cb, self.add, self.langs, self.remove]: + i.Hide() - def show_language_options(self, *args, **kwargs): - for i in [self.cb, self.add, self.langs, self.remove]: - i.Show() + def show_language_options(self, *args, **kwargs): + for i in [self.cb, self.add, self.langs, self.remove]: + i.Show() class filterManagerDialog(widgetUtils.BaseDialog): - def __init__(self, *args, **kwargs): - super(filterManagerDialog, self).__init__(parent=None, *args, **kwargs) - self.SetTitle(_(u"Manage filters")) - panel = wx.Panel(self) - label = wx.StaticText(panel, -1, _(u"Filters")) - self.filters = widgets.list(panel, _(u"Filter"), _(u"Buffer"), _(u"Filter by word"), _(u"Filter by language"), size=(800, 800), style=wx.LC_REPORT|wx.LC_SINGLE_SEL) - self.filters.list.SetFocus() - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(label) - sizer.Add(self.filters.list) - self.edit = wx.Button(panel, wx.ID_ANY, _(u"Edit")) - self.edit.Enable(False) - self.delete = wx.Button(panel, wx.ID_ANY, _(u"Remove")) - self.cancel = wx.Button(panel, wx.ID_CANCEL) - btnSizer = wx.BoxSizer() - btnSizer.Add(self.edit, 0, wx.ALL, 5) - btnSizer.Add(self.delete, 0, wx.ALL, 5) - btnSizer.Add(self.cancel, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) + def __init__(self, *args, **kwargs): + super(filterManagerDialog, self).__init__(parent=None, *args, **kwargs) + self.SetTitle(_(u"Manage filters")) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Filters")) + self.filters = widgets.list(panel, _(u"Filter"), _(u"Buffer"), _(u"Filter by word"), _(u"Filter by language"), size=(800, 800), style=wx.LC_REPORT|wx.LC_SINGLE_SEL) + self.filters.list.SetFocus() + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(label) + sizer.Add(self.filters.list) + self.edit = wx.Button(panel, wx.ID_ANY, _(u"Edit")) + self.edit.Enable(False) + self.delete = wx.Button(panel, wx.ID_ANY, _(u"Remove")) + self.cancel = wx.Button(panel, wx.ID_CANCEL) + btnSizer = wx.BoxSizer() + btnSizer.Add(self.edit, 0, wx.ALL, 5) + btnSizer.Add(self.delete, 0, wx.ALL, 5) + btnSizer.Add(self.cancel, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) - def get_item(self): - return self.filters.get_selected() + def get_item(self): + return self.filters.get_selected() - def clear(self): - self.filters.clear() + def clear(self): + self.filters.clear() diff --git a/src/wxUI/dialogs/find.py b/src/wxUI/dialogs/find.py index 73a3dd6f..c6176fc4 100644 --- a/src/wxUI/dialogs/find.py +++ b/src/wxUI/dialogs/find.py @@ -6,24 +6,24 @@ from . import baseDialog import wx class findDialog(baseDialog.BaseWXDialog): - def __init__(self, value=""): - super(findDialog, self).__init__(None, -1) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.SetTitle(_(u"Find in current buffer")) - label = wx.StaticText(panel, -1, _(u"String")) - self.string = wx.TextCtrl(panel, -1, value) - dc = wx.WindowDC(self.string) - dc.SetFont(self.string.GetFont()) - self.string.SetSize(dc.GetTextExtent("0"*40)) - sizer.Add(label, 0, wx.ALL, 5) - sizer.Add(self.string, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK, _(u"OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok, 0, wx.ALL, 5) - btnsizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) \ No newline at end of file + def __init__(self, value=""): + super(findDialog, self).__init__(None, -1) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(_(u"Find in current buffer")) + label = wx.StaticText(panel, -1, _(u"String")) + self.string = wx.TextCtrl(panel, -1, value) + dc = wx.WindowDC(self.string) + dc.SetFont(self.string.GetFont()) + self.string.SetSize(dc.GetTextExtent("0"*40)) + sizer.Add(label, 0, wx.ALL, 5) + sizer.Add(self.string, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Cancel")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) diff --git a/src/wxUI/dialogs/lists.py b/src/wxUI/dialogs/lists.py index 9a30a4a3..cc8c3485 100644 --- a/src/wxUI/dialogs/lists.py +++ b/src/wxUI/dialogs/lists.py @@ -6,145 +6,145 @@ from multiplatform_widgets import widgets class listViewer(widgetUtils.BaseDialog): - def __init__(self, *args, **kwargs): - super(listViewer, self).__init__(parent=None, *args, **kwargs) - self.SetTitle(_(u"Lists manager")) - panel = wx.Panel(self) - label = wx.StaticText(panel, -1, _(u"Lists")) - self.lista = widgets.list(panel, _(u"List"), _(u"Description"), _(u"Owner"), _(u"Members"), _(u"mode"), size=(800, 800), style=wx.LC_REPORT|wx.LC_SINGLE_SEL) - self.lista.list.SetFocus() - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(label) - sizer.Add(self.lista.list) - self.createBtn = wx.Button(panel, wx.ID_ANY, _(u"Create a new list")) - self.editBtn = wx.Button(panel, -1, _(u"Edit")) - self.deleteBtn = wx.Button(panel, -1, _(u"Remove")) - self.view = wx.Button(panel, -1, _(u"Open in buffer")) + def __init__(self, *args, **kwargs): + super(listViewer, self).__init__(parent=None, *args, **kwargs) + self.SetTitle(_(u"Lists manager")) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Lists")) + self.lista = widgets.list(panel, _(u"List"), _(u"Description"), _(u"Owner"), _(u"Members"), _(u"mode"), size=(800, 800), style=wx.LC_REPORT|wx.LC_SINGLE_SEL) + self.lista.list.SetFocus() + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(label) + sizer.Add(self.lista.list) + self.createBtn = wx.Button(panel, wx.ID_ANY, _(u"Create a new list")) + self.editBtn = wx.Button(panel, -1, _(u"Edit")) + self.deleteBtn = wx.Button(panel, -1, _(u"Remove")) + self.view = wx.Button(panel, -1, _(u"Open in buffer")) # self.members = wx.Button(panel, -1, _(u"View members")) # self.members.Disable() # self.subscriptors = wx.Button(panel, -1, _(u"View subscribers")) # self.subscriptors.Disable() # self.get_linkBtn = wx.Button(panel, -1, _(u"Get link for the list")) # self.get_linkBtn.Bind(wx.EVT_BUTTON, self.onGetLink) - self.cancelBtn = wx.Button(panel, wx.ID_CANCEL) - btnSizer = wx.BoxSizer() - btnSizer.Add(self.createBtn) - btnSizer.Add(self.editBtn) - btnSizer.Add(self.cancelBtn) - panel.SetSizer(sizer) + self.cancelBtn = wx.Button(panel, wx.ID_CANCEL) + btnSizer = wx.BoxSizer() + btnSizer.Add(self.createBtn) + btnSizer.Add(self.editBtn) + btnSizer.Add(self.cancelBtn) + panel.SetSizer(sizer) - def populate_list(self, lists, clear=False): - if clear == True: - self.clear() - for item in lists: - self.lista.insert_item(False, *item) + def populate_list(self, lists, clear=False): + if clear == True: + self.clear() + for item in lists: + self.lista.insert_item(False, *item) - def get_item(self): - return self.lista.get_selected() + def get_item(self): + return self.lista.get_selected() - def clear(self): - self.lista.clear() + def clear(self): + self.lista.clear() class userListViewer(listViewer): - def __init__(self, username, *args, **kwargs): - self.username = username - super(userListViewer, self).__init__(*args, **kwargs) - self.SetTitle(_(u"Viewing lists for %s") % (self.username)) - self.createBtn.SetLabel(_(u"Subscribe")) - self.deleteBtn.SetLabel(_(u"Unsubscribe")) - self.editBtn.Disable() - self.view.Disable() + def __init__(self, username, *args, **kwargs): + self.username = username + super(userListViewer, self).__init__(*args, **kwargs) + self.SetTitle(_(u"Viewing lists for %s") % (self.username)) + self.createBtn.SetLabel(_(u"Subscribe")) + self.deleteBtn.SetLabel(_(u"Unsubscribe")) + self.editBtn.Disable() + self.view.Disable() class createListDialog(widgetUtils.BaseDialog): - def __init__(self, *args, **kwargs): - super(createListDialog, self).__init__(parent=None, *args, **kwargs) - self.SetTitle(_(u"Create a new list")) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - name = wx.StaticText(panel, -1, _(u"Name (20 characters maximun)")) - self.name = wx.TextCtrl(panel, -1) - nameSizer = wx.BoxSizer(wx.HORIZONTAL) - nameSizer.Add(name) - nameSizer.Add(self.name) - description = wx.StaticText(panel, -1, _(u"Description")) - self.description = wx.TextCtrl(panel, -1) - descriptionSizer = wx.BoxSizer(wx.HORIZONTAL) - descriptionSizer.Add(description) - descriptionSizer.Add(self.description) - mode = wx.StaticText(panel, -1, _(u"Mode")) - self.public = wx.RadioButton(panel, -1, _(u"Public"), style=wx.RB_GROUP) - self.private = wx.RadioButton(panel, -1, _(u"Private")) - modeBox = wx.BoxSizer(wx.HORIZONTAL) - modeBox.Add(mode) - modeBox.Add(self.public) - modeBox.Add(self.private) - ok = wx.Button(panel, wx.ID_OK) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL) - btnBox = wx.BoxSizer(wx.HORIZONTAL) - btnBox.Add(ok) - btnBox.Add(cancel) - sizer.Add(nameSizer) - sizer.Add(descriptionSizer) - sizer.Add(modeBox) - sizer.Add(btnBox) + def __init__(self, *args, **kwargs): + super(createListDialog, self).__init__(parent=None, *args, **kwargs) + self.SetTitle(_(u"Create a new list")) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + name = wx.StaticText(panel, -1, _(u"Name (20 characters maximun)")) + self.name = wx.TextCtrl(panel, -1) + nameSizer = wx.BoxSizer(wx.HORIZONTAL) + nameSizer.Add(name) + nameSizer.Add(self.name) + description = wx.StaticText(panel, -1, _(u"Description")) + self.description = wx.TextCtrl(panel, -1) + descriptionSizer = wx.BoxSizer(wx.HORIZONTAL) + descriptionSizer.Add(description) + descriptionSizer.Add(self.description) + mode = wx.StaticText(panel, -1, _(u"Mode")) + self.public = wx.RadioButton(panel, -1, _(u"Public"), style=wx.RB_GROUP) + self.private = wx.RadioButton(panel, -1, _(u"Private")) + modeBox = wx.BoxSizer(wx.HORIZONTAL) + modeBox.Add(mode) + modeBox.Add(self.public) + modeBox.Add(self.private) + ok = wx.Button(panel, wx.ID_OK) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(ok) + btnBox.Add(cancel) + sizer.Add(nameSizer) + sizer.Add(descriptionSizer) + sizer.Add(modeBox) + sizer.Add(btnBox) class editListDialog(createListDialog): - def __init__(self, list, *args, **kwargs): - super(editListDialog, self).__init__(*args, **kwargs) - self.SetTitle(_(u"Editing the list %s") % (list.name)) - self.name.ChangeValue(list.name) - self.description.ChangeValue(list.description) - if list.mode == "public": - self.public.SetValue(True) - else: - self.private.SetValue(True) + def __init__(self, list, *args, **kwargs): + super(editListDialog, self).__init__(*args, **kwargs) + self.SetTitle(_(u"Editing the list %s") % (list.name)) + self.name.ChangeValue(list.name) + self.description.ChangeValue(list.description) + if list.mode == "public": + self.public.SetValue(True) + else: + self.private.SetValue(True) class addUserListDialog(listViewer): - def __init__(self, *args, **kwargs): - super(addUserListDialog, self).__init__(*args, **kwargs) - self.SetTitle(_(u"Select a list to add the user")) - self.createBtn.SetLabel(_(u"Add")) - self.createBtn.SetDefault() - self.createBtn.Bind(wx.EVT_BUTTON, self.ok) - self.editBtn.Disable() - self.view.Disable() + def __init__(self, *args, **kwargs): + super(addUserListDialog, self).__init__(*args, **kwargs) + self.SetTitle(_(u"Select a list to add the user")) + self.createBtn.SetLabel(_(u"Add")) + self.createBtn.SetDefault() + self.createBtn.Bind(wx.EVT_BUTTON, self.ok) + self.editBtn.Disable() + self.view.Disable() # self.subscriptors.Disable() # self.members.Disable() - self.deleteBtn.Disable() - widgetUtils.connect_event(self.lista.list, widgetUtils.KEYPRESS, self.on_keypress) + self.deleteBtn.Disable() + widgetUtils.connect_event(self.lista.list, widgetUtils.KEYPRESS, self.on_keypress) - def on_keypress(self, event): - """Catch return and execute ok()""" - if event.GetKeyCode() == wx.WXK_RETURN: - return self.ok() - event.Skip() + def on_keypress(self, event): + """Catch return and execute ok()""" + if event.GetKeyCode() == wx.WXK_RETURN: + return self.ok() + event.Skip() - def ok(self, *args, **kwargs): - self.EndModal(wx.ID_OK) + def ok(self, *args, **kwargs): + self.EndModal(wx.ID_OK) class removeUserListDialog(listViewer): - def __init__(self, *args, **kwargs): - super(removeUserListDialog, self).__init__(*args, **kwargs) - self.SetTitle(_(u"Select a list to remove the user")) - self.createBtn.SetLabel(_(u"Remove")) - self.createBtn.SetDefault() - self.createBtn.SetId(wx.ID_OK) - self.editBtn.Disable() - self.view.Disable() + def __init__(self, *args, **kwargs): + super(removeUserListDialog, self).__init__(*args, **kwargs) + self.SetTitle(_(u"Select a list to remove the user")) + self.createBtn.SetLabel(_(u"Remove")) + self.createBtn.SetDefault() + self.createBtn.SetId(wx.ID_OK) + self.editBtn.Disable() + self.view.Disable() # self.subscriptors.Disable() # self.members.Disable() - self.deleteBtn.Disable() - widgetUtils.connect_event(self.lista.list, widgetUtils.KEYPRESS, self.on_keypress) + self.deleteBtn.Disable() + widgetUtils.connect_event(self.lista.list, widgetUtils.KEYPRESS, self.on_keypress) - def on_keypress(self, event): - """Catch return and execute EndModal()""" - if event.GetKeyCode() == wx.WXK_RETURN: - return self.EndModal(wx.ID_OK) - event.Skip() + def on_keypress(self, event): + """Catch return and execute EndModal()""" + if event.GetKeyCode() == wx.WXK_RETURN: + return self.EndModal(wx.ID_OK) + event.Skip() def remove_list(): - return wx.MessageDialog(None, _("Do you really want to delete this list?"), _("Delete"), wx.YES_NO).ShowModal() + return wx.MessageDialog(None, _("Do you really want to delete this list?"), _("Delete"), wx.YES_NO).ShowModal() diff --git a/src/wxUI/dialogs/message.py b/src/wxUI/dialogs/message.py index 97f8a22a..6a74b32e 100644 --- a/src/wxUI/dialogs/message.py +++ b/src/wxUI/dialogs/message.py @@ -5,463 +5,463 @@ import wx import widgetUtils class textLimited(widgetUtils.BaseDialog): - def __init__(self, *args, **kwargs): - super(textLimited, self).__init__(parent=None, *args, **kwargs) + def __init__(self, *args, **kwargs): + super(textLimited, self).__init__(parent=None, *args, **kwargs) - def createTextArea(self, message="", text=""): - if not hasattr(self, "panel"): - self.panel = wx.Panel(self) - self.label = wx.StaticText(self.panel, -1, message) - self.SetTitle(str(len(text))) - self.text = wx.TextCtrl(self.panel, -1, text, size=(439, -1),style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) + def createTextArea(self, message="", text=""): + if not hasattr(self, "panel"): + self.panel = wx.Panel(self) + self.label = wx.StaticText(self.panel, -1, message) + self.SetTitle(str(len(text))) + self.text = wx.TextCtrl(self.panel, -1, text, size=(439, -1),style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) # font = self.text.GetFont() # dc = wx.WindowDC(self.text) # dc.SetFont(font) # x, y = dc.GetTextExtent("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") # self.text.SetSize((x, y)) - self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text) - self.text.SetFocus() - self.textBox = wx.BoxSizer(wx.HORIZONTAL) - self.textBox.Add(self.label, 0, wx.ALL, 5) - self.textBox.Add(self.text, 0, wx.ALL, 5) + self.Bind(wx.EVT_CHAR_HOOK, self.handle_keys, self.text) + self.text.SetFocus() + self.textBox = wx.BoxSizer(wx.HORIZONTAL) + self.textBox.Add(self.label, 0, wx.ALL, 5) + self.textBox.Add(self.text, 0, wx.ALL, 5) - def text_focus(self): - self.text.SetFocus() + def text_focus(self): + self.text.SetFocus() - def get_text(self): - return self.text.GetValue() + def get_text(self): + return self.text.GetValue() - def set_text(self, text): - return self.text.ChangeValue(text) + def set_text(self, text): + return self.text.ChangeValue(text) - def set_title(self, new_title): - return self.SetTitle(new_title) + def set_title(self, new_title): + return self.SetTitle(new_title) - def enable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Enable() + def enable_button(self, buttonName): + if hasattr(self, buttonName): + return getattr(self, buttonName).Enable() - def disable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Disable() + def disable_button(self, buttonName): + if hasattr(self, buttonName): + return getattr(self, buttonName).Disable() - def onSelect(self, ev): - self.text.SelectAll() + def onSelect(self, ev): + self.text.SelectAll() - def handle_keys(self, event): - shift=event.ShiftDown() - if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'okButton'): - wx.PostEvent(self.okButton.GetEventHandler(), wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK)) - else: - event.Skip() + def handle_keys(self, event): + shift=event.ShiftDown() + if event.GetKeyCode() == wx.WXK_RETURN and shift==False and hasattr(self,'okButton'): + wx.PostEvent(self.okButton.GetEventHandler(), wx.PyCommandEvent(wx.EVT_BUTTON.typeId,wx.ID_OK)) + else: + event.Skip() - def set_cursor_at_end(self): - self.text.SetInsertionPoint(len(self.text.GetValue())) + def set_cursor_at_end(self): + self.text.SetInsertionPoint(len(self.text.GetValue())) - def set_cursor_at_position(self, position): - self.text.SetInsertionPoint(position) + def set_cursor_at_position(self, position): + self.text.SetInsertionPoint(position) - def get_position(self): - return self.text.GetInsertionPoint() + def get_position(self): + return self.text.GetInsertionPoint() - def popup_menu(self, menu): - self.PopupMenu(menu, self.text.GetPosition()) + def popup_menu(self, menu): + self.PopupMenu(menu, self.text.GetPosition()) class tweet(textLimited): - def createControls(self, title, message, text): - self.mainBox = wx.BoxSizer(wx.VERTICAL) - self.createTextArea(message, text) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet")) - 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.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), 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.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) - self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) - self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) - self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) - self.mainBox.Add(self.ok_cancelSizer) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ -(wx.ACCEL_CTRL, ord('A'), selectId), -]) - self.SetAcceleratorTable(self.accel_tbl) - self.panel.SetSizer(self.mainBox) + def createControls(self, title, message, text): + self.mainBox = wx.BoxSizer(wx.VERTICAL) + self.createTextArea(message, text) + self.mainBox.Add(self.textBox, 0, wx.ALL, 5) + self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet")) + 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.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), 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.shortenButton.Disable() + self.unshortenButton.Disable() + self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) + self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) + self.okButton.SetDefault() + cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) + self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) + self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) + self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) + self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) + self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) + self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) + self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) + self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) + self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) + self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) + self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) + self.mainBox.Add(self.ok_cancelSizer) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + self.panel.SetSizer(self.mainBox) - def __init__(self, title, message, text, *args, **kwargs): - super(tweet, self).__init__() - self.shift=False - self.createControls(message, title, text) - self.SetClientSize(self.mainBox.CalcMin()) + def __init__(self, title, message, text, *args, **kwargs): + super(tweet, self).__init__() + self.shift=False + self.createControls(message, title, text) + self.SetClientSize(self.mainBox.CalcMin()) + + def get_image(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return None + return open(openFileDialog.GetPath(), "rb") - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return open(openFileDialog.GetPath(), "rb") - class retweet(tweet): - def createControls(self, title, message, text): - self.mainBox = wx.BoxSizer(wx.VERTICAL) - self.createTextArea(message, "") - label = wx.StaticText(self.panel, -1, _(u"Retweet")) - self.text2 = wx.TextCtrl(self.panel, -1, text, size=(439, -1), style=wx.TE_MULTILINE|wx.TE_READONLY) - self.retweetBox = wx.BoxSizer(wx.HORIZONTAL) - self.retweetBox.Add(label, 0, wx.ALL, 5) - self.retweetBox.Add(self.text2, 0, wx.ALL, 5) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.mainBox.Add(self.retweetBox, 0, wx.ALL, 5) - 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.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), 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.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) - self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) - self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) - self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) - self.mainBox.Add(self.ok_cancelSizer) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ -(wx.ACCEL_CTRL, ord('A'), selectId), -]) - self.SetAcceleratorTable(self.accel_tbl) - self.panel.SetSizer(self.mainBox) + def createControls(self, title, message, text): + self.mainBox = wx.BoxSizer(wx.VERTICAL) + self.createTextArea(message, "") + label = wx.StaticText(self.panel, -1, _(u"Retweet")) + self.text2 = wx.TextCtrl(self.panel, -1, text, size=(439, -1), style=wx.TE_MULTILINE|wx.TE_READONLY) + self.retweetBox = wx.BoxSizer(wx.HORIZONTAL) + self.retweetBox.Add(label, 0, wx.ALL, 5) + self.retweetBox.Add(self.text2, 0, wx.ALL, 5) + self.mainBox.Add(self.textBox, 0, wx.ALL, 5) + self.mainBox.Add(self.retweetBox, 0, wx.ALL, 5) + 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.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), 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.shortenButton.Disable() + self.unshortenButton.Disable() + self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) + self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) + self.okButton.SetDefault() + cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) + self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) + self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) + self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) + self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) + self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) + self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) + self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) + self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) + self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) + self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) + self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) + self.mainBox.Add(self.ok_cancelSizer) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + self.panel.SetSizer(self.mainBox) - def __init__(self, title, message, text, *args, **kwargs): - super(tweet, self).__init__() - self.createControls(message, title, text) + def __init__(self, title, message, text, *args, **kwargs): + super(tweet, self).__init__() + self.createControls(message, title, text) # self.onTimer(wx.EVT_CHAR_HOOK) - self.SetClientSize(self.mainBox.CalcMin()) + self.SetClientSize(self.mainBox.CalcMin()) - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return open(openFileDialog.GetPath(), "rb") + def get_image(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return None + return open(openFileDialog.GetPath(), "rb") class dm(textLimited): - def createControls(self, title, message, users): - self.panel = wx.Panel(self) - self.mainBox = wx.BoxSizer(wx.VERTICAL) - label = wx.StaticText(self.panel, -1, _(u"&Recipient")) - self.cb = wx.ComboBox(self.panel, -1, choices=users, value=users[0], size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.createTextArea(message, text="") - userBox = wx.BoxSizer(wx.HORIZONTAL) - userBox.Add(label, 0, wx.ALL, 5) - userBox.Add(self.cb, 0, wx.ALL, 5) - userBox.Add(self.autocompletionButton, 0, wx.ALL, 5) - self.mainBox.Add(userBox, 0, wx.ALL, 5) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - 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.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.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) - self.buttonsBox.Add(self.attach, 0, wx.ALL, 5) - self.mainBox.Add(self.buttonsBox, 0, wx.ALL, 5) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.shortenButton, 0, wx.ALL, 5) - self.buttonsBox1.Add(self.unshortenButton, 0, wx.ALL, 5) - self.buttonsBox1.Add(self.translateButton, 0, wx.ALL, 5) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 5) - self.buttonsBox3 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox3.Add(self.okButton, 0, wx.ALL, 5) - self.buttonsBox3.Add(cancelButton, 0, wx.ALL, 5) - self.mainBox.Add(self.buttonsBox3, 0, wx.ALL, 5) - self.panel.SetSizer(self.mainBox) - self.SetClientSize(self.mainBox.CalcMin()) + def createControls(self, title, message, users): + self.panel = wx.Panel(self) + self.mainBox = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(self.panel, -1, _(u"&Recipient")) + self.cb = wx.ComboBox(self.panel, -1, choices=users, value=users[0], size=wx.DefaultSize) + self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) + self.createTextArea(message, text="") + userBox = wx.BoxSizer(wx.HORIZONTAL) + userBox.Add(label, 0, wx.ALL, 5) + userBox.Add(self.cb, 0, wx.ALL, 5) + userBox.Add(self.autocompletionButton, 0, wx.ALL, 5) + self.mainBox.Add(userBox, 0, wx.ALL, 5) + self.mainBox.Add(self.textBox, 0, wx.ALL, 5) + 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.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.shortenButton.Disable() + self.unshortenButton.Disable() + self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) + self.okButton.SetDefault() + cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + self.buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + self.buttonsBox.Add(self.attach, 0, wx.ALL, 5) + self.mainBox.Add(self.buttonsBox, 0, wx.ALL, 5) + self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox1.Add(self.shortenButton, 0, wx.ALL, 5) + self.buttonsBox1.Add(self.unshortenButton, 0, wx.ALL, 5) + self.buttonsBox1.Add(self.translateButton, 0, wx.ALL, 5) + self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 5) + self.buttonsBox3 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox3.Add(self.okButton, 0, wx.ALL, 5) + self.buttonsBox3.Add(cancelButton, 0, wx.ALL, 5) + self.mainBox.Add(self.buttonsBox3, 0, wx.ALL, 5) + self.panel.SetSizer(self.mainBox) + self.SetClientSize(self.mainBox.CalcMin()) - def __init__(self, title, message, users, *args, **kwargs): - super(dm, self).__init__() - self.createControls(title, message, users) + def __init__(self, title, message, users, *args, **kwargs): + super(dm, self).__init__() + self.createControls(title, message, users) # self.onTimer(wx.EVT_CHAR_HOOK) # self.SetClientSize(self.mainBox.CalcMin()) - def get_user(self): - return self.cb.GetValue() + def get_user(self): + return self.cb.GetValue() - def set_user(self, user): - return self.cb.SetValue(user) + def set_user(self, user): + return self.cb.SetValue(user) class reply(textLimited): - def get_image(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return open(openFileDialog.GetPath(), "rb") + def get_image(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return None + return open(openFileDialog.GetPath(), "rb") - def createControls(self, title, message, text): - self.mainBox = wx.BoxSizer(wx.VERTICAL) - self.createTextArea(message, text) - self.mainBox.Add(self.textBox, 0, wx.ALL, 5) - self.usersbox = wx.BoxSizer(wx.VERTICAL) - self.mentionAll = wx.CheckBox(self.panel, -1, _(u"&Mention to all"), size=wx.DefaultSize) - self.mentionAll.Disable() - self.usersbox.Add(self.mentionAll, 0, wx.ALL, 5) - self.checkboxes = [] - for i in self.users: - user_checkbox = wx.CheckBox(self.panel, -1, "@"+i, size=wx.DefaultSize) - self.checkboxes.append(user_checkbox) - self.usersbox.Add(self.checkboxes[-1], 0, wx.ALL, 5) - self.mainBox.Add(self.usersbox, 0, wx.ALL, 10) - self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet")) - 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.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), 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.shortenButton.Disable() - self.unshortenButton.Disable() - self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) - self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) - self.okButton.SetDefault() - cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) - self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) - self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) - self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) - self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) - self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) - self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) - self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) - self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) - self.mainBox.Add(self.ok_cancelSizer, 0, wx.ALL, 10) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ -(wx.ACCEL_CTRL, ord('A'), selectId), -]) - self.SetAcceleratorTable(self.accel_tbl) - self.panel.SetSizer(self.mainBox) + def createControls(self, title, message, text): + self.mainBox = wx.BoxSizer(wx.VERTICAL) + self.createTextArea(message, text) + self.mainBox.Add(self.textBox, 0, wx.ALL, 5) + self.usersbox = wx.BoxSizer(wx.VERTICAL) + self.mentionAll = wx.CheckBox(self.panel, -1, _(u"&Mention to all"), size=wx.DefaultSize) + self.mentionAll.Disable() + self.usersbox.Add(self.mentionAll, 0, wx.ALL, 5) + self.checkboxes = [] + for i in self.users: + user_checkbox = wx.CheckBox(self.panel, -1, "@"+i, size=wx.DefaultSize) + self.checkboxes.append(user_checkbox) + self.usersbox.Add(self.checkboxes[-1], 0, wx.ALL, 5) + self.mainBox.Add(self.usersbox, 0, wx.ALL, 10) + self.long_tweet = wx.CheckBox(self.panel, -1, _(u"&Long tweet")) + 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.attach = wx.Button(self.panel, -1, _(u"&Attach audio..."), 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.shortenButton.Disable() + self.unshortenButton.Disable() + self.translateButton = wx.Button(self.panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + self.autocompletionButton = wx.Button(self.panel, -1, _(u"Auto&complete users")) + self.okButton = wx.Button(self.panel, wx.ID_OK, _(u"Sen&d"), size=wx.DefaultSize) + self.okButton.SetDefault() + cancelButton = wx.Button(self.panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + self.buttonsBox1 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox1.Add(self.upload_image, 0, wx.ALL, 10) + self.buttonsBox1.Add(self.spellcheck, 0, wx.ALL, 10) + self.buttonsBox1.Add(self.attach, 0, wx.ALL, 10) + self.mainBox.Add(self.buttonsBox1, 0, wx.ALL, 10) + self.buttonsBox2 = wx.BoxSizer(wx.HORIZONTAL) + self.buttonsBox2.Add(self.shortenButton, 0, wx.ALL, 10) + self.buttonsBox2.Add(self.unshortenButton, 0, wx.ALL, 10) + self.buttonsBox2.Add(self.translateButton, 0, wx.ALL, 10) + self.mainBox.Add(self.buttonsBox2, 0, wx.ALL, 10) + self.ok_cancelSizer = wx.BoxSizer(wx.HORIZONTAL) + self.ok_cancelSizer.Add(self.autocompletionButton, 0, wx.ALL, 10) + self.ok_cancelSizer.Add(self.okButton, 0, wx.ALL, 10) + self.ok_cancelSizer.Add(cancelButton, 0, wx.ALL, 10) + self.mainBox.Add(self.ok_cancelSizer, 0, wx.ALL, 10) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + self.panel.SetSizer(self.mainBox) - def __init__(self, title, message, text, users=[], *args, **kwargs): - self.users = users - super(reply, self).__init__() - self.shift=False - self.createControls(message, title, text) - self.SetClientSize(self.mainBox.CalcMin()) + def __init__(self, title, message, text, users=[], *args, **kwargs): + self.users = users + super(reply, self).__init__() + self.shift=False + self.createControls(message, title, text) + self.SetClientSize(self.mainBox.CalcMin()) class viewTweet(widgetUtils.BaseDialog): - def set_title(self, lenght): - self.SetTitle(_(u"Tweet - %i characters ") % (lenght,)) + def set_title(self, lenght): + self.SetTitle(_(u"Tweet - %i characters ") % (lenght,)) - def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs): - super(viewTweet, self).__init__(None, size=(850,850)) - panel = wx.Panel(self) - label = wx.StaticText(panel, -1, _(u"Tweet")) - self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) - dc = wx.WindowDC(self.text) - dc.SetFont(self.text.GetFont()) - (x, y) = dc.GetMultiLineTextExtent("0"*140) - self.text.SetSize((x, y)) - self.text.SetFocus() - textBox = wx.BoxSizer(wx.HORIZONTAL) - textBox.Add(label, 0, wx.ALL, 5) - textBox.Add(self.text, 1, wx.EXPAND, 5) - mainBox = wx.BoxSizer(wx.VERTICAL) - mainBox.Add(textBox, 0, wx.ALL, 5) - label2 = wx.StaticText(panel, -1, _(u"Image description")) - self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) - dc = wx.WindowDC(self.image_description) - dc.SetFont(self.image_description.GetFont()) - (x, y) = dc.GetMultiLineTextExtent("0"*450) - self.image_description.SetSize((x, y)) - self.image_description.Enable(False) - iBox = wx.BoxSizer(wx.HORIZONTAL) - iBox.Add(label2, 0, wx.ALL, 5) - iBox.Add(self.image_description, 1, wx.EXPAND, 5) - mainBox.Add(iBox, 0, wx.ALL, 5) - rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: ")) - rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - rtBox = wx.BoxSizer(wx.HORIZONTAL) - rtBox.Add(rtCountLabel, 0, wx.ALL, 5) - rtBox.Add(rtCount, 0, wx.ALL, 5) - favsCountLabel = wx.StaticText(panel, -1, _(u"Likes: ")) - favsCount = wx.TextCtrl(panel, -1, favs_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - favsBox = wx.BoxSizer(wx.HORIZONTAL) - favsBox.Add(favsCountLabel, 0, wx.ALL, 5) - favsBox.Add(favsCount, 0, wx.ALL, 5) - sourceLabel = wx.StaticText(panel, -1, _(u"Source: ")) - sourceTweet = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - sourceBox = wx.BoxSizer(wx.HORIZONTAL) - sourceBox.Add(sourceLabel, 0, wx.ALL, 5) - sourceBox.Add(sourceTweet, 0, wx.ALL, 5) - dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) - dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - dc = wx.WindowDC(dateTweet) - dc.SetFont(dateTweet.GetFont()) - (x, y) = dc.GetTextExtent("0"*100) - dateTweet.SetSize((x, y)) - dateBox = wx.BoxSizer(wx.HORIZONTAL) - dateBox.Add(dateLabel, 0, wx.ALL, 5) - dateBox.Add(dateTweet, 0, wx.ALL, 5) - infoBox = wx.BoxSizer(wx.HORIZONTAL) - infoBox.Add(rtBox, 0, wx.ALL, 5) - infoBox.Add(favsBox, 0, wx.ALL, 5) - infoBox.Add(sourceBox, 0, wx.ALL, 5) - mainBox.Add(infoBox, 0, wx.ALL, 5) - mainBox.Add(dateBox, 0, wx.ALL, 5) - self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.unshortenButton.Disable() - self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - cancelButton.SetDefault() - buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) - buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) - buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) - buttonsBox.Add(cancelButton, 0, wx.ALL, 5) - mainBox.Add(buttonsBox, 0, wx.ALL, 5) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ -(wx.ACCEL_CTRL, ord('A'), selectId), -]) - self.SetAcceleratorTable(self.accel_tbl) - panel.SetSizer(mainBox) - self.SetClientSize(mainBox.CalcMin()) + def __init__(self, text, rt_count, favs_count, source, date="", *args, **kwargs): + super(viewTweet, self).__init__(None, size=(850,850)) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Tweet")) + self.text = wx.TextCtrl(panel, -1, text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.text) + dc.SetFont(self.text.GetFont()) + (x, y) = dc.GetMultiLineTextExtent("0"*140) + self.text.SetSize((x, y)) + self.text.SetFocus() + textBox = wx.BoxSizer(wx.HORIZONTAL) + textBox.Add(label, 0, wx.ALL, 5) + textBox.Add(self.text, 1, wx.EXPAND, 5) + mainBox = wx.BoxSizer(wx.VERTICAL) + mainBox.Add(textBox, 0, wx.ALL, 5) + label2 = wx.StaticText(panel, -1, _(u"Image description")) + self.image_description = wx.TextCtrl(panel, -1, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.image_description) + dc.SetFont(self.image_description.GetFont()) + (x, y) = dc.GetMultiLineTextExtent("0"*450) + self.image_description.SetSize((x, y)) + self.image_description.Enable(False) + iBox = wx.BoxSizer(wx.HORIZONTAL) + iBox.Add(label2, 0, wx.ALL, 5) + iBox.Add(self.image_description, 1, wx.EXPAND, 5) + mainBox.Add(iBox, 0, wx.ALL, 5) + rtCountLabel = wx.StaticText(panel, -1, _(u"Retweets: ")) + rtCount = wx.TextCtrl(panel, -1, rt_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + rtBox = wx.BoxSizer(wx.HORIZONTAL) + rtBox.Add(rtCountLabel, 0, wx.ALL, 5) + rtBox.Add(rtCount, 0, wx.ALL, 5) + favsCountLabel = wx.StaticText(panel, -1, _(u"Likes: ")) + favsCount = wx.TextCtrl(panel, -1, favs_count, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + favsBox = wx.BoxSizer(wx.HORIZONTAL) + favsBox.Add(favsCountLabel, 0, wx.ALL, 5) + favsBox.Add(favsCount, 0, wx.ALL, 5) + sourceLabel = wx.StaticText(panel, -1, _(u"Source: ")) + sourceTweet = wx.TextCtrl(panel, -1, source, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + sourceBox = wx.BoxSizer(wx.HORIZONTAL) + sourceBox.Add(sourceLabel, 0, wx.ALL, 5) + sourceBox.Add(sourceTweet, 0, wx.ALL, 5) + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + dateTweet = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dc = wx.WindowDC(dateTweet) + dc.SetFont(dateTweet.GetFont()) + (x, y) = dc.GetTextExtent("0"*100) + dateTweet.SetSize((x, y)) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(dateTweet, 0, wx.ALL, 5) + infoBox = wx.BoxSizer(wx.HORIZONTAL) + infoBox.Add(rtBox, 0, wx.ALL, 5) + infoBox.Add(favsBox, 0, wx.ALL, 5) + infoBox.Add(sourceBox, 0, wx.ALL, 5) + mainBox.Add(infoBox, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) + self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) + self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Disable() + self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) + buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) + buttonsBox.Add(cancelButton, 0, wx.ALL, 5) + mainBox.Add(buttonsBox, 0, wx.ALL, 5) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + panel.SetSizer(mainBox) + self.SetClientSize(mainBox.CalcMin()) - def set_text(self, text): - self.text.ChangeValue(text) + def set_text(self, text): + self.text.ChangeValue(text) - def get_text(self): - return self.text.GetValue() + def get_text(self): + return self.text.GetValue() - def set_image_description(self, desc): - self.image_description.Enable(True) - if len(self.image_description.GetValue()) == 0: - self.image_description.SetValue(desc) - else: - self.image_description.SetValue(self.image_description.GetValue()+"\n"+desc) + def set_image_description(self, desc): + self.image_description.Enable(True) + if len(self.image_description.GetValue()) == 0: + self.image_description.SetValue(desc) + else: + self.image_description.SetValue(self.image_description.GetValue()+"\n"+desc) - def text_focus(self): - self.text.SetFocus() + def text_focus(self): + self.text.SetFocus() - def onSelect(self, ev): - self.text.SelectAll() + def onSelect(self, ev): + self.text.SelectAll() - def enable_button(self, buttonName): - if hasattr(self, buttonName): - return getattr(self, buttonName).Enable() + def enable_button(self, buttonName): + if hasattr(self, buttonName): + return getattr(self, buttonName).Enable() class viewNonTweet(widgetUtils.BaseDialog): - def __init__(self, text, date="", *args, **kwargs): - super(viewNonTweet, self).__init__(None, size=(850,850)) - self.SetTitle(_(u"View")) - panel = wx.Panel(self) - label = wx.StaticText(panel, -1, _(u"Item")) - self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) - dc = wx.WindowDC(self.text) - dc.SetFont(self.text.GetFont()) - (x, y) = dc.GetMultiLineTextExtent("0"*140) - self.text.SetSize((x, y)) - self.text.SetFocus() - textBox = wx.BoxSizer(wx.HORIZONTAL) - textBox.Add(label, 0, wx.ALL, 5) - textBox.Add(self.text, 1, wx.EXPAND, 5) - mainBox = wx.BoxSizer(wx.VERTICAL) - mainBox.Add(textBox, 0, wx.ALL, 5) - if date != "": - dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) - date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) - dc = wx.WindowDC(date) - dc.SetFont(date.GetFont()) - (x, y) = dc.GetTextExtent("0"*100) - date.SetSize((x, y)) - dateBox = wx.BoxSizer(wx.HORIZONTAL) - dateBox.Add(dateLabel, 0, wx.ALL, 5) - dateBox.Add(date, 0, wx.ALL, 5) - mainBox.Add(dateBox, 0, wx.ALL, 5) - self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) - self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) - self.unshortenButton.Disable() - self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) - cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) - cancelButton.SetDefault() - buttonsBox = wx.BoxSizer(wx.HORIZONTAL) - buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) - buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) - buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) - buttonsBox.Add(cancelButton, 0, wx.ALL, 5) - mainBox.Add(buttonsBox, 0, wx.ALL, 5) - selectId = wx.ID_ANY - self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) - self.accel_tbl = wx.AcceleratorTable([ -(wx.ACCEL_CTRL, ord('A'), selectId), -]) - self.SetAcceleratorTable(self.accel_tbl) - panel.SetSizer(mainBox) - self.SetClientSize(mainBox.CalcMin()) + def __init__(self, text, date="", *args, **kwargs): + super(viewNonTweet, self).__init__(None, size=(850,850)) + self.SetTitle(_(u"View")) + panel = wx.Panel(self) + label = wx.StaticText(panel, -1, _(u"Item")) + self.text = wx.TextCtrl(parent=panel, id=-1, value=text, style=wx.TE_READONLY|wx.TE_MULTILINE, size=(250, 180)) + dc = wx.WindowDC(self.text) + dc.SetFont(self.text.GetFont()) + (x, y) = dc.GetMultiLineTextExtent("0"*140) + self.text.SetSize((x, y)) + self.text.SetFocus() + textBox = wx.BoxSizer(wx.HORIZONTAL) + textBox.Add(label, 0, wx.ALL, 5) + textBox.Add(self.text, 1, wx.EXPAND, 5) + mainBox = wx.BoxSizer(wx.VERTICAL) + mainBox.Add(textBox, 0, wx.ALL, 5) + if date != "": + dateLabel = wx.StaticText(panel, -1, _(u"Date: ")) + date = wx.TextCtrl(panel, -1, date, size=wx.DefaultSize, style=wx.TE_READONLY|wx.TE_MULTILINE) + dc = wx.WindowDC(date) + dc.SetFont(date.GetFont()) + (x, y) = dc.GetTextExtent("0"*100) + date.SetSize((x, y)) + dateBox = wx.BoxSizer(wx.HORIZONTAL) + dateBox.Add(dateLabel, 0, wx.ALL, 5) + dateBox.Add(date, 0, wx.ALL, 5) + mainBox.Add(dateBox, 0, wx.ALL, 5) + self.spellcheck = wx.Button(panel, -1, _("Check &spelling..."), size=wx.DefaultSize) + self.unshortenButton = wx.Button(panel, -1, _(u"&Expand URL"), size=wx.DefaultSize) + self.unshortenButton.Disable() + self.translateButton = wx.Button(panel, -1, _(u"&Translate..."), size=wx.DefaultSize) + cancelButton = wx.Button(panel, wx.ID_CANCEL, _(u"C&lose"), size=wx.DefaultSize) + cancelButton.SetDefault() + buttonsBox = wx.BoxSizer(wx.HORIZONTAL) + buttonsBox.Add(self.spellcheck, 0, wx.ALL, 5) + buttonsBox.Add(self.unshortenButton, 0, wx.ALL, 5) + buttonsBox.Add(self.translateButton, 0, wx.ALL, 5) + buttonsBox.Add(cancelButton, 0, wx.ALL, 5) + mainBox.Add(buttonsBox, 0, wx.ALL, 5) + selectId = wx.ID_ANY + self.Bind(wx.EVT_MENU, self.onSelect, id=selectId) + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('A'), selectId), + ]) + self.SetAcceleratorTable(self.accel_tbl) + panel.SetSizer(mainBox) + self.SetClientSize(mainBox.CalcMin()) - def onSelect(self, ev): - self.text.SelectAll() + def onSelect(self, ev): + self.text.SelectAll() - def set_text(self, text): - self.text.ChangeValue(text) + def set_text(self, text): + self.text.ChangeValue(text) - def get_text(self): - return self.text.GetValue() + def get_text(self): + return self.text.GetValue() - def text_focus(self): - self.text.SetFocus() + def text_focus(self): + self.text.SetFocus() - def enable_button(self, buttonName): - if getattr(self, buttonName): - return getattr(self, buttonName).Enable() + def enable_button(self, buttonName): + if getattr(self, buttonName): + return getattr(self, buttonName).Enable() diff --git a/src/wxUI/dialogs/search.py b/src/wxUI/dialogs/search.py index b8b6da56..504cab9a 100644 --- a/src/wxUI/dialogs/search.py +++ b/src/wxUI/dialogs/search.py @@ -5,69 +5,69 @@ import wx from extra import translator class searchDialog(baseDialog.BaseWXDialog): - def __init__(self, value=""): - super(searchDialog, self).__init__(None, -1) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.SetTitle(_(u"Search on Twitter")) - label = wx.StaticText(panel, -1, _(u"&Search")) - self.term = wx.TextCtrl(panel, -1, value) - self.term.SetFocus() - dc = wx.WindowDC(self.term) - dc.SetFont(self.term.GetFont()) - self.term.SetSize(dc.GetTextExtent("0"*40)) - sizer.Add(label, 0, wx.ALL, 5) - sizer.Add(self.term, 0, wx.ALL, 5) - self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP) - self.users = wx.RadioButton(panel, -1, _(u"Users")) - widgetUtils.connect_event(self.tweets, widgetUtils.RADIOBUTTON, self.show_advanced_search) - widgetUtils.connect_event(self.users, widgetUtils.RADIOBUTTON, self.hide_advanced_search) - radioSizer = wx.BoxSizer(wx.HORIZONTAL) - radioSizer.Add(self.tweets, 0, wx.ALL, 5) - radioSizer.Add(self.users, 0, wx.ALL, 5) - sizer.Add(radioSizer, 0, wx.ALL, 5) - lang = wx.StaticText(panel, -1, _(u"&Language for results: ")) - langs = [x for x in list(translator.translator.languages.values())] - langs.insert(0, _(u"any")) - self.lang = wx.ComboBox(panel, -1, choices=langs, value=langs[0], style = wx.CB_READONLY) - langBox = wx.BoxSizer(wx.HORIZONTAL) - langBox.Add(lang, 0, wx.ALL, 5) - langBox.Add(self.lang, 0, wx.ALL, 5) - sizer.Add(langBox, 0, wx.ALL, 5) - 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) - rBox = wx.BoxSizer(wx.HORIZONTAL) - rBox.Add(resulttype, 0, wx.ALL, 5) - rBox.Add(self.resultstype, 0, wx.ALL, 5) - sizer.Add(rBox, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok, 0, wx.ALL, 5) - btnsizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self, value=""): + super(searchDialog, self).__init__(None, -1) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(_(u"Search on Twitter")) + label = wx.StaticText(panel, -1, _(u"&Search")) + self.term = wx.TextCtrl(panel, -1, value) + self.term.SetFocus() + dc = wx.WindowDC(self.term) + dc.SetFont(self.term.GetFont()) + self.term.SetSize(dc.GetTextExtent("0"*40)) + sizer.Add(label, 0, wx.ALL, 5) + sizer.Add(self.term, 0, wx.ALL, 5) + self.tweets = wx.RadioButton(panel, -1, _(u"Tweets"), style=wx.RB_GROUP) + self.users = wx.RadioButton(panel, -1, _(u"Users")) + widgetUtils.connect_event(self.tweets, widgetUtils.RADIOBUTTON, self.show_advanced_search) + widgetUtils.connect_event(self.users, widgetUtils.RADIOBUTTON, self.hide_advanced_search) + radioSizer = wx.BoxSizer(wx.HORIZONTAL) + radioSizer.Add(self.tweets, 0, wx.ALL, 5) + radioSizer.Add(self.users, 0, wx.ALL, 5) + sizer.Add(radioSizer, 0, wx.ALL, 5) + lang = wx.StaticText(panel, -1, _(u"&Language for results: ")) + langs = [x for x in list(translator.translator.languages.values())] + langs.insert(0, _(u"any")) + self.lang = wx.ComboBox(panel, -1, choices=langs, value=langs[0], style = wx.CB_READONLY) + langBox = wx.BoxSizer(wx.HORIZONTAL) + langBox.Add(lang, 0, wx.ALL, 5) + langBox.Add(self.lang, 0, wx.ALL, 5) + sizer.Add(langBox, 0, wx.ALL, 5) + 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) + rBox = wx.BoxSizer(wx.HORIZONTAL) + rBox.Add(resulttype, 0, wx.ALL, 5) + rBox.Add(self.resultstype, 0, wx.ALL, 5) + sizer.Add(rBox, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def get_language(self): - l = self.lang.GetStringSelection() - if l == _(u"any"): - return "" - for langcode, langname in translator.translator.languages.items(): - if langname == l: - return langcode + def get_language(self): + l = self.lang.GetStringSelection() + if l == _(u"any"): + return "" + for langcode, langname in translator.translator.languages.items(): + if langname == l: + return langcode - def get_result_type(self): - r = self.resultstype.GetValue() - if r == _(u"Mixed"): return "mixed" - elif r == _(u"Recent"): return "recent" - elif r == _(u"Popular"): return "popular" + def get_result_type(self): + r = self.resultstype.GetValue() + if r == _(u"Mixed"): return "mixed" + elif r == _(u"Recent"): return "recent" + elif r == _(u"Popular"): return "popular" - def hide_advanced_search(self, *args, **kwargs): - self.lang.Hide() - self.resultstype.Hide() + def hide_advanced_search(self, *args, **kwargs): + self.lang.Hide() + self.resultstype.Hide() - def show_advanced_search(self, *args, **kwargs): - self.lang.Show() - self.resultstype.Show() + def show_advanced_search(self, *args, **kwargs): + self.lang.Show() + self.resultstype.Show() diff --git a/src/wxUI/dialogs/show_user.py b/src/wxUI/dialogs/show_user.py index 1c7be5b4..fe6c8b11 100644 --- a/src/wxUI/dialogs/show_user.py +++ b/src/wxUI/dialogs/show_user.py @@ -5,24 +5,24 @@ import wx from . import baseDialog class showUserProfile(baseDialog.BaseWXDialog): - def __init__(self): - super(showUserProfile, self).__init__(parent=None, id=wx.ID_ANY) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - static = wx.StaticText(panel, -1, _(u"Details")) - sizer.Add(static, 0, wx.ALL, 5) - self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(350, 250)) - self.text.SetFocus() - 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.Disable() - close = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) - btnSizer = wx.BoxSizer(wx.HORIZONTAL) - btnSizer.Add(self.url, 0, wx.ALL, 5) - btnSizer.Add(close, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(showUserProfile, self).__init__(parent=None, id=wx.ID_ANY) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + static = wx.StaticText(panel, -1, _(u"Details")) + sizer.Add(static, 0, wx.ALL, 5) + self.text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(350, 250)) + self.text.SetFocus() + 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.Disable() + close = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.Add(self.url, 0, wx.ALL, 5) + btnSizer.Add(close, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def enable_url(self, enabled=True): - self.url.Enable(enabled) \ No newline at end of file + def enable_url(self, enabled=True): + self.url.Enable(enabled) diff --git a/src/wxUI/dialogs/trends.py b/src/wxUI/dialogs/trends.py index d2d6ae75..24613e53 100644 --- a/src/wxUI/dialogs/trends.py +++ b/src/wxUI/dialogs/trends.py @@ -3,43 +3,43 @@ from . import baseDialog import wx class trendingTopicsDialog(baseDialog.BaseWXDialog): - def __init__(self): - super(trendingTopicsDialog, self).__init__(None, -1) - panel = wx.Panel(self) - sizer = wx.BoxSizer(wx.VERTICAL) - self.SetTitle(_(u"View trending topics")) - label = wx.StaticText(panel, wx.NewId(), _(u"Trending topics by")) - self.country = wx.RadioButton(panel, -1, _(u"Country"), style=wx.RB_GROUP) - self.city = wx.RadioButton(panel, -1, _(u"City")) - radioSizer = wx.BoxSizer(wx.HORIZONTAL) - radioSizer.Add(label, 0, wx.ALL, 5) - radioSizer.Add(self.country, 0, wx.ALL, 5) - radioSizer.Add(self.city, 0, wx.ALL, 5) - sizer.Add(radioSizer, 0, wx.ALL, 5) - label = wx.StaticText(panel, -1, _(u"&Location")) - self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY) - locationBox = wx.BoxSizer(wx.HORIZONTAL) - locationBox.Add(label, 0, wx.ALL, 5) - locationBox.Add(self.location, 0, wx.ALL, 5) - sizer.Add(locationBox, 0, wx.ALL, 5) - ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok, 0, wx.ALL, 5) - btnsizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(trendingTopicsDialog, self).__init__(None, -1) + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(_(u"View trending topics")) + label = wx.StaticText(panel, wx.NewId(), _(u"Trending topics by")) + self.country = wx.RadioButton(panel, -1, _(u"Country"), style=wx.RB_GROUP) + self.city = wx.RadioButton(panel, -1, _(u"City")) + radioSizer = wx.BoxSizer(wx.HORIZONTAL) + radioSizer.Add(label, 0, wx.ALL, 5) + radioSizer.Add(self.country, 0, wx.ALL, 5) + radioSizer.Add(self.city, 0, wx.ALL, 5) + sizer.Add(radioSizer, 0, wx.ALL, 5) + label = wx.StaticText(panel, -1, _(u"&Location")) + self.location = wx.ListBox(panel, -1, choices=[], style=wx.CB_READONLY) + locationBox = wx.BoxSizer(wx.HORIZONTAL) + locationBox.Add(label, 0, wx.ALL, 5) + locationBox.Add(self.location, 0, wx.ALL, 5) + sizer.Add(locationBox, 0, wx.ALL, 5) + ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def get_active(self): - if self.country.GetValue() == True: - return "country" - else: - return "city" + def get_active(self): + if self.country.GetValue() == True: + return "country" + else: + return "city" - def get_item(self): - return self.location.GetStringSelection() + def get_item(self): + return self.location.GetStringSelection() - def set(self, values): - self.location.Set(values) \ No newline at end of file + def set(self, values): + self.location.Set(values) diff --git a/src/wxUI/dialogs/update_profile.py b/src/wxUI/dialogs/update_profile.py index ba1cb541..034c2388 100644 --- a/src/wxUI/dialogs/update_profile.py +++ b/src/wxUI/dialogs/update_profile.py @@ -5,96 +5,96 @@ import wx from . import baseDialog class updateProfileDialog(baseDialog.BaseWXDialog): - def __init__(self): - super(updateProfileDialog, self).__init__(parent=None, id=-1) - self.SetTitle(_(u"Update your profile")) - panel = wx.Panel(self) - labelName = wx.StaticText(panel, -1, _(u"&Name (50 characters maximum)")) - self.name = wx.TextCtrl(panel, -1) - self.name.SetFocus() - dc = wx.WindowDC(self.name) - dc.SetFont(self.name.GetFont()) - self.name.SetSize(dc.GetTextExtent("0"*50)) - labelLocation = wx.StaticText(panel, -1, _(u"&Location")) - self.location = wx.TextCtrl(panel, -1) - dc = wx.WindowDC(self.location) - dc.SetFont(self.location.GetFont()) - self.location.SetSize(dc.GetTextExtent("0"*35)) - labelUrl = wx.StaticText(panel, -1, _(u"&Website")) - self.url = wx.TextCtrl(panel, -1) - dc = wx.WindowDC(self.url) - dc.SetFont(self.url.GetFont()) - self.url.SetSize(dc.GetTextExtent("0"*22)) - labelDescription = wx.StaticText(panel, -1, _(u"&Bio (160 characters maximum)")) - self.description = wx.TextCtrl(panel, -1, size=(400, 400)) - dc = wx.WindowDC(self.description) - dc.SetFont(self.description.GetFont()) - self.description.SetSize(dc.GetTextExtent("0"*160)) - self.image = None - self.upload_image = wx.Button(panel, -1, _(u"Upload a &picture")) - self.ok = wx.Button(panel, wx.ID_OK, _(u"&Update profile")) - self.ok.SetDefault() - close = wx.Button(panel, wx.ID_CANCEL, _("&Close")) - sizer = wx.BoxSizer(wx.VERTICAL) - nameBox = wx.BoxSizer(wx.HORIZONTAL) - nameBox.Add(labelName, 0, wx.ALL, 5) - nameBox.Add(self.name, 0, wx.ALL, 5) - sizer.Add(nameBox, 0, wx.ALL, 5) - locationBox = wx.BoxSizer(wx.HORIZONTAL) - locationBox.Add(labelLocation, 0, wx.ALL, 5) - locationBox.Add(self.location, 0, wx.ALL, 5) - sizer.Add(locationBox, 0, wx.ALL, 5) - urlBox = wx.BoxSizer(wx.HORIZONTAL) - urlBox.Add(labelUrl, 0, wx.ALL, 5) - urlBox.Add(self.url, 0, wx.ALL, 5) - sizer.Add(urlBox, 0, wx.ALL, 5) - descriptionBox = wx.BoxSizer(wx.HORIZONTAL) - descriptionBox.Add(labelDescription, 0, wx.ALL, 5) - descriptionBox.Add(self.description, 0, wx.ALL, 5) - sizer.Add(descriptionBox, 0, wx.ALL, 5) - sizer.Add(self.upload_image, 5, wx.CENTER, 5) - btnBox = wx.BoxSizer(wx.HORIZONTAL) - btnBox.Add(self.ok, 0, wx.ALL, 5) - btnBox.Add(close, 0, wx.ALL, 5) - sizer.Add(btnBox, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self): + super(updateProfileDialog, self).__init__(parent=None, id=-1) + self.SetTitle(_(u"Update your profile")) + panel = wx.Panel(self) + labelName = wx.StaticText(panel, -1, _(u"&Name (50 characters maximum)")) + self.name = wx.TextCtrl(panel, -1) + self.name.SetFocus() + dc = wx.WindowDC(self.name) + dc.SetFont(self.name.GetFont()) + self.name.SetSize(dc.GetTextExtent("0"*50)) + labelLocation = wx.StaticText(panel, -1, _(u"&Location")) + self.location = wx.TextCtrl(panel, -1) + dc = wx.WindowDC(self.location) + dc.SetFont(self.location.GetFont()) + self.location.SetSize(dc.GetTextExtent("0"*35)) + labelUrl = wx.StaticText(panel, -1, _(u"&Website")) + self.url = wx.TextCtrl(panel, -1) + dc = wx.WindowDC(self.url) + dc.SetFont(self.url.GetFont()) + self.url.SetSize(dc.GetTextExtent("0"*22)) + labelDescription = wx.StaticText(panel, -1, _(u"&Bio (160 characters maximum)")) + self.description = wx.TextCtrl(panel, -1, size=(400, 400)) + dc = wx.WindowDC(self.description) + dc.SetFont(self.description.GetFont()) + self.description.SetSize(dc.GetTextExtent("0"*160)) + self.image = None + self.upload_image = wx.Button(panel, -1, _(u"Upload a &picture")) + self.ok = wx.Button(panel, wx.ID_OK, _(u"&Update profile")) + self.ok.SetDefault() + close = wx.Button(panel, wx.ID_CANCEL, _("&Close")) + sizer = wx.BoxSizer(wx.VERTICAL) + nameBox = wx.BoxSizer(wx.HORIZONTAL) + nameBox.Add(labelName, 0, wx.ALL, 5) + nameBox.Add(self.name, 0, wx.ALL, 5) + sizer.Add(nameBox, 0, wx.ALL, 5) + locationBox = wx.BoxSizer(wx.HORIZONTAL) + locationBox.Add(labelLocation, 0, wx.ALL, 5) + locationBox.Add(self.location, 0, wx.ALL, 5) + sizer.Add(locationBox, 0, wx.ALL, 5) + urlBox = wx.BoxSizer(wx.HORIZONTAL) + urlBox.Add(labelUrl, 0, wx.ALL, 5) + urlBox.Add(self.url, 0, wx.ALL, 5) + sizer.Add(urlBox, 0, wx.ALL, 5) + descriptionBox = wx.BoxSizer(wx.HORIZONTAL) + descriptionBox.Add(labelDescription, 0, wx.ALL, 5) + descriptionBox.Add(self.description, 0, wx.ALL, 5) + sizer.Add(descriptionBox, 0, wx.ALL, 5) + sizer.Add(self.upload_image, 5, wx.CENTER, 5) + btnBox = wx.BoxSizer(wx.HORIZONTAL) + btnBox.Add(self.ok, 0, wx.ALL, 5) + btnBox.Add(close, 0, wx.ALL, 5) + sizer.Add(btnBox, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def set_name(self, name): - self.set("name", name) + def set_name(self, name): + self.set("name", name) - def set_description(self, description): - self.set("description", description) + def set_description(self, description): + self.set("description", description) - def set_location(self, location): - self.set("location", location) + def set_location(self, location): + self.set("location", location) - def set_url(self, url): - self.set("url", url) + def set_url(self, url): + self.set("url", url) - def change_upload_button(self, uploaded=False): - if uploaded == False: - self.upload_image.SetLabel(_(u"Upload a picture")) - else: - self.upload_image.SetLabel(_(u"Discard image")) + def change_upload_button(self, uploaded=False): + if uploaded == False: + self.upload_image.SetLabel(_(u"Upload a picture")) + else: + self.upload_image.SetLabel(_(u"Discard image")) - def upload_picture(self): - openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) - if openFileDialog.ShowModal() == wx.ID_CANCEL: - return None - return openFileDialog.GetPath() + def upload_picture(self): + openFileDialog = wx.FileDialog(self, _(u"Select the picture to be uploaded"), "", "", _("Image files (*.png, *.jpg, *.gif)|*.png; *.jpg; *.gif"), wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + if openFileDialog.ShowModal() == wx.ID_CANCEL: + return None + return openFileDialog.GetPath() - def hide_upload_button(self, hide): - self.upload_image.Enable(hide) + def hide_upload_button(self, hide): + self.upload_image.Enable(hide) - def set_readonly(self): - self.name.style = wx.TE_READONLY - self.name.Refresh() - self.description.style = wx.TE_READONLY - self.description.Refresh() - self.location.style = wx.TE_READONLY - self.location.Refresh() - self.url.style = wx.TE_READONLY - self.url.Refresh() - self.hide_upload_button(False) - self.ok.Enable(False) \ No newline at end of file + def set_readonly(self): + self.name.style = wx.TE_READONLY + self.name.Refresh() + self.description.style = wx.TE_READONLY + self.description.Refresh() + self.location.style = wx.TE_READONLY + self.location.Refresh() + self.url.style = wx.TE_READONLY + self.url.Refresh() + self.hide_upload_button(False) + self.ok.Enable(False) diff --git a/src/wxUI/dialogs/urlList.py b/src/wxUI/dialogs/urlList.py index 16012f57..f8bdd7da 100644 --- a/src/wxUI/dialogs/urlList.py +++ b/src/wxUI/dialogs/urlList.py @@ -3,34 +3,34 @@ from __future__ import unicode_literals import wx class urlList(wx.Dialog): - def __init__(self, title=_(u"Select URL")): - super(urlList, self).__init__(parent=None, title=title) - panel = wx.Panel(self) - self.lista = wx.ListBox(panel, -1) - self.lista.SetFocus() - self.lista.SetSize(self.lista.GetBestSize()) - sizer = wx.BoxSizer(wx.VERTICAL) - sizer.Add(self.lista, 0, wx.ALL, 5) - goBtn = wx.Button(panel, wx.ID_OK) - goBtn.SetDefault() - cancelBtn = wx.Button(panel, wx.ID_CANCEL) - btnSizer = wx.BoxSizer() - btnSizer.Add(goBtn, 0, wx.ALL, 5) - btnSizer.Add(cancelBtn, 0, wx.ALL, 5) - sizer.Add(btnSizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + def __init__(self, title=_(u"Select URL")): + super(urlList, self).__init__(parent=None, title=title) + panel = wx.Panel(self) + self.lista = wx.ListBox(panel, -1) + self.lista.SetFocus() + self.lista.SetSize(self.lista.GetBestSize()) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.lista, 0, wx.ALL, 5) + goBtn = wx.Button(panel, wx.ID_OK) + goBtn.SetDefault() + cancelBtn = wx.Button(panel, wx.ID_CANCEL) + btnSizer = wx.BoxSizer() + btnSizer.Add(goBtn, 0, wx.ALL, 5) + btnSizer.Add(cancelBtn, 0, wx.ALL, 5) + sizer.Add(btnSizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def populate_list(self, urls): - for i in urls: - self.lista.Append(i) - self.lista.SetSelection(0) + def populate_list(self, urls): + for i in urls: + self.lista.Append(i) + self.lista.SetSelection(0) - def get_string(self): - return self.lista.GetStringSelection() + def get_string(self): + return self.lista.GetStringSelection() - def get_item(self): - return self.lista.GetSelection() + def get_item(self): + return self.lista.GetSelection() - def get_response(self): - return self.ShowModal() \ No newline at end of file + def get_response(self): + return self.ShowModal() diff --git a/src/wxUI/dialogs/userActions.py b/src/wxUI/dialogs/userActions.py index c60f24bf..629d02aa 100644 --- a/src/wxUI/dialogs/userActions.py +++ b/src/wxUI/dialogs/userActions.py @@ -3,88 +3,88 @@ from __future__ import unicode_literals import wx class UserActionsDialog(wx.Dialog): - def __init__(self, users=[], default="follow", *args, **kwargs): - super(UserActionsDialog, self).__init__(parent=None, *args, **kwargs) - panel = wx.Panel(self) - userSizer = wx.BoxSizer() - self.SetTitle(_(u"Action")) - userLabel = wx.StaticText(panel, -1, _(u"&User")) - self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0]) - self.cb.SetFocus() - self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) - userSizer.Add(userLabel, 0, wx.ALL, 5) - userSizer.Add(self.cb, 0, wx.ALL, 5) - userSizer.Add(self.autocompletion, 0, wx.ALL, 5) - actionSizer = wx.BoxSizer(wx.VERTICAL) - label2 = wx.StaticText(panel, -1, _(u"Action")) - self.follow = wx.RadioButton(panel, -1, _(u"&Follow"), name=_(u"Action"), style=wx.RB_GROUP) - self.unfollow = wx.RadioButton(panel, -1, _(u"U&nfollow")) - self.mute = wx.RadioButton(panel, -1, _(u"&Mute")) - self.unmute = wx.RadioButton(panel, -1, _(u"Unmu&te")) - self.block = wx.RadioButton(panel, -1, _(u"&Block")) - self.unblock = wx.RadioButton(panel, -1, _(u"Unbl&ock")) - self.reportSpam = wx.RadioButton(panel, -1, _(u"&Report as spam")) - self.ignore_client = wx.RadioButton(panel, -1, _(u"&Ignore tweets from this client")) - self.setup_default(default) - hSizer = wx.BoxSizer(wx.HORIZONTAL) - hSizer.Add(label2, 0, wx.ALL, 5) - actionSizer.Add(self.follow, 0, wx.ALL, 5) - actionSizer.Add(self.unfollow, 0, wx.ALL, 5) - actionSizer.Add(self.mute, 0, wx.ALL, 5) - actionSizer.Add(self.unmute, 0, wx.ALL, 5) - actionSizer.Add(self.block, 0, wx.ALL, 5) - actionSizer.Add(self.unblock, 0, wx.ALL, 5) - actionSizer.Add(self.reportSpam, 0, wx.ALL, 5) - actionSizer.Add(self.ignore_client, 0, wx.ALL, 5) - hSizer.Add(actionSizer, 0, wx.ALL, 5) - sizer = wx.BoxSizer(wx.VERTICAL) - ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok) - btnsizer.Add(cancel) - sizer.Add(userSizer) - sizer.Add(hSizer, 0, wx.ALL, 5) - sizer.Add(btnsizer) - panel.SetSizer(sizer) + def __init__(self, users=[], default="follow", *args, **kwargs): + super(UserActionsDialog, self).__init__(parent=None, *args, **kwargs) + panel = wx.Panel(self) + userSizer = wx.BoxSizer() + self.SetTitle(_(u"Action")) + userLabel = wx.StaticText(panel, -1, _(u"&User")) + self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0]) + self.cb.SetFocus() + self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) + userSizer.Add(userLabel, 0, wx.ALL, 5) + userSizer.Add(self.cb, 0, wx.ALL, 5) + userSizer.Add(self.autocompletion, 0, wx.ALL, 5) + actionSizer = wx.BoxSizer(wx.VERTICAL) + label2 = wx.StaticText(panel, -1, _(u"Action")) + self.follow = wx.RadioButton(panel, -1, _(u"&Follow"), name=_(u"Action"), style=wx.RB_GROUP) + self.unfollow = wx.RadioButton(panel, -1, _(u"U&nfollow")) + self.mute = wx.RadioButton(panel, -1, _(u"&Mute")) + self.unmute = wx.RadioButton(panel, -1, _(u"Unmu&te")) + self.block = wx.RadioButton(panel, -1, _(u"&Block")) + self.unblock = wx.RadioButton(panel, -1, _(u"Unbl&ock")) + self.reportSpam = wx.RadioButton(panel, -1, _(u"&Report as spam")) + self.ignore_client = wx.RadioButton(panel, -1, _(u"&Ignore tweets from this client")) + self.setup_default(default) + hSizer = wx.BoxSizer(wx.HORIZONTAL) + hSizer.Add(label2, 0, wx.ALL, 5) + actionSizer.Add(self.follow, 0, wx.ALL, 5) + actionSizer.Add(self.unfollow, 0, wx.ALL, 5) + actionSizer.Add(self.mute, 0, wx.ALL, 5) + actionSizer.Add(self.unmute, 0, wx.ALL, 5) + actionSizer.Add(self.block, 0, wx.ALL, 5) + actionSizer.Add(self.unblock, 0, wx.ALL, 5) + actionSizer.Add(self.reportSpam, 0, wx.ALL, 5) + actionSizer.Add(self.ignore_client, 0, wx.ALL, 5) + hSizer.Add(actionSizer, 0, wx.ALL, 5) + sizer = wx.BoxSizer(wx.VERTICAL) + ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok) + btnsizer.Add(cancel) + sizer.Add(userSizer) + sizer.Add(hSizer, 0, wx.ALL, 5) + sizer.Add(btnsizer) + panel.SetSizer(sizer) - def get_action(self): - if self.follow.GetValue() == True: return "follow" - elif self.unfollow.GetValue() == True: return "unfollow" - elif self.mute.GetValue() == True: return "mute" - elif self.unmute.GetValue() == True: return "unmute" - elif self.reportSpam.GetValue() == True: return "report" - elif self.block.GetValue() == True: return "block" - elif self.unblock.GetValue() == True: return "unblock" - elif self.ignore_client.GetValue() == True: return "ignore_client" + def get_action(self): + if self.follow.GetValue() == True: return "follow" + elif self.unfollow.GetValue() == True: return "unfollow" + elif self.mute.GetValue() == True: return "mute" + elif self.unmute.GetValue() == True: return "unmute" + elif self.reportSpam.GetValue() == True: return "report" + elif self.block.GetValue() == True: return "block" + elif self.unblock.GetValue() == True: return "unblock" + elif self.ignore_client.GetValue() == True: return "ignore_client" - def setup_default(self, default): - if default == "follow": - self.follow.SetValue(True) - elif default == "unfollow": - self.unfollow.SetValue(True) - elif default == "mute": - self.mute.SetValue(True) - elif default == "unmute": - self.unmute.SetValue(True) - elif default == "report": - self.reportSpam.SetValue(True) - elif default == "block": - self.block.SetValue(True) - elif default == "unblock": - self.unblock.SetValue(True) - elif default == "ignore_client": - self.ignore_client.SetValue(True) + def setup_default(self, default): + if default == "follow": + self.follow.SetValue(True) + elif default == "unfollow": + self.unfollow.SetValue(True) + elif default == "mute": + self.mute.SetValue(True) + elif default == "unmute": + self.unmute.SetValue(True) + elif default == "report": + self.reportSpam.SetValue(True) + elif default == "block": + self.block.SetValue(True) + elif default == "unblock": + self.unblock.SetValue(True) + elif default == "ignore_client": + self.ignore_client.SetValue(True) - def get_response(self): - return self.ShowModal() + def get_response(self): + return self.ShowModal() - def get_user(self): - return self.cb.GetValue() + def get_user(self): + return self.cb.GetValue() - def get_position(self): - return self.cb.GetPosition() + def get_position(self): + return self.cb.GetPosition() - def popup_menu(self, menu): - self.PopupMenu(menu, self.cb.GetPosition()) + def popup_menu(self, menu): + self.PopupMenu(menu, self.cb.GetPosition()) diff --git a/src/wxUI/dialogs/userSelection.py b/src/wxUI/dialogs/userSelection.py index 30dc67d3..bb110910 100644 --- a/src/wxUI/dialogs/userSelection.py +++ b/src/wxUI/dialogs/userSelection.py @@ -3,64 +3,64 @@ from __future__ import unicode_literals import wx class selectUserDialog(wx.Dialog): - def __init__(self, users=[], default="tweets", *args, **kwargs): - super(selectUserDialog, self).__init__(parent=None, *args, **kwargs) - panel = wx.Panel(self) - userSizer = wx.BoxSizer() - self.SetTitle(_(u"Timeline for %s") % (users[0])) - userLabel = wx.StaticText(panel, -1, _(u"User")) - self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0]) - self.cb.SetFocus() - self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) - userSizer.Add(userLabel, 0, wx.ALL, 5) - userSizer.Add(self.cb, 0, wx.ALL, 5) - userSizer.Add(self.autocompletion, 0, wx.ALL, 5) - actionSizer = wx.BoxSizer(wx.VERTICAL) - label2 = wx.StaticText(panel, -1, _(u"Buffer type")) - self.tweets = wx.RadioButton(panel, -1, _(u"&Tweets"), style=wx.RB_GROUP) - self.favourites = wx.RadioButton(panel, -1, _(u"&Likes")) - self.followers = wx.RadioButton(panel, -1, _(u"&Followers")) - self.friends = wx.RadioButton(panel, -1, _(u"F&riends")) - self.setup_default(default) - hSizer = wx.BoxSizer(wx.HORIZONTAL) - hSizer.Add(label2, 0, wx.ALL, 5) - actionSizer.Add(self.tweets, 0, wx.ALL, 5) - actionSizer.Add(self.favourites, 0, wx.ALL, 5) - actionSizer.Add(self.followers, 0, wx.ALL, 5) - actionSizer.Add(self.friends, 0, wx.ALL, 5) - hSizer.Add(actionSizer, 0, wx.ALL, 5) - sizer = wx.BoxSizer(wx.VERTICAL) - ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) - ok.SetDefault() - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok) - btnsizer.Add(cancel) - sizer.Add(userSizer) - sizer.Add(hSizer, 0, wx.ALL, 5) - sizer.Add(btnsizer) - panel.SetSizer(sizer) + def __init__(self, users=[], default="tweets", *args, **kwargs): + super(selectUserDialog, self).__init__(parent=None, *args, **kwargs) + panel = wx.Panel(self) + userSizer = wx.BoxSizer() + self.SetTitle(_(u"Timeline for %s") % (users[0])) + userLabel = wx.StaticText(panel, -1, _(u"User")) + self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0]) + self.cb.SetFocus() + self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) + userSizer.Add(userLabel, 0, wx.ALL, 5) + userSizer.Add(self.cb, 0, wx.ALL, 5) + userSizer.Add(self.autocompletion, 0, wx.ALL, 5) + actionSizer = wx.BoxSizer(wx.VERTICAL) + label2 = wx.StaticText(panel, -1, _(u"Buffer type")) + self.tweets = wx.RadioButton(panel, -1, _(u"&Tweets"), style=wx.RB_GROUP) + self.favourites = wx.RadioButton(panel, -1, _(u"&Likes")) + self.followers = wx.RadioButton(panel, -1, _(u"&Followers")) + self.friends = wx.RadioButton(panel, -1, _(u"F&riends")) + self.setup_default(default) + hSizer = wx.BoxSizer(wx.HORIZONTAL) + hSizer.Add(label2, 0, wx.ALL, 5) + actionSizer.Add(self.tweets, 0, wx.ALL, 5) + actionSizer.Add(self.favourites, 0, wx.ALL, 5) + actionSizer.Add(self.followers, 0, wx.ALL, 5) + actionSizer.Add(self.friends, 0, wx.ALL, 5) + hSizer.Add(actionSizer, 0, wx.ALL, 5) + sizer = wx.BoxSizer(wx.VERTICAL) + ok = wx.Button(panel, wx.ID_OK, _(u"&OK")) + ok.SetDefault() + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"&Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok) + btnsizer.Add(cancel) + sizer.Add(userSizer) + sizer.Add(hSizer, 0, wx.ALL, 5) + sizer.Add(btnsizer) + panel.SetSizer(sizer) - def get_action(self): - if self.tweets.GetValue() == True: return "tweets" - elif self.favourites.GetValue() == True: return "favourites" - elif self.followers.GetValue() == True: return "followers" - elif self.friends.GetValue() == True: return "friends" + def get_action(self): + if self.tweets.GetValue() == True: return "tweets" + elif self.favourites.GetValue() == True: return "favourites" + elif self.followers.GetValue() == True: return "followers" + elif self.friends.GetValue() == True: return "friends" - def setup_default(self, default): - if default == "tweets": - self.tweets.SetValue(True) - elif default == "favourites": - self.favourites.SetValue(True) + def setup_default(self, default): + if default == "tweets": + self.tweets.SetValue(True) + elif default == "favourites": + self.favourites.SetValue(True) - def get_response(self): - return self.ShowModal() + def get_response(self): + return self.ShowModal() - def get_user(self): - return self.cb.GetValue() + def get_user(self): + return self.cb.GetValue() - def get_position(self): - return self.cb.GetPosition() + def get_position(self): + return self.cb.GetPosition() - def popup_menu(self, menu): - self.PopupMenu(menu, self.cb.GetPosition()) + def popup_menu(self, menu): + self.PopupMenu(menu, self.cb.GetPosition()) diff --git a/src/wxUI/dialogs/utils.py b/src/wxUI/dialogs/utils.py index 36bdc8a8..8335d61d 100644 --- a/src/wxUI/dialogs/utils.py +++ b/src/wxUI/dialogs/utils.py @@ -22,29 +22,29 @@ import wx from . import baseDialog class selectUserDialog(baseDialog.BaseWXDialog): - def __init__(self, title, users): - super(selectUserDialog, self).__init__(parent=None, id=wx.ID_ANY, title=title) - panel = wx.Panel(self) - userSizer = wx.BoxSizer() - self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize) - self.cb.SetFocus() - self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) - userSizer.Add(wx.StaticText(panel, -1, _(u"User")), 0, wx.ALL, 5) - userSizer.Add(self.cb, 0, wx.ALL, 5) - userSizer.Add(self.autocompletion, 0, wx.ALL, 5) - sizer = wx.BoxSizer(wx.VERTICAL) - ok = wx.Button(panel, wx.ID_OK, _(u"OK")) - ok.SetDefault() + def __init__(self, title, users): + super(selectUserDialog, self).__init__(parent=None, id=wx.ID_ANY, title=title) + panel = wx.Panel(self) + userSizer = wx.BoxSizer() + self.cb = wx.ComboBox(panel, -1, choices=users, value=users[0], size=wx.DefaultSize) + self.cb.SetFocus() + self.autocompletion = wx.Button(panel, -1, _(u"&Autocomplete users")) + userSizer.Add(wx.StaticText(panel, -1, _(u"User")), 0, wx.ALL, 5) + userSizer.Add(self.cb, 0, wx.ALL, 5) + userSizer.Add(self.autocompletion, 0, wx.ALL, 5) + sizer = wx.BoxSizer(wx.VERTICAL) + ok = wx.Button(panel, wx.ID_OK, _(u"OK")) + ok.SetDefault() # ok.Bind(wx.EVT_BUTTON, self.onok) - cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) - btnsizer = wx.BoxSizer() - btnsizer.Add(ok, 0, wx.ALL, 5) - btnsizer.Add(cancel, 0, wx.ALL, 5) - sizer.Add(userSizer, 0, wx.ALL, 5) - sizer.Add(btnsizer, 0, wx.ALL, 5) - panel.SetSizer(sizer) - self.SetClientSize(sizer.CalcMin()) + cancel = wx.Button(panel, wx.ID_CANCEL, _(u"Close")) + btnsizer = wx.BoxSizer() + btnsizer.Add(ok, 0, wx.ALL, 5) + btnsizer.Add(cancel, 0, wx.ALL, 5) + sizer.Add(userSizer, 0, wx.ALL, 5) + sizer.Add(btnsizer, 0, wx.ALL, 5) + panel.SetSizer(sizer) + self.SetClientSize(sizer.CalcMin()) - def get_user(self): - return self.cb.GetValue() + def get_user(self): + return self.cb.GetValue() diff --git a/src/wxUI/menus.py b/src/wxUI/menus.py index 70fbd7fa..9f2defed 100644 --- a/src/wxUI/menus.py +++ b/src/wxUI/menus.py @@ -3,102 +3,102 @@ from __future__ import unicode_literals import wx class basePanelMenu(wx.Menu): - def __init__(self): - super(basePanelMenu, self).__init__() - self.retweet = wx.MenuItem(self, wx.ID_ANY, _(u"&Retweet")) - self.Append(self.retweet) - self.reply = wx.MenuItem(self, wx.ID_ANY, _(u"Re&ply")) - self.Append(self.reply) - self.fav = wx.MenuItem(self, wx.ID_ANY, _(u"&Like")) - self.Append(self.fav) - self.unfav = wx.MenuItem(self, wx.ID_ANY, _(u"&Unlike")) - self.Append(self.unfav) - self.openUrl = wx.MenuItem(self, wx.ID_ANY, _(u"&Open URL")) - self.Append(self.openUrl) - self.openInBrowser = wx.MenuItem(self, wx.ID_ANY, _(u"&Open in Twitter")) - self.Append(self.openInBrowser) - self.play = wx.MenuItem(self, wx.ID_ANY, _(u"&Play audio")) - self.Append(self.play) - self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show tweet")) - self.Append(self.view) - self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) - self.Append(self.copy) - self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) - self.Append(self.remove) - self.userActions = wx.MenuItem(self, wx.ID_ANY, _(u"&User actions...")) - self.Append(self.userActions) + def __init__(self): + super(basePanelMenu, self).__init__() + self.retweet = wx.MenuItem(self, wx.ID_ANY, _(u"&Retweet")) + self.Append(self.retweet) + self.reply = wx.MenuItem(self, wx.ID_ANY, _(u"Re&ply")) + self.Append(self.reply) + self.fav = wx.MenuItem(self, wx.ID_ANY, _(u"&Like")) + self.Append(self.fav) + self.unfav = wx.MenuItem(self, wx.ID_ANY, _(u"&Unlike")) + self.Append(self.unfav) + self.openUrl = wx.MenuItem(self, wx.ID_ANY, _(u"&Open URL")) + self.Append(self.openUrl) + self.openInBrowser = wx.MenuItem(self, wx.ID_ANY, _(u"&Open in Twitter")) + self.Append(self.openInBrowser) + self.play = wx.MenuItem(self, wx.ID_ANY, _(u"&Play audio")) + self.Append(self.play) + self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show tweet")) + self.Append(self.view) + self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) + self.Append(self.copy) + self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) + self.Append(self.remove) + self.userActions = wx.MenuItem(self, wx.ID_ANY, _(u"&User actions...")) + self.Append(self.userActions) class dmPanelMenu(wx.Menu): - def __init__(self): - super(dmPanelMenu, self).__init__() - self.reply = wx.MenuItem(self, wx.ID_ANY, _(u"Re&ply")) - self.Append(self.reply) - self.openUrl = wx.MenuItem(self, wx.ID_ANY, _(u"&Open URL")) - self.Append(self.openUrl) - self.play = wx.MenuItem(self, wx.ID_ANY, _(u"&Play audio")) - self.Append(self.play) - self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show direct message")) - self.Append(self.view) - self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) - self.Append(self.copy) - self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) - self.Append(self.remove) - self.userActions = wx.MenuItem(self, wx.ID_ANY, _(u"&User actions...")) - self.Append(self.userActions) + def __init__(self): + super(dmPanelMenu, self).__init__() + self.reply = wx.MenuItem(self, wx.ID_ANY, _(u"Re&ply")) + self.Append(self.reply) + self.openUrl = wx.MenuItem(self, wx.ID_ANY, _(u"&Open URL")) + self.Append(self.openUrl) + self.play = wx.MenuItem(self, wx.ID_ANY, _(u"&Play audio")) + self.Append(self.play) + self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show direct message")) + self.Append(self.view) + self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) + self.Append(self.copy) + self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) + self.Append(self.remove) + self.userActions = wx.MenuItem(self, wx.ID_ANY, _(u"&User actions...")) + self.Append(self.userActions) class sentPanelMenu(wx.Menu): - def __init__(self): - super(sentPanelMenu, self).__init__() - self.openUrl = wx.MenuItem(self, wx.ID_ANY, _(u"&Open URL")) - self.Append(self.openUrl) - self.openInBrowser = wx.MenuItem(self, wx.ID_ANY, _(u"&Open in Twitter")) - self.Append(self.openInBrowser) - self.play = wx.MenuItem(self, wx.ID_ANY, _(u"&Play audio")) - self.Append(self.play) - self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show tweet")) - self.Append(self.view) - self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) - self.Append(self.copy) - self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) - self.Append(self.remove) + def __init__(self): + super(sentPanelMenu, self).__init__() + self.openUrl = wx.MenuItem(self, wx.ID_ANY, _(u"&Open URL")) + self.Append(self.openUrl) + self.openInBrowser = wx.MenuItem(self, wx.ID_ANY, _(u"&Open in Twitter")) + self.Append(self.openInBrowser) + self.play = wx.MenuItem(self, wx.ID_ANY, _(u"&Play audio")) + self.Append(self.play) + self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show tweet")) + self.Append(self.view) + self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) + self.Append(self.copy) + self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) + self.Append(self.remove) class eventsPanelMenu(wx.Menu): - def __init__(self): - super(eventsPanelMenu, self).__init__() - self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show event")) - self.Append(self.view) - self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) - self.Append(self.copy) - self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) - self.Append(self.remove) + def __init__(self): + super(eventsPanelMenu, self).__init__() + self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show event")) + self.Append(self.view) + self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) + self.Append(self.copy) + self.remove = wx.MenuItem(self, wx.ID_ANY, _(u"&Delete")) + self.Append(self.remove) class peoplePanelMenu(wx.Menu): - def __init__(self): - super(peoplePanelMenu, self).__init__() - self.reply = wx.MenuItem(self, wx.ID_ANY, _(u"Direct &message")) - self.Append(self.reply) - self.lists = wx.MenuItem(self, wx.ID_ANY, _(u"&View lists")) - self.Append(self.lists) - self.lists.Enable(False) - self.details = wx.MenuItem(self, wx.ID_ANY, _(u"Show user &profile")) - self.Append(self.details) - self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show user")) - self.Append(self.view) - self.openInBrowser = wx.MenuItem(self, wx.ID_ANY, _(u"&Open in Twitter")) - self.Append(self.openInBrowser) - self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) - self.Append(self.copy) - self.userActions = wx.MenuItem(self, wx.ID_ANY, _(u"&User actions...")) - self.Append(self.userActions) + def __init__(self): + super(peoplePanelMenu, self).__init__() + self.reply = wx.MenuItem(self, wx.ID_ANY, _(u"Direct &message")) + self.Append(self.reply) + self.lists = wx.MenuItem(self, wx.ID_ANY, _(u"&View lists")) + self.Append(self.lists) + self.lists.Enable(False) + self.details = wx.MenuItem(self, wx.ID_ANY, _(u"Show user &profile")) + self.Append(self.details) + self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show user")) + self.Append(self.view) + self.openInBrowser = wx.MenuItem(self, wx.ID_ANY, _(u"&Open in Twitter")) + self.Append(self.openInBrowser) + self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) + self.Append(self.copy) + self.userActions = wx.MenuItem(self, wx.ID_ANY, _(u"&User actions...")) + self.Append(self.userActions) class trendsPanelMenu(wx.Menu): - def __init__(self): - super(trendsPanelMenu, self).__init__() - self.search_topic = wx.MenuItem(self, wx.ID_ANY, _(u"Search topic")) - self.Append(self.search_topic) - self.tweetThisTrend = wx.MenuItem(self, wx.ID_ANY, _(u"&Tweet about this trend")) - self.Append(self.tweetThisTrend) - self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show item")) - self.Append(self.view) - self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) - self.Append(self.copy) + def __init__(self): + super(trendsPanelMenu, self).__init__() + self.search_topic = wx.MenuItem(self, wx.ID_ANY, _(u"Search topic")) + self.Append(self.search_topic) + self.tweetThisTrend = wx.MenuItem(self, wx.ID_ANY, _(u"&Tweet about this trend")) + self.Append(self.tweetThisTrend) + self.view = wx.MenuItem(self, wx.ID_ANY, _(u"&Show item")) + self.Append(self.view) + self.copy = wx.MenuItem(self, wx.ID_ANY, _(u"&Copy to clipboard")) + self.Append(self.copy) diff --git a/src/wxUI/sysTrayIcon.py b/src/wxUI/sysTrayIcon.py index 81efcd10..a408c35c 100644 --- a/src/wxUI/sysTrayIcon.py +++ b/src/wxUI/sysTrayIcon.py @@ -27,23 +27,23 @@ import os class SysTrayIcon(wx.adv.TaskBarIcon): - def __init__(self): - super(SysTrayIcon, self).__init__() - icon=wx.Icon(os.path.join(paths.app_path(), "icon.ico"), wx.BITMAP_TYPE_ICO) - self.SetIcon(icon, application.name) - self.menu=wx.Menu() - self.tweet = self.menu.Append(wx.ID_ANY, _(u"Tweet")) - self.global_settings = self.menu.Append(wx.ID_ANY, _(u"&Global settings")) - self.account_settings = self.menu.Append(wx.ID_ANY, _(u"Account se&ttings")) - self.update_profile = self.menu.Append(wx.ID_ANY, _(u"Update &profile")) - self.show_hide = self.menu.Append(wx.ID_ANY, _(u"&Show / hide")) - self.doc = self.menu.Append(wx.ID_ANY, _(u"&Documentation")) - self.check_for_updates = self.menu.Append(wx.ID_ANY, _(u"Check for &updates")) - self.exit = self.menu.Append(wx.ID_ANY, _(u"&Exit")) + def __init__(self): + super(SysTrayIcon, self).__init__() + icon=wx.Icon(os.path.join(paths.app_path(), "icon.ico"), wx.BITMAP_TYPE_ICO) + self.SetIcon(icon, application.name) + self.menu=wx.Menu() + self.tweet = self.menu.Append(wx.ID_ANY, _(u"Tweet")) + self.global_settings = self.menu.Append(wx.ID_ANY, _(u"&Global settings")) + self.account_settings = self.menu.Append(wx.ID_ANY, _(u"Account se&ttings")) + self.update_profile = self.menu.Append(wx.ID_ANY, _(u"Update &profile")) + self.show_hide = self.menu.Append(wx.ID_ANY, _(u"&Show / hide")) + self.doc = self.menu.Append(wx.ID_ANY, _(u"&Documentation")) + self.check_for_updates = self.menu.Append(wx.ID_ANY, _(u"Check for &updates")) + self.exit = self.menu.Append(wx.ID_ANY, _(u"&Exit")) - def show_menu(self): - self.PopupMenu(self.menu) + def show_menu(self): + self.PopupMenu(self.menu) - def Destroy(self): - self.menu.Destroy() - super(SysTrayIcon, self).Destroy() \ No newline at end of file + def Destroy(self): + self.menu.Destroy() + super(SysTrayIcon, self).Destroy() diff --git a/src/wxUI/view.py b/src/wxUI/view.py index 2729f6bf..cef105be 100644 --- a/src/wxUI/view.py +++ b/src/wxUI/view.py @@ -6,200 +6,200 @@ import wx.adv import application class mainFrame(wx.Frame): - """ Main class of the Frame. This is the Main Window.""" + """ Main class of the Frame. This is the Main Window.""" - ### MENU - def makeMenus(self): - """ Creates, bind and returns the menu bar for the application. Also in this function, the accel table is created.""" - menuBar = wx.MenuBar() + ### MENU + def makeMenus(self): + """ Creates, bind and returns the menu bar for the application. Also in this function, the accel table is created.""" + menuBar = wx.MenuBar() - # Application menu - app = wx.Menu() - self.manage_accounts = app.Append(wx.ID_ANY, _(u"&Manage accounts")) - self.updateProfile = app.Append(wx.ID_ANY, _(u"&Update profile")) - self.show_hide = app.Append(wx.ID_ANY, _(u"&Hide window")) - self.menuitem_search = app.Append(wx.ID_ANY, _(u"&Search")) - self.lists = app.Append(wx.ID_ANY, _(u"&Lists manager")) - self.keystroke_editor = app.Append(wx.ID_ANY, _(u"&Edit keystrokes")) - self.account_settings = app.Append(wx.ID_ANY, _(u"Account se&ttings")) - self.prefs = app.Append(wx.ID_PREFERENCES, _(u"&Global settings")) - self.close = app.Append(wx.ID_EXIT, _(u"E&xit")) + # Application menu + app = wx.Menu() + self.manage_accounts = app.Append(wx.ID_ANY, _(u"&Manage accounts")) + self.updateProfile = app.Append(wx.ID_ANY, _(u"&Update profile")) + self.show_hide = app.Append(wx.ID_ANY, _(u"&Hide window")) + self.menuitem_search = app.Append(wx.ID_ANY, _(u"&Search")) + self.lists = app.Append(wx.ID_ANY, _(u"&Lists manager")) + self.keystroke_editor = app.Append(wx.ID_ANY, _(u"&Edit keystrokes")) + self.account_settings = app.Append(wx.ID_ANY, _(u"Account se&ttings")) + self.prefs = app.Append(wx.ID_PREFERENCES, _(u"&Global settings")) + self.close = app.Append(wx.ID_EXIT, _(u"E&xit")) - # Tweet menu - tweet = wx.Menu() - self.compose = tweet.Append(wx.ID_ANY, _(u"&Tweet")) - self.reply = tweet.Append(wx.ID_ANY, _(u"Re&ply")) - self.retweet = tweet.Append(wx.ID_ANY, _(u"&Retweet")) - self.fav = tweet.Append(wx.ID_ANY, _(u"&Like")) - self.unfav = tweet.Append(wx.ID_ANY, _(u"&Unlike")) - self.view = tweet.Append(wx.ID_ANY, _(u"&Show tweet")) - self.view_coordinates = tweet.Append(wx.ID_ANY, _(u"View &address")) - self.view_conversation = tweet.Append(wx.ID_ANY, _(u"View conversa&tion")) - self.ocr = tweet.Append(wx.ID_ANY, _(u"Read text in picture")) - self.delete = tweet.Append(wx.ID_ANY, _(u"&Delete")) + # Tweet menu + tweet = wx.Menu() + self.compose = tweet.Append(wx.ID_ANY, _(u"&Tweet")) + self.reply = tweet.Append(wx.ID_ANY, _(u"Re&ply")) + self.retweet = tweet.Append(wx.ID_ANY, _(u"&Retweet")) + self.fav = tweet.Append(wx.ID_ANY, _(u"&Like")) + self.unfav = tweet.Append(wx.ID_ANY, _(u"&Unlike")) + self.view = tweet.Append(wx.ID_ANY, _(u"&Show tweet")) + self.view_coordinates = tweet.Append(wx.ID_ANY, _(u"View &address")) + self.view_conversation = tweet.Append(wx.ID_ANY, _(u"View conversa&tion")) + self.ocr = tweet.Append(wx.ID_ANY, _(u"Read text in picture")) + self.delete = tweet.Append(wx.ID_ANY, _(u"&Delete")) - # User menu - user = wx.Menu() - self.follow = user.Append(wx.ID_ANY, _(u"&Actions...")) - self.timeline = user.Append(wx.ID_ANY, _(u"&View timeline...")) - self.dm = user.Append(wx.ID_ANY, _(u"Direct me&ssage")) - self.addToList = user.Append(wx.ID_ANY, _(u"&Add to list")) - self.removeFromList = user.Append(wx.ID_ANY, _(u"R&emove from list")) - self.viewLists = user.Append(wx.ID_ANY, _(u"&View lists")) - self.details = user.Append(wx.ID_ANY, _(u"Show user &profile")) - self.favs = user.Append(wx.ID_ANY, _(u"V&iew likes")) + # User menu + user = wx.Menu() + self.follow = user.Append(wx.ID_ANY, _(u"&Actions...")) + self.timeline = user.Append(wx.ID_ANY, _(u"&View timeline...")) + self.dm = user.Append(wx.ID_ANY, _(u"Direct me&ssage")) + self.addToList = user.Append(wx.ID_ANY, _(u"&Add to list")) + self.removeFromList = user.Append(wx.ID_ANY, _(u"R&emove from list")) + self.viewLists = user.Append(wx.ID_ANY, _(u"&View lists")) + self.details = user.Append(wx.ID_ANY, _(u"Show user &profile")) + self.favs = user.Append(wx.ID_ANY, _(u"V&iew likes")) - # buffer menu - buffer = wx.Menu() - self.update_buffer = buffer.Append(wx.ID_ANY, _(u"&Update buffer")) - self.trends = buffer.Append(wx.ID_ANY, _(u"New &trending topics buffer...")) - self.filter = buffer.Append(wx.ID_ANY, _(u"Create a &filter")) - self.manage_filters = buffer.Append(wx.ID_ANY, _(u"&Manage filters")) - self.find = buffer.Append(wx.ID_ANY, _(u"Find a string in the currently focused buffer...")) - self.load_previous_items = buffer.Append(wx.ID_ANY, _(u"&Load previous items")) - buffer.AppendSeparator() - self.mute_buffer = buffer.AppendCheckItem(wx.ID_ANY, _(u"&Mute")) - self.autoread = buffer.AppendCheckItem(wx.ID_ANY, _(u"&Autoread")) - self.clear = buffer.Append(wx.ID_ANY, _(u"&Clear buffer")) - self.deleteTl = buffer.Append(wx.ID_ANY, _(u"&Destroy")) + # buffer menu + buffer = wx.Menu() + self.update_buffer = buffer.Append(wx.ID_ANY, _(u"&Update buffer")) + self.trends = buffer.Append(wx.ID_ANY, _(u"New &trending topics buffer...")) + self.filter = buffer.Append(wx.ID_ANY, _(u"Create a &filter")) + self.manage_filters = buffer.Append(wx.ID_ANY, _(u"&Manage filters")) + self.find = buffer.Append(wx.ID_ANY, _(u"Find a string in the currently focused buffer...")) + self.load_previous_items = buffer.Append(wx.ID_ANY, _(u"&Load previous items")) + buffer.AppendSeparator() + self.mute_buffer = buffer.AppendCheckItem(wx.ID_ANY, _(u"&Mute")) + self.autoread = buffer.AppendCheckItem(wx.ID_ANY, _(u"&Autoread")) + self.clear = buffer.Append(wx.ID_ANY, _(u"&Clear buffer")) + self.deleteTl = buffer.Append(wx.ID_ANY, _(u"&Destroy")) - # audio menu - audio = wx.Menu() - self.seekLeft = audio.Append(wx.ID_ANY, _(u"&Seek back 5 seconds")) - self.seekRight = audio.Append(wx.ID_ANY, _(u"&Seek forward 5 seconds")) + # audio menu + audio = wx.Menu() + self.seekLeft = audio.Append(wx.ID_ANY, _(u"&Seek back 5 seconds")) + self.seekRight = audio.Append(wx.ID_ANY, _(u"&Seek forward 5 seconds")) - # Help Menu - help = wx.Menu() - self.doc = help.Append(-1, _(u"&Documentation")) - self.sounds_tutorial = help.Append(wx.ID_ANY, _(u"Sounds &tutorial")) - self.changelog = help.Append(wx.ID_ANY, _(u"&What's new in this version?")) - self.check_for_updates = help.Append(wx.ID_ANY, _(u"&Check for updates")) - self.reportError = help.Append(wx.ID_ANY, _(u"&Report an error")) - self.visit_website = help.Append(-1, _(u"{0}'s &website").format(application.name,)) - self.get_soundpacks = help.Append(-1, _(u"Get soundpacks for TWBlue")) - self.about = help.Append(-1, _(u"About &{0}").format(application.name,)) + # Help Menu + help = wx.Menu() + self.doc = help.Append(-1, _(u"&Documentation")) + self.sounds_tutorial = help.Append(wx.ID_ANY, _(u"Sounds &tutorial")) + self.changelog = help.Append(wx.ID_ANY, _(u"&What's new in this version?")) + self.check_for_updates = help.Append(wx.ID_ANY, _(u"&Check for updates")) + self.reportError = help.Append(wx.ID_ANY, _(u"&Report an error")) + self.visit_website = help.Append(-1, _(u"{0}'s &website").format(application.name,)) + self.get_soundpacks = help.Append(-1, _(u"Get soundpacks for TWBlue")) + self.about = help.Append(-1, _(u"About &{0}").format(application.name,)) - # Add all to the menu Bar - menuBar.Append(app, _(u"&Application")) - menuBar.Append(tweet, _(u"&Tweet")) - menuBar.Append(user, _(u"&User")) - menuBar.Append(buffer, _(u"&Buffer")) - menuBar.Append(audio, _(u"&Audio")) - menuBar.Append(help, _(u"&Help")) + # Add all to the menu Bar + menuBar.Append(app, _(u"&Application")) + menuBar.Append(tweet, _(u"&Tweet")) + menuBar.Append(user, _(u"&User")) + menuBar.Append(buffer, _(u"&Buffer")) + menuBar.Append(audio, _(u"&Audio")) + menuBar.Append(help, _(u"&Help")) - self.accel_tbl = wx.AcceleratorTable([ -(wx.ACCEL_CTRL, ord('N'), self.compose.GetId()), -(wx.ACCEL_CTRL, ord('R'), self.reply.GetId()), -(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('R'), self.retweet.GetId()), -(wx.ACCEL_CTRL, ord('F'), self.fav.GetId()), -(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), self.unfav.GetId()), -(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('V'), self.view.GetId()), -(wx.ACCEL_CTRL, ord('D'), self.dm.GetId()), + self.accel_tbl = wx.AcceleratorTable([ + (wx.ACCEL_CTRL, ord('N'), self.compose.GetId()), + (wx.ACCEL_CTRL, ord('R'), self.reply.GetId()), + (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('R'), self.retweet.GetId()), + (wx.ACCEL_CTRL, ord('F'), self.fav.GetId()), + (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), self.unfav.GetId()), + (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('V'), self.view.GetId()), + (wx.ACCEL_CTRL, ord('D'), self.dm.GetId()), -(wx.ACCEL_CTRL, ord('Q'), self.close.GetId()), -(wx.ACCEL_CTRL, ord('S'), self.follow.GetId()), -(wx.ACCEL_CTRL, ord('I'), self.timeline.GetId()), -(wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('I'), self.deleteTl.GetId()), -(wx.ACCEL_CTRL, ord('M'), self.show_hide.GetId()), -(wx.ACCEL_CTRL, wx.WXK_LEFT, self.seekLeft.GetId()), -(wx.ACCEL_CTRL, ord('P'), self.updateProfile.GetId()), -(wx.ACCEL_CTRL, wx.WXK_RIGHT, self.seekRight.GetId()), -(wx.ACCEL_CTRL, ord(' '), self.seekLeft.GetId()), - ]) + (wx.ACCEL_CTRL, ord('Q'), self.close.GetId()), + (wx.ACCEL_CTRL, ord('S'), self.follow.GetId()), + (wx.ACCEL_CTRL, ord('I'), self.timeline.GetId()), + (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('I'), self.deleteTl.GetId()), + (wx.ACCEL_CTRL, ord('M'), self.show_hide.GetId()), + (wx.ACCEL_CTRL, wx.WXK_LEFT, self.seekLeft.GetId()), + (wx.ACCEL_CTRL, ord('P'), self.updateProfile.GetId()), + (wx.ACCEL_CTRL, wx.WXK_RIGHT, self.seekRight.GetId()), + (wx.ACCEL_CTRL, ord(' '), self.seekLeft.GetId()), + ]) - self.SetAcceleratorTable(self.accel_tbl) - return menuBar + self.SetAcceleratorTable(self.accel_tbl) + return menuBar - ### MAIN - def __init__(self): - """ Main function of this class.""" - super(mainFrame, self).__init__(None, -1, application.name, size=(1600, 1600)) - self.panel = wx.Panel(self) - self.sizer = wx.BoxSizer(wx.VERTICAL) - self.SetTitle(application.name) - self.SetMenuBar(self.makeMenus()) - self.nb = wx.Treebook(self.panel, wx.ID_ANY) - self.buffers = {} + ### MAIN + def __init__(self): + """ Main function of this class.""" + super(mainFrame, self).__init__(None, -1, application.name, size=(1600, 1600)) + self.panel = wx.Panel(self) + self.sizer = wx.BoxSizer(wx.VERTICAL) + self.SetTitle(application.name) + self.SetMenuBar(self.makeMenus()) + self.nb = wx.Treebook(self.panel, wx.ID_ANY) + self.buffers = {} - def get_buffer_count(self): - return self.nb.GetPageCount() + def get_buffer_count(self): + return self.nb.GetPageCount() - def add_buffer(self, buffer, name): - self.nb.AddPage(buffer, name) - self.buffers[name] = buffer.GetId() + def add_buffer(self, buffer, name): + self.nb.AddPage(buffer, name) + self.buffers[name] = buffer.GetId() - def insert_buffer(self, buffer, name, pos): - self.nb.InsertSubPage(pos, buffer, name) - self.buffers[name] = buffer.GetId() + def insert_buffer(self, buffer, name, pos): + self.nb.InsertSubPage(pos, buffer, name) + self.buffers[name] = buffer.GetId() - def prepare(self): - self.sizer.Add(self.nb, 0, wx.ALL, 5) - self.panel.SetSizer(self.sizer) + def prepare(self): + self.sizer.Add(self.nb, 0, wx.ALL, 5) + self.panel.SetSizer(self.sizer) # self.Maximize() - self.sizer.Layout() - self.SetClientSize(self.sizer.CalcMin()) + self.sizer.Layout() + self.SetClientSize(self.sizer.CalcMin()) # print self.GetSize() - def get_buffers(self): - return [self.nb.GetPage(i) for i in range(0, self.nb.GetPageCount())] + def get_buffers(self): + return [self.nb.GetPage(i) for i in range(0, self.nb.GetPageCount())] - def search(self, name_, account): - for i in range(0, self.nb.GetPageCount()): - if self.nb.GetPage(i).name == name_ and self.nb.GetPage(i).account == account: return i + def search(self, name_, account): + for i in range(0, self.nb.GetPageCount()): + if self.nb.GetPage(i).name == name_ and self.nb.GetPage(i).account == account: return i - def get_current_buffer(self): - return self.nb.GetCurrentPage() + def get_current_buffer(self): + return self.nb.GetCurrentPage() - def get_current_buffer_pos(self): - return self.nb.GetSelection() + def get_current_buffer_pos(self): + return self.nb.GetSelection() - def get_buffer(self, pos): - return self.GetPage(pos) + def get_buffer(self, pos): + return self.GetPage(pos) - def change_buffer(self, position): - self.nb.ChangeSelection(position) + def change_buffer(self, position): + self.nb.ChangeSelection(position) - def get_buffer_text(self): - return self.nb.GetPageText(self.nb.GetSelection()) + def get_buffer_text(self): + return self.nb.GetPageText(self.nb.GetSelection()) - def get_buffer_by_id(self, id): - return self.nb.FindWindowById(id) - def advance_selection(self, forward): - self.nb.AdvanceSelection(forward) + def get_buffer_by_id(self, id): + return self.nb.FindWindowById(id) + def advance_selection(self, forward): + self.nb.AdvanceSelection(forward) - def show(self): - self.Show() + def show(self): + self.Show() - def show_address(self, address): - wx.MessageDialog(self, address, _(u"Address"), wx.OK).ShowModal() + def show_address(self, address): + wx.MessageDialog(self, address, _(u"Address"), wx.OK).ShowModal() - def delete_buffer(self, pos): - self.nb.DeletePage(pos) + def delete_buffer(self, pos): + self.nb.DeletePage(pos) - def about_dialog(self): - info = wx.adv.AboutDialogInfo() - info.SetName(application.name) - info.SetVersion(application.version) - info.SetDescription(application.description) - info.SetCopyright(application.copyright) - info.SetTranslators(application.translators) + def about_dialog(self): + info = wx.adv.AboutDialogInfo() + info.SetName(application.name) + info.SetVersion(application.version) + info.SetDescription(application.description) + info.SetCopyright(application.copyright) + info.SetTranslators(application.translators) # info.SetLicence(application.licence) - for i in application.authors: - info.AddDeveloper(i) - wx.adv.AboutBox(info) + for i in application.authors: + info.AddDeveloper(i) + wx.adv.AboutBox(info) - def set_focus(self): - self.SetFocus() + def set_focus(self): + self.SetFocus() - def check_menuitem(self, menuitem, check=True): - if hasattr(self, menuitem): - getattr(self, menuitem).Check(check) + def check_menuitem(self, menuitem, check=True): + if hasattr(self, menuitem): + getattr(self, menuitem).Check(check) - def set_page_title(self, page, title): - return self.nb.SetPageText(page, title) + def set_page_title(self, page, title): + return self.nb.SetPageText(page, title) - def get_page_title(self, page): - return self.nb.GetPageText(page) + def get_page_title(self, page): + return self.nb.GetPageText(page) def no_update_available(): - wx.MessageDialog(None, _(u"Your {0} version is up to date").format(application.name,), _(u"Update"), style=wx.OK).ShowModal() + wx.MessageDialog(None, _(u"Your {0} version is up to date").format(application.name,), _(u"Update"), style=wx.OK).ShowModal()