// 1/4 height: bottom part
void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize)
{
+ if (theBorderSize_x <= 0 && theBorderSize_y <= 0) // no border
+ {
+ // draw only the central part
+ drawsubpic(theOrigin, theSize, pic, '0.25 0.25 0', '0.5 0.5 0', theColor, theAlpha, 0);
+ return;
+ }
+
vector dX, dY;
vector width, height;
vector bW, bH;
if(bg != "0")
{
float border;
- border = max(0.0000001, HUD_Panel_GetBorder(id)); // draw_BorderPicture does not like border = 0
+ border = HUD_Panel_GetBorder(id);
vector color;
color = HUD_Panel_GetColor(id);
vector mySize;
mySize = HUD_Panel_GetSize(id);
- if(cvar("hud_configure_checkcollisions"))
+ if(hud_configure_checkcollisions)
pos = HUD_Panel_CheckMove(id, pos, mySize);
pos_x = bound(0, pos_x, vid_conwidth - mySize_x);
vector targPos;
vector targSize;
vector targEndPos;
+
vector dist;
+ float ratio;
+ ratio = mySize_x/mySize_y;
for (i = 0; i < HUD_PANEL_NUM; ++i) {
if(i == id || !HUD_Panel_CheckActive(i))
targEndPos = targPos + targSize;
// resizeorigin is WITHIN target panel, just abort any collision testing against that particular panel to produce expected behaviour!
- if(resizeorigin_x > targPos_x && resizeorigin_x < targPos_x + targSize_x && resizeorigin_y > targPos_y && resizeorigin_y < targPos_y + targSize_y)
+ if(resizeorigin_x > targPos_x && resizeorigin_x < targEndPos_x && resizeorigin_y > targPos_y && resizeorigin_y < targEndPos_y)
continue;
if (resizeCorner == 1)
// in this case resizeorigin (bottom-right point) and the bottom-right point of the panel
dist_x = resizeorigin_x - targEndPos_x;
dist_y = resizeorigin_y - targEndPos_y;
- if (dist_y < 0)
+ if (dist_y < 0 || dist_x / dist_y > ratio)
mySize_x = min(mySize_x, dist_x);
else
mySize_y = min(mySize_y, dist_y);
dist_x = targPos_x - resizeorigin_x;
dist_y = resizeorigin_y - targEndPos_y;
- if (dist_y < 0)
+ if (dist_y < 0 || dist_x / dist_y > ratio)
mySize_x = min(mySize_x, dist_x);
else
mySize_y = min(mySize_y, dist_y);
dist_x = resizeorigin_x - targEndPos_x;
dist_y = targPos_y - resizeorigin_y;
- if (dist_y < 0)
+ if (dist_y < 0 || dist_x / dist_y > ratio)
mySize_x = min(mySize_x, dist_x);
else
mySize_y = min(mySize_y, dist_y);
dist_x = targPos_x - resizeorigin_x;
dist_y = targPos_y - resizeorigin_y;
- if (dist_y < 0)
+ if (dist_y < 0 || dist_x / dist_y > ratio)
mySize_x = min(mySize_x, dist_x);
else
mySize_y = min(mySize_y, dist_y);
return mySize;
}
-void HUD_Panel_SetPosSize(float id)
+void HUD_Panel_SetPosSize(float id, vector mySize)
{
vector resizeorigin;
resizeorigin = panel_click_resizeorigin;
- vector mySize, myPos;
-
- if(resizeCorner == 1) {
- mySize_x = resizeorigin_x - (mousepos_x - panel_click_distance_x);
- mySize_y = resizeorigin_y - (mousepos_y - panel_click_distance_y);
- } else if(resizeCorner == 2) {
- mySize_x = mousepos_x + panel_click_distance_x - resizeorigin_x;
- mySize_y = panel_click_distance_y + resizeorigin_y - mousepos_y;
- } else if(resizeCorner == 3) {
- mySize_x = resizeorigin_x + panel_click_distance_x - mousepos_x;
- mySize_y = mousepos_y + panel_click_distance_y - resizeorigin_y;
- } else { // resizeCorner == 4
- mySize_x = mousepos_x - (resizeorigin_x - panel_click_distance_x);
- mySize_y = mousepos_y - (resizeorigin_y - panel_click_distance_y);
- }
+ vector myPos;
// minimum panel size cap
mySize_x = max(0.025 * vid_conwidth, mySize_x);
mySize_y = floor((mySize_y/vid_conheight)/bound(0.005, cvar("hud_configure_grid_y"), 0.2) + 0.5) * bound(0.005, cvar("hud_configure_grid_y"), 0.2) * vid_conheight;
}
- if(cvar("hud_configure_checkcollisions"))
- {
+ if(hud_configure_checkcollisions)
mySize = HUD_Panel_CheckResize(id, mySize, resizeorigin);
- }
// minimum panel size cap, do this once more so we NEVER EVER EVER have a panel smaller than this, JUST IN CASE above code still makes the panel eg negative (impossible to resize back without changing cvars manually then)
mySize_x = max(0.025 * vid_conwidth, mySize_x);
}
if(cvar("hud_configure_checkcollisions_debug"))
- if(cvar("hud_configure_checkcollisions"))
drawfill(myPos, mySize, '0 1 0', .3, DRAWFLAG_NORMAL);
string s;
cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s);
}
+float pressed_key_time;
+void HUD_Panel_Arrow_Action(float nPrimary)
+{
+ if (highlightedPanel_prev == -1)
+ return;
+
+ hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions"));
+
+ float step;
+ if (nPrimary == K_UPARROW || nPrimary == K_DOWNARROW)
+ step = vid_conheight;
+ else
+ step = vid_conwidth;
+ if (hudShiftState & S_SHIFT)
+ step = (step / 256); // more precision
+ else
+ step = (step / 64) * (1 + 2 * (time - pressed_key_time));
+
+ highlightedPanel = highlightedPanel_prev;
+
+ if (hudShiftState & S_ALT) // resize
+ {
+ highlightedAction = 1;
+ if(nPrimary == K_UPARROW)
+ resizeCorner = 1;
+ else if(nPrimary == K_RIGHTARROW)
+ resizeCorner = 2;
+ else if(nPrimary == K_LEFTARROW)
+ resizeCorner = 3;
+ else // if(nPrimary == K_DOWNARROW)
+ resizeCorner = 4;
+
+ // ctrl+arrow reduces the size, instead of increasing it
+ // Note that ctrl disables collisions check too, but it's fine
+ // since we don't collide with anything reducing the size
+ if (hudShiftState & S_CTRL) {
+ step = -step;
+ resizeCorner = 5 - resizeCorner;
+ }
+
+ vector mySize;
+ mySize = HUD_Panel_GetSize(highlightedPanel);
+ panel_click_resizeorigin = HUD_Panel_GetPos(highlightedPanel);
+ if(resizeCorner == 1) {
+ panel_click_resizeorigin += mySize;
+ mySize_y += step;
+ } else if(resizeCorner == 2) {
+ panel_click_resizeorigin_y += mySize_y;
+ mySize_x += step;
+ } else if(resizeCorner == 3) {
+ panel_click_resizeorigin_x += mySize_x;
+ mySize_x += step;
+ } else { // resizeCorner == 4
+ mySize_y += step;
+ }
+ HUD_Panel_SetPosSize(highlightedPanel, mySize);
+ }
+ else // move
+ {
+ highlightedAction = 2;
+ vector pos;
+ pos = HUD_Panel_GetPos(highlightedPanel);
+ if(nPrimary == K_UPARROW)
+ pos_y -= step;
+ else if(nPrimary == K_DOWNARROW)
+ pos_y += step;
+ else if(nPrimary == K_LEFTARROW)
+ pos_x -= step;
+ else // if(nPrimary == K_RIGHTARROW)
+ pos_x += step;
+
+ HUD_Panel_SetPos(highlightedPanel, pos);
+ }
+}
+
float mouseClicked;
float prevMouseClicked; // previous state
float prevMouseClickedTime; // time during previous mouse click, to check for doubleclicks
hit_con_bind = 1;
}
+ if(bInputType == 0) {
+ if(nPrimary == K_ALT) hudShiftState |= S_ALT;
+ if(nPrimary == K_CTRL) hudShiftState |= S_CTRL;
+ if(nPrimary == K_SHIFT) hudShiftState |= S_SHIFT;
+ }
+ else if(bInputType == 1) {
+ if(nPrimary == K_ALT) hudShiftState -= (hudShiftState & S_ALT);
+ if(nPrimary == K_CTRL) hudShiftState -= (hudShiftState & S_CTRL);
+ if(nPrimary == K_SHIFT) hudShiftState -= (hudShiftState & S_SHIFT);
+ }
+
if(nPrimary == K_MOUSE1)
{
if(bInputType == 0) { // key pressed
}
else if(nPrimary == K_ESCAPE)
{
+ if (bInputType == 1)
+ return true;
disable_menu_alphacheck = 1;
menu_enabled = 1;
menu_enabled_time = time;
localcmd("menu_showhudexit\n");
}
+ else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW)
+ {
+ if (bInputType == 1)
+ {
+ pressed_key_time = 0;
+ return true;
+ }
+ else if (pressed_key_time == 0)
+ pressed_key_time = time;
+ HUD_Panel_Arrow_Action(nPrimary); //move or resize panel
+ }
else if(hit_con_bind)
return false;
return true; // Suppress ALL other input
}
+void HUD_Panel_Highlight()
+{
+ float i, border;
+ vector panelPos;
+ vector panelSize;
+
+ for(i = 0; i < HUD_PANEL_NUM; ++i)
+ {
+ panelPos = HUD_Panel_GetPos(i);
+ panelSize = HUD_Panel_GetSize(i);
+ border = HUD_Panel_GetBorder(i);
+
+ // move
+ if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
+ {
+ highlightedPanel = i;
+ highlightedAction = 1;
+ panel_click_distance = mousepos - panelPos;
+ return;
+ }
+ // resize from topleft border
+ else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
+ {
+ highlightedPanel = i;
+ highlightedAction = 2;
+ resizeCorner = 1;
+ panel_click_distance = mousepos - panelPos;
+ panel_click_resizeorigin = panelPos + panelSize;
+ return;
+ }
+ // resize from topright border
+ else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
+ {
+ highlightedPanel = i;
+ highlightedAction = 2;
+ resizeCorner = 2;
+ panel_click_distance_x = panelSize_x - mousepos_x + panelPos_x;
+ panel_click_distance_y = mousepos_y - panelPos_y;
+ panel_click_resizeorigin = panelPos + eY * panelSize_y;
+ return;
+ }
+ // resize from bottomleft border
+ else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border)
+ {
+ highlightedPanel = i;
+ highlightedAction = 2;
+ resizeCorner = 3;
+ panel_click_distance_x = mousepos_x - panelPos_x;
+ panel_click_distance_y = panelSize_y - mousepos_y + panelPos_y;
+ panel_click_resizeorigin = panelPos + eX * panelSize_x;
+ return;
+ }
+ // resize from bottomright border
+ else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border)
+ {
+ highlightedPanel = i;
+ highlightedAction = 2;
+ resizeCorner = 4;
+ panel_click_distance = panelSize - mousepos + panelPos;
+ panel_click_resizeorigin = panelPos;
+ return;
+ }
+ }
+}
+
void HUD_Panel_Mouse()
{
// TODO: needs better check... is there any float that contains the current state of the menu? _menu_alpha isn't apparently updated the frame the menu gets enabled
print("Menu alpha: ", cvar_string("_menu_alpha"), "\n");
*/
- if(mouseClicked == 0 && disable_menu_alphacheck != 2) { // don't reset these variables in disable_menu_alphacheck mode 2!
+ if(mouseClicked == 0 && disable_menu_alphacheck != 2 && highlightedPanel >= 0) { // don't reset these variables in disable_menu_alphacheck mode 2!
+ highlightedPanel_prev = highlightedPanel;
highlightedPanel = -1;
highlightedAction = 0;
}
if(mouseClicked)
{
- float i, border;
- vector panelPos;
- vector panelSize;
-
- for(i = 0; i < HUD_PANEL_NUM; ++i)
- {
- panelPos = HUD_Panel_GetPos(i);
- panelSize = HUD_Panel_GetSize(i);
- border = HUD_Panel_GetBorder(i);
- if(prevMouseClicked == 0) {
- // move
- if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
- {
- highlightedPanel = i;
- highlightedAction = 1;
- }
- // resize from topleft border
- else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
- {
- highlightedPanel = i;
- highlightedAction = 2;
- resizeCorner = 1;
- }
- // resize from topright border
- else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - border && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
- {
- highlightedPanel = i;
- highlightedAction = 2;
- resizeCorner = 2;
- }
- // resize from bottomleft border
- else if(mousepos_x >= panelPos_x - border && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + border)
- {
- highlightedPanel = i;
- highlightedAction = 2;
- resizeCorner = 3;
- }
- // resize from bottomright border
- else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + border && mousepos_y <= panelPos_y + panelSize_y + border)
- {
- highlightedPanel = i;
- highlightedAction = 2;
- resizeCorner = 4;
- }
- }
-
- if(highlightedPanel == i)
- {
- if(prevMouseClicked == 0)
- {
- if(highlightedAction == 1)
- panel_click_distance = mousepos - panelPos;
- else if(highlightedAction == 2)
- {
- if(resizeCorner == 1) {
- panel_click_distance = mousepos - panelPos;
- panel_click_resizeorigin = panelPos + panelSize;
- } else if(resizeCorner == 2) {
- panel_click_distance_x = panelSize_x - mousepos_x + panelPos_x;
- panel_click_distance_y = mousepos_y - panelPos_y;
- panel_click_resizeorigin = panelPos + eY * panelSize_y;
- } else if(resizeCorner == 3) {
- panel_click_distance_x = mousepos_x - panelPos_x;
- panel_click_distance_y = panelSize_y - mousepos_y + panelPos_y;
- panel_click_resizeorigin = panelPos + eX * panelSize_x;
- } else if(resizeCorner == 4) {
- panel_click_distance = panelSize - mousepos + panelPos;
- panel_click_resizeorigin = panelPos;
- }
- }
- }
+ if(prevMouseClicked == 0)
+ HUD_Panel_Highlight(); // sets highlightedPanel, highlightedAction, panel_click_distance, panel_click_resizeorigin
- if(cvar("hud_configure_checkcollisions_debug"))
- drawfill(panelPos, panelSize, '1 0 0', .3, DRAWFLAG_NORMAL);
+ hud_configure_checkcollisions = (!(hudShiftState & S_CTRL) && cvar("hud_configure_checkcollisions"));
- if(highlightedAction == 1)
- HUD_Panel_SetPos(i, mousepos - panel_click_distance);
- else if(highlightedAction == 2)
- HUD_Panel_SetPosSize(i);
+ if(highlightedAction == 1)
+ HUD_Panel_SetPos(highlightedPanel, mousepos - panel_click_distance);
+ else if(highlightedAction == 2)
+ {
+ vector mySize;
+ if(resizeCorner == 1) {
+ mySize_x = panel_click_resizeorigin_x - (mousepos_x - panel_click_distance_x);
+ mySize_y = panel_click_resizeorigin_y - (mousepos_y - panel_click_distance_y);
+ } else if(resizeCorner == 2) {
+ mySize_x = mousepos_x + panel_click_distance_x - panel_click_resizeorigin_x;
+ mySize_y = panel_click_distance_y + panel_click_resizeorigin_y - mousepos_y;
+ } else if(resizeCorner == 3) {
+ mySize_x = panel_click_resizeorigin_x + panel_click_distance_x - mousepos_x;
+ mySize_y = mousepos_y + panel_click_distance_y - panel_click_resizeorigin_y;
+ } else { // resizeCorner == 4
+ mySize_x = mousepos_x - (panel_click_resizeorigin_x - panel_click_distance_x);
+ mySize_y = mousepos_y - (panel_click_resizeorigin_y - panel_click_distance_y);
}
+ HUD_Panel_SetPosSize(highlightedPanel, mySize);
}
// doubleclick check