Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/core/command/Shell.h @ 8858

Last change on this file since 8858 was 8858, checked in by landauf, 13 years ago

merged output branch back to trunk.

Changes:

  • you have to include util/Output.h instead of util/Debug.h
  • COUT(x) is now called orxout(level)
  • output levels are now defined by an enum instead of numbers. see util/Output.h for the definition
  • it's possible to use output contexts with orxout(level, context). see util/Output.h for some common contexts. you can define more contexts
  • you must use 'endl' at the end of an output message, '\n' does not flush the message

Output levels:

  • instead of COUT(0) use orxout()
  • instead of COUT(1) use orxout(user_error) or orxout(internal_error)
  • instead of COUT(2) use orxout(user_warning) or orxout(internal_warning)
  • instead of COUT(3) use orxout(user_status/user_info) or orxout(internal_status/internal_info)
  • instead of COUT(4) use orxout(verbose)
  • instead of COUT(5) use orxout(verbose_more)
  • instead of COUT(6) use orxout(verbose_ultra)

Guidelines:

  • user_* levels are for the user, visible in the console and the log-file
  • internal_* levels are for developers, visible in the log-file
  • verbose_* levels are for debugging, only visible if the context of the output is activated

Usage in C++:

  • orxout() << "message" << endl;
  • orxout(level) << "message" << endl;
  • orxout(level, context) << "message" << endl;

Usage in Lua:

  • orxout("message")
  • orxout(orxonox.level.levelname, "message")
  • orxout(orxonox.level.levelname, "context", "message")

Usage in Tcl (and in the in-game-console):

  • orxout levelname message
  • orxout_context levelname context message
  • shortcuts: log message, error message, warning message, status message, info message, debug message
  • Property svn:eol-style set to native
