📄 fl_browser_.cxx
字号:
((has_scrollbar_ & ALWAYS_ON) || hposition_ || full_width_>W)) { if (!hscrollbar.visible()) goto J1; } else { if (hscrollbar.visible()) goto J1; } } // update the scrollbars and redraw them: int dy = top_ ? item_quick_height(top_) : 0; if (dy < 10) dy = 10; if (scrollbar.visible()) { scrollbar.damage_resize( scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar_width_ : X+W, Y, scrollbar_width_, H); scrollbar.value(position_, H, 0, full_height_); scrollbar.linesize(dy); if (drawsquare) draw_child(scrollbar); else update_child(scrollbar); } if (hscrollbar.visible()) { hscrollbar.damage_resize( X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollbar_width_ : Y+H, W, scrollbar_width_); hscrollbar.value(hposition_, W, 0, full_width_); hscrollbar.linesize(dy); if (drawsquare) draw_child(hscrollbar); else update_child(hscrollbar); } // draw that little square between the scrollbars: if (drawsquare && scrollbar.visible() && hscrollbar.visible()) { fl_color(parent()->color()); fl_rectf(scrollbar.x(), hscrollbar.y(), scrollbar_width_,scrollbar_width_); } real_hposition_ = hposition_;#ifdef PDA draw_box(FL_BORDER_FRAME, x(), y(), w(), h(), FL_BLACK);#endif}// Quick way to delete and reset everything:void Fl_Browser_::new_list() { top_ = 0; position_ = real_position_ = 0; hposition_ = real_hposition_ = 0; selection_ = 0; offset_ = 0; max_width = 0; max_width_item = 0; redraw_lines();}// Tell it that this item is going away, and that this must remove// all pointers to it:void Fl_Browser_::deleting(void* l) { if (displayed(l)) redraw_lines(); if (l == selection_) selection_ = 0; if (l == top_) { real_position_ -= offset_; offset_ = 0; top_ = item_next(l); if (!top_) top_ = item_prev(l); } if (l == max_width_item) {max_width_item = 0; max_width = 0;}}void Fl_Browser_::replacing(void* a, void* b) { redraw_line(a); if (a == selection_) selection_ = b; if (a == top_) top_ = b; if (a == max_width_item) {max_width_item = 0; max_width = 0;}}void Fl_Browser_::inserting(void* a, void* b) { if (displayed(a)) redraw_lines(); if (a == top_) top_ = b;}void* Fl_Browser_::find_item(int my) { update_top(); int X, Y, W, H; bbox(X, Y, W, H); void* l; int yy = Y-offset_; for (l = top_; l; l = item_next(l)) { int hh = item_height(l); if (hh <= 0) continue; yy += hh; if (my <= yy || yy>=(Y+H)) return l; } return 0;}int Fl_Browser_::select(void* l, int i, int docallbacks) { if (type() == FL_MULTI_BROWSER) { if (selection_ != l) { if (selection_) redraw_line(selection_); selection_ = l; redraw_line(l); } if ((!i)==(!item_selected(l))) return 0; item_select(l, i); redraw_line(l); } else { if (i && selection_ == l) return 0; if (!i && selection_ != l) return 0; if (selection_) { item_select(selection_, 0); redraw_line(selection_); selection_ = 0; } if (i) { item_select(l, 1); selection_ = l; redraw_line(l); display(l); } } Fl::event_clicks(0); if (docallbacks) do_callback(); return 1;}int Fl_Browser_::deselect(int docallbacks) { if (type() == FL_MULTI_BROWSER) { int change = 0; for (void* p = item_first(); p; p = item_next(p)) change |= select(p, 0, docallbacks); return change; } else { if (!selection_) return 0; item_select(selection_, 0); redraw_line(selection_); selection_ = 0; return 1; }}int Fl_Browser_::select_only(void* l, int docallbacks) { if (!l) return deselect(docallbacks); int change = 0; if (type() == FL_MULTI_BROWSER) { for (void* p = item_first(); p; p = item_next(p)) if (p != l) change |= select(p, 0, docallbacks); } change |= select(l, 1, docallbacks); display(l); return change;}int Fl_Browser_::handle(int event) { // must do shortcuts first or the scrollbar will get them... if ((event == FL_SHORTCUT || event == FL_KEYBOARD) && type() >= FL_HOLD_BROWSER) { void* l1 = selection_; void* l = l1; if (!l) l = top_; if (!l) l = item_first(); if (l) { if (type()==FL_HOLD_BROWSER) switch (Fl::event_key()) { case FL_Down: while ((l = item_next(l))) if (item_height(l)>0) {select_only(l, 1); break;} return 1; case FL_Up: while ((l = item_prev(l))) if (item_height(l)>0) { select_only(l, 1); break;} return 1; } else switch (Fl::event_key()) { case FL_Enter: select_only(l, 1); return 1; case ' ': selection_ = l; select(l, !item_selected(l), 1); return 1; case FL_Down: while ((l = item_next(l))) { if (Fl::event_state(FL_SHIFT|FL_CTRL)) select(l, l1 ? item_selected(l1) : 1, 1); if (item_height(l)>0) goto J1; } return 1; case FL_Up: while ((l = item_prev(l))) { if (Fl::event_state(FL_SHIFT|FL_CTRL)) select(l, l1 ? item_selected(l1) : 1, 1); if (item_height(l)>0) goto J1; } return 1; J1: if (selection_) redraw_line(selection_); selection_ = l; redraw_line(l); display(l); return 1; } } } if (Fl_Group::handle(event)) return 1; int X, Y, W, H; bbox(X, Y, W, H); int my; static char change; static char whichway; static int py; switch (event) { case FL_PUSH: redraw(); if (!Fl::event_inside(X, Y, W, H)) return 0; if (type() == FL_SELECT_BROWSER) deselect(); my = py = Fl::event_y(); change = 0; if (type() == FL_NORMAL_BROWSER || !top_) ; else if (type() == FL_MULTI_BROWSER) { void* l = find_item(my); whichway = 1; if (Fl::event_state(FL_SHIFT|FL_CTRL)) { // toggle selection: if (l) { whichway = !item_selected(l); change = select(l, whichway, when() & FL_WHEN_CHANGED); } } else { change = select_only(l, when() & FL_WHEN_CHANGED); } } else { change = select_only(find_item(my), when() & FL_WHEN_CHANGED); } return 1; case FL_DRAG: // do the scrolling first: redraw(); my = Fl::event_y(); if (my < Y && my < py) { int p = real_position_+my-Y; if (p<0) p = 0; position(p); } else if (my > (Y+H) && my > py) { int p = real_position_+my-(Y+H); int h = full_height()-H; if (p > h) p = h; if (p<0) p = 0; position(p); } if (type() == FL_NORMAL_BROWSER || !top_) ; else if (type() == FL_MULTI_BROWSER) { void* l = find_item(my); void* t; void* b; // this will be the range to change if (my > py) { // go down t = selection_ ? item_next(selection_) : 0; b = l ? item_next(l) : 0; } else { // go up t = l; b = selection_; } for (; t && t != b; t = item_next(t)) change |= select(t, whichway, when() & FL_WHEN_CHANGED); if (l) selection_ = l; } else { void* l1 = selection_; void* l = (Fl::event_x()<x() || Fl::event_x()>x()+w()) ? selection_ : find_item(my); select_only(l, when() & FL_WHEN_CHANGED); change = (l != l1); } py = my; return 1; case FL_RELEASE: if (type() == FL_SELECT_BROWSER) { void* t = selection_; deselect(); selection_ = t; } if (change) { if (when() & FL_WHEN_RELEASE) do_callback(); else if (!(when()&FL_WHEN_CHANGED)) set_changed(); } else { if (when() & FL_WHEN_NOT_CHANGED) do_callback(); } return 1; } return 0;}Fl_Browser_::Fl_Browser_(int x, int y, int w, int h, const char* l) : Fl_Group(x, y, w, h, l), scrollbar(0, 0, 0, 0, 0), // they will be resized by draw() hscrollbar(0, 0, 0, 0, 0){ box(FL_NO_BOX); align(FL_ALIGN_BOTTOM); position_ = real_position_ = 0; hposition_ = real_hposition_ = 0; offset_ = 0; top_ = 0; when(FL_WHEN_RELEASE_ALWAYS); selection_ = 0; color(FL_WHITE); selection_color(FL_SELECTION_COLOR); scrollbar.callback(scrollbar_callback);//scrollbar.align(FL_ALIGN_LEFT|FL_ALIGN_BOTTOM); // back compatability? hscrollbar.callback(hscrollbar_callback); hscrollbar.type(FL_HORIZONTAL); textfont_ = FL_HELVETICA; textsize_ = FL_NORMAL_SIZE; textcolor_ = FL_BLACK; has_scrollbar_ = BOTH; max_width = 0; max_width_item = 0; redraw1 = redraw2 = 0; end();}// Default versions of some of the virtual functions:int Fl_Browser_::item_quick_height(void* l) const { return item_height(l);}int Fl_Browser_::incr_height() const { return item_quick_height(item_first());}int Fl_Browser_::full_height() const { int t = 0; for (void* p = item_first(); p; p = item_next(p)) t += item_quick_height(p); return t;}int Fl_Browser_::full_width() const { return max_width;}void Fl_Browser_::item_select(void*, int) {}int Fl_Browser_::item_selected(void* l) const {return l==selection_;}//// End of "$Id: Fl_Browser_.cxx,v 1.1.1.1 2003/08/07 21:18:39 jasonk Exp $".//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -