Ejemplo n.º 1
0
eolBool eol_component_button_update(eolComponent *component)
{
  eolVec2D v;
  eolInt x,y;
  if (!component)return eolFalse;
  component->oldState = component->state;
  eol_mouse_get_position(&x,&y);
  v.x = x;
  v.y = y;
  if (eol_vec_in_rect(v,component->bounds))
  {
    component->state = eolButtonHighlight;
    if (eol_mouse_input_held(eolMouseLeft))
    {
      component->state = eolButtonPressed;
      return eolFalse;
    }
    if (eol_mouse_input_pressed(eolMouseLeft))
    {
      component->state = eolButtonPressed;
      return eolFalse;
    }
    else if (eol_mouse_input_released(eolMouseLeft))
    {
      component->state = eolButtonIdle;
      return eolTrue;
    }
  }
  else
  {
    component->state = eolButtonIdle;
  }
  return eolFalse;
}
eolBool editor_tile_panel_update(eolWindow *win,GList *updates)
{
  eolUint id;
  GList *c,*l;
  editorTileData*tileData;
  eolComponent *comp = NULL,*listItem = NULL;
  if (win == NULL)return eolFalse;
  tileData = editor_tile_get_data(win);
  if (!tileData)return eolFalse;  
  
  for (c = updates;c != NULL;c = c->next)
  {
    if (c->data == NULL)continue;
    comp = (eolComponent *)c->data;
    if (eol_line_cmp(comp->name,"mode_button")==0)
    {
      tileData->editingMode = (tileData->editingMode + 1)%TEM_MODES;
      switch(tileData->editingMode)
      {
        case TEM_Paint:
          eol_button_set_text(comp,"Tile Paint Mode");
          break;
        case TEM_Select:
          eol_button_set_text(comp,"Tile Modify Mode");
          break;
        case TEM_Type:
          eol_button_set_text(comp,"Archetype Modify Mode");
          break;
      }
      return eolTrue;
    }
    else if (eol_line_cmp(comp->name,"tile_type_list")==0)
    {
      if (eol_component_list_get_selected_id(&id,comp))
      {
        tileData->selectedTileType = editor_workspace_get_tile_by_id(tileData->workspace,id);
        return eolTrue;
      }
    }
    else if (eol_line_cmp(comp->name,"tile_actions") == 0)
    {
      /*something in the list of buttons*/
      for (l = eol_list_get_updates(comp);l != NULL; l = l->next)
      {
        if (l->data == NULL)continue;
        listItem = (eolComponent *)l->data;
        if (eol_line_cmp(listItem->name,"new_tile_type")==0)
        {
          return eolTrue;
        }
      }
    }
  }

  if (eol_mouse_input_released(eolMouseLeft))
  {
    if (editor_workspace_mouse_click(tileData->workspace))
    {
      switch(tileData->editingMode)
      {
        case TEM_Paint:
          if (!tileData->selectedTileType)
          {
            eol_logger_message(EOL_LOG_ERROR,"No tile to add");
            break;
          }
          editor_workspace_add_mouse_tile(tileData->workspace,tileData->selectedTileType->id);

          return eolTrue;
        default:
          eol_logger_message(EOL_LOG_ERROR,"not in paint mode");
      }
    }
  }
  
  return eolFalse;
}
eolBool eol_component_list_update(eolComponent *component)
{
  GList *it = NULL,*c = NULL;
  eolVec2D scaleArea;
  eolFloat slide = 0;
  eolComponentList *list;
  eolComponentListItem *item = NULL;
  eolBool updated = eolFalse;
  list = eol_component_get_list_data(component);
  if (list == NULL)return eolFalse;
  if (list->updatedItems != NULL)
  {
    g_list_free(list->updatedItems);
    list->updatedItems = NULL;
  }
  /*Update Sliders if visible*/
  scaleArea = eol_component_list_scaleable_area(list);
  if ((list->showVSlider) && (fabs(scaleArea.y) > 1))
  {
    if (eol_component_update(list->vSlider))
    {
      updated = eolTrue;
      slide = eol_slider_get_position(list->vSlider);
      list->topOffset.y = (scaleArea.y * slide);
    }
    slide = eol_slider_get_position(list->vSlider);
    list->topOffset.y = (scaleArea.y * slide);
  }
  slide = 0;
  if ((list->showHSlider) && (fabs(scaleArea.x) > 1))
  {
    if (eol_component_update(list->hSlider) || updated)
    {
      updated = eolTrue;
    }
    slide = eol_slider_get_position(list->hSlider);
    list->topOffset.x = (scaleArea.x * slide);
  }
  /*iterate through glist and update elements*/
  for (c = list->itemList;c != NULL; c= c->next)
  {
    if (c->data != NULL)
    {
      item = (eolComponentListItem*)c->data;
      if (eol_component_update(item->item))
      {
        list->updatedItems = g_list_append(list->updatedItems ,item->item);
      }
    }
  }
  if (list->updatedItems)
  {
    updated = eolTrue;
  }
  
  /*check for selection:*/
  if (list->allowSelection)
  {
    for (it = list->itemList;it != NULL;it = it->next)
    {
      if (!it->data)continue;
      item = (eolComponentListItem*)it->data;
      if ((eol_mouse_in_rect(item->item->bounds)) &&
          (eol_list_item_bound_check(list,item->item->bounds)))
      {
        item->highlight = eolTrue;
        if (eol_mouse_input_released(eolMouseLeft))
        {
          eol_component_list_select_item(component,item);
          list->selection = it;
          updated = eolTrue;
        }
      }
      else item->highlight = eolFalse;
    }
  }
  return updated;
}