PluginCommunication.cc 16.6 KB
Newer Older
1
/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
2
3
*                                                                            *
*                              OpenFlipper                                   *
Jan Möbius's avatar
Jan Möbius committed
4
*      Copyright (C) 2001-2011 by Computer Graphics Group, RWTH Aachen       *
Jan Möbius's avatar
Jan Möbius committed
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
*                           www.openflipper.org                              *
*                                                                            *
*--------------------------------------------------------------------------- *
*  This file is part of OpenFlipper.                                         *
*                                                                            *
*  OpenFlipper is free software: you can redistribute it and/or modify       *
*  it under the terms of the GNU Lesser General Public License as            *
*  published by the Free Software Foundation, either version 3 of            *
*  the License, or (at your option) any later version with the               *
*  following exceptions:                                                     *
*                                                                            *
*  If other files instantiate templates or use macros                        *
*  or inline functions from this file, or you compile this file and          *
*  link it with other files to produce an executable, this file does         *
*  not by itself cause the resulting executable to be covered by the         *
*  GNU Lesser General Public License. This exception does not however        *
*  invalidate any other reasons why the executable file might be             *
*  covered by the GNU Lesser General Public License.                         *
*                                                                            *
*  OpenFlipper 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 Lesser General Public License for more details.                       *
*                                                                            *
*  You should have received a copy of the GNU LesserGeneral Public           *
*  License along with OpenFlipper. If not,                                   *
*  see <http://www.gnu.org/licenses/>.                                       *
*                                                                            *
33
34
35
\*===========================================================================*/

/*===========================================================================*\
Jan Möbius's avatar
Jan Möbius committed
36
37
38
39
40
*                                                                            *
*   $Revision$                                                       *
*   $LastChangedBy$                                                *
*   $Date$                     *
*                                                                            *
41
\*===========================================================================*/
Jan Möbius's avatar
 
Jan Möbius committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62




//=============================================================================
//
//  CLASS Core - IMPLEMENTATION of Comunication with plugins
//
//=============================================================================


//== INCLUDES =================================================================

#include "Core.hh"

#include <QToolBox>

#include "OpenFlipper/BasePlugin/BaseInterface.hh"
#include "OpenFlipper/BasePlugin/ToolboxInterface.hh"
#include "OpenFlipper/BasePlugin/TextureInterface.hh"

63
#include "OpenFlipper/BasePlugin/PluginFunctionsCore.hh"
64

Jan Möbius's avatar
Jan Möbius committed
65
//== IMPLEMENTATION ==========================================================
Jan Möbius's avatar
 
Jan Möbius committed
66
67
68

//========================================================================================
// ===             Object List Communication                       =======================
Jan Möbius's avatar
Jan Möbius committed
69
70
//========================================================================================

Jan Möbius's avatar
 
Jan Möbius committed
71
72
73
/** This function is called by a plugin if it changed something in the object list (source,target,...). The information is passed to all plugins.
 * @param _identifier Id of the updated object
 */
Dirk Wilden's avatar
Dirk Wilden committed
74
void Core::slotObjectUpdated(int _identifier, UpdateType _type) {
Jan Möbius's avatar
Jan Möbius committed
75
76
77
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
Dirk Wilden's avatar
Dirk Wilden committed
78
79
        emit log(LOGINFO,"updatedObject( " + QString::number(_identifier) + ", " + updateTypeName(_type)
                 + tr(" ) called by ") + QString( sender()->metaObject()->className() ) );
Jan Möbius's avatar
Jan Möbius committed
80
      }
81
    } else {
Dirk Wilden's avatar
Dirk Wilden committed
82
      emit log(LOGINFO,"updatedObject( " + QString::number(_identifier) + ", " + updateTypeName(_type) + tr(" ) called by Core") );
Jan Möbius's avatar
Jan Möbius committed
83
84
85
    }
  }

86
87
88
  // Disable redraws as everything here has to update the object only once
  OpenFlipper::Options::redrawDisabled(true);

89
  // If we are called for a special object, we update it ourself so the Plugins dont need to do that.
90
  BaseObject* object = 0;
91
  if ( _identifier != -1 ) {
Jan Möbius's avatar
   
Jan Möbius committed
92
    if ( !PluginFunctions::getObject(_identifier,object) ) {
93
      emit log(LOGERR,tr("updated_objects called for non existing object with id : ") + QString::number(_identifier) );
94
95
96
97
      return;
    }
  }

98
  // just inform the plugins as we dont do anything else (Do deprecated and new updatedObjects here)
99
  emit signalObjectUpdated(_identifier);
Dirk Wilden's avatar
Dirk Wilden committed
100
  emit signalObjectUpdated(_identifier, _type);
