From c9dfc84d83cb1bf3d6c5e7e6550420bfb5aaa4da Mon Sep 17 00:00:00 2001 From: terencehill Date: Thu, 5 Aug 2010 22:03:10 +0200 Subject: [PATCH] Screenshot viewer! --- qcsrc/menu/classes.c | 3 + qcsrc/menu/xonotic/dialog_multiplayer.c | 1 + .../xonotic/dialog_multiplayer_screenshot.c | 45 +++++ ..._multiplayer_screenshot_screenshotviewer.c | 45 +++++ qcsrc/menu/xonotic/mainwindow.c | 5 + qcsrc/menu/xonotic/screenshotlist.c | 167 ++++++++++++++++++ 6 files changed, 266 insertions(+) create mode 100644 qcsrc/menu/xonotic/dialog_multiplayer_screenshot.c create mode 100644 qcsrc/menu/xonotic/dialog_multiplayer_screenshot_screenshotviewer.c create mode 100644 qcsrc/menu/xonotic/screenshotlist.c diff --git a/qcsrc/menu/classes.c b/qcsrc/menu/classes.c index c0568b1e5..7f9182f4d 100644 --- a/qcsrc/menu/classes.c +++ b/qcsrc/menu/classes.c @@ -81,6 +81,9 @@ #include "xonotic/dialog_multiplayer_playersetup_waypoint.c" #include "xonotic/dialog_multiplayer_demo.c" #include "xonotic/demolist.c" +#include "xonotic/dialog_multiplayer_screenshot.c" +#include "xonotic/dialog_multiplayer_screenshot_screenshotviewer.c" +#include "xonotic/screenshotlist.c" #include "xonotic/colorpicker.c" #include "xonotic/colorpicker_string.c" #include "xonotic/cvarlist.c" diff --git a/qcsrc/menu/xonotic/dialog_multiplayer.c b/qcsrc/menu/xonotic/dialog_multiplayer.c index e755710c5..a31683e39 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer.c +++ b/qcsrc/menu/xonotic/dialog_multiplayer.c @@ -20,6 +20,7 @@ void XonoticMultiplayerDialog_fill(entity me) me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Create", makeXonoticServerCreateTab())); setDependentStringNotEqual(e, "_cl_name", "Player"); me.TD(me, 1, 1, mc.makeTabButton(mc, "Demos", makeXonoticDemoBrowserTab())); + me.TD(me, 1, 1, mc.makeTabButton(mc, "Screenshots", makeXonoticScreenshotBrowserTab())); me.TD(me, 1, 1, e = mc.makeTabButton(mc, "Player Setup", makeXonoticPlayerSettingsTab())); if(cvar_string("_cl_name") == "Player") e.onClick(e, e.onClickEntity); // lol animation diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_screenshot.c b/qcsrc/menu/xonotic/dialog_multiplayer_screenshot.c new file mode 100644 index 000000000..0daf4bfdb --- /dev/null +++ b/qcsrc/menu/xonotic/dialog_multiplayer_screenshot.c @@ -0,0 +1,45 @@ +#ifdef INTERFACE +CLASS(XonoticScreenshotBrowserTab) EXTENDS(XonoticTab) + METHOD(XonoticScreenshotBrowserTab, fill, void(entity)) + ATTRIB(XonoticScreenshotBrowserTab, title, string, "Screenshot") + ATTRIB(XonoticScreenshotBrowserTab, intendedWidth, float, 0.9) + ATTRIB(XonoticScreenshotBrowserTab, rows, float, 22) + ATTRIB(XonoticScreenshotBrowserTab, columns, float, 6.5) + ATTRIB(XonoticScreenshotBrowserTab, screenshotImage, entity, NULL) + ATTRIB(XonoticScreenshotBrowserTab, name, string, "ScreenshotBrowser") +ENDCLASS(XonoticScreenshotBrowserTab) +entity makeXonoticScreenshotBrowserTab(); +#endif + +#ifdef IMPLEMENTATION +entity makeXonoticScreenshotBrowserTab() +{ + entity me; + me = spawnXonoticScreenshotBrowserTab(); + me.configureDialog(me); + return me; +} +void XonoticScreenshotBrowserTab_fill(entity me) +{ + entity e, btn, slist; + me.TR(me); + slist = makeXonoticScreenshotList(); + me.TR(me); + me.TD(me, 1, 0.5, e = makeXonoticTextLabel(0, "Filter:")); + me.TD(me, 1, 0.5, btn = makeXonoticButton("Clear", '0 0 0')); + btn.onClick = InputBox_Clear_Click; + me.TD(me, 1, me.columns - 1, e = makeXonoticInputBox(0, string_null)); + e.onChange = ScreenshotList_Filter_Change; + e.onChangeEntity = slist; + btn.onClickEntity = e; + slist.controlledTextbox = e; + slist.screenshotViewerDialog = main.screenshotViewerDialog; + main.screenshotViewerDialog.scrList = slist; + me.TR(me); + me.TD(me, me.rows - 4, me.columns, slist); + me.gotoRC(me, me.rows - 1, 0); + me.TD(me, 1, me.columns, e = makeXonoticButton("View", '0 0 0')); + e.onClick = StartScreenshot_Click; + e.onClickEntity = slist; +} +#endif diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_screenshot_screenshotviewer.c b/qcsrc/menu/xonotic/dialog_multiplayer_screenshot_screenshotviewer.c new file mode 100644 index 000000000..4e31e21f3 --- /dev/null +++ b/qcsrc/menu/xonotic/dialog_multiplayer_screenshot_screenshotviewer.c @@ -0,0 +1,45 @@ +#ifdef INTERFACE +CLASS(XonoticScreenshotViewerDialog) EXTENDS(XonoticRootDialog) + METHOD(XonoticScreenshotViewerDialog, fill, void(entity)) + METHOD(XonoticScreenshotViewerDialog, loadScreenshot, void(entity, string)) + ATTRIB(XonoticScreenshotViewerDialog, title, string, "Screenshot Viewer") + ATTRIB(XonoticScreenshotViewerDialog, intendedWidth, float, 1) + ATTRIB(XonoticScreenshotViewerDialog, rows, float, 25) + ATTRIB(XonoticScreenshotViewerDialog, columns, float, 6.5) + ATTRIB(XonoticScreenshotViewerDialog, screenshotImage, entity, NULL) + ATTRIB(XonoticScreenshotViewerDialog, scrList, entity, NULL) +ENDCLASS(XonoticScreenshotViewerDialog) +#endif + +#ifdef IMPLEMENTATION +void XonoticScreenshotViewerDialog_loadScreenshot(entity me, string scrImage) +{ + if (me.screenshotImage.src) + strunzone(me.screenshotImage.src); + me.screenshotImage.src = strzone(scrImage); + me.screenshotImage.updateAspect(me.screenshotImage); +} +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 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.gotoRC(me, me.rows - 1, 0); + me.TD(me, 1, me.columns/2, e = makeXonoticButton("Prev", '0 0 0')); + e.onClick = prevScreenshot_Click; + e.onClickEntity = me; + me.TD(me, 1, me.columns/2, e = makeXonoticButton("Next", '0 0 0')); + e.onClick = nextScreenshot_Click; + e.onClickEntity = me; +} +#endif diff --git a/qcsrc/menu/xonotic/mainwindow.c b/qcsrc/menu/xonotic/mainwindow.c index 72e5faac3..55a5a0789 100644 --- a/qcsrc/menu/xonotic/mainwindow.c +++ b/qcsrc/menu/xonotic/mainwindow.c @@ -1,6 +1,7 @@ #ifdef INTERFACE CLASS(MainWindow) EXTENDS(ModalController) METHOD(MainWindow, configureMainWindow, void(entity)) + ATTRIB(MainWindow, screenshotViewerDialog, entity, NULL) ATTRIB(MainWindow, advancedDialog, entity, NULL) ATTRIB(MainWindow, mutatorsDialog, entity, NULL) ATTRIB(MainWindow, weaponsDialog, entity, NULL) @@ -97,6 +98,10 @@ void MainWindow_configureMainWindow(entity me) i.configureDialog(i); me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.screenshotViewerDialog = i = spawnXonoticScreenshotViewerDialog(); + i.configureDialog(i); + me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.advancedDialog = i = spawnXonoticAdvancedDialog(); i.configureDialog(i); me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); diff --git a/qcsrc/menu/xonotic/screenshotlist.c b/qcsrc/menu/xonotic/screenshotlist.c new file mode 100644 index 000000000..1a3907e3e --- /dev/null +++ b/qcsrc/menu/xonotic/screenshotlist.c @@ -0,0 +1,167 @@ +#ifdef INTERFACE +CLASS(XonoticScreenshotList) EXTENDS(XonoticListBox) + METHOD(XonoticScreenshotList, configureXonoticScreenshotList, void(entity)) + ATTRIB(XonoticScreenshotList, rowsPerItem, float, 1) + METHOD(XonoticScreenshotList, resizeNotify, void(entity, vector, vector, vector, vector)) + METHOD(XonoticScreenshotList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticScreenshotList, getScreenshots, void(entity)) + METHOD(XonoticScreenshotList, startScreenshot, void(entity)) + METHOD(XonoticScreenshotList, screenshotName, string(entity, float)) + METHOD(XonoticScreenshotList, clickListBoxItem, void(entity, float, vector)) + METHOD(XonoticScreenshotList, keyDown, float(entity, float, float, float)) + METHOD(XonoticScreenshotList, destroy, void(entity)) + METHOD(XonoticScreenshotList, showNotify, void(entity)) + ATTRIB(XonoticScreenshotList, listScreenshot, float, -1) + ATTRIB(XonoticScreenshotList, realFontSize, vector, '0 0 0') + ATTRIB(XonoticScreenshotList, columnNameOrigin, float, 0) + ATTRIB(XonoticScreenshotList, columnNameSize, float, 0) + ATTRIB(XonoticScreenshotList, realUpperMargin, float, 0) + ATTRIB(XonoticScreenshotList, origin, vector, '0 0 0') + ATTRIB(XonoticScreenshotList, itemAbsSize, vector, '0 0 0') + ATTRIB(XonoticScreenshotList, lastClickedScreenshot, float, -1) + ATTRIB(XonoticScreenshotList, lastClickedTime, float, 0) + ATTRIB(XonoticScreenshotList, filterString, string, string_null) + ATTRIB(XonoticScreenshotList, screenshotViewerDialog, entity, NULL) + METHOD(XonoticScreenshotList, goScreenshot, void(entity, float)) +ENDCLASS(XonoticScreenshotList) + +entity makeXonoticScreenshotList(); +void StartScreenshot_Click(entity btn, entity me); +void ScreenshotList_Filter_Change(entity box, entity me); +#endif + +#ifdef IMPLEMENTATION + +entity makeXonoticScreenshotList() +{ + entity me; + me = spawnXonoticScreenshotList(); + me.configureXonoticScreenshotList(me); + return me; +} + +void XonoticScreenshotList_configureXonoticScreenshotList(entity me) +{ + me.configureXonoticListBox(me); + me.getScreenshots(me); +} + +string XonoticScreenshotList_screenshotName(entity me, float i ) +{ + string s; + s = search_getfilename(me.listScreenshot, i); + s = substring(s, 12, strlen(s) - 12 - 4); // screenshots/, .jpg + return s; +} + +void XonoticScreenshotList_getScreenshots(entity me) +{ + string s; + + if(me.filterString) + //subdirectory in filterString allowed + s=strcat("screenshots/*", me.filterString, "*.jpg"); + else + s="screenshots/*.jpg"; + + //dprint("Search screenshots with the pattern ", s, "\n"); + if(me.listScreenshot >= 0) + search_end(me.listScreenshot); + me.listScreenshot = search_begin(s, FALSE, TRUE); + if(me.listScreenshot < 0) + me.nItems=0; + else + me.nItems=search_getsize(me.listScreenshot); +} + +void XonoticScreenshotList_destroy(entity me) +{ + search_end(me.listScreenshot); +} + +void XonoticScreenshotList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) +{ + me.itemAbsSize = '0 0 0'; + SUPER(XonoticScreenshotList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize); + + me.realFontSize_y = me.fontSize / (me.itemAbsSize_y = (absSize_y * me.itemHeight)); + me.realFontSize_x = me.fontSize / (me.itemAbsSize_x = (absSize_x * (1 - me.controlWidth))); + me.realUpperMargin = 0.5 * (1 - me.realFontSize_y); + + me.columnNameOrigin = me.realFontSize_x; + me.columnNameSize = 1 - 2 * me.realFontSize_x; +} + +void XonoticScreenshotList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +{ + string s; + if(isSelected) + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + + s = me.screenshotName(me,i); + s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize); + draw_Text(me.realUpperMargin * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0); +} + +void XonoticScreenshotList_showNotify(entity me) +{ + me.getScreenshots(me); +} + +void ScreenshotList_Filter_Change(entity box, entity me) +{ + if(me.filterString) + strunzone(me.filterString); + + if(box.text != "") + me.filterString = strzone(box.text); + else + me.filterString = string_null; + + me.getScreenshots(me); +} + +void XonoticScreenshotList_goScreenshot(entity me, float d) +{ + if(!me.screenshotViewerDialog) + return; + me.setSelected(me, me.selectedItem + d); + main.screenshotViewerDialog.loadScreenshot(main.screenshotViewerDialog, strcat("/screenshots/", me.screenshotName(me,me.selectedItem))); +} + +void XonoticScreenshotList_startScreenshot(entity me) +{ + main.screenshotViewerDialog.loadScreenshot(main.screenshotViewerDialog, strcat("/screenshots/", me.screenshotName(me,me.selectedItem))); + // pop up screenshot + DialogOpenButton_Click_withCoords(NULL, main.screenshotViewerDialog, me.origin + eX * (me.columnNameOrigin * me.size_x) + eY * ((me.itemHeight * me.selectedItem - me.scrollPos) * me.size_y), eY * me.itemAbsSize_y + eX * (me.itemAbsSize_x * me.columnNameSize)); +} + +void StartScreenshot_Click(entity btn, entity me) +{ + me.startScreenshot(me); +} + +void XonoticScreenshotList_clickListBoxItem(entity me, float i, vector where) +{ + if(i == me.lastClickedScreenshot) + if(time < me.lastClickedTime + 0.3) + { + // DOUBLE CLICK! + // pop up screenshot + me.setSelected(me, i); + me.startScreenshot(me); + } + me.lastClickedScreenshot = i; + me.lastClickedTime = time; +} + +float XonoticScreenshotList_keyDown(entity me, float scan, float ascii, float shift) +{ + if(scan == K_ENTER || scan == K_KP_ENTER) { + me.startScreenshot(me); + return 1; + } + else + return SUPER(XonoticScreenshotList).keyDown(me, scan, ascii, shift); +} +#endif -- 2.39.2