From 03b82b417a604339eb4acb51bf17d1be8b830c14 Mon Sep 17 00:00:00 2001 From: terencehill Date: Wed, 8 Jun 2011 00:07:15 +0200 Subject: [PATCH] Make possible to move the zoomed-in screenshot on mouse drag --- qcsrc/menu/item/image.c | 36 +++++++++++++++++++++++++++- qcsrc/menu/xonotic/screenshotimage.c | 13 ++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/qcsrc/menu/item/image.c b/qcsrc/menu/item/image.c index 1ae925538..901001b65 100644 --- a/qcsrc/menu/item/image.c +++ b/qcsrc/menu/item/image.c @@ -6,10 +6,15 @@ CLASS(Image) EXTENDS(Item) METHOD(Image, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(Image, updateAspect, void(entity)) METHOD(Image, setZoom, void(entity, float)) + METHOD(Image, startZoomMove, float(entity, vector)) + METHOD(Image, zoomMove, float(entity, vector)) ATTRIB(Image, src, string, string_null) ATTRIB(Image, color, vector, '1 1 1') ATTRIB(Image, forcedAspect, float, 0) ATTRIB(Image, zoomFactor, float, 1) + ATTRIB(Image, zoomOffset, vector, '0.5 0.5 0') + ATTRIB(Image, start_zoomOffset, vector, '0 0 0') + ATTRIB(Image, start_coords, vector, '0 0 0') ATTRIB(Image, imgOrigin, vector, '0 0 0') ATTRIB(Image, imgSize, vector, '0 0 0') ENDCLASS(Image) @@ -23,6 +28,7 @@ string Image_toString(entity me) void Image_configureImage(entity me, string path) { me.src = path; + me.zoomOffset = '0.5 0.5 0'; me.zoomFactor = 1; } void Image_draw(entity me) @@ -64,9 +70,35 @@ void Image_updateAspect(entity me) me.imgSize = eX + eY * (me.size_x / (asp * me.size_y)); } if (me.zoomFactor) + { + if (me.zoomFactor > 1) + { + me.zoomOffset_x = bound(0, me.zoomOffset_x, 1); + me.zoomOffset_y = bound(0, me.zoomOffset_y, 1); + } me.imgSize = me.imgSize * me.zoomFactor; - me.imgOrigin = '0.5 0.5 0' - 0.5 * me.imgSize; + } + me.imgOrigin_x = 0.5 - me.zoomOffset_x * me.imgSize_x; + me.imgOrigin_y = 0.5 - me.zoomOffset_y * me.imgSize_y; + } +} +float Image_startZoomMove(entity me, vector coords) +{ + if (me.zoomFactor > 1) + { + me.start_zoomOffset = me.zoomOffset; + me.start_coords = coords; + } + return 1; +} +float Image_zoomMove(entity me, vector coords) +{ + if (me.zoomFactor > 1) + { + me.zoomOffset = me.start_zoomOffset + (me.start_coords - coords)*(1/me.zoomFactor); + me.updateAspect(me); } + return 1; } void Image_setZoom(entity me, float z) { @@ -77,6 +109,8 @@ void Image_setZoom(entity me, float z) else me.zoomFactor *= z; me.zoomFactor = bound(1/16, me.zoomFactor, 16); + if (me.zoomFactor <= 1) + me.zoomOffset = '0.5 0.5 0'; me.updateAspect(me); } void Image_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) diff --git a/qcsrc/menu/xonotic/screenshotimage.c b/qcsrc/menu/xonotic/screenshotimage.c index b621c0f9d..77a9a9fbf 100644 --- a/qcsrc/menu/xonotic/screenshotimage.c +++ b/qcsrc/menu/xonotic/screenshotimage.c @@ -2,6 +2,9 @@ CLASS(XonoticScreenshotImage) EXTENDS(Image) METHOD(XonoticScreenshotImage, configureXonoticScreenshotImage, void(entity, string)) METHOD(XonoticScreenshotImage, draw, void(entity)) + ATTRIB(XonoticScreenshotImage, focusable, float, 1) // mousePress and mouseDrag work only if focusable is set + METHOD(XonoticScreenshotImage, mousePress, float(entity, vector)) + METHOD(XonoticScreenshotImage, mouseDrag, float(entity, vector)) METHOD(XonoticScreenshotImage, resizeNotify, void(entity, vector, vector, vector, vector)) ATTRIB(XonoticScreenshotImage, realFontSize, vector, '0 0 0') ATTRIB(XonoticScreenshotImage, fontSize, float, SKINFONTSIZE_NORMAL) @@ -32,6 +35,16 @@ void XonoticScreenshotImage_configureXonoticScreenshotImage(entity me, string th me.screenshotTitle = strzone(substring(me.src, 13, strlen(theImage) - 13)); //strip "/screenshots/" } +float XonoticScreenshotImage_mousePress(entity me, vector coords) +{ + return me.startZoomMove(me, coords); +} + +float XonoticScreenshotImage_mouseDrag(entity me, vector coords) +{ + return me.zoomMove(me, coords); +} + void XonoticScreenshotImage_draw(entity me) { if (me.src != "") -- 2.39.2