HISE Logo Forum
    • Categories
    • Register
    • Login

    Is there a component to make the collapsible panes in HISE?

    Scheduled Pinned Locked Moved General Questions
    19 Posts 5 Posters 248 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • d.healeyD
      d.healey
      last edited by

      Here's a quick little example with two panels and a button.

      Peek 2025-01-21 16-55.gif

      HiseSnippet 1042.3ocsV0saaaCElxIJH1aYXEXWsqHztwYHKURyMwqcAMyNNaFqI0nNKn.CcELTzVDQhTPhNMtE4IX2rGoc4dL1CvtXuAcGperkmcShM13EB57G4m9zgmyoWrjxRRjwHiZmMNhgL9Xy9iEJ+19Dt.08HjwVlWP6QDrfyXIJTqwQjjDlGxvXsuW6hQ00Qoq+9osHADAkMUEBctjSYOiGxUS016vejGDbLwicFOrj2MNrKUJZKCji.3rloMJhPujLjcJQ6VESzOPR7QFeoomSCmAMoj8Z5zvkRcatu62rOkQFLfsmyi1uQyAMFPn1tHiM53wUx39Jhhk.aZKo2399x2HxNfy4I7KBXZAGTe3jyTiZ6yC75UvMIHjw58lxTqkwTel4IbO9D8SYrOM0.dZDkIMiJ2FjbVBHYTBRqmAoGX1mFyiTSsnwyGY1UnXw.kvlAJY9hp7WqY1VBdHT6FRtjcbLHLIh56YauCFdr8SpU6gOD2JVR7njDvL1iMfK3JtTTC9yknvWQhwWPeAKg+VF9.bGwPtfsKMlAeqkBr96r3dVOFaU3q0NXKR7vDP2OaQkgQRAfFs1qHAiXVu5F3zKbdWhRQn9mIaW334Zmpa0ZjRIEN5vrzncZ.ddS7EnlHVrZ7y3.RD.VrRStSi5MbOku9k7ufHsErKnYvHAU+cVmK7XWuCdBF2AmhvseWspwL0nXQlL9fCvN3mhaXaieL1019I0tYYIP2kgAc+vTXT9W7GfNcmmOy4HNKYgryLjq68gccWY1s.7yyyPJI9qxzlStKOjt9+N3TFHvpXOvRwoRE64h5aWCbt1M0v+aSCFrPa5qjwxf..wKxrt1Y7sEXcwnvKXwEHsvQnVwrEf139U.hlUgnjiRQWH284Qrb4ikAd5BK52mubEJuDC71O08HhhnqfkqaZ9Fn6H1UPOir5YUMOhkboRFA65jenHCSUp0OIuZW18dD2SGPdQ.z0SZr76AGNdhve91CSHWw5J5EyRXJcYPTocdyrcdqh5n5bhzMdSyrKBk1WXMtrPZ9MnXi+HWgOiOzWCWiew.g3JVXQyspa7qu5yeu1moZcKqdYvjaJllbpKFS+lwciouP8sKBSEpQy2uA5zI8FEPTy19SOXPtAHkbldN59JhDtZb4AGVhdh12ZOw6KDefYOth5uXLVYAXDRV++.i4SRrkYGXzEpZJ.W273WtpiMbGG+KjiTbwvSHpXNj3Xd5nv9vuZJCNcAjNknSNpnSAyjs0xZFnOS3kJ7dXkazQKajazovHJjPikullUHROqxloZ.LIRmkqp4IZYrCJs3TYdNDFc50T5ra0bA5tpA90qZfMV0.ezpF3dqZf6upA17tCTOY62MRICyt1fPmzqSZ0bCiNBBjAllsh9Gci.ghA
      

      The first broadcaster is attached to the button's value, and when it changes it updates panel1's width.

      The second broadcaster is attached to panel1's width and when it changes it updates panel2's width and x position.

      Libre Wave - Freedom respecting instruments and effects
      My Patreon - HISE tutorials
      YouTube Channel - Public HISE tutorials

      1 Reply Last reply Reply Quote 2
      • VirtualVirginV
        VirtualVirgin
        last edited by VirtualVirgin

        On a side note here I may have found a bug, or I am scripting something wrong:

        I am doing a factory method for 2 panels and the header of is deriving it's name from a unique "name" argument, but the second panel name is overwriting the first one:

        Content.makeFrontInterface(10000, 700);
        
        
        const Panel1 = createCollapsiblePanel("Panel1", [100, 100, 800, 200], 15, 2)
        const Panel2 = createCollapsiblePanel("Why is this overwriting the first name??", [100, 300, 800, 200], 15, 2)
        
        inline function createCollapsiblePanel(name, area, headerSize, margins)
        {
        	local panel = Content.addPanel(name,0,0);
        	Content.setPropertiesFromJSON(name,
        	{
        	    "x": area[0],
        	    "y": area[1],
        	    "width": area[2],
        	    "height": area[3],
        	    "borderRadius": 0.0,
        	    "allowCallbacks": "All Callbacks",
        	    "opaque": true,
        	    "visible": true
          	});
          	
        	// Set the initial state to expanded
        	panel.data.isExpanded = true;
        	
        	// mouse callback
        	panel.setMouseCallback(function[area, headerSize](event)
        	{
        	
        		var a = this.getLocalBounds(0);
        		var clickHeaderArea = [a[0], a[1], a[2], headerSize];
        		
        		// set the expanded state data
        		if (event.clicked && event.y <= headerSize)
        		{
        			this.data.isExpanded = !this.data.isExpanded;
        	
        		}
        		
        		if (event.clicked && this.data.isExpanded) 
        		{
        		    // Expand the panel
        		    this.set("height", area[3]);
        		    this.repaint();
        		} 
        		else if (event.clicked && !this.data.isExpanded) 
        		{
        		    // Collapse the panel
        		    this.set("height", headerSize);
        		    this.repaint();
        		}
        		
        		
        	});
        	
        	// paint routine	
        	panel.setPaintRoutine(function[name, headerSize, margins](g)
        	{
        		var a = this.getLocalBounds(0);
        		
        		// fill main content area
        		g.setColour(Colours.grey);
        		g.fillRect(
        		[a[0] + margins,
        		a[1] + headerSize,
        		a[2] - margins * 2,
        		a[3] - headerSize -margins
        		]);	
        		
        		// draw text on header
        		g.setColour(Colours.white);	
        		g.setFont("Oxygen", headerSize * 0.8);
        		var textArea = 
        		[
        		a[0],
        		a[1],
        		a[2],
        		headerSize,
        		];
        		g.drawAlignedText(name, textArea, "centred");	
        		 
        	});
        };
        

        Screenshot 2025-01-21 at 12.52.02 PM.png

        I'm not sure how "name" is not a unique argument for each paint routine.

        d.healeyD 2 Replies Last reply Reply Quote 0
        • d.healeyD
          d.healey @VirtualVirgin
          last edited by d.healey

          @VirtualVirgin What do you mean by overwriting? When I load your script I see two panels created.

          Oh I see the UI is massive, I needed to scroll along. You might want to reduce that a lot, I don't know anyone with a 10000px wide monitor.

          Libre Wave - Freedom respecting instruments and effects
          My Patreon - HISE tutorials
          YouTube Channel - Public HISE tutorials

          VirtualVirginV 1 Reply Last reply Reply Quote 0
          • d.healeyD
            d.healey @VirtualVirgin
            last edited by

            @VirtualVirgin Ok the issue is that you are passing in the arguments to the paint routine as lambda values. Instead you should set them as properties of the panel, so the name is the panel's ID or its text, for the headerSize and margin you could make use of the borderSize and borderRadius properties, or just store them within the panel's data object.

            Libre Wave - Freedom respecting instruments and effects
            My Patreon - HISE tutorials
            YouTube Channel - Public HISE tutorials

            VirtualVirginV 1 Reply Last reply Reply Quote 0
            • VirtualVirginV
              VirtualVirgin @d.healey
              last edited by VirtualVirgin

              @d-healey said in Is there a component to make the collapsible panes in HISE?:

              @VirtualVirgin What do you mean by overwriting? When I load your script I see two panels created.

              Oh I see the UI is massive, I needed to scroll along. You might want to reduce that a lot, I don't know anyone with a 10000px wide monitor.

              HAHAHA! Sorry, just an extra "0" by mistake.

              1 Reply Last reply Reply Quote 1
              • VirtualVirginV
                VirtualVirgin @d.healey
                last edited by VirtualVirgin

                @d-healey said in Is there a component to make the collapsible panes in HISE?:

                @VirtualVirgin Ok the issue is that you are passing in the arguments to the paint routine as lambda values. Instead you should set them as properties of the panel, so the name is the panel's ID or its text, for the headerSize and margin you could make use of the borderSize and borderRadius properties, or just store them within the panel's data object.

                So what is a "lambda value"? When I look that up I get a metric for heat conductivity.

                Why does the inline function treat the name as unique for when creating the component ID (you can see the component names in the component list are unique) but not for the header text?

                Also, why is the "area" argument input seen as unique (the panels are created in different positions), but the headerSize is not (if I change the headerSize of panel2 it changes both)?

                I will store all of the relevant data to the panels, but just curious about this disambiguation principle of the variables involved.

                d.healeyD 1 Reply Last reply Reply Quote 0
                • d.healeyD
                  d.healey @VirtualVirgin
                  last edited by d.healey

                  @VirtualVirgin A lambda value in this context is an outside local variable that you are passing into a function that doesn't otherwise accept additional arguments. Christoph explains a little more about it here.

                  For the most part I avoid them and use other methods to pass data into functions, in the case of panel's you should always keep the data self contained within the panel's data object.

                  There are a few occasions when I've found lambdas useful, like passing values in message boxes to be used in the user's response which is asynchronous.

                  @VirtualVirgin said in Is there a component to make the collapsible panes in HISE?:

                  Why does the inline function treat the name as unique for when creating the component ID

                  At that point you are passing the value into the inline function. But when you get to the regular function of the paint routine some magic has happened and the value is treated differently - not sure of the exact reason, but something to do with it not being a local variable probably.

                  @VirtualVirgin said in Is there a component to make the collapsible panes in HISE?:

                  Also, why is the "area" argument input seen as unique (the panels are created in different positions), but the headerSize is not (if I change the headerSize of panel2 it changes both)?

                  The area isn't being passed into the paint routine and although you're passing it into the mouse callback it isn't used there. So it's the same issue as the name, you're passing in the headerSize as a lambda.

                  Correction, area is used in the mouse callback, but only on click and it's the same value for both panels - I suspect you will hit the same issue if you use different heights.

                  Libre Wave - Freedom respecting instruments and effects
                  My Patreon - HISE tutorials
                  YouTube Channel - Public HISE tutorials

                  VirtualVirginV 1 Reply Last reply Reply Quote 0
                  • VirtualVirginV
                    VirtualVirgin @d.healey
                    last edited by

                    @d-healey Thanks but I'm still confused.

                    Here I store the "name" argument in panel.data.text,
                    then I use that later to draw the text and I am still getting the disambiguation problem.

                    Also, I changed the header size to unique values for each panel and the mouseCallback definitely treats the lambdas as unique values for the 2 panels.

                    Content.makeFrontInterface(1000, 700);
                    
                    
                    const Panel1 = createCollapsiblePanel("Panel1", [100, 100, 500, 100], 15, 2)
                    const Panel2 = createCollapsiblePanel("Why is this overwriting the first name??", [100, 300, 800, 200], 90, 2)
                    
                    inline function createCollapsiblePanel(name, area, headerSize, margins)
                    {
                    	local panel = Content.addPanel(name,0,0);
                    	Content.setPropertiesFromJSON(name,
                    	{
                    	    "x": area[0],
                    	    "y": area[1],
                    	    "width": area[2],
                    	    "height": area[3],
                    	    "borderRadius": 0.0,
                    	    "allowCallbacks": "All Callbacks",
                    	    "opaque": true,
                    	    "visible": true
                      	});
                      	panel.data.text = name;
                      	
                    	// Set the initial state to expanded
                    	panel.data.isExpanded = true;
                    	
                    	// mouse callback
                    	panel.setMouseCallback(function[area, headerSize](event)
                    	{
                    	
                    		var a = this.getLocalBounds(0);
                    		var clickHeaderArea = [a[0], a[1], a[2], headerSize];
                    		
                    		// set the expanded state data
                    		if (event.clicked && event.y <= headerSize)
                    		{
                    			this.data.isExpanded = !this.data.isExpanded;
                    	
                    		}
                    		
                    		if (event.clicked && this.data.isExpanded) 
                    		{
                    		    // Expand the panel
                    		    this.set("height", area[3]);
                    		    this.repaint();
                    		} 
                    		else if (event.clicked && !this.data.isExpanded) 
                    		{
                    		    // Collapse the panel
                    		    this.set("height", headerSize);
                    		    this.repaint();
                    		}
                    		
                    		
                    	});
                    	
                    	// paint routine	
                    	panel.setPaintRoutine(function[panel, headerSize, margins](g)
                    	{
                    		var a = this.getLocalBounds(0);
                    		
                    		// fill main content area
                    		g.setColour(Colours.grey);
                    		g.fillRect(
                    		[a[0] + margins,
                    		a[1] + headerSize,
                    		a[2] - margins * 2,
                    		a[3] - headerSize -margins
                    		]);	
                    		
                    		var text = panel.data.text;
                    		
                    		// draw text on header
                    		g.setColour(Colours.white);	
                    		g.setFont("Oxygen", headerSize * 0.75);
                    		var textArea = 
                    		[
                    		a[0],
                    		a[1],
                    		a[2],
                    		headerSize,
                    		];
                    		g.drawAlignedText(text, textArea, "centred");	
                    		 
                    	});
                    };
                    
                    d.healeyD 1 Reply Last reply Reply Quote 0
                    • d.healeyD
                      d.healey @VirtualVirgin
                      last edited by

                      @VirtualVirgin You need to use this.data.text

                      Libre Wave - Freedom respecting instruments and effects
                      My Patreon - HISE tutorials
                      YouTube Channel - Public HISE tutorials

                      VirtualVirginV 1 Reply Last reply Reply Quote 0
                      • VirtualVirginV
                        VirtualVirgin @d.healey
                        last edited by

                        @d-healey said in Is there a component to make the collapsible panes in HISE?:

                        @VirtualVirgin You need to use this.data.text

                        Sorry, just caught that before you wrote back!!
                        Your responses are lightning fast...

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        39

                        Online

                        1.7k

                        Users

                        11.7k

                        Topics

                        102.2k

                        Posts