101

102
  if ( object != 0 )
Dirk Wilden's avatar
Dirk Wilden committed
103
    object->update(_type);
104
105
106
107

  // Reenable redraws
  OpenFlipper::Options::redrawDisabled(false);

Jan Möbius's avatar
Jan Möbius committed
108

109
110
  // Reset scenegraph but keep scene center!
  resetScenegraph(false);
111

112
  updateView();
Jan Möbius's avatar
Jan Möbius committed
113
114
}

115
void Core::slotVisibilityChanged( int _id ) {
116

117
118
  // tell plugins
  emit visibilityChanged( _id );
119

120
121
122
  // Reset scenegraph but keep scene center!
  resetScenegraph(false);
  
123
  updateView();
124
125
126
127
128
129
}

/** This function is called if the active object has changed. The information is passed to all plugins.
*/
void Core::slotObjectSelectionChanged( int _id )
{
130
  // just inform the plugins as we don't do anything else
131
132
  emit objectSelectionChanged(_id);

133
  // Send via second interface
Jan Möbius's avatar
Jan Möbius committed
134
  emit signalObjectUpdated(_id,UPDATE_STATE);
135

136
  updateView();
137
}
Jan Möbius's avatar
 
Jan Möbius committed
138

Jan Möbius's avatar
Jan Möbius committed
139
140
141
142
143
void Core::slotObjectPropertiesChanged( int _id )
{
  emit objectPropertiesChanged(_id);
}

Jan Möbius's avatar
 
Jan Möbius committed
144
145
146
147
148
//========================================================================================
// ===             Texture Communication                       ===========================
//========================================================================================


