diff options
author | Max Horn | 2002-08-21 16:07:07 +0000 |
---|---|---|
committer | Max Horn | 2002-08-21 16:07:07 +0000 |
commit | ce46866403fdcc479cf9d67e4d430409b15dadc3 (patch) | |
tree | 75ebfaa1ed13f549959d76d3ce101c3e66f5451b /gui.cpp | |
parent | 662256f25dbe43abf67077a804e225738765f009 (diff) | |
download | scummvm-rg350-ce46866403fdcc479cf9d67e4d430409b15dadc3.tar.gz scummvm-rg350-ce46866403fdcc479cf9d67e4d430409b15dadc3.tar.bz2 scummvm-rg350-ce46866403fdcc479cf9d67e4d430409b15dadc3.zip |
Initial revision
svn-id: r4785
Diffstat (limited to 'gui.cpp')
-rw-r--r-- | gui.cpp | 1252 |
1 files changed, 0 insertions, 1252 deletions
diff --git a/gui.cpp b/gui.cpp deleted file mode 100644 index d80c6948c8..0000000000 --- a/gui.cpp +++ /dev/null @@ -1,1252 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001/2002 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * $Header$ - */ - -#include "stdafx.h" -#include "scumm.h" -#include "sound/mididrv.h" -#include "sound/imuse.h" -#include "gui.h" -#include "guimaps.h" -#include "config-file.h" - -#include <ctype.h> - -#define hline(x, y, x2, color) line(x, y, x2, y, color); -#define vline(x, y, y2, color) line(x, y, x, y2, color); - -#ifdef _WIN32_WCE -// Additional variables for WinCE specific GUI -#include "gapi_keys.h" -extern bool toolbar_drawn; -extern bool hide_toolbar; -extern bool draw_keyboard; -extern bool get_key_mapping; -extern struct keyops keyMapping; -extern void save_key_mapping(void); -extern void do_hide(bool); -extern void do_quit(); -uint16 _key_mapping_required; -uint16 _current_page; -bool keyboard_override; -bool save_hide_toolbar; -#else -#define save_key_mapping() ; -bool get_key_mapping; -uint16 _key_mapping_required; -#endif - -enum { - GUI_NONE = 0, - GUI_RESTEXT = 1, - GUI_IMAGE = 2, - GUI_STAT = 3, - GUI_CUSTOMTEXT = 4, - GUI_VARTEXT = 5, - GUI_ACTIONTEXT = 6, - GUI_KEYTEXT = 7, - GUI_SCROLLTEXT = 8, - GUI_NEXTTEXT = 9, - GUI_UPDOWNARROW = 10, - GUI_CHECKBOX = 11 -}; - -enum { - GWF_BORDER = 1, - GWF_CLEARBG = 2, - GWF_PARENT = 4, - GWF_DELAY = 8, - GWF_DEFAULT = GWF_BORDER | GWF_CLEARBG, - GWF_BUTTON = GWF_BORDER | GWF_CLEARBG | GWF_DELAY -}; - -struct GuiWidget { - byte _type; - byte _page; - byte _flags; - int16 _x, _y; - uint16 _w, _h; - uint16 _id; - byte _string_number; - uint8 _hotkey; -}; - -enum { - SAVELOAD_DIALOG, - PAUSE_DIALOG, - SOUND_DIALOG, - KEYS_DIALOG, - OPTIONS_DIALOG, - ABOUT_DIALOG, - LAUNCHER_DIALOG, - MISC_DIALOG -}; - - -#define IMG_SIZE 8 - -// Triangles pointing up-/downwards, used for save/load dialog -static uint32 up_arrow[IMG_SIZE] = { - 0x00011000, - 0x00011000, - 0x00100100, - 0x00100100, - 0x01000010, - 0x01000010, - 0x10000001, - 0x10000001, -}; - -static uint32 down_arrow[IMG_SIZE] = { - 0x10000001, - 0x10000001, - 0x01000010, - 0x01000010, - 0x00100100, - 0x00100100, - 0x00011000, - 0x00011000, -}; - -static uint32 checked_img[IMG_SIZE] = { - 0x00000000, - 0x01000010, - 0x00100100, - 0x00011000, - 0x00011000, - 0x00100100, - 0x01000010, - 0x00000000, -}; - -const GuiWidget launcher_dialog[] = { - {GUI_STAT, 0xFF, GWF_DEFAULT, 0, 0, 320, 200, 0, 0}, - {GUI_CUSTOMTEXT, 0x01, GWF_CLEARBG, 5, 180, 45, 15, 20, 12}, - {GUI_CUSTOMTEXT, 0x01, GWF_CLEARBG, 130, 180, 65, 15, 21, 17}, - {GUI_CUSTOMTEXT, 0x01, GWF_CLEARBG, 265, 180, 50, 15, 22, 7}, - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - -const GuiWidget keys_dialog[] = { - {GUI_STAT, 0xFF, GWF_DEFAULT, 30, 10, 260, 130, 0, 0}, - - // First action - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 10 + 10, 15, 15, 10, 3}, // CUSTOMTEXT_PLUS - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 10 + 10, 15, 15, 11, 4}, // CUSTOMTEXT_MINUS - {GUI_ACTIONTEXT, 0x01, GWF_BUTTON, 30 + 11 + 33 + 10, 10 + 10, 100, 15, 100, 1}, - {GUI_KEYTEXT, 0x01, 0, 30 + 11 + 33 + 120, 10 + 10 + 3, 100, 15, 1, 1}, - - //Second action - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 10 + 10 + 15 + 5, 15, 15, 20, 3}, // CUSTOMTEXT_PLUS - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 10 + 10 + 15 + 5, 15, 15, 21, 4}, // CUSTOMTEXT_MINUS - {GUI_ACTIONTEXT, 0x01, GWF_BUTTON, 30 + 10 + 33 + 10, 10 + 10 + 15 + 5, 100, 15, 101, 2}, - {GUI_KEYTEXT, 0x01, 0, 30 + 11 + 33 + 120, 10 + 10 + 15 + 5 + 3, 100, 15, 2, 2}, - - //Third action - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 10 + 10 + 15 + 5 + 15 + 5, 15, 15, 30, 3}, // CUSTOMTEXT_PLUS - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 10 + 10 + 15 + 5 + 15 + 5, 15, 15, 31, 4}, // CUSTOMTEXT_MINUS - {GUI_ACTIONTEXT, 0x01, GWF_BUTTON, 30 + 10 + 33 + 10, 10 + 10 + 15 + 5 + 15 + 5, 100, 15, 102, 3}, - {GUI_KEYTEXT, 0x01, 0, 30 + 11 + 33 + 120, 10 + 10 + 15 + 5 + 15 + 5 + 3, 100, 15, 3, 3}, - - //Fourth action - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5, 15, 15, 40, 3}, - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5, 15, 15, 41, 4}, - {GUI_ACTIONTEXT, 0x01, GWF_BUTTON, 30 + 10 + 33 + 10, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5, 100, 15, - 103, 4}, - {GUI_KEYTEXT, 0x01, 0, 30 + 11 + 33 + 120, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5 + 3, 100, 15, 4, 4}, - - //Fifth action - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5 + 15 + 5, 15, 15, - 50, 3}, - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5 + 15 + 5, 15, 15, - 51, 4}, - {GUI_ACTIONTEXT, 0x01, GWF_BUTTON, 30 + 10 + 33 + 10, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5 + 15 + 5, - 100, 15, 104, 5}, - {GUI_KEYTEXT, 0x01, 0, 30 + 11 + 33 + 120, 10 + 10 + 15 + 5 + 15 + 5 + 15 + 5 + 15 + 5 + 3, 100, - 15, 5, 5}, - - //OK - {GUI_RESTEXT, 0x01, GWF_BUTTON, 30 + 60, 10 + 106, 54, 16, 60, 9}, - //Previous-Next - {GUI_NEXTTEXT, 0x01, GWF_BUTTON, 30 + 120, 10 + 106, 54, 16, 61, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - -const GuiWidget about_dialog[] = { - {GUI_STAT, 0xFF, GWF_DEFAULT, 30, 10, 260, 134, 0, 0}, - {GUI_CUSTOMTEXT, 0x01, 0, 30 + 68, 10 + 20, 160, 15, 0, 9}, // Build - {GUI_CUSTOMTEXT, 0x01, 0, 30 + 10, 10 + 35, 240, 15, 0, 10}, // ScummVM Url - {GUI_CUSTOMTEXT, 0x01, 0, 30 + 75, 10 + 65, 150, 15, 0, 11}, // Lucasarts - {GUI_CUSTOMTEXT, 0x01, 0, 30 + 110, 10 + 80, 40, 15, 0, 21}, // Except: - {GUI_CUSTOMTEXT, 0x01, 0, 30 + 25, 10 + 95, 210, 15, 0, 22}, // Adventuresoft - {GUI_SCROLLTEXT, 0x01, 0, 30 + 95, 10 + 10, 100, 15, 0}, - {GUI_RESTEXT, 0x01, GWF_BUTTON, 30 + 100, 10 + 112, 54, 16, 40, 9}, - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - -const GuiWidget options_dialog[] = { - // Only display the "Keys" options for WinCE -#ifdef _WIN32_WCE - {GUI_STAT, 0xFF, GWF_DEFAULT, 50, 80, 210, 60, 0, 0}, - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10, 80 + 10, 40, 15, 1, 5, 'S'}, // Sound - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10 + 40 + 30, 80 + 10, 40, 15, 2, 6, 'K'}, // Keys - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10 + 40 + 30 + 40 + 30, 80 + 10, 40, 15, 3, 7, 'A'}, // About - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10, 80 + 10 + 15 + 10, 40, 15, 4, 18, 'M'}, // Misc - {0, 0, 0, 0, 0, 0, 0, 0, 0} -#else - {GUI_STAT, 0xFF, GWF_DEFAULT, 50, 80, 210, 40, 0, 0}, - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10, 80 + 10, 40, 15, 1, 5, 'S'}, // Sound - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10 + 40 + 30, 80 + 10, 40, 15, 3, 7, 'A'}, // About - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 50 + 10 + 40 + 30 + 40 + 30, 80 + 10, 40, 15, 4, 18, 'M'}, // Misc - {0, 0, 0, 0, 0, 0, 0, 0, 0} -#endif -}; - -const GuiWidget misc_dialog[] = { - {GUI_STAT, 0xFF, GWF_DEFAULT, 50, 80, 210, 65, 0, 0}, - {GUI_CHECKBOX, 0x01, GWF_DEFAULT, 50 + 10, 80 + 6, 14, 14, 1, 0, 'S'}, // checkbox for subtitles - {GUI_CUSTOMTEXT, 0x01, 0, 50 + 10 + 20, 80 + 10, 140, 15, 0, 19}, // "Show speech subtitles" - {GUI_CHECKBOX, 0x01, GWF_DEFAULT, 50 + 10, 80 + 6 + 16, 14, 14, 5, 0, 'A'}, // checkbox for amiga pallete - {GUI_CUSTOMTEXT, 0x01, 0, 50 + 10 + 20, 80 + 10 + 15, 140, 15, 0, 20}, // "Amiga pallete conversion" - {GUI_RESTEXT, 0x01, GWF_BUTTON, 50 + 10 + 20, 80 + 10 + 15 + 20, 54, 16, 3, 9, 13}, // ok - {GUI_RESTEXT, 0x01, GWF_BUTTON, 50 + 10 + 20 + 80, 80 + 10 + 15 + 20, 54, 16, 4, 7}, // cancel - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - -const GuiWidget sound_dialog[] = { - {GUI_STAT, 0xFF, GWF_DEFAULT, 30, 20, 260, 120, 0, 0}, - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 20 + 11, 15, 15, 1, 3}, // Plus - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 20 + 11, 15, 15, 2, 4}, // Minus - {GUI_VARTEXT, 0x01, GWF_DEFAULT, 30 + 73, 20 + 11, 128, 15, 3, 0}, // Master - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 20 + 25 + 11, 15, 15, 11, 3}, // Plus - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 20 + 25 + 11, 15, 15, 12, 4}, // Minus - {GUI_VARTEXT, 0x01, GWF_BUTTON, 30 + 73, 20 + 25 + 11, 128, 15, 13, 1}, // Music - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 11, 20 + 25 + 25 + 11, 15, 15, 21, 3}, // Plus - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 30 + 33, 20 + 25 + 25 + 11, 15, 15, 22, 4}, // Minus - {GUI_VARTEXT, 0x01, GWF_BUTTON, 30 + 73, 20 + 25 + 25 + 11, 128, 15, 23, 2}, // SFX - {GUI_RESTEXT, 0x01, GWF_BUTTON, 30 + (260 / 2) - 80, 20 + 25 + 25 + 11 + 25, 54, 16, 40, 9, 13}, /* OK */ - {GUI_RESTEXT, 0x01, GWF_BUTTON, 30 + (260 / 2), 20 + 25 + 25 + 11 + 25, 54, 16, 50, 7}, /* Cancel */ - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - -const GuiWidget save_load_dialog[] = { - {GUI_STAT, 0xFF, GWF_DEFAULT | GWF_PARENT, 30, 20, 260, 124, 0, 0}, - {GUI_RESTEXT, 0x01, 0, 10, 7, 240, 16, 0, 1}, /* How may I serve you? */ - {GUI_RESTEXT, 0x02, 0, 10, 7, 240, 16, 0, 2}, /* Select a game to LOAD */ - {GUI_RESTEXT, 0x04, 0, 10, 7, 240, 16, 0, 3}, /* Name your SAVE game */ - - {GUI_STAT, 0xFF, GWF_DEFAULT, 6, 20, 170, 96, 0, 0}, - {GUI_UPDOWNARROW, 0x01, GWF_BUTTON, 180, 24, 16, 40, 0, 0}, /* Up (dummy) */ - {GUI_UPDOWNARROW, 0x01, GWF_BUTTON, 180, 72, 16, 40, 0, 1}, /* Down (dummy) */ - {GUI_UPDOWNARROW, 0xFE, GWF_BUTTON, 180, 24, 16, 40, 1, 0}, /* Up */ - {GUI_UPDOWNARROW, 0xFE, GWF_BUTTON, 180, 72, 16, 40, 2, 1}, /* Down */ - - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 24, 160, 10, 20, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 34, 160, 10, 21, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 44, 160, 10, 22, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 54, 160, 10, 23, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 64, 160, 10, 24, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 74, 160, 10, 25, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 84, 160, 10, 26, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 94, 160, 10, 27, 0}, - {GUI_RESTEXT, 0x06, GWF_CLEARBG, 10, 104, 160, 10, 28, 0}, - - {GUI_RESTEXT, 0x01, GWF_BUTTON, 200, 20, 54, 16, 3, 4, 'S'}, /* Save */ - {GUI_RESTEXT, 0x01, GWF_BUTTON, 200, 40, 54, 16, 4, 5, 'L'}, /* Load */ - {GUI_RESTEXT, 0x01, GWF_BUTTON, 200, 60, 54, 16, 5, 6, 'P'}, /* Play */ - {GUI_CUSTOMTEXT, 0x01, GWF_BUTTON, 200, 80, 54, 16, 9, 17, 'O'}, /* Options */ - {GUI_RESTEXT, 0x01, GWF_BUTTON, 200, 100, 54, 16, 6, 8, 'Q'}, /* Quit */ - - {GUI_RESTEXT, 0x02, GWF_BUTTON, 200, 60, 54, 16, 7, 7}, /* Cancel */ - - {GUI_RESTEXT, 0x04, GWF_BUTTON, 200, 40, 54, 16, 8, 9}, /* Ok */ - {GUI_RESTEXT, 0x04, GWF_BUTTON, 200, 60, 54, 16, 7, 7}, /* Cancel */ - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - -const GuiWidget pause_dialog[] = { - {GUI_RESTEXT, 0x01, GWF_DEFAULT, 50, 80, 220, 16, 0, 10}, - {0, 0, 0, 0, 0, 0, 0, 0, 0} -}; - - -void Gui::draw(int start, int end) -{ - int i; - - if (end == -1) - end = start; - - for (i = 0; i < (int)(sizeof(_widgets) / sizeof(_widgets[0])); i++) { - const GuiWidget *w = _widgets[i]; - if (w) { - _parentX = 0; - _parentY = 0; - while (w->_type != GUI_NONE) { - if (w->_id >= start && w->_id <= end && (w->_page & (1 << _cur_page))) { - drawWidget(w); - } - if (w->_flags & GWF_PARENT) { - _parentX += w->_x; - _parentY += w->_y; - } - w++; - } - } - } -} - -const GuiWidget *Gui::widgetFromPos(int x, int y) -{ - int i; - - for (i = sizeof(_widgets) / sizeof(_widgets[0]) - 1; i >= 0; i--) { - const GuiWidget *w = _widgets[i]; - if (w) { - while (w->_type != GUI_NONE) { - if ((w->_page & (1 << _cur_page)) && w->_id && - (uint16)(x - w->_x) < w->_w && (uint16)(y - w->_y) < w->_h) - return w; - if (w->_flags & GWF_PARENT) { - x -= w->_x; - y -= w->_y; - } - w++; - } - } - } - return NULL; -} - -void Gui::drawChar(const char str, int xx, int yy) -{ - unsigned int buffer = 0, mask = 0, x, y; - byte *tmp; - int tempc = _color; - _color = _textcolor; - - tmp = &guifont[0]; - tmp += 224 + (str + 1) * 8; - - byte *ptr = getBasePtr(xx, yy); - if (ptr == NULL) - return; - - for (y = 0; y < 8; y++) { - for (x = 0; x < 8; x++) { - unsigned char color; - if ((mask >>= 1) == 0) { - buffer = *tmp++; - mask = 0x80; - } - color = ((buffer & mask) != 0); - if (color) - ptr[x] = _color; - } - ptr += 320; - } - _color = tempc; - -} -void Gui::drawString(const char *str, int x, int y, int w, byte color, bool center) -{ - StringTab *st = &_s->string[5]; - st->charset = 1; - st->center = center; - st->color = color; - st->xpos = x; - st->ypos = y; - st->right = x + w; - - if (_s->_gameId) { /* If a game is active.. */ - _s->_messagePtr = (byte *)str; - _s->drawString(5); - } else { - for (uint letter = 0; letter < strlen(str); letter++) - drawChar(str[letter], st->xpos + (letter * 8), st->ypos); - } -} - -void Gui::drawWidget(const GuiWidget *w) -{ - const char *s; - int x, y; - - x = w->_x; - y = w->_y; - - if (w->_flags & GWF_CLEARBG) - widgetClear(w); - - if (w->_flags & GWF_BORDER) { - widgetBorder(w); - x += 4; - y += 4; - } - - switch (w->_type) { - case GUI_CUSTOMTEXT: - case GUI_VARTEXT: - case GUI_KEYTEXT: - case GUI_ACTIONTEXT: - case GUI_RESTEXT: - case GUI_NEXTTEXT: - { - char text[500]; - text[0] = '\0'; - - switch (w->_type) { - case GUI_CUSTOMTEXT: - strcpy(text, string_map_table_custom[w->_string_number]); - break; - case GUI_RESTEXT: - s = queryString(w->_string_number, w->_id); - if (s) - strcpy(text, s); - break; - case GUI_VARTEXT: - sprintf(text, "%s %d", string_map_table_custom[w->_string_number], - _gui_variables[w->_string_number]); - break; - case GUI_SCROLLTEXT: - sprintf(text, "%s", _gui_scroller); - break; -#ifdef _WIN32_WCE - case GUI_KEYTEXT: - strcpy(text, getGAPIKeyName(getAction((_current_page * 5) + w->_string_number - 1)->action_key)); - break; - case GUI_ACTIONTEXT: - strcpy(text, getActionName(getAction((_current_page * 5) + w->_string_number - 1)->action_type)); - break; - case GUI_NEXTTEXT: - if (_current_page == 0) - strcpy(text, "Next"); - else - strcpy(text, "Prev"); - break; - -#endif - } - - if (*text) { - drawString(text, x + _parentX, y + _parentY, w->_w, - (_clickWidget && _clickWidget == w->_id) ? _textcolorhi : _textcolor, false); - } - break; - } - case GUI_IMAGE: - break; - case GUI_UPDOWNARROW: - case GUI_CHECKBOX: - { - uint32 *data; - byte color = (_clickWidget && _clickWidget == w->_id) ? _textcolorhi : _textcolor; - - if (w->_type == GUI_UPDOWNARROW) { - if (w->_string_number == 0) - data = up_arrow; - else - data = down_arrow; - // if not an updownarrow, it must be a checkbox - } else { - data = checked_img; - } - - // Center the image - x += w->_w / 2 - IMG_SIZE / 2; - y += w->_h / 2 - IMG_SIZE / 2; - if (w->_flags & GWF_BORDER) { - x -= 4; - y -= 4; - } - - byte *ptr = getBasePtr(x, y); - if (ptr == NULL) - return; - - // If the checkbox is checked, or this is not a checkbox, draw the image - if ((getCheckboxChecked(w->_id) == true) || (w->_type != GUI_CHECKBOX)) { - for (int y2 = 0; y2 < IMG_SIZE; y2++) { - uint32 mask = 0xF0000000; - for (int x2 = 0; x2 < IMG_SIZE; x2++) { - if (data[y2] & mask) - ptr[x2] = color; - mask >>= 4; - } - ptr += 320; - } - } - } - break; - } -} - -void Gui::widgetClear(const GuiWidget *wid) -{ - int x = wid->_x; - int y = wid->_y; - int w = wid->_w; - int h = wid->_h; - int i; - - byte *ptr = getBasePtr(x, y); - if (ptr == NULL) - return; - - _s->setVirtscreenDirty(_vs, x + _parentX, y + _parentY, x + _parentX + w, y + _parentY + h); - - if (wid->_flags & GWF_BORDER) { - // Inset by 1 pixel in all directions - ptr += 320 + 1; - w -= 2; - h -= 2; - } - - while (h--) { - for (i = 0; i < w; i++) - ptr[i] = _bgcolor; - ptr += 320; - } -} - -void Gui::widgetBorder(const GuiWidget *w) -{ - box(w->_x, w->_y, w->_w, w->_h); -} - -void Gui::box(int x, int y, int width, int height) -{ - hline(x + 1, y, x + width - 2, _color); - hline(x, y + 1, x + width - 1, _color); - vline(x, y + 1, y + height - 2, _color); - vline(x + 1, y, y + height - 1, _color); - - hline(x + 1, y + height - 2, x + width - 1, _shadowcolor); - hline(x + 1, y + height - 1, x + width - 2, _shadowcolor); - vline(x + width - 1, y + 1, y + height - 2, _shadowcolor); - vline(x + width - 2, y + 1, y + height - 1, _shadowcolor); -} - -byte *Gui::getBasePtr(int x, int y) -{ - x += _parentX; - y += _parentY; - _vs = _s->findVirtScreen(y); - - if (_vs == NULL) - return NULL; - - return _vs->screenPtr + x + (y - _vs->topline) * 320 + - _s->_screenStartStrip * 8 + (_s->camera._cur.y - 100) * 320; -} - -void Gui::line(int x, int y, int x2, int y2, byte color) -{ - byte *ptr; - - if (x2 < x) - x2 ^= x ^= x2 ^= x; // Swap x2 and x - - if (y2 < y) - y2 ^= y ^= y2 ^= y; // Swap y2 and y - - ptr = getBasePtr(x, y); - - if (ptr == NULL) - return; - - if (x == x2) { - /* vertical line */ - while (y++ <= y2) { - *ptr = color; - ptr += 320; - } - } else if (y == y2) { - /* horizontal line */ - while (x++ <= x2) { - *ptr++ = color; - } - } -} - -void Gui::leftMouseClick(int x, int y) -{ - const GuiWidget *w = widgetFromPos(x, y); - int old; - - _clickTimer = 0; - - old = _clickWidget; - _clickWidget = w ? w->_id : 0; - - if (old) - draw(old); - if (_clickWidget) { - draw(_clickWidget); - if (w->_flags & GWF_DELAY) - _clickTimer = 5; - else - handleCommand(_clickWidget); - } - - if (_dialog == PAUSE_DIALOG) - close(); -} - -void Gui::handleSoundDialogCommand(int cmd) -{ - if (cmd == 50) { - close(); - } else if (cmd == 40) { - _s->_sound->_sound_volume_master = _gui_variables[0]; // Master - _s->_sound->_sound_volume_music = _gui_variables[1]; // Music - _s->_sound->_sound_volume_sfx = _gui_variables[2]; // SFX - - _s->_imuse->set_music_volume(_s->_sound->_sound_volume_music); - _s->_imuse->set_master_volume(_s->_sound->_sound_volume_master); - _s->_mixer->set_volume(_s->_sound->_sound_volume_sfx); - _s->_mixer->set_music_volume(_s->_sound->_sound_volume_music); - - scummcfg->set("master_volume", _s->_sound->_sound_volume_master); - scummcfg->set("music_volume", _s->_sound->_sound_volume_music); - scummcfg->set("sfx_volume", _s->_sound->_sound_volume_sfx); - scummcfg->flush(); - - close(); - } else { - if ((cmd % 10) == 1) { - _gui_variables[cmd / 10] += 5; - if (_gui_variables[cmd / 10] > 256) - _gui_variables[cmd / 10] = 256; - } else { - _gui_variables[cmd / 10] -= 5; - if (_gui_variables[cmd / 10] < 0) - _gui_variables[cmd / 10] = 0; - } - - draw((cmd / 10) * 10 + 3, (cmd / 10) * 10 + 3); - } -} - -void Gui::handleOptionsDialogCommand(int cmd) -{ - switch (cmd) { - case 1: - _widgets[0] = sound_dialog; - _gui_variables[0] = _s->_sound->_sound_volume_master; - _gui_variables[1] = _s->_sound->_sound_volume_music; - _gui_variables[2] = _s->_sound->_sound_volume_sfx; - _active = true; - _cur_page = 0; - _dialog = SOUND_DIALOG; - draw(0, 100); - return; - case 2: - _key_mapping_required = 0; - get_key_mapping = true; - _widgets[0] = keys_dialog; - _active = true; - _cur_page = 0; - _dialog = KEYS_DIALOG; - draw(0, 200); - return; - case 3: - _widgets[0] = about_dialog; - _active = true; - _cur_page = 0; - _return_to = 0; - _dialog = ABOUT_DIALOG; - draw(0, 100); - return; - case 4: - _widgets[0] = misc_dialog; - _active = true; - _cur_page = 0; - _return_to = 0; - _dialog = MISC_DIALOG; - clearCheckboxes(); - setCheckbox(!(_s->_noSubtitles), 1); - if (_s->_features & GF_AMIGA) - setCheckbox(true, 5); - else - setCheckbox(false, 5); - draw(0, 100); - return; - } -} - -void Gui::handleMiscDialogCommand(int cmd) -{ - switch (cmd) { - case 1: - if ((getCheckboxChecked(1)) == true) - setCheckbox(false, 1); - else - setCheckbox(true, 1); - draw(1, 1); - return; - case 5: - if (getCheckboxChecked(5) == true) - setCheckbox(false, 5); - else - setCheckbox(true, 5); - draw(5, 5); - return; - case 3: - case 4: - // OK button - perform the actions of the checkboxes - if (cmd == 3) { - // The opposite of the checkbox(1) is set because the internal variable is 'no subtitles' but - // a "Show subtitles" option makes more usability sense - _s->_noSubtitles = (!getCheckboxChecked(1)); - - // Amiga pallete conversion checkbox - if (getCheckboxChecked(5)) - _s->_features = _s->_features | GF_AMIGA; - else - _s->_features = _s->_features & ~GF_AMIGA; - _s->_fullRedraw = true; - } - close(); - } -} - -void Gui::handleKeysDialogCommand(int cmd) -{ -#ifdef _WIN32_WCE - if (cmd < 100 && cmd != 60 && cmd != 61) { - - if ((cmd % 10) == 1) - setNextType((_current_page * 5) + (cmd / 10) - 1); - else - setPreviousType((_current_page * 5) + (cmd / 10) - 1); - - draw(0, 200); - - return; - } - - if (cmd >= 100) - _key_mapping_required = cmd; - - if (cmd == 60) { - get_key_mapping = false; - save_key_mapping(); - close(); - } - - if (cmd == 61) { - if (!_current_page) - _current_page = 1; - else - _current_page = 0; - draw(0, 200); - return; - } -#else - close(); -#endif -} - -void Gui::handleLauncherDialogCommand(int cmd) -{ - debug(9, "handle launcher command\n"); - switch (cmd) { - case 20: - close(); - break; - case 21: - // Nothing yet - break; - case 22: - _widgets[0] = about_dialog; - _active = true; - _cur_page = 0; - _return_to = LAUNCHER_DIALOG; - _dialog = ABOUT_DIALOG; - draw(0, 100); - debug(9, "about dialog\n"); - break; - default: - debug(9, "default\n"); - close(); - } -} - -void Gui::handleCommand(int cmd) -{ - int lastEdit = _editString; - showCaret(false); - - switch (_dialog) { - case LAUNCHER_DIALOG: - handleLauncherDialogCommand(cmd); - return; - case SOUND_DIALOG: - handleSoundDialogCommand(cmd); - return; - case OPTIONS_DIALOG: - handleOptionsDialogCommand(cmd); - return; - case MISC_DIALOG: - handleMiscDialogCommand(cmd); - return; - case KEYS_DIALOG: - handleKeysDialogCommand(cmd); - return; - case ABOUT_DIALOG: - if (_return_to == LAUNCHER_DIALOG) { - _widgets[0] = launcher_dialog; - _active = true; - _cur_page = 0; - _dialog = LAUNCHER_DIALOG; - draw(0, 100); - } else - close(); - return; - } - - // If we get here, it's the SAVELOAD_DIALOG - - switch (cmd) { - case 1: /* up button */ - if (_slotIndex - 9 < 0) - return; - getSavegameNames(_slotIndex - 9); - draw(20, 28); - return; - case 2: /* down button */ - if (_slotIndex + 9 > 80) - return; - getSavegameNames(_slotIndex + 9); - draw(20, 28); - return; - case 3: /* save button */ - _cur_page = 2; - getSavegameNames(1); /* Start at 1, since slot 0 is reserved for autosave */ - draw(0, 100); - return; - case 4: /* load button */ - _cur_page = 1; - getSavegameNames(0); - draw(0, 100); - return; - case 5: /* play button */ - close(); - return; - case 6: /* quit button */ -#ifdef _WIN32_WCE - do_quit(); -#endif - exit(1); - return; - case 7: /* cancel button */ - _cur_page = 0; - draw(0, 100); - return; - case 8: /* ok button (save game) */ - if (lastEdit == -1 || game_names[lastEdit][0] == 0) - return; - - _s->_saveLoadSlot = lastEdit + _slotIndex; - _s->_saveLoadCompatible = false; - _s->_saveLoadFlag = 1; - memcpy(_s->_saveLoadName, game_names[lastEdit], sizeof(_s->_saveLoadName)); - close(); - return; - case 9: /* options button */ - options(); - draw(0, 100); - return; - default: - if (cmd >= 20 && cmd <= 28) { - if (_cur_page == 1) { - if (valid_games[cmd - 20]) { - _s->_saveLoadSlot = cmd - 20 + _slotIndex; - _s->_saveLoadCompatible = false; - _s->_saveLoadFlag = 2; - close(); - } - return; - } else if (_cur_page == 2) { - _clickWidget = cmd; - editString(cmd - 20); - } - } - } - -} - -void Gui::getSavegameNames(int start) -{ - int i; - _slotIndex = start; - - for (i = 0; i < 9; i++) { - valid_games[i] = _s->getSavegameName(start + i, game_names[i]); - } -} - -const char *Gui::queryString(int stringno, int id) -{ - static char namebuf[64]; - char *result; - int string; - - if (id >= 20 && id <= 28) { - // Save game names - sprintf(namebuf, "%2d. %s", id - 20 + _slotIndex, game_names[id - 20]); - return namebuf; - } - - if (stringno == 0) - return NULL; - - if (_s->_features & GF_AFTER_V7) - string = _s->_vars[string_map_table_v7[stringno - 1].num]; - else if (_s->_features & GF_AFTER_V6) - string = _s->_vars[string_map_table_v6[stringno - 1].num]; - else - string = string_map_table_v5[stringno - 1].num; - - result = (char *)_s->getStringAddress(string); - - if (!result) { // Gracelessly degrade to english :) - if (_s->_features & GF_AFTER_V6) - return string_map_table_v6[stringno - 1].string; - else - return string_map_table_v5[stringno - 1].string; - } - - return result; -} - -void Gui::showCaret(bool show) -{ - int i; - char *s; - - if (_editString == -1) - return; - - i = _editLen; - s = game_names[_editString]; - - if (show) { - if (i < SAVEGAME_NAME_LEN - 1) { - s[i] = '_'; - s[i + 1] = 0; - } - } else { - s[i] = 0; - } - - draw(_editString + 20); - - if (!show) - _editString = -1; -} - -void Gui::editString(int i) -{ - char *s = game_names[i]; - if (!valid_games[i]) { - valid_games[i] = true; - *s = 0; - } - _editString = i; - _editLen = strlen(s); - showCaret(true); -} - -void Gui::addLetter(byte letter) -{ - switch (_dialog) { - case SAVELOAD_DIALOG: - if (_editString == -1) - return; - -/* - FIXME - this code here has no effect at all, since Scumm::convertKeysToClicks() - swallows all return key events. - // Return pressed? - if (letter == '\n' || letter == '\r') { - handleCommand(8); - return; - } -*/ - - if (letter >= 32 && letter < 128 && _editLen < SAVEGAME_NAME_LEN - 1) { - game_names[_editString][_editLen++] = letter; - } else if (letter == 8 && _editLen > 0) { - _editLen--; - } - showCaret(true); - break; - case PAUSE_DIALOG: - if (letter == 32) - close(); - break; - -#ifdef _WIN32_WCE - case KEYS_DIALOG: - clearActionKey(letter); - if (_key_mapping_required) - getAction((_current_page * 5) + _key_mapping_required - 100)->action_key = letter; - _key_mapping_required = 0; - draw(0, 200); - break; -#endif - } -} - -bool Gui::getCheckboxChecked(int id) -{ - return _cbox_checked[id]; -} - -void Gui::setCheckbox(bool state, int id) -{ - _cbox_checked[id] = state; -} - -void Gui::clearCheckboxes() -{ - for (int id = 0; id <= 100; id++) { - _cbox_checked[id] = false; - } -} - -void Gui::init(Scumm *s) -{ - /* Default GUI colors */ - _bgcolor = 0; - _color = 0; - _textcolor = 8; // 15 is nice - _textcolorhi = 15; - _shadowcolor = 0; - _s = s; - - strcpy(_gui_scroller, "Brought to you by:"); -} - -void Gui::loop() -{ - if (_active && !_inited) { - _inited = true; - draw(0, 200); // was 100 - _old_soundsPaused = _s->_sound->_soundsPaused; - _s->_sound->pauseSounds(true); - - // Backup old cursor - memcpy(_old_grabbedCursor, _s->_grabbedCursor, sizeof(_old_grabbedCursor)); - _old_cursorWidth = _s->_cursorWidth; - _old_cursorHeight = _s->_cursorHeight; - _old_cursorHotspotX = _s->_cursorHotspotX; - _old_cursorHotspotY = _s->_cursorHotspotY; - _old_cursor_mode = _s->_system->show_mouse(true); - - _s->_cursorAnimate++; - _s->gdi._cursorActive = 1; - } - _s->animateCursor(); - _s->getKeyInput(0); - if (_s->_mouseButStat & MBS_LEFT_CLICK) { - leftMouseClick(_s->mouse.x, _s->mouse.y); - } else if (_s->_lastKeyHit) { - if (_dialog != KEYS_DIALOG) { - if (_s->_lastKeyHit == 27) - close(); - else { - addLetter((unsigned char)_s->_lastKeyHit); - checkHotKey(_s->_lastKeyHit); - } -#ifdef _WIN32_WCE - } else if (_s->_lastKeyHit > 1000) { // GAPI - addLetter(_s->_lastKeyHit - 1000); -#endif - } - } - - if (_clickTimer && !--_clickTimer) { - int old = _clickWidget; - _clickWidget = 0; - draw(old); - handleCommand(old); - } - - _s->drawDirtyScreenParts(); - _s->_mouseButStat = 0; -} - -void Gui::close() -{ - _s->_fullRedraw = true; - _s->_completeScreenRedraw = true; - _s->_cursorAnimate--; - - // Restore old cursor - memcpy(_s->_grabbedCursor, _old_grabbedCursor, sizeof(_old_grabbedCursor)); - _s->_cursorWidth = _old_cursorWidth; - _s->_cursorHeight = _old_cursorHeight; - _s->_cursorHotspotX = _old_cursorHotspotX; - _s->_cursorHotspotY = _old_cursorHotspotY; - _s->updateCursor(); - - _s->_system->show_mouse(_old_cursor_mode); - - _s->_sound->pauseSounds(_old_soundsPaused); - _active = false; - _inited = false; - -#ifdef _WIN32_WCE - - // Option dialog can be accessed from the file dialog now, always check - if (save_hide_toolbar) { - do_hide(true); - save_hide_toolbar = false; - } - if (keyboard_override) { - keyboard_override = false; - draw_keyboard = false; - toolbar_drawn = false; - } -#endif -} - -void Gui::checkHotKey(int keycode) -{ - byte page; - for (int i = 0; i < (int)(sizeof(_widgets) / sizeof(_widgets[0])); i++) { - const GuiWidget *w = _widgets[i]; - if (w) { - while (w->_type != GUI_NONE) { - - // This rubbish is needed because the current page is 0 when really it should be 1 - if (_cur_page == 0) - page = 1; - else - page = _cur_page; - - // Only check for widgets that are on the current GUI page (otherwise save dialog problems occur) - if (w->_page == page) { - // Check the actual key pressed, and the uppercase version. For people who have caps lock on - if (keycode == w->_hotkey || toupper(keycode) == w->_hotkey) - handleCommand(w->_id); - } - w++; - } - } - } -} - -void Gui::saveLoadDialog() -{ - _widgets[0] = save_load_dialog; - _editString = -1; - _active = true; - _cur_page = 0; - _dialog = SAVELOAD_DIALOG; - -#ifdef _WIN32_WCE - save_hide_toolbar = hide_toolbar; - if (save_hide_toolbar) { - // Display the keyboard while the dialog is running - do_hide(false); - } - if (!draw_keyboard) { - keyboard_override = true; - draw_keyboard = true; - toolbar_drawn = false; - } -#endif - -} - -void Gui::pause() -{ - _widgets[0] = pause_dialog; - _active = true; - _cur_page = 0; - _dialog = PAUSE_DIALOG; -} - -void Gui::options() -{ -#ifdef _WIN32_WCE - _current_page = 0; -#endif - _widgets[0] = options_dialog; - _active = true; - _cur_page = 0; - _dialog = OPTIONS_DIALOG; -} - -void Gui::launcher() -{ - _widgets[0] = launcher_dialog; - _active = true; - _cur_page = 0; - _dialog = LAUNCHER_DIALOG; -} - - - - - - - - - - - - - - - - - - -/* -void Gui::loop() -{ - if (_active && !_inited) { - _inited = true; - _old_soundsPaused = _s->_soundsPaused; - _s->pauseSounds(true); - - // Backup old cursor - memcpy(_old_grabbedCursor, _s->_grabbedCursor, sizeof(_old_grabbedCursor)); - _old_cursorWidth = _s->_cursorWidth; - _old_cursorHeight = _s->_cursorHeight; - _old_cursorHotspotX = _s->_cursorHotspotX; - _old_cursorHotspotY = _s->_cursorHotspotY; - _old_cursor_mode = _s->_system->show_mouse(true); - - _s->_cursorAnimate++; - _s->gdi._cursorActive = 1; - } - _s->animateCursor(); - _s->getKeyInput(0); - - _s->drawDirtyScreenParts(); - _s->_mouseButStat = 0; -} -*/ |