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 (http://forum.flyworship.co.uk/index.php?topic=149.0)
There is a future for those who felt abandonned ;)
...
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
...
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.
...
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)
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.
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).
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.
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.
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.
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--
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.
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.
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.
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).
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
Quote from: Patrice Terrier on October 25, 2013, 09:11:51 PM
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.
Most leaving PowerBASIC are probably going to want something "BASIC-like". I do think PureBasic is a wonderful product and a powerful contender for a PowerBASIC replacement, and I do recommend it to most people over PowerBASIC. However, stability issues can be there with PureBasic, so I could never recommend it for use in a corporate environment, which is what many PowerBASIC users need.
There is also the granddaddy of all BASICs, which is TrueBASIC. However, it is not a legitimate contender as a PowerBASIC replacement for anybody.
You are pretty much left with WinDev for corporate level needs and PureBasic for other needs. Or, grab Paul's FireFly for FreeBASIC and grab FreeBASIC.
Hi Mike,
The feeling to get abandoned, is like a divorce, there is always colateral damages.
And in this industry, a software that doesn't evolve fast enough is soon on the declin.
That was already a problem while Bob Zale was still there, but now that he has gone there is no hope.
64-bit, yes of course.
Mobile, yes of course.
Mac OS, yes of course.
Graphics, no. Because this is not the purpose of a core compiler (turning high level code into machine code).
See the thread here. (http://www.jose.it-berater.org/smfforum/index.php?topic=3696.0)
...
Thanks Patrice !
I appreciate your time.
I did read your post in the link and a few other threads.
-Mike