/* GUI Scroll Bar Functionality by jeremy_at_mantissa.ca */ var win, winWidth, winHeight, v1, v2, v, menu, menuSize, scroll, boxes, drawMenu, scrollFunct; menuSize = 16; winWidth = 200; winHeight = 405; menu = Array.fill(30, { arg id; id; }); // add your own array here drawMenu = { arg start=0; var count; v1 = SCCompositeView(win, Rect(0, 0, winWidth - 30, winHeight)); v1.background = Color(1.0, 0, 0, 0.3); v = SCVLayoutView(v1, Rect(5, 5, winWidth - 40, winHeight)); v.setProperty(\spacing, 5); start = start.asInteger; count = menuSize.min(menu.size - start); // how many buttons boxes = Array.newClear(count); // array of buttons boxes.do({ arg i, id; i = SCButton(v, Rect(0, 0, winWidth - 30, 20)); i.states = [[ menu.at(start+id).asString ]]; i.action = { (start+id).postln; }; }); }; win = SCWindow.new("scroll", Rect(100, 400, winWidth, winHeight), 1); drawMenu.value; v2 = SCCompositeView(win, Rect(winWidth - 30, 0, 30, winHeight)); scroll = SCSlider(v2, Rect(winWidth - 30, 0, 30, winHeight)); scroll.value = 1; scroll.action = { arg val; var cs, start; cs = ControlSpec.new(0, menu.size - menuSize, 'linear'); start = cs.map(1 - val.value); scrollFunct.value(start); win.refresh; }; scrollFunct = { arg start; v1.remove; drawMenu.value(start); win.refresh; }; win.front;