meerdere selecties - wouterdhooghe/svenenwouter2 GitHub Wiki
Het is noodzakelijk om het uitbreiden van de selectie naar onmiddellijk links en rechts toe te laten. Anders zijn bepaalde selecties onmogelijk en kunnen dus niet alle wiskundig geldige manipulaties uitgevoerd worden.
Het is echter niet noodzakelijk om 'disconnected' selecties toe te laten. Als we disconnected selecties verbieden dan hoeft er op elk moment slechts 1 Select statement in het hele stelsel te zijn. Dit is denk ik makkelijker voor zowat alle javascript functies die inwerken op het stelsel.
Met shift-rechts en shift-links kan de selectie naar rechts en links uitgebreid worden.
Hiervoor is een verandering van de interne structuur van de vergelijking nodig. Het is alleen zinvol voor functies die meer dan twee (gelijkwaardige) argumenten kunnen hebben. (dwz Plus, Times, EN, OF). De integraal operator heeft ook meerdere argumenten (twee grenzen, een functie en een integratievariabele) maar deze zijn niet gelijkwaardig en moeten dus zeker niet samen geselecteerd kunnen worden.
Een andere kwestie is hoe we deze selectie weer terug ongedaan kunnen maken. Een uitgebreide selectie binnen een Times functie moet bijvoorbeeld een Times functie creeeren binnen de originele Times functie.
Times(3, 4, Select(5), 6, 7) -> Times(3, 4, Select(Times(5, 6)), 7)
Als er vanaf hier naar links of rechts bewogen wordt dan moet de Times binnen Times geflattened worden. Dus bij elke links en rechts moet er een flattencheck gebeuren: check of we in een multifunctie zitten, zo ja doe een flatten op de parent (met select verwijderd) en selecteer dan terug het correcte argument.
shift-rechts: check of dit een multifunctie is. Als niet dan doen we niks. onthoud parent.args.length check of de select zelf al een (bvb) Times is (maw of de parent.name == selectNode.name) onthoud het nummer van het huidige argument: argnum als argnum < lastargnum dan als binnen de Select nog geen Times staat, zet die er dan nu in. replaceselectedby(selectIt(selectNode.args.push(parent.args[argnum+1]),equation)
nu moeten nog parent.args[argnum+1] overschreven worden door parent.args[argnum+2] etc zodat alles eentje opschuift naar links.
multifunctions = ['Times', 'Plus', 'And', 'Or' , ...]
ALTERNATIEF: hulpfunctie: function replacemultifunctionbymultifunctionwithselectedrange(multifunctionnode, firstargnumtoselect, lastargnumtoselect) { if multifunctionnode.name == Times of Plus of ... if 0 =< firstargnumtoselect < lastargnumtoselect < multifunctionnode.args.length
newselection = math.parse('Times()'); for (i=firstargnumtoselect; i<=lastargnumtoselect; i++) { newselection.push(multifunctionnode.args[i]) };
return selectIt(newselection); // NOG NIET GOED WANT RETURNET NIET DE HELE MULTIFUNCTION!
};