/* Ф-я предназначена только для вызова из CallBack'а QSP_CALL_SHOWMENU */ AS3_Val QSPSelectMenuItem(void *param, AS3_Val args) { int index; QSPVariant arg; AS3_ArrayValue(args, "IntType", &index); if (index >= 0 && index < qspCurMenuItems) { if (qspIsDisableCodeExec) return AS3_True(); arg.IsStr = QSP_FALSE; QSP_NUM(arg) = index + 1; qspExecLocByNameWithArgs(qspCurMenuLocs[index], &arg, 1); } return AS3_True(); }
QSP_BOOL qspStatementShowMenu(QSPVariant *args, int count, QSP_CHAR **jumpTo, int extArg) { QSPVar *var; QSPVariant arg; int ind, itemsCount, maxItems, len; QSP_CHAR *menuLocs[QSP_MAXMENUITEMS], *imgPath, *str, *pos, *pos2; if (!(var = qspVarReferenceWithType(QSP_STR(args[0]), QSP_FALSE, 0))) return QSP_FALSE; qspCallDeleteMenu(); if (count == 1) { ind = 0; maxItems = QSP_MAXMENUITEMS; } else { ind = QSP_NUM(args[1]); if (ind < 0) ind = 0; if (count == 2) maxItems = QSP_MAXMENUITEMS; else { maxItems = QSP_NUM(args[2]); if (maxItems < 0) maxItems = 0; } } itemsCount = 0; while (ind < var->ValsCount) { if (itemsCount == maxItems) break; if (!((str = var->Values[ind].Str) && qspIsAnyString(str))) break; if (!(pos2 = qspInStrRChars(str, QSP_MENUDELIM, 0))) { qspSetError(QSP_ERR_COLONNOTFOUND); return QSP_FALSE; } if (itemsCount == QSP_MAXMENUITEMS) { qspSetError(QSP_ERR_CANTADDMENUITEM); return QSP_FALSE; } if (pos = qspInStrRChars(str, QSP_MENUDELIM, pos2)) { len = (int)(pos2 - pos) - 1; imgPath = (qspIsAnyString(++pos2) ? qspGetAbsFromRelPath(pos2) : 0); } else { pos = pos2; len = -1; imgPath = 0; } menuLocs[itemsCount++] = qspGetNewText(pos + 1, len); *pos = 0; qspCallAddMenuItem(str, imgPath); *pos = QSP_MENUDELIM[0]; if (imgPath) free(imgPath); ++ind; } if (itemsCount) { ind = qspCallShowMenu(); if (ind >= 0 && ind < itemsCount) { arg.IsStr = QSP_FALSE; QSP_NUM(arg) = ind + 1; qspExecLocByNameWithArgs(menuLocs[ind], &arg, 1, 0); } while (--itemsCount >= 0) free(menuLocs[itemsCount]); } return QSP_FALSE; }