Dirk Wilden's avatar
Dirk Wilden committed
149
150
151
152
/** Called by a plugin if it created a texture. The information is passed to all plugins. If a texture control plugin is available it has to react on the signal.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotAddTexture( QString _textureName , QString _filename, uint _dimension, int _id) {
Jan Möbius's avatar
Jan Möbius committed
153
154
155
156
157
158
159
160
161
162
163
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
        emit log(LOGINFO,"addTexture( " + _textureName + "," + _filename + ","  +  QString::number(_dimension) + ", " + QString::number(_id) +  tr(" ) called by ") +
        QString( sender()->metaObject()->className() ) );
      }
    } else {
      emit log(LOGINFO,"addTexture( " + _textureName + "," + _filename + "," +  QString::number(_dimension) + ", " + QString::number(_id) +  tr(" ) called by Core") );
    }
  }
  
Dirk Wilden's avatar
Dirk Wilden committed
164
165
166
  emit addTexture(_textureName , _filename,_dimension,_id);
}

Jan Möbius's avatar
 
Jan Möbius committed
167
168
169
170
/** Called by a plugin if it created a texture. The information is passed to all plugins. If a texture control plugin is available it has to react on the signal.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotAddTexture( QString _textureName , QString _filename, uint _dimension) {
Jan Möbius's avatar
Jan Möbius committed
171
172
173
174
175
176
177
178
179
180
181
182
  
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
        emit log(LOGINFO,"slotAddTexture( " + _textureName + "," + _filename + ","  +  QString::number(_dimension)  +  tr(" ) called by ") +
        QString( sender()->metaObject()->className() ) );
      }
    } else {
      emit log(LOGINFO,"slotAddTexture( " + _textureName + "," + _filename + "," +", " +  QString::number(_dimension) + tr(" ) called by Core") );
    }
  }
  
Jan Möbius's avatar
Jan Möbius committed
183
  emit addTexture(_textureName , _filename,_dimension);
Jan Möbius's avatar
 
Jan Möbius committed
184
185
186
187
188
189
}

/** Called by a plugin if a texture has to be updated. The information is passed to all plugins. The Plugin providing the given Texture should react on this event.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotUpdateTexture( QString _name , int _identifier){
190
191
192
193

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
194
        emit log(LOGINFO,"slotUpdateTexture( "  + _name + " , " + QString::number(_identifier) + tr(" ) called by ") +
195
196
197
198
199
                 QString( sender()->metaObject()->className() ) );
      }
    }
  }

Jan Möbius's avatar
Jan Möbius committed
200
  emit updateTexture(_name, _identifier);
Jan Möbius's avatar
 
Jan Möbius committed
201
202
}

203
204

void Core::slotMultiTextureAdded( QString _textureGroup , QString _name , QString _filename , int _id , int& _textureId ) {
Jan Möbius's avatar
Jan Möbius committed
205
206
207
208
209
210
211
212
213
214
215
216
  
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
        emit log(LOGINFO,"slotMultiTextureAdded( " + _textureGroup + ", " + _name + "," + _filename + ","  + QString::number(_id) + tr(" ) called by ") +
        QString( sender()->metaObject()->className() ) );
      }
    } else {
      emit log(LOGINFO,"slotMultiTextureAdded( " + _textureGroup + ", " + _name + "," + _filename + ","  + QString::number(_id) + tr(" ) called by Core") );
    }
  }
  
217
218
219
  emit addMultiTexture( _textureGroup , _name , _filename , _id , _textureId  );
}

Jan Möbius's avatar
 
Jan Möbius committed
220
221
222
223
/** Called by a plugin if all textures should be updated. The information is passed to all plugins. All plugins providing textures should react on this event.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotUpdateAllTextures( ){
Jan Möbius's avatar
Jan Möbius committed
224
  emit updateAllTextures();
Jan Möbius's avatar
 
Jan Möbius committed
225
226
}

Dirk Wilden's avatar
Dirk Wilden committed
227
228
229
230
231
232
233
234
/** Called by a plugin if the parameters of a texture should be changed. The information is passed to all plugins. A Texturecontrol plugin should react on this event.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotSetTextureMode(QString _textureName, QString _mode, int _id) {

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
235
        emit log(LOGINFO,"slotSetTextureMode( " + _textureName + " , " + _mode + " , " + QString::number(_id) + tr(" ) called by ") +
Dirk Wilden's avatar
Dirk Wilden committed
236
237
238
239
240
241
242
243
                 QString( sender()->metaObject()->className() ) );
      }
    }
  }

  emit setTextureMode(_textureName,_mode,_id);
}

Jan Möbius's avatar
 
Jan Möbius committed
244
245
246
247
/** Called by a plugin if the parameters of a texture should be changed. The information is passed to all plugins. A Texturecontrol plugin should react on this event.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotSetTextureMode(QString _textureName ,QString _mode) {
248
249
250
251

  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
252
        emit log(LOGINFO,"slotSetTextureMode( " + _textureName + " , " + _mode + tr(" ) called by ") +
253
254
255
256
257
                 QString( sender()->metaObject()->className() ) );
      }
    }
  }

Jan Möbius's avatar
Jan Möbius committed
258
  emit setTextureMode(_textureName,_mode);
Jan Möbius's avatar
 
Jan Möbius committed
259
260
261
262
263
264
}

/** Called by a plugin if it updated a texture. The information is passed to all plugins. If a texture control plugin is available it has to react on the signal and update the visualization of the texture.\n
 * See in the documentation of the texture plugin interfaces for further detail.
*/
void Core::slotTextureUpdated( QString _textureName , int _identifier ) {
265
266
267
  if ( OpenFlipper::Options::doSlotDebugging() ) {
    if ( sender() != 0 ) {
      if ( sender()->metaObject() != 0 ) {
268
        emit log(LOGINFO,"slotTextureUpdated( " + _textureName + " , " + QString::number(_identifier) + tr(" ) called by ") +
269
270
271
272
                 QString( sender()->metaObject()->className() ) );
      }
    }
  }
Jan Möbius's avatar
Jan Möbius committed
273
  emit updatedTextures(_textureName,_identifier);
Jan Möbius's avatar
 
Jan Möbius committed
274
275
}

Dirk Wilden's avatar
Dirk Wilden committed
276
277
278
279
280
281
/** Called by plugins if texture mode should be switched
 */
void Core::slotSwitchTexture( QString _textureName, int _id ) {
  emit switchTexture(_textureName, _id);
}

Jan Möbius's avatar
 
Jan Möbius committed
282
283
284
285
286
287
/** Called by plugins if texture mode should be switched
 */
void Core::slotSwitchTexture( QString _textureName ) {
  emit switchTexture(_textureName);
}

288
289
290
291
292
293
294
295
296
297
298
299
300

/** Called by plugins if texture image should be changed
 */
void Core::slotTextureChangeImage( QString _textureName , QImage& _image ) {
  emit textureChangeImage( _textureName ,_image );
}

/** Called by plugins if texture image should be changed
 */
void Core::slotTextureChangeImage( QString _textureName , QImage& _image , int _id )  {
  emit textureChangeImage( _textureName , _image , _id );
}

301
302
303
304
305
306
307
308
309
310
311
312
/** Called by plugins if texture image should be fetched
 */
void Core::slotTextureGetImage( QString _textureName , QImage& _image ) {
  emit textureGetImage( _textureName ,_image );
}

/** Called by plugins if texture image should be fetched
 */
void Core::slotTextureGetImage( QString _textureName , QImage& _image , int _id )  {
  emit textureGetImage( _textureName , _image , _id );
}

