From ef0f9ebf6729ca8a76b1f7053e74a49e31146de8 Mon Sep 17 00:00:00 2001 From: IntegratedQuantum Date: Mon, 20 Mar 2023 18:37:26 +0100 Subject: [PATCH] Allow ungrabbing the mouse by pressing escape and add a way to show the title bar of transparent windows. --- assets/cubyz/ui/window_expand.png | Bin 0 -> 2108 bytes src/gui/GuiWindow.zig | 90 ++++++++++++++++++++---------- src/main.zig | 4 ++ 3 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 assets/cubyz/ui/window_expand.png diff --git a/assets/cubyz/ui/window_expand.png b/assets/cubyz/ui/window_expand.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6206b7bf45c7e6838e75c58b99bd0b28fcf2b6 GIT binary patch literal 2108 zcmV-C2*dY@P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1dFk>fZF{bv*#0s)=~hiBDfu;K6HA*$_ecY9`5 zEQ=Hb;d%f_tM>1&uKvNrOi@`Eq8INqE-O|zVG;GZ(!7(l^S-X@9X-<3dBGqV%x3fZ zO>dwx_<7UImXknt9|TF;FY@Dyv;}e83NDMbB121ou3J#rf(&oXc0K2<*-H!`UD)3Z z7wNbfw`cdwgGXg!%!2Z{-fymSzW9Qo46S=dfwx*(u|)m3G=w) z8GK{{)^=0OjIUOJ3?@Lb?ASJaqWKV;YkqO5cih^@KBmF7+G(IZy?9Ck-!|Pmq36#$ z>FW6fxv$}#n0~M**rS*qECPRca5~<<-fQf=E$@=`aM^FCE>B2}6&UkKg87-p2>3ay z!yJMUQ7#2gS6y_*C?v#yxRa$yiMpaT7ljIJwA?sgW-e?dEdmSSVg~4T4C)+=m}(-R zFGv*wD)+9oEj0DY)K@4%b0x4cK^WnaABTE}>ATVUs3jt`YlarUJklO!4CKZgY(Rwi z4yv00zQ$uhZeR@{bTiBm4kn$Ki0tUjEi-{O;B%N)jZvuU`yt3ew}UZc0D<;o9C^}# zIS?U`5dbC9k&WdH1jsqAFp^Pi9@wA=pjzRZK$DjpFFLv;kZ{JMI3o~B0Lxm3{0TN9 zhmteSI_JC#E;@0^8*ddV%=_R+yG_9a8(i=qgcu~GXrhfS`WRx25|gkPbYmwdM~Nbm z5_Bd=PF^MOCr~nHlWlg{=a6HToC?yX*y4&Wp~NC3Rj#I@j;pVs#ws;6YDlGKn^VoV z&|;I8I&!U>ZoBKghaS81bWq!7s z7h_vbtggl1&R+`3X6SYn&0sFZ#{4)3k!5KUDU(Zm$(FoZY@TX*CG2rl*8)iq3Y|ct zx~LA&-Beko28#{;qBS4JLOG}phxK_Tn11y5_<~DML7!d>hq^xD@p)0JN46bmh;0X{ zN*fx~R$Tj1j7>3}sD#Sf@7#jeZ-b=1iDD?1U!_RLPWl~$!y?yhLEYSO`4jWhd*J?T zp8Awx&*r5IHZ;R{%A`G)iR!5=A_O#kw?@%7%3S8=EgA*(wOyMVGF}_*3N_R19-9=2pk!LepMUoJ*dV-Tyk$CpEh2rYW z?BP#&jaJpWz*;D1{Rf1;6}5H7rJq$^}XYh(KRoU#5x436>7Jfi}pAYmLsL) zmxXJ0`~-gk$_aMS+Y`Yt;Mlesv&gZ{^KRid{~TJ~9kSrCah%{K(B4kuyzKSv)iy%O zsonLOlw0ZEO-75mi|Yqp)mP5bvZV=5ga6lQjd40fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi!NW)MRg-=tZA{7NIh&W`ZP8LK( z9JLBXs1Ry}Rvk=U`Ug!Kk`xz5!L{Jv&tlcV#aUMeS3wZ`0daM4Qgo3L?@J0TVtjCU zALqSuxbHqdsF#^$b&La=Zkwq@T+C!w#n3B)h@g*ZKxURPCrL^8uCIFp_;eVn9G7o@It<6K@btZ`uauec}i!$|~_W@t8>s58V^%aZ;wj>&s_B$3WIR?mZ*kVjRo3j2zc8HBSC+X>HH-unu>=Vs6jV_{88%|H z>!esn(Rtj*Kjiu)aw+60fstbY6=;xMKlmT~o~@OiobZyuaiH_XaXv^vL@Chn<4d>R{8-m6L#~_dp34)Al5FCU)xZ#fD zPB@mqKXj>~=u*Q!2KdJSU23`faX`0K%9`8xh_nD6;DG{gy}g)COi{dW4hAfyW*)3} z self.size[0] - 54*self.scale) { - if(mousePosition[0] - self.pos[0] > self.size[0] - 36*self.scale) { - if(mousePosition[0] - self.pos[0] > self.size[0] - 18*self.scale) { - // Close - gui.closeWindow(self); - return; - } else { - // Zoom out - if(self.scale > 1) { - self.scale -= 0.5; + if(grabPosition != null and @reduce(.And, grabPosition.? == mousePosition) and grabbedWindow == self) { + if(!self.showTitleBar) { + if(mousePosition[0] - self.pos[0] < 16*self.scale) { + self.titleBarExpanded = !self.titleBarExpanded; + } + } + if(self.showTitleBar or self.titleBarExpanded) { + if(mousePosition[0] - self.pos[0] > self.size[0] - 48*self.scale) { + if(mousePosition[0] - self.pos[0] > self.size[0] - 32*self.scale) { + if(mousePosition[0] - self.pos[0] > self.size[0] - 16*self.scale) { + // Close + gui.closeWindow(self); + return; } else { - self.scale -= 0.25; + // Zoom out + if(self.scale > 1) { + self.scale -= 0.5; + } else { + self.scale -= 0.25; + } + self.scale = @max(self.scale, 0.25); + gui.updateWindowPositions(); + } + } else { + // Zoom in + if(self.scale >= 1) { + self.scale += 0.5; + } else { + self.scale += 0.25; } - self.scale = @max(self.scale, 0.25); gui.updateWindowPositions(); } - } else { - // Zoom in - if(self.scale >= 1) { - self.scale += 0.5; - } else { - self.scale += 0.25; - } - gui.updateWindowPositions(); } } } @@ -422,6 +432,13 @@ fn drawOrientationLines(self: *const GuiWindow) void { } } +pub fn drawIcons(self: *const GuiWindow) void { + draw.setColor(0xffffffff); + closeTexture.render(.{self.size[0]/self.scale - 16, 0}, .{16, 16}); + zoomOutTexture.render(.{self.size[0]/self.scale - 32, 0}, .{16, 16}); + zoomInTexture.render(.{self.size[0]/self.scale - 48, 0}, .{16, 16}); +} + pub fn render(self: *const GuiWindow, mousePosition: Vec2f) !void { const oldTranslation = draw.setTranslation(self.pos); const oldScale = draw.setScale(self.scale); @@ -440,16 +457,27 @@ pub fn render(self: *const GuiWindow, mousePosition: Vec2f) !void { graphics.c.glActiveTexture(graphics.c.GL_TEXTURE0); shader.bind(); titleTexture.bind(); - if(self == gui.selectedWindow) { - draw.setColor(0xff000040); - } else { - draw.setColor(0xff000000); - } + draw.setColor(0xff000000); draw.customShadedRect(windowUniforms, .{0, 0}, .{self.size[0]/self.scale, 16}); - draw.setColor(0xffffffff); - closeTexture.render(.{self.size[0]/self.scale - 18, 0}, .{16, 16}); - zoomOutTexture.render(.{self.size[0]/self.scale - 36, 0}, .{16, 16}); - zoomInTexture.render(.{self.size[0]/self.scale - 54, 0}, .{16, 16}); + self.drawIcons(); + } else if(!main.Window.grabbed) { + if(self.titleBarExpanded) { + graphics.c.glActiveTexture(graphics.c.GL_TEXTURE0); + shader.bind(); + titleTexture.bind(); + draw.setColor(0xff000000); + draw.customShadedRect(windowUniforms, .{0, 0}, .{self.size[0]/self.scale, 16}); + self.drawIcons(); + expandTitleBarTexture.render(.{0, 0}, .{16, 16}); + } else { + graphics.c.glActiveTexture(graphics.c.GL_TEXTURE0); + shader.bind(); + titleTexture.bind(); + draw.setColor(0xff000000); + draw.customShadedRect(windowUniforms, .{0, 0}, .{16, 16}); + draw.setColor(0xffffffff); + expandTitleBarTexture.render(.{0, 0}, .{16, 16}); + } } draw.restoreTranslation(oldTranslation); draw.restoreScale(oldScale); diff --git a/src/main.zig b/src/main.zig index 9b1a1ed8..4ee21dda 100644 --- a/src/main.zig +++ b/src/main.zig @@ -158,6 +158,9 @@ pub fn setNextKeypressListener(listener: ?*const fn(c_int, c_int, c_int) void) ! if(nextKeypressListener != null) return error.AlreadyUsed; nextKeypressListener = listener; } +fn ungrabMouse() void { + Window.setMouseGrabbed(false); +} pub var keyboard: struct { // Gameplay: forward: Key = Key{.key = c.GLFW_KEY_W}, @@ -170,6 +173,7 @@ pub var keyboard: struct { fullscreen: Key = Key{.key = c.GLFW_KEY_F11, .releaseAction = &Window.toggleFullscreen}, // Gui: + escape: Key = Key{.key = c.GLFW_KEY_ESCAPE, .releaseAction = &ungrabMouse}, mainGuiButton: Key = Key{.mouseButton = c.GLFW_MOUSE_BUTTON_LEFT, .pressAction = &gui.mainButtonPressed, .releaseAction = &gui.mainButtonReleased}, rightMouseButton: Key = Key{.mouseButton = c.GLFW_MOUSE_BUTTON_RIGHT}, middleMouseButton: Key = Key{.mouseButton = c.GLFW_MOUSE_BUTTON_MIDDLE},