external libraries - import boost.flyweight
[supercollider.git] / SCClassLibrary / QtCollider / QTreeView.sc
blob772ae9655a9ff1f733a34711fecbbfda8c8b0902
1 QTreeView : QView {
2   var <itemPressedAction;
3   var <onItemChanged;
5   *qtClass { ^'QcTreeWidget' }
7   columns_ { arg labels; this.setProperty( \columns, labels ); }
8   columns { ^this.getProperty( \columns ); }
9   numColumns { ^this.getProperty( \columnCount ); }
11   addItem { arg strings;
12     ^this.invokeMethod( \addItem, [QTreeViewItem(),strings] ).prValidItem(this);
13   }
15   insertItem { arg index, strings;
16     ^this.invokeMethod( \insertItem, [QTreeViewItem(),index, strings] ).prValidItem(this);
17   }
19   removeItem { arg item; this.invokeMethod( \removeItem, item ); }
21   numItems { ^this.getProperty( \topLevelItemCount ); }
23   currentItem {
24     ^this.getProperty( \currentItem ).prValidItem(this);
25   }
27   currentItem_ { arg item;
28     this.setProperty( \currentItem, item ? QTreeViewItem() );
29   }
31   itemAt { arg index;
32     ^this.invokeMethod( \item, [QTreeViewItem(), index] ).prValidItem(this);
33   }
35   canSort { ^this.getProperty( \sortingEnabled ) }
36   canSort_ { arg bool; this.setProperty( \sortingEnabled, bool ) }
38   sort { arg column, descending = false;
39     this.invokeMethod( \sort, [column, descending] )
40   }
42   itemPressedAction_ { arg action;
43     if(itemPressedAction.notNil) {
44       this.disconnectFunction( 'itemPressedAction()', itemPressedAction );
45     };
46     if(action.notNil) {
47       this.connectFunction( 'itemPressedAction()', action );
48     };
49     itemPressedAction = action;
50   }
52   onItemChanged_ { arg hook;
53     if(onItemChanged.notNil) {
54       this.disconnectFunction( 'currentItemChanged()', onItemChanged );
55     };
56     if(hook.notNil) {
57       this.connectFunction( 'currentItemChanged()', hook );
58     };
59     onItemChanged = hook;
60   }
63   NOTE:
64   These methods can only operate on top level items
65   Should we include them?
67   value {
68     var i = this.currentItem.index;
69     if( i < 0 ) { ^nil } { ^i };
70   }
72   value_ { arg index;
73     var item;
74     if( index.notNil ) {
75       this.currentItem = this.itemAt(index);
76     } {
77       this.currentItem = nil;
78     };
79   }
82   background { ^this.palette.base; }
83   background_ { arg color; this.palette = this.palette.base_(color) }
85 /////////// PRIVATE:
87   prForEachColumnDataPair { arg data, func;
88     var n = this.numColumns;
89     var i = 0;
90     var d = [] ++ data;
91     var nd = d.size - 1;
92     var id;
93     if( nd >= 0 ) {
94       while { i < n } {
95         id = i.wrap(0,nd);
96         func.value( i, d[id] );
97         i = i + 1;
98       };
99     };
100   }
102   // dummy for convenience in case tree view is invalid
103   prValidItem {
104     ^nil;
105   }
108 QTreeViewItem {
109   var qtObject;
110   var <id;
111   var finalizer;
112   var <treeView;
114   == { arg other;
115     ^ other.class == QTreeViewItem and: {id == other.id}
116   }
118   isNull { ^ id.isNil }
120   parent {
121     ^treeView.invokeMethod( \parentItem, this ).prValidItem(treeView);
122   }
124   index {
125     var i = treeView.invokeMethod( \indexOfItem, this );
126     if(i.isInteger) {^i} {^-1};
127   }
129   childAt { arg index;
130     ^treeView.invokeMethod( \item, [this, index] ).prValidItem(treeView);
131   }
133   addChild { arg strings;
134     ^treeView.invokeMethod( \addItem, [this,strings] ).prValidItem(treeView);
135   }
137   insertChild { arg index, strings;
138     ^treeView.invokeMethod( \insertItem, [this,index,strings] ).prValidItem(treeView);
139   }
141   strings {
142     ^treeView.invokeMethod( \strings, this );
143   }
145   strings_ { arg strings;
146     strings.do { |string, column| this.setString(column,string) };
147   }
149   setString { arg column, string;
150     treeView.invokeMethod( \setText, [this,column,string] );
151   }
153   colors_ { arg colors;
154     treeView.prForEachColumnDataPair( colors, {
155       |column,color| this.setColor(column,color);
156     } );
157   }
159   setColor { arg column, color;
160     treeView.invokeMethod( \setColor, [this,column,color] );
161   }
163   textColors_ { arg textColors;
164     treeView.prForEachColumnDataPair( textColors, {
165       |column,color| this.setTextColor(column,color);
166     } );
167   }
169   setTextColor { arg column, color;
170     treeView.invokeMethod( \setTextColor, [this,column,color] );
171   }
173   setView { arg column, view;
174     if( view.notNil ) {
175       treeView.invokeMethod( \setItemWidget, [this, column, view] );
176     } {
177       this.removeView( column );
178     };
179   }
181   removeView { arg column;
182     treeView.invokeMethod( \removeItemWidget, [this, column] );
183   }
185   view { arg column;
186     ^treeView.invokeMethod( \itemWidget, [this,column] );
187   }
189   /////// PRIVATE:
191   prValidItem { arg treeView_;
192     if( qtObject.notNil ) {
193       treeView = treeView_;
194       ^this;
195     } {
196       ^nil
197     };
198   }