]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/xonotic/dialog_multiplayer_screenshot_screenshotviewer.c
Mouse wheel and -/+ keys to zoom
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / xonotic / dialog_multiplayer_screenshot_screenshotviewer.c
index d067db741da3b852908b78054d2bef0e63ed0236..eb6079338ae66a13c49f762821dab0388849c09b 100644 (file)
@@ -1,17 +1,18 @@
 #ifdef INTERFACE
-CLASS(XonoticScreenshotViewerDialog) EXTENDS(XonoticRootDialog)
+CLASS(XonoticScreenshotViewerDialog) EXTENDS(XonoticDialog)
        METHOD(XonoticScreenshotViewerDialog, fill, void(entity))
        METHOD(XonoticScreenshotViewerDialog, keyDown, float(entity, float, float, float))
        METHOD(XonoticScreenshotViewerDialog, loadScreenshot, void(entity, string))
+       METHOD(XonoticScreenshotViewerDialog, close, void(entity))
        ATTRIB(XonoticScreenshotViewerDialog, title, string, "Screenshot Viewer")
+       ATTRIB(XonoticScreenshotViewerDialog, name, string, "ScreenshotViewer")
        ATTRIB(XonoticScreenshotViewerDialog, intendedWidth, float, 1)
        ATTRIB(XonoticScreenshotViewerDialog, rows, float, 25)
-       ATTRIB(XonoticScreenshotViewerDialog, columns, float, 6.5)
-       ATTRIB(XonoticScreenshotViewerDialog, screenshotImage, entity, NULL)
+       ATTRIB(XonoticScreenshotViewerDialog, columns, float, 4)
+       ATTRIB(XonoticScreenshotViewerDialog, color, vector, SKINCOLOR_DIALOG_SCREENSHOTVIEWER)
        ATTRIB(XonoticScreenshotViewerDialog, scrList, entity, NULL)
-       ATTRIB(XonoticScreenshotViewerDialog, titleLabel, entity, NULL)
-       
-       ATTRIB(XonoticScreenshotViewerDialog, currentScrName, string, string_null)
+       ATTRIB(XonoticScreenshotViewerDialog, screenshotImage, entity, NULL)
+       ATTRIB(XonoticScreenshotViewerDialog, slideShowButton, entity, NULL)
        ATTRIB(XonoticScreenshotViewerDialog, currentScrPath, string, string_null)
 ENDCLASS(XonoticScreenshotViewerDialog)
 #endif
