1 /***************************************************************************
2     File                 : PlotToolInterface.h
3     Project              : QtiPlot
4     --------------------------------------------------------------------
5     Copyright            : (C) 2007 by Knut Franke, Ion Vasilief
6     Email (use @ for *)  : knut.franke*gmx.de, ion_vasilief*yahoo.fr
7     Description          : Interface for tools operating on a Graph
8 
9  ***************************************************************************/
10 
11 /***************************************************************************
12  *                                                                         *
13  *  This program is free software; you can redistribute it and/or modify   *
14  *  it under the terms of the GNU General Public License as published by   *
15  *  the Free Software Foundation; either version 2 of the License, or      *
16  *  (at your option) any later version.                                    *
17  *                                                                         *
18  *  This program is distributed in the hope that it will be useful,        *
19  *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
20  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
21  *  GNU General Public License for more details.                           *
22  *                                                                         *
23  *   You should have received a copy of the GNU General Public License     *
24  *   along with this program; if not, write to the Free Software           *
25  *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
26  *   Boston, MA  02110-1301  USA                                           *
27  *                                                                         *
28  ***************************************************************************/
29 #ifndef PLOT_TOOL_INTERFACE_H
30 #define PLOT_TOOL_INTERFACE_H
31 
32 class Graph;
33 #include <QObject>
34 
35 /*! Interface for tools operating on a Graph.
36  *
37  * The basic idea is to have one PlotToolInterface subclass per user-visible tool operating on a Graph,
38  * although there may be cases where exceptions to this rule are appropriate.
39  * %Note that tools can be presented to the user via icons (like DataPickerTool) or via menu entries
40  * (like TranslateCurveTool); the basic concept is quite similar.
41  * The main point in managing plot tools as subclasses of this class (as opposed to using void pointers)
42  * is the virtual destructor that allows tools to clean up after themselves.
43  * Additionally, a pointer to the parent Graph (#d_graph) is managed.
44  * In the future, this class may provide other generic tool functionality.
45  *
46  * %Note that zooming and range selection are somewhat special in that they can be active in addition
47  * to other tools. These are handled as special cases, while all other tools are rendered mutually exclusive
48  * by having Graph manage a pointer to the currently active tool (Graph::d_active_tool).
49  *
50  * It would be nice for some of the plot tools (like TranslateCurveTool or MultiPeakFitTool) to send a signal
51  * when they are finished and to generalize the statusText signal provided by most tools, but having
52  * PlotToolInterface inherit from QObject would make it impossible for
53  * plot tools to also inherit from other QObject decendants (such as QwtPlotPicker).
54  * As a workaround, plot tools can call Graph::setActiveTool(), carefully noting that they are deleted
55  * during this call.
56  *
57  * Currently, plot tools are instantiated by ApplicationWindow and handed to the Graph in question;
58  * this scheme will have to be revised for dynamically adding new tools via plugins.
59  */
60 class PlotToolInterface
61 {
62 	public:
63 
64     enum RttiValues
65     {
66         Rtti_PlotTool = 0,
67 
68         Rtti_RangeSelector,
69         Rtti_DataPicker,
70         Rtti_TranslateCurveTool,
71         Rtti_MultiPeakFitTool,
72         Rtti_LineProfileTool,
73 		Rtti_AddWidgetTool,
74 		Rtti_DrawDataPoints,
75 		Rtti_ImageProfilesTool,
76 		Rtti_SubtractLineTool,
77         Rtti_PlotUserTool = 1000
78     };
79 
80 		PlotToolInterface(Graph *graph, const QObject *status_target = NULL, const char *status_slot = "") {d_status_target = status_target; d_status_slot = status_slot; d_graph = graph;};
~PlotToolInterface()81 		virtual ~PlotToolInterface() {};
82 
rtti()83         virtual int rtti() const { return Rtti_PlotTool;};
84 
85 	protected:
86 		Graph *d_graph;
87 		const QObject *d_status_target;
88 		const char *d_status_slot;
89 };
90 
91 #endif // ifndef PLOT_TOOL_INTERFACE_H
92