Warning, /education/cantor/DESIGN is written in an unsupported language. File is not indexed.
0001 0002 General: 0003 0004 Cantor is designed to be very modular. It is split into these important parts: 0005 0006 - Main application: 0007 The Cantor application itself is stored in the src/ directory. It implements the worksheet and all the 0008 Graphical user interface. It uses the Cantor library to access the different backends. 0009 Cantor consists of two important parts, a KPart that contains one Worksheet, and a shell, 0010 that contains several parts, and sorts them into Tabs. 0011 0012 - Cantor library: 0013 The library provides all the interfaces for using the different Backends. It should be completely 0014 independent of the final graphical representation of the results. (e.g. always keep the possibility 0015 of a Cantor KRunner or plasmoid in mind). It resides in src/lib/ 0016 0017 - Backends 0018 The src/backends directory contains all the different Backends. They all reimplement the interfaces found in 0019 the Cantor library, to enable access to a math package. There are lots of different ways to communicate with the 0020 Math app. To check how a backend is designed, look at the DESIGN file in the backends directory. 0021 0022 For dependencies between these modules, these rules apply: 0023 - everything can depend on lib 0024 - the main app can depend on any other module 0025 - lib doesn't depend on other modules 0026 - each backend, and the assistants only depend on lib 0027 0028 0029 Coding style: 0030 0031 Generally Cantor follows the KDELibs coding style (see http://techbase.kde.org/Policies/Kdelibs_Coding_Style ). 0032 Some notes: 0033 - use 4 spaces for indentation 0034 - use m_ prefix for member variables. no other prefixes 0035 - for the library use d-pointers (see http://techbase.kde.org/Policies/Library_Code_Policy#D-Pointers) to allow binary compatibility later 0036 - if you add things to the library, remember to add apidocs 0037 0038 0039 The Worksheet: 0040 0041 Cantor's worksheet is implemented as a QGraphicsScene (the Worksheet class) with a corresponding QGraphicsView (the WorksheetView class). 0042 Each entry in the worksheet is represented by its own WorksheetEntry, which is a subclass of QGraphicsObject. 0043 The entries can have child items to display text (WorksheetTextItem) or images (WorksheetImageItem). The layout of 0044 these child items is defined in WorksheetEntry::layOutForWidth(double width, bool force). 0045 To display the calculation results the special items TextResultItem, ImageResultItem and AnimationResultItem are available. 0046 0047 The WorksheetEntry holds an Expression object, and reacts on its status changes, and arriving results. 0048 Also it is in charge of requesting Completions or SyntaxHelp. 0049 0050 The worksheet also stores one instance of the EpsRenderer, which is used whenever eps images need to be displayed, 0051 e.g. in LaTeX results. 0052 0053 Note: The HelpResult is not handled by the Entry, but by the Worksheet, and it forwards 0054 it's content outside of the part using a signal. So the CantorShell can show it in the 0055 side-panel. 0056 0057 0058 The library: 0059 The library consists of a bunch of interfaces, for the different backends, and some 0060 stuff that is useful for math applications, independent of the Design of the ui(not limited to Worksheet-interfaces). 0061 Things should not be depending on a specific backend, but it's acceptable to have interfaces only implemented by 0062 one backend. (although that might change once a better plugin infrastructure is in place) 0063 0064 - Basic design of a backend: 0065 This is just a brief introduction of the concepts relevant to the Backends. 0066 For more information please see the apidocs of the relevant classes. 0067 For a simple sample of a backend you can look at the NullBackend. It only echoes 0068 the entered command, or shows an image if you type "img", so it akts as a good 0069 example on how to do things. 0070 0071 Backends are implemented as plugins that are found on runtime, to allow easy installation of 0072 additional backends. 0073 0074 A backend consists of the following parts: 0075 - Backend: 0076 This class is used to store some static information of the backend, like its name, some links, or the 0077 features it supports. Each backend can supply a widget, for changing the relevant settings. 0078 - Session: 0079 A session is where a connection to an instance of the math-app is created, e.g. by spawning a maxima process. 0080 It implements methods for evaluating expressions, it delivers a syntax highlighter, or CompletionObjects. 0081 The most important methods are login(), logout() and evaluateExpression(). see the apidocs for more information. 0082 - Expression: 0083 The Expression encapsulates one specific command send to the backend, and its result. It gets created by 0084 the session, and destroyed by the Worksheet when the entry is deleted or replaced by a new Expression. 0085 When the expression is run, it sends the command to the underlying backend to do the computation, and sets 0086 the state to Computing. 0087 Once the task is completed it should sets the state to Done or Error, depending on the result, to notify 0088 the worksheet that it is no longer busy. 0089 Once the result arrives, it emits the resultChanged() signal, so that the Worksheet can display it. 0090 Remember, the state and the result are independent, e.g. if you have typesetting enabled, the state will 0091 be set to done when the computation is finished, and the result will be set to a text-result. Once the 0092 typesetting is done the result changes again. 0093 0094 To be as flexible as possible regarding different kinds of results (a computation can deliver some text, 0095 a plot, a formula, an animation etc.), Cantor uses the concept of Results. 0096 For each kind of result there is a subclass, that stores the information relevant for the kind of result 0097 (e.g. the text, the image, an url etc.). Your backend is in charge of creating the right Result Type, and 0098 feeding it the information. The ResultProxy is then used to render the result in the Worksheet(@see The Worksheet) 0099 0100 0101 - Syntax Highlighting: 0102 Syntax highlighting is a very useful feature for entering commands. In Cantor it's implemented using 0103 Qt's QSyntaxHighlighter functionality. The Session is in charge for creating a SyntaxHighlighter object, 0104 so it can access all the Session relevant information (if you want to). While you can use an ordinary 0105 QSyntaxHighlighter object, you may want to use the DefaultHighlighter class. It delivers highlighting for 0106 parenthesis, and information on the different Blocks inside a Worksheet, e.g. to check if the part 0107 you're highlighting is a command or not. 0108 0109 - Completion: 0110 To allow Completion of partially entered Commands in a Backend-agnostic way, Cantor uses 0111 so called CompletionObjects. To get a completion, Cantor calls the Sessions completionFor 0112 method which is then in charge of creating a Backend-Specific CompletionObject. 0113 A CompletionObject should fetch the information from the backend, and emit the done() 0114 signal when finished, so the process of fetching should (but doesn't have to) be async 0115 to make sure the gui doesn't get blocked. 0116 0117 - SyntaxHelp: 0118 Syntax Help is the little tooltip, you get when pressing Tab, on an already complete 0119 command, that shows syntax information (see Maxima or KAlgebra for an implementation). 0120 The concept works similar to Completion. Cantor asks the session for a SyntaxHelpObject 0121 which then fetches the information asynchronously, and emits done(). 0122 0123 - Extensions: 0124 To allow backend-independend functionalities like Assistant dialogs, Cantor uses so called 0125 Extensions. 0126 These are subclasses of the Cantor::Extension class, that are created by the backend, 0127 and that translate between Cantor and the Backends specific Syntax. For example the 0128 PlotExtension translates PlotExtension::plot2d("sin(x)","x","-3.14","3.14") to maxima 0129 syntax "plot2d(sin(x),[x,-3.14,3.14])" 0130 0131 - Assistants 0132 Assistants are Dialogs, used for common tasks like entering a matrix, solving equations etc. 0133 Assistants are implemented as plugins, found at runtime. Each assistant has a list 0134 of Extensions it needs to work (located in the .desktop file), so they only will be shown 0135 for backends, capable of all the needed things. The Assistant will be run, and once it 0136 is finished, it returns a list of commands, to achieve the task. They will then be 0137 added to the Worksheet and executed. 0138 The philosophy behind this is not to hide the syntax from the user, so he may 0139 learn how things are done. 0140 NOTE: currently assistants can only work through extensions, but in the future, 0141 also backend-specific assistants will be possible. 0142 0143