GLBasic forum

Codesnippets => DD-GUI => Topic started by: Quentin on 2009-Aug-19

Title: Moveable dialogs don't work with text input fields
Post by: Quentin on 2009-Aug-19
When setting a DDGui dialog MOVEABLE and a text input field within the dialog get the focus, the dialog is no longer moveable.

Example:
Code (glbasic) Select

DDgui_pushdialog(100, 100, 200, 100)
DDgui_set("", "TEXT", "Test dialog")
DDgui_set("", "MOVEABLE", TRUE)

LOCAL line$ = "test text"
DDgui_widget("", "Test input:", 0, 0)
DDgui_text("tx_test", line$, 80, 0)

WHILE TRUE
DDgui_show(FALSE)
SHOWSCREEN
WEND
Title: Re: Moveable dialogs don't work with text input fields
Post by: Kitty Hello on 2009-Aug-19
oops.
Title: Re: Moveable dialogs don't work with text input fields
Post by: Quentin on 2009-Aug-20
found one possible solution for it.
I think problem is, that the focus is set permanently for text input fields, not only for the time of a click, right?
So I changed function DDgui_show_intern and delete the focus, when dialog is moved and restore it afterwards.
(added commands are colored in red)
It works, can't see any side effects since now.

   // MOVE dialog
   IF is_current
      // handle move-bar
      IF ddgui_vals.moveable%
         LOCAL l_focus$
         l_focus$ = ddgui_vals.focus$
         ddgui_vals.focus$ = ""
         IF realb1
            i=BOXCOLL(x,y,width,ty, mx,my,1,1)
            IF (i OR ddgui_vals.moving%) AND LEN(ddgui_vals.focus$)=0
               ddgui_vals.moving%=TRUE
               x = MAX(0, x + mx - movemousex%)
               y = MAX(0, y + my - movemousey%)
               ddgui_vals.xpos = x
               ddgui_vals.ypos = y
            ENDIF
         ELSE
            ddgui_vals.moving%=FALSE
         ENDIF
         ddgui_vals.focus$ = l_focus$
      ENDIF
   ENDIF
Title: Re: Moveable dialogs don't work with text input fields
Post by: Kitty Hello on 2009-Aug-20
You da man! So many thanks. I'll add that to the next update.
Title: Re: Moveable dialogs don't work with text input fields
Post by: Quentin on 2009-Aug-20
Fine. Thanks!  =D
Title: Re: Moveable dialogs don't work with text input fields
Post by: Kitty Hello on 2009-Aug-20
Line 848. Add:
ddgui_vals.focus$=""

That is, when you press the left button down, clear the current focus.
Title: Re: Moveable dialogs don't work with text input fields
Post by: Quentin on 2009-Aug-20
yes, but I didn't want the text field loose its focus. So I think it's better to restore it afterwards as it's nearer to the behavior of "normal" windows programs :)
Title: Re: Moveable dialogs don't work with text input fields
Post by: Kitty Hello on 2009-Aug-20
oh dear. Because with your method, when a dialog has a slider and you slide too much up, the moving starts.
Title: Re: Moveable dialogs don't work with text input fields
Post by: Quentin on 2009-Aug-20
oops, you're right. So restoring focus is only necessary for text input field.

new suggestion (ok, looks not even nice, I think)

   // MOVE dialog
   IF is_current
      // handle move-bar
      IF ddgui_vals.moveable%
         LOCAL l_clearfocus%, l_focus$
         FOREACH w IN ddgui_vals.widgets[]
            IF w.wid$ = ddgui_vals.focus$ AND w.wtype$ = "TEXT"
               l_clearfocus = TRUE
               BREAK
            ENDIF
         NEXT
         IF l_clearfocus
            l_focus$ = ddgui_vals.focus$
            ddgui_vals.focus$ = ""
         ENDIF
         IF realb1
            i=BOXCOLL(x,y,width,ty, mx,my,1,1)
            IF (i OR ddgui_vals.moving%) AND LEN(ddgui_vals.focus$)=0
               ddgui_vals.moving%=TRUE
               x = MAX(0, x + mx - movemousex%)
               y = MAX(0, y + my - movemousey%)
               ddgui_vals.xpos = x
               ddgui_vals.ypos = y
            ENDIF
         ELSE
            ddgui_vals.moving%=FALSE
         ENDIF
         IF l_clearfocus THEN ddgui_vals.focus$ = l_focus$
      ENDIF
   ENDIF
Title: Re: Moveable dialogs don't work with text input fields
Post by: Kitty Hello on 2009-Aug-20
The focus of a scrollbar will be "SB" + widgetname$, thus the main dialog has no name and focus$="SB".

Might be wise to check against MID$(focus$,0,2)="SB", though.