<div>Hi,<br></div><div><br></div><div>I am learning Gtk+ with gtkmm and my goal is to create a node based interface for visual programming. I started a thread on the Gnome discourse : <a href="https://discourse.gnome.org/t/project-guidance-node-based-ui/4019">https://discourse.gnome.org/t/project-guidance-node-based-ui/</a><br></div><div><br></div><div>Basically what I want is to have my custom node widgets on a "canvas" so I can be able to move them by dragging them. If anyone knows Blender's node editor, it should also be possible to pan with middle mouse button and also zoom.<br></div><div><br></div><div>The Gtk::Layout component seems the right one when it comes to put nodes at specific location on the interface. I also want to draw a custom grid so this so the documentation seems adapted : <br></div><div><i><br></i></div><div><i>Infinite scrollable area containing child widgets and/or custom drawing.</i><br></div><div><br></div><div>Now the "infinite scrollable area" concept interest me because I want to be able to move on the node tree. The documentation says that I can just put the layout into a Gtk::ScrolledWindow and it supports scrolling natively.<br></div><div><br></div><div>I am struggling to understand how it works with the Gtk::Adjustments, do I need to create them when I instantiate a Gtk::ScrolledWindow? Or are they are controlled by the Gtk::Layout child?<br></div><div><br></div><div>This is a small example to make it work (compile it with <b>g++ gtk_layout.cpp -o gtk_layout `pkg-config gtkmm-3.0 --cflags --libs`</b>): </div><div><br></div><pre style="color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%; --darkreader-inline-color:#e8e6e3; --darkreader-inline-bgcolor:#181a1b; --darkreader-inline-bgimage:none;" data-darkreader-inline-color data-darkreader-inline-bgcolor data-darkreader-inline-bgimage><span data-darkreader-inline-color style="color: rgb(0, 74, 67); --darkreader-inline-color:#d1cdc7;">#include </span><span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;"><</span><span data-darkreader-inline-color style="color: rgb(64, 1, 90); --darkreader-inline-color:#cbc7c0;">gtkmm.h</span><span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;">></span>


<span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;"><b>int</b></span> <span data-darkreader-inline-color style="color: rgb(64, 0, 0); --darkreader-inline-color:#d4d0ca;">main</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span><span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;"><b>int</b></span> argc<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;"><b>char</b></span> <span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">*</span>argv<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">[])</span>
<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">{</span>
  <span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;"><b>auto</b></span> app <span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">=</span> Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>Application<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>create<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>argc<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> argv<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;">"</span><span data-darkreader-inline-color style="color: rgb(0, 0, 230); --darkreader-inline-color:#4287ff;">org.gtkmm.example</span><span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;">"</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>


  Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>Window window<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>
  Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>ScrolledWindow scrolled_window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>Adjustment<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>create<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span><span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">0</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">0</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">5000</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">),</span> Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>Adjustment<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>create<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span><span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">0</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">0</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">5000</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">))</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>
  Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>Layout layout<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>


  Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>Button button<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span><span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;">"</span><span data-darkreader-inline-color style="color: rgb(0, 0, 230); --darkreader-inline-color:#4287ff;">Hello World!</span><span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;">"</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>
  layout<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">.</span>put<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>button<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">100</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> <span data-darkreader-inline-color style="color: rgb(0, 140, 0); --darkreader-inline-color:#6aff6a;">100</span><span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>


  scrolled_window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">.</span>set_policy<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>POLICY_ALWAYS<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">,</span> Gtk<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">::</span>POLICY_ALWAYS<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>


  scrolled_window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">.</span>add<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>layout<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>
  window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">.</span>add<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>scrolled_window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>


  window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">.</span>show_all<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">()</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>


  <span data-darkreader-inline-color style="color: rgb(128, 0, 0); --darkreader-inline-color:#ff7272;"><b>return</b></span> app<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">-></span>run<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">(</span>window<span data-darkreader-inline-color style="color: rgb(128, 128, 48); --darkreader-inline-color:#cfcf80;">)</span><span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">;</span>
<span data-darkreader-inline-color style="color: rgb(128, 0, 128); --darkreader-inline-color:#ff72ff;">}</span>
<br></pre><pre style="color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%; --darkreader-inline-color:#e8e6e3; --darkreader-inline-bgcolor:#181a1b; --darkreader-inline-bgimage:none;" data-darkreader-inline-color data-darkreader-inline-bgcolor data-darkreader-inline-bgimage><span style="font-family: helvetica, sans-serif;">How can I get an infinite scrollable area?</span><br></pre><pre style="color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%; --darkreader-inline-color:#e8e6e3; --darkreader-inline-bgcolor:#181a1b; --darkreader-inline-bgimage:none;" data-darkreader-inline-color data-darkreader-inline-bgcolor data-darkreader-inline-bgimage><br></pre><pre style="color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%; --darkreader-inline-color:#e8e6e3; --darkreader-inline-bgcolor:#181a1b; --darkreader-inline-bgimage:none;" data-darkreader-inline-color data-darkreader-inline-bgcolor data-darkreader-inline-bgimage><span style="font-family: helvetica, sans-serif;">Thanks in advance</span><br></pre><pre style="color: rgb(0, 0, 0); background: rgb(255, 255, 255) none repeat scroll 0% 0%; --darkreader-inline-color:#e8e6e3; --darkreader-inline-bgcolor:#181a1b; --darkreader-inline-bgimage:none;" data-darkreader-inline-color data-darkreader-inline-bgcolor data-darkreader-inline-bgimage><span style="font-family: helvetica, sans-serif;">Joseph</span><br></pre><div><br></div><div><br></div>