panel repaint and mousecallback - inconsistencies..
-
So given all these are panels:
mainRadioButtons[0] = Content.getComponent("Main"); mainRadioButtons[1] = Content.getComponent("Editor"); mainRadioButtons[2] = Content.getComponent("Effects"); mainRadioButtons[3] = Content.getComponent("Arps");
apparently I can say this(and it works):
var RadioButtonPainter = function(g) { g.setColour(Colours.grey); g.setFont("Verdana", this.getHeight()-11); g.drawAlignedText(this.get("text"), [0,0,this.getWidth(),this.getHeight()], "centred"); //this.setValue(1); if(this.getValue() == 1) { g.setColour(hilightColour); g.fillRect([0,this.getHeight()-3,this.getWidth(),3]); } }; for (dx=0;dx<mainRadioButtons.length;dx++) { mainRadioButtons[dx].setPaintRoutine(RadioButtonPainter); }
but this doesn't fire the function call back
var mainRadioCallBack = function(event) { Console.print("in main callback"); if (!event.mouseUp) { if (event.clicked) { for(dx=0;dx<mainRadioButtons.length;dx++) { mainRadioButtons[dx].setValue(0); mainRadioButtons[dx].repaint(); mainPanels[dx].showControl(false); }; var pos = mainRadioButtons.indexOf(this); Console.print("showing pos:" + pos); mainRadioButtons[pos].setValue(1); mainRadioButtons[pos].repaint(); mainPanels[pos].showControl(true); }; }; }; for (dx=0;dx<mainRadioButtons.length;dx++) { mainRadioButtons[dx].setMouseCallback(mainRadioCallBack); }
Unless I'm doing something silly - always likely...
-
Got a snippet?
-
@d-healey I will go make one...
-
you see this bit here......?
Unless I'm doing something silly - always likely...
- seems I must declare my mouse callback function BEFORE I try and assign it....
go figure....
- seems I must declare my mouse callback function BEFORE I try and assign it....
-
@Lindon I think you can avoid that if you don't declare them as
var
and instead declare them directly as arguments to the functions.HiseSnippet 850.3ocsU8taSCCD2tqYrVnHPhGfH9TpznjBaCjPH5V2JpB5VgtMw2l7RbarpicTryFUHd.3siGEdCfywsMsP2DTI7mx8Oe+xc+ty8SkATkRlhvUNcRBEgumyfIBcT6HBSf5dHBeemdDkll5ZUcvjDhRQCQX7Fu0n.WoLJ+7i2b.gSDAzBUHz4RV.88rXltPa+Vuiw4cHgzSYwK38Ns5FHEskbYFfmMb7QIjfwjQziIF2J4fvadTHSKSGnIZpB74.Y3jAQxqEV+OmoXWxoFglnAvEYUiZGw3g8m8upPHb49E+4aX+yejSOVHat9hJvCxM3VDwh0.bokgT4kfTyaBRcj7PyEbCvCu.7Jag2CcFDjxRzEVLX6tNcEPyYHAJ6KBKqunReG6zVBdHzMhIiocRAg4Q3smu+1t656W+U0pVqJT7UZ2qHot8IBJuo6qcmE6HptsLNQJ.AuGaM+XaTVgFJptOTvzeTloYBp2vLQflIEdipWq5WpU0ENiZLDZ76y4d8H5nFoDQHfEOaGW0fvAtxk7L51tyTwYihzILw35lj80eOi8jYJZaBmeIPTJRI8J.lEokMz0ppQ.jgwzv5V8liNhoZjRSLP2q9qLpxyyr6xUJNVpomH7pW8KUqT8qUc+cSCGtRalRWpjyooqzrg5mdaA5IxhujltMzPfRxbGA9vxDtM+6HbA1N4BNJEcEL8IIzoxETxlqfRhlREfuNq6gDMwvRmpC7KglpYF3fOjdEzFsb1JNGRUi0xjbemxeP36nysVaFi1zOQLH0a4X6snOWrU3CslLWn0YstlEpiPXG72vHTD0vOLROEj.df75YrAk49aa52J2SD7IvZm+XjBFrkgYbhd4ocyZsoFfNxRiUlQGghomr3Zu+gU.9qbEvJq2+kv8gN8Y5fnUi2Rq.uPe6+MdmtPslyQCGRCzEfsrSmOstaO+GfhcGzHXISJCXRNGmEO.VmDPAjH.9kxvXJY3zVYeiroxLfJByE9IblZroQFO0XyYFQwjfT4EA1YUyJ6sx0.XRj+ZUE3YSP1sIJe9EhywugOJFdI4hf.So3I.1WcLOaMh44qQL6rFwr6ZDydqQLuXMh4k2ZLlGw2OSKisiIfh9GkuHCiORP.VVNiD8K.i+GchB
-
If you need to use the same mousecallback for multiple panels then declare it as a
const var
and it does need to be declared before it's used as you've mentioned.For paint routines used by multiple panels you can just use a regular
inline function
.Panel1.setPaintRoutine(paintRoutine); Panel2.setPaintRoutine(paintRoutine); inline function paintRoutine(g) { g.fillAll(Math.randInt(Colours.aliceblue, Colours.lightpink)); }
Edit: Actually the same is true for paint routines if you need access to
this
you should declare them asconst var
. -
@d-healey yes clearly - and usually how I would do it for one off panels -but here Im replacing radio buttons with panels, and each panel has nearly the exact same call back:
- close all the panels,
- set the value of all other radio buttons to zero
- set value of yourself to 1
- open your panel
- repaint all the panels
so if I put them all in arrays I can refer to them with indexOf, and I can assign them all the same paint and mouse callbacks to save me some space, effort, time and is extnsible:
like this:
var mainRadioCallBack = function(event) { if (!event.mouseUp) { if (event.clicked) { // for each radio button/panel for(dx=0;dx<mainRadioButtons.length;dx++) { // turn off the radio buttons mainRadioButtons[dx].setValue(0); // repaint the buttons as off mainRadioButtons[dx].repaint(); // close each display panel mainPanels[dx].showControl(false); }; // find out who we are var pos = mainRadioButtons.indexOf(this); // turn this on mainRadioButtons[pos].setValue(1); // repaint yourself as on mainRadioButtons[pos].repaint(); // show your display panel... mainPanels[pos].showControl(true); }; }; };
see that indexOf(this) there?
-
Yup makes sense. Use
const var
instead ofvar
though.Writing const before a variable declaration tells the interpreter that this variable will not be changed (it differs from the const keyword in C++ in the way that you can still call methods on it that change something). Especially in combination with API calls it yields a huge performance boost (because it can resolve the function call on compile time):