File size: 8.4 KB
RevLine 
[1505]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
[6105]25 *      Reto Grieder
[1505]26 *
27 */
28
[7401]29/**
30    @defgroup ShellConsole Shell and console
31    @ingroup Command
32*/
33
34/**
35    @file
36    @ingroup Command ShellConsole
37    @brief Declaration of the Shell and ShellListener classes.
38*/
39
[1505]40#ifndef _Shell_H__
41#define _Shell_H__
42
[7203]43#include "core/CorePrereqs.h"
[1792]44
[1505]45#include <list>
[6105]46#include <sstream>
[3196]47#include <string>
[1505]48#include <vector>
49
[8858]50#include "util/output/BaseWriter.h"
[8729]51#include "core/Core.h"
[7203]52#include "core/OrxonoxClass.h"
[1505]53
54namespace orxonox
55{
[7401]56    /**
57        @brief An interface, used to get a notification if the state of the Shell changes.
58    */
[1505]59    class _CoreExport ShellListener
60    {
61        friend class Shell;
62
63        public:
64            virtual ~ShellListener() {}
65
66        private:
[7401]67            virtual void linesChanged() {}          ///< Called if all output-lines have changed
68            virtual void lineAdded() {}             ///< Called if a new line was added to the output
69            virtual void inputChanged() {}          ///< Called if the input has changed
70            virtual void cursorChanged() {}         ///< Called if the cursor in the input line has changed
71            virtual void executed() {}              ///< Called if a command from the input line was executed
72            virtual void exit() {}                  ///< Called if the console should be closed
[1505]73    };
74
[6105]75
[7401]76    /**
77        @brief The Shell is the logical component of the console that displays output to the user and allows him to enter commands.
78
[8858]79        The Shell gathers output sent from OutputManager by inheriting from BaseWriter.
[7401]80        The output-lines are stored in the shell, so they can be displayed in a graphical
81        console. Additionally the Shell has an InputBuffer which is needed by the user to
82        enter commands.
83
84        Different graphical consoles build upon a Shell, for example InGameConsole and IOConsole.
85    */
[8858]86    class _CoreExport Shell : public BaseWriter, public DevModeListener
[1505]87    {
88        public:
[7401]89            /// Defines the type of a line of text in the Shell - some types depend on the output level, others are of internal use.
[6417]90            enum LineType
91            {
[8858]92                DebugOutput     = debug_output,
93                Message         = message,
94                UserError       = user_error,
95                UserWarning     = user_warning,
96                UserStatus      = user_status,
97                UserInfo        = user_info,
98                InternalError   = internal_error,
99                InternalWarning = internal_warning,
100                InternalStatus  = internal_status,
101                InternalInfo    = internal_info,
102                Verbose         = verbose,
103                VerboseMore     = verbose_more,
104                VerboseUltra    = verbose_ultra,
105                Cout,
[6417]106                Input,
107                Command,
[8858]108                Result,
[6417]109                Hint
110            };
111
112            Shell(const std::string& consoleName, bool bScrollable);
[6105]113            ~Shell();
[1505]114
[6105]115            void setConfigValues();
[1747]116            void commandHistoryOffsetChanged();
117            void commandHistoryLengthChanged();
[1505]118
119            void registerListener(ShellListener* listener);
120            void unregisterListener(ShellListener* listener);
121
[7401]122            /// Returns the input buffer which is needed by the user to enter text into the shell.
[1755]123            inline InputBuffer* getInputBuffer()
124                { return this->inputBuffer_; }
[1505]125
126            void setCursorPosition(unsigned int cursor);
[8729]127            unsigned int getCursorPosition() const;
[1505]128
[8729]129            const std::string& getInput() const;
[1505]130
[6417]131            typedef std::list<std::pair<std::string, LineType> > LineList;
132            LineList::const_iterator getNewestLineIterator() const;
133            LineList::const_iterator getEndIterator() const;
[1505]134
[8858]135            void addOutput(const std::string& text, LineType type = DebugOutput);
136            void addLine(const std::string& line, LineType type = DebugOutput);
[6105]137            void clearOutput();
[1505]138
[7401]139            /// Returns the number of output-lines that are displayed in the shell.
[1505]140            inline unsigned int getNumLines() const
[6105]141                { return this->outputLines_.size(); }
[7401]142            /// Returns the line which is currently viewed if the user scrolls through the older output-lines in the shell.
[1505]143            inline unsigned int getScrollPosition() const
144                { return this->scrollPosition_; }
145
[7401]146            /// Returns the cache size that is actually used in CommandExecutor, but placed here for better readability of the config file.
[7229]147            static inline unsigned int getCacheSize()
148                { return Shell::cacheSize_s; }
149
[1505]150        private:
151            Shell(const Shell& other);
152
[8729]153            // DevModeListener
154            void devModeChanged(bool value);
155
[1505]156            void addToHistory(const std::string& command);
[6417]157            const std::string& getFromHistory() const;
[6105]158            void clearInput();
[8858]159            // BaseWriter
160            virtual void printLine(const std::string& line, OutputLevel level);
[1505]161
[6105]162            void configureInputBuffer();
163
164            // InputBuffer callbacks
[1505]165            void inputChanged();
166            void execute();
[6105]167            void hintAndComplete();
[1505]168            void backspace();
[6105]169            void deleteChar();
170            void cursorRight();
171            void cursorLeft();
172            void cursorEnd();
173            void cursorHome();
174            void historyUp();
175            void historyDown();
176            void historySearchUp();
177            void historySearchDown();
178            void scrollUp();
179            void scrollDown();
[1505]180            void exit();
181
[7401]182            /// Iterates through all registered @ref ShellListener "shell listeners" and calls the function @a F.
[6105]183            template <void (ShellListener::*F)()>
184            void updateListeners()
185            {
186                for (std::list<ShellListener*>::const_iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
187                    ((*(it++))->*F)();
188            }
189
[7401]190            std::list<ShellListener*> listeners_;           ///< The registered shell listeners
191            InputBuffer*              inputBuffer_;         ///< The input buffer that is needed by the user to enter text
192            LineList                  outputLines_;         ///< A list of all output-lines that were displayed in the shell so far
193            LineList::const_iterator  scrollIterator_;      ///< An iterator to an entry of the list of output-lines, changes if the user scrolls through the output in the shell
194            unsigned int              scrollPosition_;      ///< The number of the line that is currently being referenced by scrollIterator_
195            unsigned int              historyPosition_;     ///< If the user scrolls through the history of entered commands (stored in commandHistory_), this contains the currently viewed history entry
196            const bool                bScrollable_;         ///< If true, the user can scroll through the output-lines
[3280]197
[6105]198            // Config values
[7401]199            unsigned int              maxHistoryLength_;    ///< The maximum number of saved commands
200            unsigned int              historyOffset_;       ///< The command history is a circular buffer, this variable defines the current write-offset
201            std::vector<std::string>  commandHistory_;      ///< The history of commands that were entered by the user
202            static unsigned int       cacheSize_s;          ///< The maximum cache size of the CommandExecutor - this is stored here for better readability of the config file and because CommandExecutor is no OrxonoxClass
[1505]203    };
204}
205
206#endif /* _Shell_H__ */
Note: See TracBrowser for help on using the repository browser.