source: trunk/tools/designer/src/lib/shared/connectionedit_p.h@ 235

Last change on this file since 235 was 2, checked in by Dmitry A. Kuminov, 17 years ago

Initially imported qt-all-opensource-src-4.5.1 from Trolltech.

File size: 10.3 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** Contact: Qt Software Information ([email protected])
5**
6** This file is part of the Qt Designer of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial Usage
10** Licensees holding valid Qt Commercial licenses may use this file in
11** accordance with the Qt Commercial License Agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and Nokia.
14**
15** GNU Lesser General Public License Usage
16** Alternatively, this file may be used under the terms of the GNU Lesser
17** General Public License version 2.1 as published by the Free Software
18** Foundation and appearing in the file LICENSE.LGPL included in the
19** packaging of this file. Please review the following information to
20** ensure the GNU Lesser General Public License version 2.1 requirements
21** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
22**
23** In addition, as a special exception, Nokia gives you certain
24** additional rights. These rights are described in the Nokia Qt LGPL
25** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
26** package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you are unsure which license is appropriate for your use, please
37** contact the sales department at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42//
43// W A R N I N G
44// -------------
45//
46// This file is not part of the Qt API. It exists for the convenience
47// of Qt Designer. This header
48// file may change from version to version without notice, or even be removed.
49//
50// We mean it.
51//
52
53
54#ifndef CONNECTIONEDIT_H
55#define CONNECTIONEDIT_H
56
57#include "shared_global_p.h"
58
59#include <QtCore/QMultiMap>
60#include <QtCore/QList>
61#include <QtCore/QPointer>
62
63#include <QtGui/QWidget>
64#include <QtGui/QPixmap>
65#include <QtGui/QPolygonF>
66
67#include <QtGui/QUndoCommand>
68
69QT_BEGIN_NAMESPACE
70
71class QDesignerFormWindowInterface;
72class QUndoStack;
73class QMenu;
74
75namespace qdesigner_internal {
76
77class Connection;
78class ConnectionEdit;
79
80class QDESIGNER_SHARED_EXPORT CETypes
81{
82public:
83 typedef QList<Connection*> ConnectionList;
84 typedef QMap<Connection*, Connection*> ConnectionSet;
85 typedef QMap<QWidget*, QWidget*> WidgetSet;
86
87 class EndPoint {
88 public:
89 enum Type { Source, Target };
90 EndPoint(Connection *_con = 0, Type _type = Source) : con(_con), type(_type) {}
91 bool isNull() const { return con == 0; }
92 bool operator == (const EndPoint &other) const { return con == other.con && type == other.type; }
93 bool operator != (const EndPoint &other) const { return !operator == (other); }
94 Connection *con;
95 Type type;
96 };
97 enum LineDir { UpDir = 0, DownDir, RightDir, LeftDir };
98};
99
100class QDESIGNER_SHARED_EXPORT Connection : public CETypes
101{
102public:
103 explicit Connection(ConnectionEdit *edit);
104 explicit Connection(ConnectionEdit *edit, QObject *source, QObject *target);
105 virtual ~Connection() {}
106
107 QObject *object(EndPoint::Type type) const
108 {
109 return (type == EndPoint::Source ? m_source : m_target);
110 }
111
112 QWidget *widget(EndPoint::Type type) const
113 {
114 return qobject_cast<QWidget*>(object(type));
115 }
116
117 QPoint endPointPos(EndPoint::Type type) const;
118 QRect endPointRect(EndPoint::Type) const;
119 void setEndPoint(EndPoint::Type type, QObject *w, const QPoint &pos)
120 { type == EndPoint::Source ? setSource(w, pos) : setTarget(w, pos); }
121
122 bool isVisible() const;
123 virtual void updateVisibility();
124 void setVisible(bool b);
125
126 virtual QRegion region() const;
127 bool contains(const QPoint &pos) const;
128 virtual void paint(QPainter *p) const;
129
130 void update(bool update_widgets = true) const;
131 void checkWidgets();
132
133 QString label(EndPoint::Type type) const
134 { return type == EndPoint::Source ? m_source_label : m_target_label; }
135 void setLabel(EndPoint::Type type, const QString &text);
136 QRect labelRect(EndPoint::Type type) const;
137 QPixmap labelPixmap(EndPoint::Type type) const
138 { return type == EndPoint::Source ? m_source_label_pm : m_target_label_pm; }
139
140 ConnectionEdit *edit() const { return m_edit; }
141
142 virtual void inserted() {}
143 virtual void removed() {}
144
145private:
146 QPoint m_source_pos, m_target_pos;
147 QObject *m_source, *m_target;
148 QList<QPoint> m_knee_list;
149 QPolygonF m_arrow_head;
150 ConnectionEdit *m_edit;
151 QString m_source_label, m_target_label;
152 QPixmap m_source_label_pm, m_target_label_pm;
153 QRect m_source_rect, m_target_rect;
154 bool m_visible;
155
156 void setSource(QObject *source, const QPoint &pos);
157 void setTarget(QObject *target, const QPoint &pos);
158 void updateKneeList();
159 void trimLine();
160 void updatePixmap(EndPoint::Type type);
161 LineDir labelDir(EndPoint::Type type) const;
162 bool ground() const;
163 QRect groundRect() const;
164};
165
166class QDESIGNER_SHARED_EXPORT ConnectionEdit : public QWidget, public CETypes
167{
168 Q_OBJECT
169public:
170 ConnectionEdit(QWidget *parent, QDesignerFormWindowInterface *form);
171 virtual ~ConnectionEdit();
172
173 inline const QPointer<QWidget> &background() const { return m_bg_widget; }
174
175 void setSelected(Connection *con, bool sel);
176 bool selected(const Connection *con) const;
177
178 int connectionCount() const { return m_con_list.size(); }
179 Connection *connection(int i) const { return m_con_list.at(i); }
180 int indexOfConnection(Connection *con) const { return m_con_list.indexOf(con); }
181
182 virtual void setSource(Connection *con, const QString &obj_name);
183 virtual void setTarget(Connection *con, const QString &obj_name);
184
185 QUndoStack *undoStack() const { return m_undo_stack; }
186
187 void clear();
188
189 void showEvent(QShowEvent * /*e*/)
190 {
191 updateBackground();
192 }
193
194signals:
195 void aboutToAddConnection(int idx);
196 void connectionAdded(Connection *con);
197 void aboutToRemoveConnection(Connection *con);
198 void connectionRemoved(int idx);
199 void connectionSelected(Connection *con);
200 void widgetActivated(QWidget *wgt);
201 void connectionChanged(Connection *con);
202
203public slots:
204 void selectNone();
205 void selectAll();
206 virtual void deleteSelected();
207 virtual void setBackground(QWidget *background);
208 virtual void updateBackground();
209 virtual void widgetRemoved(QWidget *w);
210 virtual void objectRemoved(QObject *o);
211
212 void updateLines();
213 void enableUpdateBackground(bool enable);
214
215protected:
216 virtual void paintEvent(QPaintEvent *e);
217 virtual void mouseMoveEvent(QMouseEvent *e);
218 virtual void mousePressEvent(QMouseEvent *e);
219 virtual void mouseReleaseEvent(QMouseEvent *e);
220 virtual void keyPressEvent(QKeyEvent *e);
221 virtual void mouseDoubleClickEvent(QMouseEvent *e);
222 virtual void resizeEvent(QResizeEvent *e);
223 virtual void contextMenuEvent(QContextMenuEvent * event);
224
225 virtual Connection *createConnection(QWidget *source, QWidget *target);
226 virtual void modifyConnection(Connection *con);
227
228 virtual QWidget *widgetAt(const QPoint &pos) const;
229 virtual void createContextMenu(QMenu &menu);
230 void addConnection(Connection *con);
231 QRect widgetRect(QWidget *w) const;
232
233 enum State { Editing, Connecting, Dragging };
234 State state() const;
235
236 virtual void endConnection(QWidget *target, const QPoint &pos);
237
238 const ConnectionList &connectionList() const { return m_con_list; }
239 const ConnectionSet &selection() const { return m_sel_con_set; }
240 Connection *takeConnection(Connection *con);
241 Connection *newlyAddedConnection() { return m_tmp_con; }
242 void clearNewlyAddedConnection();
243
244 void findObjectsUnderMouse(const QPoint &pos);
245
246private:
247 void startConnection(QWidget *source, const QPoint &pos);
248 void continueConnection(QWidget *target, const QPoint &pos);
249 void abortConnection();
250
251 void startDrag(const EndPoint &end_point, const QPoint &pos);
252 void continueDrag(const QPoint &pos);
253 void endDrag(const QPoint &pos);
254 void adjustHotSopt(const EndPoint &end_point, const QPoint &pos);
255 Connection *connectionAt(const QPoint &pos) const;
256 EndPoint endPointAt(const QPoint &pos) const;
257 void paintConnection(QPainter *p, Connection *con,
258 WidgetSet *heavy_highlight_set,
259 WidgetSet *light_highlight_set) const;
260 void paintLabel(QPainter *p, EndPoint::Type type, Connection *con);
261
262
263 QPointer<QWidget> m_bg_widget;
264 QUndoStack *m_undo_stack;
265 bool m_enable_update_background;
266
267 Connection *m_tmp_con; // the connection we are currently editing
268 ConnectionList m_con_list;
269 bool m_start_connection_on_drag;
270 EndPoint m_end_point_under_mouse;
271 QPointer<QWidget> m_widget_under_mouse;
272
273 EndPoint m_drag_end_point;
274 QPoint m_old_source_pos, m_old_target_pos;
275 ConnectionSet m_sel_con_set;
276 const QColor m_inactive_color;
277 const QColor m_active_color;
278
279private:
280 friend class Connection;
281 friend class AddConnectionCommand;
282 friend class DeleteConnectionsCommand;
283 friend class SetEndPointCommand;
284};
285
286class QDESIGNER_SHARED_EXPORT CECommand : public QUndoCommand, public CETypes
287{
288public:
289 explicit CECommand(ConnectionEdit *edit)
290 : m_edit(edit) {}
291
292 virtual bool mergeWith(const QUndoCommand *) { return false; }
293
294 ConnectionEdit *edit() const { return m_edit; }
295
296private:
297 ConnectionEdit *m_edit;
298};
299
300class QDESIGNER_SHARED_EXPORT AddConnectionCommand : public CECommand
301{
302public:
303 AddConnectionCommand(ConnectionEdit *edit, Connection *con);
304 virtual void redo();
305 virtual void undo();
306private:
307 Connection *m_con;
308};
309
310class QDESIGNER_SHARED_EXPORT DeleteConnectionsCommand : public CECommand
311{
312public:
313 DeleteConnectionsCommand(ConnectionEdit *edit, const ConnectionList &con_list);
314 virtual void redo();
315 virtual void undo();
316private:
317 ConnectionList m_con_list;
318};
319
320} // namespace qdesigner_internal
321
322QT_END_NAMESPACE
323
324#endif // CONNECTIONEDIT_H
Note: See TracBrowser for help on using the repository browser.