@d-healey Yeah it's a bit odd. I'll build a minimal example later when I'm home and post a snippet.
Posts
-
RE: Preset browser and expansions again...
-
Preset browser and expansions again...
I have another strange question about expansions and the preset browser.
For my project a separate banks page is required which then loads the selected expansion & UI when clicked on and hides the banks page.
@d-healey helped me with this quite a bit and I now have it working and loading the expansion.The problem I have is that I don't need the expansions column in the standard preset browser as it's superseded by the banks page. I just need the last column showing the presets for the chosen expansion.
My first thought was just to set showExpansionColumn to false in the preset browser settings, but then the presets don't show up when the expansion is loaded from the banks page via setCurrentExpansion.
To get around this I set showExpansionColumn to true and made it 0.01 width with the last column being 0.99 so that it is there but can't be seen.
This works nicely and allows the presets to show in the final column. They can then be clicked and selected as expected which loads the presets as expected.The problem with this solution is that it turns out that it breaks the search and favourites feature!! I changed the widths of the 2 columns to 0.4 and 0.6 for example so that I could see the expansions column to do some testing.
If I click on the expansion first and then the preset the search and favourites works as expected. But obviously I don't want the expansions column to be there in the real project as the whole point is to choose the expansions via the banks page.I presume that clicking the expansions column in the preset browser does more than just
expHandler.setCurrentExpansion();
does as that is what I am calling to load the expansions but it's not the same behaviour as clicking the expansions column.
Is there something else I can call/need to call in order to have the same post click action as clicking on the expansion column to load the expansion? Or is there another/better way entirely?
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
Second, the error message is telling you what the problem is. expansionName is a variable you declared outside of the mouse callback, you can't use it in the mouse callback. You have to get the data you want from the child panel where you stored it.
Ah so I can use the this.data.Name again. That will sink in one day I promise.
Did that and added the {} and it sets the current expansion when clicked now thankyou.
I'll leave you alone now for a bit as I try and figure out eth best way to load the correct UI elements and trigger the controls repaint
Thankyou again for all your advice and patience, it really is much appreciated
-
RE: A couple of expansion questions
@d-healey I put it directly in my click callback like this
cp.setMouseCallback(function(event){ this.data.hover = event.hover; Console.print("Hover"); if (event.clicked) Console.print("Clicked"); expHandler.setCurrentExpansion(expansionName); this.repaint();
but got the error
Can't reference local variables in nested function body
So I created an inline function loadExpansion() and called it at the end of my code
inline function loadExpansion() { expHandler.setCurrentExpansion(expansionName); }
But then got this doing that
API call with undefined parameter 0
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
What do you expect it to do?
I thought that the image would react to the hover as it did before the image was loaded into it because of the line
g.fillAll(Colours.withAlpha(Colours.darkgrey, this.data.hover ? 1.0 : 0.4));
Actually I just realised that all I needed to put that line after the drawimage line in the repaint so that is solved.
local props = e.getProperties(); for (x in props) cp.data[x] = props[x];
I thought you were just saying you used this in Rhapsody but didn't realise you were saying to add it to my project apologies.
Ok so I have set the first line of text using this.data.Name and the 2nd line using the tags pulled in from the expansion data and it works and looks how I wanted it to.Ok so that's 2 things sorted, thankyou.
On to the click event now so that it loads the expansion - well sets it I think is the term.
Am I best to write a function that handles what happens when an expansion is set and then call that as part of the cp code? Or is there a better way to approach it? -
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
If you want to attach arbitrary data to the panel that needs to go inside its data object.
Which I have done. I have populated the tags and I can call them to be the "text" object using
cp.set("text", tags);
but I can't then have both the expansion name and the tags to be set as "text".
It wants one or the the other unless I combine themcp.set("text", expansionName + "" + tags);
which I don't want to do as that puts them on the same line in the panel
If this isn't what you are referring to then I don't understand sorry
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
cp.loadImage(pathToImage, "Icon");
We have lift off!!!
In the loop I used
e.getWildcardReference("Icon.png")
and in the paint routine I called
g.drawImage("Icon", a, 0, 0);
and they work.
The hover doesn't work on the icon though, only the part underneath that is just the rest of the panel with the text on. Not sure why the icon doesn't react?
-
RE: A couple of expansion questions
@rzrsharpeprod Ok I will have a look and no doubt get back to you. Thankyou.
1 quick thing on the dual line text. In your snippet it uses a text object which I modified to use the expansionName
cp.set("text", expansionName);
How do I add a 2nd version? If I do this
cp.set("text", expansionName); cp.set("text", tags);
Then the 2nd just overrides the first.
I have the 2 lines showing and formatted correctly but it just repeats whatever the last definition of "text" isI can't add "Text2" as that isn't a valid function.
I tried calling the variables expansionName & tags directly in the drawAlignedText line but it doesn't like that. -
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
I think you're getting close to that trigger moment :)
I hope so! Maybe I am as even as I was writing that I thought I bet I can set expansion name using the variable so it is kind of the same action for each one.
@d-healey said in A couple of expansion questions:
set the colour
draw a line of text
set another colour
draw another line of text
etc.I also had this revelation as well while I was having lunch. I thought I wonder if setting a new colour will allow me to have a new text object and when I cam back you had said something along these lines
@d-healey said in A couple of expansion questions:
Nope, loadImages there is a function you wrote, so don't let the name mislead you into thinking it actually loads images into panels.
Go watch my video about using images with panels, you have to load the image into the panel before you can use it in the paint routine.
I watched one of yours the other day (the one with the cute little piglet) I will go back and rewatch it as I clearly missed something.
Is the cant find Icon.png error misleading then or is it also not finding the image becaus eit isn't loaded? -
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
You have not loaded the images into the panels. Start with one regular panel and one expansion, and make it all work. Once you have this you can tackle it with child panels - which is basically the same thing, but overcomplicates it and makes it seem confusing.
Is this
if (isDefined(imageList[i]) && imageList[i] != "") g.drawImage(imageList[i], [x, y, width, height], 0, 0);
and this
loadImages();
not doing that?
Regardless the error messages I'm getting are{EXP::ExpansionName}Icon.png not found
for each expansion so it looks like it isn't even finding the images to load either way or have I misunderstood the error?
@d-healey said in A couple of expansion questions:
This is just regular paint routine stuff, I have a few videos about paint routines. Make yourself a paint routine sandbox project and play around.
So it is possible to set 2 separate lines of text? I can then set the position of each through paint routines.
I wasn't sure if you could set 2 separate text items or if it would have to be 1 with a carriage return or something similar?@d-healey said in A couple of expansion questions:
I don't really know what your saying there, so probably not. You can see how I've implemented the hover action, so you just need to add your click event in the mouse callback too.
What I mean is the hover isn't really distnguishing between an end action, regardless of what child panel it is hovering over it is doing the same action. Whereas with the load if it is child panel1 it is doing 1 thing specifically (load exp 1), child panel 2 being clicked would load exp 2 and so on.
Its that unique end action that I can't get my head around. I hope that makes sense? -
RE: A couple of expansion questions
Ok I just figured out how to get the expansion name as the text name for the child panel, I also added the tags in Hise (not the XML file) and can set the text as one or the other (or both concatenated).
Now that is loading, how can I set them as 2 separate lines one under the other as they need different font sizes and colours.@d-healey said in A couple of expansion questions:
@rzrsharpeprod not at the computer at the moment so I'll give a proper reply later.
Think of it like this, if you had one panel and one expansion, how would you achieve what you want?
I don't know with expansions as they are not acting the same as normal presets. With none expansions projects I would just load an image or even attach one to the panel but because of the dynamic number of child panels I can't just call 1 directly and hardcode it for each. I think I have to use the wildcard reference and that seems to not be working unless it's tied to the preset browser where it works fine.For the mouse callback it would be easier as I could write a control callback directly referencing the panel. If event clicked do this.
I can't do that or more specifically don't know how to do that with the child panels and that's what I am asking for really, how do I do it?@rzrsharpeprod said in A couple of expansion questions:
Do I need to write a code along the lines of if object under mouse is [0] then do this, if object is [1] then do that and do this for all possible expansions up to say 30?
Is this the only way to do it?
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
I just took another look at your snippet. I don't see anywhere that you are loading the image into the panel.
Sorry was in a meeting. It isn't in the most recent one as I think it got removed when you did the hover and numbering in the one late last night. It is in this one though and just gives the error
HiseSnippet 1485.3ocsWstaaTDEd2jrPsgJQQ7.LXIpV235XWZnfBU3bwoXQShUbuIUUplt6X6QY2YVs63DaPvq.7.vO3e71vqA+k2.3blYuYWmpV2V+mj4ba9lu4bNyY6GK8XIIxXK6JOXVDyx9icFLSnFu+XJWX06.K6q4buXtOgGRGwRHOtWeq8lEQSRX9V11qeOzL6JaXo+8ue2dz.pviUHxx5QRtG697PtpPZ+N+.OH3PpO6A7vRVe6N87jh8kAxI.jV2okUD06LXmOlhlslik8Gz0mqjwCTTEKwxdi8j9yFLVdgvX+i3I7WDvvEssF.AxH9PYfOhXTp09i4A98yN5IVPT5WPDqaHhOy4HtOOWdAg7IZEjBOJyG1qMO7VeN30tL7ZUBdKAR1kfzFFHcMmAdw7HUgFDOejSOghEOjBzdYnXr0ZsZWwYeIXgP0LjdF6vXXQtGtsu01sZPtSqV02oZ0s1h.llnnBURUO7+HmSiIQh.cNvcIYAZDSsuLLRJfEt0R0WCBQgSGs6o2q2wfOsaUV7wO7nmu+I2e.n31vNZTvlF88Tge.KFD2ULhKXM8hY.E1cZDUjvkhT8t46A3y84veuaIuQbk6Ap0s9h6c2mze2iGz6jiGX7DspY.SLRMFfSLajISOMzO8YorhFLDO7Vh.wmEjP7mIngbOZPvrpbQ.fYxvIBOEr0DC3MWpZqcqW8mqVIPBlStf6qFCA2Mk2PT+XTlacxMS4s5jsJnpLg6jEAwjvSkWj.w3HpZbSOFOvcgCWg60ycaLiOZLdrLHXKR6lauMb.qLTFSb4fhV6P3jucAhBjs4l0qVAN.oAxKBrMC8Te+hCJR3YVwE9ro34jS9h4PSpdTWZVxlfQZqugAa0KKIkQJbbV1AeXfTFCguzgEr2M8btYNWtYNABwvKpYBS0WlvwqJ2oMHyZX10FoLDtU+BXZ1IDL2slQUsFlcNjNMcaZjeabCxBaLhkLkaRZWuNDXHtKlrDHo98zsWMYI4IfM8BXTcJe5UDC3zWc59bWS7vQXRtI+Jv2iF6eJaHKlAcncqgcZaFIFAksH0VrqQSRF6B9pYbrefLf0LJlCk55XAsehXwJNh2lXi4kXnJFatnMuWVfc0D.vr.GfEU8gNpJRrbhBoCkj3GSufvndiM0fUKw+ZaO0XpaFy4NRyWXo8aSME5+abEE5zkTOUoZkQMGBuusaPfaqolVquA0XXnu7ZGT6JT4ft81T2fYHCgHmb.aHbG36lmu7T9ypSt90IkEP976RpUCNOU.p.uV0IAy4SCxSWRoGHFdNpUZdR8cHUe45EcUgtkCjI6ZHMM6NEKOJk.TzVJu3nxzlwrP443yfg8ow36WZ9QWwCIk8DPaAZ.+mXUWXe1g.pOU6bBA55O2qAUWRG+cpVtxF3v7SfTbrTwNQXp2g5AxhpFNbo5v2eikA5GBWhZbXp3WkiX6nWvha.OGFLgkaHLgw7is3b4isTdpJOy3.kLTJPB7jHl3xl0xJcFBbDmTTAlpzC37ooC3v7eDmcQjLVYwgYYp3bdjBuTszvt7vkVOr2ATEMKXPbK5NAxNfcNL7oY5oJNGvRNSIiz1lN7hk8G9Zt0SK11eryrxKzIv4B98eqiIUNWxe9qcR7vas8nwOXL26LAvEvfrNsa0r0RAyUyFzCyjRwQZdcYbXYUBGsW.GcJii+4OR96u4uXchzY7k1vhym0KOuILoqzeR.UM+3u3L+oJfjq4l4DmqDdMRMq72D7Nal3WWHdMm9bk23kiw0VBFgzm2GXL8KItpS2gCYdpB.tgygO48ymMXYdibDzlOlCoJNGOIb.7wTdPqIp.6KAxrWCKCMqagqQFX.S3qW7evuTksw01oJamozJjBoyO2yT7heqxUzR.LIzelVEmiv0j1Y0qNNXldH7YSO2yCO92D5Lrbet0J3yWtB9b6UvmsWAe9pUvm6rB970uRevuXc2IJYnob.DzuqtuoscWAExrzYgV++e3KI.
@d-healey said in A couple of expansion questions:
Check the API browser for all of the available expansion functions.
Ah ok so there are tags I can use by the looks of it as there is a tags property that is currently empty and I can see the tags element in the expansions info XML file now that I have looked.
@d-healey said in A couple of expansion questions:
You have an array of expansions (expList) and you have an array of child panels (stored in the parent panel). In the mouse callback of the child panel, you find out its index in the parent panel's array, and use this to find the corresponding expansion in expList.
Edit: Actually you can do it in an even simpler way if you're already storing the expansion name with the child panel, because all you need to load the expansion is its name.
I see the array for the child panels and the objects (childPanels[0],[1] etc) but how can I tie an action to those? That's what I am asking really. Am I using object under mouse?
Do I need to write a code along the lines of if object under mouse is [0] then do this, if object is [1] then do that and do this for all possible expansions up to say 30? -
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
For the description I think you might also be able to pull that information from the expansion and then you can set it as a data property of the child panel.
I need to stop asking new questions and try to solve the ones I still don't know the answers to first lol But how would I pull that data from the expansion? Where would the data live? In the expansion XML file or a separate txt file?
Did you manage to have a look at why the images weren't loading for the child panels?
Finally so that I don't resort back to my temporary solution of fixed buttons as I would really rather build off this grid now it is getting somewhere, how on earth do I make it so when you click on child panel 1 it loads expansion 1, clicking on child panel 2 loads expansion 2 etc etc? This is still part of the same issue of me not understanding child panels clearly.
Once I have that part working I can at least start work on trying to figure out how to get the UI to display correctly when set expansion is called as it sounds like you think that should be enough to get it to display correctly?
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
Can you give me an example of the text you want to apply?
Sure, so it would be 2 rows at the bottom of the panel with line 1 being the expansion name and then a line underneath that is more descriptive.
Expansion Name Dark - Gritty - Trap
As an example
Hope that makes sense?
-
RE: A couple of expansion questions
@d-healey ok the universal paint routine stuff makes sense and is how I would get around the hover, drop shadow and other shared requirements I think so thankyou for that.
But what I still don't understand is how I would set individual, unique text labels for each panel as I am still not getting how to interact with the child panels due to their dynamic nature.
Your example shows how to do something to all child panels or even set each one to be different so it has a unique number as the text.
But how can I make panel 1 always say the unique text that I want it to and the same for panel 2, panel 3 etc.That is really where I am struggling most and maybe I haven't asked the right question or explained what I am struggling with very well?
Do I need to write out code for each potential child panel in order for me to allow each one to have the unique text I am looking for? If index is 0 then do this, if index is 1 then do this etc etc?
The text isn't stored anywhere like the Icon pngs are so can't be called that way I don't think as it is more than just the expansion name that I want to set for each child panel. -
RE: A couple of expansion questions
@d-healey Thankyou it is much appreciated. I will go through and have a look and try to figure it out
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
@rzrsharpeprod said in A couple of expansion questions:
You have done so much already and I appreciate it but would you be able to post a snippet of how you would add a label or the hover to the child panels
Do you know how to do it for a panel - a regular panel?
Yes, I was messing with hovering the other day when I was toying with using panels as buttons.
With the label I would either add it via code the correct way or sometimes just create a label and attach it to the panel in the component list for speed.
But this goes back to me just not getting it when it comes to the child panels and the fact that they are dynamic, can be 1 or many and all have different positions etc. I am just not understanding how it works hence me asking for the example. I just don't get it and the more I try the more I get annoyed with myself for not getting it.
I don't think the penny is going to drop until I see it working and can pull apart the code to understand it...and then I am going to feel like a fool for not getting it sooner. But at least then I will get it.
I'll happily take being a fool who understands it over a frustrated fool who doesn't -
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
Ok, we'll investigate that later. Probably a simple fix.
Thankyou, do you need another snippet or is the one further up here ok? Nothing much has changed so I think it probably will be ok.@d-healey said in A couple of expansion questions:
Take a break, come back to it in a couple of days. If I find some time I'll try and make a video about child panels. I think you need one of those moments that triggers something and it will suddenly all click into place.
You're right but that's exactly what I did when I couldn't crack this after a couple of days. That has just ended up ramping up the pressure on me to get this done as now I have less time to get it built due to the days spent basically idling.
Yeah I agree re a trigger moment. You have done so much already and I appreciate it but would you be able to post a snippet of how you would add a label or the hover to the child panels so I can at least get my head around it and see how it should be done. I can at least then extrapolate it out to try and get some other parts of the project ticked off. Right now the only thing that is ticked off is me haha
-
RE: A couple of expansion questions
@d-healey said in A couple of expansion questions:
Maybe, is the Icon.png in the expansion's images folder?
Yes, each expansion has an image called Icon.png in the images folder. The case is correct Icon with a capital I.
I even added a preset browser as a test and used the code I got from your tutorial to check and the images loaded just fine in the expansions column of that preset browser so everything is where it should be .@d-healey said in A couple of expansion questions:
Or the simplest way is to do it in the creation loop because at that point you have each individual child stored in the cp variable as it's created. So you can enable mouse callbacks and stuff at that point.
The great thing is you don't need to treat them all separately. Thing of this, when you create the child panel you store the expansion name associated with it in its data property.
Then in the generic mouse click callback which you apply to all children, you just check which expansion this particular panel is associated with and load the expansion. One function to rule them all :)
To be honest, I know this is solid advice but as I said I have spent days on this and reading it just made me genuinely sad that I probably understand it less now than I would have done last week. It has properly scrambled my brain trying to figure this out. I'm so close to just throwing in the towel as it is stressing me out more than it should do at this point as I feel I am no further forward, possibly even less so than I was at this point a week ago
-
RE: A couple of expansion questions
@d-healey ok first off I didn't see your reply before I started building it so I ended up testing it in DAW as it was built. Still the same result with the XXX placeholders/missing images.
If I delete the expansion folders in AppData and open it in DAW they are gone and it's just a blank background so it is reading them. If I put them back and reopen it reads the correct amount so that part is working, it just won't load the images in HISE or in DAW. Something must be wrong with the code surely? Or it is a bug but I wouldn't be confident saying that.@d-healey said in A couple of expansion questions:
They are just the same as any old regular panel, the only difference is they are created dynamically.
Any property you can set for a panel also applies to a child panel - you have to do it through code though instead of the interface designer.
But that is the part that I can't quite get my head around. Because they are dynamic how do I code/tell HISE what to do for a specific one? In some cases there may only be 1, others there could be 5 or more expansions installed so the tiles are on different rows etc. I know I don't have to code every possible example using if elses and xy references as that would be bonkers, but I don't know how to reference them dynamically as they may or may not be there.
It just isn't making sense to me. I can do all of the children as I did last night with the images and I can do stuff to the parent panel but I do not know how to reference child 1, child 2 etc and have actions specific to them