1 /************************************************************************
3 * Copyright 2010 Jakob Leben (jakob.leben@gmail.com)
5 * This file is part of SuperCollider Qt GUI.
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 ************************************************************************/
23 #include "QObjectProxy.h"
26 #include <PyrObject.h>
27 #include <PyrKernel.h>
29 #include <VMGlobals.h>
36 using namespace QtCollider
;
38 static QPalette::ColorRole paletteColorRoles
[] = {
46 QPalette::HighlightedText
,
49 int Slot::setRect( PyrSlot
*slot
, const QRectF
&r
)
51 if( !isKindOfSlot( slot
, class_Rect
) ) {
55 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
56 SetFloat( slots
+0, r
.x() );
57 SetFloat( slots
+1, r
.y() );
58 SetFloat( slots
+2, r
.width() );
59 SetFloat( slots
+3, r
.height() );
64 int Slot::setPoint( PyrSlot
*slot
, const QPointF
&pt
)
66 if( !isKindOfSlot( slot
, class_Point
) ) {
70 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
71 SetFloat( slots
+0, pt
.x() );
72 SetFloat( slots
+1, pt
.y() );
77 void Slot::setSize( PyrSlot
*slot
, const QSizeF
&sz
)
79 PyrObject
*obj
= instantiateObject( gMainVMGlobals
->gc
, class_Size
, 0, true, true );
80 SetObject( slot
, obj
);
82 PyrSlot
*slots
= obj
->slots
;
83 SetFloat( slots
+0, sz
.width() );
84 SetFloat( slots
+1, sz
.height() );
87 void Slot::setString( PyrSlot
*slot
, const QString
& arg
)
89 PyrString
*str
= newPyrString( gMainVMGlobals
->gc
,
90 arg
.toStdString().c_str(), 0, true );
91 SetObject( slot
, str
);
94 int Slot::setColor( PyrSlot
*slot
, const QColor
&c
)
96 if( !isKindOfSlot( slot
, class_Color
) ) return errWrongType
;
98 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
100 SetFloat( slots
+0, c
.red() / 255.0 );
101 SetFloat( slots
+1, c
.green() / 255.0 );
102 SetFloat( slots
+2, c
.blue() / 255.0 );
103 SetFloat( slots
+3, c
.alpha() / 255.0 );
108 int Slot::setPalette( PyrSlot
*slot
, const QPalette
&plt
)
110 if( !isKindOfSlot( slot
, class_QPalette
) ) return errWrongType
;
112 PyrSlot
*s
= slotRawObject( slot
)->slots
;
114 for( int i
=0; i
<8; ++i
, ++s
) {
115 if( setColor( s
, plt
.color( paletteColorRoles
[i
] ) ) ) return errFailed
;
121 void Slot::setQObject( PyrSlot
*s
, QObject
*o
)
128 QObjectProxy
*proxy
= QObjectProxy::fromObject(o
);
129 if( proxy
&& proxy
->scObject() )
130 SetObject( s
, proxy
->scObject() );
135 void Slot::setTreeWidgetItem( PyrSlot
*s
, const SafePtr
<QcTreeWidget::Item
> & itemPtr
)
137 PyrObject
*obj
= instantiateObject( gMainVMGlobals
->gc
, class_QTreeViewItem
, 0, true, true );
138 QcTreeWidget::Item::initialize( gMainVMGlobals
, obj
, itemPtr
);
142 void Slot::setVariantList( PyrSlot
*slot
, const VariantList
& varList
)
144 VMGlobals
*g
= gMainVMGlobals
;
146 int count
= varList
.data
.count();
148 PyrObject
*array
= newPyrArray( g
->gc
, count
, 0, true );
149 SetObject( slot
, array
);
152 PyrSlot
*s
= array
->slots
;
153 for( i
= 0; i
< count
; ++i
, ++s
) {
154 if( Slot::setVariant( s
, varList
.data
[i
] ) ) {
155 qcDebugMsg(1, "WARNING: Could not set one slot of array" );
158 g
->gc
->GCWrite( array
, s
);
162 int Slot::setVariant( PyrSlot
*slot
, const QVariant
&val
)
165 int type
= val
.userType();
168 case QMetaType::Bool
:
169 b_val
= val
.toBool();
170 if( b_val
) SetTrue( slot
);
171 else SetFalse( slot
);
173 case QMetaType::QPoint
:
174 case QMetaType::QPointF
:
175 return Slot::setPoint( slot
, val
.toPointF() );
176 case QMetaType::QSize
:
177 case QMetaType::QSizeF
:
178 Slot::setSize( slot
, val
.toSizeF() );
180 case QMetaType::QRect
:
181 case QMetaType::QRectF
:
182 return Slot::setRect( slot
, val
.toRectF() );
183 case QMetaType::QString
:
184 Slot::setString( slot
, val
.toString() );
186 case QMetaType::QColor
:
187 return Slot::setColor( slot
, val
.value
<QColor
>() );
188 case QMetaType::QPalette
:
189 return Slot::setPalette( slot
, val
.value
<QPalette
>() );
190 case QMetaType::Float
:
191 case QMetaType::Double
:
192 SetFloat( slot
, val
.value
<double>() );
195 SetInt( slot
, val
.toInt() );
197 case QMetaType::QObjectStar
:
198 Slot::setQObject( slot
, val
.value
<QObject
*>() );
200 case QMetaType::QWidgetStar
:
201 Slot::setQObject( slot
, val
.value
<QWidget
*>() );
203 case QMetaType::Void
:
207 if( type
== qMetaTypeId
<PyrObject
*>() ) {
208 SetObject( slot
, val
.value
<PyrObject
*>() );
210 else if( type
== qMetaTypeId
<VariantList
>() ) {
211 Slot::setVariantList( slot
, val
.value
<VariantList
>() );
213 else if( type
== qMetaTypeId
<QcTreeWidget::ItemPtr
>() ) {
214 Slot::setTreeWidgetItem( slot
, val
.value
< QtCollider::SafePtr
<QcTreeWidget::Item
> >() );
217 qcErrorMsg( "the QVariant could not be interpreted!" );
224 bool Slot::toBool( PyrSlot
*slot
)
226 return IsTrue( slot
);
229 int Slot::toInt( PyrSlot
*slot
)
232 if( slotIntVal( slot
, &i
) ) return 0;
236 float Slot::toFloat( PyrSlot
*slot
)
239 if( slotFloatVal( slot
, &f
) ) return 0.f
;
243 double Slot::toDouble( PyrSlot
*slot
)
246 if( slotDoubleVal( slot
, &d
) ) return 0.0;
250 QString
Slot::toString( PyrSlot
*slot
)
253 return QString( slotRawSymbol(slot
)->name
);
255 else if( isKindOfSlot( slot
, class_String
) ) {
256 int len
= slotRawObject( slot
)->size
;
257 return QString::fromAscii( slotRawString(slot
)->s
, len
);
262 QPointF
Slot::toPoint( PyrSlot
*slot
)
264 if( !isKindOfSlot( slot
, class_Point
) ) {
267 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
270 err
= slotFloatVal( slots
+0, &x
); if( err
) return QPointF();
271 err
= slotFloatVal( slots
+1, &y
); if( err
) return QPointF();
272 return QPointF( x
, y
);
275 QRectF
Slot::toRect( PyrSlot
*slot
)
277 if( !isKindOfSlot( slot
, class_Rect
) ) {
281 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
283 for( int i
=0; i
<4; ++i
)
285 int err
= slotFloatVal(slots
+ i
, &bounds
[i
]);
286 if( err
) return QRectF();
289 return QRectF( bounds
[0], bounds
[1], bounds
[2], bounds
[3] );
292 QSizeF
Slot::toSize( PyrSlot
*slot
)
294 if( !isKindOfSlot( slot
, class_Size
) ) {
298 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
299 float w
= 0.f
, h
= 0.f
;
300 slotFloatVal( slots
+0, &w
);
301 slotFloatVal( slots
+1, &h
);
303 return QSizeF( w
, h
);
306 QColor
Slot::toColor( PyrSlot
*slot
)
308 if( !isKindOfSlot( slot
, class_Color
) )
311 PyrSlot
*slots
= slotRawObject(slot
)->slots
;
316 err
= slotFloatVal(slots
+0, &r
);
318 err
= slotFloatVal(slots
+1, &g
);
320 err
= slotFloatVal(slots
+2, &b
);
322 err
= slotFloatVal(slots
+3, &a
);
324 return QColor( r
*255, g
*255, b
*255, a
*255 );
327 QFont
Slot::toFont( PyrSlot
*slot
)
329 if( !isKindOfSlot( slot
, class_QFont
) )
332 PyrSlot
*slots
= slotRawObject(slot
)->slots
;
334 QString family
= Slot::toString( slots
+0 );
335 float fSize
= Slot::toFloat( slots
+1 );
336 bool bold
= IsTrue( slots
+2 );
337 bool italic
= IsTrue( slots
+3 );
338 bool isPtSize
= IsTrue( slots
+4 );
342 if( !family
.isEmpty() ) f
.setFamily( family
);
346 f
.setPointSizeF( fSize
);
349 int pixSize
= ( fSize
> 1.f
? qRound(fSize
) : 1 );
350 f
.setPixelSize( pixSize
);
356 f
.setItalic( italic
);
361 QPalette
Slot::toPalette( PyrSlot
*slot
)
363 if( !isKindOfSlot( slot
, class_QPalette
) )
366 PyrSlot
*slots
= slotRawObject( slot
)->slots
;
369 for( int i
=0; i
<8; ++i
, ++slots
) {
370 QColor c
= Slot::toColor(slots
);
371 if( !c
.isValid() ) continue;
372 palette
.setColor( paletteColorRoles
[i
], c
);
378 VariantList
Slot::toVariantList( PyrSlot
*slot
)
380 if( isKindOfSlot( slot
, class_Array
) ) {
381 PyrObject
*obj
= slotRawObject( slot
);
382 PyrSlot
*slots
= obj
->slots
;
383 int size
= obj
->size
;
385 for( int i
= 0; i
< size
; ++i
, ++slots
)
386 list
.data
<< Slot::toVariant( slots
);
389 else if( isKindOfSlot( slot
, class_SymbolArray
) ) {
390 PyrSymbolArray
*symarray
= slotRawSymbolArray( slot
);
391 PyrSymbol
**symbols
= symarray
->symbols
;
392 int size
= symarray
->size
;
394 for( int i
= 0; i
< size
; ++i
, ++symbols
)
395 list
.data
<< QVariant( QString( (*symbols
)->name
) );
399 return VariantList();
402 QObjectProxy
* Slot::toObjectProxy( PyrSlot
*slot
)
404 if( !isKindOfSlot( slot
, class_QObject
) ) return 0;
405 QObjectProxy
*proxy
= 0;
406 PyrSlot
*proxySlot
= slotRawObject( slot
)->slots
;
407 if( IsPtr( proxySlot
) ) proxy
= (QObjectProxy
*) slotRawPtr( proxySlot
);
411 QcTreeWidget::ItemPtr
Slot::toTreeWidgetItem( PyrSlot
*slot
)
413 if( !isKindOfSlot( slot
, class_QTreeViewItem
) ) return QcTreeWidget::ItemPtr();
414 PyrSlot
*ptrSlot
= slotRawObject(slot
)->slots
+0;
415 if( IsPtr( ptrSlot
) ) {
416 QcTreeWidget::ItemPtr
*safePtr
= static_cast<QcTreeWidget::ItemPtr
*>( slotRawPtr(ptrSlot
) );
420 return QcTreeWidget::ItemPtr();
424 QVariant
Slot::toVariant( PyrSlot
*slot
)
427 switch (GetTag(slot
)) {
432 return QVariant( toInt(slot
) );
434 return QVariant( toString(slot
) );
436 return QVariant( false );
438 return QVariant( true );
441 if( isKindOfSlot( slot
, class_String
) ) {
442 return QVariant( toString(slot
) );
444 else if( isKindOfSlot( slot
, class_Point
) ) {
445 return QVariant( toPoint( slot
) );
447 else if( isKindOfSlot( slot
, class_Rect
) ) {
448 return QVariant( toRect(slot
) );
450 else if( isKindOfSlot( slot
, class_Size
) ) {
451 return QVariant( toSize(slot
) );
453 else if( isKindOfSlot( slot
, class_Color
) ) {
454 return QVariant::fromValue
<QColor
>( toColor(slot
) );
456 else if( isKindOfSlot( slot
, class_QFont
) ) {
457 return QVariant::fromValue
<QFont
>( toFont(slot
) );
459 else if( isKindOfSlot( slot
, class_QPalette
) ) {
460 return QVariant::fromValue
<QPalette
>( toPalette(slot
) );
462 else if( isKindOfSlot( slot
, class_QObject
) ) {
463 proxy
= toObjectProxy(slot
);
464 return QVariant::fromValue
<QObjectProxy
*>( proxy
);
466 else if( isKindOfSlot( slot
, class_Array
) || isKindOfSlot( slot
, class_SymbolArray
) ) {
467 return QVariant::fromValue
<VariantList
>( toVariantList(slot
) );
469 else if( isKindOfSlot( slot
, class_QTreeViewItem
) ) {
470 return QVariant::fromValue
<QcTreeWidget::ItemPtr
>( toTreeWidgetItem(slot
) );
473 qcErrorMsg("Could not interpret slot!");
478 return QVariant( toDouble( slot
) );
482 using namespace Slot
;
484 void QtCollider::Variant::setData( PyrSlot
*slot
)
487 switch (GetTag(slot
)) {
490 _type
= QMetaType::Void
;
494 _type
= QMetaType::Int
;
495 _ptr
= new int( toInt(slot
) );
498 _type
= QMetaType::QString
;
499 _ptr
= new QString( toString(slot
) );
502 _type
= QMetaType::Bool
;
503 _ptr
= new bool( false );
506 _type
= QMetaType::Bool
;
507 _ptr
= new bool( true );
511 if( isKindOfSlot( slot
, class_String
) ) {
512 _type
= QMetaType::QString
;
513 _ptr
= new QString( toString(slot
) );
515 else if( isKindOfSlot( slot
, class_Point
) ) {
516 _type
= QMetaType::QPointF
;
517 _ptr
= new QPointF( toPoint(slot
) );
519 else if( isKindOfSlot( slot
, class_Rect
) ) {
520 _type
= QMetaType::QRectF
;
521 _ptr
= new QRectF( toRect(slot
) );
523 else if( isKindOfSlot( slot
, class_Size
) ) {
524 _type
= QMetaType::QSizeF
;
525 _ptr
= new QSizeF( toSize(slot
) );
527 else if( isKindOfSlot( slot
, class_Color
) ) {
528 _type
= QMetaType::QColor
;
529 _ptr
= new QColor( toColor(slot
) );
531 else if( isKindOfSlot( slot
, class_Array
) || isKindOfSlot( slot
, class_SymbolArray
) ) {
532 _type
= qMetaTypeId
<VariantList
>();
533 _ptr
= new VariantList( toVariantList(slot
) );
535 else if( isKindOfSlot( slot
, class_QObject
) ) {
536 proxy
= toObjectProxy(slot
);
538 _type
= QMetaType::Void
;
542 _type
= qMetaTypeId
<QObjectProxy
*>();
543 _ptr
= new QObjectProxy
*( proxy
);
546 else if( isKindOfSlot( slot
, class_QTreeViewItem
) ) {
547 _type
= qMetaTypeId
<QcTreeWidget::ItemPtr
>();
548 _ptr
= new QcTreeWidget::ItemPtr( toTreeWidgetItem(slot
) );
551 qcErrorMsg("Could not interpret slot!");
552 _type
= QMetaType::Void
;
558 _type
= QMetaType::Double
;
559 _ptr
= new double( toDouble(slot
) );