📄 htobj.cc
字号:
void ht_scrollbar::init(Bounds *b, palette *p, bool isv){ ht_view::init(b, VO_RESIZE, 0); VIEW_DEBUG_NAME("ht_scrollbar"); pstart = 0; psize = 0; gpal = p; isvertical = isv; if (isvertical) { growmode = MK_GM(GMH_RIGHT, GMV_FIT); } else { growmode = MK_GM(GMH_FIT, GMV_BOTTOM); } enable(); // enabled by default}void ht_scrollbar::done(){ ht_view::done();}void ht_scrollbar::enable(){ enable_buffering(); ht_view::enable(); dirtyview();}void ht_scrollbar::disable(){ disable_buffering(); ht_view::disable(); dirtyview();}void ht_scrollbar::draw(){ if (enabled) { vcp color = getcolorv(gpal, palidx_generic_scrollbar);// vcp color2 = VCP(VCP_BACKGROUND(color), VCP_FOREGROUND(color)); if (isvertical) { fill(0, 1, size.w, size.h-2, color, ' '); int e, s; e=((size.h-2)*psize)/100; if (pstart+psize>=100) { s=size.h-2-e; } else { s=((size.h-2)*pstart)/100; } if (!e) { if (s==size.h-2) s--; e=1; } fill(0, s+1, 1, e, color, GC_MEDIUM, CP_GRAPHICAL); buf->printChar(0, 0, color, GC_ARROW_UP, CP_GRAPHICAL); buf->printChar(0, size.h-1, color, GC_ARROW_DOWN, CP_GRAPHICAL); } else { } }}void ht_scrollbar::getminbounds(int *width, int *height){ *width = 1; *height = 1;}ObjectID ht_scrollbar::getObjectID() const{ return ATOM_HT_SCROLLBAR;}void ht_scrollbar::setpos(int ps, int pz){ pstart = ps; psize = pz; dirtyview();}/* * CLASS ht_frame */void ht_frame::init(Bounds *b, const char *desc, uint s, uint n){ ht_view::init(b, VO_RESIZE, desc); VIEW_DEBUG_NAME("ht_frame"); number = n; style = s; framestate = FST_UNFOCUSED; growmode = MK_GM(GMH_FIT, GMV_FIT);}void ht_frame::done(){ ht_view::done();}void ht_frame::draw(){ int cornerul, cornerur, cornerll, cornerlr; int lineh, linev; ht_window *w = (ht_window*)group; if (framestate != FST_MOVE && framestate != FST_RESIZE) { setframestate(w->focused ? FST_FOCUSED : FST_UNFOCUSED); } if (style & FS_THICK) { cornerul = GC_2CORNER3; cornerur = GC_2CORNER0; cornerll = GC_2CORNER2; cornerlr = GC_2CORNER1; lineh = GC_2HLINE; linev = GC_2VLINE; } else { cornerul = GC_1CORNER3; cornerur = GC_1CORNER0; cornerll = GC_1CORNER2; cornerlr = GC_1CORNER1; lineh = GC_1HLINE; linev = GC_1VLINE; } vcp c = getcurcol_normal(); /* "/...\" */ buf->printChar(0, 0, c, cornerul, CP_GRAPHICAL); for (int i=1; i < size.w-1; i++) buf->printChar(i, 0, c, lineh, CP_GRAPHICAL); buf->printChar(0+size.w-1, 0, c, cornerur, CP_GRAPHICAL); /* "\.../" */ buf->printChar(0, size.h-1, c, cornerll, CP_GRAPHICAL); for (int i=1; i < size.w-1; i++) buf->printChar(i, size.h-1, c, lineh, CP_GRAPHICAL);/* if (style & FS_RESIZE) { buf->printChar(size.w-1, size.h-1, getcurcol_killer(), GC_1CORNER1, CP_GRAPHICAL); } else {*/ buf->printChar(size.w-1, size.h-1, c, cornerlr, CP_GRAPHICAL);// } /* "|", "|" */ for (int i=1; i < size.h-1; i++) { buf->printChar(0, i, c, linev, CP_GRAPHICAL); buf->printChar(size.w-1, i, c, linev, CP_GRAPHICAL); } /* "[x]" */ if (style & FS_KILLER) { buf->print(2, 0, c, "[ ]"); buf->printChar(3, 0, getcurcol_killer(), GC_FILLED_QUAD, CP_GRAPHICAL); } /* e.g. "1" */ int ns=0; if (style & FS_NUMBER) { int l = number; do { l = l/10; ns++; } while (l); buf->printf(size.w-4-ns, 0, c, CP_DEVICE, "%d", number); ns += 4; } /* <title> */ const char *d; switch (framestate) { case FST_MOVE: d = (style & FS_RESIZE) ? "(moving) - hit space to resize" : "(moving)"; break; case FST_RESIZE: d = (style & FS_MOVE) ? "(resizing) - hit space to move" : "(resizing)"; break; default: d = desc; } int ks = (style & FS_KILLER) ? 4 : 0; ns++; if (d && (style & FS_TITLE)) { int l = strlen(d), k = 0; if (l > size.w-(5+ks+ns)) { k = l-(size.w-(6+ks+ns+2)); if (size.w > 6+ks+ns+2) { d += k; } else { d = ""; } buf->printf(2+ks, 0, c, CP_DEVICE, " ...%s ", d); } else { buf->printf((size.w-l-2)/2, 0, c, CP_DEVICE, " %s ", d); } }}vcp ht_frame::getcurcol_normal(){ switch (framestate) { case FST_FOCUSED: return getcolor(palidx_generic_frame_focused); case FST_UNFOCUSED: return getcolor(palidx_generic_frame_unfocused); case FST_MOVE: case FST_RESIZE: return getcolor(palidx_generic_frame_move_resize); } return 0;}vcp ht_frame::getcurcol_killer(){ return getcolor(palidx_generic_frame_killer);}uint ht_frame::getnumber(){ return number;}uint ht_frame::getstyle(){ return style;}ObjectID ht_frame::getObjectID() const{ return ATOM_HT_FRAME;}void ht_frame::setframestate(uint _framestate){ framestate=_framestate; dirtyview();}void ht_frame::setnumber(uint _number){ number=_number; dirtyview();}void ht_frame::setstyle(uint s){ style=s;}void ht_frame::settext(const char *text){ free(desc); desc = ht_strdup(text); dirtyview();}/* * CLASS ht_window */void ht_window::init(Bounds *b, const char *desc, uint framestyle, uint num){ ht_group::init(b, VO_SELECTABLE | VO_SELBOUND | VO_BROWSABLE, desc); VIEW_DEBUG_NAME("ht_window"); number=num; hscrollbar=NULL; vscrollbar=NULL; pindicator=NULL; Bounds c=*b; c.x=0; c.y=0; frame=0; action_state=WAC_NORMAL; ht_frame *f=new ht_frame(); f->init(&c, desc, framestyle, number); setframe(f);}void ht_window::done(){ pindicator=NULL; hscrollbar=NULL; vscrollbar=NULL; ht_group::done();}void ht_window::draw(){ vcp c=getcolor(palidx_generic_body); clear(c);}void ht_window::getclientarea(Bounds *b){ getbounds(b); if (frame) { b->x++; b->y++; b->w-=2; b->h-=2; }}uint ht_window::getnumber(){ return number;}ht_frame *ht_window::getframe(){ return frame;}void ht_window::handlemsg(htmsg *msg){ switch (msg->msg) { case msg_keypressed: if (action_state==WAC_MOVE) { if (options & VO_MOVE) { switch (msg->data1.integer) { case K_Up: if (size.y>group->size.y) move(0, -1); break; case K_Down: if (size.y<group->size.y+group->size.h-1) move(0, 1); break; case K_Left: if (size.x+size.w>group->size.x+1) move(-1, 0); break; case K_Right: if (size.x<group->size.x+group->size.w-1) move(1, 0); break; case K_Control_Up: if (size.y>group->size.y+5-1) move(0, -5); else move(0, group->size.y-size.y); break; case K_Control_Down: if (size.y<group->size.y+group->size.h-5) move(0, 5); else move(0, group->size.y+group->size.h-size.y-1); break; case K_Control_Left: if (size.x+size.w>group->size.x+5) move(-5, 0); else move(-(size.x+size.w)+group->size.x+1, 0); break; case K_Control_Right: if (size.x<group->size.x+group->size.w-5) move(5, 0); else move(group->size.x+group->size.w-size.x-1, 0); break; } } } else if (action_state == WAC_RESIZE) { if (options & VO_RESIZE) { int min_width, min_height; getminbounds(&min_width, &min_height); switch (msg->data1.integer) { case K_Up: if (size.h > min_height) resize(0, -1); break; case K_Down: if (size.h < group->size.h) resize(0, 1); break; case K_Left: if (size.x+size.w > 1 && size.w > min_width) resize(-1, 0); break; case K_Right: if (size.w < group->size.w) resize(1, 0); break; } } } else { if ((msg->data1.integer == K_Control_F5) || (msg->data1.integer == K_Control_R)) { sendmsg(cmd_window_resizemove); } break; } switch (msg->data1.integer) { case K_Escape: case K_Return: sendmsg(cmd_window_resizemove); break; case K_Space: case K_Control_F5: sendmsg(cmd_window_switch_resizemove); break; } app->sendmsg(msg_dirtyview, 0); clearmsg(msg); return; case cmd_window_resizemove: { bool b = (action_state == WAC_NORMAL); do { if (!next_action_state()) break; } while (b == (action_state == WAC_NORMAL)); dirtyview(); clearmsg(msg); return; } case cmd_window_switch_resizemove: do { if (!next_action_state()) break; } while (action_state == WAC_NORMAL); dirtyview(); clearmsg(msg); return; } ht_group::handlemsg(msg);}void ht_window::insert(ht_view *view){ if (frame) view->move(1, 1); ht_group::insert(view);}void ht_window::load(ObjectStream &s){ ht_group::load(s);}bool ht_window::next_action_state(){#define wstate_count 3 int ass[wstate_count] = { WAC_NORMAL, WAC_MOVE, WAC_RESIZE }; int fss[wstate_count] = { FST_FOCUSED, FST_MOVE, FST_RESIZE }; for (int i=0; i < wstate_count; i++) { if (action_state == ass[i]) { int p = i; while (++p != i) { if (p > wstate_count-1) p = 0; bool allowed = true; switch (ass[p]) { case WAC_MOVE: allowed = ((options & VO_MOVE) != 0); break; case WAC_RESIZE: allowed = ((options & VO_RESIZE) != 0); break; } if (allowed) { action_state = ass[p]; if (frame) frame->setframestate(fss[p]); return (p != i); } } return false; } } return false;}ObjectID ht_window::getObjectID() const{ return ATOM_HT_WINDOW;}void ht_window::receivefocus(){ htmsg m; m.msg = msg_contextmenuquery; m.type = mt_empty; sendmsg(&m); if (m.msg == msg_retval) { ht_menu *q = (ht_menu*)((ht_app*)app)->menu; ht_context_menu *n = (ht_context_menu*)m.data1.ptr; if (q) { if (!q->set_local_menu(n)) { n->done(); delete n; } q->sendmsg(msg_dirtyview); } else { n->done(); delete n; } } ht_group::receivefocus(); if (frame) frame->setstyle(frame->getstyle() | FS_THICK);}void ht_window::redraw(){ htmsg m; if (pindicator) { char buf[256]; buf[0] = 0; m.msg = msg_get_pindicator; m.type = mt_empty; m.data1.integer = sizeof buf; m.data2.ptr = buf; sendmsg(&m); pindicator->settext(buf); } gsi_scrollbar_t p; if (hscrollbar) { p.pstart = 0; p.psize = 200; m.msg = msg_get_scrollinfo; m.type = mt_empty; m.data1.integer = gsi_hscrollbar; m.data2.ptr = &p; sendmsg(&m); if (p.psize >= 100) { hscrollbar->disable(); } else { hscrollbar->enable(); hscrollbar->setpos(p.pstart, p.psize); } } if (vscrollbar) { p.pstart = 0; p.psize = 200; m.msg = msg_get_scrollinfo; m.type = mt_empty; m.data1.integer = gsi_vscrollbar; m.data2.ptr = &p; sendmsg(&m); if (p.psize >= 100) { vscrollbar->disable(); } else { vscrollbar->enable(); vscrollbar->setpos(p.pstart, p.psize); } } ht_group::redraw();}void ht_window::releasefocus(){ ht_menu *q = (ht_menu*)((ht_app*)app)->menu; if (q) { q->delete_local_menu(); q->sendmsg(msg_dirtyview); } if (frame) frame->setstyle(frame->getstyle() & (~FS_THICK)); ht_group::releasefocus();}void ht_window::setframe(ht_frame *newframe){ if (frame) { ht_group::remove(frame); frame->done(); delete frame; frame = NULL; } if (newframe) { uint style=newframe->getstyle(); if (style & FS_MOVE) options |= VO_MOVE; else options &= ~VO_MOVE; if (style & FS_RESIZE) options |= VO_RESIZE; else options &= ~VO_RESIZE; insert(newframe); } else { options &= ~VO_MOVE; options &= ~VO_RESIZE; } frame = newframe;}void ht_window::setnumber(uint aNumber){ if (frame) frame->setnumber(aNumber); number = aNumber; dirtyview();}void ht_window::sethscrollbar(ht_scrollbar *s){ if (hscrollbar) remove(hscrollbar); hscrollbar = s; insert(hscrollbar); putontop(hscrollbar);}void ht_window::setpindicator(ht_text *p){ if (pindicator) remove(pindicator); pindicator = p; insert(pindicator); putontop(pindicator);}void ht_window::settitle(char *title){ free(desc); desc = ht_strdup(title); if (frame) frame->settext(title);}void ht_window::setvscrollbar(ht_scrollbar *s){ if (vscrollbar) remove(vscrollbar); vscrollbar = s; insert(vscrollbar); putontop(vscrollbar);}void ht_window::store(ObjectStream &s) const{ ht_group::store(s);}/* * CLASS ht_vbar */void ht_vbar::draw(){ fill(0, 0, 1, size.h, getcolor(palidx_generic_body), GC_1VLINE, CP_GRAPHICAL);}/* * CLASS ht_hbar */void ht_hbar::draw(){ fill(0, 0, size.w, 1, getcolor(palidx_generic_body), GC_1HLINE, CP_GRAPHICAL);}/***/BUILDER(ATOM_HT_VIEW, ht_view, Object);BUILDER(ATOM_HT_GROUP, ht_group, ht_view);BUILDER(ATOM_HT_XGROUP, ht_xgroup, ht_group);BUILDER(ATOM_HT_WINDOW, ht_window, ht_group);BUILDER(ATOM_HT_SCROLLBAR, ht_scrollbar, ht_view);/* * INIT */bool init_obj(){ REGISTER(ATOM_HT_VIEW, ht_view); REGISTER(ATOM_HT_GROUP, ht_group); REGISTER(ATOM_HT_XGROUP, ht_xgroup); REGISTER(ATOM_HT_WINDOW, ht_window); REGISTER(ATOM_HT_SCROLLBAR, ht_scrollbar); return true;}/* * DONE */void done_obj(){ UNREGISTER(ATOM_HT_VIEW, ht_view); UNREGISTER(ATOM_HT_GROUP, ht_group); UNREGISTER(ATOM_HT_XGROUP, ht_xgroup); UNREGISTER(ATOM_HT_WINDOW, ht_window); UNREGISTER(ATOM_HT_FRAME, ht_frame); UNREGISTER(ATOM_HT_SCROLLBAR, ht_scrollbar);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -