-
Notifications
You must be signed in to change notification settings - Fork 0
/
layout.hpp
137 lines (112 loc) · 3.78 KB
/
layout.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
* Copyright 2010 Giovanni Simoni
*
* This file is part of libgnupplus.
*
* libgnupplus 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.
*
* libgnupplus 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.
*
* You should have received a copy of the GNU General Public License
* along with libgnupplus. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef __defined_gnupplus_layout_hpp
#define __defined_gnupplus_layout_hpp
#include <map>
#include <list>
#include <utility>
#include <stdexcept>
#include <string>
#include <stdint.h>
#include <gnupplus/drawable.hpp>
#include <gnupplus/plots.hpp>
#include <gnupplus/pipe.hpp>
namespace gnup {
typedef std::pair<unsigned, unsigned> Coords;
/** Layout cell
*
* The graph will be subdivided into cells basing on the layout
* definition.
*
* Each cell of the layout can be used to plot multiple graphs, which
* will be overlapped and managed with the appropriate scale.
*
* Basically this is a list of plots of a single cell, but it's
* characterized by some graph-related characteistics.
*/
class Cell : public Drawable {
public:
Cell ();
Cell (Cell &c);
void setXLabel (const char *label);
void setYLabel (const char *label);
void setZLabel (const char *label);
void setXRange (double min, double max);
void setYRange (double min, double max);
void setZRange (double min, double max);
void writeSettings (Comm *c);
void resetSettings (Comm *c);
void draw (Comm *c);
void addPlot (Plot &p);
void setTitle (const char *title);
void setTrigger (Trigger *t);
private:
size_t dimensions;
uint8_t flags;
std::string title;
struct {
const char *x, *y, *z;
} labels;
struct {
struct {
double min, max;
} x, y, z;
} ranges;
static const uint8_t RANGE_X = 1 << 0;
static const uint8_t RANGE_Y = 1 << 1;
static const uint8_t RANGE_Z = 1 << 2;
static const uint8_t LABEL_X = 1 << 3;
static const uint8_t LABEL_Y = 1 << 4;
static const uint8_t LABEL_Z = 1 << 5;
std::list<Plot *> plots;
void init (Comm *c);
void display (Comm *c);
void reset (Comm *c);
};
/** From cell coordinate to plot.
*
* Like an umbounded matrix.
*/
typedef std::map<Coords, Cell *> CellMap;
/** Exception for layout */
class LayoutError : public std::logic_error {
public:
LayoutError (const std::string &m) :
std::logic_error(m) {}
};
class Layout : public Drawable {
public:
Layout (size_t nrows, size_t ncols);
Layout (Layout &l);
virtual ~Layout ();
void draw (Comm *c);
void setTrigger (Trigger *trig);
void addPlot (Plot &p, unsigned row, unsigned col);
Cell & getCell (unsigned row = 0, unsigned col = 0);
private:
void init (Comm *c);
void display (Comm *c);
void reset (Comm *c);
size_t ncols;
size_t nrows;
CellMap cells;
};
}
#endif // __defined_gnupplus_layout_hpp