• Welcome to Powerbasic Museum 2020-B.
 

News:

Forum in repository mode. No new members allowed.

Main Menu

There is a future for those who felt abandonned

Started by Patrice Terrier, September 28, 2013, 11:35:01 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Patrice Terrier

These two videos, would show you what i call a modern GUI, demonstrating a few of the new features in Fly V4.
Fly is a combination of WinDev/GDImage + Bass.dll and a dedicated PowerBASIC.dll to perform the real time critical code.

http://youtu.be/hIIHryk7mMY

http://youtu.be/6PI3QkV0dXg

More details and screen shots about Fly V4

There is a future for those who felt abandonned ;)

...
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#1
Those who have no idea of what WinDev is, please take a look at this {old} video.
http://www.pcsoft-windev-webdev.com/videos16/us/ui-new-features/index.html

...
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#2
The WinDev staff is very creative: one new version per year, with more than 900 {new} features in each release ;)

But to say the truth, you must always wait 6 monthes before the {new} version could really be used in production.
WinDev itself is written in C++, and this is the reason why they are always able to incorporate the latest Windows features. They were the first company on the market, to provide a full programming environment in Mandarin, for me that is what i call to have a clear vision of the future.  8)

Their R&D staff recrute the best european programmers, and they have a pool of more than 100 developpers working at full time on the product. The dark part of their success story is that the company is always under pressure of the shareholders, to produce a new version per year, thus a good knowledge of the core API is handy to work around the bugs that are left over from one version to another, but all in one nothing could compete with it.

...
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#3
Is that PowerBASIC or WinDev code?

PROCEDURE gl_DrawScene()

nK, nI, nJ are 4-byte int
rX, rY, rZ, rHalfRadius, rValue are 4-byte real
sTitle is string

nAngle is int = modulo(GetStaticValue(ST_ANGLE) + 1, 360)
SetStaticValue(ST_ANGLE, nAngle)
IF gr_Percent < 1 THEN gr_Percent += 0.002

nFlip is int = NOT GetStaticValue(ST_FLIP)
SetStaticValue(ST_FLIP, nFlip)
IF nFlip = 0 THEN RETURN

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

glLoadIdentity()

// Draw image background
gl_DisableAmbience()
   glColor4ub(255,255,255,255)
   GL_BindTexture(GL_TEXTURE_2D, gn_TexSpecular)
   GL_DrawQuad(50,25,-60)
gl_EnableAmbience()

// Mousing coordinates
glTranslatef(gr_ChartXoff, gr_ChartYoff, gr_ChartZoff)
// Zooming factor.
glScalef(gr_ChartZoom, gr_ChartZoom, gr_ChartZoom)
// Mousing rotation
glRotatef(-gr_ChartYrot, 1, 0, 0)
glRotatef(-gr_ChartXrot, 0, 1, 0)

szTxt is string ASCIIZ on 16

// Draw a transparent ring around the rotation axis.
glColor4ub(255,255,255, 128)
GL_TexSpec(True)
   GL_BindTexture(GL_TEXTURE_2D, gn_TexChrome)
   GL_ChartRing(0.25, 3, 48, 48)
GL_TexSpec(False)

// Draw the chart
glPushMatrix()
   GL_TexSpec(True) // Enable specular effect on texture
// Use chrome texture to draw the chart graph.
   GL_BindTexture(GL_TEXTURE_2D, gn_TexChrome)
   nK = 0
   rHalfRadius = g_Chart.radius * 0.5
   glTranslatef(g_Chart.radius + rHalfRadius, 0.0, g_Chart.radius + rHalfRadius)
   FOR nI = 1 _TO_ g_Chart.chartnumber
      // Set color for the chart serie
      ZI_glColor4f(gn_ChartColor[nI])
      FOR nJ = 1  _TO_ g_Chart.chartseries
         // Draw the matching chart item
         nK += 1
         IF gr_Percent < 1 THEN
            rValue = gr_ChartValue[nK] * gr_Percent
            IF modulo(nI, 2) = 0 THEN
               GL_ChartCylinder (g_Chart.radius * 0.75, rValue, 32, 1)
            ELSE
               IF nI = 1 THEN
                  GL_ChartBar (g_Chart.radius * 0.75, g_Chart.radius * 0.75, rValue)
               ELSE
                  GL_ChartPyramide (g_Chart.radius * 0.75, rValue)
               END
            END
         ELSE
            glCallList(gn_ChartItem[nK])
         END

         glTranslatef(2.1 * g_Chart.radius, 0.0, 0.0)
      END
      glTranslatef((-2.1 * g_Chart.radius) * g_Chart.chartseries, 0.0, 2.1 * g_Chart.radius)
   END
   GL_TexSpec(False) // Disable specular effect on texture
