#ifndef DIALOG_MULTIPLAYER_MEDIA_SCREENSHOT_VIEWER_H #define DIALOG_MULTIPLAYER_MEDIA_SCREENSHOT_VIEWER_H #include "dialog.qc" CLASS(XonoticScreenshotViewerDialog, 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, 4) ATTRIB(XonoticScreenshotViewerDialog, color, vector, SKINCOLOR_DIALOG_SCREENSHOTVIEWER) ATTRIB(XonoticScreenshotViewerDialog, scrList, entity, NULL) ATTRIB(XonoticScreenshotViewerDialog, screenshotImage, entity, NULL) ATTRIB(XonoticScreenshotViewerDialog, slideShowButton, entity, NULL) ATTRIB(XonoticScreenshotViewerDialog, currentScrPath, string, string_null) ENDCLASS(XonoticScreenshotViewerDialog) #endif #ifdef IMPLEMENTATION float music_playlist_index_backup; void XonoticScreenshotViewerDialog_loadScreenshot(entity me, string scrImage) { // disable music as it can lag depending on image loading time if(!cvar("menu_screenshotviewer_enablemusic")) if(cvar("music_playlist_index") != 999) // if the playlist isn't paused { // pause music if(cvar("music_playlist_index") != -1) { music_playlist_index_backup = cvar("music_playlist_index"); cvar_set("music_playlist_sampleposition0", "0"); cvar_set("music_playlist_index", "999"); } else localcmd("\ncd pause\n"); } if (me.currentScrPath == scrImage) return; if (me.currentScrPath) strunzone(me.currentScrPath); me.currentScrPath = strzone(scrImage); me.screenshotImage.load(me.screenshotImage, me.currentScrPath); me.frame.setText(me.frame, me.screenshotImage.screenshotTitle); } void prevScreenshot_Click(entity btn, entity me) { me.scrList.goScreenshot(me.scrList, -1); } 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, false); } void decreaseZoom_Click(entity btn, entity me) { me.screenshotImage.setZoom(me.screenshotImage, -1/2, false); } void resetZoom_Click(entity btn, entity me) { me.screenshotImage.setZoom(me.screenshotImage, 0, false); } 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) { case K_KP_LEFTARROW: case K_LEFTARROW: me.scrList.goScreenshot(me.scrList, -1); return 1; case K_KP_RIGHTARROW: 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, (key == K_MWHEELUP)); return 1; } else if (key == K_MWHEELDOWN || ascii == '-') { me.screenshotImage.setZoom(me.screenshotImage, -1/2, (key == K_MWHEELDOWN)); 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) { // resume music if(!cvar("menu_screenshotviewer_enablemusic")) if(cvar("music_playlist_index") == 999) { cvar_set("music_playlist_index", ftos(music_playlist_index_backup)); } else localcmd("\ncd resume\n"); 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 = makeXonoticScreenshotImage()); e.showTitle = 0; // dialog title is enough me.screenshotImage = e; me.gotoRC(me, me.rows - 1, 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, 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