[orca/orca-gnome3: 9/87] Added disable option
- From: Alejandro Leiva <aleiva src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [orca/orca-gnome3: 9/87] Added disable option
- Date: Fri, 1 Apr 2011 11:13:34 +0000 (UTC)
commit 6ee0522a5eccae27fc5e00a786a2bddd0dee10f7
Author: José Ignacio �lvarez Ruiz <jialvarez emergya es>
Date: Fri Feb 18 12:34:53 2011 +0100
Added disable option
src/orca/baseplugins/chat.py | 1005 +----------------------------------------
src/orca/baseplugins/test.py | 11 +-
src/orca/plugin_manager.py | 1 -
src/orca/pluglib/confstore.py | 5 +-
4 files changed, 31 insertions(+), 991 deletions(-)
---
diff --git a/src/orca/baseplugins/chat.py b/src/orca/baseplugins/chat.py
index 71123cc..7271f5d 100644
--- a/src/orca/baseplugins/chat.py
+++ b/src/orca/baseplugins/chat.py
@@ -17,27 +17,26 @@
# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
# Boston MA 02110-1301 USA.
-#"""Implements generic chat support."""
-#
-#__id__ = "$Id$"
-#__version__ = "$Revision$"
-#__date__ = "$Date$"
-#__copyright__ = "Copyright (c) 2010 Joanmarie Diggs."
-#__license__ = "LGPL"
-#
-import pyatspi
+"""Implements generic chat support."""
-import input_event
-import keybindings
-import orca
-import orca_state
-import settings
-#import speech
-#
-from orca_i18n import _
+__id__ = "$Id$"
+__version__ = "$Revision$"
+__date__ = "$Date$"
+__copyright__ = "Copyright (c) 2010 Joanmarie Diggs."
+__license__ = "LGPL"
+
+from pluglib.confstore import GConfStore
from pluglib.interfaces import *
-#_settingsManager = getattr(orca, '_settingsManager')
+class gConfPlugin(GConfStore):
+ defaults = {
+ 'enable': True,
+ }
+
+ def __init__(self):
+ super(gConfPlugin, self).__init__('/apps/orca/plugins/chat')
+ self.save()
+ print 'Started chat plugin!'
class chatPlugin(IPlugin):
name = 'Chat plugin'
@@ -47,971 +46,11 @@ class chatPlugin(IPlugin):
website = 'http://www.nacho-alvarez.es'
icon = 'gtk-missing-image'
-IPlugin.register(chatPlugin)
-
-#############################################################################
-# #
-# Ring List. A fixed size circular list by Flavio Catalani #
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/435902 #
-# #
-# Included here to keep track of conversation histories. #
-# #
-#############################################################################
-
-class RingList:
- def __init__(self, length):
- self.__data__ = []
- self.__full__ = 0
- self.__max__ = length
- self.__cur__ = 0
-
- def append(self, x):
- if self.__full__ == 1:
- for i in range (0, self.__cur__ - 1):
- self.__data__[i] = self.__data__[i + 1]
- self.__data__[self.__cur__ - 1] = x
- else:
- self.__data__.append(x)
- self.__cur__ += 1
- if self.__cur__ == self.__max__:
- self.__full__ = 1
-
- def get(self):
- return self.__data__
-
- def remove(self):
- if (self.__cur__ > 0):
- del self.__data__[self.__cur__ - 1]
- self.__cur__ -= 1
-
- def size(self):
- return self.__cur__
-
- def maxsize(self):
- return self.__max__
-
- def __str__(self):
- return ''.join(self.__data__)
-
-#############################################################################
-# #
-# Conversation #
-# #
-#############################################################################
-
-class Conversation:
-
- # The number of messages to keep in the history
- #
- MESSAGE_LIST_LENGTH = 9
-
- def __init__(self, name, accHistory, inputArea=None):
-
- """Creates a new instance of the Conversation class.
-
- Arguments:
- - name: the chatroom/conversation name
- - accHistory: the accessible which holds the conversation history
- - inputArea: the editable text object for this conversation.
- """
-
- self.name = name
- self.accHistory = accHistory
- self.inputArea = inputArea
-
- # A cyclic list to hold the chat room history for this conversation
- #
- self._messageHistory = RingList(Conversation.MESSAGE_LIST_LENGTH)
-
- # Initially populate the cyclic lists with empty strings.
- #
- i = 0
- while i < self._messageHistory.maxsize():
- self.addMessage("")
- i += 1
-
- # Keep track of the last typing status because some platforms (e.g.
- # MSN) seem to issue the status constantly and even though it has
- # not changed.
- #
- self._typingStatus = ""
-
- def addMessage(self, message):
- """Adds the current message to the message history.
-
- Arguments:
- - message: A string containing the message to add
- """
-
- self._messageHistory.append(message)
-
- def getNthMessage(self, messageNumber):
- """Returns the specified message from the message history.
-
- Arguments:
- - messageNumber: the index of the message to get.
- """
-
- messages = self._messageHistory.get()
-
- return messages[messageNumber]
-
- def getTypingStatus(self):
- """Returns the typing status of the buddy in this conversation."""
-
- return self._typingStatus
-
- def setTypingStatus(self, status):
- """Sets the typing status of the buddy in this conversation.
-
- Arguments:
- - status: a string describing the current status.
- """
-
- self._typingStatus = status
-
-#############################################################################
-# #
-# ConversationList #
-# #
-#############################################################################
-
-class ConversationList:
-
- def __init__(self, messageListLength):
-
- """Creates a new instance of the ConversationList class.
-
- Arguments:
- - messageListLength: the size of the message history to keep.
- """
-
- self.conversations = []
-
- # A cyclic list to hold the most recent (messageListLength) previous
- # messages for all conversations in the ConversationList.
- #
- self._messageHistory = RingList(messageListLength)
-
- # A corresponding cyclic list to hold the name of the conversation
- # associated with each message in the messageHistory.
- #
- self._roomHistory = RingList(messageListLength)
-
- # Initially populate the cyclic lists with empty strings.
- #
- i = 0
- while i < self._messageHistory.maxsize():
- self.addMessage("", None)
- i += 1
-
- def addMessage(self, message, conversation):
- """Adds the current message to the message history.
-
- Arguments:
- - message: A string containing the message to add
- - conversation: The instance of the Conversation class with which
- the message is associated
- """
-
- if not conversation:
- name = ""
- else:
- if not self.hasConversation(conversation):
- self.addConversation(conversation)
- name = conversation.name
-
- self._messageHistory.append(message)
- self._roomHistory.append(name)
-
- def getNthMessageAndName(self, messageNumber):
- """Returns a list containing the specified message from the message
- history and the name of the chatroom/conversation associated with
- that message.
-
- Arguments:
- - messageNumber: the index of the message to get.
- """
-
- messages = self._messageHistory.get()
- rooms = self._roomHistory.get()
-
- return messages[messageNumber], rooms[messageNumber]
-
- def hasConversation(self, conversation):
- """Returns True if we know about this conversation.
-
- Arguments:
- - conversation: the conversation of interest
- """
-
- return conversation in self.conversations
-
- def getNConversations(self):
- """Returns the number of conversations we currently know about."""
-
- return len(self.conversations)
-
- def addConversation(self, conversation):
- """Adds conversation to the list of conversations.
-
- Arguments:
- - conversation: the conversation to add
- """
-
- self.conversations.append(conversation)
-
- def removeConversation(self, conversation):
- """Removes conversation from the list of conversations.
-
- Arguments:
- - conversation: the conversation to remove
-
- Returns True if conversation was successfully removed.
- """
-
- # TODO - JD: In the Pidgin script, I do not believe we handle the
- # case where a conversation window is closed. I *think* it remains
- # in the overall chat history. What do we want to do in that case?
- # I would assume that we'd want to remove it.... So here's a method
- # to do so. Nothing in the Chat class uses it yet.
- #
- try:
- self.conversations.remove(conversation)
- except:
- return False
- else:
- return True
-
-#############################################################################
-# #
-# Chat #
-# #
-#############################################################################
-
-class Chat:
- """This class implements the chat functionality which is available to
- scripts.
- """
-
- def __init__(self, script, buddyListAncestries):
- """Creates an instance of the Chat class.
-
- Arguments:
- - script: the script with which this instance is associated.
- - buddyListAncestries: a list of lists of pyatspi roles beginning
- with the the object serving as the actual buddy list (e.g.
- ROLE_TREE_TABLE) and ending with the top level object (e.g.
- ROLE_FRAME).
- """
-
- self._script = script
- self._buddyListAncestries = buddyListAncestries
-
- # Keybindings to provide conversation message history. The message
- # review order will be based on the index within the list. Thus F1
- # is associated with the most recent message, F2 the message before
- # that, and so on. A script could override this. Setting messageKeys
- # to ["a", "b", "c" ... ] will cause "a" to be associated with the
- # most recent message, "b" to be associated with the message before
- # that, etc. Scripts can also override the messageKeyModifier.
- #
- self.messageKeys = \
- ["F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9"]
- self.messageKeyModifier = settings.ORCA_MODIFIER_MASK
- self.inputEventHandlers = {}
- self.setupInputEventHandlers()
- self.keyBindings = self.getKeyBindings()
-
- # The length of the message history will be based on how many keys
- # are bound to the task of providing it.
- #
- self.messageListLength = len(self.messageKeys)
- self._conversationList = ConversationList(self.messageListLength)
-
- # To make pylint happy.
- #
- self.focusedChannelRadioButton = None
- self.allChannelsRadioButton = None
- self.allMessagesRadioButton = None
- self.buddyTypingCheckButton = None
- self.chatRoomHistoriesCheckButton = None
- self.speakNameCheckButton = None
-
- def setupInputEventHandlers(self):
- """Defines InputEventHandler fields for chat functions which
- will be used by the script associated with this chat instance."""
-
- self.inputEventHandlers["togglePrefixHandler"] = \
- input_event.InputEventHandler(
- self.togglePrefix,
- _("Toggle whether we prefix chat room messages with " \
- "the name of the chat room."))
-
- self.inputEventHandlers["toggleBuddyTypingHandler"] = \
- input_event.InputEventHandler(
- self.toggleBuddyTyping,
- _("Toggle whether we announce when our buddies are typing."))
-
- self.inputEventHandlers["toggleMessageHistoriesHandler"] = \
- input_event.InputEventHandler(
- self.toggleMessageHistories,
- _("Toggle whether we provide chat room specific message " \
- "histories."))
-
- # Add the chat room message history event handler.
- #
- self.inputEventHandlers["reviewMessage"] = \
- input_event.InputEventHandler(
- self.readPreviousMessage,
- _("Speak and braille a previous chat room message."))
-
- return
-
- def getKeyBindings(self):
- """Defines the chat-related key bindings which will be used by
- the script associated with this chat instance.
-
- Returns: an instance of keybindings.KeyBindings.
- """
-
- keyBindings = keybindings.KeyBindings()
-
- keyBindings.add(
- keybindings.KeyBinding(
- "",
- settings.defaultModifierMask,
- settings.NO_MODIFIER_MASK,
- self.inputEventHandlers["togglePrefixHandler"]))
-
- keyBindings.add(
- keybindings.KeyBinding(
- "",
- settings.defaultModifierMask,
- settings.NO_MODIFIER_MASK,
- self.inputEventHandlers["toggleBuddyTypingHandler"]))
-
- keyBindings.add(
- keybindings.KeyBinding(
- "",
- settings.defaultModifierMask,
- settings.NO_MODIFIER_MASK,
- self.inputEventHandlers["toggleMessageHistoriesHandler"]))
-
- for messageKey in self.messageKeys:
- keyBindings.add(
- keybindings.KeyBinding(
- messageKey,
- self.messageKeyModifier,
- settings.ORCA_MODIFIER_MASK,
- self.inputEventHandlers["reviewMessage"]))
-
- return keyBindings
-
- def getAppPreferencesGUI(self):
- """Return a GtkVBox contain the application unique configuration
- GUI items for the current application.
- """
-
- import gtk
-
- vbox = gtk.VBox(False, 0)
- vbox.set_border_width(12)
- gtk.Widget.show(vbox)
-
- # Translators: If this checkbox is checked, then Orca will speak
- # the name of the chat room.
- #
- label = _("_Speak Chat Room name")
- self.speakNameCheckButton = gtk.CheckButton(label)
- gtk.Widget.show(self.speakNameCheckButton)
- gtk.Box.pack_start(vbox, self.speakNameCheckButton, False, False, 0)
- gtk.ToggleButton.set_active(
- self.speakNameCheckButton,
- _settingsManager.getSetting('chatSpeakRoomName'))
-
- # Translators: If this checkbox is checked, then Orca will tell
- # you when one of your buddies is typing a message.
- #
- label = _("Announce when your _buddies are typing")
- self.buddyTypingCheckButton = gtk.CheckButton(label)
- gtk.Widget.show(self.buddyTypingCheckButton)
- gtk.Box.pack_start(vbox, self.buddyTypingCheckButton, False, False, 0)
- gtk.ToggleButton.set_active(
- self.buddyTypingCheckButton,
- _settingsManager.getSetting('chatAnnounceBuddyTyping'))
-
- # Translators: If this checkbox is checked, then Orca will provide
- # the user with chat room specific message histories rather than just
- # a single history which contains the latest messages from all the
- # chat rooms that they are currently in.
- #
- label = _("Provide chat room specific _message histories")
- self.chatRoomHistoriesCheckButton = gtk.CheckButton(label)
- gtk.Widget.show(self.chatRoomHistoriesCheckButton)
- gtk.Box.pack_start(vbox, self.chatRoomHistoriesCheckButton,
- False, False, 0)
- gtk.ToggleButton.set_active(
- self.chatRoomHistoriesCheckButton,
- _settingsManager.getSetting('chatRoomHistories'))
-
- # "Speak Messages" frame.
- #
- messagesFrame = gtk.Frame()
- gtk.Widget.show(messagesFrame)
- gtk.Box.pack_start(vbox, messagesFrame, False, False, 5)
-
- messagesAlignment = gtk.Alignment(0.5, 0.5, 1, 1)
- gtk.Widget.show(messagesAlignment)
- gtk.Container.add(messagesFrame, messagesAlignment)
- gtk.Alignment.set_padding(messagesAlignment, 0, 0, 12, 0)
-
- messagesVBox = gtk.VBox(False, 0)
- gtk.Widget.show(messagesVBox)
- gtk.Container.add(messagesAlignment, messagesVBox)
-
- verbosity = _settingsManager.getSetting('chatMessageVerbosity')
-
- # Translators: Orca will speak all new chat messages as they appear
- # irrespective of whether the chat application currently has focus.
- # This is the default behaviour.
- #
- self.allMessagesRadioButton = gtk.RadioButton(None, _("All cha_nnels"))
- gtk.Widget.show(self.allMessagesRadioButton)
- gtk.Box.pack_start(messagesVBox, self.allMessagesRadioButton,
- False, False, 0)
- gtk.ToggleButton.set_active(
- self.allMessagesRadioButton,
- verbosity == settings.CHAT_SPEAK_ALL)
-
- # Translators: Orca will speak only new chat messages for the channel
- # that currently has focus, irrespective of whether the chat
- # application has focus.
- #
- self.focusedChannelRadioButton = gtk.RadioButton(
- self.allMessagesRadioButton,
- _("A channel only if its _window is active"))
- gtk.Widget.show(self.focusedChannelRadioButton)
- gtk.Box.pack_start(messagesVBox, self.focusedChannelRadioButton,
- False, False, 0)
- gtk.ToggleButton.set_active(
- self.focusedChannelRadioButton,
- verbosity == settings.CHAT_SPEAK_FOCUSED_CHANNEL)
-
- # Translators: Orca will speak new chat messages for all channels
- # only when the chat application has focus.
- #
- self.allChannelsRadioButton = gtk.RadioButton(
- self.allMessagesRadioButton,
- _("All channels when an_y %s window is active") \
- % self._script.app.name)
- gtk.Widget.show(self.allChannelsRadioButton)
- gtk.Box.pack_start(messagesVBox, self.allChannelsRadioButton,
- False, False, 0)
- gtk.ToggleButton.set_active(
- self.allChannelsRadioButton,
- verbosity == settings.CHAT_SPEAK_ALL_IF_FOCUSED)
-
- # Translators: this is the title of a panel holding options for
- # how messages in this application's chat rooms should be spoken.
- #
- messagesLabel = gtk.Label("<b>%s</b>" % _("Speak messages from"))
- gtk.Widget.show(messagesLabel)
- gtk.Frame.set_label_widget(messagesFrame, messagesLabel)
- messagesFrame.set_shadow_type(gtk.SHADOW_NONE)
- gtk.Label.set_use_markup(messagesLabel, True)
+ def __init__(self):
+ self.gc_plug = gConfPlugin()
- return vbox
+ def disable(self):
+ self.gc_plug.disable('enable')
- def setAppPreferences(self, prefs):
- """Write out the application specific preferences lines and set the
- new values.
-
- Arguments:
- - prefs: file handle for application preferences.
- """
-
- prefix = "orca.settings"
-
- value = self.speakNameCheckButton.get_active()
- _settingsManager.setSetting('chatSpeakRoomName', value)
- prefs.writelines("\n")
- prefs.writelines("%s.chatSpeakRoomName = %s\n" % (prefix, value))
-
- value = self.buddyTypingCheckButton.get_active()
- _settingsManager.setSetting('chatAnnounceBuddyTyping', value)
- prefs.writelines("%s.chatAnnounceBuddyTyping = %s\n" % (prefix, value))
-
- value = self.chatRoomHistoriesCheckButton.get_active()
- _settingsManager.setSetting('chatRoomHistories', value)
- prefs.writelines("%s.chatRoomHistories = %s\n" % (prefix, value))
-
- value = None
- option = None
- if self.allMessagesRadioButton.get_active():
- value = settings.CHAT_SPEAK_ALL
- option = ("%s.CHAT_SPEAK_ALL" % prefix)
- elif self.allChannelsRadioButton.get_active():
- value = settings.CHAT_SPEAK_ALL_IF_FOCUSED
- option = ("%s.CHAT_SPEAK_ALL_IF_FOCUSED" % prefix)
- elif self.focusedChannelRadioButton.get_active():
- value = settings.CHAT_SPEAK_FOCUSED_CHANNEL
- option = ("%s.CHAT_SPEAK_FOCUSED_CHANNEL" % prefix)
-
- if value and option:
- _settingsManager.setSetting('chatMessageVerbosity', value)
- prefs.writelines("\n")
- prefs.writelines("%s.chatMessageVerbosity = %s\n" % \
- (prefix, option))
-
- ########################################################################
- # #
- # InputEvent handlers and supporting utilities #
- # #
- ########################################################################
-
- def togglePrefix(self, script, inputEvent):
- """ Toggle whether we prefix chat room messages with the name of
- the chat room.
-
- Arguments:
- - script: the script associated with this event
- - inputEvent: if not None, the input event that caused this action.
- """
-
- line = _("speak chat room name.")
- speakRoomName = _settingsManager.getSetting('chatSpeakRoomName')
- _settingsManager.setSetting('chatSpeakRoomName', not speakRoomName)
- if speakRoomName:
- line = _("Do not speak chat room name.")
- self._script.presentMessage(line)
-
- return True
-
- def toggleBuddyTyping(self, script, inputEvent):
- """ Toggle whether we announce when our buddies are typing a message.
-
- Arguments:
- - script: the script associated with this event
- - inputEvent: if not None, the input event that caused this action.
- """
-
- line = _("announce when your buddies are typing.")
- announceTyping = _settingsManager.getSetting('chatAnnounceBuddyTyping')
- _settingsManager.setSetting(
- 'chatAnnounceBuddyTyping', not announceTyping)
- if announceTyping:
- line = _("Do not announce when your buddies are typing.")
- self._script.presentMessage(line)
-
- return True
-
- def toggleMessageHistories(self, script, inputEvent):
- """ Toggle whether we provide chat room specific message histories.
-
- Arguments:
- - script: the script associated with this event
- - inputEvent: if not None, the input event that caused this action.
- """
-
- line = _("Provide chat room specific message histories.")
- roomHistories = _settingsManager.getSetting('chatRoomHistories')
- _settingsManager.setSetting('chatRoomHistories', not roomHistories)
- if roomHistories:
- line = _("Do not provide chat room specific message histories.")
- self._script.presentMessage(line)
-
- return True
-
- def readPreviousMessage(self, script, inputEvent=None, index=0):
- """ Speak/braille a previous chat room message.
-
- Arguments:
- - script: the script associated with this event
- - inputEvent: if not None, the input event that caused this action.
- - index: The index of the message to read -- by default, the most
- recent message. If we get an inputEvent, however, the value of
- index is ignored and the index of the event_string with respect
- to self.messageKeys is used instead.
- """
-
- try:
- index = self.messageKeys.index(inputEvent.event_string)
- except:
- pass
-
- messageNumber = self.messageListLength - (index + 1)
- message, chatRoomName = None, None
-
- if _settingsManager.getSetting('chatRoomHistories'):
- conversation = self.getConversation(orca_state.locusOfFocus)
- if conversation:
- message = conversation.getNthMessage(messageNumber)
- chatRoomName = conversation.name
- else:
- message, chatRoomName = \
- self._conversationList.getNthMessageAndName(messageNumber)
-
- if message and chatRoomName:
- self.utterMessage(chatRoomName, message, True)
-
- def utterMessage(self, chatRoomName, message, focused=True):
- """ Speak/braille a chat room message.
-
- Arguments:
- - chatRoomName: name of the chat room this message came from
- - message: the chat room message
- - focused: whether or not the current chatroom has focus. Defaults
- to True so that we can use this method to present chat history
- as well as incoming messages.
- """
-
- # Only speak/braille the new message if it matches how the user
- # wants chat messages spoken.
- #
- verbosity = self._script.getSettings().chatMessageVerbosity
- if orca_state.activeScript.name != self._script.name \
- and verbosity == settings.CHAT_SPEAK_ALL_IF_FOCUSED:
- return
- elif not focused and verbosity == settings.CHAT_SPEAK_FOCUSED_CHANNEL:
- return
-
- text = ""
- if _settingsManager.getSetting('chatSpeakRoomName') and chatRoomName:
- text = _("Message from chat room %s") % chatRoomName
- text = self._script.utilities.appendString(text, message)
-
- if len(text.strip()):
- speech.speak(text)
- self._script.displayBrailleMessage(text)
-
- def getMessageFromEvent(self, event):
- """Get the actual displayed message. This will almost always be the
- unaltered any_data from an event of type object:text-changed:insert.
-
- Arguments:
- - event: the Event from which to take the text.
-
- Returns the string which should be presented as the newly-inserted
- text. (Things like chatroom name prefacing get handled elsewhere.)
- """
-
- return event.any_data
-
- def presentInsertedText(self, event):
- """Gives the Chat class an opportunity to present the text from the
- text inserted Event.
-
- Arguments:
- - event: the text inserted Event
-
- Returns True if we handled this event here; otherwise False, which
- tells the associated script that is not a chat event that requires
- custom handling.
- """
-
- if not event \
- or not event.type.startswith("object:text-changed:insert") \
- or not event.any_data:
- return False
-
- if self.isGenericTextObject(event.source):
- # The script should handle non-chat specific text areas (e.g.,
- # adding a new account).
- #
- return False
-
- elif self.isInBuddyList(event.source):
- # These are status changes. What the Pidgin script currently
- # does for these is ignore them. It might be nice to add
- # some options to allow the user to customize what status
- # changes are presented. But for now, we'll ignore them
- # across the board.
- #
- return True
-
- elif self.isTypingStatusChangedEvent(event):
- self.presentTypingStatusChange(event, event.any_data)
- return True
-
- elif self.isChatRoomMsg(event.source):
- # We always automatically go back to focus tracking mode when
- # someone sends us a message.
- #
- if self._script.flatReviewContext:
- self._script.toggleFlatReviewMode()
-
- if self.isNewConversation(event.source):
- name = self.getChatRoomName(event.source)
- conversation = Conversation(name, event.source)
- else:
- conversation = self.getConversation(event.source)
- name = conversation.name
- message = self.getMessageFromEvent(event).strip("\n")
- if message:
- self.addMessageToHistory(message, conversation)
-
- # The user may or may not want us to present this message. Also,
- # don't speak the name if it's the focused chat.
- #
- focused = self.isFocusedChat(event.source)
- if focused:
- name = ""
- if message:
- self.utterMessage(name, message, focused)
- return True
-
- elif self.isAutoCompletedTextEvent(event):
- text = event.any_data
- if text.decode("UTF-8").isupper():
- speech.speak(text,
- self._script.voices[settings.UPPERCASE_VOICE])
- else:
- speech.speak(text)
- return True
-
- return False
-
- def presentTypingStatusChange(self, event, status):
- """Presents a change in typing status for the current conversation
- if the status has indeed changed and if the user wants to hear it.
-
- Arguments:
- - event: the accessible Event
- - status: a string containing the status change
-
- Returns True if we spoke the change; False otherwise
- """
-
- if _settingsManager.getSetting('chatAnnounceBuddyTyping'):
- conversation = self.getConversation(event.source)
- if conversation and (status != conversation.getTypingStatus()):
- speech.speak(status)
- conversation.setTypingStatus(status)
- return True
-
- return False
-
- def addMessageToHistory(self, message, conversation):
- """Adds message to both the individual conversation's history
- as well as to the complete history stored in our conversation
- list.
-
- Arguments:
- - message: a string containing the message to be added
- - conversation: the instance of the Conversation class to which
- this message belongs
- """
-
- conversation.addMessage(message)
- self._conversationList.addMessage(message, conversation)
-
- ########################################################################
- # #
- # Convenience methods for identifying, locating different accessibles #
- # #
- ########################################################################
-
- def isGenericTextObject(self, obj):
- """Returns True if the given accessible seems to be something
- unrelated to the custom handling we're attempting to do here.
-
- Arguments:
- - obj: the accessible object to examine.
- """
-
- state = obj.getState()
- if state.contains(pyatspi.STATE_EDITABLE) \
- and state.contains(pyatspi.STATE_SINGLE_LINE):
- return True
-
- return False
-
- def isBuddyList(self, obj):
- """Returns True if obj is the list of buddies in the buddy list
- window. Note that this method relies upon a hierarchical check,
- using a list of hierarchies provided by the script. Scripts
- which have more reliable means of identifying the buddy list
- can override this method.
-
- Arguments:
- - obj: the accessible being examined
- """
-
- if obj:
- for roleList in self._buddyListAncestries:
- if self._script.utilities.hasMatchingHierarchy(obj, roleList):
- return True
-
- return False
-
- def isInBuddyList(self, obj, includeList=True):
- """Returns True if obj is, or is inside of, the buddy list.
-
- Arguments:
- - obj: the accessible being examined
- - includeList: whether or not the list itself should be
- considered "in" the buddy list.
- """
-
- if includeList and self.isBuddyList(obj):
- return True
-
- for roleList in self._buddyListAncestries:
- buddyListRole = roleList[0]
- candidate = self._script.utilities.ancestorWithRole(
- obj, [buddyListRole], [pyatspi.ROLE_FRAME])
- if self.isBuddyList(candidate):
- return True
-
- return False
-
- def isNewConversation(self, obj):
- """Returns True if the given accessible is the chat history
- associated with a new conversation.
-
- Arguments:
- - obj: the accessible object to examine.
- """
-
- conversation = self.getConversation(obj)
- return not self._conversationList.hasConversation(conversation)
-
- def getConversation(self, obj):
- """Attempts to locate the conversation associated with obj.
-
- Arguments:
- - obj: the accessible of interest
-
- Returns the conversation if found; None otherwise
- """
-
- if not obj:
- return None
-
- name = ""
- # TODO - JD: If we have multiple chats going on and those
- # chats have the same name, and we're in the input area,
- # this approach will fail. What I should probably do instead
- # is, upon creation of a new conversation, figure out where
- # the input area is and save it. For now, I just want to get
- # things working. And people should not be in multiple chat
- # rooms with identical names anyway. :-)
- #
- if obj.getRole() in [pyatspi.ROLE_TEXT, pyatspi.ROLE_ENTRY] \
- and obj.getState().contains(pyatspi.STATE_EDITABLE):
- name = self.getChatRoomName(obj)
-
- for conversation in self._conversationList.conversations:
- if name:
- if name == conversation.name:
- return conversation
- # Doing an equality check seems to be preferable here to
- # utilities.isSameObject as a result of false positives.
- #
- elif obj == conversation.accHistory:
- return conversation
-
- return None
-
- def isChatRoomMsg(self, obj):
- """Returns True if the given accessible is the text object for
- associated with a chat room conversation.
-
- Arguments:
- - obj: the accessible object to examine.
- """
-
- if obj and obj.getRole() == pyatspi.ROLE_TEXT \
- and obj.parent.getRole() == pyatspi.ROLE_SCROLL_PANE:
- state = obj.getState()
- if not state.contains(pyatspi.STATE_EDITABLE) \
- and state.contains(pyatspi.STATE_MULTI_LINE):
- return True
-
- return False
-
- def isFocusedChat(self, obj):
- """Returns True if we plan to treat this chat as focused for
- the purpose of deciding whether or not a message should be
- presented to the user.
-
- Arguments:
- - obj: the accessible object to examine.
- """
-
- if obj and obj.getState().contains(pyatspi.STATE_SHOWING):
- topLevel = self._script.utilities.topLevelObject(obj)
- if topLevel and topLevel.getState().contains(pyatspi.STATE_ACTIVE):
- return True
-
- return False
-
- def getChatRoomName(self, obj):
- """Attempts to find the name of the current chat room.
-
- Arguments:
- - obj: The accessible of interest
-
- Returns a string containing what we think is the chat room name.
- """
-
- # Most of the time, it seems that the name can be found in the
- # page tab which is the ancestor of the chat history. Failing
- # that, we'll look at the frame name. Failing that, scripts
- # should override this method. :-)
- #
- ancestor = self._script.utilities.ancestorWithRole(
- obj,
- [pyatspi.ROLE_PAGE_TAB, pyatspi.ROLE_FRAME],
- [pyatspi.ROLE_APPLICATION])
- name = ""
- try:
- text = self._script.utilities.displayedText(ancestor)
- if text.lower().strip() != self._script.name.lower().strip():
- name = text
- except:
- pass
-
- # Some applications don't trash their page tab list when there is
- # only one active chat, but instead they remove the text or hide
- # the item. Therefore, we'll give it one more shot.
- #
- if not name:
- ancestor = self._script.utilities.ancestorWithRole(
- ancestor, [pyatspi.ROLE_FRAME], [pyatspi.ROLE_APPLICATION])
- try:
- text = self._script.utilities.displayedText(ancestor)
- if text.lower().strip() != self._script.name.lower().strip():
- name = text
- except:
- pass
-
- return name
-
- def isAutoCompletedTextEvent(self, event):
- """Returns True if event is associated with text being autocompleted.
-
- Arguments:
- - event: the accessible event being examined
- """
-
- lastKey, mods = self._script.utilities.lastKeyAndModifiers()
- if lastKey == "Tab" and event.any_data and event.any_data != "\t":
- return True
-
- return False
-
- def isTypingStatusChangedEvent(self, event):
- """Returns True if event is associated with a change in typing status.
-
- Arguments:
- - event: the accessible event being examined
- """
+IPlugin.register(chatPlugin)
- # TODO - JD: I still need to figure this one out. Pidgin seems to
- # no longer be presenting this change in the conversation history
- # as it was doing before. And I'm not yet sure what other apps do.
- # In the meantime, scripts can override this.
- #
- return False
diff --git a/src/orca/baseplugins/test.py b/src/orca/baseplugins/test.py
index d55909c..a0a85f7 100644
--- a/src/orca/baseplugins/test.py
+++ b/src/orca/baseplugins/test.py
@@ -5,13 +5,11 @@ from pluglib.interfaces import *
class gConfPlugin(GConfStore):
defaults = {
- 'hola': 1,
- 'adios': 2,
- 'estres': 'hola'
+ 'enable': True,
}
def __init__(self):
- super(gConfPlugin, self).__init__('/apps/popoter/plugins/test')
+ super(gConfPlugin, self).__init__('/apps/orca/plugins/test')
self.save()
print 'Hello World (plugin started)!'
@@ -24,6 +22,9 @@ class testPlugin(IPlugin):
icon = 'gtk-missing-image'
def __init__(self):
- gc_plug = gConfPlugin()
+ self.gc_plug = gConfPlugin()
+
+ def disable(self):
+ self.gc_plug.disable('enable')
IPlugin.register(testPlugin)
diff --git a/src/orca/plugin_manager.py b/src/orca/plugin_manager.py
index 794c595..e51d087 100644
--- a/src/orca/plugin_manager.py
+++ b/src/orca/plugin_manager.py
@@ -83,4 +83,3 @@ class TestPluginManager(ModulePluginManager, GConfStore):
plugmanager = TestPluginManager()
-print "plugmanager detecting..." + str(plugmanager.get_plugins())
diff --git a/src/orca/pluglib/confstore.py b/src/orca/pluglib/confstore.py
index 0629c55..83f9c37 100644
--- a/src/orca/pluglib/confstore.py
+++ b/src/orca/pluglib/confstore.py
@@ -22,7 +22,7 @@ import types
from interfaces import IConfigurable, PluginError
-__all__ = ['GConfStore', 'PickleStore']
+__all__ = ['GConfStore']
class GConfKeysDict(dict):
VALID_KEY_TYPES = (bool, str, int, float, list, tuple)
@@ -83,4 +83,5 @@ class GConfStore(IConfigurable):
casts[type(value)](self.__client, self.__app_key + '/' + name,
value)
-
+ def disable(self, param):
+ self.__client.set_bool(self.__app_key + '/' + param, False)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]