SCDoc: Use proper static string constants instead of comparing string literals.
[supercollider.git] / SCClassLibrary / QtCollider / QView.sc
blobed68abb0b08a29dd31e3be2cdc802793c0e0b3b8
1 QView : QObject {
2   classvar <globalKeyDownAction, <globalKeyUpAction;
3   classvar <hSizePolicy;
4   classvar <vSizePolicy;
5   // drag-and-drop
6   classvar <currentDrag, <currentDragString;
8   var wasRemoved = false;
9   // general props
10   var <font, <resize = 1, <alpha = 1.0;
11   // container props
12   var <decorator, <layout;
13   // top window props
14   var <>userCanClose=true, <>deleteOnClose = true;
15   // actions
16   var <action;
17   var <mouseDownAction, <mouseUpAction, <mouseEnterAction, <mouseLeaveAction;
18   var <mouseMoveAction, <mouseOverAction, <mouseWheelAction;
19   var <keyDownAction, <keyUpAction, <keyModifiersChangedAction;
20   var <>keyTyped;
21   // focus
22   var <focusGainedAction, <focusLostAction;
23   // drag-and-drop
24   var <>dragLabel;
25   var <beginDragAction, <canReceiveDragHandler, <receiveDragHandler;
26   // window actions
27   var <toFrontAction, <endFrontAction;
28   // hooks
29   var <onClose, <onResize, <onMove;
31   *implementsClass { ^this.name.asString[1..].asSymbol }
33   *initClass {
34     hSizePolicy = [1,2,3,1,2,3,1,2,3];
35     vSizePolicy = [1,1,1,2,2,2,3,3,3];
36   }
38   *new { arg parent, bounds;
39     var p = parent.asView;
40     ^super.new( [p, bounds.asRect] ).initQView( p );
41   }
43   *newCustom { arg customArgs;
44     ^super.new( customArgs ).initQView( nil );
45   }
47   *qtClass { ^'QcDefaultWidget' }
49   asView { ^this }
51   refresh {
52     _QWidget_Refresh
53     ^this.primitiveFailed;
54   }
56   remove {
57     if( this.parent.notNil and: { this.parent.decorator.notNil } )
58       { this.parent.decorator.remove(this) };
59     this.destroy;
60     wasRemoved = true;
61     this.children.do { |child| child.remove };
62   }
64   mapToGlobal { arg point;
65     _QWidget_MapToGlobal
66     ^this.primitiveFailed;
67   }
69   // ----------------- properties --------------------------
70   font_ { arg f;
71     font = f;
72     this.setProperty( \font, f );
73   }
75   toolTip { ^this.getProperty(\toolTip) }
76   toolTip_ { arg t; this.setProperty( \toolTip, t ) }
78   palette {
79     ^this.getProperty( \palette );
80   }
82   palette_ { arg p;
83     this.setProperty( \palette, p );
84   }
86   background { ^this.getProperty(\background); }
87   background_ { arg color; this.setProperty(\background, color); }
89   // NOTE: only for backwards compatibility
90   backColor_ { arg color;
91     this.background = color;
92   }
94   absoluteBounds {
95     ^this.bounds.moveToPoint( this.mapToGlobal( 0@0 ) );
96   }
98   bounds {
99     ^this.getProperty(\geometry)
100   }
102   bounds_ { arg rect;
103     this.setProperty(\geometry, rect.asRect )
104   }
106   sizeHint { ^this.getProperty(\sizeHint) }
108   minSizeHint { ^this.getProperty(\minimumSizeHint) }
110   // a Point can be passed instead of a Size
111   maxSize_ { arg size;
112     var max = QLimits(\maxWidgetSize);
113     size = size.asSize;
114     this.setProperty( \maximumSize, Size( min(max,size.width), min(max,size.height) ) );
115   }
117   // a Point can be passed instead of a Size
118   minSize_ { arg size; this.setProperty( \minimumSize, size.asSize ); }
120   fixedSize_ { arg size;
121     size = size.asSize;
122     this.setProperty( \minimumSize, size );
123     this.setProperty( \maximumSize, size );
124   }
126   fixedWidth_ { arg width;
127     this.setProperty( \minimumWidth, width );
128     this.setProperty( \maximumWidth, width );
129    }
131   fixedHeight_ { arg height;
132     this.setProperty( \minimumHeight, height );
133     this.setProperty( \maximumHeight, height );
134   }
136   maxWidth_ { arg width;
137     this.setProperty( \maximumWidth, min( width, QLimits(\maxWidgetSize) ) );
138   }
140   minWidth_ { arg width; this.setProperty( \minimumWidth, width ); }
142   maxHeight_ { arg height;
143     this.setProperty( \maximumHeight, min( height, QLimits(\maxWidgetSize) ) );
144   }
146   minHeight_ { arg height; this.setProperty( \minimumHeight, height ); }
148   // backwards compatibility
149   relativeOrigin { ^true }
151   moveTo { arg x, y;
152     this.bounds_( this.bounds.moveTo( x, y ) );
153   }
155   resizeTo { arg width, height;
156     this.bounds_( this.bounds.resizeTo( width, height ) );
157   }
159   visible {
160     ^this.getProperty(\visible)
161   }
162   visible_ { arg bool;
163     this.setProperty(\visible, bool, false)
164   }
166   enabled {
167     ^this.getProperty(\enabled)
168   }
169   enabled_ { arg bool;
170     this.setProperty(\enabled, bool)
171   }
173   resize_ { arg anInt;
174     this.setProperty(\_qc_hSizePolicy, hSizePolicy[anInt-1]);
175     this.setProperty(\_qc_vSizePolicy, vSizePolicy[anInt-1]);
176     resize = anInt;
177   }
179   canFocus {
180     var policy = this.getProperty(\focusPolicy);
181     ^( policy > 0 )
182   }
184   canFocus_ { arg bool;
185     var policy;
186     if( bool ) { policy = 16r1 | 16r2 | 16r8 } { policy = 0 };
187     this.setProperty(\focusPolicy, policy);
188   }
190   focus { arg flag=true;
191     _QWidget_SetFocus
192     ^this.primitiveFailed;
193   }
195   hasFocus {
196     ^this.getProperty( \focus );
197   }
199   acceptsMouse {
200     _QWidget_AcceptsMouse
201     ^this.primitiveFailed;
202   }
204   acceptsMouse_ { arg bool;
205     _QWidget_SetAcceptsMouse
206     ^this.primitiveFailed;
207   }
209   focusColor_ { arg color;
210     this.setProperty(\focusColor, color);
211   }
213   focusColor {
214     ^this.getProperty(\focusColor) ? Color();
215   }
217   // ------------------ container stuff ----------------------------
219   children { arg class = QView;
220     var ch = super.children( class );
221     ^ch.select { |v| (v.tryPerform(\isClosed) ? false).not };
222   }
224   parent { arg class = QView;
225     if (wasRemoved) { ^nil } { ^super.parent(class) };
226   }
228   parents {
229     var allParents;
230     var p;
231     if (wasRemoved.not) {
232       p = this.parent;
233       while { p.notNil } {
234         allParents = allParents.add( p );
235         p = p.parent;
236       };
237     };
238     ^allParents;
239   }
241   getParents {
242     ^this.parents;
243   }
245   removeAll {
246     var childWidgets = this.children( QView );
247     childWidgets.do { |child| child.remove };
248   }
250   layout_ { arg newLayout;
251     if( newLayout.notNil && (newLayout != layout) ) {
252       this.prSetLayout( newLayout );
253       layout = newLayout;
254     };
255   }
257   addFlowLayout { arg margin, gap;
258     this.decorator_( FlowLayout( this.bounds.moveTo(0, 0), margin, gap ) );
259     ^this.decorator;
260   }
262   decorator_ { arg decor;
263     decor.bounds = decor.bounds.moveTo(0, 0);
264     decor.reset;
265     decorator = decor;
266   }
268   // ................. top window stuff ............................
270   name {
271     ^this.getProperty( \windowTitle );
272   }
274   name_ { arg string;
275     this.setProperty( \windowTitle, string );
276   }
278   front {
279     _QWidget_BringFront
280     ^this.primitiveFailed;
281   }
283   minimize {
284     if( this.visible ) { this.invokeMethod( \showMinimized, synchronous:false ) };
285   }
287   unminimize {
288     if( this.getProperty( \minimized ) ) { this.invokeMethod( \showNormal, synchronous:false ) };
289   }
291   fullScreen {
292     this.invokeMethod( \showFullScreen, synchronous:false );
293   }
295   endFullScreen {
296     if( this.getProperty( \fullScreen ) ) { this.invokeMethod( \showNormal, synchronous:false ) };
297   }
299   alpha_ { arg aFloat;
300     alpha = aFloat;
301     this.setProperty( \windowOpacity, aFloat );
302   }
304   alwaysOnTop {
305     _QWidget_GetAlwaysOnTop
306     ^this.primitiveFailed;
307   }
309   alwaysOnTop_ { arg boolean;
310     _QWidget_SetAlwaysOnTop
311     ^this.primitiveFailed;
312   }
314   close {
315     if( deleteOnClose )
316       { this.remove; }
317       { this.visible_( false ); }
318   }
320   isClosed {
321     if (wasRemoved) {^true} {^this.isValid.not};
322   }
324   notClosed { ^this.isClosed.not }
326   // TODO: deprecate acceptsMouseOver and expose 'mouseTracking' property directly
327   acceptsMouseOver { ^this.getProperty(\_qc_win_mouse_tracking) == true }
328   acceptsMouseOver_ { arg flag; this.setProperty(\_qc_win_mouse_tracking, flag == true) }
330   // ----------------- actions .....................................
332   action_ { arg func;
333     // NOTE: not all widgets have action() signal
334     try {
335       this.manageMethodConnection( action, func, 'action()', \doAction );
336     };
337     action = func;
338   }
340   addAction { arg func, selector=\action;
341     this.perform(selector.asSetter, this.perform(selector).addFunc(func));
342   }
344   removeAction { arg func, selector=\action;
345     this.perform(selector.asSetter, this.perform(selector).removeFunc(func));
346   }
348   *globalKeyDownAction_ { arg action;
349     globalKeyDownAction = action;
350     this.setGlobalEventEnabled( 16r01 /* KeyPress */, true );
351   }
354   *globalKeyUpAction_ { arg action;
355     globalKeyUpAction = action;
356     this.setGlobalEventEnabled( 16r02 /* KeyRelease */, true );
357   }
359   keyDownAction_ { arg aFunction;
360     keyDownAction = aFunction;
361     this.setEventHandlerEnabled( QObject.keyDownEvent, true );
362   }
364   keyUpAction_ { arg aFunction;
365     keyUpAction = aFunction;
366     this.setEventHandlerEnabled( QObject.keyUpEvent, true );
367   }
369   keyModifiersChangedAction_ { arg aFunction;
370     keyModifiersChangedAction = aFunction;
371     this.setEventHandlerEnabled( QObject.keyDownEvent, true );
372     this.setEventHandlerEnabled( QObject.keyUpEvent, true );
373   }
375   mouseDownAction_ { arg aFunction;
376     mouseDownAction = aFunction;
377     this.setEventHandler( QObject.mouseDownEvent, \mouseDownEvent, true );
378     this.setEventHandler( QObject.mouseDblClickEvent, \mouseDownEvent, true );
379   }
381   mouseUpAction_ { arg aFunction;
382     mouseUpAction = aFunction;
383     this.setEventHandler( QObject.mouseUpEvent, \mouseUpEvent, true );
384   }
386   mouseMoveAction_ { arg aFunction;
387     mouseMoveAction = aFunction;
388     this.setEventHandler( QObject.mouseMoveEvent, \mouseMoveEvent, true );
389   }
391   // mouseOverAction responds to same Qt event as mouseMoveAction,
392   // but on different conditions.
393   // See QView:-mouseMoveEvent method.
394   mouseOverAction_ { arg aFunction;
395     mouseOverAction = aFunction;
396     this.setEventHandler( QObject.mouseMoveEvent, \mouseMoveEvent, true );
397     this.setProperty(\mouseTracking, true);
398   }
400   mouseEnterAction_ { arg aFunction;
401     mouseEnterAction = aFunction;
402     this.setEventHandler( QObject.mouseEnterEvent, \mouseEnterEvent, true );
403   }
405   mouseLeaveAction_ { arg aFunction;
406     mouseLeaveAction = aFunction;
407     this.setEventHandler( QObject.mouseLeaveEvent, \mouseLeaveEvent, true );
408   }
410   mouseWheelAction_ { arg aFunction;
411     mouseWheelAction = aFunction;
412     this.setEventHandler( QObject.mouseWheelEvent, \mouseWheelEvent, true );
413   }
415   beginDragAction_ { arg handler;
416     beginDragAction = handler;
417     this.setEventHandler( QObject.mouseDownEvent, \mouseDownEvent, true )
418   }
420   canReceiveDragHandler_ { arg handler;
421     canReceiveDragHandler = handler;
422     this.setDragEventsEnabled( true );
423   }
425   receiveDragHandler_ { arg handler;
426     receiveDragHandler = handler;
427     this.setDragEventsEnabled( true );
428   }
430   toFrontAction_ { arg aFunction;
431     toFrontAction = aFunction;
432     this.setEventHandler( QObject.windowActivateEvent,
433                                \onWindowActivateEvent );
434   }
436   endFrontAction_ { arg aFunction;
437     endFrontAction = aFunction;
438     this.setEventHandler( QObject.windowDeactivateEvent,
439                                \onWindowDeactivateEvent );
440   }
442   focusGainedAction_ { arg handler;
443     focusGainedAction = handler;
444     this.setEventHandler( 8 /* QEvent::FocusIn */, \focusInEvent );
445   }
447   focusLostAction_ { arg handler;
448     focusLostAction = handler;
449     this.setEventHandler( 9 /* QEvent::FocusOut */, \focusOutEvent );
450   }
452   onMove_ { arg aFunction;
453     onMove = aFunction;
454     this.setEventHandler( 13 /* QEvent::Move */, \moveEvent );
455   }
457   onResize_ { arg aFunction;
458     onResize = aFunction;
459     this.setEventHandler( 14 /* QEvent::Resize */, \resizeEvent );
460   }
462   onClose_ { arg func;
463     this.manageFunctionConnection( onClose, func, 'destroyed()', false );
464     onClose = func;
465   }
467   doAction {
468     action.value(this);
469   }
471   defaultKeyDownAction { arg char, modifiers, unicode, keycode, key; }
473   defaultKeyUpAction { arg char, modifiers, unicode, keycode, key; }
475   keyDown { arg char, modifiers, unicode, keycode, key;
476     if( keyDownAction.notNil ) {
477       ^keyDownAction.value( this, char, modifiers, unicode, keycode, key );
478     } {
479       ^this.defaultKeyDownAction( char, modifiers, unicode, keycode, key );
480     };
481   }
483   keyUp { arg char, modifiers, unicode, keycode, key;
484     keyTyped = char;
485     if( keyUpAction.notNil ) {
486       ^keyUpAction.value( this, char, modifiers, unicode, keycode, key );
487     } {
488       ^this.defaultKeyUpAction( char, modifiers, unicode, keycode, key );
489     };
490   }
492   keyModifiersChanged { arg modifiers;
493     keyModifiersChangedAction.value( this, modifiers);
494   }
496   mouseDown { arg x, y, modifiers, buttonNumber, clickCount;
497     ^mouseDownAction.value( this, x, y, modifiers, buttonNumber, clickCount );
498   }
500   mouseUp { arg x, y, modifiers, buttonNumber;
501     ^mouseUpAction.value( this, x, y, modifiers, buttonNumber );
502   }
504   mouseMove { arg x, y, modifiers;
505     ^mouseMoveAction.value( this, x, y, modifiers );
506   }
508   mouseOver { arg x, y;
509     ^mouseOverAction.value( this, x, y );
510   }
512   mouseEnter {
513     ^mouseEnterAction.value(this);
514   }
516   mouseLeave {
517     ^mouseLeaveAction.value(this);
518   }
520   mouseWheel { arg x, y, modifiers, xDelta, yDelta;
521     ^mouseWheelAction.value( this, x, y, modifiers, xDelta, yDelta );
522   }
524   /* ---------------- private ----------------------- */
526   *prSetCurrentDrag { arg obj; currentDrag = obj; currentDragString = obj.asCompileString; }
527   *prClearCurrentDrag { currentDrag = nil; currentDragString = nil; }
529   *setGlobalEventEnabled { arg event, enabled;
530     _QWidget_SetGlobalEventEnabled
531   }
533   initQView { arg parent;
535     var handleKeyDown, handleKeyUp, overridesMouseDown, handleDrag;
537     if (parent.notNil) {
538         if( parent.decorator.notNil ) { parent.decorator.place(this) }
539     };
541     this.setEventHandler( QObject.closeEvent, \onCloseEvent, true );
543     // key events
544     handleKeyDown = handleKeyUp = this.overrides( \keyModifiersChanged );
545     if( handleKeyDown.not )
546       { handleKeyDown = this.overrides( \defaultKeyDownAction ) };
547     if( handleKeyUp.not )
548       { handleKeyUp = this.overrides( \defaultKeyUpAction )};
550     this.setEventHandler( QObject.keyDownEvent, \keyDownEvent, true, enabled: handleKeyDown );
551     this.setEventHandler( QObject.keyUpEvent, \keyUpEvent, true, enabled: handleKeyUp );
553     // mouse events
554     overridesMouseDown = this.overrides( \mouseDown );
555     if( this.respondsTo(\defaultGetDrag) || overridesMouseDown )
556       {this.setEventHandler( QObject.mouseDownEvent, \mouseDownEvent, true )};
557     if( overridesMouseDown )
558       {this.setEventHandler( QObject.mouseDblClickEvent, \mouseDownEvent, true )};
559     if( this.overrides( \mouseUp ) )
560       {this.setEventHandler( QObject.mouseUpEvent, \mouseUpEvent, true )};
561     if( this.overrides( \mouseMove ) || this.overrides( \mouseOver ) )
562       {this.setEventHandler( QObject.mouseMoveEvent, \mouseMoveEvent, true )};
563     if( this.overrides( \mouseEnter ) )
564       {this.setEventHandler( QObject.mouseEnterEvent, \mouseEnterEvent, true )};
565     if( this.overrides( \mouseLeave ) )
566       {this.setEventHandler( QObject.mouseLeaveEvent, \mouseLeaveEvent, true )};
567     if( this.overrides( \mouseWheel ) )
568       {this.setEventHandler( QObject.mouseWheelEvent, \mouseWheelEvent, true )};
570     // DnD events
571     handleDrag = this.respondsTo(\defaultCanReceiveDrag) or: {this.respondsTo(\defaultReceiveDrag)};
572     this.setEventHandler( 60, \dragEnterEvent, true, enabled:handleDrag );
573     this.setEventHandler( 61, \dragMoveEvent, true, enabled:handleDrag );
574     this.setEventHandler( 63, \dropEvent, true, enabled:handleDrag );
575   }
577   onCloseEvent {
578     if( userCanClose != false ) {
579         if( deleteOnClose != false ) { this.remove; ^true };
580     }{
581         ^false;
582     };
583   }
585   onWindowActivateEvent {
586     toFrontAction.value(this);
587   }
589   onWindowDeactivateEvent {
590     endFrontAction.value(this);
591   }
593   focusInEvent { focusGainedAction.value(this) }
594   focusOutEvent { focusLostAction.value(this) }
596   moveEvent { onMove.value(this) }
597   resizeEvent { onResize.value(this) }
599   keyDownEvent { arg char, modifiers, unicode, keycode, key, spontaneous;
600     modifiers = QKeyModifiers.toCocoa(modifiers);
602     if( spontaneous ) {
603       // this event has never been propagated to parent yet
604       QView.globalKeyDownAction.value( this, char, modifiers, unicode, keycode, key );
605     };
607     if( (key == 16r1000020) || (key == 16r1000021) ||
608         (key == 16r1000022) || (key == 16r1000023 ) )
609       { this.keyModifiersChanged( modifiers ) };
611     ^this.keyDown( char, modifiers, unicode, keycode, key );
612   }
614   keyUpEvent { arg char, modifiers, unicode, keycode, key, spontaneous;
615     modifiers = QKeyModifiers.toCocoa(modifiers);
617     if( spontaneous ) {
618       // this event has never been propagated to parent yet
619       QView.globalKeyUpAction.value( this, char, modifiers, unicode, keycode, key );
620     };
622     if( (key == 16r1000020) || (key == 16r1000021) ||
623         (key == 16r1000022) || (key == 16r1000023 ) )
624       { this.keyModifiersChanged( modifiers ) };
626     ^this.keyUp( char, modifiers, unicode, keycode, key );
627   }
629   mouseDownEvent { arg x, y, modifiers, buttonNumber, clickCount;
630     // WARNING: QDragView and QListView override this method!
632     if( (modifiers & QKeyModifiers.control) > 0 ) { // if Ctrl / Cmd mod
633       // Try to get drag obj and start a drag.
634       // If successful, block further processing of this event.
635       if( this.beginDrag( x, y ) ) { ^false };
636     };
638     // else continue to handle mouse down event
639     modifiers = QKeyModifiers.toCocoa(modifiers);
640     ^this.mouseDown( x, y, modifiers, buttonNumber, clickCount );
641   }
643   mouseUpEvent { arg x, y, modifiers, buttonNumber;
644     modifiers = QKeyModifiers.toCocoa(modifiers);
645     ^this.mouseUp(  x, y, modifiers, buttonNumber );
646   }
648   mouseMoveEvent { arg x, y, modifiers, buttons;
649     if( buttons != 0 ) {
650       modifiers = QKeyModifiers.toCocoa(modifiers);
651       ^this.mouseMove( x, y, modifiers );
652     }{
653       ^this.mouseOver( x, y )
654     }
655   }
657   mouseEnterEvent {
658     var dummy = 0; // prevent this method from being optimized away
659     ^this.mouseEnter;
660   }
662   mouseLeaveEvent {
663     var dummy = 0; // prevent this method from being optimized away
664     ^this.mouseLeave;
665   }
667   mouseWheelEvent { arg x, y, modifiers, xDelta, yDelta;
668     modifiers = QKeyModifiers.toCocoa(modifiers);
669     ^this.mouseWheel( x, y, modifiers, xDelta, yDelta );
670   }
672   beginDrag { arg x, y;
673     var obj, str;
674     if( beginDragAction.notNil )
675       { obj = beginDragAction.value( this, x, y ) }
676       { obj = this.tryPerform( \defaultGetDrag, x, y ) };
677     if( obj.notNil ) {
678       QView.prSetCurrentDrag( obj );
679       str = obj.asString;
680       this.prStartDrag( dragLabel ?? str, obj, str );
681       ^true;
682     };
683     ^false;
684   }
686   canReceiveDrag { arg x, y;
687     if( canReceiveDragHandler.notNil )
688       { ^this.canReceiveDragHandler.value( this, x, y ) }
689       { ^( this.tryPerform( \defaultCanReceiveDrag, x, y ) ? false ) };
690   }
692   receiveDrag { arg x, y;
693     if( receiveDragHandler.notNil )
694       { this.receiveDragHandler.value( this, x, y ) }
695       { this.tryPerform( \defaultReceiveDrag, x, y ) };
696   }
698   prStartDrag { arg label, data, dataAsString;
699     _QWidget_StartDrag
700     ^this.primitiveFailed;
701   }
703   dragEnterEvent { arg internal, data;
704     if(internal.not) {
705       // dnd incoming from outside SC
706       QView.prSetCurrentDrag(data);
707     };
708     // always accept the event
709     ^true;
710   }
712   dragMoveEvent { arg x, y;
713     // make sure the event is always consumed
714     ^this.canReceiveDrag( x, y ).switch (
715       true, true,
716       false, false,
717       false
718     )
719   }
721   dropEvent { arg x, y;
722     this.receiveDrag( x, y );
723     // always accept the event
724     ^true
725   }
727   setDragEventsEnabled { arg enabled;
728     this.setEventHandlerEnabled( 60, enabled );
729     this.setEventHandlerEnabled( 61, enabled );
730     this.setEventHandlerEnabled( 63, enabled );
731   }
733   prSetLayout { arg layout;
734     _QWidget_SetLayout
735     ^this.primitiveFailed;
736   }
738   manageMethodConnection { arg oldAction, newAction, signal, method, sync=false;
739     if( newAction !== oldAction ) {
740       case
741         { oldAction.isNil && newAction.notNil } {this.connectMethod (signal, method, sync)}
742         { oldAction.notNil && newAction.isNil } {this.disconnectMethod (signal, method)}
743       ;
744     };
745   }
747   manageFunctionConnection { arg oldAction, newAction, signal, sync=false;
748     if( newAction !== oldAction ) {
749       if( oldAction.notNil ) {this.disconnectFunction (signal, oldAction)};
750       if( newAction.notNil ) {this.connectFunction (signal, newAction, sync)};
751     };
752   }
754   overrides { arg method; ^this.prOverrides(QView, method) }
756   prOverrides { arg superclass, method;
757     _Qt_IsMethodOverridden
758     ^this.primitiveFailed
759   }
761   nonimpl { arg methodName;
762     this.class.nonimpl( methodName );
763   }
765   *nonimpl { arg methodName;
766     this.debug( msg: methodName.asString ++ " is not implemented yet" )
767   }
769   *debug { arg level = 1, msg = "";
770     if( QtGUI.debugLevel >= level ) { ("Qt: " ++ this.asString ++ ": " ++ msg).postln }
771   }