diff options
author | dos-reis <gdr@axiomatics.org> | 2011-05-23 07:47:04 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2011-05-23 07:47:04 +0000 |
commit | f89c5d0438e969615c4bb9e59192cad996109665 (patch) | |
tree | 2194b79bc16642ebd10d049d237fc00118f9b837 /src/gui/conversation.h | |
parent | f87a31a02a7b0b84ed877880d9ae22253ce89671 (diff) | |
download | open-axiom-f89c5d0438e969615c4bb9e59192cad996109665.tar.gz |
Add new files
Diffstat (limited to 'src/gui/conversation.h')
-rw-r--r-- | src/gui/conversation.h | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/gui/conversation.h b/src/gui/conversation.h new file mode 100644 index 00000000..d949e9d6 --- /dev/null +++ b/src/gui/conversation.h @@ -0,0 +1,152 @@ +// Copyright (C) 2011, Gabriel Dos Reis. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// - Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// - 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. +// +// - Neither the name of OpenAxiom. nor the names of its contributors +// may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// 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 OWNER +// 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. + +#ifndef OPENAXIOM_CONVERSATION_INCLUDED +#define OPENAXIOM_CONVERSATION_INCLUDED + +#include <QFrame> +#include <QLineEdit> +#include <QLabel> +#include <QFont> +#include <vector> + +namespace OpenAxiom { + // A conversation is a set of exchanges. An exchange is a question + // followed by an answer. A conversation that takes place in a + // a certain frame is a debate. + class Debate; + class Conversation; + class Exchange; + class Question; + class Answer; + + // -- A question is just a one-liner query. + class Question : public QLineEdit { + public: + explicit Question(Exchange&); + }; + + class Answer : public QLabel { + public: + explicit Answer(Exchange&); + }; + + // -- Elemental conversation widget + // -- A basic interaction consists of a query, a reply, and the + // -- the type of the reply. + class Exchange : public QFrame { + Q_OBJECT; + public: + Exchange(Conversation&, int); + + // Return the parent widget of this conversation topic + Conversation* conversation(); + Debate* debate(); + + // The widget holding the query area + Question* question() { return &query; } + const Question* question() const { return &query; } + + // The widget holding the reply area. + Answer* answer() { return &reply; } + const Answer* answer() const { return &reply; } + + // Conversion number + int number() const { return no; } + + // Reimplement positiion management. + QSize sizeHint() const; + QSize minimumSizeHint() const; + + protected: + // void resizeEvent(QResizeEvent*); + + private: + const int no; + Question query; + Answer reply; + + private slots: + void reply_to_query(); + }; + + // -- Set of conversations that make up a session. + // -- We remember and number each topic so that we + // -- can go back in the conversation set and reevaluate + // -- queries. + class Conversation : public QWidget { + Q_OBJECT; + public: + explicit Conversation(Debate&); + ~Conversation(); + + // Holds if this conversation just started. + bool fresh() const { return children.empty(); } + + // Number of exchanges in this conversation + int length() const { return children.size(); } + + // Return the `i'-th conversation in this set, if any. + Exchange* operator[](int) const; + + // Start a new conversation topic. + Exchange* new_topic(); + + // Override QWidegt::sizeHint. Return the cumulative sizes + // of all conversations so far. + QSize sizeHint() const; + + // Return the parent engine widget. + Debate* debate() { return &group; } + + public slots: + // Return the topic following a given topic in this set of conversations + Exchange* next(Exchange*); + + private: + typedef std::vector<Exchange*> Children; + Debate& group; + Children children; + }; + + // Default number of characters per question line. + const int question_columns = 80; + + QFont monospace_font(); + QSize em_metrics(const QFont&); +} + +#endif // OPENAXIOM_CONVERSATION_INCLUDED + + +// Local Variables: +// mode: c++ +// End: |