xref: /haiku/src/apps/cortex/MediaRoutingView/MediaRoutingView.h (revision 19ae20e67e91fc09cc9fc5c0e60e21e24e7a53eb)
1 /*
2  * Copyright (c) 1999-2000, Eric Moon.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions, and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions, and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. The name of the author may not be used to endorse or promote products
17  *    derived from this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21  * OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
27  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 
32 // MediaRoutingView.h
33 // c.lenz 9oct99
34 //
35 // PURPOSE
36 //   Provide a simple interface for the BeOS/Genki media system.
37 //   Displays all the currently running ('live') media nodes,
38 //   and represents the connections between them visually.
39 //
40 // NOTES
41 //
42 // *** 9oct99: replaced grid-based version
43 //
44 // HISTORY
45 //   e.moon 6may99: first stab
46 //   c.lenz 6oct99: starting change to DiagramView impl
47 
48 #ifndef __MediaRoutingView__H__
49 #define __MediaRoutingView__H__
50 
51 // DiagramView
52 #include "DiagramView.h"
53 
54 // Media Kit
55 #include "MediaDefs.h"
56 
57 #include <Entry.h>
58 #include <List.h>
59 #include <Message.h>
60 
61 #include "IStateArchivable.h"
62 
63 #include "cortex_defs.h"
64 __BEGIN_CORTEX_NAMESPACE
65 
66 // MediaRoutingView
67 class MediaNodePanel;
68 class MediaWire;
69 // NodeManager
70 class RouteAppNodeManager;
71 class NodeGroup;
72 class NodeRef;
73 class Connection;
74 // RouteApp
75 class NodeSetIOContext;
76 
77 class MediaRoutingView :
78 	public		DiagramView,
79 	public		IStateArchivable {
80 	typedef		DiagramView _inherited;
81 
82 public:					// *** constants
83 
84 	// [e.moon 26oct99] moved definitions to MediaRoutingView.cpp
85 	static float	M_CLEANUP_H_GAP;
86 	static float	M_CLEANUP_V_GAP;
87 	static float	M_CLEANUP_H_MARGIN;
88 	static float	M_CLEANUP_V_MARGIN;
89 
90 	// [e.moon 7dec99] enum now a named type
91 	enum layout_t
92 	{
93 		M_ICON_VIEW = 1,
94 		M_MINI_ICON_VIEW
95 	};
96 
97 public:					//  messages
98 
99 	enum message_t {
100 		// INBOUND
101 		// "layout"		int32:			M_ICON_VIEW / M_MINI_ICON_VIEW
102 		M_LAYOUT_CHANGED,
103 
104 		// INBOUND
105 		M_CLEANUP_REQUESTED,
106 
107 		// INBOUND
108 		// release/delete node
109 		// "nodeID"		[u]int32:		node to release
110 		M_RELEASE_NODE,
111 
112 		// INBOUND
113 		M_SELECT_ALL,
114 
115 		// INBOUND
116 		M_DELETE_SELECTION,
117 
118 		// OUTBOUND
119 		// describes a selected node (sent to owning window)
120 		// "nodeID"		int32
121 		M_NODE_SELECTED,
122 
123 		// OUTBOUND
124 		// describes a selected group (sent to owning window)
125 		// "groupID"	int32
126 		M_GROUP_SELECTED,
127 
128 		// INBOUND
129 		// requests that the currently selected node/group be broadcast
130 		// back to the owning window
131 		M_BROADCAST_SELECTION,
132 
133 		// INBOUND
134 		// request to change the selected nodes cycling mode (on/off)
135 		// "cycle"		bool
136 		M_NODE_CHANGE_CYCLING,
137 
138 		// INBOUND
139 		// request to change the selected nodes run mode
140 		// "run_mode"	int32
141 		M_NODE_CHANGE_RUN_MODE,
142 
143 		// INBOUND
144 		// request to start/stop the selected node(s) as a time source
145 		// instantly
146 		// [e.moon 5dec99]
147 		M_NODE_START_TIME_SOURCE,
148 		M_NODE_STOP_TIME_SOURCE,
149 
150 		// INBOUND
151 		// call BControllable::StartControlPanel for the node specified
152 		// in the field "nodeID" (int32)
153 		// [c.lenz 24dec99]
154 		M_NODE_START_CONTROL_PANEL,
155 
156 		// INBOUND
157 		// set the given group's GROUP_LOCKED flag
158 		// [em 1feb00]
159 		// "groupID"  int32
160 		// "locked"   bool
161 		M_GROUP_SET_LOCKED,
162 
163 		// INBOUND
164 		// open ParameterWindow for selected nodes
165 		// [c.lenz 17feb2000]
166 		M_NODE_TWEAK_PARAMETERS,
167 
168 		// INBOUND
169 		// sent to the RouteWindow for displaying error
170 		// messages in the status bar if available
171 		// "text"	string
172 		// "error"	bool	(optional)
173 		M_SHOW_ERROR_MESSAGE
174 	};
175 
176 public:						// *** members
177 
178 	RouteAppNodeManager* const	manager;
179 
180 public:						// *** ctor/dtor
181 
182 							MediaRoutingView(
183 								RouteAppNodeManager *nodeManager,
184 								BRect frame,
185 								const char *name,
186 								uint32 resizeMode = B_FOLLOW_ALL_SIDES);
187 
188 	virtual					~MediaRoutingView();
189 
190 public:						// *** DiagramView impl
191 
192 	virtual void			connectionAborted(
193 								DiagramEndPoint *fromWhich);
194 
195 	virtual void			connectionEstablished(
196 								DiagramEndPoint *fromWhich,
197 								DiagramEndPoint *toWhich);
198 
199 	DiagramWire			   *createWire(
200 								DiagramEndPoint *fromWhich,
201 								DiagramEndPoint *woWhich);
202 
203 	DiagramWire			   *createWire(
204 								DiagramEndPoint *fromWhich);
205 
206 	virtual void			BackgroundMouseDown(
207 								BPoint point,
208 								uint32 buttons,
209 								uint32 clicks);
210 
211 	virtual void			MessageDropped(
212 								BPoint point,
213 								BMessage *message);
214 
215 	virtual void			SelectionChanged();
216 
217 public:						// *** BView impl
218 
219 	virtual void			AttachedToWindow();
220 
221 	virtual void			AllAttached();
222 
223 	virtual void			DetachedFromWindow();
224 
225 	virtual void			KeyDown(
226 								const char *bytes,
227 								int32 count);
228 
229 	virtual void			Pulse();
230 
231 public:						// *** BHandler impl
232 
233 	virtual void			MessageReceived(
234 								BMessage *message);
235 
236 public:						// *** accessors
237 
getLayout()238 	layout_t				getLayout() const
239 							{ return m_layout; }
240 
241 public:						// *** operations
242 
243 	// returns coordinates for a free area where the panel
244 	// could be positioned; uses the M_CLEANUP_* settings
245 	// and positions producers at the left, consumer at the
246 	// right and filters in the middle
247 	BPoint					findFreePositionFor(
248 								const MediaNodePanel *panel) const;
249 
250 public:												// *** IStateArchivable
251 
252 	status_t importState(
253 		const BMessage*						archive);
254 
255 	status_t exportState(
256 		BMessage*									archive) const;
257 
258 	// [e.moon 8dec99] subset support
259 	status_t importStateFor(
260 		const NodeSetIOContext*		context,
261 		const BMessage*						archive);
262 
263 	status_t exportStateFor(
264 		const NodeSetIOContext*		context,
265 		BMessage*									archive) const;
266 
267 protected:					// *** operations
268 
269 	// adjust the default object sizes to the current
270 	// layout and font size and rearrange if necessary
271 	void					layoutChanged(
272 								layout_t layout);
273 
274 	// aligns the panels on a grid according to their node_kind
275 	void					cleanUp();
276 
277 	// displays a context menu at a given position
278 	void					showContextMenu(
279 								BPoint point);
280 
281 	// will currently display a BAlert; this should change sometime
282 	// in the future!
283 	void					showErrorMessage(
284 								BString message,
285 								status_t error);
286 
287 private:					// *** children management
288 
289 	// adds a panel representation of a live media node to the view
290 	status_t				_addPanelFor(
291 								media_node_id id,
292 								BPoint point);
293 
294 	// tries to find the panel to a given media node
295 	status_t				_findPanelFor(
296 								media_node_id id,
297 								MediaNodePanel **outPanel) const;
298 
299 	// removes the panel of a given media node
300 	status_t				_removePanelFor(
301 								media_node_id);
302 
303 	// adds a wire represenation of a media kit connection
304 	status_t				_addWireFor(
305 								Connection &connection);
306 
307 	// finds the ui rep of a given Connection object
308 	status_t				_findWireFor(
309 								uint32	connectionID,
310 								MediaWire **wire) const;
311 
312 	// removes the wire
313 	status_t				_removeWireFor(
314 								uint32 connectionID);
315 
316 private:					// *** internal methods
317 
318 	// iterates through all selected MediaNodePanels and sets the
319 	// 'cycling' state for each to cycle
320 	void					_changeCyclingForSelection(
321 								bool cycle);
322 
323 	// iterates through all selected MediaNodePanels and sets the
324 	// RunMode for each to mode; 0 is interpreted as '(same as group)'
325 	void					_changeRunModeForSelection(
326 								uint32 mode);
327 
328 	void					_openInfoWindowsForSelection();
329 
330 	void					_openParameterWindowsForSelection();
331 
332 	void					_startControlPanelsForSelection();
333 
334 	// tries to release every node in the current selection, or to
335 	// disconnect wires if those were selected
336 	void					_deleteSelection();
337 
338 	void					_addShortcuts();
339 
340 	void					_initLayout();
341 
342 	// populates the view with all nodes currently in the NodeManager
343 	void					_initContent();
344 
345 	void 					_checkDroppedFile(
346 								entry_ref *ref,
347 								BPoint dropPoint);
348 
349 	void					_changeBackground(
350 								entry_ref *ref);
351 
352 	void					_changeBackground(
353 								rgb_color color);
354 
355 	// adjust scroll bar ranges
356 	void					_adjustScrollBars();
357 
358 	void					_broadcastSelection() const;
359 
360 	// find & remove an entry in m_inactiveNodeState
361 	status_t				_fetchInactiveNodeState(
362 								MediaNodePanel* forPanel,
363 								BMessage* outMessage);
364 
365 	void					_emptyInactiveNodeState();
366 
367 private:
368 
369 	// the current layout
370 	layout_t				m_layout;
371 
372 	// current new-group-name index
373 	uint32					m_nextGroupNumber;
374 
375 	// holds the id of the node instantiated last thru d&d
376 	media_node_id			m_lastDroppedNode;
377 
378 	// the point at which above node was dropped
379 	BPoint					m_lastDropPoint;
380 
381 	// holds a pointer to the currently dragged wire (if any)
382 	MediaWire			   *m_draggedWire;
383 
384 	// stores location of the background bitmap (invalid if no
385 	// background bitmap has been set.)
386 	// [e.moon 1dec99]
387 	BEntry					m_backgroundBitmapEntry;
388 
389 	// state info for currently inactive nodes (cached from importState())
390 	BList           m_inactiveNodeState;
391 };
392 
393 __END_CORTEX_NAMESPACE
394 #endif /* __MediaRoutingView_H__ */
395