/examples/GUI/GTK+/Tutorials/progressbar.bas

https://github.com/freebasic/fbc · Basic · 213 lines · 136 code · 45 blank · 32 comment · 0 complexity · 6b02f2e23810ba981bf1b7926c4164a7 MD5 · raw file

  1. ' ProgressBar.bas
  2. ' Translated from C to FB by TinyCla, 2006
  3. '
  4. ' Reviewed by TJF (2011)
  5. ' Details: http://developer.gnome.org/gtk/
  6. '#DEFINE __USE_GTK3__
  7. #Include once "gtk/gtk.bi"
  8. Type ProgressData
  9. As GtkWidget Ptr win
  10. As GtkWidget Ptr pbar
  11. #IfDef __USE_GTK3__
  12. As GtkWidget Ptr perbut
  13. #EndIf
  14. As GtkWidget Ptr infbut
  15. As guint pb_timer = 100
  16. As gboolean activity_mode
  17. End Type
  18. ' Update the value of the progress bar so that we get
  19. ' some movement
  20. Function progress_timeout Cdecl( Byval user_data As gpointer ) As gboolean
  21. Var pdata = Cast(ProgressData Ptr, user_data)
  22. Var pbar = GTK_PROGRESS_BAR (pdata->pbar)
  23. If pdata->activity_mode Then
  24. gtk_progress_bar_pulse (pbar)
  25. Else
  26. ' Calculate the value of the progress bar using the
  27. ' value range set in the adjustment object
  28. Var new_val = gtk_progress_bar_get_fraction (pbar) + 0.01
  29. If new_val > 1.0 Then new_val = 0.0
  30. ' Set the new value
  31. gtk_progress_bar_set_fraction (pbar, new_val)
  32. End If
  33. ' As this is a timeout function, return TRUE so that it
  34. ' continues to get called
  35. Return TRUE
  36. End Function
  37. ' Callback that toggles the text display within the progress bar trough
  38. Sub toggle_show_text Cdecl( Byval widget As GtkWidget Ptr, Byval pdata As ProgressData Ptr)
  39. Var pbar = GTK_PROGRESS_BAR (pdata->pbar)
  40. #IFDEF __USE_GTK3__
  41. VAR show = IIF(gtk_progress_bar_get_show_text (pbar), 0, 1)
  42. gtk_progress_bar_set_show_text (pbar, show)
  43. gtk_widget_set_sensitive(pdata->perbut, show)
  44. #ELSE
  45. Var text = gtk_progress_bar_get_text (pbar)
  46. If text Then
  47. gtk_progress_bar_set_text (pbar, NULL)
  48. Else
  49. gtk_progress_bar_set_text (pbar, "some text")
  50. End If
  51. #ENDIF
  52. End Sub
  53. #IFDEF __USE_GTK3__
  54. ' Callback that toggles the text display within the progress bar trough
  55. SUB toggle_show_percentage CDECL( BYVAL widget AS GtkWidget PTR, BYVAL pdata AS ProgressData PTR)
  56. VAR pbar = GTK_PROGRESS_BAR (pdata->pbar)
  57. VAR text = gtk_progress_bar_get_text (pbar)
  58. IF text THEN
  59. gtk_progress_bar_set_text (pbar, NULL)
  60. ELSE
  61. gtk_progress_bar_set_text (pbar, "some text")
  62. END IF
  63. END SUB
  64. #ENDIF
  65. ' Callback that toggles the activity mode of the progress bar
  66. Sub toggle_activity_mode Cdecl( Byval widget As GtkWidget Ptr, Byval pdata As ProgressData Ptr )
  67. pdata->activity_mode = Not pdata->activity_mode
  68. If pdata->activity_mode Then
  69. gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar))
  70. gtk_widget_set_sensitive(pdata->infbut, FALSE)
  71. Else
  72. gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), 0.0)
  73. gtk_widget_set_sensitive(pdata->infbut, TRUE)
  74. End If
  75. End Sub
  76. ' Callback that toggles the orientation of the progress bar
  77. Sub toggle_orientation Cdecl( Byval widget As GtkWidget Ptr, Byval pdata As ProgressData Ptr)
  78. Var pbar = GTK_PROGRESS_BAR (pdata->pbar)
  79. #IFDEF __USE_GTK3__
  80. VAR ori = IIF(gtk_progress_bar_get_inverted (pbar), 0, 1)
  81. gtk_progress_bar_set_inverted (pbar, ori)
  82. #ELSE
  83. Select Case As Const gtk_progress_bar_get_orientation (pbar)
  84. Case GTK_PROGRESS_LEFT_TO_RIGHT:
  85. gtk_progress_bar_set_orientation (pbar, GTK_PROGRESS_RIGHT_TO_LEFT)
  86. Case GTK_PROGRESS_RIGHT_TO_LEFT:
  87. gtk_progress_bar_set_orientation (pbar, GTK_PROGRESS_LEFT_TO_RIGHT)
  88. Case Else
  89. End Select
  90. #ENDIF
  91. End Sub
  92. ' ==============================================
  93. ' Main
  94. ' ==============================================
  95. gtk_init (NULL, NULL)
  96. ' Create the data that is passed to the callbacks
  97. Var pdata = New ProgressData
  98. pdata->win = gtk_window_new (GTK_WINDOW_TOPLEVEL)
  99. gtk_window_set_resizable (GTK_WINDOW (pdata->win), TRUE)
  100. g_signal_connect (G_OBJECT (pdata->win), "delete-event", _
  101. G_CALLBACK (@gtk_main_quit), pdata)
  102. gtk_window_set_title (GTK_WINDOW (pdata->win), "GtkProgressBar")
  103. gtk_container_set_border_width (GTK_CONTAINER (pdata->win), 0)
  104. Var vbox = gtk_vbox_new (FALSE, 5)
  105. gtk_container_set_border_width (GTK_CONTAINER (vbox), 10)
  106. gtk_container_add (GTK_CONTAINER (pdata->win), vbox)
  107. gtk_widget_show (vbox)
  108. ' Create a centering alignment object
  109. Var align = gtk_alignment_new (0.5, 0.5, 0, 0)
  110. gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 5)
  111. gtk_widget_show (align)
  112. ' Create the GtkProgressBar
  113. pdata->pbar = gtk_progress_bar_new ()
  114. gtk_container_add (GTK_CONTAINER (align), pdata->pbar)
  115. #IFDEF __USE_GTK3__
  116. gtk_progress_bar_set_show_text(GTK_PROGRESS_BAR(pdata->pbar), TRUE)
  117. gtk_progress_bar_set_text (GTK_PROGRESS_BAR(pdata->pbar), "some text")
  118. gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR(pdata->pbar), FALSE)
  119. #ENDIF
  120. gtk_widget_show (pdata->pbar)
  121. ' Add a timer callback to update the value of the progress bar
  122. pdata->pb_timer = g_timeout_add (pdata->pb_timer, @progress_timeout, pdata)
  123. Var separator = gtk_hseparator_new ()
  124. gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 5)
  125. gtk_widget_show (separator)
  126. ' Add a check button to select displaying of the trough text
  127. Var check = gtk_check_button_new_with_label ("Show text")
  128. gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0)
  129. g_signal_connect (G_OBJECT (check), "clicked", G_CALLBACK (@toggle_show_text), pdata)
  130. gtk_widget_show (check)
  131. #IFDEF __USE_GTK3__
  132. ' Add a check button to select displaying of the percentage
  133. pdata->perbut = gtk_check_button_new_with_label ("Percentage")
  134. gtk_widget_set_sensitive(pdata->perbut, FALSE)
  135. gtk_box_pack_start (GTK_BOX (vbox), pdata->perbut, FALSE, FALSE, 0)
  136. g_signal_connect (G_OBJECT (pdata->perbut), "clicked", _
  137. G_CALLBACK (@toggle_show_percentage), pdata)
  138. gtk_widget_show (pdata->perbut)
  139. #ENDIF
  140. ' Add a check button to toggle activity mode
  141. check = gtk_check_button_new_with_label ("Activity mode")
  142. gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0)
  143. g_signal_connect (G_OBJECT (check), "clicked", _
  144. G_CALLBACK (@toggle_activity_mode), pdata)
  145. gtk_widget_show (check)
  146. ' Add a check button to toggle orientation
  147. pdata->infbut = gtk_check_button_new_with_label ("Inverted")
  148. gtk_box_pack_start (GTK_BOX (vbox), pdata->infbut, FALSE, FALSE, 0)
  149. g_signal_connect (G_OBJECT (pdata->infbut), "clicked", _
  150. G_CALLBACK (@toggle_orientation), pdata)
  151. gtk_widget_show (pdata->infbut)
  152. separator = gtk_hseparator_new ()
  153. gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 5)
  154. gtk_widget_show (separator)
  155. ' Add a button to exit the program
  156. Var button = gtk_button_new_with_label ("close")
  157. g_signal_connect_swapped (G_OBJECT (button), "clicked", _
  158. G_CALLBACK (@gtk_main_quit), pdata)
  159. gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0)
  160. ' This makes it so the button is the default.
  161. gtk_widget_set_can_default (button, TRUE)
  162. ' This grabs this button to be the default button. Simply hitting
  163. ' the "Enter" key will cause this button to activate.
  164. gtk_widget_grab_default (button)
  165. gtk_widget_show (button)
  166. gtk_widget_show (pdata->win)
  167. gtk_main ()
  168. Delete (pdata)