summaryrefslogtreecommitdiff
path: root/src/pmview/viewobj.h
blob: f713c71213c4a5b96bc73effd5d8fe922b682be5 (plain)
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
/*
 * Copyright (c) 1997 Silicon Graphics, Inc.  All Rights Reserved.
 * Copyright (c) 2009 Aconex.  All Rights Reserved.
 * 
 * This program 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 2 of the License, or (at your
 * option) any later version.
 * 
 * This program 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.
 */
#ifndef _VIEWOBJ_H_
#define _VIEWOBJ_H_

#include <QtCore/QTextStream>

class SoNode;
class SoSeparator;
class SoTranslation;
class Modulate;
class DefaultObj;

class ViewObj
{
public:

    enum Alignment { north, south, east, west, 
		     northEast, northWest, southEast, southWest,
		     center };

    enum Shape { cube, cylinder };

    // Poor man substitution for RTTI until O32 compiler will either
    // die or start supporting that stuff
    enum ObjType {VIEWOBJ = 1, 
		  BASEOBJ = 2, 
		  LABELOBJ = 4,
		  MODOBJ = 8,
		  GRIDOBJ = 16,
		  PIPEOBJ = 32,
		  BAROBJ = 64,
		  STACKOBJ = 128,
		  LINK = 256, 
		  XING = 512,
		  SCENEFILEOBJ = 1024
    };

protected:

    SoSeparator		*_root;
    SoTranslation	*_tran;

    int			_objtype;
    int			_col;
    int			_row;
    int			_cols;
    int			_rows;
    int			_maxHeight;
    float		_xAlign;
    float		_zAlign;

    static int		theNumModObjects;

public:

    virtual ~ViewObj();

    ViewObj(int, int, int cols = 1, int rows = 1, 
	    Alignment align = center);

    // The Scene Graph Root for this object
    SoSeparator* root()
	{ return _root; }

    int objbits() const { return _objtype; }
    int row() const { return _row; }
    int col() const { return _col; }

    int cols() const
	{ return _cols; }
    int rows() const
	{ return _rows; }
    int height() const
	{ return _maxHeight; }
    int &height()
	{ return _maxHeight; }
    float xAlign() const
	{ return _xAlign; }
    float zAlign() const
	{ return _zAlign; }

    // Set the coordinates (and the allocated size) from parent
    virtual void setTran(float xTran, float zTran, int width, int depth);

    // Size (in object coordinates). Must be the correct value before
    // the object is added to the parent.
    virtual int width() const = 0;
    virtual int depth() const = 0;

    static int numModObjects()
	{ return theNumModObjects; }

    // Return default object
    static SoNode *object(Shape shape);

    virtual Modulate *modObj()
	{ return (Modulate *)0; }

    // Inform object parsing stuff is done

    virtual void finishedAdd() = 0;

    // Output
    virtual void display(QTextStream& os) const;

    virtual const char* name() const = 0;

    friend QTextStream& operator<<(QTextStream& os, ViewObj const& rhs);

protected:

    void dumpShape(QTextStream& os, ViewObj::Shape shape) const;

private:

    ViewObj();
    ViewObj(ViewObj const &);
    ViewObj const& operator=(ViewObj const &);
    // Never defined
};

#endif /* _VIEWOBJ_H_ */