bool Cell::can_go(char direction) { return (1 << (3 - get_mask_index(direction))) & bitmask; }
void Cell::open(char direction) { bitmask |= (1 << (3 - get_mask_index(direction))); }
void Cell::close(char direction) { bitmask &= (~(1 << (3 - get_mask_index(direction)))); }
int GrowToolbar::event_handler( GlowWind *w, glow_eEvent event, int x, int y, double fx, double fy) { int sts, lsts; int hot_type; int idx, mask_idx, category; double rx, ry; if ( invisible || dimmed) return 0; if ( !ctx->trace_started) return GrowNode::event_handler( w, event, x, y, fx, fy); switch ( event) { case glow_eEvent_Key_Right: case glow_eEvent_Key_Left: case glow_eEvent_Key_BackSpace: case glow_eEvent_Key_Return: case glow_eEvent_Key_Ascii: case glow_eEvent_Key_Up: case glow_eEvent_Key_Down: return 0; default: ; } // Convert koordinates to local koordinates trf.reverse( fx, fy, &rx, &ry); sts = 0; if ( event == ctx->event_move_node) { sts = nc->event_handler( w, event, rx, ry); if ( sts) { /* Register node for potential movement */ ctx->move_insert( this); store_position(); } return sts; } else if ( event == ctx->event_create_con) { return sts; } switch ( event) { case glow_eEvent_MB1Down: if ( ctx->trace_started) { sts = nc_event_handler( w, event, rx, ry, &idx); if ( sts) ((GrowNode *)nc->a.a[idx])->set_color_inverse(1); } break; case glow_eEvent_MB1Up: if ( ctx->trace_started) { sts = nc_event_handler( w, event, rx, ry, &idx); if ( sts) ((GrowNode *)nc->a.a[idx])->set_color_inverse(0); } break; case glow_eEvent_CursorMotion: { int redraw = 0; if ( ctx->hot_mode == glow_eHotMode_TraceAction) { if ( ctx->hot_found) sts = 0; else { if ( is_sensitive()) { sts = nc_event_handler( w, event, rx, ry, &idx); if ( sts) { ((GrowNode *)nc->a.a[idx])->set_hot(1); redraw = 1; ctx->hot_found = 1; } } } } else { if ( ctx->hot_found) sts = 0; else { sts = nc_event_handler( w, event, rx, ry, &idx); if ( sts) ctx->hot_found = 1; } } if ( sts && !hot && !(ctx->node_movement_active || ctx->node_movement_paste_active)) { if ( (hot_type = ctx->send_hot_request( this))) { if ( !ctx->trace_started) { ctx->gdraw->set_cursor( w, glow_eDrawCursor_CrossHair); hot = 1; redraw = 1; ctx->tiptext_event( this, x, y); } else if ( hot_type & glow_mHotType_CursorCrossHair) { ctx->gdraw->set_cursor( w, glow_eDrawCursor_CrossHair); hot_tool = idx + 1; lsts = get_mask_index( idx, &category, &mask_idx); if ( ODD(lsts)) ctx->tiptext_toolbar_event( this, x, y, category, mask_idx); redraw = 1; } else if ( hot_type & glow_mHotType_CursorHand) { ctx->gdraw->set_cursor( w, glow_eDrawCursor_Hand); hot_tool = idx + 1; lsts = get_mask_index( idx, &category, &mask_idx); if ( ODD(lsts)) ctx->tiptext_toolbar_event( this, x, y, category, mask_idx); redraw = 1; } } } if ( !sts && (( !ctx->trace_started && hot) || (ctx->trace_started && hot_tool))) { if ( !ctx->hot_found) ctx->gdraw->set_cursor( w, glow_eDrawCursor_Normal); if ( root_node) root_node->erase( w); else erase( w); if ( hot_tool) ((GrowNode *)nc->a.a[hot_tool - 1])->set_hot(0); hot_tool = 0; hot = 0; redraw = 1; ctx->tiptext->remove_text( this); } if ( redraw) { draw(); } break; } case glow_eEvent_MB1Click: sts = nc_event_handler( w, event, rx, ry, &idx); if ( sts) { lsts = get_mask_index( idx, &category, &mask_idx); if ( ODD(lsts)) ((GrowCtx *)ctx)->send_toolbar_callback( this, event, fx, fy, category, mask_idx); } break; default: sts = nc_event_handler( w, event, rx, ry, &idx); } return sts; }