added functions for setting and getting screen borders for gadgets
[rocksndiamonds.git] / src / libgame / gadgets.c
index 94fe74551cdd58ed60a001afd742c412cc2e1735..0f221a731e77e9695e633828796deb961531936e 100644 (file)
@@ -38,6 +38,8 @@ static struct GadgetInfo *gadget_list_last_entry = NULL;
 static struct GadgetInfo *last_info_gi = NULL;
 static int next_free_gadget_id = 1;
 static boolean gadget_id_wrapped = FALSE;
+static int gadget_screen_border_right = -1;
+static int gadget_screen_border_bottom = -1;
 
 static void (*PlayGadgetSoundActivating)(void) = NULL;
 static void (*PlayGadgetSoundSelecting)(void) = NULL;
@@ -50,6 +52,30 @@ void InitGadgetsSoundCallback(void (*activating_function)(void),
   PlayGadgetSoundSelecting = selecting_function;
 }
 
+void InitGadgetScreenBorders(int border_right, int border_bottom)
+{
+  gadget_screen_border_right  = border_right;
+  gadget_screen_border_bottom = border_bottom;
+}
+
+static int getGadgetScreenBorderRight(void)
+{
+  if (gadget_screen_border_right < gfx.sx ||
+      gadget_screen_border_right > gfx.sx + gfx.sxsize)
+    return gfx.sx + gfx.sxsize;
+
+  return gadget_screen_border_right;
+}
+
+static int getGadgetScreenBorderBottom(void)
+{
+  if (gadget_screen_border_bottom < gfx.sy ||
+      gadget_screen_border_bottom > gfx.sy + gfx.sysize)
+    return gfx.sy + gfx.sysize;
+
+  return gadget_screen_border_bottom;
+}
+
 static struct GadgetInfo *getGadgetInfoFromGadgetID(int id)
 {
   struct GadgetInfo *gi = gadget_list_first_entry;
@@ -238,6 +264,7 @@ static void DrawGadget(struct GadgetInfo *gi, boolean pressed, boolean direct)
   {
     case GD_TYPE_NORMAL_BUTTON:
     case GD_TYPE_CHECK_BUTTON:
+    case GD_TYPE_CHECK_BUTTON_2:
     case GD_TYPE_RADIO_BUTTON:
 
       BlitBitmapOnBackground(gd->bitmap, drawto,
@@ -828,6 +855,7 @@ static void DrawGadget_OverlayTouchButton(struct GadgetInfo *gi)
   {
     case GD_TYPE_NORMAL_BUTTON:
     case GD_TYPE_CHECK_BUTTON:
+    case GD_TYPE_CHECK_BUTTON_2:
     case GD_TYPE_RADIO_BUTTON:
       SDL_SetTextureAlphaMod(gd->bitmap->texture_masked, alpha);
       SDL_SetTextureBlendMode(gd->bitmap->texture_masked, SDL_BLENDMODE_BLEND);
@@ -1260,7 +1288,7 @@ static void HandleGadgetTags(struct GadgetInfo *gi, int first_tag, va_list ap)
     int border_xsize = gi->border.xsize;
     int border_ysize = gi->border.ysize;
     int button_size = gi->border.xsize_selectbutton;
-    int bottom_screen_border = gfx.sy + gfx.sysize - font_height;
+    int bottom_screen_border = getGadgetScreenBorderBottom();
     Bitmap *src_bitmap;
     int src_x, src_y;
 
@@ -2158,7 +2186,11 @@ boolean HandleGadgets(int mx, int my, int button)
     boolean deactivate_gadget = TRUE;
     boolean gadget_changed = TRUE;
 
-    if (gi->type & GD_TYPE_SELECTBOX)
+    if (gi->type == GD_TYPE_CHECK_BUTTON_2)
+    {
+      gi->checked = !gi->checked;
+    }
+    else if (gi->type & GD_TYPE_SELECTBOX)
     {
       if (keep_selectbox_open ||
          mouse_released_where_pressed ||