|
- #include "BankView.h"
- #include "../Misc/Util.h"
- #include <FL/Fl.H>
- #include <FL/Fl_Check_Button.H>
- #include <FL/fl_ask.H>
- #include <rtosc/rtosc.h>
- #include <cstdio>
- #include <cstring>
- #include <cassert>
-
- BankList::BankList(int x,int y, int w, int h, const char *label)
- :Fl_Osc_Choice(x,y,w,h,label)
- {}
-
- void BankList::init(std::string path)
- {
- ext = path;
- oscRegister(path.c_str());
- osc->createLink("/bank-list", this);
- }
-
- void BankList::OSC_raw(const char *msg)
- {
- if(!strcmp(msg, "/bank-list")) {
-
- const int pos = rtosc_argument(msg, 0).i;
- const char *path = rtosc_argument(msg, 1).s;
-
- value(0);
- if(pos == 0)
- this->clear();
-
- this->add(path);
- osc->write("/loadbank");
- }
- if(!strcmp(msg, "/loadbank")) {
- value(rtosc_argument(msg, 0).i);
- }
- }
-
- BankSlot::BankSlot(int x,int y, int w, int h, const char *label)
- :Fl_Button(x,y,w,h,label), nslot(-1)
- {
- memset(labelstr, 0, sizeof(labelstr));
- box(FL_THIN_UP_BOX);
- labelfont(0);
- labelsize(13);
- align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP);
- }
-
- int BankSlot::handle(int event)
- {
- int what = 0;
- if (Fl::event_inside(this))
- {
- what=0;
- if ((event==FL_RELEASE)&&(Fl::event_button()==1))
- what=1;
- if ((event==FL_RELEASE)&&(Fl::event_button()==3))
- what=2;
- }
-
- int tmp=Fl_Button::handle(event);
-
- if (what && Fl::event_inside(this))
- bv->react(what, nslot);
-
- return tmp;
- }
-
- void BankSlot::init(int nslot_, BankView *bv_)
- {
- nslot = nslot_;
- bv = bv_;
-
- snprintf(labelstr, 127, "%d.", nslot_);
- label(labelstr);
- }
-
- void BankSlot::update(const char *name__, const char *fname__)
- {
- name_ = name__;
- filename_ = fname__;
- snprintf(labelstr, 127, "%d. %s", nslot, name_.c_str());
- label(labelstr);
-
- if(name_.empty())
- label("");
-
- color(empty() ? 46 : 51);
- #ifdef NTK_GUI
- redraw();
- #endif
- }
-
- bool BankSlot::empty(void) const
- {
- return filename_.empty();
- }
-
- const char *BankSlot::name(void) const
- {
- return name_.c_str();
- }
-
- const char *BankSlot::filename(void) const
- {
- return filename_.c_str();
- }
-
- /*
- void BankSlot::init(int nslot_, int *what_, int *whatslot_,void (BankProcess_:: *fnc_)(void),BankProcess_ *bp_,Bank *bank_,int *nselected_) {
- nslot=nslot_;
- what=what_;
- whatslot=whatslot_;
- fnc=fnc_;
- bp=bp_;
- //bank=bank_;
- nselected=nselected_;
- box(FL_THIN_UP_BOX);
- labelfont(0);
- labelsize(13);
- align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP);
-
- highlight=0;
- //refresh();
- }
- */
-
- /*
- void BankSlot::refresh() {
- if (bank->emptyslot(nslot))
- color(46);
- else if (bank->isPADsynth_used(nslot))
- color(26);
- else
- color(51);
-
-
- if (*nselected==nslot)
- color(6);
-
-
- copy_label(bank->getnamenumbered(nslot).c_str());
- }
- */
- static int modeCb(const char *label)
- {
- if(!strcmp("Read", label))
- return 1;
- else if(!strcmp("Write", label))
- return 2;
- else if(!strcmp("Clear", label))
- return 3;
- else if(!strcmp("Swap", label))
- return 4;
- return -1;
- }
-
- static void modeButtonCb(Fl_Widget *w, void *v)
- {
- BankViewControls *bvc = (BankViewControls*)v;
- bvc->mode(modeCb(w->label()));
- }
-
- BankViewControls::BankViewControls(int x, int y, int w, int h, const char *label)
- :Fl_Group(x,y,w,h,label)
- {
- //Margin
- const int m = 10;
- //Width per elm
- const float W = w/4;
-
- read = new Fl_Check_Button(x+m+0*W, y+m, W-2*m, h-2*m, "Read");
- write = new Fl_Check_Button(x+m+1*W, y+m, W-2*m, h-2*m, "Write");
- clear = new Fl_Check_Button(x+m+2*W, y+m, W-2*m, h-2*m, "Clear");
- swap = new Fl_Check_Button(x+m+3*W, y+m, W-2*m, h-2*m, "Swap");
- read->box(FL_BORDER_BOX);
- write->box(FL_BORDER_BOX);
- clear->box(FL_BORDER_BOX);
- swap->box(FL_BORDER_BOX);
- read->callback(modeButtonCb, this);
- write->callback(modeButtonCb, this);
- clear->callback(modeButtonCb, this);
- swap->callback(modeButtonCb, this);
- mode(1);
- }
-
- int BankViewControls::mode(void) const
- {
- return mode_;
- }
-
- void BankViewControls::mode(int m)
- {
- mode_ = m;
- int M = m-1;
- assert(0 <= M && M <= 3);
- Fl_Button *buttons[4]{read, write, clear, swap};
-
- for(int i=0; i<4; ++i)
- buttons[i]->value(i==M);
- }
-
-
- BankView::BankView(int x,int y, int w, int h, const char *label)
- :Fl_Group(x,y,w,h,label), bvc(NULL), slots{0}, osc(0),
- loc(""), nselected(-1), npart(0), cbwig_(0)
- {}
-
-
- BankView::~BankView(void)
- {
- if(osc)
- osc->removeLink("/bankview", this);
- }
-
- void BankView::init(Fl_Osc_Interface *osc_, BankViewControls *bvc_, int *npart_)
- {
- assert(osc_);
-
- osc = osc_;
- bvc = bvc_;
- npart = npart_;
-
- osc->createLink("/bankview", this);
-
- //Element Size
- const float width = w()/5.0;
- const float height = h()/32.0;
-
- //Offsets
- const int X = x();
- const int Y = y();
-
- begin();
- //Place All Slots
- for(int i=0; i<5; ++i)
- for(int j=0; j<32; ++j)
- slots[i*32 + j] =
- new BankSlot(X + i*width, Y + j*height, width, height);
-
- end();
-
- //Initialize callbacks
- for(int i=0; i<160; ++i)
- slots[i]->init(i, this);
-
- //Request Values
- for(int i=0; i<160; ++i)
- osc->write("/refresh_bank", "i", i);
- }
-
- /*
- * React to user input.
- * This consists of the events:
- * - Rename Slot (right click)
- * - Read From Slot
- * - Write To Slot
- * - Swap Slot First Selection
- * - Swap Slot Second Selction
- *
- * TODO restore autoclose functionality
- */
- void BankView::react(int event, int nslot)
- {
- BankSlot &slot = *slots[nslot];
- const bool isempty = slot.empty();
- const int mode = bvc->mode();
-
- //Rename slot
- if (event==2 && !isempty && mode!=4) {
- if(const char *name=fl_input("Slot (instrument) name:", slot.name())) {
- osc->write("/bank-rename", "is", nslot, name);
- osc->write("/refresh_bank", "i", nslot);
- }
- }
-
- //Reads from slot
- if ((event==1)&&(mode==1)&&(!slot.empty())){
- printf("Loading a part #%d with file '%s'\n", nslot, slot.filename());
- osc->write("/load-part", "is", *npart, slot.filename());
- osc->writeValue("/part"+to_s(*npart)+"/name", slot.name());
- if(cbwig_)
- cbwig_->do_callback();
- }
-
- //save(write) to slot
- if(event==1 && mode==2){
- if(!isempty && !fl_choice("Overwrite the slot no. %d ?","No","Yes",NULL,nslot+1))
- return;
-
- osc->write("/save-bank-part", "ii", *npart, nslot);
- osc->write("/refresh_bank", "i", nslot);
- //pthread_mutex_lock(&master->part[*npart]->load_mutex);
- //bank->savetoslot(slot,master->part[*npart]);
- //pthread_mutex_unlock(&master->part[*npart]->load_mutex);
-
- bvc->mode(1);
- }
-
-
- //Clears the slot
- if(event==1 && mode==3 && !isempty) {
- if (fl_choice("Clear the slot no. %d ?","No","Yes",NULL, nslot+1)) {
- osc->write("/clear-bank-slot", "i", nslot);
- osc->write("/refresh_bank", "i", nslot);
- }
- }
-
- //Swap
- if(mode==4) {
- if(event==1 && nselected>=0){
- osc->write("/swap-bank-slots", "ii", nselected, nslot);
- osc->write("/refresh_bank", "i", nslot);
- osc->write("/refresh_bank", "i", nselected);
- //bank->swapslot(nselected,slot);
- nselected=-1;
- } else if(nselected<0 || event==2) {
- nselected=nslot;
- };
- };
- }
-
- void BankView::OSC_raw(const char *msg)
- {
- if(strcmp(rtosc_argument_string(msg), "iss"))
- return;
-
- int nslot = rtosc_argument(msg,0).i;
- const char *name = rtosc_argument(msg,1).s;
- const char *fname = rtosc_argument(msg,2).s;
-
- if(0 <= nslot && nslot < 160)
- slots[nslot]->update(name, fname);
- }
-
- void BankView::cbwig(Fl_Widget *w)
- {
- cbwig_ = w;
- }
-
- void BankView::refresh(void)
- {
- assert(osc);
- //Odd case during initialization
- if(!osc)
- return;
-
- for(int i=0; i<160; ++i)
- osc->write("/refresh_bank", "i", i);
- }
|