aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx/gfx_gui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx/gfx_gui.cpp')
-rw-r--r--engines/sci/gfx/gfx_gui.cpp666
1 files changed, 0 insertions, 666 deletions
diff --git a/engines/sci/gfx/gfx_gui.cpp b/engines/sci/gfx/gfx_gui.cpp
deleted file mode 100644
index 2cfe0f3a39..0000000000
--- a/engines/sci/gfx/gfx_gui.cpp
+++ /dev/null
@@ -1,666 +0,0 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include "sci/sci.h" // for INCLUDE_OLDGFX
-#ifdef INCLUDE_OLDGFX
-
-#include "sci/engine/state.h"
-#include "sci/gfx/operations.h"
-#include "sci/gfx/gfx_widgets.h"
-#include "sci/gfx/menubar.h"
-#include "sci/gfx/gfx_gui.h"
-#include "sci/gfx/gfx_state_internal.h"
-#include "sci/gui32/font.h"
-#include "sci/gui/gui_animate.h"
-
-#include "common/system.h"
-
-namespace Sci {
-
-#define SCI_SPECIAL_CHAR_ARROW_UP 0x18
-#define SCI_SPECIAL_CHAR_ARROW_DOWN 0x19
-
-static void clear_titlebar(GfxPort *titlebar) {
- if (titlebar->_contents) {
- delete titlebar->_contents;
- titlebar->_contents = NULL;
- titlebar->_nextpp = &(titlebar->_contents);
- }
-}
-
-static GfxList *make_titlebar_list(EngineState *s, rect_t bounds, GfxPort *status_bar) {
- gfx_color_t color = status_bar->_bgcolor;
- GfxList *list;
- GfxBox *bgbox;
-
-
- list = gfxw_new_list(status_bar->_bounds, 0);
- bgbox = gfxw_new_box(s->gfx_state, gfx_rect(0, 0, status_bar->_bounds.width, status_bar->_bounds.height - 1),
- color, color, GFX_BOX_SHADE_FLAT);
-
- list->add((GfxContainer *) list, (GfxWidget *) bgbox);
-
- return list;
-}
-
-static GfxList *finish_titlebar_list(EngineState *s, GfxList *list, GfxPort *status_bar) {
- gfx_color_t black = s->ega_colors[0];
- GfxPrimitive *line;
-
- line = gfxw_new_line(Common::Point(0, status_bar->_bounds.height - 1), Common::Point(status_bar->_bounds.width, status_bar->_bounds.height - 1),
- black, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL);
- list->add((GfxContainer *)list, (GfxWidget *)line);
-
- return list;
-}
-
-void sciw_set_status_bar(EngineState *s, GfxPort *status_bar, const Common::String &text, int fgcolor, int bgcolor) {
- GfxState *state;
- GfxList *list;
- gfx_color_t bg = status_bar->_bgcolor;
- gfx_color_t fg = status_bar->_color;
- gfx_color_t black = s->ega_colors[0];
-
- if (!status_bar->_visual) {
- error("Attempt to change title bar without visual");
- return;
- }
-
- state = status_bar->_visual->_gfxState;
-
- if (!state) {
- error("Attempt to change title bar with stateless visual");
- return;
- }
-
- clear_titlebar(status_bar);
-
- if (!text.empty()) {
- GfxText *textw = gfxw_new_text(state, gfx_rect(0, 0, status_bar->_bounds.width, status_bar->_bounds.height),
- status_bar->_font, text.c_str(), ALIGN_LEFT, ALIGN_CENTER,
- fg, fg, bg, kFontNoNewlines);
-
- list = make_titlebar_list(s, status_bar->_bounds, status_bar);
-
- list->add((GfxContainer *)list, (GfxWidget *)textw);
-
- } else {
- GfxBox *bgbox = gfxw_new_box(state, gfx_rect(0, 0, status_bar->_bounds.width, status_bar->_bounds.height - 1),
- black, black, GFX_BOX_SHADE_FLAT);
-
- list = gfxw_new_list(status_bar->_bounds, 0);
-
- list->add((GfxContainer *)list, (GfxWidget *)bgbox);
- }
-
- list->add((GfxContainer *)status_bar, list);
- finish_titlebar_list(s, list, status_bar);
-
- status_bar->draw(gfxw_point_zero);
- gfxop_update(state);
-}
-
-static void sciw_make_window_fit(rect_t *rect, GfxPort *parent) {
- // This window is meant to cover the whole screen, so we allow it to go through.
- if (rect->width == 319 && rect->height == 189)
- return;
-
- if (rect->x + rect->width > parent->_bounds.x + parent->_bounds.width)
- rect->x -= (rect->x + rect->width) - (parent->_bounds.x + parent->_bounds.width) + 2;
-
- if (rect->y + rect->height > parent->_bounds.y + parent->_bounds.height)
- rect->y -= (rect->y + rect->height) - (parent->_bounds.y + parent->_bounds.height) + 2;
-}
-
-GfxPort *sciw_new_window(EngineState *s,
- rect_t area, int font,
- gfx_color_t color, gfx_color_t bgcolor,
- int title_font, gfx_color_t title_color, gfx_color_t title_bgcolor,
- const char *title, int flags) {
- GfxVisual *visual = s->visual;
- GfxState *state = s->gfx_state;
- int shadow_offset = 2;
- rect_t frame;
- gfx_color_t black;
- gfxop_set_color(state, &black, 0, 0, 0, 0, 0, 0);
- GfxPort *win;
- GfxList *decorations;
-// int xextra = !(flags & kWindowNoFrame) ? 1 : 0;
-// int yextra = !(flags & kWindowNoFrame) ? 2 : 0;
-
- if (area.width == 319 && area.height == 189) {
- flags |= kWindowNoFrame;
- // The below line makes the points bar in QfG2 work, but breaks
- // the one in QfG1. Hm.
- if ((byte)bgcolor.priority == 255) /* Yep, QfG2 */
- area.y += 3;
- }
-
- /*
- if (area.y + area.height > visual->_bounds.y + visual->_bounds.height) {
- area.y -= (area.y + area.height) - (visual->_bounds.y + visual->_bounds.height) + yextra;
- }
-
- if (area.x + area.width > visual->_bounds.x + visual->_bounds.width) {
- area.x -= (area.x + area.width) - (visual->_bounds.x + visual->_bounds.width) + xextra;
- }
- */
-
- if (flags & kWindowTitle)
- area. y += 10;
-
- if (!(flags & (kWindowTitle | kWindowNoFrame)))
- area.height -= 1; // Normal windows are drawn one pixel too small.
-
- sciw_make_window_fit(&area, s->wm_port);
- win = new GfxPort(visual, area, color, bgcolor);
-
- win->_font = font;
- win->_title_text = title ? title : "";
- win->port_flags = flags;
-
- win->_flags |= GFXW_FLAG_IMMUNE_TO_SNAPSHOTS;
-
- if (flags & kWindowDontDraw)
- flags = kWindowTransparent | kWindowNoFrame;
-
- if (flags == (kWindowTransparent | kWindowNoFrame))
- return win; // Fully transparent window
-
- if (flags & kWindowTitle)
- frame = gfx_rect(area.x - 1, area.y - 10, area.width + 2, area.height + 11);
- else
- frame = gfx_rect(area.x - 1, area.y - 1, area.width + 2, area.height + 2);
-
- // Set visible window boundaries
- win->_bounds = gfx_rect(frame.x, frame.y, frame.width + shadow_offset, frame.height + shadow_offset);
-
- decorations = gfxw_new_list(gfx_rect(frame.x, frame.y, frame.width + 1 + shadow_offset, frame.height + 1 + shadow_offset), 0);
-
- if (!(flags & kWindowTransparent)) {
- // Draw window background
- win->port_bg = (GfxWidget *)gfxw_new_box(state, gfx_rect(1, (flags & kWindowTitle) ? 10 : 1,
- area.width, area.height), bgcolor, bgcolor, GFX_BOX_SHADE_FLAT);
- decorations->add((GfxContainer *)decorations, win->port_bg);
- win->_flags |= GFXW_FLAG_OPAQUE;
- }
-
- if (flags & kWindowTitle) {
- // Add window title
- rect_t title_rect = gfx_rect(1, 1, area.width, 8);
-
- decorations->add((GfxContainer *)decorations, (GfxWidget *)
- gfxw_new_box(state, title_rect, title_bgcolor, title_bgcolor, GFX_BOX_SHADE_FLAT));
-
- decorations->add((GfxContainer *)decorations, (GfxWidget *)
- gfxw_new_text(state, title_rect, title_font, title, ALIGN_CENTER, ALIGN_CENTER, title_color, title_color,
- title_bgcolor, kFontNoNewlines));
- }
-
- if (!(flags & kWindowNoFrame)) {
- // Draw backdrop shadow
-
- if (!(flags & kWindowNoDropShadow)) {
- gfxop_set_color(state, &black, 0, 0, 0, 0x80, bgcolor.priority, -1);
-
- decorations->add((GfxContainer *)decorations, (GfxWidget *)
- gfxw_new_box(state, gfx_rect(shadow_offset + 1, frame.height - 1,
- frame.width - 4, shadow_offset), black, black, GFX_BOX_SHADE_FLAT));
-
- decorations->add((GfxContainer *)decorations, (GfxWidget *)
- gfxw_new_box(state, gfx_rect(frame.width - 1, shadow_offset + 1,
- shadow_offset, frame.height - 2), black, black, GFX_BOX_SHADE_FLAT));
- }
-
- // Draw frame
-
- gfxop_set_color(state, &black, 0, 0, 0, 0, bgcolor.priority, -1);
-
- if (!(flags & kWindowNoDropShadow)) {
-
- decorations->add((GfxContainer *)decorations, (GfxWidget *)
- gfxw_new_rect(gfx_rect(0, 0, frame.width - 1, frame.height - 1), black, GFX_LINE_MODE_FINE, GFX_LINE_STYLE_NORMAL));
-
- if (flags & kWindowTitle)
- decorations->add((GfxContainer *)decorations, (GfxWidget *)gfxw_new_line(Common::Point(1, 9),
- Common::Point(frame.width - 2, 9), black, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
- } else {
- decorations->add((GfxContainer *)decorations, (GfxWidget *)
- gfxw_new_rect(gfx_rect(0, 0, frame.width, frame.height), black, GFX_LINE_MODE_FINE, GFX_LINE_STYLE_NORMAL));
- }
- }
-
- win->_decorations = decorations;
- decorations->_parent = (GfxContainer *)win;
-
- return win;
-}
-
-//*** Controls ***
-
-static rect_t _move_and_extend_rect(rect_t rect, Common::Point point, int yplus) {
- return gfx_rect(rect.x + point.x, rect.y + point.y, rect.width + 1, rect.height + yplus);
-}
-
-GfxList *_sciw_add_text_to_list(GfxList *list, GfxPort *port, rect_t zone, const char *text,
- int font, gfx_alignment_t align, char framed, char inverse, int flags, char gray_text) {
- gfx_color_t *color1, *color2, *bgcolor;
-
- if (inverse) {
- color1 = color2 = &(port->_bgcolor);
- bgcolor = &(port->_color);
- } else if (gray_text) {
- bgcolor = color1 = &(port->_bgcolor);
- color2 = &(port->_color);
- } else {
- color1 = color2 = &(port->_color);
- bgcolor = &(port->_bgcolor);
- }
-
- list->add((GfxContainer *)list, gfxw_new_text(port->_visual->_gfxState, zone, font, text, align, ALIGN_TOP,
- *color1, *color2, *bgcolor, flags));
-
- zone.width--;
- zone.height -= 2;
-
- if (framed) {
- list->add((GfxContainer *)list, gfxw_new_rect(zone, *color2, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_STIPPLED));
- }
-
- return list;
-}
-
-GfxList *sciw_new_button_control(GfxPort *port, reg_t ID, rect_t zone, const char *text, int font, char selected, char inverse, char grayed_out) {
- gfx_color_t *frame_col = (inverse) ? &(port->_bgcolor) : &(port->_color);
- GfxList *list;
-
- zone.x--;
- zone.y--;
- zone.width++;
- zone.height++;
-
- list = gfxw_new_list(_move_and_extend_rect(zone, Common::Point(port->zone.x, port->zone.y), 1), 0);
-
- gfxw_set_id(list, ID.segment, ID.offset);
-
- zone.x = 0;
- zone.y = 0;
-
- if (!inverse) {
- list = _sciw_add_text_to_list(list, port, gfx_rect(zone.x + 1, zone.y + 2, zone.width - 1, zone.height),
- text, font, ALIGN_CENTER, 0, inverse, kFontIgnoreLF, grayed_out);
-
- list->add((GfxContainer *)list,
- gfxw_new_rect(zone, *frame_col, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
- } else {
- list->add((GfxContainer *)list, gfxw_new_box(NULL, gfx_rect(zone.x, zone.y, zone.width + 1, zone.height + 1),
- port->_color, port->_color, GFX_BOX_SHADE_FLAT));
-
- list = _sciw_add_text_to_list(list, port, gfx_rect(zone.x + 1, zone.y + 2, zone.width - 1, zone.height),
- text, font, ALIGN_CENTER, 0, inverse, kFontIgnoreLF, grayed_out);
- }
-
- if (selected)
- list->add((GfxContainer *)list,
- gfxw_new_rect(gfx_rect(zone.x + 1, zone.y + 1, zone.width - 2, zone.height - 2),
- *frame_col, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
-
- return list;
-}
-
-GfxList *sciw_new_text_control(GfxPort *port, reg_t ID, rect_t zone, const char *text, int font,
- gfx_alignment_t align, char framed, char inverse) {
- GfxList *list = gfxw_new_list(_move_and_extend_rect(zone, Common::Point(port->zone.x, port->zone.y), 2), 0);
-
- gfxw_set_id(list, ID.segment, ID.offset);
-
- zone.x = 0;
- zone.y = 0;
-
- return _sciw_add_text_to_list(list, port, zone, text, font, align, framed, inverse, 0, port->gray_text);
-}
-
-GfxList *sciw_new_edit_control(GfxPort *port, reg_t ID, rect_t zone, const char *text, int font, unsigned int cursor,
- char inverse) {
- GfxText *text_handle;
-
- GfxList *list;
- int cursor_height = port->_visual->_gfxState->gfxResMan->getFont(font)->line_height;
-
- zone.x--;
- zone.y--;
- zone.width++;
- zone.height++;
-
- list = gfxw_new_list(_move_and_extend_rect(zone, Common::Point(port->zone.x, port->zone.y), 1), 0);
- gfxw_set_id(list, ID.segment, ID.offset);
- zone.x = 1;
- zone.y = 1;
-
- if ((g_system->getMillis() % 1000) < 500) {
- text_handle = gfxw_new_text(port->_visual->_gfxState, zone, font, text, ALIGN_LEFT, ALIGN_TOP,
- port->_color, port->_color, port->_bgcolor, kFontNoNewlines);
-
- list->add((GfxContainer *)list, text_handle);
- } else {
- char *textdup = (char *)malloc(strlen(text) + 1);
-
- strncpy(textdup, text, cursor);
-
- if (cursor <= strlen(text))
- textdup[cursor] = 0; // terminate
-
- if (cursor > 0) {
- text_handle = gfxw_new_text(port->_visual->_gfxState, zone, font, textdup, ALIGN_LEFT, ALIGN_TOP,
- port->_color, port->_color, port->_bgcolor, kFontNoNewlines);
-
- list->add((GfxContainer *)list, text_handle);
- zone.x += text_handle->width;
- }
-
- if (cursor < strlen(text)) {
- textdup[0] = text[cursor];
- textdup[1] = 0;
- text_handle = gfxw_new_text(port->_visual->_gfxState, zone, font, textdup, ALIGN_LEFT, ALIGN_TOP,
- port->_bgcolor, port->_bgcolor, port->_color, kFontNoNewlines);
- list->add((GfxContainer *)list, text_handle);
- zone.x += text_handle->width;
- };
-
- if (cursor + 1 < strlen(text)) {
- text_handle = gfxw_new_text(port->_visual->_gfxState, zone, font, text + cursor + 1, ALIGN_LEFT, ALIGN_TOP,
- port->_color, port->_color, port->_bgcolor, kFontNoNewlines);
- list->add((GfxContainer *)list, text_handle);
- zone.x += text_handle->width;
- };
-
- if (cursor == strlen(text))
- list->add((GfxContainer *)list, gfxw_new_line(Common::Point(zone.x, zone.y), Common::Point(zone.x, zone.y + cursor_height - 1),
- port->_color, GFX_LINE_MODE_FAST, GFX_LINE_STYLE_NORMAL));
- free(textdup);
- }
-
- zone.x = zone.y = 0;
-
- list->add((GfxContainer *)list, gfxw_new_rect(zone, port->_color, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
-
- return list;
-}
-
-GfxList *sciw_new_icon_control(GfxPort *port, reg_t ID, rect_t zone, int view, int loop, int cel,
- char frame, char inverse) {
- GfxList *list = gfxw_new_list(_move_and_extend_rect(zone, Common::Point(port->zone.x, port->zone.y), 1), 0);
- GfxWidget *icon;
- gfxw_set_id(list, ID.segment, ID.offset);
-
- if (!port->_visual) {
- error("Attempting to create icon control for virtual port");
- return NULL;
- }
-
- zone.x = 0;
- zone.y = 0;
-
- icon = gfxw_new_view(port->_visual->_gfxState, Common::Point(zone.x, zone.y), view, loop, cel, 0, -1, -1,
- ALIGN_LEFT, ALIGN_TOP, GFXW_VIEW_FLAG_DONT_MODIFY_OFFSET);
-
- if (!icon) {
- error("Attempt to create icon control with cel %d/%d/%d (invalid)", view, loop, cel);
- return NULL;
- }
-
- list->_flags |= GFXW_FLAG_MULTI_ID;
-
- list->add((GfxContainer *)list, icon);
-
- return list;
-}
-
-GfxList *sciw_new_list_control(GfxPort *port, reg_t ID, rect_t zone, int font_nr, const char **entries_list,
- int entries_nr, int list_top, int selection, char inverse) {
- GfxList *list;
-
- char arr_up[2], arr_down[2];
- int i;
-
- int font_height;
- int columns;
-
- zone.x--;
- zone.y--;
- zone.width++;
- zone.height++;
-
- list = gfxw_new_list(_move_and_extend_rect(zone, Common::Point(port->zone.x, port->zone.y), 1), 0);
-
- font_height = port->_visual->_gfxState->gfxResMan->getFont(font_nr)->line_height;
- columns = (zone.height - 20);
-
- columns /= font_height;
-
- gfxw_set_id(list, ID.segment, ID.offset);
-
- arr_up[0] = SCI_SPECIAL_CHAR_ARROW_UP;
- arr_down[0] = SCI_SPECIAL_CHAR_ARROW_DOWN;
- arr_up[1] = arr_down[1] = 0;
-
- zone.x = 1;
- zone.y = 11;
-
- // Draw text
-
- for (i = list_top; columns-- && i < entries_nr; i++) {
- if (i != selection)
- list->add((GfxContainer *)list,
- gfxw_new_text(port->_visual->_gfxState, gfx_rect(zone.x, zone.y, zone.width - 2, font_height),
- font_nr, entries_list[i], ALIGN_LEFT, ALIGN_TOP,
- port->_color, port->_color, port->_bgcolor, kFontNoNewlines));
- else {
- list->add((GfxContainer *)list, gfxw_new_box(port->_visual->_gfxState, gfx_rect(zone.x, zone.y, zone.width - 1, font_height),
- port->_color, port->_color, GFX_BOX_SHADE_FLAT));
- list->add((GfxContainer *)list, gfxw_new_text(port->_visual->_gfxState, gfx_rect(zone.x, zone.y, zone.width - 2, font_height),
- font_nr, entries_list[i], ALIGN_LEFT, ALIGN_TOP,
- port->_bgcolor, port->_bgcolor, port->_color, kFontNoNewlines));
- }
-
- zone.y += font_height;
- }
-
- // Draw frames
-
- zone.x = 0;
- zone.y = 0;
-
- // Add up arrow
- list->add((GfxContainer *)list, gfxw_new_text(port->_visual->_gfxState, gfx_rect(1, 0, zone.width - 2, 8),
- port->_font, arr_up, ALIGN_CENTER, ALIGN_CENTER,
- port->_color, port->_color, port->_bgcolor, 0));
-
- // Add down arrow
- list->add((GfxContainer *)list, gfxw_new_text(port->_visual->_gfxState, gfx_rect(1, zone.height - 9, zone.width - 2, 8),
- port->_font, arr_down, ALIGN_CENTER, ALIGN_CENTER,
- port->_color, port->_color, port->_bgcolor, 0));
-
- if (list_top & 1) { // Hack to work around aggressive caching
- list->add((GfxContainer *)list, gfxw_new_rect(zone, port->_color, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
- list->add((GfxContainer *)list, gfxw_new_rect(gfx_rect(zone.x, zone.y + 10, zone.width, zone.height - 20),
- port->_color, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
- } else {
- list->add((GfxContainer *)list,
- gfxw_new_rect(gfx_rect(zone.x, zone.y, zone.width, zone.height - 10),
- port->_color, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
- list->add((GfxContainer *)list,
- gfxw_new_rect(gfx_rect(zone.x, zone.y + 10, zone.width, zone.height - 10),
- port->_color, GFX_LINE_MODE_CORRECT, GFX_LINE_STYLE_NORMAL));
- }
-
- return list;
-}
-
-void sciw_set_menubar(EngineState *s, GfxPort *status_bar, Menubar *menubar, int selection) {
- GfxList *list = make_titlebar_list(s, status_bar->_bounds, status_bar);
- int offset = MENU_LEFT_BORDER;
- int i;
-
- clear_titlebar(status_bar);
-
- for (i = 0; i < (int)menubar->_menus.size(); i++) {
- Menu *menu = &menubar->_menus[i];
- int width = menu->_titleWidth + (MENU_BORDER_SIZE * 2);
-
- if (i == selection) {
- list->add((GfxContainer *)list, gfxw_new_box(status_bar->_visual->_gfxState, gfx_rect(offset, 0, width, MENU_BAR_HEIGHT),
- status_bar->_color, status_bar->_color, GFX_BOX_SHADE_FLAT));
- list->add((GfxContainer *)list, gfxw_new_text(s->gfx_state, gfx_rect(offset, 0, width, MENU_BAR_HEIGHT),
- status_bar->_font, menu->_title.c_str(), ALIGN_CENTER, ALIGN_CENTER,
- status_bar->_bgcolor, status_bar->_bgcolor, status_bar->_color, kFontNoNewlines));
- } else
- list->add((GfxContainer *)list, gfxw_new_text(s->gfx_state, gfx_rect(offset, 0, width, MENU_BAR_HEIGHT),
- status_bar->_font, menu->_title.c_str(), ALIGN_CENTER, ALIGN_CENTER,
- status_bar->_color, status_bar->_color, status_bar->_bgcolor, kFontNoNewlines));
- offset += width;
- }
-
- status_bar->add((GfxContainer *)status_bar, list);
- finish_titlebar_list(s, list, status_bar);
-}
-
-GfxPort *sciw_new_menu(EngineState *s, GfxPort *status_bar, Menubar *menubar, int selection) {
- GfxPort *retval;
- Menu *menu = &menubar->_menus[selection];
- rect_t area = gfx_rect(MENU_LEFT_BORDER, 10, 0, 0);
- int i;
-
- if (selection < -1)
- return NULL;
-
- if (selection >= (int)menubar->_menus.size()) {
- error("Attempt to make menu #%d of %d", selection, menubar->_menus.size());
- return NULL;
- }
-
- for (i = 0; i < selection; i++)
- area.x += menubar->_menus[i]._titleWidth;
-
- area.width = menu->_width - 1;
- area.height = menu->_items.size() * 10;
-
- retval = sciw_new_window(s, area, status_bar->_font, status_bar->_color, status_bar->_bgcolor,
- 0, status_bar->_color, status_bar->_bgcolor, NULL, kWindowNoDropShadow | kWindowTransparent);
-
- retval->setVisual(s->visual);
-
- for (i = 0; i < (int)menu->_items.size(); i++)
- sciw_toggle_item(retval, menu, i, false);
-
- return retval;
-}
-
-#define MAGIC_ID_OFFSET 0x2000
-
-static gfx_color_t un_prioritize(gfx_color_t col) {
- col.priority = -1;
- col.mask &= ~GFX_MASK_PRIORITY;
-
- return col;
-}
-
-GfxWidget *_make_menu_entry(MenuItem *item, int offset, int width, GfxPort *port, gfx_color_t color, gfx_color_t bgcolor, int ID, int gray) {
- rect_t area = gfx_rect(MENU_BOX_LEFT_PADDING, 0, width - MENU_BOX_LEFT_PADDING, 10);
- rect_t list_area = gfx_rect(port->zone.x, area.y + offset + port->zone.y, width, area.height);
- GfxList *list = (GfxList *) gfxw_set_id(gfxw_new_list(list_area, 0), ID, GFXW_NO_ID);
- gfx_color_t xcolor = { PaletteEntry(), 0, 0, 0, 0};
-
- color = un_prioritize(color);
- bgcolor = un_prioritize(bgcolor);
-
- xcolor = gray ? color : bgcolor;
-
- list->add((GfxContainer *)list, gfxw_new_box(port->_visual->_gfxState, area, bgcolor, bgcolor, GFX_BOX_SHADE_FLAT));
- list->add((GfxContainer *)list, gfxw_new_text(port->_visual->_gfxState, area, port->_font, item->_text.c_str(), ALIGN_LEFT, ALIGN_CENTER,
- color, xcolor, bgcolor, kFontNoNewlines));
-
- if (!item->_keytext.empty()) {
- area.width -= MENU_BOX_RIGHT_PADDING;
- list->add((GfxContainer *)list, gfxw_new_text(port->_visual->_gfxState, area, port->_font, item->_keytext.c_str(), ALIGN_RIGHT, ALIGN_CENTER,
- color, xcolor, bgcolor, kFontNoNewlines));
- }
-
- return list;
-}
-
-GfxWidget *_make_menu_hbar(int offset, int width, GfxPort *port, gfx_color_t color, gfx_color_t bgcolor, int ID) {
- rect_t area = gfx_rect(0, 0, width, 10);
- rect_t list_area = gfx_rect(area.x + port->zone.x, area.y + offset + port->zone.y, area.width, area.height);
- GfxList *list = (GfxList *) gfxw_set_id(gfxw_new_list(list_area, 0), ID, GFXW_NO_ID);
-
- color = un_prioritize(color);
- bgcolor = un_prioritize(bgcolor);
-
- list->add((GfxContainer *)list, gfxw_new_box(port->_visual->_gfxState, area, bgcolor, bgcolor, GFX_BOX_SHADE_FLAT));
- list->add((GfxContainer *)list, gfxw_new_line(Common::Point(0, 5), Common::Point(width, 5), color,
- GFX_LINE_MODE_FAST, GFX_LINE_STYLE_STIPPLED));
-
- return list;
-}
-
-GfxPort *sciw_toggle_item(GfxPort *menu_port, Menu *menu, int selection, bool selected) {
- if (selection < 0 || selection >= (int)menu->_items.size())
- return menu_port;
-
- gfx_color_t fgColor = !selected ? menu_port->_color : menu_port->_bgcolor;
- gfx_color_t bgColor = !selected ? menu_port->_bgcolor : menu_port->_color;
-
- MenuItem *item = &menu->_items[selection];
-
- if (item->_type == MENU_TYPE_NORMAL)
- menu_port->add((GfxContainer *)menu_port, _make_menu_entry(item, selection * 10, menu_port->zone.width + 1,
- menu_port, fgColor, bgColor, selection + MAGIC_ID_OFFSET, item->_enabled));
- else
- menu_port->add((GfxContainer *)menu_port, _make_menu_hbar(selection * 10, menu_port->zone.width + 1,
- menu_port, fgColor, bgColor, selection + MAGIC_ID_OFFSET));
-
- return menu_port;
-}
-
-void _k_view_list_mark_free(EngineState *s, reg_t off) {
- if (s->dyn_views) {
-
- GfxDynView *w = (GfxDynView *)s->dyn_views->_contents;
-
- while (w) {
- if (w->_ID == off.segment
- && w->_subID == off.offset) {
- w->under_bitsp.obj = NULL_REG;
- }
-
- w = (GfxDynView *)w->_next;
- }
- }
-}
-
-} // End of namespace Sci
-
-#endif