glPopMatrix()

// Restore the default background texture.
GL_BindTexture(GL_TEXTURE_2D, gn_TexSpecular)

// Draw XYZ text.
FOR nI = 0 TO 10
   szTxt = NumToString(nI * 10)
   GL_DrawText (gn_GLwnd, gst_UseFont, g_Chart.chartseries * (g_Chart.radius * 2.1) + g_Chart.radius - 0.1, nI, 0, szTxt, ZD_ARGB(255, 0,255,0))
   GL_DrawText (gn_GLwnd, gst_UseFont, 0.1, nI, g_Chart.chartnumber * (g_Chart.radius * 2.1) + g_Chart.radius + 0.5, szTxt, ZD_ARGB(255, 0,255,0))
END

// Draw the XYZ grid
glLineWidth(1.0)
glCallList(g_Chart.listIndex)

// Draw the podium
glPushMatrix()
   GL_TexSpec(True) // Enable specular effect on texture
   glColor4ub(255,255,255, 128)
   rX = g_Chart.chartseries * (g_Chart.radius * 1.05)
   rY = g_Chart.chartnumber * (g_Chart.radius * 1.05)
   rZ = 0
   glTranslatef(rX + g_Chart.radius * 0.5, -0.1, rY + g_Chart.radius * 0.5)
   GL_ChartBar(rX + g_Chart.radius * 1.5, rY + g_Chart.radius * 1.5, -0.2)
   GL_TexSpec(False) // Disable specular effect on texture
glPopMatrix()

// Draw XYZ translucent glass panels
GL_TexSpec(True) // Enable specular effect on texture
   rX = g_Chart.chartseries * (g_Chart.radius * 2.1) + g_Chart.radius
   rY = 10
   rZ = g_Chart.chartnumber * (g_Chart.radius * 2.1) + g_Chart.radius
   glColor4ub(240,240,255, 64) // Transparent light blue color.
   GL_ChartAxisPanel(rX, rY, rZ)
GL_TexSpec(False) // Disable specular effect on texture

// Draw legend using GDImage bitmapped font.
glPushMatrix()
   gl_DisableAmbience()
   glColor4ub(255,255,255, 255)
   FOR nI = 1 _TO_ g_Chart.chartnumber
      glPushMatrix()
         glTranslatef((2.1 * g_Chart.radius) * g_Chart.chartseries + rHalfRadius * 1.25, rHalfRadius * 0.6, g_Chart.radius + rHalfRadius)
         IF modulo(nI, 2) = 0 THEN
            glRotatef(-nAngle, 0, 1, 0)
         ELSE
            glRotatef(-nAngle, 1, 0, 0)
         END
         GL_ChartSymbol(gn_GLwnd, gn_ChartSymbol, 0, 0, 0, Charact(128 + nI))
      glPopMatrix()
      glTranslatef(0, 0, 2.1 * g_Chart.radius)
   END
   gl_EnableAmbience()
glPopMatrix()

// Draw small letters in front of each chart bar.
glPushMatrix()
   gl_DisableAmbience()
   glColor4ub(255,255,255, 255)
   glTranslatef(g_Chart.radius + rHalfRadius * 0.5, 0.0, 2.1 * g_Chart.radius * g_Chart.chartnumber + rHalfRadius)
   FOR nJ = 1 _TO_ g_Chart.chartseries
      GL_ChartLabel(gn_GLwnd, gn_ChartLegend, 0, 0, 0, Charact(64 + nJ))
      glTranslatef(2.1 * g_Chart.radius, 0.0, 0.0)
   END
   glTranslatef((-2.1 * g_Chart.radius) * g_Chart.chartseries, 0.0, 2.1 * g_Chart.radius)
   gl_EnableAmbience()