313
314
315
316
317
318
/** Called by plugins if texture index should be fetched
 */
void Core::slotTextureIndex( QString _textureName, int _id, int& _index){
  emit textureIndex( _textureName, _id, _index);
}

319
320
321
322
323
324
/** Called by plugins if texture index property name should be fetched
 */
void Core::slotTextureIndexPropertyName( int _id, QString& _propertyName){
  emit textureIndexPropertyName( _id, _propertyName);
}

325
326
327
328
329
330
/** Called by plugins if texture name should be fetched
 */
void Core::slotTextureName( int _id, int _textureIndex, QString& _textureName){
  emit textureName( _id, _textureIndex, _textureName);
}

331
332
333
334
335
336
/** Called by plugins if texture filename should be fetched
 */
void Core::slotTextureFilename( int _id, QString _textureName, QString& _textureFilename){
  emit textureFilename( _id, _textureName, _textureFilename);
}

337
338
339
340
341
342
343
344
345
346
347
348
/** Called by plugins if current texture name should be returned
 */
void Core::slotGetCurrentTexture( int _id, QString& _textureName ){
  emit getCurrentTexture( _id, _textureName );
}

/** Called by plugins if texture image should be fetched
 */
void Core::slotGetSubTextures( int _id, QString _multiTextureName, QStringList& _subTextures ){
  emit getSubTextures( _id, _multiTextureName, _subTextures );
}

Jan Möbius's avatar
Jan Möbius committed
349
350
351
//========================================================================================
// ===            Object Manager                              ============================
//========================================================================================
Jan Möbius's avatar
 
Jan Möbius committed
352

Jan Möbius's avatar
Jan Möbius committed
353
354
/// This slot is called by the object manager when a new object is created
void Core::newObject(int _objectId) {
355
  
356
357
358
359
   BaseObject* baseObject = 0;
   PluginFunctions::getObject(_objectId,baseObject);
   
   if ( baseObject ) {
360
361
362
    connect( baseObject, SIGNAL(visibilityChanged(int)),       this, SLOT(slotVisibilityChanged(int)),       Qt::DirectConnection) ;
    connect( baseObject, SIGNAL(objectSelectionChanged(int)),  this, SLOT(slotObjectSelectionChanged(int)),  Qt::DirectConnection );
    connect( baseObject, SIGNAL(objectPropertiesChanged(int)), this, SLOT(slotObjectPropertiesChanged(int)), Qt::DirectConnection );
363
364
   } else {
     emit log(LOGERR,tr("newObject received from objectManager with invalid id! This should not happen. The new Object will not work correctly!"));
365
366
   }
   
Jan Möbius's avatar
Jan Möbius committed
367
}
Jan Möbius's avatar
 
Jan Möbius committed
368

Jan Möbius's avatar
Jan Möbius committed
369
/// This slot is called by the object manager when a object is deleted
Dirk Wilden's avatar
Dirk Wilden committed
370
void Core::deletedObject(int /*_objectId*/) {
Jan Möbius's avatar
Jan Möbius committed
371
372
}

Jan Möbius's avatar
 
Jan Möbius committed
373

374
375
376
377
378
379
380
//========================================================================================
// ===            Cross Plugin connections                    ============================
//========================================================================================
void Core::slotCrossPluginConnect( QString _pluginName1, const char* _signal, QString _pluginName2, const char* _slot) {
  QObject* plugin1 = 0;
  QObject* plugin2 = 0;
  
Jan Möbius's avatar
Jan Möbius committed
381
382
383
  for ( int i = 0 ; i < (int)plugins_.size(); ++i ) {
    if ( plugins_[i].rpcName == _pluginName1 ) {
      plugin1 = plugins_[i].plugin;
384
    }
Jan Möbius's avatar
Jan Möbius committed
385
386
    if ( plugins_[i].rpcName == _pluginName2 ) {
      plugin2 = plugins_[i].plugin;
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
    }
  }

  if (  plugin1 == 0 ) {
    emit log(LOGERR,tr("Cross Plugin Interconnection failed because plugin %1 was not found!").arg(_pluginName1)); 
    return;
  }

  if (  plugin2 == 0 ) {
    emit log(LOGERR,tr("Cross Plugin Interconnection failed because plugin %1 was not found!").arg(_pluginName2)); 
    return;
  }
  
  // now connect them
  connect(plugin1,_signal,plugin2,_slot);
}



Jan Möbius's avatar
 
Jan Möbius committed
406

Jan Möbius's avatar
Jan Möbius committed
407
408


Jan Möbius's avatar
 
Jan Möbius committed
409
//=============================================================================