📄 fl_widget_type.cxx
字号:
} else { n = (Fl_Font)i->value(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; q->textstuff(1,n,s,c); q->o->redraw(); } }}void textsize_cb(Fl_Value_Input* i, void* v) { Fl_Font n; int s; Fl_Color c; if (v == LOAD) { if (!current_widget->textstuff(0,n,s,c)) {i->hide(); return;} i->show(); } else { s = int(i->value()); if (s <= 0) s = FL_NORMAL_SIZE; for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; q->textstuff(2,n,s,c); q->o->redraw(); } } i->value(s);}void textcolor_cb(Fl_Button* i, void* v) { Fl_Font n; int s; Fl_Color c; if (v == LOAD) { if (!current_widget->textstuff(0,n,s,c)) {i->hide(); return;} i->show(); } else { c = i->color(); Fl_Color d = fl_show_colormap(c); if (d == c) return; c = d; for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; q->textstuff(3,n,s,c); q->o->redraw(); } } i->color(c); i->labelcolor(contrast(FL_BLACK,c)); i->redraw();}////////////////////////////////////////////////////////////////// Kludges to the panel for subclasses:void slider_size_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { if (current_widget->is_valuator()!=2) {i->hide(); return;} i->show(); i->value(((Fl_Slider*)(current_widget->o))->slider_size()); } else { double n = i->value(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; if (q->is_valuator()==2) { ((Fl_Slider*)(q->o))->slider_size(n); q->o->redraw(); } } }}void min_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { if (!current_widget->is_valuator()) {i->hide(); return;} i->show(); i->value(((Fl_Valuator*)(current_widget->o))->minimum()); } else { double n = i->value(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; if (q->is_valuator()) { ((Fl_Valuator*)(q->o))->minimum(n); q->o->redraw(); } } }}void max_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { if (!current_widget->is_valuator()) {i->hide(); return;} i->show(); i->value(((Fl_Valuator*)(current_widget->o))->maximum()); } else { double n = i->value(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; if (q->is_valuator()) { ((Fl_Valuator*)(q->o))->maximum(n); q->o->redraw(); } } }}void step_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { if (!current_widget->is_valuator()) {i->hide(); return;} i->show(); i->value(((Fl_Valuator*)(current_widget->o))->step()); } else { double n = i->value(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; if (q->is_valuator()) { ((Fl_Valuator*)(q->o))->step(n); q->o->redraw(); } } }}void value_cb(Fl_Value_Input* i, void* v) { if (v == LOAD) { if (current_widget->is_valuator()) { i->show(); i->value(((Fl_Valuator*)(current_widget->o))->value()); } else if (current_widget->is_button()) { i->show(); i->value(((Fl_Button*)(current_widget->o))->value()); } else i->hide(); } else { double n = i->value(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; if (q->is_valuator()) { ((Fl_Valuator*)(q->o))->value(n); } else if (q->is_button()) { ((Fl_Button*)(q->o))->value(n != 0); if (q->is_menu_item()) q->redraw(); } } }}////////////////////////////////////////////////////////////////// subtypes:Fl_Menu_Item *Fl_Widget_Type::subtypes() {return 0;}void subtype_cb(Fl_Choice* i, void* v) { if (v == LOAD) { Fl_Menu_Item* m = current_widget->subtypes(); if (!m) {i->hide(); return;} i->menu(m); int j; for (j = 0;; j++) { if (!m[j].text) {j = 0; break;} if (m[j].argument() == current_widget->o->type()) break; } i->value(j); i->show(); i->redraw(); } else { int n = int(i->mvalue()->argument()); Fl_Menu_Item* m = current_widget->subtypes(); for (Fl_Type *o = Fl_Type::first; o; o = o->next) if (o->selected && o->is_widget()) { Fl_Widget_Type* q = (Fl_Widget_Type*)o; if (q->subtypes()==m) { q->o->type(n); q->redraw(); } } }}////////////////////////////////////////////////////////////////static Fl_Window *the_panel;void propagate_load(Fl_Group* g, void* v) { if (v == LOAD) { Fl_Widget*const* a = g->array(); for (int i=g->children(); i--;) { Fl_Widget* o = *a++; o->do_callback(o,LOAD); } }}void set_cb(Fl_Button*, void*) { haderror = 0; Fl_Widget*const* a = the_panel->array(); for (int i=the_panel->children(); i--;) { Fl_Widget* o = *a++; if (o->changed()) { o->do_callback(); if (haderror) return; o->clear_changed(); } }}void ok_cb(Fl_Return_Button* o, void* v) { set_cb(o,v); if (!haderror) the_panel->hide();}void revert_cb(Fl_Button*, void*) { // We have to revert all dynamically changing fields: // but for now only the first label works... if (numselected == 1) current_widget->label(oldlabel); propagate_load(the_panel, LOAD);}void cancel_cb(Fl_Button* o, void* v) { revert_cb(o,v); the_panel->hide();}void toggle_overlays(Fl_Widget *,void *); // in Fl_Window_Type.Cvoid overlay_cb(Fl_Button*o,void *v) { toggle_overlays(o,v);}// update the panel according to current widget set:static void load_panel() { if (!the_panel) return; // find all the Fl_Widget subclasses currently selected: numselected = 0; current_widget = 0; if (Fl_Type::current) { if (Fl_Type::current->is_widget()) current_widget=(Fl_Widget_Type*)Fl_Type::current; for (Fl_Type *o = Fl_Type::first; o; o = o->next) { if (o->is_widget() && o->selected) { numselected++; if (!current_widget) current_widget = (Fl_Widget_Type*)o; } } } if (numselected) propagate_load(the_panel, LOAD); else the_panel->hide();}// This is called when user double-clicks an item, open or update the panel:void Fl_Widget_Type::open() { if (!the_panel) the_panel = make_widget_panel(); load_panel(); if (numselected) the_panel->show();}Fl_Type *Fl_Type::current;extern void redraw_overlays();extern void redraw_browser();// Called when ui changes what objects are selected:// p is selected object, null for all deletions (we must throw away// old panel in that case, as the object may no longer exist)void selection_changed(Fl_Type *p) { // store all changes to the current selected objects: if (p && the_panel && the_panel->visible()) { set_cb(0,0); // if there was an error, we try to leave the selected set unchanged: if (haderror) { Fl_Type *q = 0; for (Fl_Type *o = Fl_Type::first; o; o = o->next) { o->new_selected = o->selected; if (!q && o->selected) q = o; } if (!p || !p->selected) p = q; Fl_Type::current = p; redraw_browser(); return; } } // update the selected flags to new set: Fl_Type *q = 0; for (Fl_Type *o = Fl_Type::first; o; o = o->next) { o->selected = o->new_selected; if (!q && o->selected) q = o; } if (!p || !p->selected) p = q; Fl_Type::current = p; redraw_overlays(); // load the panel with the new settings: load_panel();}////////////////////////////////////////////////////////////////// Writing the C code:#include <ctype.h>// test to see if user named a function, or typed in code:int is_name(const char *c) { for (; *c; c++) if (ispunct(*c) && *c!='_' && *c!=':') return 0; return 1;}// Test to see if name() is an array entry. If so, and this is the// highest number, return name[num+1]. Return null if not the highest// number or a field or function. Return name() if not an array entry.const char *array_name(Fl_Widget_Type *o) { const char *c = o->name(); if (!c) return 0; const char *d; for (d = c; *d != '['; d++) { if (!*d) return c; if (ispunct(*d) && *d!='_') return 0; } int num = atoi(d+1); int sawthis = 0; Fl_Type *t = o->prev; Fl_Type *tp = o; const char *cn = o->class_name(); for (; t && t->class_name() == cn; tp = t, t = t->prev); for (t = tp; t && t->class_name() == cn; t = t->next) { if (t == o) {sawthis=1; continue;} const char *e = t->name(); if (!e) continue; if (strncmp(c,e,d-c)) continue; int n1 = atoi(e+(d-c)+1); if (n1 > num || n1==num && sawthis) return 0; } static char buffer[128]; strncpy(buffer,c,d-c+1); sprintf(buffer+(d-c+1),"%d]",num+1); return buffer;}// Test to see if extra code is a declaration:int isdeclare(const char *c) { while (isspace(*c)) c++; if (*c == '#') return 1; if (!strncmp(c,"extern",6)) return 1; if (!strncmp(c,"typedef",7)) return 1; return 0;}void Fl_Widget_Type::write_static() { const char* t = subclassname(this); if (!subclass()) write_declare("#include <FL/%s.H>", t); for (int n=0; n < NUM_EXTRA_CODE; n++) { if (extra_code(n) && isdeclare(extra_code(n))) write_declare("%s", extra_code(n)); } if (callback() && is_name(callback())) write_declare("extern void %s(%s*, %s);", callback(), t, user_data_type() ? user_data_type() : "void*"); const char* c = array_name(this); const char* k = class_name(); if (c && !k) { write_c("\n"); if (!public_) write_c("static "); else write_h("extern %s *%s;\n", t, c); if (strchr(c, '[') == NULL) write_c("%s *%s=(%s *)0;\n", t, c, t); else write_c("%s *%s={(%s *)0};\n", t, c, t); } if (callback() && !is_name(callback())) { // see if 'o' or 'v' used, to prevent unused argument warnings: int use_o = 0; int use_v = 0; const char *d; for (d = callback(); *d;) { if (*d == 'o' && !is_id(d[1])) use_o = 1; if (*d == 'v' && !is_id(d[1])) use_v = 1; do d++; while (is_id(*d)); while (*d && !is_id(*d)) d++; } const char* cn = callback_name(); if (k) { write_c("\ninline void %s::%s_i(%s*", k, cn, t); } else { write_c("\nstatic void %s(%s*", cn, t); } if (use_o) write_c(" o"); const char* ut = user_data_type() ? user_data_type() : "void*"; write_c(", %s", ut); if (use_v) write_c(" v"); write_c(") {\n %s", callback()); if (*(d-1) != ';') write_c(";"); write_c("\n}\n"); if (k) { write_c("void %s::%s(%s* o, %s v) {\n", k, cn, t, ut); write_c(" ((%s*)(o->", k); for (Fl_Type* p = parent; p->is_widget(); p = p->parent) write_c("parent()->"); write_c("user_data()))->%s_i(o,v);\n}\n", cn); } } if (image) { if (image->written != write_number) { image->write_static(); image->written = write_number; } }}const char *Fl_Type::callback_name() { if (is_name(callback())) return callback(); return unique_id(this, "cb", name(), label());}extern int varused_test, varused; void Fl_Widget_Type::write_code1() { const char* t = subclassname(this); const char *c = array_name(this); if (c) { if (class_name()) { write_public(public_); write_h(" %s *%s;\n", t, c); } } if (class_name() && callback() && !is_name(callback())) { const char* cn = callback_name(); const char* ut = user_data_type() ? user_data_type() : "void*"; write_public(0); write_h(" inline void %s_i(%s*, %s);\n", cn, t, ut); write_h(" static void %s(%s*, %s);\n", cn, t, ut); } // figure out if local varaible will be used (prevent compiler warnings): if (is_parent()) varused = 1; else { varused_test = 1; varused = 0; write_widget_code(); varused_test = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -