Beispiel #1
0
static void ledit_dispatch( UThread* ut, GWidget* wp, const GLViewEvent* ev )
{
    EX_PTR;

    //printf( "KR ledit %d\n", ev->type );
    switch( ev->type )
    {
        case GLV_EVENT_BUTTON_DOWN:
            if( (ev->code == GLV_BUTTON_LEFT) ||
                (ev->code == GLV_BUTTON_MIDDLE) )
            {
                ledit_setState( ut, ep, LEDIT_STATE_EDIT );
                gui_setKeyFocus( wp );

                if( ev->code == GLV_BUTTON_LEFT )
                {
                    // Don't have access to font here so just notify render.
                    ep->newCursorX = ev->x;
                    setFlag( NEW_CURSORX );
                }
                else // if( ev->code == GLV_BUTTON_MIDDLE )
                {
                    ledit_paste( ut, ep );
                    setFlag( CHANGED );
                }
            }
            break;

        case GLV_EVENT_BUTTON_UP:
        case GLV_EVENT_MOTION:
            break;

        case GLV_EVENT_KEY_DOWN:
            if( ep->strN )
            {
                UBuffer* str = ur_buffer( ep->strN );

                if( ev->state & GLV_MASK_CTRL )
                {
                    if( ev->code == KEY_k )
                    {
                        // Remove from cursor to end (from Bash).
                        int len = str->used - ep->editPos;
                        if( len > 0 )
                        {
                            ur_arrErase( str, ep->editPos, len );
                            setFlag( CHANGED );
                        }
                    }
                    else if( ev->code == KEY_v )
                    {
                        ledit_paste( ut, ep );
                        setFlag( CHANGED );
                    }
                    break;
                }

                switch( ev->code )
                {
                    case KEY_Return:
                        goto activate;

                    case KEY_Left:
                        if( ep->editPos > 0 )
                        {
                            --ep->editPos;
                            setFlag( CHANGED );
                        }
                        break;

                    case KEY_Right:
                        if( ep->editPos < str->used )
                        {
                            ++ep->editPos;
                            setFlag( CHANGED );
                        }
                        break;

                    case KEY_Home:
                        ep->editPos = 0;
                        setFlag( CHANGED );
                        break;

                    case KEY_End:
                        ep->editPos = str->used;
                        setFlag( CHANGED );
                        break;

                    case KEY_Insert:
                        break;

                    case KEY_Delete:
                        if( ep->editPos < str->used )
                        {
                            ur_arrErase( str, ep->editPos, 1 );
                            setFlag( CHANGED );
                        }
                        break;

                    case KEY_Back_Space:
                        if( ep->editPos > 0 )
                        {
                            --ep->editPos;
                            ur_arrErase( str, ep->editPos, 1 );
                            setFlag( CHANGED );
                        }
                        break;

                    default:
                        if( str->used < ep->maxChars )
                        {
                            int key = KEY_ASCII(ev);
                            if( key >= ' ' )
                            {
                                if( ep->filterN )
                                {
                                    UBuffer* bin = ur_buffer( ep->filterN );
                                    if( ! _bitIsSet( bin->ptr.b, key ) )
                                        break;
                                }

                                ur_arrExpand( str, ep->editPos, 1 );
                                if( ur_strIsUcs2(str) )
                                    str->ptr.u16[ ep->editPos ] = key;
                                else
                                    str->ptr.b[ ep->editPos ] = key;
                                ++ep->editPos;
                                setFlag( CHANGED );
                            }
                            else
                            {
                                gui_ignoreEvent( ev );
                            }
                        }
                        break;
                }
            }
            break;

        case GLV_EVENT_KEY_UP:
            gui_ignoreEvent( ev );
            break;

        case GLV_EVENT_FOCUS_IN:
            break;

        case GLV_EVENT_FOCUS_OUT:
            ledit_setState( ut, ep, LEDIT_STATE_DISPLAY );
            break;
    }
    return;

activate:

    if( ep->codeN )
        gui_doBlockN( ut, ep->codeN );
}
Beispiel #2
0
static void itemview_dispatch( UThread* ut, GWidget* wp, const GLViewEvent* ev )
{
    EX_PTR;
    (void) ut;
/*
    UCell* val;
    UCell* cell;
    UBuffer* cblk;

    if( ! wp->cell[0].ctx.valBlk )
        return;
    cblk = ur_blockPtr( wp->cell[0].ctx.valBlk );
    val = ur_s_next(UR_TOS);
*/

    switch( ev->type )
    {
/*
        case GLV_EVENT_FOCUS_IN:
            ur_initType(val, UT_LOGIC);
            ur_logic(val) = 1;
            break;

        case GLV_EVENT_FOCUS_OUT:
            ur_initType(val, UT_LOGIC);
            ur_logic(val) = 0;
            break;

        case GLV_EVENT_RESIZE:
            break;
*/
        case GLV_EVENT_BUTTON_DOWN:
        {
            double prevTime;
            int top = wp->area.y + wp->area.h + ep->scrollY;
            int row = (top - ev->y) / ep->itemHeight;

            if( itemview_validRow( ep, row ) )
            {
                prevTime = ep->clickTime;
                ep->clickTime = ur_now();

                if( row != ep->selRow )
                {
                    ep->selRow = row;
                    itemview_updateSelection( ep );
                }
                else if( (ep->clickTime - prevTime) < GUI_DCLICK_TIME )
                {
                    if( ep->actionBlkN != UR_INVALID_BUF )
                        gui_doBlockN( ut, ep->actionBlkN );
                }
            }
            gui_setKeyFocus( wp );
            //printf( "KR down %d,%d row %d\n", ev->x, ev->y, row );
        }
            break;
/*
        case GLV_EVENT_BUTTON_UP:
            ur_initType(val, UT_INT);
            ur_int(val) = mapButton( ev->code );
            cell = CCELL( CI_TWIDGETPROTO_MOUSE_UP );
            break;

        case GLV_EVENT_MOTION:
            // coord elements: x, y, dx, dy
            ur_initType(val, UT_COORD);
            val->coord.len     = 5;
            val->coord.n[0] = ev->x - wp->x;
            //val->coord.n[1] = (ui->rootH - ev->y - 1) - wp->y;
            val->coord.n[1] = ev->y - wp->y;
            val->coord.n[2] = glEnv.mouseDeltaX;
            val->coord.n[3] = glEnv.mouseDeltaY;
            val->coord.n[4] = ev->state;

            cell = CCELL( CI_TWIDGETPROTO_MOUSE_MOVE );
            break;
*/
        case GLV_EVENT_WHEEL:
            itemview_scroll( ep, ev->y >> 2 );
            break;

        case GLV_EVENT_KEY_DOWN:
            switch( ev->code )
            {
                case KEY_Return:
                    if( ep->actionBlkN != UR_INVALID_BUF )
                        gui_doBlockN( ut, ep->actionBlkN );
                    return;

                case KEY_Up:
                    itemview_selectPrevItem( wp );
                    return;
                case KEY_Down:
                    itemview_selectNextItem( wp );
                    return;
            }
            // Fall through...

        case GLV_EVENT_KEY_UP:
            gui_ignoreEvent( ev );
            break;
    }
}
Beispiel #3
0
static void slider_dispatch( UThread* ut, GWidget* wp, const GLViewEvent* ev )
{
    EX_PTR;
    //printf( "KR button %d\n", ev->type );

    switch( ev->type )
    {
        case GLV_EVENT_BUTTON_DOWN:
            if( ev->code == GLV_BUTTON_LEFT )
            {
                int pd, rd;

                gui_grabMouse( wp, 1 );

                if( ep->orient == HORIZONTAL )
                {
                    pd = ev->x;
                    rd = ev->x - wp->area.x;
                }
                else
                {
                    pd = ev->y;
#ifdef YTOP
                    rd = ev->y - wp->area.y;
#else
                    rd = wp->area.y + wp->area.h - ev->y;
#endif
                }

                // Do relative movement if the pointer is over the knob.
                if( rd >= ep->td && rd < (ep->td + ep->knobLen) )
                {
                    ep->held = 2;
#ifndef YTOP
                    if( ep->orient == VERTICAL )
                        ep->dragOff = ev->y -(wp->area.y + wp->area.h - ep->td);
                    else
#endif
                        ep->dragOff = rd - ep->td;
                }
                else
                {
                    ep->held = 1;
                    if( slider_place( ep, pd ) )
                        goto trans;
                }
            }
            break;

        case GLV_EVENT_BUTTON_UP:
            if( ev->code == GLV_BUTTON_LEFT )
            {
                int pressed = (ep->state == BTN_STATE_DOWN);
                gui_ungrabMouse( wp );
                ep->held = 0;
                if( pressed && gui_widgetContains( wp, ev->x, ev->y ) )
                    goto activate;
            }
            break;

        case GLV_EVENT_MOTION:
            if( ep->held )
            {
                int pd = (ep->orient == HORIZONTAL) ? ev->x : ev->y;
                if( ep->held == 2 )
                    pd -= ep->dragOff;
                if( slider_place( ep, pd ) )
                    goto trans;
            }
            break;

        case GLV_EVENT_KEY_DOWN:
            if( ev->code == KEY_Left )
            {
                if( slider_adjust( ep, -1.0 ) )
                    goto trans;
            }
            else if( ev->code == KEY_Right )
            {
                if( slider_adjust( ep, 1.0 ) )
                    goto trans;
            }
            else if( ev->code == KEY_Home )
            {
                if( slider_adjust( ep, -9999999.0 ) )
                    goto trans;
            }
            else if( ev->code == KEY_End )
            {
                if( slider_adjust( ep, 9999999.0 ) )
                    goto trans;
            }
            // Fall through...

        case GLV_EVENT_KEY_UP:
            gui_ignoreEvent( ev );
            break;

        case GLV_EVENT_FOCUS_IN:
            break;

        case GLV_EVENT_FOCUS_OUT:
            //slider_setState( ut, ep, BTN_STATE_UP );
            break;
    }
    return;

trans:
    if( ep->dpTrans )
    {
        UIndex resN = gui_parentDrawProg( wp );
        if( resN != UR_INVALID_BUF )
        {
            float tx, ty;
            if( ep->orient == HORIZONTAL )
            {
                tx = (float) ep->td;
                ty = 0.0f;
            }
            else
            {
                tx = 0.0f;
#ifdef YTOP
                ty = (float) ep->td;
#else
                ty = (float) (wp->area.h - ep->knobLen - ep->td);
#endif
            }
            ur_setTransXY( ut, resN, ep->dpTrans, tx, ty );
        }
    }
activate:
    if( ep->actionN )
        gui_doBlockN( ut, ep->actionN );
}