@@ -19,16 +20,12 @@ ENDCLASS(XonoticScreenshotViewerDialog)
 #ifdef IMPLEMENTATION
 void XonoticScreenshotViewerDialog_loadScreenshot(entity me, string scrImage)
 {
+       if (me.currentScrPath == scrImage)
+               return;
        if (me.currentScrPath)
                strunzone(me.currentScrPath);
        me.currentScrPath = strzone(scrImage);
-       me.screenshotImage.configureImage(me.screenshotImage, me.currentScrPath);
-       me.screenshotImage.updateAspect(me.screenshotImage);
-
-       if (me.currentScrName)
-               strunzone(me.currentScrName);
-       me.currentScrName = strzone(substring(scrImage, 13, strlen(scrImage) - 13));
-       me.titleLabel.setText(me.titleLabel, me.currentScrName);
+       me.screenshotImage.configureXonoticScreenshotImage(me.screenshotImage, me.currentScrPath);
 }
 void prevScreenshot_Click(entity btn, entity me)
 {
@@ -38,7 +35,31 @@ void nextScreenshot_Click(entity btn, entity me)
 {
        me.scrList.goScreenshot(me.scrList, +1);
 }
-
+void increaseZoom_Click(entity btn, entity me)
+{
+       me.screenshotImage.setZoom(me.screenshotImage, -2);
+}
+void decreaseZoom_Click(entity btn, entity me)
+{
+       me.screenshotImage.setZoom(me.screenshotImage, -1/2);
+}
+void resetZoom_Click(entity btn, entity me)
+{
+       me.screenshotImage.setZoom(me.screenshotImage, 0);
+}
+void toggleSlideShow_Click(entity btn, entity me)
+{
+       if (me.slideShowButton.forcePressed)
+       {
+               me.scrList.stopSlideShow(me.scrList);
+               me.slideShowButton.forcePressed = 0;
+       }
+       else
+       {
+               me.scrList.startSlideShow(me.scrList);
+               me.slideShowButton.forcePressed = 1;
+       }
+}
 float XonoticScreenshotViewerDialog_keyDown(entity me, float key, float ascii, float shift)
 {
        switch(key)
@@ -51,25 +72,73 @@ float XonoticScreenshotViewerDialog_keyDown(entity me, float key, float ascii, f
                case K_RIGHTARROW:
                        me.scrList.goScreenshot(me.scrList, +1);
                        return 1;
+               case K_KP_ENTER:
+               case K_ENTER:
+               case K_SPACE:
+                       // we cannot use SPACE/ENTER directly, as in a dialog they are needed
+                       // to press buttons while browsing with only the keyboard
+                       if (shift & S_CTRL)
+                       {
+                               toggleSlideShow_Click(world, me);
+                               return 1;
+                       }
+                       return SUPER(XonoticScreenshotViewerDialog).keyDown(me, key, ascii, shift);
                default:
+                       if (key == K_MWHEELUP || ascii == '+')
+                       {
+                               me.screenshotImage.setZoom(me.screenshotImage, -2);
+                               return 1;
+                       }
+                       else if (key == K_MWHEELDOWN || ascii == '-')
+                       {
+                               me.screenshotImage.setZoom(me.screenshotImage, -1/2);
+                               return 1;
+                       }
+                       if (me.scrList.keyDown(me.scrList, key, ascii, shift))
+                       {
+                               // keyDown has already changed the selected item
+                               me.scrList.goScreenshot(me.scrList, 0);
+                               return 1;
+                       }
                        return SUPER(XonoticScreenshotViewerDialog).keyDown(me, key, ascii, shift);
        }
 }
+void XonoticScreenshotViewerDialog_close(entity me)
+{
+       me.scrList.stopSlideShow(me.scrList);
+       me.slideShowButton.forcePressed = 0;
+       SUPER(XonoticScreenshotViewerDialog).close(me);
+}
 void XonoticScreenshotViewerDialog_fill(entity me)
 {
        entity e;
-
        me.TR(me);
-               me.TD(me, me.rows - 1, me.columns, e = makeXonoticImage(string_null, -1));
-               me.screenshotImage = e;
-               me.TD(me, 1, me.columns, e = makeXonoticTextLabel(0.5, ""));
-               me.titleLabel = e;
+               me.TD(me, me.rows - 1, me.columns, e = makeXonoticScreenshotImage());
+                       me.screenshotImage = e;
        me.gotoRC(me, me.rows - 1, 0);
-               me.TD(me, 1, me.columns/2, e = makeXonoticButton("Previous", '0 0 0'));
+               me.TDempty(me, 1/20 * me.columns);
+               me.TD(me, 1, 1/20 * me.columns, e = makeXonoticButton("-", '0 0 0'));
+                       e.onClick = decreaseZoom_Click;
+                       e.onClickEntity = me;
+               me.TD(me, 1, 1/20 * me.columns, e = makeXonoticButton("+", '0 0 0'));
+                       e.onClick = increaseZoom_Click;
+                       e.onClickEntity = me;
+               me.TD(me, 1, 2/20 * me.columns, e = makeXonoticButton("reset", '0 0 0'));
+                       e.onClick = resetZoom_Click;
+                       e.onClickEntity = me;
+
+               me.TDempty(me, 2/20 * me.columns);
+               me.TD(me, 1, 3/20 * me.columns, e = makeXonoticButton("Previous", '0 0 0'));
                        e.onClick = prevScreenshot_Click;
                        e.onClickEntity = me;
-               me.TD(me, 1, me.columns/2, e = makeXonoticButton("Next", '0 0 0'));
+               me.TD(me, 1, 3/20 * me.columns, e = makeXonoticButton("Next", '0 0 0'));
                        e.onClick = nextScreenshot_Click;
                        e.onClickEntity = me;
+
+               me.TDempty(me, 2/20 * me.columns);
+               me.TD(me, 1, 4/20 * me.columns, e = makeXonoticButton("Slide show", '0 0 0'));
+                       e.onClick = toggleSlideShow_Click;
+                       e.onClickEntity = me;
+                       me.slideShowButton = e;
 }
 #endif