📄 htdialog.cc
字号:
*selstart = *text; *selend = *text+*textlen; } else { *selstart = 0; *selend = 0; } ofs = 0; } // s->recordEnd(h); dirtyview();}/* * CLASS ht_strinputfield */void ht_strinputfield::init(Bounds *b, int maxstrlen, List *history){ ht_inputfield::init(b, maxstrlen, history); VIEW_DEBUG_NAME("ht_strinputfield"); is_virgin = true; selectmode = false;}void ht_strinputfield::done(){ ht_inputfield::done();}void ht_strinputfield::correct_viewpoint(){ if (*curchar - *text < ofs) { ofs = *curchar-*text; } else { if (*curchar - *text - (size.w-2)*size.h+1 > ofs) { ofs = *curchar-*text-(size.w-2)*size.h+1; } }}void ht_strinputfield::draw(){ int c=focused ? getcolor(palidx_generic_input_focused) : getcolor(palidx_generic_input_unfocused); byte *t = *text + ofs; int l = *textlen - ofs; if (l > size.w) l = size.w; int y = 0; fill(0, 0, size.w, size.h, c, ' '); if (ofs) buf->printChar(0, y, getcolor(palidx_generic_input_clip), '<'); for (int k=0; k < *textlen-ofs; k++) { if (1+k-y*(size.w-2) > size.w-2) { if (y+1 < size.h) y++; else break; } if (t < *selstart || t >= *selend) { buf->printChar(1+k-y*(size.w-2), y, c, *(t++)); } else { buf->printChar(1+k-y*(size.w-2), y, getcolor(palidx_generic_input_selected), *(t++)); } } if (*textlen-ofs > (size.w-2)*size.h) { buf->printChar(size.w-1, y, getcolor(palidx_generic_input_clip), '>'); } if (history && history->count()) { buf->printChar(size.w-1, y+size.h-1, getcolor(palidx_generic_input_clip), GC_SMALL_ARROW_DOWN, CP_GRAPHICAL); } if (focused) { int cx, cy; if (*curchar-*text-ofs >= (size.w-2)*size.h) { cx = size.w-1; cy = size.h-1; } else { cx = (*curchar - *text - ofs) % (size.w-2)+1; cy = (*curchar - *text - ofs) / (size.w-2); } setcursor(cx, cy, insert ? CURSOR_NORMAL : CURSOR_BOLD); }}void ht_strinputfield::handlemsg(htmsg *msg){ if (msg->type == mt_empty && msg->msg == msg_keypressed) { int k = msg->data1.integer; switch (k) { case K_Meta_S: selectmode = !selectmode; clearmsg(msg); break; case K_Up: is_virgin = false; if (*curchar - *text - ofs < size.w - 2) { ofs -= size.w-2; if (ofs < 0) ofs=0; } *curchar -= size.w-2; if (*curchar < *text) *curchar = *text; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Down: is_virgin = false; if (*curchar + size.w - 2 - *text > *textlen) { history_dialog(); clearmsg(msg); return; } else { *curchar += size.w-2; if (*curchar - *text > *textlen) { *curchar = *text + *textlen; } correct_viewpoint(); dirtyview(); } clearmsg(msg); return; case K_Shift_Left: case K_Left: is_virgin = false; if (*curchar>*text) { (*curchar)--; if ((k==K_Shift_Left) != selectmode) { select_add(*curchar, *curchar+1); } } correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Shift_Right: case K_Right: is_virgin = false; if (*curchar-*text<*textlen) { (*curchar)++; if ((k==K_Shift_Right) != selectmode) { select_add(*curchar-1, *curchar); } } correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Backspace: if (is_virgin) { is_virgin = false; *selstart = 0; *selend = 0; *textlen = 0; *curchar = *text; dirtyview(); clearmsg(msg); } else if (*curchar > *text) { *selstart = 0; *selend = 0; memmove(*curchar-1, *curchar, *textlen-(*curchar-*text)); (*textlen)--; (*curchar)--; is_virgin=0; correct_viewpoint(); dirtyview(); clearmsg(msg); return; } break; case K_Delete: if (is_virgin) { is_virgin = false; *selstart = 0; *selend = 0; *textlen = 0; *curchar = *text; dirtyview(); clearmsg(msg); } else if (*curchar-*text < *textlen && *textlen) { if (*selstart) { if (*curchar >= *selstart) { if (*curchar < *selend) (*selend)--; if (*selstart == *selend) { *selstart=0; *selend=0; } } else { (*selstart)--; (*selend)--; } } memmove(*curchar, *curchar+1, *textlen-(*curchar-*text)-1); (*textlen)--; dirtyview(); clearmsg(msg); return; } break; case K_Shift_Home: case K_Home: is_virgin = false; if ((k == K_Shift_Home) != selectmode) { select_add(*curchar, *text); } *curchar = *text; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Shift_End: case K_End: is_virgin = false; if ((k == K_Shift_End) != selectmode) { select_add(*curchar, *text+*textlen); } *curchar = *text + *textlen; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Insert: insert=!insert; dirtyview(); clearmsg(msg); return; case K_Meta_X: case K_Shift_Delete: if (*selend > *selstart) clipboard_copy("inputfield", *selstart, *selend-*selstart); case K_Meta_D: case K_Control_Delete: if (*selend > *selstart) { memmove(*selstart, *selend, *textlen-(*selend-*text)); *textlen -= *selend - *selstart; *curchar = *selstart; *selstart = 0; *selend = 0; is_virgin = false; correct_viewpoint(); } dirtyview(); clearmsg(msg); return; case K_Meta_C: case K_Control_Insert: if (*selend > *selstart) clipboard_copy("inputfield", *selstart, *selend-*selstart); is_virgin = false; dirtyview(); clearmsg(msg); return; case K_Meta_V: case K_Shift_Insert: { int maxsize = MIN(*maxtextlen-*textlen, (int)clipboard_getsize()); byte *buf = ht_malloc(maxsize); int r = clipboard_paste(buf, maxsize); if (r) { for (int i=0; i < r; i++) { setbyte(buf[r-i-1]); } *selstart=*curchar; *selend=*curchar+r; } delete buf; is_virgin = false; dirtyview(); clearmsg(msg); return; } default: if (msg->data1.integer >= ' ' && msg->data1.integer < 256) { if (is_virgin) { is_virgin = false; *selstart = 0; *selend = 0; *textlen = 0; *curchar = *text; ofs = 0; } inputbyte(msg->data1.integer); dirtyview(); clearmsg(msg); return; } } } ht_inputfield::handlemsg(msg);}void ht_strinputfield::history_dialog(){ if (history && history->count()) { Bounds b; getbounds(&b); b.y--; b.h=8; ht_history_popup_dialog *l=new ht_history_popup_dialog(); l->init(&b, history); if (l->run(false)) { ht_listpopup_dialog_data d; ViewDataBuf vdb(l, &d, sizeof d); if (d.cursor_string) { ht_history_entry *v=(ht_history_entry*)(*history)[d.cursor_pos]; if (v->data && group) { v->datafile->seek(0); group->setdata(*v->data); } else { ht_inputfield_data e; e.textlen = strlen(d.cursor_string); e.text = (byte*)d.cursor_string; databuf_set(&e, sizeof e); } } is_virgin = false; } l->done(); delete l; }}void ht_strinputfield::receivefocus(){ correct_viewpoint(); ht_inputfield::receivefocus();}bool ht_strinputfield::inputbyte(byte a){ if (setbyte(a)) { (*curchar)++; correct_viewpoint(); is_virgin = false; return true; } return false;}bool ht_strinputfield::setbyte(byte a){ if (insert || *curchar-*text >= *textlen) { if (insertbyte(*curchar, a) && *curchar-*text<*textlen) return true; } else { **curchar=a; return true; } return false;}/* * CLASS ht_hexinputfield */void ht_hexinputfield::init(Bounds *b, int maxstrlen){ ht_inputfield::init(b, maxstrlen); VIEW_DEBUG_NAME("ht_strinputfield"); nib=0; insert=1;}void ht_hexinputfield::done(){ ht_inputfield::done();}void ht_hexinputfield::correct_viewpoint(){ if (*curchar-*text<ofs) { ofs = *curchar-*text; } else if ((*curchar-*text)*3-(size.w-2)*size.h+5>ofs*3) { ofs = ((*curchar-*text)*3-(size.w-2)*size.h+5) / 3; }}void ht_hexinputfield::draw(){ int c=focused ? getcolor(palidx_generic_input_focused) : getcolor(palidx_generic_input_unfocused); char hbuf[256], *h=hbuf; int y=0; fill(0, 0, size.w, size.h, c, ' '); if (ofs) buf->print(0, y, getcolor(palidx_generic_input_clip), "<"); int vv=*textlen-ofs; if (vv<0) vv=0; else if (vv>(size.w-2)*size.h/3) vv=(size.w-2)*size.h/3+1; for (int k=0; k<vv; k++) { h += sprintf(h, "%02x ", *(*text+k+ofs)); } if (vv) { h = hbuf; while (*h && y < size.h) { h += buf->nprint(1, y, c, h, size.w-2); y++; } y--; } if ((*textlen-ofs)*3 > (size.w-2)*size.h) { buf->print(size.w-1, y, getcolor(palidx_generic_input_clip), ">"); } if (focused) { int cx, cy; if ((*curchar-*text-ofs)*3+nib+1 >= (size.w-2)*size.h) { cx = size.w-1; cy = size.h-1; } else { cx = ((*curchar-*text-ofs)*3+nib+1) % (size.w-2); cy = ((*curchar-*text-ofs)*3+nib+1) / (size.w-2); } setcursor(cx, cy, insert ? CURSOR_NORMAL : CURSOR_BOLD); }}void ht_hexinputfield::handlemsg(htmsg *msg){ if (msg->msg==msg_keypressed) { switch (msg->data1.integer) { case K_Up: if (*curchar-*text-ofs<(size.w-2)/3) { ofs-=(size.w-2)/3; if (ofs<0) ofs=0; } *curchar-=(size.w-2)/3; if (*curchar<*text) *curchar=*text; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Down:/* if (*curchar-*text-ofs>=(size.w-2)*(size.h-1)/3) { ofs+=(size.w-2)/3; }*/ *curchar+=(size.w-2)/3; if (*curchar-*text>*textlen) *curchar=*text+*textlen; if (*curchar-*text>=*textlen) nib=0; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Left: if (nib) { nib=0; } else if (*curchar>*text) { (*curchar)--; nib=1; } correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Right: if (!nib) { if (*curchar-*text<*textlen) nib=1; } else if (*curchar-*text<*textlen) { (*curchar)++; nib=0; } correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Backspace: if (*textlen) { if (*curchar+nib>*text) {/* if (*curchar-*text<*textlen) { memmove(*curchar, *curchar+1, *textlen-(*curchar-*text)-1); } } else {*/ memmove(*curchar-1+nib, *curchar+nib, *textlen-(*curchar-*text)); (*textlen)--; if (*curchar-*text && !nib) (*curchar)--; nib=0; correct_viewpoint(); dirtyview(); } clearmsg(msg); return; } break; case K_Delete: if ((*curchar-*text<*textlen) && (*textlen)) { memmove(*curchar, *curchar+1, *textlen-(*curchar-*text)-1); (*textlen)--; nib=0; dirtyview(); clearmsg(msg); return; } break; case K_Home: *curchar=*text; nib=0; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_End: *curchar=*text+*textlen; nib=0; correct_viewpoint(); dirtyview(); clearmsg(msg); return; case K_Insert: insert=!insert; dirtyview(); clearmsg(msg); return; default: if ((msg->data1.integer>='0') && (msg->data1.integer<='9')) { setnibble(msg->data1.integer-'0'); dirtyview(); clearmsg(msg); } else if ((msg->data1.integer>='a') && (msg->data1.integer<='f')) { setnibble(msg->data1.integer-'a'+10); dirtyview(); clearmsg(msg); } return; } } ht_inputfield::handlemsg(msg);}void ht_hexinputfield::receivefocus(){ correct_viewpoint(); if (nib && *curchar-*text == *textlen) { nib=0; } ht_inputfield::receivefocus();}void ht_hexinputfield::setnibble(byte a){ if ((insert || *curchar-*text >= *textlen) && nib == 0) { if ((insertbyte(*curchar, a<<4)) && (*curchar-*text<*textlen)) nib=1; } else { if (nib) { **curchar=(**curchar & 0xf0) | a; (*curchar)++; nib=0; } else { **curchar=(**curchar & 0xf) | (a<<4); nib=1; } } correct_viewpoint();}/* * CLASS ht_button */void ht_button::init(Bounds *b, const char *Text, int Value){ ht_view::init(b, VO_SELECTABLE | VO_OWNBUFFER | VO_POSTPROCESS, "some button"); VIEW_DEBUG_NAME("ht_button"); value = Value; text = ht_strdup(Text); pressed = 0; magicchar = strchr(text, '~'); if (magicchar) { int l = strlen(text); memmove(magicchar, magicchar+1, l-(magicchar-text)); shortcut1 = keyb_metakey((ht_key)tolower(*magicchar)); shortcut2 = (ht_key)tolower(*magicchar); } else { shortcut1 = K_INVALID; shortcut2 = K_INVALID; }}void ht_button::done(){ free(text); ht_view::done();}void ht_button::getminbounds(int *width, int *height){ *width = 6; *height = 2;}const char *ht_button::defaultpalette(){ return palkey_generic_dialog_default;}void ht_button::draw(){ int c=focused ? getcolor(palidx_generic_button_focused) : getcolor(palidx_generic_button_unfocused); fill(0, 0, size.w-1, size.h-1, c, ' '); int xp = (size.w - strlen(text))/2, yp = (size.h-1)/2; buf->print(xp, yp, c, text); if (magicchar) buf->printChar(xp+(magicchar-text), yp, getcolor(palidx_generic_button_shortcut), *magicchar); /* shadow */ buf->printChar(0, 1, getcolor(palidx_generic_button_shadow), ' '); for (int i=1; i<size.w-1; i++) { buf->printChar(i, 1, getcolor(palidx_generic_button_shadow), GC_FILLED_UPPER, CP_GRAPHICAL); } buf->printChar(size.w-1, 0, getcolor(palidx_generic_button_shadow), GC_FILLED_LOWER, CP_GRAPHICAL); buf->printChar(size.w-1, 1, getcolor(palidx_generic_button_shadow), GC_FILLED_UPPER, CP_GRAPHICAL);}void ht_button::handlemsg(htmsg *msg){ if (msg->type == mt_postprocess) { if (msg->msg == msg_keypressed) { if ((shortcut1 != K_INVALID && msg->data1.integer==shortcut1) || (shortcut2 != K_INVALID && msg->data1.integer==shortcut2)) { push(); dirtyview(); clearmsg(msg); return; } } } else if (msg->type == mt_empty) { if (msg->msg == msg_keypressed) { switch (msg->data1.integer) { case K_Return: case K_Space: push(); dirtyview(); clearmsg(msg); return; } } } ht_view::handlemsg(msg);}void ht_button::push(){ /* FIXME: wont work for encapsulated buttons... */ /* FIXME: (thats why I hacked this now...) */ app->sendmsg(msg_button_pressed, value);// baseview->sendmsg(msg_button_pressed, value); // why not like this ? pressed=1;}/* * CLASS ht_listbox_title */void ht_listbox_title::init(Bounds *b){ ht_view::init(b, VO_RESIZE, "ht_listbox_title"); growmode = MK_GM(GMH_FIT, GMV_TOP); texts = NULL; listbox = NULL; cols = 0;}void ht_listbox_title::done(){ if (texts) { for (int i=0; i < cols; i++) { free(texts[i]); } free(texts); } ht_view::done();}const char *ht_listbox_title::defaultpalette(){ return palkey_generic_dialog_default;}void ht_listbox_title::draw(){ vcp color = getTextColor(); clear(color); if (!texts || !listbox) return; int x = 0; for (int i=0; i < cols; i++) { buf->nprint(x, 0, color, texts[i], size.w - x); x += listbox->widths[i]; if (i+1 < cols) { if (x >= size.w) break; buf->printChar(x++, 0, color, ' '); if (x >= size.w) break; buf->printChar(x++, 0, color, GC_1VLINE, CP_GRAPHICAL); if (x >= size.w) break; buf->printChar(x++, 0, color, ' '); } }}vcp ht_listbox_title::getTextColor(){ return getcolor(palidx_generic_body);}void ht_listbox_title::setText(int cols, ...){ va_list vargs; va_start(vargs, cols); setTextv(cols, vargs); va_end(vargs);}void ht_listbox_title::setTextv(int c, va_list vargs){ if (texts) { for (int i=0; i<cols; i++) { free(texts[i]); } free(texts); } texts = NULL; cols = c; if (!c) return; texts = ht_malloc(c * sizeof(char*)); for (int i=0; i<cols; i++) { texts[i] = ht_strdup(va_arg(vargs, char*)); } update();}void ht_listbox_title::update(){ if (texts && listbox && listbox->widths) { for (int i=0; i<cols; i++) { int s = strlen(texts[i]); if (s > listbox->widths[i]) listbox->widths[i] = s; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -