[Gambas-user] Custom controls, Non-String arrays in the IDE

Bruce Steers bsteers4 at gmail.com
Wed Aug 10 18:19:32 CEST 2022


On Wed, 10 Aug 2022 at 15:26, Benoit Minisini <
benoit.minisini at gambas-basic.org> wrote:

> Le 10/08/2022 à 15:46, Bruce Steers a écrit :
> >
> >
> > On Wed, 10 Aug 2022 at 14:08, Benoit Minisini
> > <benoit.minisini at gambas-basic.org
> > <mailto:benoit.minisini at gambas-basic.org>> wrote:
> >
> >     Le 10/08/2022 à 14:49, bb a écrit :
> >      > On Wed, 2022-08-10 at 13:13 +0100, Bruce Steers wrote:
> >      >> On Wed, 10 Aug 2022 at 11:53, Bruce Steers <bsteers4 at gmail.com
> >     <mailto:bsteers4 at gmail.com>>
> >      >> wrote:
> >      >>
> >      >>> You know how you can put the following in a custom control..
> >      >>>
> >      >>> *Public Const _Properties As String = "*,StringArray"*
> >      >>>
> >      >>> *Property StringArray As String[] Use $aStringArray*
> >      >>>
> >      >>> Then in the IDE form designer you'll get the StringArray
> property
> >      >>> and get
> >      >>> an editor to insert strings to the list.
> >      >>>
> >      >>> If i use ANY other type like Integer[] or Float[] then it does
> not
> >      >>> work
> >      >>> the same. i just get a combobox with "none" to select, and if i
> do
> >      >>> select
> >      >>> none i then have to manually edit the .form file to remove the
> def
> >      >>> as it
> >      >>> raises an error.
> >      >>>
> >      >>> Could the form designer also handle other types?
> >      >>> Integer[] and Float[] shouldn't be too hard to handle.
> >      >>> The existing string[] editor could be used then the items
> converted
> >      >>> to
> >      >>> their respective type array.
> >      >>>
> >      >>> Would open up a few things for me.
> >      >>>
> >      >>> I'm trying to add gradients to a control and want to handle the
> >      >>> Colors[]
> >      >>> and StopPoints[] in the IDE
> >      >>>
> >      >>> Can some method be added to a Custom control class that the IDE
> can
> >      >>> use to
> >      >>> pop up our own editor window ?
> >      >>> Something like this maybe?..
> >      >>>
> >      >>> *Public Const _Properties As String =
> "*,IntegerArray{IntList()}"*
> >      >>>
> >      >>> *Private Sub IntList() As Integer[]*
> >      >>>
> >      >>> *  FGetIntegers.ShowModal()*
> >      >>>
> >      >>> *  Return FGetIntegers.List*
> >      >>>
> >      >>> *End*
> >      >>>
> >      >>> then FIntegers pops open my own list editor
> >      >>>
> >      >>> Is something like this already possible ?
> >      >>>
> >      >>> Respects
> >      >>> BruceS
> >      >>>
> >      >>
> >      >> I'm thinking my second idea of letting us create a custom
> property
> >      >> editor
> >      >> window that could return any type required would be a lot more
> >     useful
> >      >> than
> >      >> just making Integer[] Float[] also work in the form designer.
> >      >> Possibly even less code as you'd just have to check for () in the
> >      >> _Properties def "*, MyPropertyName{type_is_method()}" then set
> the
> >      >> property
> >      >> edit button in the IDE to run the method and pass it's return
> data
> >      >> straight
> >      >> to the property.
> >      >>
> >      >> Hmm, When i put it that way it does sound like a fairly simple
> >      >> addition.  I
> >      >> might just have a browse through the IDE code and see if i can
> find
> >      >> the way.
> >      >>
> >      >> Respects
> >      >> BruceS
> >      >>
> >      >> ----[ http://gambaswiki.org/wiki/doc/netiquette
> >     <http://gambaswiki.org/wiki/doc/netiquette> ]----
> >      > Have a look at the "special" property editors used in the Report
> >      > designer. Although they are implemented inside the IDE, it could
> give
> >      > you the points at which you'd need to apply some surgery to the
> IDE.
> >      >
> >      > I did something like this years ago that let me design the
> property
> >      > editor inside the component rather than imposing changes on the
> IDE.
> >      > I just had a look at where I knew that I had used it in one
> component
> >      > and unfortunately I have disabled the said code and removed the
> >      > necessary changes to the IDE - sad as it did work a treat.
> >      >
> >      > My use was far above what you are trying but I bit on the "custom
> >      > property editor".
> >      >
> >      >  From memory the changes in the IDE were not that extravagant, the
> >      > tricky bit is getting the IDE to load the component and look for
> the
> >      > property editor in there.
> >      >
> >      > hth
> >      > b
> >      >
> >
> >     Mmm... No, thanks. I didn't want the IDE to load arbitrary
> components,
> >     and I still have the same opinion (for security reasons at least).
> >
> >     This is why all property types are directly handled by the IDE form
> >     editor.
> >
> >     As for the type of property you want to implement, are you sure that
> >     defining a gradient from the form editor is really worth it in your
> >     context?
> >
> >     A brush property type has been implemented for the Report forms, but
> >     it's because having a visual representation of what you are printing
> >     may
> >     be useful. It handles all brush types (and so gradients), even if
> >     printing gradients should be forbidden by the law of good taste.
> >
> >     Regards,
> >
> >     --
> >     Benoît Minisini.
> >
> >
> > Yes it handles all types but not all array types just String[], making
> > it a bit limited.
> >
> > For my context it is kinda really wanted,
> > After my recent education in gradients i'm upgrading my
> > GradientButton.class to handle multiple gradient points not just 2 and
> > use the Paint.LinearGradient() method not the one i made before i
> > discovered the Paint version..
> > https://forum.gambas.one/download/file.php?id=1128
> > <https://forum.gambas.one/download/file.php?id=1128>
> >
> > In the above image I am Implementing multiple colourstops by using
> > String[] then converting gambas Color names (using color integer strings
> > was not really possible to use color selector gui so i kept it simple
> > and use existing color names)  and working out the StopPoint float value
> > automatically by division of the number of values.
> > eg.
> > GradientButton5.ColorNames = ["Green", "Blue", "Yellow"]
> >
> > then in the _Draw() event...
> >    Dim Cols As Integer[] = [], Points As Float[] = []
> >
> >    If $aColorNames Then
> >      Dim fOnePos As Float = 1 / $aColorNames.Max
> >      Dim fPos As Float = 0, iCol As Integer
> >
> >      For i As Integer = 0 To $aColorNames.Max
> >        Try iCol = Object.GetProperty(Color, $aColorNames[i])
> >        If Error Then
> >         Dim sErr As String = Error.Text
> >         Dim sCols As String[] = GetGambasColourNames()
> >         Error.Raise($aColorNames[i] & "\n" & sErr & "\nUse only gambas
> > color names\n" & sCols.Sort().Join(", "))
> >        Endif
> >
> >        Cols.Add(iCol)
> >        Points.Add(fPos)
> >        fPos += fOnePos
> >      Next
> >    Else  ' use defaults
> >      Cols = [Col1, Col2]
> >      Points = [0, 1]
> >    Endif
> >
> > Because in the IDE String[] is all i really have to work with for an
> > array type property so i can set the string list.
> >
> > Looking at the ide code i'm wondering if Field,Fields type could be used
> > for my needs?
> >
> > Could you implement Array type? like my first idea of using the existing
> > String[] editor to edit then converting the strings to respective types?
> > And possibly a more complicated Color[] type to set multiple colors?
> > Dang, in my head this just got a lot more complicated :-\
> >
> >
> > Many thanks
> > BruceS
> >
>
> Let's put the usefullness of flashy gradient buttons aside. What you
> would need is actually a brush, not a gradient. The gradient is just a
> particular case of a brush.
>
> And editing a brush (or any other complex property) in the form editor
> needs:
>
> 1) An IDE internal string representation of the property.
>
> 2) A method in the Gambas component that converts that string into the
> real object, making that internal string representation part of the
> public API.
>
> 3) The corresponding property editor in the IDE.
>
> 4) The code that deals with the property kind in the form loading
> routine, saving routine, setting and getting property routines.
>
> If you don't understand, look how the Font property kind is handled.
>
> Implementing all that is not a five minutes job (hopefully the brush
> editor already exists in some way for the Report forms), and I usually
> do it when it's really useful. Anyway I can't do it now.
>
> Regards,
>
> --
> Benoît Minisini


No worries Ben, thanks for the info.
I'm currently playing with the idea of being able to use any already
supported property type like _Properties = "*,MyColor{Color}" for example
but in array mode using the existing single property editing routines.
something like _Properties = "*,MyColor{Array[Color]}"

So a single extra form like FList.form (I called it FArrayChooser) that
adds entries on clicking "Insert" like normally clicking a single "Color"
property, uses FProperty.class txtProperty_Click() routines to open the
relevant chooser, this one should be able to handle all the existing
handled types using the existing routines/editing dialogs from
FProperty.txtProperty_Click()  but in array mode and show the values in
string form.

Again thanks for the info/pointers , yes this is useful to me more than you
i guess.  I'll just stick with the string conversion for now.

ooh, Hang on ,, i just discovered Ctrl-Shift-C pops open a color selector
in the IDE :)  lol
That changes things, i guess i can add info to use a
GradientButton.AddColour() method using code and use Ctrl-Shift-C to easily
get the color value :)

haha, i love gambas, there's always a way :)

Respects
BruceS
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20220810/6d033b6e/attachment.htm>


More information about the User mailing list