Search code examples
javascriptjqueryjquery-ui-layout

jQuery UI Layout - How change a pane's options and dynamically apply them without toggling the pane open/closed?


http://jsfiddle.net/jc3rj681/2/

Using the plugin jQuery UI Layout, I have several different panes. When the user resizes the window to a small size, I would like to call a function that changes the minsize and size of the pane so that I can make it smaller with the window.

I can do this, but for the changes to apply, I must toggle closed and then toggle open the pane. This creates a lot of flickering and ends up being pretty messy looking. I only need this one pane to resize in this fashion.

QUESTION: Is there a way I can apply these layout changes without having to toggle the pane twice for them to apply?

Check out this Fiddle that I made: http://jsfiddle.net/jc3rj681/2/

In here, the changes to the "width" of the show/hide button don't get applied until you toggle the pane. If you can make this width change work without toggling, I'm sure it would solve my problem as well.

$("#eastToggle").click(function () {

    testLayout.toggle('east');    
});


$("#attempt").click(function () {
    testLayout.options.east.spacing_closed = 20;
    testLayout.options.east.spacing_open = 20;
});

Solution

  • I'm not sure if there is a callback function or any special utility method that'll do the trick.

    But you can try something like the following (probably with a resize function that'll resize the panes manually) -

    var testLayout = $('body').layout({
      applyDefaultStyles: true,
      east: {
        spacing_closed: 100, //toggler width
        spacing_open: 100,
        togglerLength_closed: 200, //toggler height (length)
        togglerLength_open: 200
      }
    });
    
    $("#eastToggle").click(function() {
    
      testLayout.toggle('east');
    
    });
    
    
    $("#attempt").click(function() {
      resize('east', 20);
    });
    
    
    // A function to resize the tab
    function resize(region, space) {
      // Width of the new center pane
      var newCenterWidth = parseInt($('body .ui-layout-center').css('width').split('px')[0]) + testLayout.options.east.spacing_closed - space;
    
      // Change the options so they don't affect the layout when you expand / collapse again
      testLayout.options.east.spacing_closed = space;
      testLayout.options.east.spacing_open = space;
    
      // Manually resize the panes
      $('body .ui-layout-resizer-' + region).css('width', space);
      $('body .ui-layout-center').css('width', newCenterWidth);
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="http://layout.jquery-dev.net/lib/js/jquery.layout-latest.js"></script>
    <div class="ui-layout-center">Center</div>
    <div class="ui-layout-north">North</div>
    <div class="ui-layout-south">South</div>
    <div class="ui-layout-east">East</div>
    <div class="ui-layout-west">West
      <br/>
      <br/>
    
      <button id="eastToggle">Toggle East Panel</button>
      <br/>
      <br/>
      <button id="attempt">Change Width?</button>
    </div>