diff options
Diffstat (limited to 'iup/src/iup_getparam.c')
| -rwxr-xr-x | iup/src/iup_getparam.c | 95 | 
1 files changed, 41 insertions, 54 deletions
diff --git a/iup/src/iup_getparam.c b/iup/src/iup_getparam.c index 7fd6a94..3680ed5 100755 --- a/iup/src/iup_getparam.c +++ b/iup/src/iup_getparam.c @@ -20,6 +20,7 @@  #define RAD2DEG  57.296f   /* radians to degrees */ +enum {IPARAM_TYPE_STR, IPARAM_TYPE_INT, IPARAM_TYPE_FLOAT, IPARAM_TYPE_NONE=-1};  /*******************************************************************************************                      Internal Callbacks @@ -150,7 +151,7 @@ static int iParamValAction_CB(Ihandle *self)    char* type = iupAttribGet(param, "TYPE");    if (iupStrEqual(type, "INTEGER"))    { -    iupAttribSetStrf(param, "VALUE", "%d", (int)val); +    iupAttribSetInt(param, "VALUE", (int)val);    }    else    { @@ -161,7 +162,7 @@ static int iParamValAction_CB(Ihandle *self)        if (val == 0)        {          old_angle = iupAttribGetFloat(param, "VALUE"); -        iupAttribSetStrf(param, "_IUPGP_OLD_ANGLE", "%g", old_angle); +        iupAttribSetFloat(param, "_IUPGP_OLD_ANGLE", old_angle);        }        else          old_angle = iupAttribGetFloat(param, "_IUPGP_OLD_ANGLE"); @@ -185,13 +186,13 @@ static int iParamValAction_CB(Ihandle *self)        }      } -    iupAttribSetStrf(param, "VALUE", "%g", val); +    iupAttribSetFloat(param, "VALUE", val);    }    if (cb && !cb(dlg, iupAttribGetInt(param, "INDEX"), (void*)iupAttribGet(dlg, "USER_DATA")))     {      /* Undo */ -    iupAttribSetStrf(param, "VALUE", "%g", old_value); +    iupAttribSetFloat(param, "VALUE", old_value);      if (!iupAttribGetInt(param, "ANGLE"))        IupSetfAttribute(self, "VALUE", "%g", old_value); @@ -235,12 +236,12 @@ static int iParamListAction_CB(Ihandle *self, char *t, int i, int v)      Iparamcb cb = (Iparamcb)IupGetCallback(dlg, "PARAM_CB");      int old_i = iupAttribGetInt(param, "VALUE"); -    iupAttribSetStrf(param, "VALUE", "%d", i-1); +    iupAttribSetInt(param, "VALUE", i-1);      if (cb && !cb(dlg, iupAttribGetInt(param, "INDEX"), (void*)iupAttribGet(dlg, "USER_DATA")))       {        /* Undo */ -      iupAttribSetStrf(param, "VALUE", "%d", old_i); +      iupAttribSetInt(param, "VALUE", old_i);        IupSetfAttribute(self, "VALUE", "%d", old_i+1);        /* there is no IUP_IGNORE for IupList */ @@ -327,7 +328,7 @@ static int iParamSpinReal_CB(Ihandle *self, int pos)    if (val > max)      val = max; -  iupAttribSetStrf(param, "VALUE", "%g", (double)val); +  iupAttribSetFloat(param, "VALUE", val);    if (cb)     { @@ -437,7 +438,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)      IupSetCallback(ctrl, "ACTION", (Icallback)iParamToggleAction_CB);      IupAppend(box, ctrl); -    iupAttribSetStr(param, "DATA_TYPE", "1");    }    else if (iupStrEqual(type, "SEPARATOR"))    { @@ -445,7 +445,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)      IupSetAttribute(ctrl, "SEPARATOR", "HORIZONTAL");      IupAppend(box, ctrl); -    iupAttribSetStr(param, "DATA_TYPE", "-1");    }    else if (iupStrEqual(type, "LIST"))    { @@ -465,7 +464,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)      IupStoreAttribute(ctrl, str, NULL);      IupAppend(box, ctrl); -    iupAttribSetStr(param, "DATA_TYPE", "1");    }    else if (iupStrEqual(type, "STRING"))    { @@ -498,7 +496,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)          IupStoreAttribute(ctrl, "MASK", mask);      } -    iupAttribSetStr(param, "DATA_TYPE", "0");      iupAttribSetStr(param, "EXPAND", "1");    }    else if (iupStrEqual(type, "FILE")) @@ -513,7 +510,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)        IupSetCallback(ctrl, "ACTION", (Icallback)iParamTextAction_CB);        IupStoreAttribute(ctrl, "VALUE", iupAttribGet(param, "VALUE")); -      iupAttribSetStr(param, "DATA_TYPE", "0");        iupAttribSetStr(param, "EXPAND", "1"); @@ -540,9 +536,7 @@ static Ihandle* iParamCreateBox(Ihandle* param)        IupSetAttribute(ctrl, "MASK", "(/d|/d/d|1/d/d|2(0|1|2|3|4)/d|25(0|1|2|3|4|5)) (/d|/d/d|1/d/d|2(0|1|2|3|4)/d|25(0|1|2|3|4|5)) (/d|/d/d|1/d/d|2(0|1|2|3|4)/d|25(0|1|2|3|4|5)) (/d|/d/d|1/d/d|2(0|1|2|3|4)/d|25(0|1|2|3|4|5))");        IupStoreAttribute(ctrl, "VALUE", iupAttribGet(param, "VALUE")); -      iupAttribSetStr(param, "DATA_TYPE", "0");        iupAttribSetStr(param, "EXPAND", "1"); -        aux = IupCanvas(NULL);        IupSetAttribute(aux, "SIZE", "20x10"); @@ -585,7 +579,7 @@ static Ihandle* iParamCreateBox(Ihandle* param)          IupSetfAttribute(ctrl, "SPINMAX", "%d", (int)((max-min)/step + 0.5));          IupSetfAttribute(ctrl, "SPINVALUE", "%d", (int)((val-min)/step + 0.5)); -        iupAttribSetStrf(ctrl, "_IUPGP_INCSTEP", "%g", step); +        iupAttribSetFloat(ctrl, "_IUPGP_INCSTEP", step);          iupAttribSetStr(ctrl, "_IUPGP_SPINREAL", "1");        }        else if (iupAttribGetInt(param, "PARTIAL")) @@ -603,7 +597,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)          IupAppend(box, ctrl);        } -      iupAttribSetStr(param, "DATA_TYPE", "2");        IupSetAttribute(ctrl, "SIZE", "50x");      }      else /* INTEGER*/ @@ -625,7 +618,7 @@ static Ihandle* iParamCreateBox(Ihandle* param)          int step = iupAttribGetInt(param, "STEP");          if (step)          { -          iupAttribSetStrf(ctrl, "_IUPGP_INCSTEP", "%d", step); +          iupAttribSetInt(ctrl, "_IUPGP_INCSTEP", step);            IupSetfAttribute(ctrl, "SPININC", "%d", step);          }          IupSetfAttribute(ctrl, "SPINMAX", "%d", max); @@ -649,7 +642,6 @@ static Ihandle* iParamCreateBox(Ihandle* param)          IupSetAttribute(ctrl, "MASK", IUP_MASK_INT);        } -      iupAttribSetStr(param, "DATA_TYPE", "1");        IupSetAttribute(ctrl, "SIZE", "50x");      } @@ -790,13 +782,12 @@ static Ihandle* IupParamDlgP(Ihandle** params)    {      int w; -    char* type = iupAttribGet(params[i], "TYPE"); -    if (!iupStrEqual(type, "SEPARATOR")) +    if (IupGetInt(params[i], "DATA_TYPE") != IPARAM_TYPE_NONE)      {        char str[20];        sprintf(str, "PARAM%d", p); -      IupSetAttribute(dlg, str, (char*)params[i]); -      iupAttribSetStrf(params[i], "INDEX", "%d", p); +      iupAttribSetStr(dlg, str, (char*)params[i]); +      iupAttribSetInt(params[i], "INDEX", p);        p++;      } @@ -810,9 +801,9 @@ static Ihandle* IupParamDlgP(Ihandle** params)    i = 0;    while (params[i] != NULL)    { -    char* type = iupAttribGet(params[i], "TYPE"); -    if (!iupStrEqual(type, "SEPARATOR")) +    if (IupGetInt(params[i], "DATA_TYPE") != IPARAM_TYPE_NONE)      { +      char* type = iupAttribGet(params[i], "TYPE");        if (iupStrEqual(type, "LIST"))        {          /* set a minimum size for lists */ @@ -1040,6 +1031,7 @@ static int iParamCopyStrLine(char* line, const char* format)    return i+1;   } +/* Used in IupLua also */  char iupGetParamType(const char* format, int *line_size)  {    char* type = strchr(format, '%'); @@ -1072,19 +1064,19 @@ static Ihandle *IupParamf(const char* format, int *line_size)    {    case 'b':      iupAttribSetStr(param, "TYPE", "BOOLEAN"); -    iupAttribSetStr(param, "DATA_TYPE", "1");  /* integer */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_INT);      extra = iParamGetStrExtra(line_ptr, '[', ']', &count);  line_ptr += count;      iParamSetBoolNames(extra, param);      break;    case 'l':      iupAttribSetStr(param, "TYPE", "LIST"); -    iupAttribSetStr(param, "DATA_TYPE", "1");  /* integer */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_INT);      extra = iParamGetStrExtra(line_ptr, '|', '|', &count);  line_ptr += count;      iParamSetListItems(extra, param);      break;    case 'a':      iupAttribSetStr(param, "TYPE", "REAL"); -    iupAttribSetStr(param, "DATA_TYPE", "2");  /* real */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_FLOAT);      iupAttribSetStr(param, "ANGLE", "1");      extra = iParamGetStrExtra(line_ptr, '[', ']', &count);  line_ptr += count;      iParamSetInterval(extra, param); @@ -1094,7 +1086,7 @@ static Ihandle *IupParamf(const char* format, int *line_size)      /* continue */    case 's':      iupAttribSetStr(param, "TYPE", "STRING"); -    iupAttribSetStr(param, "DATA_TYPE", "0");  /* string */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_STR);      mask = iParamGetNextStrItem(line_ptr, '{', &count);        if (*mask)         iupAttribStoreStr(param, "MASK", mask); @@ -1103,33 +1095,33 @@ static Ihandle *IupParamf(const char* format, int *line_size)      break;    case 'i':      iupAttribSetStr(param, "TYPE", "INTEGER"); -    iupAttribSetStr(param, "DATA_TYPE", "1");  /* integer */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_INT);      extra = iParamGetStrExtra(line_ptr, '[', ']', &count);  line_ptr += count;      iParamSetInterval(extra, param);      break;    case 'r':      iupAttribSetStr(param, "TYPE", "REAL"); -    iupAttribSetStr(param, "DATA_TYPE", "2");  /* real */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_FLOAT);      extra = iParamGetStrExtra(line_ptr, '[', ']', &count);  line_ptr += count;      iParamSetInterval(extra, param);      break;    case 'f':      iupAttribSetStr(param, "TYPE", "FILE"); -    iupAttribSetStr(param, "DATA_TYPE", "0");  /* string */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_STR);      extra = iParamGetStrExtra(line_ptr, '[', ']', &count);  line_ptr += count;      iParamSetFileOptions(extra, param);      break;    case 'c':      iupAttribSetStr(param, "TYPE", "COLOR"); -    iupAttribSetStr(param, "DATA_TYPE", "0");  /* string */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_STR);      break;    case 't':      iupAttribSetStr(param, "TYPE", "SEPARATOR"); -    iupAttribSetStr(param, "DATA_TYPE", "-1"); /* NONE */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_NONE);      break;    case 'u':      iupAttribSetStr(param, "TYPE", "BUTTONNAMES"); -    iupAttribSetStr(param, "DATA_TYPE", "-1"); /* NONE */ +    iupAttribSetInt(param, "DATA_TYPE", IPARAM_TYPE_NONE);      extra = iParamGetStrExtra(line_ptr, '[', ']', &count);  line_ptr += count;      iParamSetButtonNames(extra, param);      break; @@ -1148,6 +1140,7 @@ static Ihandle *IupParamf(const char* format, int *line_size)                      Exported Functions  *******************************************************************************************/ +/* Used in IupLua also */  int iupGetParamCount(const char *format, int *param_extra)  {    int param_count = 0, extra = 0; @@ -1211,21 +1204,21 @@ int IupGetParamv(const char* title, Iparamcb action, void* user_data, const char        return 0;      data_type = IupGetInt(params[i], "DATA_TYPE"); -    if (data_type == 2) /* float */ +    if (data_type == IPARAM_TYPE_FLOAT)      {        float *data_float = (float*)(param_data[p]);        if (!data_float) return 0; -      iupAttribSetStrf(params[i], "VALUE", "%g", *data_float); +      iupAttribSetFloat(params[i], "VALUE", *data_float);        p++;      } -    else if (data_type == 1) /* integer */ +    else if (data_type == IPARAM_TYPE_INT)      {        int *data_int = (int*)(param_data[p]);        if (!data_int) return 0; -      iupAttribSetStrf(params[i], "VALUE", "%d", *data_int); +      iupAttribSetInt(params[i], "VALUE", *data_int);        p++;      } -    else if (data_type == 0)  /* string */ +    else if (data_type == IPARAM_TYPE_STR)      {        char *data_str = (char*)(param_data[p]);        if (!data_str) return 0; @@ -1255,31 +1248,25 @@ int IupGetParamv(const char* title, Iparamcb action, void* user_data, const char    }    else    { -    for (i = 0, p = 0; i < param_count; i++) +    for (i = 0, p = 0; i < param_count+param_extra; i++)      { -      Ihandle* param; -      int data_type; -      char str[20]; - -      sprintf(str, "PARAM%d", i); -      param = (Ihandle*)iupAttribGet(dlg, str); - -      data_type = iupAttribGetInt(param, "DATA_TYPE"); -      if (data_type == 1) +      Ihandle* param = params[i]; +      int data_type = iupAttribGetInt(param, "DATA_TYPE"); +      if (data_type == IPARAM_TYPE_INT)        { -        int *data_int = (int*)(param_data[i]); +        int *data_int = (int*)(param_data[p]);          *data_int = iupAttribGetInt(param, "VALUE");          p++;        } -      else if (data_type == 2) +      else if (data_type == IPARAM_TYPE_FLOAT)        { -        float *data_float = (float*)(param_data[i]); +        float *data_float = (float*)(param_data[p]);          *data_float = iupAttribGetFloat(param, "VALUE");          p++;        } -      else  +      else if (data_type == IPARAM_TYPE_STR)        { -        char *data_str = (char*)(param_data[i]); +        char *data_str = (char*)(param_data[p]);          strcpy(data_str, iupAttribGet(param, "VALUE"));          p++;        }  | 
