mirror of
https://github.com/MCV-Software/TWBlue.git
synced 2024-11-22 19:28:09 -06:00
Sound object refactored, more invisible shorcuts, global configuration and fixed buffer navigation in invisible mode
This commit is contained in:
parent
7b1f2f9482
commit
c25412bd32
1
.gitignore
vendored
1
.gitignore
vendored
@ -10,6 +10,7 @@ src/config3/
|
|||||||
src/dropbox/
|
src/dropbox/
|
||||||
src/logs/
|
src/logs/
|
||||||
src/documentation/
|
src/documentation/
|
||||||
|
src/sounds/iOs
|
||||||
src/oggenc2.exe
|
src/oggenc2.exe
|
||||||
src/bootstrap.exe
|
src/bootstrap.exe
|
||||||
src/Microsoft.VC90.CRT
|
src/Microsoft.VC90.CRT
|
||||||
|
@ -13,6 +13,11 @@ time_to_check_streams = integer(default=30)
|
|||||||
announce_stream_status = boolean(default=True)
|
announce_stream_status = boolean(default=True)
|
||||||
|
|
||||||
[sound]
|
[sound]
|
||||||
|
volume = float(default=1.0)
|
||||||
|
input_device = string(default="Default")
|
||||||
|
output_device = string(default="Default")
|
||||||
|
global_mute = boolean(default=False)
|
||||||
|
current_soundpack = string(default="default")
|
||||||
sndup_api_key = string(default="")
|
sndup_api_key = string(default="")
|
||||||
|
|
||||||
[other_buffers]
|
[other_buffers]
|
||||||
|
@ -7,11 +7,6 @@ ignored_sessions = list(default=list())
|
|||||||
language = string(default="system")
|
language = string(default="system")
|
||||||
hide_gui = boolean(default=False)
|
hide_gui = boolean(default=False)
|
||||||
voice_enabled = boolean(default=False)
|
voice_enabled = boolean(default=False)
|
||||||
volume = float(default=1.0)
|
|
||||||
input_device = string(default="Default")
|
|
||||||
output_device = string(default="Default")
|
|
||||||
global_mute = boolean(default=False)
|
|
||||||
current_soundpack = string(default="default")
|
|
||||||
ask_at_exit = boolean(default=True)
|
ask_at_exit = boolean(default=True)
|
||||||
use_invisible_keyboard_shorcuts = boolean(default=False)
|
use_invisible_keyboard_shorcuts = boolean(default=False)
|
||||||
|
|
||||||
|
@ -44,24 +44,24 @@ class bufferController(object):
|
|||||||
#pass
|
#pass
|
||||||
|
|
||||||
def volume_down(self):
|
def volume_down(self):
|
||||||
if config.app["app-settings"]["volume"] > 0.0:
|
if self.session.settings["sound"]["volume"] > 0.0:
|
||||||
if config.app["app-settings"]["volume"] <= 0.05:
|
if self.session.settings["sound"]["volume"] <= 0.05:
|
||||||
config.app["app-settings"]["volume"] = 0.0
|
self.session.settings["sound"]["volume"] = 0.0
|
||||||
else:
|
else:
|
||||||
config.app["app-settings"]["volume"] -=0.05
|
self.session.settings["sound"]["volume"] -=0.05
|
||||||
if hasattr(sound.URLStream, "stream"):
|
if hasattr(sound.URLStream, "stream"):
|
||||||
sound.URLStream.stream.volume = config.app["app-settings"]["volume"]
|
sound.URLStream.stream.volume = self.session.settings["sound"]["volume"]
|
||||||
sound.player.play("volume_changed.ogg")
|
self.session.sound.play("volume_changed.ogg")
|
||||||
|
|
||||||
def volume_up(self):
|
def volume_up(self):
|
||||||
if config.app["app-settings"]["volume"] < 1.0:
|
if self.session.settings["sound"]["volume"] < 1.0:
|
||||||
if config.app["app-settings"]["volume"] >= 0.95:
|
if self.session.settings["sound"]["volume"] >= 0.95:
|
||||||
config.app["app-settings"]["volume"] = 1.0
|
self.session.settings["sound"]["volume"] = 1.0
|
||||||
else:
|
else:
|
||||||
config.app["app-settings"]["volume"] +=0.05
|
self.session.settings["sound"]["volume"] +=0.05
|
||||||
if hasattr(sound.URLStream, "stream"):
|
if hasattr(sound.URLStream, "stream"):
|
||||||
sound.URLStream.stream.volume = config.app["app-settings"]["volume"]
|
sound.URLStream.stream.volume = self.session.settings["sound"]["volume"]
|
||||||
sound.player.play("volume_changed.ogg")
|
self.session.sound.play("volume_changed.ogg")
|
||||||
|
|
||||||
def start_stream(self):
|
def start_stream(self):
|
||||||
pass
|
pass
|
||||||
@ -223,7 +223,7 @@ class baseBufferController(bufferController):
|
|||||||
screen_name = tweet["user"]["screen_name"]
|
screen_name = tweet["user"]["screen_name"]
|
||||||
id = tweet["id"]
|
id = tweet["id"]
|
||||||
users = utils.get_all_mentioned(tweet, self.session.db)
|
users = utils.get_all_mentioned(tweet, self.session.db)
|
||||||
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s" % (screen_name,), users)
|
message = messages.reply(self.session, _(u"Reply"), _(u"Reply to %s") % (screen_name,), "@%s " % (screen_name,), users)
|
||||||
if message.message.get_response() == widgetUtils.OK:
|
if message.message.get_response() == widgetUtils.OK:
|
||||||
if message.image == None:
|
if message.image == None:
|
||||||
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=message.message.get_text())
|
call_threaded(self.session.api_call, call_name="update_status", _sound="reply_send.ogg", in_reply_to_status_id=id, status=message.message.get_text())
|
||||||
@ -267,7 +267,7 @@ class baseBufferController(bufferController):
|
|||||||
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
ts = original_date.humanize(locale=languageHandler.getLanguage())
|
||||||
self.buffer.list.list.SetStringItem(self.buffer.list.get_selected(), 2, ts)
|
self.buffer.list.list.SetStringItem(self.buffer.list.get_selected(), 2, ts)
|
||||||
if utils.is_audio(tweet):
|
if utils.is_audio(tweet):
|
||||||
sound.player.play("audio.ogg")
|
self.session.sound.play("audio.ogg")
|
||||||
|
|
||||||
def audio(self):
|
def audio(self):
|
||||||
tweet = self.get_tweet()
|
tweet = self.get_tweet()
|
||||||
@ -390,6 +390,14 @@ class peopleBufferController(baseBufferController):
|
|||||||
tweet = self.session.db[self.name]["items"][self.buffer.list.get_selected()]
|
tweet = self.session.db[self.name]["items"][self.buffer.list.get_selected()]
|
||||||
return tweet
|
return tweet
|
||||||
|
|
||||||
|
def add_new_item(self, item):
|
||||||
|
self.session.db[self.name]["items"].append(item)
|
||||||
|
tweet = self.compose_function(item, self.session.db, self.session.settings["general"]["relative_times"])
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False:
|
||||||
|
self.buffer.list.insert_item(False, *tweet)
|
||||||
|
else:
|
||||||
|
self.buffer.list.insert_item(True, *tweet)
|
||||||
|
|
||||||
class searchBufferController(baseBufferController):
|
class searchBufferController(baseBufferController):
|
||||||
def start_stream(self):
|
def start_stream(self):
|
||||||
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
log.debug("Starting stream for %s buffer, %s account and %s type" % (self.name, self.account, self.type))
|
||||||
@ -400,7 +408,7 @@ class searchBufferController(baseBufferController):
|
|||||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
||||||
self.put_items_on_list(number_of_items)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0:
|
if number_of_items > 0:
|
||||||
sound.player.play("search_updated.ogg")
|
self.session.sound.play("search_updated.ogg")
|
||||||
|
|
||||||
class searchPeopleBufferController(searchBufferController):
|
class searchPeopleBufferController(searchBufferController):
|
||||||
|
|
||||||
@ -419,4 +427,4 @@ class searchPeopleBufferController(searchBufferController):
|
|||||||
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
log.debug("Number of items retrieved: %d" % (number_of_items,))
|
||||||
self.put_items_on_list(number_of_items)
|
self.put_items_on_list(number_of_items)
|
||||||
if number_of_items > 0:
|
if number_of_items > 0:
|
||||||
sound.player.play("search_updated.ogg")
|
self.session.sound.play("search_updated.ogg")
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
from wxUI import (view, dialogs, commonMessageDialogs)
|
from wxUI import (view, dialogs, commonMessageDialogs)
|
||||||
import buffersController
|
import buffersController
|
||||||
import messages
|
import messages
|
||||||
|
import settings
|
||||||
from sessionmanager import session as session_
|
from sessionmanager import session as session_
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
import sound
|
import sound
|
||||||
@ -56,14 +57,14 @@ class Controller(object):
|
|||||||
|
|
||||||
def get_first_buffer(self, account):
|
def get_first_buffer(self, account):
|
||||||
for i in self.buffers:
|
for i in self.buffers:
|
||||||
if i.account == account:
|
if i.account == account and i.invisible == True:
|
||||||
buff = i
|
buff = i
|
||||||
break
|
break
|
||||||
return self.view.search(buff.name, buff.account)
|
return self.view.search(buff.name, buff.account)
|
||||||
|
|
||||||
def get_last_buffer(self, account):
|
def get_last_buffer(self, account):
|
||||||
results = []
|
results = []
|
||||||
[results.append(i) for i in self.buffers if i.account == account]
|
[results.append(i) for i in self.buffers if i.account == account and i.invisible == True]
|
||||||
return self.view.search(results[-1].name, results[-1].account)
|
return self.view.search(results[-1].name, results[-1].account)
|
||||||
|
|
||||||
def bind_stream_events(self):
|
def bind_stream_events(self):
|
||||||
@ -91,6 +92,7 @@ class Controller(object):
|
|||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.show_hide, menuitem=self.view.show_hide)
|
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.search, menuitem=self.view.menuitem_search)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.learn_sounds, menuitem=self.view.sounds_tutorial)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.learn_sounds, menuitem=self.view.sounds_tutorial)
|
||||||
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.configuration, menuitem=self.view.prefs)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.exit, menuitem=self.view.close)
|
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.exit, menuitem=self.view.close)
|
||||||
widgetUtils.connect_event(self.view, widgetUtils.MENU, self.post_tweet, self.view.compose)
|
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_reply, self.view.reply)
|
||||||
@ -113,6 +115,13 @@ class Controller(object):
|
|||||||
self.view.prepare()
|
self.view.prepare()
|
||||||
self.bind_stream_events()
|
self.bind_stream_events()
|
||||||
self.bind_other_events()
|
self.bind_other_events()
|
||||||
|
if config.app["app-settings"]["hide_gui"] == True:
|
||||||
|
self.show_hide()
|
||||||
|
self.view.Show()
|
||||||
|
self.view.Hide()
|
||||||
|
if config.app["app-settings"]["use_invisible_keyboard_shorcuts"] == True:
|
||||||
|
km = self.create_invisible_keyboard_shorcuts()
|
||||||
|
self.register_invisible_keyboard_shorcuts(km)
|
||||||
self.do_work()
|
self.do_work()
|
||||||
|
|
||||||
def do_work(self):
|
def do_work(self):
|
||||||
@ -121,7 +130,7 @@ class Controller(object):
|
|||||||
log.debug("Working on session %s" % (i,))
|
log.debug("Working on session %s" % (i,))
|
||||||
self.create_buffers(session_.sessions[i])
|
self.create_buffers(session_.sessions[i])
|
||||||
call_threaded(self.start_buffers, session_.sessions[i])
|
call_threaded(self.start_buffers, session_.sessions[i])
|
||||||
sound.player.play("tweet_timeline.ogg")
|
session_.sessions[session_.sessions.keys()[0]].sound.play("tweet_timeline.ogg")
|
||||||
self.checker_function = RepeatingTimer(60, self.check_connection)
|
self.checker_function = RepeatingTimer(60, self.check_connection)
|
||||||
self.checker_function.start()
|
self.checker_function.start()
|
||||||
|
|
||||||
@ -138,11 +147,11 @@ class Controller(object):
|
|||||||
mentions = buffersController.baseBufferController(self.view.nb, "get_mentions_timeline", "mentions", session, session.db["user_name"])
|
mentions = buffersController.baseBufferController(self.view.nb, "get_mentions_timeline", "mentions", session, session.db["user_name"])
|
||||||
self.buffers.append(mentions)
|
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"]))
|
self.view.insert_buffer(mentions.buffer, name=_(u"Mentions"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
sound.player.play("mention_received.ogg")
|
session.sound.play("mention_received.ogg")
|
||||||
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
dm = buffersController.baseBufferController(self.view.nb, "get_direct_messages", "direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
||||||
self.buffers.append(dm)
|
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"]))
|
self.view.insert_buffer(dm.buffer, name=_(u"Direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
sound.player.play("dm_received.ogg")
|
session.sound.play("dm_received.ogg")
|
||||||
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
sent_dm = buffersController.baseBufferController(self.view.nb, "get_sent_messages", "sent_direct_messages", session, session.db["user_name"], bufferType="dmPanel")
|
||||||
self.buffers.append(sent_dm)
|
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"]))
|
self.view.insert_buffer(sent_dm.buffer, name=_(u"Sent direct messages"), pos=self.view.search(session.db["user_name"], session.db["user_name"]))
|
||||||
@ -220,7 +229,8 @@ class Controller(object):
|
|||||||
dlg.Destroy()
|
dlg.Destroy()
|
||||||
|
|
||||||
def learn_sounds(self, *args, **kwargs):
|
def learn_sounds(self, *args, **kwargs):
|
||||||
SoundsTutorial.soundsTutorial()
|
buffer = self.get_best_buffer()
|
||||||
|
SoundsTutorial.soundsTutorial(buffer.session)
|
||||||
|
|
||||||
def view_user_lists(self, users):
|
def view_user_lists(self, users):
|
||||||
pass
|
pass
|
||||||
@ -234,8 +244,11 @@ class Controller(object):
|
|||||||
def lists_manager(self):
|
def lists_manager(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def configuration(self):
|
def configuration(self, *args, **kwargs):
|
||||||
pass
|
d = settings.globalSettingsController()
|
||||||
|
if d.response == widgetUtils.OK:
|
||||||
|
d.save_configuration()
|
||||||
|
|
||||||
|
|
||||||
def update_profile(self):
|
def update_profile(self):
|
||||||
pass
|
pass
|
||||||
@ -259,14 +272,19 @@ class Controller(object):
|
|||||||
buffer.destroy_status()
|
buffer.destroy_status()
|
||||||
|
|
||||||
def exit(self, *args, **kwargs):
|
def exit(self, *args, **kwargs):
|
||||||
|
if config.app["app-settings"]["ask_at_exit"] == True:
|
||||||
|
answer = commonMessageDialogs.exit_dialog()
|
||||||
|
if answer == widgetUtils.NO: return
|
||||||
log.debug("Exiting...")
|
log.debug("Exiting...")
|
||||||
|
log.debug("Saving global configuration...")
|
||||||
|
config.app.write()
|
||||||
for item in session_.sessions:
|
for item in session_.sessions:
|
||||||
log.debug("Saving config for %s session" % (session_.sessions[item].session_id,))
|
log.debug("Saving config for %s session" % (session_.sessions[item].session_id,))
|
||||||
session_.sessions[item].settings.write()
|
session_.sessions[item].settings.write()
|
||||||
log.debug("Disconnecting streams for %s session" % (session_.sessions[item].session_id,))
|
log.debug("Disconnecting streams for %s session" % (session_.sessions[item].session_id,))
|
||||||
session_.sessions[item].main_stream.disconnect()
|
session_.sessions[item].main_stream.disconnect()
|
||||||
session_.sessions[item].timelinesStream.disconnect()
|
session_.sessions[item].timelinesStream.disconnect()
|
||||||
sound.player.cleaner.cancel()
|
session_.sessions[item].sound.cleaner.cancel()
|
||||||
widgetUtils.exit_application()
|
widgetUtils.exit_application()
|
||||||
|
|
||||||
def action(self, do_action):
|
def action(self, do_action):
|
||||||
@ -317,7 +335,8 @@ class Controller(object):
|
|||||||
buffer = self.get_current_buffer()
|
buffer = self.get_current_buffer()
|
||||||
if buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search":
|
if buffer.type == "baseBuffer" or buffer.type == "favourites_timeline" or buffer.type == "list" or buffer.type == "search":
|
||||||
try:
|
try:
|
||||||
tweet = buffer.get_right_tweet()
|
tweet_id = buffer.get_right_tweet()["id"]
|
||||||
|
tweet = buffer.session.twitter.twitter.show_status(id=tweet_id)
|
||||||
msg = messages.viewTweet(tweet, )
|
msg = messages.viewTweet(tweet, )
|
||||||
except TwythonError:
|
except TwythonError:
|
||||||
non_tweet = buffer.get_message()
|
non_tweet = buffer.get_message()
|
||||||
@ -373,7 +392,7 @@ class Controller(object):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if position == page.buffer.list.get_selected():
|
if position == page.buffer.list.get_selected():
|
||||||
sound.player.play("limit.ogg")
|
page.session.sound.play("limit.ogg")
|
||||||
try:
|
try:
|
||||||
output.speak(page.get_message())
|
output.speak(page.get_message())
|
||||||
except:
|
except:
|
||||||
@ -388,7 +407,7 @@ class Controller(object):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if position == page.buffer.list.get_selected():
|
if position == page.buffer.list.get_selected():
|
||||||
sound.player.play("limit.ogg")
|
page.session.sound.play("limit.ogg")
|
||||||
try:
|
try:
|
||||||
output.speak(page.get_message())
|
output.speak(page.get_message())
|
||||||
except:
|
except:
|
||||||
@ -458,6 +477,17 @@ class Controller(object):
|
|||||||
msg = _(u"%s. Empty") % (self.view.get_buffer_text(),)
|
msg = _(u"%s. Empty") % (self.view.get_buffer_text(),)
|
||||||
output.speak(msg)
|
output.speak(msg)
|
||||||
|
|
||||||
|
def url(self, *args, **kwargs):
|
||||||
|
self.get_current_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):
|
def create_invisible_keyboard_shorcuts(self):
|
||||||
keymap = {}
|
keymap = {}
|
||||||
for i in config.app["keymap"]:
|
for i in config.app["keymap"]:
|
||||||
@ -476,9 +506,9 @@ class Controller(object):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def notify(self, play_sound=None, message=None, notification=False):
|
def notify(self, session, play_sound=None, message=None, notification=False):
|
||||||
if play_sound != None:
|
if play_sound != None:
|
||||||
sound.player.play(play_sound)
|
session.sound.play(play_sound)
|
||||||
if message != None:
|
if message != None:
|
||||||
output.speak(message)
|
output.speak(message)
|
||||||
|
|
||||||
@ -486,45 +516,45 @@ class Controller(object):
|
|||||||
buffer = self.search_buffer("home_timeline", user)
|
buffer = self.search_buffer("home_timeline", user)
|
||||||
play_sound = "tweet_received.ogg"
|
play_sound = "tweet_received.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def manage_mentions(self, data, user):
|
def manage_mentions(self, data, user):
|
||||||
buffer = self.search_buffer("mentions", user)
|
buffer = self.search_buffer("mentions", user)
|
||||||
play_sound = "mention_received.ogg"
|
play_sound = "mention_received.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
message = _(u"New mention")
|
message = _(u"New mention")
|
||||||
self.notify(play_sound=play_sound, message=message)
|
self.notify(buffer.session, play_sound=play_sound, message=message)
|
||||||
|
|
||||||
def manage_direct_messages(self, data, user):
|
def manage_direct_messages(self, data, user):
|
||||||
buffer = self.search_buffer("direct_messages", user)
|
buffer = self.search_buffer("direct_messages", user)
|
||||||
play_sound = "dm_received.ogg"
|
play_sound = "dm_received.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
message = _(u"New direct message")
|
message = _(u"New direct message")
|
||||||
self.notify(play_sound=play_sound, message=message)
|
self.notify(buffer.session, play_sound=play_sound, message=message)
|
||||||
|
|
||||||
def manage_sent_dm(self, data, user):
|
def manage_sent_dm(self, data, user):
|
||||||
buffer = self.search_buffer("sent_direct_messages", user)
|
buffer = self.search_buffer("sent_direct_messages", user)
|
||||||
play_sound = "dm_sent.ogg"
|
play_sound = "dm_sent.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def manage_sent_tweets(self, data, user):
|
def manage_sent_tweets(self, data, user):
|
||||||
buffer = self.search_buffer("sent_tweets", user)
|
buffer = self.search_buffer("sent_tweets", user)
|
||||||
play_sound = "tweet_send.ogg"
|
play_sound = "tweet_send.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def manage_events(self, data, user):
|
def manage_events(self, data, user):
|
||||||
buffer = self.search_buffer("events", user)
|
buffer = self.search_buffer("events", user)
|
||||||
play_sound = "new_event.ogg"
|
play_sound = "new_event.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def manage_followers(self, data, user):
|
def manage_followers(self, data, user):
|
||||||
buffer = self.search_buffer("followers", user)
|
buffer = self.search_buffer("followers", user)
|
||||||
play_sound = "update_followers.ogg"
|
play_sound = "update_followers.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def manage_friend(self, data, user):
|
def manage_friend(self, data, user):
|
||||||
buffer = self.search_buffer("friends", user)
|
buffer = self.search_buffer("friends", user)
|
||||||
@ -539,7 +569,7 @@ class Controller(object):
|
|||||||
buffer = self.search_buffer("favourites", user)
|
buffer = self.search_buffer("favourites", user)
|
||||||
play_sound = "favourite.ogg"
|
play_sound = "favourite.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def manage_unfavourite(self, item, user):
|
def manage_unfavourite(self, item, user):
|
||||||
buffer = self.search_buffer("favourites", user)
|
buffer = self.search_buffer("favourites", user)
|
||||||
@ -557,7 +587,7 @@ class Controller(object):
|
|||||||
buffer = self.search_buffer("%s-timeline" % (who,), user)
|
buffer = self.search_buffer("%s-timeline" % (who,), user)
|
||||||
play_sound = "tweet_timeline.ogg"
|
play_sound = "tweet_timeline.ogg"
|
||||||
buffer.add_new_item(data)
|
buffer.add_new_item(data)
|
||||||
self.notify(play_sound=play_sound)
|
self.notify(buffer.session, play_sound=play_sound)
|
||||||
|
|
||||||
def editing_keystroke(self, action, parentDialog):
|
def editing_keystroke(self, action, parentDialog):
|
||||||
print "i've pressed"
|
print "i've pressed"
|
||||||
|
@ -76,7 +76,7 @@ class basicTweet(object):
|
|||||||
self.message.disable_button("shortenButton")
|
self.message.disable_button("shortenButton")
|
||||||
self.message.disable_button("unshortenButton")
|
self.message.disable_button("unshortenButton")
|
||||||
if len(self.message.get_text()) > 140:
|
if len(self.message.get_text()) > 140:
|
||||||
sound.player.play("max_length.ogg")
|
self.session.sound.play("max_length.ogg")
|
||||||
|
|
||||||
def spellcheck(self, event=None):
|
def spellcheck(self, event=None):
|
||||||
text = self.message.get_text()
|
text = self.message.get_text()
|
||||||
|
39
src/controller/settings.py
Normal file
39
src/controller/settings.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import widgetUtils
|
||||||
|
import config
|
||||||
|
import languageHandler
|
||||||
|
from wxUI.dialogs import configuration
|
||||||
|
from pubsub import pub
|
||||||
|
import logging
|
||||||
|
log = logging.getLogger("Settings")
|
||||||
|
|
||||||
|
class globalSettingsController(object):
|
||||||
|
def __init__(self):
|
||||||
|
super(globalSettingsController, self).__init__()
|
||||||
|
self.dialog = configuration.configurationDialog()
|
||||||
|
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.dialog.create_general(langs)
|
||||||
|
self.dialog.general.language.SetSelection(id)
|
||||||
|
self.dialog.set_value("general", "ask_at_exit", config.app["app-settings"]["ask_at_exit"])
|
||||||
|
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.realize()
|
||||||
|
self.needs_restart = False
|
||||||
|
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 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"))
|
||||||
|
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")
|
@ -1,18 +1,17 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import widgetUtils
|
import widgetUtils
|
||||||
import config
|
|
||||||
import os
|
import os
|
||||||
import paths
|
import paths
|
||||||
import logging
|
import logging
|
||||||
log = logging.getLogger("extra.SoundsTutorial.soundsTutorial")
|
log = logging.getLogger("extra.SoundsTutorial.soundsTutorial")
|
||||||
import sound
|
|
||||||
import wx_ui
|
import wx_ui
|
||||||
import soundsTutorial_constants
|
import soundsTutorial_constants
|
||||||
|
|
||||||
class soundsTutorial(object):
|
class soundsTutorial(object):
|
||||||
def __init__(self):
|
def __init__(self, sessionObject):
|
||||||
log.debug("Creating sounds tutorial object...")
|
log.debug("Creating sounds tutorial object...")
|
||||||
super(soundsTutorial, self).__init__()
|
super(soundsTutorial, self).__init__()
|
||||||
|
self.session = sessionObject
|
||||||
self.actions = []
|
self.actions = []
|
||||||
log.debug("Loading actions for sounds tutorial...")
|
log.debug("Loading actions for sounds tutorial...")
|
||||||
[self.actions.append(i[1]) for i in soundsTutorial_constants.actions]
|
[self.actions.append(i[1]) for i in soundsTutorial_constants.actions]
|
||||||
@ -26,6 +25,6 @@ class soundsTutorial(object):
|
|||||||
|
|
||||||
def on_play(self, *args, **kwargs):
|
def on_play(self, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
sound.player.play(self.files[self.dialog.items.GetSelection()]+".ogg")
|
self.session.sound.play(self.files[self.dialog.items.GetSelection()]+".ogg")
|
||||||
except:
|
except:
|
||||||
log.exception("Error playing the %s sound" % (self.files[self.dialog.items.GetSelection()],))
|
log.exception("Error playing the %s sound" % (self.files[self.dialog.items.GetSelection()],))
|
@ -32,7 +32,6 @@ def setup():
|
|||||||
del sm
|
del sm
|
||||||
r = mainController.Controller()
|
r = mainController.Controller()
|
||||||
r.view.Show()
|
r.view.Show()
|
||||||
sound.player.play("ready.ogg")
|
|
||||||
app.MainLoop()
|
app.MainLoop()
|
||||||
|
|
||||||
setup()
|
setup()
|
@ -94,15 +94,19 @@ class Session(object):
|
|||||||
|
|
||||||
def get_configuration(self):
|
def get_configuration(self):
|
||||||
|
|
||||||
""" Gets settings for a session."""
|
""" Gets settings for a session."""
|
||||||
|
|
||||||
file_ = "%s/session.conf" % (self.session_id,)
|
file_ = "%s/session.conf" % (self.session_id,)
|
||||||
try:
|
# try:
|
||||||
log.debug("Creating config file %s" % (file_,))
|
log.debug("Creating config file %s" % (file_,))
|
||||||
self.settings = Configuration(paths.config_path(file_), paths.app_path("Conf.defaults"))
|
self.settings = Configuration(paths.config_path(file_), paths.app_path("Conf.defaults"))
|
||||||
except:
|
self.init_sound()
|
||||||
log.exception("The session configuration has failed.")
|
# except:
|
||||||
self.settings = None
|
# log.exception("The session configuration has failed.")
|
||||||
|
# self.settings = None
|
||||||
|
|
||||||
|
def init_sound(self):
|
||||||
|
self.sound = sound.soundSystem(self.settings["sound"])
|
||||||
|
|
||||||
@_require_configuration
|
@_require_configuration
|
||||||
def login(self):
|
def login(self):
|
||||||
|
35
src/sound.py
35
src/sound.py
@ -14,13 +14,10 @@ import output
|
|||||||
system = platform.system()
|
system = platform.system()
|
||||||
from mysc.repeating_timer import RepeatingTimer
|
from mysc.repeating_timer import RepeatingTimer
|
||||||
|
|
||||||
player = URLPlayer = None
|
URLPlayer = None
|
||||||
|
|
||||||
def setup():
|
def setup():
|
||||||
global player, URLPlayer
|
global URLPlayer
|
||||||
if not player:
|
|
||||||
log.debug("Creating sound player...")
|
|
||||||
player = soundSystem()
|
|
||||||
if not URLPlayer:
|
if not URLPlayer:
|
||||||
log.debug("creating stream URL player...")
|
log.debug("creating stream URL player...")
|
||||||
URLPlayer = URLStream()
|
URLPlayer = URLStream()
|
||||||
@ -42,8 +39,8 @@ class soundSystem(object):
|
|||||||
def check_soundpack(self):
|
def check_soundpack(self):
|
||||||
""" Checks if the folder where live the current soundpack exists."""
|
""" Checks if the folder where live the current soundpack exists."""
|
||||||
self.soundpack_OK = False
|
self.soundpack_OK = False
|
||||||
if os.path.exists(paths.sound_path(config.app["app-settings"]["current_soundpack"])):
|
if os.path.exists(paths.sound_path(self.config["current_soundpack"])):
|
||||||
self.path = paths.sound_path(config.app["app-settings"]["current_soundpack"])
|
self.path = paths.sound_path(self.config["current_soundpack"])
|
||||||
self.soundpack_OK = True
|
self.soundpack_OK = True
|
||||||
elif os.path.exists(paths.sound_path("default")):
|
elif os.path.exists(paths.sound_path("default")):
|
||||||
log.error("The soundpack does not exist, using default...")
|
log.error("The soundpack does not exist, using default...")
|
||||||
@ -53,20 +50,24 @@ class soundSystem(object):
|
|||||||
log.error("Path for the current soundpack does not exist and the default soundpack is deleted, TWBlue will not play sounds.")
|
log.error("Path for the current soundpack does not exist and the default soundpack is deleted, TWBlue will not play sounds.")
|
||||||
self.soundpack_OK = False
|
self.soundpack_OK = False
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, soundConfig):
|
||||||
""" Sound Player."""
|
""" Sound Player."""
|
||||||
|
self.config = soundConfig
|
||||||
# Set the output and input default devices.
|
# Set the output and input default devices.
|
||||||
self.output = sound_lib.output.Output()
|
try:
|
||||||
self.input = sound_lib.input.Input()
|
self.output = sound_lib.output.Output()
|
||||||
# Try to use the selected device from the configuration. It can fail if the machine does not has a mic.
|
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:
|
try:
|
||||||
log.debug("Setting input and output devices...")
|
log.debug("Setting input and output devices...")
|
||||||
self.output.set_device(self.output.find_device_by_name(config.app["app-settings"]["output_device"]))
|
self.output.set_device(self.output.find_device_by_name(self.config["output_device"]))
|
||||||
self.input.set_device(self.input.find_device_by_name(config.app["app-settings"]["input_device"]))
|
self.input.set_device(self.input.find_device_by_name(self.config["input_device"]))
|
||||||
except:
|
except:
|
||||||
log.error("Error in input or output devices, using defaults...")
|
log.error("Error in input or output devices, using defaults...")
|
||||||
config.app["app-settings"]["output_device"] = "Default"
|
self.config["output_device"] = "Default"
|
||||||
config.app["app-settings"]["input_device"] = "Default"
|
self.config["input_device"] = "Default"
|
||||||
|
|
||||||
self.files = []
|
self.files = []
|
||||||
self.cleaner = RepeatingTimer(60, self.clear_list)
|
self.cleaner = RepeatingTimer(60, self.clear_list)
|
||||||
@ -87,9 +88,9 @@ class soundSystem(object):
|
|||||||
|
|
||||||
def play(self, sound, argument=False):
|
def play(self, sound, argument=False):
|
||||||
if self.soundpack_OK == False: return
|
if self.soundpack_OK == False: return
|
||||||
if config.app["app-settings"]["global_mute"] == True: return
|
if self.config["global_mute"] == True: return
|
||||||
sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound))
|
sound_object = sound_lib.stream.FileStream(file="%s/%s" % (self.path, sound))
|
||||||
sound_object.volume = float(config.app["app-settings"]["volume"])
|
sound_object.volume = float(self.config["volume"])
|
||||||
self.files.append(sound_object)
|
self.files.append(sound_object)
|
||||||
sound_object.play()
|
sound_object.play()
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ class timelinesStreamer(TwythonStreamer):
|
|||||||
def check_tls(self, data):
|
def check_tls(self, data):
|
||||||
for i in self.session.settings["other_buffers"]["timelines"]:
|
for i in self.session.settings["other_buffers"]["timelines"]:
|
||||||
if data["user"]["screen_name"] == i:
|
if data["user"]["screen_name"] == i:
|
||||||
|
if self.session.settings["general"]["reverse_timelines"] == False: self.session.db[i].append(data)
|
||||||
|
else: self.session.db[i].insert(0, data)
|
||||||
pub.sendMessage("item-in-timeline", data= data, user= self.session.db["user_name"], who= i)
|
pub.sendMessage("item-in-timeline", data= data, user= self.session.db["user_name"], who= i)
|
||||||
|
|
||||||
def on_success(self, data):
|
def on_success(self, data):
|
||||||
|
@ -6,3 +6,7 @@ def retweet_question(parent):
|
|||||||
|
|
||||||
def delete_tweet_dialog(parent):
|
def delete_tweet_dialog(parent):
|
||||||
return wx.MessageDialog(parent, _(u"Do you really want to delete this message? It will be eliminated 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 message? It will be eliminated from Twitter as well."), _(u"Delete"), wx.ICON_QUESTION|wx.YES_NO).ShowModal()
|
||||||
|
|
||||||
|
def exit_dialog():
|
||||||
|
dlg = wx.MessageDialog(None, _(u"Do you really want to close TW Blue?"), _(u"Exit"), wx.YES_NO|wx.ICON_QUESTION)
|
||||||
|
return dlg.ShowModal()
|
@ -14,28 +14,14 @@ class general(wx.Panel, baseDialog.BaseWXDialog):
|
|||||||
langBox.Add(language, 0, wx.ALL, 5)
|
langBox.Add(language, 0, wx.ALL, 5)
|
||||||
langBox.Add(self.language, 0, wx.ALL, 5)
|
langBox.Add(self.language, 0, wx.ALL, 5)
|
||||||
sizer.Add(langBox, 0, wx.ALL, 5)
|
sizer.Add(langBox, 0, wx.ALL, 5)
|
||||||
self.relative_time = wx.CheckBox(self, -1, _(U"Relative times"))
|
self.ask_at_exit = wx.CheckBox(self, -1, _(U"ask before exiting TwBlue?"))
|
||||||
sizer.Add(self.relative_time, 0, wx.ALL, 5)
|
sizer.Add(self.ask_at_exit, 0, wx.ALL, 5)
|
||||||
|
self.use_invisible_shorcuts = wx.CheckBox(self, -1, _(u"Use invisible interface's keyboard shorcuts on the GUI"))
|
||||||
|
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"))
|
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)
|
sizer.Add(self.disable_sapi5, 0, wx.ALL, 5)
|
||||||
self.show_gui = wx.CheckBox(self, -1, _(u"Activate the auto-start of the invisible interface"))
|
self.hide_gui = wx.CheckBox(self, -1, _(u"Activate the auto-start of the invisible interface"))
|
||||||
sizer.Add(self.show_gui, 0, wx.ALL, 5)
|
sizer.Add(self.hide_gui, 0, wx.ALL, 5)
|
||||||
apiCallsBox = wx.BoxSizer(wx.HORIZONTAL)
|
|
||||||
apiCallsBox.Add(wx.StaticText(self, -1, _(u"API calls when the stream is started (One API call equals to 200 tweetts, two API calls equals 400 tweets, etc):")), 0, wx.ALL, 5)
|
|
||||||
self.apiCalls = wx.SpinCtrl(self, -1)
|
|
||||||
self.apiCalls.SetRange(1, 10)
|
|
||||||
self.apiCalls.SetSize(self.apiCalls.GetBestSize())
|
|
||||||
apiCallsBox.Add(self.apiCalls, 0, wx.ALL, 5)
|
|
||||||
sizer.Add(apiCallsBox, 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, -1)
|
|
||||||
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, -1, _(u"Inverted buffers: The newest tweets will be shown at the beginning of the lists while the oldest at the end"))
|
|
||||||
sizer.Add(self.reverse_timelines, 0, wx.ALL, 5)
|
|
||||||
self.SetSizer(sizer)
|
self.SetSizer(sizer)
|
||||||
|
|
||||||
class other_buffers(wx.Panel):
|
class other_buffers(wx.Panel):
|
||||||
@ -131,7 +117,7 @@ class audioServicesPanel(wx.Panel):
|
|||||||
mainSizer.Add(first_sizer, 0, wx.ALL, 5)
|
mainSizer.Add(first_sizer, 0, wx.ALL, 5)
|
||||||
self.SetSizer(mainSizer)
|
self.SetSizer(mainSizer)
|
||||||
|
|
||||||
class configurationDialog(wx.Dialog):
|
class configurationDialog(baseDialog.BaseWXDialog):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(configurationDialog, self).__init__(None, -1)
|
super(configurationDialog, self).__init__(None, -1)
|
||||||
self.panel = wx.Panel(self)
|
self.panel = wx.Panel(self)
|
||||||
@ -176,7 +162,8 @@ class configurationDialog(wx.Dialog):
|
|||||||
p = getattr(self, panel)
|
p = getattr(self, panel)
|
||||||
return getattr(p, key).GetValue()
|
return getattr(p, key).GetValue()
|
||||||
|
|
||||||
def set_value(self, panel, key):
|
def set_value(self, panel, key, value):
|
||||||
p = getattr(self, panel)
|
p = getattr(self, panel)
|
||||||
getattr(self, p).SetValue(key)
|
control = getattr(p, key)
|
||||||
|
getattr(control, "SetValue")(value)
|
||||||
|
|
||||||
|
@ -146,3 +146,4 @@ class mainFrame(wx.Frame):
|
|||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
self.Show()
|
self.Show()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user