Advertisement
snake5

sgs-ui - basic two-way control editor w/ undo&redo

Oct 1st, 2014
379
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function sgs_ui_example_ded4()
  2. {
  3.     DE = UI_CreateDataEdit( FRAME.root )[]{ anchorMode = UI_Anchor_All, q0x = 0.7 };
  4.     LS = UI_CreateStatic( FRAME.root )[]{ anchorMode = UI_Anchor_Vert, q0x = 0.6, q1x = 0.7 };
  5.     UI_CreateStatic( LS )[]{ anchorMode = UI_Anchor_Hor, height = 20, caption = "-- start --", posMode = UI_Pos_SideA };
  6.     UL = UndoLayer.create();
  7.     DS =
  8.     {
  9.         controls = [],
  10.         auto_id = 1,
  11.         find = function DS.find( id )
  12.         {
  13.             foreach( ctrl : this.controls )
  14.                 if( ctrl.name == id )
  15.                     return ctrl;
  16.             return null;
  17.         },
  18.     };
  19.     function control_add( props ) use( DS, DE, UL )
  20.     {
  21.         ctrl = UI_CreateStatic( FRAME.root )[]{ backgroundColor = UIColor(0.8,0.7,0.6) };
  22.         foreach( k, v : props )
  23.             ctrl.(k) = v;
  24.         UI_MakeResizable( ctrl, 4, 4, 4, 4 );
  25.         ctrl.name = id = DS.auto_id++;
  26.         ctrl.bindEvent( "onbeforesize", function( e ) use( UL )
  27.         {
  28.             println( "Change: do/begin" );
  29.             UL.beginChange();
  30.             println( "Change: do/change(0)" );
  31.             UL.doChange( "view", "control", this.name, { x = this.x, y = this.y, width = this.width, height = this.height } );
  32.         });
  33.         ctrl.bindEvent( "oneditsize", function( e ) use( UL )
  34.         {
  35.             println( "Change: do/change" );
  36.             UL.doChange( "view", "control", this.name, { x = this.x, y = this.y, width = this.width, height = this.height } );
  37.         });
  38.         ctrl.bindEvent( "onresize", function( e ) use( UL )
  39.         {
  40.             println( "Change: do/commit" );
  41.             if( UL.isMakingChange() )
  42.                 UL.commitChange( "control resize" );
  43.         });
  44.         DS.controls.push( ctrl );
  45.         return id;
  46.     }
  47.     function control_rem( id ) use( DS )
  48.     {
  49.         ctrl = DS.find( id );
  50.         ctrl.destroy( true );
  51.         DS.controls.remove( ctrl );
  52.         if( DS.auto_id - 1 == id )
  53.             DS.auto_id--;
  54.     }
  55.     function control_getstate( id ) use( DS )
  56.     {
  57.         src = DS.find( id );
  58.         out = {};
  59.         foreach( k : ["x","y","width","height","caption"] )
  60.             out[ k ] = src[ k ];
  61.         return out;
  62.     }
  63.     function control_getprops( id, tmpl ) use( DS )
  64.     {
  65.         src = DS.find( id );
  66.         out = {};
  67.         foreach( k ,: tmpl )
  68.             out[ k ] = src[ k ];
  69.         return out;
  70.     }
  71.     function control_setprops( id, props ) use( DS )
  72.     {
  73.         src = DS.find( id );
  74.         foreach( k, v : props )
  75.             src.(k) = v;
  76.     }
  77.     UL.registerObject( "control", DS, control_add, control_rem, control_getstate, control_getprops, control_setprops );
  78.     schema =
  79.     {
  80.         CONTROL =
  81.         {
  82.             "$type" = "object",
  83.             x = { "$type" = "int" },
  84.             y = { "$type" = "int" },
  85.             width = { "$type" = "int" },
  86.             height = { "$type" = "int" },
  87.             caption = { "$type" = "string" },
  88.         },
  89.         CONTROL_ARRAY =
  90.         {
  91.             "$name" = "Controls",
  92.             "$type" = "array",
  93.             "$subtype" = "CONTROL",
  94.         },
  95.         "$root" = "CONTROL_ARRAY",
  96.     };
  97.     DE.bindEvent( "change", function() use( UL, DS )
  98.     {
  99.         type = this.getChangeType();
  100.         idx = this.getChangedIndex();
  101.         prop = this.getChangedProperty();
  102.         path = this.getPathByName( prop );
  103.         println(path);
  104.        
  105.         if( !UL.enabled )
  106.             return;
  107.        
  108.         if( type == "add" )
  109.         {
  110.             println( "Change: begin" );
  111.             UL.beginChange();
  112.            
  113.             println( "Change: do/add" );
  114.             (id,state) = UL.doAdd( "ui", "control", { x = 10, y = 10, width = 100, height = 100, caption = "<untitled>" } );
  115.             this.setItemAdded( state );
  116.            
  117.             println( "Change: commit" );
  118.             UL.commitChange( "control added" );
  119.         }
  120.         else if( type == "remove" )
  121.         {
  122.             println( "Change: begin" );
  123.             UL.beginChange();
  124.            
  125.             println( "Change: do/remove" );
  126.             UL.doRemove( "ui", "control", DS.controls[ idx ].name );
  127.            
  128.             println( "Change: commit" );
  129.             UL.commitChange( "control removed" );
  130.         }
  131.         else
  132.         {
  133.             println( "Change: begin" );
  134.             UL.beginChange();
  135.            
  136.             println( "Change: do/change" );
  137.             changes = {};
  138.             changes[ path.last ] = this.getValueByName( prop );
  139.             UL.doChange( "ui", "control", DS.controls[ path[1] /* hardcoded */ ].name, changes );
  140.            
  141.             println( "Change: commit" );
  142.             UL.commitChange( "control modified" );
  143.         }
  144.     });
  145.     UL.registerFeedbackOutput( "ui", function( src, action, objtype, id, state, state_to ) use( DE, DS )
  146.     {
  147.         if( src == "ui" )
  148.             return;
  149.         this.enabled = false; // prevent feedback loop
  150.         DE.updateData( DS.controls );
  151.         this.enabled = true;
  152.     });
  153.     UL.registerStatusCallback( "ui", function( action ) use( LS )
  154.     {
  155.         if( action == "commit" )
  156.         {
  157.             UI_CreateStatic( LS )[]{ anchorMode = UI_Anchor_Hor, height = 20, caption = this.getLastStateName(), posMode = UI_Pos_SideA };
  158.         }
  159.         if( action == "move" || action == "commit" )
  160.         {
  161.             cp = this.getCurrentPos();
  162.             foreach( i, ch : LS.children() )
  163.             {
  164.                 if( i == cp )
  165.                     ch.backgroundColor = UIColor(0.6,0.7,0.8);
  166.                 else
  167.                     ch.backgroundColor = null;
  168.             }
  169.         }
  170.         if( action == "resize" )
  171.         {
  172.             // crop items to fit count
  173.             while( LS.getChildCount() > this.getStateCount() + 1 )
  174.                 LS.children().last.destroy(true);
  175.         }
  176.     });
  177.     LS.bindEvent( "click", function( e ) use( UL )
  178.     {
  179.         if( e.target != this )
  180.         {
  181.             pos = e.target.getOrderIndex();
  182.             UL.setCurrentPos( pos );
  183.         }
  184.     });
  185.     DE.setData( DS.controls, schema );
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement