src/Builder4/WindowRooView.bjs
[app.Builder.js] / src / Builder4 / WindowRooView.vala
index d87f4b2..2818e6e 100644 (file)
@@ -932,6 +932,7 @@ public class Xcls_WindowRooView : Object
             // my vars (def)
         public bool loading;
         public bool allow_node_scroll;
+        public string propSelected;
 
         // ctor
         public Xcls_sourceview(Xcls_WindowRooView _owner )
@@ -943,6 +944,7 @@ public class Xcls_WindowRooView : Object
             // my vars (dec)
             this.loading = true;
             this.allow_node_scroll = true;
+            this.propSelected = "";
 
             // set gobject values
             this.el.editable = false;
@@ -958,8 +960,8 @@ public class Xcls_WindowRooView : Object
                 this.el.override_font(description);
             
                 this.loading = true;
-                var buf = this.el.get_buffer();
-                buf.notify.connect(this.onCursorChanged);
+                //var buf = this.el.get_buffer();
+                //buf.notify.connect(this.onCursorChanged);
               
               
               
@@ -1016,16 +1018,24 @@ public class Xcls_WindowRooView : Object
                 
                 
             }
+
+            //listeners
+            this.el.button_release_event.connect( () => {
+               this.onCursorChanged();
+            
+               return false;
+            });
         }
 
         // user defined functions
-        public void onCursorChanged (ParamSpec ps) {
-                if (this.loading) {
-                    return;
-                }
-                if (ps.name != "cursor-position") {
+        public void onCursorChanged (/*ParamSpec ps*/) {
+                 if (this.loading) {
                     return;
                 }
+               // if (ps.name != "cursor-position") {
+               //     return;
+               // }
+        
                 var buf = this.el.get_buffer();
                 print("cursor changed : %d\n", buf.cursor_position);
                 Gtk.TextIter cpos;
@@ -1040,7 +1050,11 @@ public class Xcls_WindowRooView : Object
                     return;
                 }
                 var prop = node.lineToProp(ln+1);
-                print("prop : %s", prop == null : "???" : prop);
+                print("prop : %s", prop == null ? "???" : prop);
+                
+                
+                
+                
                 
                 
                 var ltree = _this.main_window.windowstate.left_tree;
@@ -1050,9 +1064,31 @@ public class Xcls_WindowRooView : Object
                       this.allow_node_scroll = false; /// block node scrolling..
                       
                       
-                      print("changing cursor on tree..\n");
+                       //print("changing cursor on tree..\n");
                       
-                    ltree.view.el.set_cursor(new Gtk.TreePath.from_string(tp), null, false);
+         
+                    
+                    // let's try allowing editing on the methods.
+                    // a little klunky at present..
+                    this.propSelected = "";
+                    if (prop != null) {
+                               //see if we can find it..
+                               var kv = prop.split(":");
+                               if (kv[0] == "p") {
+                               
+                                       //var k = prop.get_key(kv[1]);
+                                       // fixme -- need to determine if it's an editable property...
+                                       this.propSelected = prop;
+                                       
+                               } else if (kv[0] == "l") {
+                                        this.propSelected = prop;
+                                       
+                               }
+                    }
+                    ltree.view.setCursor(tp, "editor");
+                   // ltree.view.el.set_cursor(new Gtk.TreePath.from_string(tp), null, false); 
+                   this.nodeSelected(node);
+                    
                     // scrolling is disabled... as node selection calls scroll 10ms after it changes.
                     GLib.Timeout.add_full(GLib.Priority.DEFAULT,100 , () => {
                            this.allow_node_scroll = true;
@@ -1079,7 +1115,7 @@ public class Xcls_WindowRooView : Object
             
            
             // clear all the marks..
-             Gtk.TextIter start;
+            Gtk.TextIter start;
             Gtk.TextIter end;     
                 
             sbuf.get_bounds (out start, out end);
@@ -1109,10 +1145,41 @@ public class Xcls_WindowRooView : Object
                this.el.scroll_to_iter(iter,  0.1f, true, 0.0f, 0.5f);
                }
             
+            var start_line = sel.line_start;
+            var end_line = sel.line_end;
+            
+            
+            this.el.editable = false;
+            // now if we have selected a property...
+            if (this.propSelected.length> 0 ) {
+        
+                       int nstart, nend;
+                       if (sel.getPropertyRange(this.propSelected, out nstart, out nend) && nend > nstart) {
+                               start_line = nstart;
+                               end_line = nend;
+                               this.el.editable = true;
+                       }
+                       print("propSelected = %s range  %d -> %d\n", this.propSelected, nstart, nend);          
+                       
+                       
+            }
+            
+            // check selection - if it's out of 'bounds'
+            if (this.el.editable && sbuf.get_has_selection()) {
+                       Gtk.TextIter sel_start_iter, sel_end_iter;
+                       sbuf.get_selection_bounds(out sel_start_iter, out sel_end_iter);
+                       if (sel_start_iter.get_line() < start_line || sel_start_iter.get_line() > end_line) {
+                               // save?
+                               this.el.editable = false;
+                       }
+            
+            }
+            
+            
             
             
             for (var i = 0; i < buf.get_line_count();i++) {
-                if (i < (sel.line_start -1) || i > (sel.line_end -1)) {
+                if (i < (start_line -1) || i > (end_line -1)) {
                    
                     sbuf.get_iter_at_line(out iter, i);
                     sbuf.create_source_mark(null, "grey", iter);