<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <link rel="stylesheet" href="style.css" type="text/css"> <link rel="Start" href="index.html"> <link rel="previous" href="GAction.html"> <link rel="next" href="GToolbox.html"> <link rel="Up" href="index.html"> <title>LablGTK : GUtil</title> </head> <body> <div class="navbar"><a href="GAction.html">Previous</a> <a href="index.html">Up</a> <a href="GToolbox.html">Next</a> </div> <center><h1>Module <a href="type_GUtil.html">GUtil</a></h1></center> <br> <pre><span class="keyword">module</span> GUtil: <code class="code">sig</code> <a href="GUtil.html">..</a> <code class="code">end</code></pre><a name="3_UtilityclassesforprogrammingwithGTKobjects"></a> <h3>Utility classes for programming with GTK objects</h3><br> <hr width="100%"> <pre><span class="keyword">val</span> <a name="VALprint_widget"></a>print_widget : <code class="type">Format.formatter -> #<a href="GObj.widget.html">GObj.widget</a> -> unit</code></pre><div class="info"> A nice function to use with <code class="code">#install_printer</code><br> </div> <br> The memo class provides an easy way to remember the real class of a widget. Insert all widgets of class in one single <code class="code">t memo</code>, and you can then recover their original ML object with <code class="code">#find</code>.<br> <pre><span class="keyword">class</span> <a name="TYPEmemo"></a><code class="type">[< get_oid : int; .. >]</code> <a href="GUtil.memo.html">memo</a> : <code class="type">unit -> </code><code class="code">object</code> <a href="GUtil.memo.html">..</a> <code class="code">end</code></pre><br><br> <a name="4_TheMLsignalmechanism"></a> <h4>The ML signal mechanism</h4> It allows one to add GTK-like signals to arbitrary objects.<br> <pre><span class="keyword">val</span> <a name="VALnext_callback_id"></a>next_callback_id : <code class="type">unit -> <a href="GtkSignal.html#TYPEid">GtkSignal.id</a></code></pre><pre><span class="keyword">class</span> <a name="TYPEsignal"></a><code class="type">['a]</code> <a href="GUtil.signal.html">signal</a> : <code class="type">unit -> </code><code class="code">object</code> <a href="GUtil.signal.html">..</a> <code class="code">end</code></pre><br><br> As with GTK signals, you can use <code class="code">GtkSignal.stop_emit</code> inside a callback to prevent other callbacks from being called.<br> <pre><span class="keyword">class</span> <a name="TYPEml_signals"></a><span class="keyword">virtual</span> <a href="GUtil.ml_signals.html">ml_signals</a> : <code class="type">(<a href="GtkSignal.html#TYPEid">GtkSignal.id</a> -> bool) list -> </code><code class="code">object</code> <a href="GUtil.ml_signals.html">..</a> <code class="code">end</code></pre><br><pre><span class="keyword">class</span> <a name="TYPEadd_ml_signals"></a><span class="keyword">virtual</span> <a href="GUtil.add_ml_signals.html">add_ml_signals</a> : <code class="type">'a <a href="Gtk.html#TYPEobj">Gtk.obj</a> -> (<a href="GtkSignal.html#TYPEid">GtkSignal.id</a> -> bool) list -> </code><code class="code">object</code> <a href="GUtil.add_ml_signals.html">..</a> <code class="code">end</code></pre><br><br> To add ML signals to a LablGTK object: <pre><code class="code"> class mywidget_signals obj ~mysignal1 ~mysignal2 = object inherit somewidget_signals obj inherit add_ml_signals obj [mysignal1#disconnect; mysignal2#disconnect] method mysignal1 = mysignal1#connect ~after method mysignal2 = mysignal2#connect ~after end class mywidget obj = object (self) inherit somewidget obj val mysignal1 = new signal obj val mysignal2 = new signal obj method connect = new mywidget_signals obj ~mysignal1 ~mysignal2 method call1 = mysignal1#call method call2 = mysignal2#call end </code></pre> You can also add ML signals to an arbitrary object; just inherit from <code class="code">ml_signals</code> in place of <code class="code">widget_signals</code>+<code class="code">add_ml_signals</code>. <pre><code class="code"> class mysignals ~mysignal1 ~mysignal2 = object inherit ml_signals [mysignal1#disconnect; mysignal2#disconnect] method mysignal1 = mysignal1#connect ~after method mysignal2 = mysignal2#connect ~after end </code></pre><br> <br> <a name="4_Propagatingstatemodifications"></a> <h4>Propagating state modifications</h4> The variable class provides an easy way to propagate state modifications. A new variable is created by <code class="code">new variable init</code>. The <code class="code">#set</code> method just calls the <code class="code">set</code> signal, which by default only calls <code class="code">real_set</code>. <code class="code">real_set</code> sets the variable and calls <code class="code">changed</code> when needed. Deep equality is used to compare values, but check is only done if there are callbacks for <code class="code">changed</code>.<br> <pre><span class="keyword">class</span> <a name="TYPEvariable_signals"></a><code class="type">['a]</code> <a href="GUtil.variable_signals.html">variable_signals</a> : <code class="type">set:'a <a href="GUtil.signal.html">signal</a> -> changed:'a <a href="GUtil.signal.html">signal</a> -> </code><code class="code">object</code> <a href="GUtil.variable_signals.html">..</a> <code class="code">end</code></pre><br><pre><span class="keyword">class</span> <a name="TYPEvariable"></a><code class="type">['a]</code> <a href="GUtil.variable.html">variable</a> : <code class="type">'a -> </code><code class="code">object</code> <a href="GUtil.variable.html">..</a> <code class="code">end</code></pre><br></body></html>