📄 ui_shared.c
字号:
return multiPtr->cvarList[i];
}
}
}
}
return "";
}
qboolean Item_Multi_HandleKey(itemDef_t *item, int key) {
multiDef_t *multiPtr = (multiDef_t*)item->typeData;
if (multiPtr) {
if (Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory) && item->window.flags & WINDOW_HASFOCUS && item->cvar) {
if (key == K_MOUSE1 || key == K_ENTER || key == K_MOUSE2 || key == K_MOUSE3) {
int current = Item_Multi_FindCvarByValue(item) + 1;
int max = Item_Multi_CountSettings(item);
if ( current < 0 || current >= max ) {
current = 0;
}
if (multiPtr->strDef) {
DC->setCVar(item->cvar, multiPtr->cvarStr[current]);
} else {
float value = multiPtr->cvarValue[current];
if (((float)((int) value)) == value) {
DC->setCVar(item->cvar, va("%i", (int) value ));
}
else {
DC->setCVar(item->cvar, va("%f", value ));
}
}
return qtrue;
}
}
}
return qfalse;
}
qboolean Item_TextField_HandleKey(itemDef_t *item, int key) {
char buff[1024];
int len;
itemDef_t *newItem = NULL;
editFieldDef_t *editPtr = (editFieldDef_t*)item->typeData;
if (item->cvar) {
memset(buff, 0, sizeof(buff));
DC->getCVarString(item->cvar, buff, sizeof(buff));
len = strlen(buff);
if (editPtr->maxChars && len > editPtr->maxChars) {
len = editPtr->maxChars;
}
if ( key & K_CHAR_FLAG ) {
key &= ~K_CHAR_FLAG;
if (key == 'h' - 'a' + 1 ) { // ctrl-h is backspace
if ( item->cursorPos > 0 ) {
memmove( &buff[item->cursorPos - 1], &buff[item->cursorPos], len + 1 - item->cursorPos);
item->cursorPos--;
if (item->cursorPos < editPtr->paintOffset) {
editPtr->paintOffset--;
}
}
DC->setCVar(item->cvar, buff);
return qtrue;
}
//
// ignore any non printable chars
//
if ( key < 32 || !item->cvar) {
return qtrue;
}
if (item->type == ITEM_TYPE_NUMERICFIELD) {
if (key < '0' || key > '9') {
return qfalse;
}
}
if (!DC->getOverstrikeMode()) {
if (( len == MAX_EDITFIELD - 1 ) || (editPtr->maxChars && len >= editPtr->maxChars)) {
return qtrue;
}
memmove( &buff[item->cursorPos + 1], &buff[item->cursorPos], len + 1 - item->cursorPos );
} else {
if (editPtr->maxChars && item->cursorPos >= editPtr->maxChars) {
return qtrue;
}
}
buff[item->cursorPos] = key;
DC->setCVar(item->cvar, buff);
if (item->cursorPos < len + 1) {
item->cursorPos++;
if (editPtr->maxPaintChars && item->cursorPos > editPtr->maxPaintChars) {
editPtr->paintOffset++;
}
}
} else {
if ( key == K_DEL || key == K_KP_DEL ) {
if ( item->cursorPos < len ) {
memmove( buff + item->cursorPos, buff + item->cursorPos + 1, len - item->cursorPos);
DC->setCVar(item->cvar, buff);
}
return qtrue;
}
if ( key == K_RIGHTARROW || key == K_KP_RIGHTARROW )
{
if (editPtr->maxPaintChars && item->cursorPos >= editPtr->maxPaintChars && item->cursorPos < len) {
item->cursorPos++;
editPtr->paintOffset++;
return qtrue;
}
if (item->cursorPos < len) {
item->cursorPos++;
}
return qtrue;
}
if ( key == K_LEFTARROW || key == K_KP_LEFTARROW )
{
if ( item->cursorPos > 0 ) {
item->cursorPos--;
}
if (item->cursorPos < editPtr->paintOffset) {
editPtr->paintOffset--;
}
return qtrue;
}
if ( key == K_HOME || key == K_KP_HOME) {// || ( tolower(key) == 'a' && trap_Key_IsDown( K_CTRL ) ) ) {
item->cursorPos = 0;
editPtr->paintOffset = 0;
return qtrue;
}
if ( key == K_END || key == K_KP_END) {// ( tolower(key) == 'e' && trap_Key_IsDown( K_CTRL ) ) ) {
item->cursorPos = len;
if(item->cursorPos > editPtr->maxPaintChars) {
editPtr->paintOffset = len - editPtr->maxPaintChars;
}
return qtrue;
}
if ( key == K_INS || key == K_KP_INS ) {
DC->setOverstrikeMode(!DC->getOverstrikeMode());
return qtrue;
}
}
if (key == K_TAB || key == K_DOWNARROW || key == K_KP_DOWNARROW) {
newItem = Menu_SetNextCursorItem(item->parent);
if (newItem && (newItem->type == ITEM_TYPE_EDITFIELD || newItem->type == ITEM_TYPE_NUMERICFIELD)) {
g_editItem = newItem;
}
}
if (key == K_UPARROW || key == K_KP_UPARROW) {
newItem = Menu_SetPrevCursorItem(item->parent);
if (newItem && (newItem->type == ITEM_TYPE_EDITFIELD || newItem->type == ITEM_TYPE_NUMERICFIELD)) {
g_editItem = newItem;
}
}
if ( key == K_ENTER || key == K_KP_ENTER || key == K_ESCAPE) {
return qfalse;
}
return qtrue;
}
return qfalse;
}
static void Scroll_ListBox_AutoFunc(void *p) {
scrollInfo_t *si = (scrollInfo_t*)p;
if (DC->realTime > si->nextScrollTime) {
// need to scroll which is done by simulating a click to the item
// this is done a bit sideways as the autoscroll "knows" that the item is a listbox
// so it calls it directly
Item_ListBox_HandleKey(si->item, si->scrollKey, qtrue, qfalse);
si->nextScrollTime = DC->realTime + si->adjustValue;
}
if (DC->realTime > si->nextAdjustTime) {
si->nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST;
if (si->adjustValue > SCROLL_TIME_FLOOR) {
si->adjustValue -= SCROLL_TIME_ADJUSTOFFSET;
}
}
}
static void Scroll_ListBox_ThumbFunc(void *p) {
scrollInfo_t *si = (scrollInfo_t*)p;
rectDef_t r;
int pos, max;
listBoxDef_t *listPtr = (listBoxDef_t*)si->item->typeData;
if (si->item->window.flags & WINDOW_HORIZONTAL) {
if (DC->cursorx == si->xStart) {
return;
}
r.x = si->item->window.rect.x + SCROLLBAR_SIZE + 1;
r.y = si->item->window.rect.y + si->item->window.rect.h - SCROLLBAR_SIZE - 1;
r.h = SCROLLBAR_SIZE;
r.w = si->item->window.rect.w - (SCROLLBAR_SIZE*2) - 2;
max = Item_ListBox_MaxScroll(si->item);
//
pos = (DC->cursorx - r.x - SCROLLBAR_SIZE/2) * max / (r.w - SCROLLBAR_SIZE);
if (pos < 0) {
pos = 0;
}
else if (pos > max) {
pos = max;
}
listPtr->startPos = pos;
si->xStart = DC->cursorx;
}
else if (DC->cursory != si->yStart) {
r.x = si->item->window.rect.x + si->item->window.rect.w - SCROLLBAR_SIZE - 1;
r.y = si->item->window.rect.y + SCROLLBAR_SIZE + 1;
r.h = si->item->window.rect.h - (SCROLLBAR_SIZE*2) - 2;
r.w = SCROLLBAR_SIZE;
max = Item_ListBox_MaxScroll(si->item);
//
pos = (DC->cursory - r.y - SCROLLBAR_SIZE/2) * max / (r.h - SCROLLBAR_SIZE);
if (pos < 0) {
pos = 0;
}
else if (pos > max) {
pos = max;
}
listPtr->startPos = pos;
si->yStart = DC->cursory;
}
if (DC->realTime > si->nextScrollTime) {
// need to scroll which is done by simulating a click to the item
// this is done a bit sideways as the autoscroll "knows" that the item is a listbox
// so it calls it directly
Item_ListBox_HandleKey(si->item, si->scrollKey, qtrue, qfalse);
si->nextScrollTime = DC->realTime + si->adjustValue;
}
if (DC->realTime > si->nextAdjustTime) {
si->nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST;
if (si->adjustValue > SCROLL_TIME_FLOOR) {
si->adjustValue -= SCROLL_TIME_ADJUSTOFFSET;
}
}
}
static void Scroll_Slider_ThumbFunc(void *p) {
float x, value, cursorx;
scrollInfo_t *si = (scrollInfo_t*)p;
editFieldDef_t *editDef = si->item->typeData;
if (si->item->text) {
x = si->item->textRect.x + si->item->textRect.w + 8;
} else {
x = si->item->window.rect.x;
}
cursorx = DC->cursorx;
if (cursorx < x) {
cursorx = x;
} else if (cursorx > x + SLIDER_WIDTH) {
cursorx = x + SLIDER_WIDTH;
}
value = cursorx - x;
value /= SLIDER_WIDTH;
value *= (editDef->maxVal - editDef->minVal);
value += editDef->minVal;
DC->setCVar(si->item->cvar, va("%f", value));
}
void Item_StartCapture(itemDef_t *item, int key) {
int flags;
switch (item->type) {
case ITEM_TYPE_EDITFIELD:
case ITEM_TYPE_NUMERICFIELD:
case ITEM_TYPE_LISTBOX:
{
flags = Item_ListBox_OverLB(item, DC->cursorx, DC->cursory);
if (flags & (WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW)) {
scrollInfo.nextScrollTime = DC->realTime + SCROLL_TIME_START;
scrollInfo.nextAdjustTime = DC->realTime + SCROLL_TIME_ADJUST;
scrollInfo.adjustValue = SCROLL_TIME_START;
scrollInfo.scrollKey = key;
scrollInfo.scrollDir = (flags & WINDOW_LB_LEFTARROW) ? qtrue : qfalse;
scrollInfo.item = item;
captureData = &scrollInfo;
captureFunc = &Scroll_ListBox_AutoFunc;
itemCapture = item;
} else if (flags & WINDOW_LB_THUMB) {
scrollInfo.scrollKey = key;
scrollInfo.item = item;
scrollInfo.xStart = DC->cursorx;
scrollInfo.yStart = DC->cursory;
captureData = &scrollInfo;
captureFunc = &Scroll_ListBox_ThumbFunc;
itemCapture = item;
}
break;
}
case ITEM_TYPE_SLIDER:
{
flags = Item_Slider_OverSlider(item, DC->cursorx, DC->cursory);
if (flags & WINDOW_LB_THUMB) {
scrollInfo.scrollKey = key;
scrollInfo.item = item;
scrollInfo.xStart = DC->cursorx;
scrollInfo.yStart = DC->cursory;
captureData = &scrollInfo;
captureFunc = &Scroll_Slider_ThumbFunc;
itemCapture = item;
}
break;
}
}
}
void Item_StopCapture(itemDef_t *item) {
}
qboolean Item_Slider_HandleKey(itemDef_t *item, int key, qboolean down) {
float x, value, width, work;
//DC->Print("slider handle key\n");
if (item->window.flags & WINDOW_HASFOCUS && item->cvar && Rect_ContainsPoint(&item->window.rect, DC->cursorx, DC->cursory)) {
if (key == K_MOUSE1 || key == K_ENTER || key == K_MOUSE2 || key == K_MOUSE3) {
editFieldDef_t *editDef = item->typeData;
if (editDef) {
rectDef_t testRect;
width = SLIDER_WIDTH;
if (item->text) {
x = item->textRect.x + item->textRect.w + 8;
} else {
x = item->window.rect.x;
}
testRect = item->window.rect;
testRect.x = x;
value = (float)SLIDER_THUMB_WIDTH / 2;
testRect.x -= value;
//DC->Print("slider x: %f\n", testRect.x);
testRect.w = (SLIDER_WIDTH + (float)SLIDER_THUMB_WIDTH / 2);
//DC->Print("slider w: %f\n", testRect.w);
if (Rect_ContainsPoint(&testRect, DC->cursorx, DC->cursory)) {
work = DC->cursorx - x;
value = work / width;
value *= (editDef->maxVal - editDef->minVal);
// vm fuckage
// value = (((float)(DC->cursorx - x)/ SLIDER_WIDTH) * (editDef->maxVal - editDef->minVal));
value += editDef->minVal;
DC->setCVar(item->cvar, va("%f", value));
return qtrue;
}
}
}
}
DC->Print("slider handle key exit\n");
return qfalse;
}
qboolean Item_HandleKey(itemDef_t *item, int key, qboolean down) {
if (itemCapture) {
Item_StopCapture(itemCapture);
itemCapture = NULL;
captureFunc = NULL;
captureData = NULL;
} else {
// bk001206 - parentheses
if ( down && ( key == K_MOUSE1 || key == K_MOUSE2 || key == K_MOUSE3 ) ) {
Item_StartCapture(item, key);
}
}
if (!down) {
return qfalse;
}
switch (item->type) {
case ITEM_TYPE_BUTTON:
return qfalse;
break;
case ITEM_TYPE_RADIOBUTTON:
return qfalse;
break;
case ITEM_TYPE_CHECKBOX:
return qfalse;
break;
case ITEM_TYPE_EDITFIELD:
case ITEM_TYPE_NUMERICFIELD:
//return Item_TextField_HandleKey(item, key);
return qfalse;
break;
case ITEM_TYPE_COMBO:
return qfalse;
break;
case ITEM_TYPE_LISTBOX:
return Item_ListBox_HandleKey(item, key, down, qfalse);
break;
case ITEM_TYPE_YESNO:
return Item_YesNo_HandleKey(item, key);
break;
case ITEM_TYPE_MULTI:
return Item_Multi_HandleKey(item, key);
break;
case ITEM_TYPE_OWNERDRAW:
return Item_OwnerDraw_HandleKey(item, key);
break;
case ITEM_TYPE_BIND:
return Item_Bind_HandleKey(item, key, down);
break;
case ITEM_TYPE_SLIDER:
return Item_Slider_HandleKey(item, key, down);
break;
//case ITEM_TYPE_IMAGE:
// Item_Image_Paint(item);
// break;
default:
return qfalse;
break;
}
//return qfalse;
}
void Item_Action(itemDef_t *item) {
if (item) {
Item_RunScript(item, item->action);
}
}
itemDef_t *Menu_SetPrevCursorItem(menuDef_t *menu) {
qboolean wrapped = qfalse;
int oldCursor = menu->cursorItem;
if (menu->cursorItem < 0) {
menu->cursorItem = menu->itemCount-1;
wrapped = qtrue;
}
while (menu->cursorItem > -1) {
menu->cursorItem--;
if (menu->cursorItem < 0 && !wrapped) {
wrapped = qtrue;
menu->cursorItem = menu->itemCount -1;
}
if (Item_SetFocus(menu->items[menu->cursorItem], DC->cursorx, DC->cursory)) {
Menu_HandleMouseMove(menu, menu->items[menu->cursorItem]->window.rect.x + 1, menu->items[menu->cursorItem]->window.rect.y + 1);
return menu->items[menu->cursorItem];
}
}
menu->cursorItem = oldCursor;
return NULL;
}
itemDef_t *Menu_SetNextCursorItem(menuDef_t *menu) {
qboolean wrapped = qfalse;
int oldCursor = menu->cursorItem;
if (menu->cursorItem == -1) {
menu->cursorItem = 0;
wrapped = qtrue;
}
while (menu->cursorItem < menu->itemCount) {
menu->cursorItem++;
if (menu->cursorItem >= menu->itemCount && !wrapped) {
wrapped = qtrue;
menu->cursorItem = 0;
}
if (Item_SetFocus(menu->items[menu->cursorItem], DC->cursorx, DC->cursory)) {
Menu_HandleMouseMove(menu, menu->items[menu->cursorItem]->window.rect.x + 1, menu->items[menu->cursorItem]->win
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -