diff options
-rw-r--r-- | classes/Bowelyzer.sc | 23 | ||||
-rw-r--r-- | classes/BowelyzerGUI.sc | 163 |
2 files changed, 129 insertions, 57 deletions
diff --git a/classes/Bowelyzer.sc b/classes/Bowelyzer.sc index e1fba76..35aa0c3 100644 --- a/classes/Bowelyzer.sc +++ b/classes/Bowelyzer.sc @@ -193,9 +193,19 @@ Bowelyzer{ key: \saveas, func: {|msg, time, addr, recvPort| var name = msg[0], - fileName = msg[1]; + fileName = msg[1], + dict; postln("Received: "++msg); - config.writeConfigurationFile(fileName); + if(config.writeConfigurationFile(fileName), { + if((gui.configFilePathView.items.size == 0), { + gui.setCurrentConfigFilePath(fileName); + },{ + dict = Dictionary.with(*gui.configFilePathView.items); + if(dict.includesKey(fileName.asSymbol).not,{ + gui.setCurrentConfigFilePath(fileName); + }); + }); + }); }, path: "/saveas", srcID: hub.local @@ -225,8 +235,13 @@ Bowelyzer{ hub.addSynthListener(name); }); // reload the addresses and ports Views - gui.removeAddressesAndPorts; - gui.setupAddressesAndPorts(config.config); + gui.removeSettingsView("synthServer"); + gui.removeSettingsView("hub"); + gui.removeSettingsView("forward"); + gui.setupSynthServerView(config.config); + gui.setupHubView(config.config); + gui.setupForwardView(config.config); + gui.setCurrentConfigFilePath(config.configFilePath); },{ ("Configuration could not be read: "++fileName).error; }); diff --git a/classes/BowelyzerGUI.sc b/classes/BowelyzerGUI.sc index 48b1688..31dea20 100644 --- a/classes/BowelyzerGUI.sc +++ b/classes/BowelyzerGUI.sc @@ -1,6 +1,6 @@ BowelyzerGUI{ - var mainView, <settingsView, <channelContainerView, + var mainView, <settingsView, <channelContainerView, lowerView, <configFilePathView, <channels, <indicators, fadeOutTime = 0.3, @@ -43,36 +43,54 @@ BowelyzerGUI{ channels = Set.new(config.config.at(\inputs).size); indicators = Dictionary.new(config.config.at(\inputs).size); this.setupMainView(config.config, config.configFilePath); - this.setupChannelAddButton(channelContainerView); this.setupChannelViews(config.config); } //setup the main view, in which all other views reside setupMainView{ - arg config, configFilePath; + arg config, configFilePath, buttonView; var channelScrollView, layout; mainView = PageLayout.new("Bowelyzer"); mainView.asView.background = Color.fromHexString("#DBDBDB"); layout = mainView.asView.addFlowLayout(0@0, 0@0); mainView.onClose_({ |view| + //TODO: close everything depending on choice view.close; }); //settings - settingsView = View(mainView.asView, Rect(0, 0, settingsViewSize.x, settingsViewSize.y)); - settingsView.asView.background = Color.fromHexString("#99EF99"); + settingsView = View(mainView.asView, Rect(0, 0, mainView.bounds.width, settingsViewSize.y)); settingsView.layout = HLayout(); - settingsView.layout.spacing = 0; + settingsView.layout.spacing = 4; settingsView.layout.margins = [0,0,0,0]; + this.setupConfigView; - this.setupAddressesAndPorts(config); + this.setupConfigFilePathView(configFilePath); + this.setupSettingsSpacer; + this.setupSynthServerView(config); + this.setupHubView(config); + this.setupForwardView(config); // go to next line in layout layout.nextLine; + lowerView = View(mainView.asView, Rect(0 , 0, mainView.bounds.width, mainView.bounds.height-settingsView.bounds.height)); + lowerView.layout = HLayout(); + lowerView.layout.spacing = 0; + lowerView.layout.margins = [0,0,0,0]; + buttonView = View(bounds: Rect(0, 0, buttonWidth+8, mainView.bounds.height-settingsView.bounds.height)); + buttonView.layout = VLayout(); + buttonView.layout.spacing = 4; + buttonView.layout.margins = [4,4,4,4]; + buttonView.layout.insert(this.setupChannelAddButton, 0); + buttonView.layout.insert(nil, 1); + lowerView.layout.insert(buttonView, 0); + // scrollview for channels - channelScrollView = ScrollView(mainView.asView, Rect(0 , 0, mainView.bounds.width, mainView.bounds.height-settingsView.bounds.height)).autohidesScrollers_(false).hasBorder_(true); + channelScrollView = ScrollView(bounds: Rect(0 , 0, mainView.bounds.width-buttonWidth, mainView.bounds.height-settingsView.bounds.height)) + .autohidesScrollers_(false) + .hasBorder_(true); // container for channelViews channelContainerView = View(parent: channelScrollView, bounds: Rect(0, 0, (channelViewWidth*config.at(\inputs).size)+buttonWidth, channelViewHeight)); channelContainerView.asView.background = Color.fromHexString("#FEFEFE"); @@ -80,44 +98,68 @@ BowelyzerGUI{ channelContainerView.layout.spacing = 0; channelContainerView.layout.margins = [0,0,0,0]; channelContainerView.name = \channelContainerView; + lowerView.layout.insert(channelScrollView, 1); + } + + // setup View for displaying current configuration file + setupConfigFilePathView{ + arg configFilePath; + var listView; + { + listView = View(); + listView.minSize_((settingsSubViewSize.x*2)@settingsSubViewSize.y); + listView.addFlowLayout(0@0, 0@0); + listView.name = "configFilePath"; + configFilePathView = EZListView.new( + listView, + bounds: (settingsSubViewSize.x*2)@settingsSubViewSize.y, + label: "Current configuration:" + ); + if(configFilePath.notNil && (configFilePath != ""), { + configFilePathView.addItem(configFilePath, {|unit| this.sendLoadMessage(unit.item)}); + }); + settingsView.layout.insert(listView, 1); + }.defer; + } + + + // insert a new config file path at the top of the list and set it to current + setCurrentConfigFilePath{ + arg configFile; + { + configFilePathView.insertItem(0, configFile, {|unit| this.sendLoadMessage(unit.item)}); + configFilePathView.value(0); + }.defer; } // setup the config View with Buttons to save and load configurations setupConfigView{ + { var configView = View(); - configView.asView.background = Color.fromHexString("#DDDDEF"); configView.layout = VLayout(); - configView.layout.spacing = 0; - configView.layout.margins = settingsSubViewMargins; + configView.layout.spacing = 4; + configView.layout.margins = [4,4,4,4]; configView.name = "config"; configView.maxSize_(configViewSize); - this.setupSaveButton(configView); - this.setupSaveAsButton(configView); - this.setupLoadButton(configView); + configView.layout.insert(this.setupSaveButton, 0); + configView.layout.insert(this.setupSaveAsButton, 1); + configView.layout.insert(this.setupLoadButton, 2); + configView.layout.insert(nil, 2); settingsView.layout.insert(configView, 0); + }.defer; } - removeConfigView{ - settingsView.children.do({|setting, i| - if(setting.isKindOf(View) && (setting.name == "config"),{ - setting.remove; - }); - }); - } - - // setup Views for addresses and ports - setupAddressesAndPorts{ + // setup View for synthServer address and port + setupSynthServerView{ arg config; - var forwardView, hubView, synthServerView; + var synthServerView; { - //synthServer synthServerView = View(bounds: Rect(0, 0, settingsSubViewSize.x, settingsSubViewSize.y)); - synthServerView.asView.background = Color.fromHexString("#DDDDEF"); synthServerView.layout = VLayout(); synthServerView.layout.spacing = 0; synthServerView.layout.margins = settingsSubViewMargins; synthServerView.name = "synthServer"; - synthServerView.maxSize_(settingsSubViewSize); + synthServerView.minSize_(settingsSubViewSize); StaticText(synthServerView, Rect(0, 0, 140@buttonHeight)).string_("synthServer").align_(\center); this.setupEZText(synthServerView, "address", config.at(\synthServerAddress)).children.do({|item| if(item.isKindOf(StaticText),{ @@ -135,16 +177,21 @@ BowelyzerGUI{ item.align_(\right); }); }); - settingsView.layout.insert(synthServerView, 1); + settingsView.layout.insert(synthServerView, 3); + }.defer; + } - //hub + // setup View for hub address and port + setupHubView{ + arg config; + var hubView; + { hubView = View(bounds: Rect(0, 0, settingsSubViewSize.x, settingsSubViewSize.y)); - hubView.asView.background = Color.fromHexString("#DDDDEF"); hubView.layout = VLayout(); hubView.layout.spacing = 0; hubView.layout.margins = settingsSubViewMargins; hubView.name = "hub"; - hubView.maxSize_(settingsSubViewSize); + hubView.minSize_(settingsSubViewSize); StaticText(hubView, Rect(0, 0, 140@buttonHeight)).string_("hub").align_(\center); this.setupEZText(hubView, "address", config.at(\hubAddress)).children.do({|item| if(item.isKindOf(StaticText),{ @@ -162,16 +209,21 @@ BowelyzerGUI{ item.align_(\right); }); }); - settingsView.layout.insert(hubView, 2); + settingsView.layout.insert(hubView, 4); + }.defer; + } - //forward + // setup View for forward address and port + setupForwardView{ + arg config; + var forwardView; + { forwardView = View(bounds: Rect(0, 0, settingsSubViewSize.x, settingsSubViewSize.y)); - forwardView.asView.background = Color.fromHexString("#DDDDEF"); forwardView.layout = VLayout(); forwardView.layout.spacing = 0; forwardView.layout.margins = settingsSubViewMargins; forwardView.name = "forward"; - forwardView.maxSize_(settingsSubViewSize); + forwardView.minSize_(settingsSubViewSize); StaticText(forwardView, Rect(0, 0, 140@buttonHeight)).string_("forward").align_(\center); this.setupEZText(forwardView, "address", config.at(\forwardAddress)).children.do({|item| if(item.isKindOf(StaticText),{ @@ -189,15 +241,20 @@ BowelyzerGUI{ item.align_(\right); }); }); - settingsView.layout.insert(forwardView, 3); + settingsView.layout.insert(forwardView, 5); }.defer; + } + + setupSettingsSpacer{ + settingsView.layout.insert(nil, 5); } // remove Views for addresses and ports - removeAddressesAndPorts{ + removeSettingsView{ + arg name; { settingsView.children.do({|setting, i| - if(setting.isKindOf(View) && ((setting.name == "hub") || (setting.name == "synthServer") || (setting.name == "forward")),{ + if(setting.isKindOf(View) && (setting.name == name.asString), { setting.remove; }); }); @@ -433,20 +490,14 @@ BowelyzerGUI{ // create a load button, that launches a FileDialog on press setupLoadButton{ - arg parent; - ^Button(parent, Rect(0, 0, buttonWidth, buttonHeight)) + ^Button(bounds: Rect(0, 0, buttonWidth, buttonHeight)) .states_([ ["load", Color.black, Color.fromHexString("#99FF99")] ]) .action_({ arg controlUnit; - var address = NetAddr.new("127.0.0.1", NetAddr.langPort), - type = "/load"; FileDialog.new( - okFunc: {|path| - postln("Sending: ["++type++", "++path++"]"); - address.sendMsg(type, path.asString); - }, + okFunc: {|path| this.sendLoadMessage(path)}, cancelFunc: {}, fileMode: 1, acceptMode: 0, @@ -457,10 +508,17 @@ BowelyzerGUI{ ; } + // send a message via OSC to load a configuration file by name + sendLoadMessage{ + arg path; + var address = NetAddr.new("127.0.0.1", NetAddr.langPort), + postln("Sending: [/load, "++path++"]"); + address.sendMsg("/load", path.asString); + } + // create a save button, that launches a FileDialog on press setupSaveButton{ - arg parent; - ^Button(parent, Rect(0, 0, buttonWidth, buttonHeight)) + ^Button(bounds: Rect(0, 0, buttonWidth, buttonHeight)) .states_([ ["save", Color.black, Color.fromHexString("#99FF99")] ]) @@ -496,8 +554,7 @@ BowelyzerGUI{ // create a save button, that launches a FileDialog on press setupSaveAsButton{ - arg parent; - ^Button(parent, Rect(0, 0, buttonWidth, buttonHeight)) + ^Button(bounds: Rect(0, 0, buttonWidth, buttonHeight)) .states_([ ["save as", Color.black, Color.fromHexString("#99FF99")], ]) @@ -550,8 +607,7 @@ BowelyzerGUI{ // setup a button to add a channel setupChannelAddButton{ - arg parent; - ^Button(parent, Rect(0, 0, buttonWidth, buttonWidth)) + ^Button(bounds: Rect(0, 0, buttonWidth, buttonWidth)) .states_([ ["+", Color.black, Color.fromHexString("#99FF99")] ]) @@ -562,6 +618,7 @@ BowelyzerGUI{ postln("Sending: ["++type++"]"); address.sendMsg(type); }) + .minSize_(buttonWidth@buttonWidth) .maxSize_(buttonWidth@buttonWidth) .name_("add") ; |