glPopMatrix()

// Draw label using GDImage bitmapped font.
glPushMatrix()
   glTranslatef(9.2, 0, 2.1 * g_Chart.radius * g_Chart.chartnumber + rHalfRadius * 3 )
   glRotatef(-nAngle, 0, 0, 1)
   glColor4ub(255,255,0, 255)
   GL_ChartLabel(gn_GLwnd, gn_ChartCaption, 0, 0, 0, "GDImage " + ZI_Version())
glPopMatrix()

// Draw the chart caption using GDImage bitmapped font.
glPushMatrix()
   gl_DisableAmbience()
   glLoadIdentity()
   glDisable(GL_DEPTH_TEST) // We want to keep it in front.
   IF Nation() = 5 THEN // France
      sTitle = "Le titre du Graph"
   ELSE
      sTitle = "The title of the chart"
   END
   rX = GL_ChartGetTextLength(gn_ChartCaption, sTitle)
   glTranslatef(rX * -0.5, -8, -20)
   glColor4ub(255,0,0, 255)
   GL_ChartLabel(gn_GLwnd, gn_ChartCaption, 0, 0, 0, sTitle)
   glEnable(GL_DEPTH_TEST) // Don't forget to re-enable DEPTH_TEST
   gl_EnableAmbience()
glPopMatrix()

// Draw zoom percentage
ZI_DrawGLText(gn_GLwnd, gst_UseFont, 10, 10 + gst_UseFont.fontHeight * 0, ("Zoom  " + NumToString(Round(gr_ChartZoom * 100))) + "%", ZD_ARGB(255, 255,255,0))

// Draw the scene into the GDImage control.
// On dessine la scene dans le contrôle GDImage.
ZI_UpdateGLWindow(gn_GLwnd)
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#4
QuoteI was looking at your WinDev example which is pretty cool. Why the PB guys aren't jumping all over this is a mystery to me.

I think there is a typo or maybe WinDev allows _to_ and TO for FOR in the example.

Anonimous--

_TO_ is a special WinDev syntax that must be used when using a global variable for ubound within a loop,
this is to speed up the loop, and avoid to evaluate/assign the global at each loop iteration.
WinDev being IL code, it performs the compilation on the fly, thus _TO_  is for the purpose of code optimization.
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#5
A few more informations to show you, why i think the transition between PB and WinDev could be easy.

In a WinDev project, procedures (understand, subroutines or functions) could be either global or local.

Global are created in the code project and are accessible by all the windows of the project.
Local are available only inside of a specific window.

Example of subroutine procedure:
PROCEDURE BassSyncPos(LOCAL nPos is 8-byte int)
K is int
IF BTN_Pause..Visible THEN BassStreamPause() // 09-28-2010
IF gnFlyer THEN
    IF gnFlyerID THEN BASS_ChannelSetPosition(gnFlyerID, nPos, 0)
ELSE
    FOR K = 1 TO MAXCHANNEL - 1
        IF gnChannel[K].ID THEN
            BASS_ChannelSetPosition(gnChannel[K].ID, nPos, 0)
        END
    END
    nOutMixer is int = ZSL_GetBassOutMixer(); IF nOutMixer THEN BASS_Mixer_ChannelSetPosition(nOutMixer, nPos, 0)
END
IF BTN_Pause..Visible THEN BassStreamResume() // 09-28-2010


The use of different colors, is to make the difference between local, global, and procedure or function call (it is handled automatically by the code editor).

Example of global function:
// **********************************************
// Return qualified path matching the current EXE
// **********************************************

FUNCTION ExePath()
RESULT CompleteDir(fExeDir())


Example of API encapsulation:
PROCEDURE GetCursorPos(lp is POINT)
API(USER32, "GetCursorPos", &lp)


Hungarian notation:
On option it can be used to prefix all the variables as you type them.

Object properties:
Each child control has a set of properties varying from one object to another, that you can set independantly, from a dialog box, and this without writing a single line of code.

Events:
You can create events to monitor messages or setup properties.

