void uiSequenceNode::draw (uiNode_t* node) { if (EXTRADATA(node).context != nullptr && EXTRADATA(node).playing) { bool finished = false; vec2_t pos; vec2_t screenPos; UI_GetNodeAbsPos(node, pos); UI_GetNodeScreenPos(node, screenPos); R_PushMatrix(); R_CleanupDepthBuffer(pos[0], pos[1], node->box.size[0], node->box.size[1]); UI_PushClipRect(screenPos[0], screenPos[1], node->box.size[0], node->box.size[1]); SEQ_SetView(EXTRADATA(node).context, pos, node->box.size); finished = !SEQ_Render(EXTRADATA(node).context); UI_PopClipRect(); R_PopMatrix(); if (finished) { if (EXTRADATA(node).onEnd != nullptr) { UI_ExecuteEventActions(node, EXTRADATA(node).onEnd); } else if (EXTRADATA(node).lua_onEnd != LUA_NOREF) { UI_ExecuteLuaEventScript(node, EXTRADATA(node).lua_onEnd); } EXTRADATA(node).playing = false; } } }
/** * @brief Activate the node. Can be used without the mouse (ie. a button will execute onClick) */ void uiRadioButtonNode::onActivate (uiNode_t* node) { /* no cvar given? */ if (!EXTRADATA(node).cvar || !*(char*)(EXTRADATA(node).cvar)) { Com_Printf("UI_RadioButtonNodeClick: node '%s' doesn't have a valid cvar assigned\n", UI_GetPath(node)); return; } /* its not a cvar! */ /** @todo the parser should already check that the property value is a right cvar */ char const* const cvarName = Q_strstart((char const*)(EXTRADATA(node).cvar), "*cvar:"); if (!cvarName) return; UI_GetReferenceFloat(node, EXTRADATA(node).cvar); /* Is we click on the already selected button, we can continue */ if (UI_RadioButtonNodeIsSelected(node)) return; if (EXTRADATA(node).string == nullptr) { Cvar_SetValue(cvarName, EXTRADATA(node).value); } else { Cvar_Set(cvarName, "%s", EXTRADATA(node).string); } if (node->onChange) { UI_ExecuteEventActions(node, node->onChange); } if (node->lua_onChange != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onChange); } }
/** * @brief Auto scroll the list */ bool uiOptionListNode::onScroll (uiNode_t* node, int deltaX, int deltaY) { bool down = deltaY > 0; bool updated; if (deltaY == 0) return false; updated = EXTRADATA(node).scrollY.moveDelta(down ? 1 : -1); if (updated) { if (EXTRADATA(node).onViewChange) { UI_ExecuteEventActions(node, EXTRADATA(node).onViewChange); } else if (EXTRADATA(node).lua_onViewChange != LUA_NOREF) { UI_ExecuteLuaEventScript (node, EXTRADATA(node).lua_onViewChange); } } /* @todo use super behaviour */ if (node->onWheelUp && !down) { UI_ExecuteEventActions(node, node->onWheelUp); updated = true; } if (node->onWheelDown && down) { UI_ExecuteEventActions(node, node->onWheelDown); updated = true; } if (node->onWheel) { UI_ExecuteEventActions(node, node->onWheel); updated = true; } return updated; }
/** * @brief Set the position of the scrollbar to a value */ void UI_AbstractScrollbarNodeSet (uiNode_t* node, int value) { int pos = value; if (pos < 0) { pos = 0; } else if (pos > EXTRADATA(node).fullsize - EXTRADATA(node).viewsize) { pos = EXTRADATA(node).fullsize - EXTRADATA(node).viewsize; } if (pos < 0) pos = 0; /* nothing change */ if (EXTRADATA(node).pos == pos) return; /* update status */ EXTRADATA(node).pos = pos; /* fire change event */ if (node->onChange) { UI_ExecuteEventActions(node, node->onChange); } if (node->lua_onChange != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onChange); } }
/** * @brief Activate the node. Can be used without the mouse (ie. a button will execute onClick) * @todo The old implementation calls onClick when activated. This is odd and should be replaced by * a correct onActivate event handler. */ void uiNode::onActivate(uiNode_t* node) { if (node->onClick) { UI_ExecuteEventActions(node, node->onClick); } if (node->lua_onActivate != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onActivate); } }
/** * Mouse leave the node (a child node is part of the node) */ void uiLocatedNode::onMouseLeave(uiNode_t* node) { if (node->onMouseLeave != nullptr) { UI_ExecuteEventActions(node, node->onMouseLeave); } if (node->lua_onMouseLeave != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onMouseLeave); } }
/** * @brief Update display of scroll buttons. * @param[in] node Context node */ static void UI_BaseInventoryNodeUpdateScroll (uiNode_t* node) { if (EXTRADATA(node).onViewChange) { UI_ExecuteEventActions(node, EXTRADATA(node).onViewChange); } else if (EXTRADATA(node).lua_onViewChange != LUA_NOREF) { UI_ExecuteLuaEventScript (node, EXTRADATA(node).lua_onViewChange); } }
void UI_AbstractOption_SetCurrentValue(uiNode_t* node, const char* value) { const char* cvarName = &EXTRADATA(node).cvar[6]; Cvar_Set(cvarName, "%s", value); if (node->onChange) { UI_ExecuteEventActions(node, node->onChange); } if (node->lua_onChange != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onChange); } }
/** * @brief Called when we close the node on the screen */ void uiWindowNode::onWindowClosed (uiNode_t* node) { uiLocatedNode::onWindowClosed(node); /* script callback */ if (EXTRADATA(node).onWindowClosed) { UI_ExecuteEventActions(node, EXTRADATA(node).onWindowClosed); } if (EXTRADATA(node).lua_onWindowClosed != LUA_NOREF) { UI_ExecuteLuaEventScript(node, EXTRADATA(node).lua_onWindowClosed); } }
void uiVideoNode::drawOverWindow (uiNode_t* node) { if (EXTRADATA(node).cin.status == CIN_STATUS_INVALID) { /** @todo Maybe draw a black screen? */ return; } if (EXTRADATA(node).cin.status == CIN_STATUS_NONE) { vec2_t pos; bool nosound = UI_VIDEOEXTRADATACONST(node).nosound; CIN_OpenCinematic(&(EXTRADATA(node).cin), va("videos/%s", EXTRADATA(node).source)); if (EXTRADATA(node).cin.status == CIN_STATUS_INVALID) { if (EXTRADATA(node).onEnd != nullptr) { UI_ExecuteEventActions(node, EXTRADATA(node).onEnd); } else if (EXTRADATA(node).lua_onEnd != LUA_NOREF) { UI_ExecuteLuaEventScript(node, EXTRADATA(node).lua_onEnd); } return; } UI_GetNodeAbsPos(node, pos); CIN_SetParameters(&(EXTRADATA(node).cin), pos[0], pos[1], node->box.size[0], node->box.size[1], CIN_STATUS_PLAYING, nosound); } if (EXTRADATA(node).cin.status == CIN_STATUS_PLAYING || EXTRADATA(node).cin.status == CIN_STATUS_PAUSE) { /* only set replay to true if video was found and is running */ CIN_RunCinematic(&(EXTRADATA(node).cin)); if (EXTRADATA(node).cin.status == CIN_STATUS_NONE) { if (EXTRADATA(node).onEnd != nullptr) { UI_ExecuteEventActions(node, EXTRADATA(node).onEnd); } else if (EXTRADATA(node).lua_onEnd != LUA_NOREF) { UI_ExecuteLuaEventScript(node, EXTRADATA(node).lua_onEnd); } } } }
/** * @brief callback from the keyboard */ static void UI_TextEntryNodeValidateEdition (uiNode_t* node) { /* invalidate cache */ editedCvar = nullptr; cvarValueBackup[0] = '\0'; /* fire change event */ if (node->onChange) { UI_ExecuteEventActions(node, node->onChange); } if (node->lua_onChange != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onChange); } }
void uiOptionListNode::onCapturedMouseMove (uiNode_t* node, int x, int y) { const int lineHeight = getCellHeight(node); const int deltaY = (mouseScrollY - y) / lineHeight; /* We're doing only vertical scroll, that's enough for the most instances */ if (deltaY != 0) { bool updated; updated = EXTRADATA(node).scrollY.moveDelta(deltaY); if (updated) { if (EXTRADATA(node).onViewChange) { UI_ExecuteEventActions(node, EXTRADATA(node).onViewChange); } else if (EXTRADATA(node).lua_onViewChange != LUA_NOREF) { UI_ExecuteLuaEventScript (node, EXTRADATA(node).lua_onViewChange); } } /* @todo not accurate */ mouseScrollX = x; mouseScrollY = y; } onMouseMove(node, x, y); }
/** * @brief Update the scroll according to the number * of items and the size of the node */ static void UI_OptionListNodeUpdateScroll (uiNode_t* node) { int lineHeight; bool updated; int elements; lineHeight = EXTRADATA(node).lineHeight; if (lineHeight == 0) { const char* font = UI_GetFontFromNode(node); lineHeight = UI_FontGetHeight(font); } elements = (node->box.size[1] - node->padding - node->padding) / lineHeight; updated = EXTRADATA(node).scrollY.set(-1, elements, EXTRADATA(node).count); if (updated) { if (EXTRADATA(node).onViewChange) { UI_ExecuteEventActions(node, EXTRADATA(node).onViewChange); } else if (EXTRADATA(node).lua_onViewChange != LUA_NOREF) { UI_ExecuteLuaEventScript (node, EXTRADATA(node).lua_onViewChange); } } }
void uiBaseInventoryNode::onMouseDown (uiNode_t* node, int x, int y, int button) { switch (button) { case K_MOUSE1: { /* start drag and drop */ int fromX, fromY; dragInfoIC = UI_BaseInventoryNodeGetItem(node, x, y, &fromX, &fromY); if (dragInfoIC) { dragInfoFromX = fromX; dragInfoFromY = fromY; oldMouseX = x; oldMouseY = y; UI_SetMouseCapture(node); EXTRADATA(node).super.lastSelectedId = dragInfoIC->def()->idx; if (EXTRADATA(node).super.onSelect) { UI_ExecuteEventActions(node, EXTRADATA(node).super.onSelect); } if (EXTRADATA(node).super.lua_onSelect != LUA_NOREF) { UI_ExecuteLuaEventScript(node, EXTRADATA(node).super.lua_onSelect); } } break; } case K_MOUSE2: if (UI_DNDIsDragging()) { UI_DNDAbort(); } else { /* auto place */ UI_ContainerNodeAutoPlace(node, x, y); } break; default: break; } }
void uiLocatedNode::onFocusLost(uiNode_t* node) { if (node->lua_onFocusLost != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onFocusLost); } }
void uiNode::onLoaded(uiNode_t* node) { if (node->lua_onLoaded != LUA_NOREF) { UI_ExecuteLuaEventScript(node, node->lua_onLoaded); } }