#include "Fl_Osc_Pane.H" #include "Fl_Osc_Widget.H" #include #include Fl_Osc_Pane::Fl_Osc_Pane(void) :osc(NULL), base() {} Fl_Osc_Window::Fl_Osc_Window(int w, int h, const char *L) :Fl_Double_Window(w,h,L), title_ext(NULL) {} void Fl_Osc_Window::init(Fl_Osc_Interface *osc_, std::string loc_) { title_ext = new Osc_DataModel(osc_); title_ext->doUpdate("/ui/title"); title_ext->callback = [this](string next) { rewrite_rule = next; //printf("old: %s\n", title_orig.c_str()); const char *orig = title_orig.c_str(); // 12345678901 const char *sub = strstr(orig, "zynaddsubfx"); if(!sub) sub = strstr(orig, "ZynAddSubFX"); title_new = ""; while(*orig) { if(orig == sub) { title_new += next; orig += 11; } else title_new += *orig++; } //title_new = title_orig + next; this->label(title_new.c_str()); }; title_orig = label(); osc = osc_; base = loc_; } Fl_Osc_Window::~Fl_Osc_Window(void) { delete title_ext; } std::string Fl_Osc_Window::loc(void) const { return base; } static void nested_update(Fl_Group *g) { unsigned nchildren = g->children(); for(unsigned i=0; i < nchildren; ++i) { Fl_Widget *widget = g->child(i); if(Fl_Osc_Widget *o = dynamic_cast(widget)) { o->update(); } else if(Fl_Group *o = dynamic_cast(widget)) { nested_update(o); } } } void Fl_Osc_Window::update(void) { unsigned nchildren = this->children(); for(unsigned i=0; i < nchildren; ++i) { Fl_Widget *widget = this->child(i); if(Fl_Osc_Widget *o = dynamic_cast(widget)) { o->update(); } if(dynamic_cast(widget)) nested_update(dynamic_cast(widget)); } } void Fl_Osc_Window::update_title(void) { title_orig = label(); title_ext->callback(rewrite_rule); } static void nested_rebase(Fl_Group *g, std::string new_base) { unsigned nchildren = g->children(); for(unsigned i=0; i < nchildren; ++i) { Fl_Widget *widget = g->child(i); if(Fl_Osc_Widget *o = dynamic_cast(widget)) { o->rebase(new_base); } else if(Fl_Osc_Group *o = dynamic_cast(widget)) { o->rebase(new_base); } else if(Fl_Group *o = dynamic_cast(widget)) { nested_rebase(o, new_base); } } } void Fl_Osc_Window::rebase(std::string new_base) { unsigned nchildren = this->children(); for(unsigned i=0; i < nchildren; ++i) { Fl_Widget *widget = this->child(i); if(Fl_Osc_Widget *o = dynamic_cast(widget)) { o->rebase(new_base); } if(Fl_Osc_Group *o = dynamic_cast(widget)) o->rebase(new_base); else if(dynamic_cast(widget)) nested_rebase(dynamic_cast(widget), new_base); } base = new_base; } static Fl_Osc_Pane *find_osc_pane(Fl_Widget *root) { if(!root) return NULL; Fl_Group *next = root->parent(); if(auto *p = dynamic_cast(next)) return p; else return find_osc_pane(next); } Fl_Osc_Group::Fl_Osc_Group(int x, int y, int w, int h, const char *L) :Fl_Group(x,y,w,h,L) { if(auto *p = find_osc_pane(this)) { osc = p->osc; base = p->loc(); assert(osc); } }; std::string Fl_Osc_Group::loc(void) const { return base + ext; } void Fl_Osc_Group::rebase(std::string new_base) { nested_rebase(this, new_base+ext); base = new_base; } void Fl_Osc_Group::reext(std::string new_ext) { nested_rebase(this, base+new_ext); ext = new_ext; }