Mixing with PowerBASIC:
I am willing to help those wanting to learn, including the mixing of WinDev with PB (or another external language).
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#6
Debugging
This is a piece of cake (mainly due to the nature of the IL code), the debugger works close to what could be done with Visual Studio, but there is also the very handy TRACE function (almost the same than the zTrace utility that has been modeled on it) to trace any type of data on the fly.

Code Optimization
There is a utility to detect not only the dead code, but also un-used variables, and a profiler to detect the sections that are the most time consuming and/or CPU intensive.

Screen builder
It is just amazing, even C# Visual Studio is not so easy to build a full GUI in minutes.
And if you want to translate any DDT dialog, there is a buil-in utility, to capture a window dialog on the fly, then you just have to fill-in the code, setup properties, alignments, and the anchor mode for each child controls.

Of course it takes a little time to get accustomed to WinDev when coming from PowerBASIC, but the transition is easier than moving to Visual Studio, and it offers the greatest compatibilty with the BASIC syntax used in PB.


Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Mike Stefanik

#7
I had downloaded the express version because you had talked about it so much. Maybe I'm just too used to Visual Studio, but I'll say my first impression of WinDev hasn't been a good one. I believe that, for the most part, the IDE and and UI elements should be minimalistic and as "out of the way" as possible, with a code-centric focus. I'm not against form designers, but that whole project "dashboard" interface looks wrong to me.

Edit: Just so it's clear to folks, that screenshot is not of an application that's being developed. It's how WinDev displays information about the overall status of the project and I don't think it's a good design for a development tool (I generally dislike "flashy" UIs altogether, but this kind of thing is way over the top, in my opinion).

After reading through what I originally posted, I feel I might have been a bit harsh, so I mellowed it out a bit. That said, I don't want to discourage anyone from trying it out, we all have different tastes and preferences.
Mike Stefanik
sockettools.com

Brice Manuel

#8
QuoteMaybe I'm just too used to Visual Studio, but I'll say my first impression of WinDev hasn't been a good one.

You are not alone.  I have always felt it targets the click-and-create application-maker crowd instead of actual coders.  It is like it is trying to be a hybrid between the two.  It has the UI to attract the click-and-create folks and the coding for actual coders.  Very unique product.

Mike Stefanik

QuoteI have always felt it targets the click-and-create application-maker crowd instead of actual coders.  It is like it is trying to be a hybrid between the two.

When I started WinDev for the first time to create the typical 'Hello, World' type of application and saw that dashboard, the first thought that ran through my head was I wondered if they provided support for XBox controllers to navigate their UI ;D
Mike Stefanik
sockettools.com

Patrice Terrier

Mike--

There are many things that also irritate me in WinDev, but the Dashboard is realy not what should make your judgement, and you can turn it off if you want.

I have used Visual Studio a lot, when i was playing with C# several years ago, and there are also many things i dislike with it, non speaking of the PB/IDE that i have never used :)

My opinion is based on the resulting code i am able to produce with it, nothing else, nothing less.
And so far it is one of the master piece of my toolbox when i need to produce large project, but not the only one as you know already :)

My purpose in this thread is to show that the syntax is easy to understand for a BASIC programmer, and one of the closest to the PowerBASIC one.
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Brice Manuel

Quote from: Patrice Terrier on October 25, 2013, 08:58:58 PM
My purpose in this thread is to show that the syntax is easy to understand for a BASIC programmer, and one of the closest to the PowerBASIC one.

The syntax is so close one should be able to easily write a PB to WinDev converter if they were moving a large project over to WinDev.

Patrice Terrier

I would be glad to see more contributors, posting other solutions that could be an easy alternative, as i am not infeoded to any one.

However let me do a  remark about WinDev, it is widely used here, and one of the main language teached in the universities, thus it should have some merits.
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Patrice Terrier

#13
Here are two screen shots of my own WinDev desktop.

Side note:
It tooks me three monthes to master the beast...
(and to say the truth a was close to give up, but now i am able to do things with it, that i didn't thought would be possible with a L5G).
Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com

Mike Mayerhoffer

Hi Patrice ,

what has PB not done or done to have you feeling abandoned by them.

I am just curious to hear your reasons for that statement.

I know you have mentioned 64bit was high on your list and what is it about graphics,

is there something else I missed

have I made any correct assumptions

thanks in advance.

Mike