Prima

 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 distribution
 view release on metacpan -  search on metacpan

( run in 1.233 second using v1.00-cache-2.02-grep-82fe00e-cpan-1925d2aa809 )