Page 1 of 2
#PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Fri Dec 27, 2024 1:08 pm
by DannyWeijermans
Dear all,
I'd like to use the PB_ProgressBar_Unknown feature
in the StatusBarProgress.
Anyone knows if or how this would be possible?
I'm in OSX..
Thanks for any thoughts!
Merry belated xmas!!
Peace in 2025!
Danny
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Fri Dec 27, 2024 1:13 pm
by infratec
As written in the help:
Code: Select all
SetGadgetState(YourProgressbarGadget, #PB_ProgressBar_Unknown)
But I don't know hat happens then.

Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Fri Dec 27, 2024 1:16 pm
by infratec
Hi, hi, in windows a small bar 'rotates'.
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Fri Dec 27, 2024 6:07 pm
by Wolfram
You should see an animated gradient.
Code: Select all
Global Window_0, pgBar
Procedure OpenWindow_0(x = 0, y = 0, width = 450, height = 80)
Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
pgBar = ProgressBarGadget(#PB_Any, 50, 20, width -100, 15, 0, 99)
SetGadgetState(pgBar, #PB_ProgressBar_Unknown)
EndProcedure
Procedure Window_0_Events(event)
Select event
Case #PB_Event_CloseWindow
ProcedureReturn #False
Case #PB_Event_Menu
Select EventMenu()
Case #PB_Menu_Quit
ProcedureReturn #False
EndSelect
Case #PB_Event_Gadget
EndSelect
ProcedureReturn #True
EndProcedure
OpenWindow_0()
Repeat
event = WaitWindowEvent()
Until Window_0_Events(event) = #False
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Fri Dec 27, 2024 6:11 pm
by DannyWeijermans
Hi!
Thanks for all answers!
Yes, but it's different (it seems) for the ProgressBar in the Status Gadget
when I test it on this.
(StatusBarProgress(\MyStatusBar, #StatusBarProgress, #PB_ProgressBar_Unknown)
it doesn't work..
Any thoughts on this?
Regards!
Danny
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Fri Dec 27, 2024 11:33 pm
by BarryG
Wait a minute... I knew I recognized your name, Danny!

Great to see you're a PureBasic user!
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 12:02 am
by DannyWeijermans
Barry? Explain!

Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 12:04 am
by infratec
In this case is nowhere written in the help that you can use #PB_ProgressBar_Unknown.
So in general you can't use it.
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 12:15 am
by DannyWeijermans
true intratec,
but would be really nice

and I guess it should be possible..
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 12:16 pm
by Shardik
DannyWeijermans wrote: Sat Dec 28, 2024 12:15 am
and I guess it should be possible..
Yes, it's possible. But it's a feature request for "Feature Requests and Wishlists". The following example demonstrates how to display an indeterminated ProgressBar (like a ProgressBarGadget with the flag #PB_ProgressBar_Unknown) in the StatusBar (tested successfully on MacOS 13.7.2 'Ventura' with PB 6.20 Beta 2):
Code: Select all
EnableExplicit
Define Frame.NSRect
Define ProgressBar.I
Define StatusBar.I
OpenWindow(0, 100, 270, 280, 60, "StatusBar with ProgressBar")
TextGadget(0, 10, 10, WindowWidth(0) - 20, 20,
"StatusBar with indeterminated ProgressBar")
; ----- Create horizontal ProgressBar
Frame\origin\x = 10
Frame\origin\y = 5
Frame\size\width = WindowWidth(0) - 20
Frame\size\height = 20
ProgressBar = CocoaMessage(0,
CocoaMessage(0, 0, "NSProgressIndicator alloc"), "initWithFrame:@", @Frame)
CocoaMessage(0, ProgressBar, "setIndeterminate:", #YES)
CocoaMessage(0, ProgressBar, "startAnimation:", 0)
; ----- Create StatusBar
CreateStatusBar(0, WindowID(0))
AddStatusBarField(#PB_Ignore)
StatusBar = StatusBarID(0)
; ----- Add ProgressBar to StatusBar
CocoaMessage(0, StatusBar, "addSubview:", ProgressBar)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 3:27 pm
by Shardik
The following example demonstrates how to display an indeterminated StatusBarProgress field (tested successfully on MacOS 15.2 'Sequoia' with PB 6.12 and 6.20 Beta 2):
Code: Select all
EnableExplicit
Define i.I
Define ProgressBarField.I
Define StatusBarField.I
Define SubViewArray.I
Define SubViewCount.I
OpenWindow(0, 270, 100, 300, 70, "StatusBarField with ProgressBar")
; ----- Create StatusBar and StatusBarFields
CreateStatusBar(0, WindowID(0))
AddStatusBarField(188)
StatusBarText(0, 0, " StatusBar with ProgressBar:")
AddStatusBarField(WindowWidth(0) - 200)
StatusBarProgress(0, 1, 50)
; ----- Get StatusBarField containing ProgressBar
SubViewArray = CocoaMessage(0, StatusBarID(0), "subviews")
If SubViewArray
SubViewCount = CocoaMessage(0, SubViewArray, "count")
If SubViewCount
For i = 0 To SubViewCount - 1
StatusBarField = CocoaMessage(0, SubViewArray, "objectAtIndex:", i)
If PeekS(CocoaMessage(0, CocoaMessage(0, StatusBarField, "className"),
"UTF8String"), -1, #PB_UTF8) = "NSProgressIndicator"
ProgressBarField = StatusBarField
; ----- Set ProgressBarField to indeterminate
CocoaMessage(0, ProgressBarField, "setIndeterminate:", #YES)
CocoaMessage(0, ProgressBarField, "startAnimation:", 0)
Break
EndIf
Next i
EndIf
EndIf
If ProgressBarField = #False
MessageRequester("Error",
"No StatusBarField with ProgressBar found!")
End
EndIf
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 10:34 pm
by DannyWeijermans
W O W !
That's SO awesome, Shardik!!!
Thanks so much (again!!)
Works like a charm,
and good that it's in the wish list:
would be good to have as a 'standard' option
Regards,
and I wish you and all fellow PureBasic coders
a GOOD 2025
with GOOD HEALTH & PEACE !
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 10:35 pm
by Shardik
The following example is cross-platform. I have tested it succussfully with PB 6.12 on these operating systems:
- Linux Mint 21.3 'Virginia' with Cinnamon and Gtk3
- MacOS 13.7.2 'Ventura'
- Windows 10 23H2
Code: Select all
EnableExplicit
#StatusBarText = " StatusBar with ProgressBar:"
Define ProgressBarField.I
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
ImportC ""
g_object_set_double(*Object, Property.P-ASCII, Value.D,
Null) As "g_object_set"
EndImport
Procedure GetStatusBarProgressField(StatusBarID.I)
Shared ProgressBarField.I
Protected ChildCount.I
Protected *ChildListGtkFrame.GList
Protected *ChildListGtkBox.GList
Protected *GtkBox.GtkWidget
Protected *GtkFrame.GtkWidget
Protected i.I
Protected *Widget.GtkWidget
Protected *WidgetName
*GtkBox = StatusBarID(StatusBarID)
*ChildListGtkBox = gtk_container_get_children_(*GtkBox)
*WidgetName = gtk_widget_get_name_(*GtkBox)
ChildCount = g_list_length_(*ChildListGtkBox)
For i = 0 To ChildCount - 1
*GtkFrame = g_list_nth_data_(*ChildListGtkBox, i)
*ChildListGtkFrame = gtk_container_get_children_(*GtkFrame)
*Widget = g_list_nth_data_(*ChildListGtkFrame, 0)
*WidgetName = gtk_widget_get_name_(*Widget)
g_list_free_(*ChildListGtkFrame)
If PeekS(*WidgetName, -1, #PB_UTF8) = "GtkProgressBar"
ProgressBarField = *Widget
g_object_set_double(ProgressBarField, "pulse-step", 0.2, 0)
AddWindowTimer(0, 0, 400)
Break
EndIf
Next i
g_list_free_(*ChildListGtkBox)
EndProcedure
CompilerCase #PB_OS_MacOS
Procedure GetStatusBarProgressField(StatusBarID.I)
Shared ProgressBarField.I
Protected i.I
Protected StatusBarField.I
Protected SubViewArray.I
Protected SubViewCount.I
SubViewArray = CocoaMessage(0, StatusBarID(0), "subviews")
If SubViewArray
SubViewCount = CocoaMessage(0, SubViewArray, "count")
If SubViewCount
For i = 0 To SubViewCount - 1
StatusBarField = CocoaMessage(0, SubViewArray, "objectAtIndex:", i)
If PeekS(CocoaMessage(0, CocoaMessage(0, StatusBarField,
"className"),
"UTF8String"), -1, #PB_UTF8) = "NSProgressIndicator"
ProgressBarField = StatusBarField
CocoaMessage(0, ProgressBarField, "setIndeterminate:", #YES)
CocoaMessage(0, ProgressBarField, "startAnimation:", 0)
Break
EndIf
Next i
EndIf
EndIf
EndProcedure
CompilerCase #PB_OS_Windows
#PBM_SETMARQUEE = #WM_USER + 10
Procedure EnumChildWindowCallback(WindowHandle.I, LParam.I)
Shared ProgressBarField.I
Protected ClassName.S = Space(#MAX_PATH)
GetClassName_(WindowHandle, @ClassName, #MAX_PATH - 1)
If ClassName = "msctls_progress32"
ProgressBarField = WindowHandle
ProcedureReturn #False
Else
ProcedureReturn #True
EndIf
EndProcedure
Procedure GetStatusBarProgressField(StatusBarID.I)
Shared ProgressBarField.I
EnumChildWindows_(StatusBarID(StatusBarID), @EnumChildWindowCallback(),
0)
If ProgressBarField
SetWindowLongPtr_(ProgressBarField, #GWL_STYLE,
GetWindowLongPtr_(ProgressBarField, #GWL_STYLE) ! #PBS_MARQUEE)
SendMessage_(ProgressBarField, #PBM_SETMARQUEE, 1, 50)
EndIf
EndProcedure
CompilerEndSelect
OpenWindow(0, 270, 100, 360, 70,
"StatusBar with #PB_ProgressBar_Unknown")
; ----- Create StatusBar and StatusBarFields
CreateStatusBar(0, WindowID(0))
AddStatusBarField(180)
StatusBarText(0, 0, #StatusBarText)
AddStatusBarField(WindowWidth(0) - 190)
StatusBarProgress(0, 1, 20, 0, 0, 100)
; ----- Get StatusBarField containing ProgressBar
GetStatusBarProgressField(0)
If ProgressBarField = #False
MessageRequester("Error",
"No StatusBarField with ProgressBar found!")
End
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
Case #PB_Event_Timer
gtk_progress_bar_pulse_(ProgressBarField)
CompilerEndIf
EndSelect
ForEver
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sat Dec 28, 2024 10:40 pm
by Shardik
DannyWeijermans wrote: Sat Dec 28, 2024 10:34 pm
W O W !
That's SO awesome, Shardik!!!
Thanks so much (again!!)
Works like a charm
I am glad that it works for you like a charm!
Re: #PB_ProgressBar_Unknown SetGadgetState() in StatusBarProgress
Posted: Sun Dec 29, 2024 12:57 am
by DannyWeijermans
Hi Shardik!
1 more question about it:
how to set it in Determinate mode again?
I tried it with
Code: Select all
CocoaMessage(0, ProgressBarField, "setIndeterminate:", #NO) ; ----- UnSet ProgressBarField to indeterminate
CocoaMessage(0, ProgressBarField, "stopAnimation:", 0)
but the ProgressBarfield then takes a while before showing the determinate position.
And how to set it in Indeterminate mode again after that?
(when I do that the ProgressBarField stays greyed out)
Thanks for any more help!
Regards,
Danny