From e78e4318c5f3b7536c713fbf17080d0bc79d95e1 Mon Sep 17 00:00:00 2001 From: Alexander Cherniuk <ts33kr@gmail.com> Date: Fri, 6 Aug 2010 06:07:28 +0300 Subject: [PATCH] Upgraded middleware inside the command system. Added support for proper output style --- src/chat_control.py | 4 + .../implementation/middleware.py | 101 ++++++++++++++---- src/command_system/tools.py | 10 +- 3 files changed, 91 insertions(+), 24 deletions(-) diff --git a/src/chat_control.py b/src/chat_control.py index 6a89dfcd6b..2de9431872 100644 --- a/src/chat_control.py +++ b/src/chat_control.py @@ -409,6 +409,10 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): self.command_hits = [] self.last_key_tabs = False + # This is bascially a very nasty hack to surpass the inability + # to properly use the super, because of the old code. + CommandTools.__init__(self) + def set_speller(self): # now set the one the user selected per_type = 'contacts' diff --git a/src/command_system/implementation/middleware.py b/src/command_system/implementation/middleware.py index ed158d5b48..325f19b0f1 100644 --- a/src/command_system/implementation/middleware.py +++ b/src/command_system/implementation/middleware.py @@ -1,42 +1,58 @@ -# Copyright (C) 2009-2010 Alexander Cherniuk <ts33kr@gmail.com> +# Copyright (c) 2009-2010, Alexander Cherniuk (ts33kr@gmail.com) +# All rights reserved. # -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. # -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ Provides a glue to tie command system framework and the actual code where it would be dropped in. Defines a little bit of scaffolding to support interaction between the two and a few utility methods so you -don't need to dig up the code itself code to write basic commands. +don't need to dig up the code itself to write basic commands. """ from types import StringTypes from traceback import print_exc +from pango import FontDescription from common import gajim from ..framework import CommandProcessor from ..errors import CommandError, NoCommandError +from ..tools import gconf class ChatCommandProcessor(CommandProcessor): """ A basic scaffolding to provide convenient interaction between the - command system and chat controls. + command system and chat controls. It will be merged directly into + the controls, by ChatCommandProcessor being among superclasses of + the controls. """ def process_as_command(self, text): self.command_succeeded = False - flag = super(ChatCommandProcessor, self).process_as_command(text) + parents = super(ChatCommandProcessor, self) + flag = parents.process_as_command(text) if flag and self.command_succeeded: self.add_history(text) self.clear_input() @@ -44,17 +60,18 @@ class ChatCommandProcessor(CommandProcessor): def execute_command(self, name, arguments): try: - super(ChatCommandProcessor, self).execute_command(name, arguments) + parents = super(ChatCommandProcessor, self) + parents.execute_command(name, arguments) except NoCommandError, error: details = dict(name=error.name, message=error.message) message = "%(name)s: %(message)s\n" % details message += "Try using the //%(name)s or /say /%(name)s " % details message += "construct if you intended to send it as a text." - self.echo(message, 'error') + self.echo_error(message) except CommandError, error: - self.echo("%s: %s" % (error.name, error.message), 'error') + self.echo_error("%s: %s" % (error.name, error.message)) except Exception: - self.echo("An error occured while trying to execute the command", 'error') + self.echo_error("Error during command execution!") print_exc() else: self.command_succeeded = True @@ -87,14 +104,52 @@ class ChatCommandProcessor(CommandProcessor): class CommandTools: """ Contains a set of basic tools and shortcuts you can use in your - commands to performe some simple operations. + commands to perform some simple operations. These will be merged + directly into the controls, by CommandTools being among superclasses + of the controls. """ - def echo(self, text, kind='info'): + def __init__(self): + self.install_tags() + + def install_tags(self): + buffer = self.conv_textview.tv.get_buffer() + + name = gconf("/desktop/gnome/interface/monospace_font_name") + name = name if name else "Monospace" + font = FontDescription(name) + + command_ok_tag = buffer.create_tag("command_ok") + command_ok_tag.set_property("font-desc", font) + command_ok_tag.set_property("foreground", "#3465A4") + + command_error_tag = buffer.create_tag("command_error") + command_error_tag.set_property("font-desc", font) + command_error_tag.set_property("foreground", "#F57900") + + def shift_line(self): + buffer = self.conv_textview.tv.get_buffer() + iter = buffer.get_end_iter() + if iter.ends_line() and not iter.is_start(): + buffer.insert_with_tags_by_name(iter, "\n", "eol") + + def append_with_tags(self, text, *tags): + buffer = self.conv_textview.tv.get_buffer() + iter = buffer.get_end_iter() + buffer.insert_with_tags_by_name(iter, text, *tags) + + def echo(self, text, tag="command_ok"): + """ + Print given text to the user, as a regular command output. + """ + self.shift_line() + self.append_with_tags(text, tag) + + def echo_error(self, text): """ - Print given text to the user. + Print given text to the user, as an error command output. """ - self.print_conversation(str(text), kind) + self.echo(text, "command_error") def send(self, text): """ @@ -127,4 +182,4 @@ class CommandTools: """ Get the current connection object. """ - return gajim.connections[self.account] + return gajim.connections[self.account] \ No newline at end of file diff --git a/src/command_system/tools.py b/src/command_system/tools.py index 206e95a19d..59253a1520 100644 --- a/src/command_system/tools.py +++ b/src/command_system/tools.py @@ -32,4 +32,12 @@ def remove(sequence, target): sequence.remove(target) elif isinstance(sequence, DictType): if target in sequence: - del sequence[target] \ No newline at end of file + del sequence[target] + +def gconf(path): + try: + from gconf import client_get_default + except ImportError: + return + client = client_get_default() + return client.get_string(path) \ No newline at end of file -- GitLab