Prima
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
class/AbstractMenu.c view on Meta::CPAN
if ( count == 1)
l_var = 0;
else /* auto-grouping ends with a divider */
stop_group = true;
} else if ( count == 2) {
if ( last_item_is_a_hash ) {
l_var = 0;
l_options = 1;
} else {
l_text = 0;
l_sub = 1;
}
} else if ( count == 3) {
if ( last_item_is_a_hash ) {
l_text = 0;
l_sub = 1;
l_options = 2;
} else {
l_var = 0;
l_text = 1;
l_sub = 2;
}
} else if ( count == 4) {
if ( last_item_is_a_hash ) {
l_var = 0;
l_text = 1;
l_sub = 2;
l_options = 3;
} else {
l_text = 0;
l_accel = 1;
l_key = 2;
l_sub = 3;
}
} else if ( count == 5) {
l_var = 0;
l_text = 1;
l_accel = 2;
l_key = 3;
l_sub = 4;
} else {
l_var = 0;
l_text = 1;
l_accel = 2;
l_key = 3;
l_sub = 4;
l_options = 5;
}
if ( m) curr = curr-> next = r; else curr = m = r; /* adding to list */
r-> flags. rightAdjust = rightAdjust ? 1 : 0;
r-> id = ++(var-> autoEnum);
#define a_get( l_, fl_, num) \
if ( num >= 0 ) { \
holder = av_fetch( item, num, 0); \
if ( holder) { \
if ( SvOK(*holder)) { \
l_ = duplicate_string( SvPV_nolen( *holder)); \
fl_ = prima_is_utf8_sv(*holder); \
} \
} else { \
warn("menu build error: array panic"); \
my-> dispose_menu( self, m); \
return NULL; \
} \
}
a_get( r-> accel , r-> flags. utf8_accel, l_accel);
a_get( r-> variable, r-> flags. utf8_variable, l_var);
if ( l_key >= 0) {
holder = av_fetch( item, l_key, 0);
if ( !holder) {
warn("menu build error: array panic");
my-> dispose_menu( self, m);
return NULL;
}
r-> key = key_normalize( SvPV_nolen( *holder));
}
if ( r-> variable)
{
#define s r-> variable
#define PARSE(name) \
if ( r-> flags. divider ) \
warn("warning: " #name " flag ignored on a divider menu");\
else \
r-> flags. name = 1; \
decr++; \
break;
int i, decr = 0;
for ( i = 0; ; i++) {
switch ( s[i]) {
case '-': PARSE(disabled);
case '*': PARSE(checked);
case '@': PARSE(autotoggle);
case '?': PARSE(custom_draw);
case '(':
if ( !avt-> max_group_initialized ) {
my-> first_that( self, (void*) &avt_init, avt, true);
avt-> max_group_initialized = true;
}
if ( r-> flags. divider )
/* variable name hinted , continue */
stop_group = false;
else if ( avt-> curr_group != 0) {
/* that's okay, reuse the last group */
} else if ( avt-> max_group >= 0 )
avt-> curr_group = ++avt-> max_group;
decr++;
break;
case ')':
if ( avt-> curr_group == 0 ) {
warn("group closing outside parentheses, ignoring");
} else {
r-> group = avt->curr_group;
avt-> curr_group = 0;
}
decr++;
break;
default : goto STOP;
}
}
STOP:
if ( decr) memmove( s, s + decr, strlen( s) + 1 - decr);
if ( strlen( s) == 0 || is_var_id_name( s) != 0) {
free( s);
s = NULL;
}
#undef s
}
if ( stop_group )
avt-> curr_group = 0;
if ( avt-> curr_group != 0 && !r-> flags. divider)
r-> group = avt-> curr_group;
/* parsing text */
if ( l_text >= 0)
{
holder = av_fetch( item, l_text, 0);
if ( !holder) {
warn("menu build error: array panic");
my-> dispose_menu( self, m);
return NULL;
}
subItem = *holder;
if ( SvROK( subItem)) {
Handle c_object = gimme_the_mate( subItem);
if ( !register_image(c_object))
goto TEXT;
r-> bitmap = c_object;
} else {
TEXT:
r-> text = duplicate_string( SvPV_nolen( subItem));
r-> flags. utf8_text = prima_is_utf8_sv( subItem);
}
}
/* parsing sub */
if ( l_sub >= 0)
{
holder = av_fetch( item, l_sub, 0);
if ( !holder) {
warn("menu build error: array panic");
my-> dispose_menu( self, m);
return NULL;
}
subItem = *holder;
if ( SvROK( subItem)) {
if ( SvTYPE( SvRV( subItem)) == SVt_PVCV) {
r-> code = newSVsv( subItem);
} else {
int save;
save = avt-> curr_group;
avt-> curr_group = 0;
r-> down = ( PMenuItemReg) my-> new_menu( self, subItem, level + 1, avt);
avt-> curr_group = save;
if ( r-> down == NULL) {
/* seems error was occurred inside this call */
my-> dispose_menu( self, m);
return NULL;
}
}
} else {
if ( SvPOK( subItem)) {
r-> perlSub = duplicate_string( SvPV_nolen( subItem));
r-> flags. utf8_perlSub = prima_is_utf8_sv( subItem);
} else {
warn("menu build error: invalid sub name passed");
}
}
}
/* parsing options */
if ( l_options >= 0)
{
holder = av_fetch( item, l_options, 0);
if ( !holder) {
warn("menu build error: array panic");
my-> dispose_menu( self, m);
return NULL;
}
if (!( SvOK( *holder) && SvROK( *holder) && SvTYPE( SvRV( *holder)) == SVt_PVHV)) {
warn("menu build error: options is not a hashref");
} else {
dPROFILE;
HV * profile = (HV*) SvRV(*holder);
if ( pexist( icon )) {
Handle c_object = pget_H(icon);
if ( register_image(c_object))
r-> icon = c_object;
pdelete(icon);
}
if ( pexist( group )) {
r-> group = pget_i(group);
pdelete(group);
}
}
r-> options = newSVsv( *holder);
}
}
return m;
}
void
AbstractMenu_init( Handle self, HV * profile)
{
dPROFILE;
inherited init( self, profile);
var-> anchored = kind_of( self, CMenu);
my-> update_sys_handle( self, profile);
my-> set_items( self, pget_sv( items));
if ( var-> system) apc_menu_update( self, NULL, var-> tree);
if ( pget_B( selected)) my-> set_selected( self, true);
CORE_INIT_TRANSIENT(AbstractMenu);
}
void
AbstractMenu_done( Handle self)
{
if ( var-> system) apc_menu_destroy( self);
my-> dispose_menu( self, var-> tree);
var-> tree = NULL;
inherited done( self);
}
Bool
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.233 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )