Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

421 lines
13KB

  1. // generated by Fast Light User Interface Designer (fluid) version 1.0300
  2. #include "zynaddsubfx/UI/BankUI.h"
  3. //Copyright (c) 2002-2005 Nasca Octavian Paul
  4. //License: GNU GPL version 2 or later
  5. void BankProcess_::process() {
  6. ;
  7. }
  8. BankSlot::BankSlot(int x,int y, int w, int h, const char *label):Fl_Button(x,y,w,h,label) {
  9. what=NULL;
  10. whatslot=NULL;
  11. nslot=0;
  12. nselected=NULL;
  13. }
  14. int BankSlot::handle(int event) {
  15. if (what==NULL) return(0);
  16. if (Fl::event_inside(this)){
  17. *what=0;*whatslot=nslot;
  18. if ((event==FL_RELEASE)&&(Fl::event_button()==1))*what=1;
  19. if ((event==FL_RELEASE)&&(Fl::event_button()==3))*what=2;
  20. if (event==FL_PUSH) highlight=1;
  21. }else highlight=0;
  22. int tmp=Fl_Button::handle(event);
  23. if ((*what!=0) && Fl::event_inside(this)) (bp->*fnc)();
  24. return(tmp);
  25. }
  26. void BankSlot::init(int nslot_, int *what_, int *whatslot_,void (BankProcess_:: *fnc_)(void),BankProcess_ *bp_,Bank *bank_,int *nselected_) {
  27. nslot=nslot_;
  28. what=what_;
  29. whatslot=whatslot_;
  30. fnc=fnc_;
  31. bp=bp_;
  32. bank=bank_;
  33. nselected=nselected_;
  34. box(FL_THIN_UP_BOX);
  35. labelfont(0);
  36. labelsize(13);
  37. align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP);
  38. highlight=0;
  39. refresh();
  40. }
  41. void BankSlot::refresh() {
  42. if (bank->emptyslot(nslot))
  43. color(46);
  44. else if (bank->isPADsynth_used(nslot))
  45. color(26);
  46. else
  47. color(51);
  48. if (*nselected==nslot)
  49. color(6);
  50. copy_label(bank->getnamenumbered(nslot).c_str());
  51. }
  52. void BankUI::cb_Close_i(Fl_Button*, void*) {
  53. bankuiwindow->hide();
  54. }
  55. void BankUI::cb_Close(Fl_Button* o, void* v) {
  56. ((BankUI*)(o->parent()->user_data()))->cb_Close_i(o,v);
  57. }
  58. void BankUI::cb_writebutton_i(Fl_Light_Button* o, void*) {
  59. if (o->value()>0.5) mode=2;
  60. removeselection();
  61. }
  62. void BankUI::cb_writebutton(Fl_Light_Button* o, void* v) {
  63. ((BankUI*)(o->parent()->parent()->user_data()))->cb_writebutton_i(o,v);
  64. }
  65. void BankUI::cb_readbutton_i(Fl_Light_Button* o, void*) {
  66. if (o->value()>0.5) mode=1;
  67. removeselection();
  68. }
  69. void BankUI::cb_readbutton(Fl_Light_Button* o, void* v) {
  70. ((BankUI*)(o->parent()->parent()->user_data()))->cb_readbutton_i(o,v);
  71. }
  72. void BankUI::cb_clearbutton_i(Fl_Light_Button* o, void*) {
  73. if (o->value()>0.5) mode=3;
  74. removeselection();
  75. }
  76. void BankUI::cb_clearbutton(Fl_Light_Button* o, void* v) {
  77. ((BankUI*)(o->parent()->parent()->user_data()))->cb_clearbutton_i(o,v);
  78. }
  79. void BankUI::cb_swapbutton_i(Fl_Light_Button* o, void*) {
  80. if (o->value()>0.5) mode=4;
  81. removeselection();
  82. }
  83. void BankUI::cb_swapbutton(Fl_Light_Button* o, void* v) {
  84. ((BankUI*)(o->parent()->parent()->user_data()))->cb_swapbutton_i(o,v);
  85. }
  86. void BankUI::cb_New_i(Fl_Button*, void*) {
  87. const char *dirname;
  88. dirname=fl_input("New empty Bank:");
  89. if (dirname==NULL) return;
  90. int result=bank->newbank(dirname);
  91. if (result!=0) fl_alert("Error: Could not make a new bank (directory)..");
  92. refreshmainwindow();
  93. }
  94. void BankUI::cb_New(Fl_Button* o, void* v) {
  95. ((BankUI*)(o->parent()->user_data()))->cb_New_i(o,v);
  96. }
  97. void BankUI::cb_auto_i(Fl_Check_Button* o, void*) {
  98. config.cfg.BankUIAutoClose=(int) o->value();
  99. }
  100. void BankUI::cb_auto(Fl_Check_Button* o, void* v) {
  101. ((BankUI*)(o->parent()->user_data()))->cb_auto_i(o,v);
  102. }
  103. void BankUI::cb_banklist_i(Fl_Choice* o, void*) {
  104. int n=o->value();
  105. std::string dirname=bank->banks[n].dir;
  106. if (dirname.empty()) return;
  107. if (bank->loadbank(dirname)==2)
  108. fl_alert("Error: Could not load the bank from the directory\n%s.",dirname.c_str());
  109. for (int i=0;i<BANK_SIZE;i++) bs[i]->refresh();
  110. refreshmainwindow();
  111. }
  112. void BankUI::cb_banklist(Fl_Choice* o, void* v) {
  113. ((BankUI*)(o->parent()->user_data()))->cb_banklist_i(o,v);
  114. }
  115. void BankUI::cb_Refresh_i(Fl_Button*, void*) {
  116. rescan_for_banks();
  117. banklist->value(0);
  118. }
  119. void BankUI::cb_Refresh(Fl_Button* o, void* v) {
  120. ((BankUI*)(o->parent()->user_data()))->cb_Refresh_i(o,v);
  121. }
  122. void BankUI::cb_Show_i(Fl_Check_Button* o, void*) {
  123. config.cfg.CheckPADsynth=(int) o->value();
  124. refreshmainwindow();
  125. }
  126. void BankUI::cb_Show(Fl_Check_Button* o, void* v) {
  127. ((BankUI*)(o->parent()->user_data()))->cb_Show_i(o,v);
  128. }
  129. Fl_Double_Window* BankUI::make_window() {
  130. { Fl_Double_Window* o = bankuiwindow = new Fl_Double_Window(785, 575, "Bank");
  131. bankuiwindow->user_data((void*)(this));
  132. { Fl_Button* o = new Fl_Button(705, 546, 70, 24, "Close");
  133. o->box(FL_THIN_UP_BOX);
  134. o->callback((Fl_Callback*)cb_Close);
  135. } // Fl_Button* o
  136. { Fl_Group* o = new Fl_Group(5, 34, 772, 491);
  137. o->box(FL_ENGRAVED_FRAME);
  138. { Fl_Pack* o = new Fl_Pack(10, 39, 150, 481);
  139. o->box(FL_BORDER_FRAME);
  140. o->box(FL_NO_BOX);
  141. for (int i=0;i<32;i++){bs[i]=new BankSlot (0,0,o->w(),15," ");bs[i]->init(i,&what,&slot,&BankProcess_::process,(BankProcess_ *)this,bank,&nselected);};
  142. o->end();
  143. } // Fl_Pack* o
  144. { Fl_Pack* o = new Fl_Pack(163, 39, 150, 481);
  145. o->box(FL_BORDER_FRAME);
  146. o->box(FL_NO_BOX);
  147. for (int i=32;i<64;i++){bs[i]=new BankSlot (0,0,o->w(),15," ");bs[i]->init(i,&what,&slot,&BankProcess_::process,(BankProcess_ *)this,bank,&nselected);};
  148. o->end();
  149. } // Fl_Pack* o
  150. { Fl_Pack* o = new Fl_Pack(316, 39, 150, 481);
  151. o->box(FL_BORDER_FRAME);
  152. o->box(FL_NO_BOX);
  153. for (int i=64;i<96;i++){bs[i]=new BankSlot (0,0,o->w(),15," ");bs[i]->init(i,&what,&slot,&BankProcess_::process,(BankProcess_ *)this,bank,&nselected);};
  154. o->end();
  155. } // Fl_Pack* o
  156. { Fl_Pack* o = new Fl_Pack(469, 39, 150, 481);
  157. o->box(FL_BORDER_FRAME);
  158. o->box(FL_NO_BOX);
  159. for (int i=96;i<128;i++){bs[i]=new BankSlot (0,0,o->w(),15," ");bs[i]->init(i,&what,&slot,&BankProcess_::process,(BankProcess_ *)this,bank,&nselected);};
  160. o->end();
  161. } // Fl_Pack* o
  162. { Fl_Pack* o = new Fl_Pack(622, 39, 150, 481);
  163. o->box(FL_BORDER_FRAME);
  164. o->box(FL_NO_BOX);
  165. for (int i=128;i<160;i++){bs[i]=new BankSlot (0,0,o->w(),15," ");bs[i]->init(i,&what,&slot,&BankProcess_::process,(BankProcess_ *)this,bank,&nselected);};
  166. o->end();
  167. } // Fl_Pack* o
  168. o->end();
  169. } // Fl_Group* o
  170. { modeselect = new Fl_Group(5, 528, 425, 42);
  171. modeselect->box(FL_ENGRAVED_BOX);
  172. { Fl_Light_Button* o = writebutton = new Fl_Light_Button(116, 534, 99, 30, "WRITE");
  173. writebutton->type(102);
  174. writebutton->down_box(FL_THIN_DOWN_BOX);
  175. writebutton->selection_color((Fl_Color)1);
  176. writebutton->labeltype(FL_ENGRAVED_LABEL);
  177. writebutton->labelfont(1);
  178. writebutton->labelsize(13);
  179. writebutton->callback((Fl_Callback*)cb_writebutton);
  180. if (bank->locked()) o->deactivate();
  181. } // Fl_Light_Button* writebutton
  182. { Fl_Light_Button* o = readbutton = new Fl_Light_Button(11, 534, 99, 30, "READ");
  183. readbutton->type(102);
  184. readbutton->down_box(FL_THIN_DOWN_BOX);
  185. readbutton->selection_color((Fl_Color)101);
  186. readbutton->labeltype(FL_ENGRAVED_LABEL);
  187. readbutton->labelfont(1);
  188. readbutton->labelsize(13);
  189. readbutton->callback((Fl_Callback*)cb_readbutton);
  190. o->value(1);
  191. } // Fl_Light_Button* readbutton
  192. { Fl_Light_Button* o = clearbutton = new Fl_Light_Button(221, 534, 99, 30, "CLEAR");
  193. clearbutton->type(102);
  194. clearbutton->down_box(FL_THIN_DOWN_BOX);
  195. clearbutton->selection_color(FL_FOREGROUND_COLOR);
  196. clearbutton->labeltype(FL_ENGRAVED_LABEL);
  197. clearbutton->labelfont(1);
  198. clearbutton->labelsize(13);
  199. clearbutton->callback((Fl_Callback*)cb_clearbutton);
  200. if (bank->locked()) o->deactivate();
  201. } // Fl_Light_Button* clearbutton
  202. { Fl_Light_Button* o = swapbutton = new Fl_Light_Button(325, 534, 99, 30, "SWAP");
  203. swapbutton->type(102);
  204. swapbutton->down_box(FL_THIN_DOWN_BOX);
  205. swapbutton->selection_color((Fl_Color)227);
  206. swapbutton->labeltype(FL_ENGRAVED_LABEL);
  207. swapbutton->labelfont(1);
  208. swapbutton->labelsize(13);
  209. swapbutton->callback((Fl_Callback*)cb_swapbutton);
  210. if (bank->locked()) o->deactivate();
  211. } // Fl_Light_Button* swapbutton
  212. modeselect->end();
  213. } // Fl_Group* modeselect
  214. { Fl_Button* o = new Fl_Button(685, 5, 93, 25, "New Bank...");
  215. o->labelfont(1);
  216. o->labelsize(11);
  217. o->callback((Fl_Callback*)cb_New);
  218. o->align(Fl_Align(FL_ALIGN_WRAP));
  219. } // Fl_Button* o
  220. { Fl_Check_Button* o = new Fl_Check_Button(705, 529, 60, 15, "auto close");
  221. o->tooltip("automatically close the bank window if the instrument is loaded");
  222. o->down_box(FL_DOWN_BOX);
  223. o->labelsize(10);
  224. o->callback((Fl_Callback*)cb_auto);
  225. o->value(config.cfg.BankUIAutoClose);
  226. } // Fl_Check_Button* o
  227. { banklist = new Fl_Choice(5, 8, 220, 20);
  228. banklist->down_box(FL_BORDER_BOX);
  229. banklist->labelfont(1);
  230. banklist->textfont(1);
  231. banklist->textsize(11);
  232. banklist->callback((Fl_Callback*)cb_banklist);
  233. banklist->align(Fl_Align(FL_ALIGN_CENTER));
  234. } // Fl_Choice* banklist
  235. { Fl_Button* o = new Fl_Button(230, 8, 105, 20, "Refresh bank list");
  236. o->tooltip("Refresh the bank list (rescan)");
  237. o->box(FL_THIN_UP_BOX);
  238. o->color(FL_LIGHT1);
  239. o->labelsize(11);
  240. o->callback((Fl_Callback*)cb_Refresh);
  241. } // Fl_Button* o
  242. { Fl_Check_Button* o = new Fl_Check_Button(435, 530, 150, 15, "Show PADsynth status");
  243. o->down_box(FL_DOWN_BOX);
  244. o->labelsize(11);
  245. o->callback((Fl_Callback*)cb_Show);
  246. o->value(config.cfg.CheckPADsynth);
  247. } // Fl_Check_Button* o
  248. o->label(bank->bankfiletitle.c_str());
  249. if (bank->bankfiletitle.empty()) o->label ("Choose a bank from the bank list on the left (or go to settings if to configure the bank location) or choose 'New Bank...' to make a new bank.");
  250. bankuiwindow->end();
  251. } // Fl_Double_Window* bankuiwindow
  252. return bankuiwindow;
  253. }
  254. BankUI::BankUI(Master *master_,int *npart_) {
  255. fnc=&BankProcess_::process;
  256. master=master_;
  257. npart=npart_;
  258. bank=&master_->bank;
  259. what=0;
  260. nselected=-1;
  261. make_window();
  262. mode=1;
  263. }
  264. BankUI::~BankUI() {
  265. bankuiwindow->hide();
  266. delete(bankuiwindow);
  267. }
  268. void BankUI::show() {
  269. bankuiwindow->show();
  270. simplesetmode(config.cfg.UserInterfaceMode==2);
  271. }
  272. void BankUI::hide() {
  273. bankuiwindow->hide();
  274. }
  275. void BankUI::init(Fl_Valuator *cbwig_) {
  276. cbwig=cbwig_;
  277. rescan_for_banks();
  278. }
  279. void BankUI::process() {
  280. int slot=this->slot;
  281. if ((what==2)&&(bank->emptyslot(slot)==0)&&(mode!=4)) {//Rename slot
  282. const char *tmp=fl_input("Slot (instrument) name:",bank->getname(slot).c_str());
  283. if (tmp!=NULL) bank->setname(slot,tmp,-1);
  284. bs[slot]->refresh();
  285. };
  286. if ((what==1)&&(mode==1)&&(!bank->emptyslot(slot))){//Reads from slot
  287. pthread_mutex_lock(&master->part[*npart]->load_mutex);
  288. bank->loadfromslot(slot,master->part[*npart]);
  289. pthread_mutex_unlock(&master->part[*npart]->load_mutex);
  290. master->part[*npart]->applyparameters();
  291. snprintf((char *)master->part[*npart]->Pname,PART_MAX_NAME_LEN,"%s",bank->getname(slot).c_str());
  292. cbwig->do_callback();
  293. if (config.cfg.BankUIAutoClose!=0)
  294. bankuiwindow->hide();
  295. };
  296. if ((what==1)&&(mode==2)){//save(write) to slot
  297. if (!bank->emptyslot(slot)){
  298. if (!fl_choice("Overwrite the slot no. %d ?","No","Yes",NULL,slot+1)) goto nooverwriteslot;
  299. };
  300. pthread_mutex_lock(&master->part[*npart]->load_mutex);
  301. bank->savetoslot(slot,master->part[*npart]);
  302. pthread_mutex_unlock(&master->part[*npart]->load_mutex);
  303. bs[slot]->refresh();
  304. mode=1;readbutton->value(1);writebutton->value(0);
  305. nooverwriteslot:;
  306. };
  307. if ((what==1)&&(mode==3)&&(!bank->emptyslot(slot))){//Clears the slot
  308. if (fl_choice("Clear the slot no. %d ?","No","Yes",NULL,slot+1)){
  309. bank->clearslot(slot);
  310. bs[slot]->refresh();
  311. };
  312. };
  313. if (mode==4){//swap
  314. bool done=false;
  315. if ((what==1)&&(nselected>=0)){
  316. bank->swapslot(nselected,slot);
  317. int ns=nselected;
  318. nselected=-1;
  319. bs[slot]->refresh();
  320. bs[ns]->refresh();
  321. done=true;
  322. };
  323. if (((nselected<0)||(what==2))&&(!done)){
  324. int ns=nselected;
  325. nselected=slot;
  326. if (ns>0) bs[ns]->refresh();
  327. bs[slot]->refresh();
  328. };
  329. };
  330. if (mode!=4) refreshmainwindow();
  331. }
  332. void BankUI::refreshmainwindow() {
  333. bankuiwindow->label(bank->bankfiletitle.c_str());
  334. mode=1;readbutton->value(1);writebutton->value(0);clearbutton->value(0);swapbutton->value(0);
  335. nselected=-1;
  336. if (bank->locked()){
  337. writebutton->deactivate();
  338. clearbutton->deactivate();
  339. swapbutton->deactivate();
  340. } else {
  341. writebutton->activate();
  342. clearbutton->activate();
  343. swapbutton->activate();
  344. };
  345. for (int i=0;i<BANK_SIZE;i++)
  346. bs[i]->refresh();
  347. }
  348. void BankUI::removeselection() {
  349. if (nselected>=0) {
  350. int ns=nselected;
  351. nselected=-1;
  352. bs[ns]->refresh();
  353. };
  354. }
  355. void BankUI::rescan_for_banks() {
  356. banklist->clear();
  357. bank->rescanforbanks();
  358. for (unsigned int i=0;i<bank->banks.size();i++) {
  359. banklist->add(bank->banks[i].name.c_str());
  360. }
  361. if (banklist->size() == 0)
  362. banklist->add(" ");
  363. }
  364. void BankUI::simplesetmode(bool beginnerui) {
  365. readbutton->value(1);
  366. mode=1;
  367. removeselection();
  368. if (beginnerui) modeselect->hide();
  369. else modeselect->show();
  370. }