/** * @brief Move the window on top of compatible windows. * "Compatible" mean non full screen windows, and windows * with the same window parent. * @param window Window we want to move */ void UI_MoveWindowOnTop (uiNode_t * window) { int i, j; if (UI_WindowIsFullScreen(window)) return; /* get window index */ for (i = 0; i < ui_global.windowStackPos; i++) { if (ui_global.windowStack[i] == window) break; } /* search the last compatible window */ for (j = i; j < ui_global.windowStackPos; j++) { if (UI_WindowIsFullScreen(ui_global.windowStack[j])) break; if (WINDOWEXTRADATA(window).parent != WINDOWEXTRADATA(ui_global.windowStack[j]).parent) break; } if (i + 1 == j) return; /* translate windows */ for (; i < j - 1; i++) { ui_global.windowStack[i] = ui_global.windowStack[i+1]; } /* add the current window on top */ ui_global.windowStack[i] = window; }
void uiWindowNode::doLayout (uiNode_t* node) { if (!node->invalidated) return; /* use a the space */ if (EXTRADATA(node).fill) { if (node->box.size[0] != viddef.virtualWidth) { node->box.size[0] = viddef.virtualWidth; } if (node->box.size[1] != viddef.virtualHeight) { node->box.size[1] = viddef.virtualHeight; } } /* move fullscreen window on the center of the screen */ if (UI_WindowIsFullScreen(node)) { node->box.pos[0] = (int) ((viddef.virtualWidth - node->box.size[0]) / 2); node->box.pos[1] = (int) ((viddef.virtualHeight - node->box.size[1]) / 2); } /** @todo check and fix here window outside the screen */ if (EXTRADATA(node).starLayout) { UI_StarLayout(node); } /* super */ uiLocatedNode::doLayout(node); }
/** * @brief Return the first visible node at a position */ uiNode_t *UI_GetNodeAtPosition (int x, int y) { int pos; /* find the first window under the mouse */ for (pos = ui_global.windowStackPos - 1; pos >= 0; pos--) { uiNode_t *window = ui_global.windowStack[pos]; uiNode_t *find; /* update the layout */ UI_Validate(window); find = UI_GetNodeInTreeAtPosition(window, x, y); if (find) return find; /* we must not search anymore */ if (UI_WindowIsDropDown(window)) break; if (UI_WindowIsModal(window)) break; if (UI_WindowIsFullScreen(window)) break; } return NULL; }
/** * @brief Returns the ID of the last fullscreen ID. Before this, window should be hidden. * @return The last full screen window on the screen, else 0. If the stack is empty, return -1 */ int UI_GetLastFullScreenWindow (void) { /* stack pos */ int pos = ui_global.windowStackPos - 1; while (pos > 0) { if (UI_WindowIsFullScreen(ui_global.windowStack[pos])) break; pos--; } /* if we find nothing we return 0 */ return pos; }
void uiWindowNode::draw (uiNode_t* node) { const char* text; vec2_t pos; const char* font = UI_GetFontFromNode(node); UI_GetNodeAbsPos(node, pos); /* black border for anamorphic mode */ /** @todo it should be over the window */ /** @todo why not using glClear here with glClearColor set to black here? */ if (UI_WindowIsFullScreen(node)) { /* top */ if (pos[1] != 0) UI_DrawFill(0, 0, viddef.virtualWidth, pos[1], anamorphicBorder); /* left-right */ if (pos[0] != 0) UI_DrawFill(0, pos[1], pos[0], node->box.size[1], anamorphicBorder); if (pos[0] + node->box.size[0] < viddef.virtualWidth) { const int width = viddef.virtualWidth - (pos[0] + node->box.size[0]); UI_DrawFill(viddef.virtualWidth - width, pos[1], width, node->box.size[1], anamorphicBorder); } /* bottom */ if (pos[1] + node->box.size[1] < viddef.virtualHeight) { const int height = viddef.virtualHeight - (pos[1] + node->box.size[1]); UI_DrawFill(0, viddef.virtualHeight - height, viddef.virtualWidth, height, anamorphicBorder); } } /* hide background if window is modal */ if (EXTRADATA(node).modal && ui_global.windowStack[ui_global.windowStackPos - 1] == node) UI_DrawFill(0, 0, viddef.virtualWidth, viddef.virtualHeight, modalBackground); if (EXTRADATA(node).background) { UI_DrawSpriteInBox(false, EXTRADATA(node).background, SPRITE_STATUS_NORMAL, pos[0], pos[1], node->box.size[0], node->box.size[1]); } /* draw the title */ text = UI_GetReferenceString(node, node->text); if (text) UI_DrawStringInBox(font, ALIGN_CC, pos[0] + node->padding, pos[1] + node->padding, node->box.size[0] - node->padding - node->padding, TOP_HEIGHT + 10 - node->padding - node->padding, text); }
void uiWindowNode::doLayout (uiNode_t* node) { if (!node->invalidated) return; /* use a the space */ if (EXTRADATA(node).fill) { if (node->box.size[0] != viddef.virtualWidth) { node->box.size[0] = viddef.virtualWidth; } if (node->box.size[1] != viddef.virtualHeight) { node->box.size[1] = viddef.virtualHeight; } } /* move fullscreen window on the center of the screen */ if (UI_WindowIsFullScreen(node)) { node->box.pos[0] = (int) ((viddef.virtualWidth - node->box.size[0]) / 2); node->box.pos[1] = (int) ((viddef.virtualHeight - node->box.size[1]) / 2); } /* reposition the close button */ if (EXTRADATA(node).closeButton) { uiNode_t* control = UI_FindNode(node, WINDOW_CLOSE_BUTTON_NAME); control->box.pos[0] = node->box.size[0] - CONTROLS_PADDING - control->box.size[0]; } /* resize the dragw button */ if (EXTRADATA(node).dragButton) { uiNode_t* control = UI_FindNode(node, WINDOW_DRAG_BUTTON_NAME); control->box.size[0] = node->box.size[0]; } /** @todo check and fix here window outside the screen */ if (EXTRADATA(node).starLayout) { UI_StarLayout(node); } /* super */ uiLocatedNode::doLayout(node); }