Muti window display

External libraries (GTK, GSL, SDL, Allegro, OpenGL, etc) questions.
Post Reply
Gablea
Posts: 1104
Joined: Apr 06, 2010 0:05
Location: Northampton, United Kingdom
Contact:

Muti window display

Post by Gablea »

Hi everyone

I have been reading up and testing GTK and so far I’m liking what I have found out.

Just wanted to ask 3 questions

1. The list box can I use it like I do in vb 2008(highlight multiple data)

2. Can I Display more then one window (say a main menu then a sub menu on top of it) or do I have to stick to a single window on the program?

3. Can I change the text of buttons while the program is running (also is it possible to add images to the buttons)

I hope someone can help me with the above questions

Andy
lizard
Posts: 440
Joined: Oct 17, 2017 11:35
Location: Germany

Re: Muti window display

Post by lizard »

Generally you can realize everything you can think of with Gtk. After studying the examples that come with fbc, google should become your best friend. There you can find all your questions answered. Mostly these examples are in c, but you only need to delete the ";" at the end of the line.
caseih
Posts: 2157
Joined: Feb 26, 2007 5:32

Re: Muti window display

Post by caseih »

Answer to all three question is yes. How to do it... there is a learning curve, but as lizard says, there are lots of examples out there in C that can be translated to FB.
Last edited by caseih on Mar 09, 2018 15:31, edited 1 time in total.
lizard
Posts: 440
Joined: Oct 17, 2017 11:35
Location: Germany

Re: Muti window display

Post by lizard »

lizard wrote:Looks interesting as i am working in similar direction. This an unfinished test program:

Code: Select all

' Test-menu.bas

#DEFINE __FB_GTK3__
#include once "gtk/gtk.bi"

#define NULL 0

Declare Sub load_file_cb Cdecl()

Function button_press Cdecl( Byval widget As GtkWidget Ptr, Byval event As GdkEvent Ptr ) as integer
    If event->Type = GDK_BUTTON_PRESS Then
        Dim bevent As GdkEventButton Ptr
        bevent = cast(GdkEventButton Ptr, event)
        gtk_menu_popup (GTK_MENU (widget), NULL, NULL, NULL, NULL, bevent->button, bevent->Time)
        ' Tell calling code that we have handled this event  the buck stops here.
        Return TRUE
    Else
        ' Tell calling code that we have not handled this event  pass it on.
        Return FALSE
    End If
End Function

'' Callback for close button
sub on_button_clicked cdecl (byval button as GtkWidget ptr, byval buffer as GtkTextBuffer ptr)
  dim as GtkTextIter start, end_
  dim as gchar ptr text

  '' Obtain iters for the start and end of points of the buffer
  gtk_text_buffer_get_start_iter( buffer, @start )
  gtk_text_buffer_get_end_iter( buffer, @end_ )

  '' Get the entire buffer text.
  text = gtk_text_buffer_get_text( buffer, @start, @end_, FALSE )

  '' Print the text
  g_print( "%s", text )

  g_free( text )

  gtk_main_quit( )
end sub

'':::::
sub on_window_destroy cdecl (byval widget as GtkWidget ptr, byval userdata as gpointer)
  gtk_main_quit( )
end sub



' Print a string when a menu item is selected

Sub menuitem_response Cdecl( Byval stringa As gchar Ptr )
    g_print (!"%s\n", stringa)
End Sub

' Get the selected filename and print it to the console 
Sub file_ok_sel Cdecl ( Byval w As GtkWidget Ptr, Byval fs As GtkFileSelection Ptr) ', filew as G_OBJECT Ptr)
	Print *gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs))
	'gtk_widget_destroy(filew)
End Sub

Sub import_file_cb Cdecl()
    Dim As GtkWidget Ptr filew
    ' Create a new file selection widget 
	filew = gtk_file_selection_new ("Import File Selection")
	
	g_signal_connect (G_OBJECT (filew), "destroy", G_CALLBACK (@gtk_main_quit), NULL)
	
	' Connect the ok_button to file_ok_sel function 
	g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", G_CALLBACK (@file_ok_sel), filew)
	
	' Connect the cancel_button to destroy the widget 
	g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", G_CALLBACK (@gtk_widget_destroy), G_OBJECT (filew))
	
	' Lets set the filename, as if this were a save dialog, and we are giving a default filename 
	gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew),  "penguin.png")
	    
	gtk_widget_show (filew)
End Sub

Sub export_file_cb Cdecl()
    Dim As GtkWidget Ptr filew
    ' Create a new file selection widget 
	filew = gtk_file_selection_new ("Export File Selection")
	
	g_signal_connect (G_OBJECT (filew), "destroy", G_CALLBACK (@gtk_main_quit), NULL)
	
	' Connect the ok_button to file_ok_sel function 
	g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", G_CALLBACK (@file_ok_sel), filew)
	
	' Connect the cancel_button to destroy the widget 
	g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", G_CALLBACK (@gtk_widget_destroy), G_OBJECT (filew))
	
	' Lets set the filename, as if this were a save dialog, and we are giving a default filename 
	gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew),  "penguin.png")
	    
	gtk_widget_show (filew)
End Sub

Sub about_cb Cdecl()
    DIM AS GtkWidget PTR wina, framea, labela, labelb
    DIM AS         guint v1, v2, v3
    DIM AS        STRING GtkVersion
    
    ?"This code is compiled using headers for GTK " 
    ?GTK_MAJOR_VERSION & "." & GTK_MINOR_VERSION & "." &  GTK_MICRO_VERSION
    v1 =  4 : WHILE gtk_check_version_(v1, v2, v3) : v1 -= 1 : WEND
    v2 = 99 : WHILE gtk_check_version_(v1, v2, v3) : v2 -= 1 : WEND
    v3 = 44 : WHILE gtk_check_version_(v1, v2, v3) : v3 -= 1 : WEND
    GtkVersion = !"\n" & v1 & "." & v2 & "." & v3 & !"\n"

    wina = gtk_window_new (GTK_WINDOW_TOPLEVEL)
    g_signal_connect(G_OBJECT(wina), "destroy", _
    G_CALLBACK(@gtk_main_quit), NULL)
    g_signal_connect(G_OBJECT(wina), "key-press-event", _
    G_CALLBACK(@gtk_main_quit), NULL)
    
    gtk_window_set_title (GTK_WINDOW (wina), "About")
    gtk_container_set_border_width (GTK_CONTAINER (wina), 70)
    
    framea = gtk_frame_new (" Author: Lizard  Gtk running version is ")
    labelb = gtk_label_new (SADD(GtkVersion))
    gtk_container_add (GTK_CONTAINER (framea), labelb)
    gtk_container_add (GTK_CONTAINER (wina), framea)
    
    gtk_widget_show_all (wina)
End Sub

' Create the list of "messages"
Function create_list Cdecl( ) As GtkWidget Ptr

    Dim As GtkWidget Ptr scrolled_window
    Dim As GtkWidget Ptr tree_view
    Dim As GtkWidget Ptr model
    Dim As GtkTreeIter iter
    Dim As GtkCellRenderer Ptr cell
    Dim As GtkTreeViewColumn Ptr column
    Dim As integer i

    ' Create a new scrolled window, with scrollbars only if needed
    scrolled_window = gtk_scrolled_window_new (NULL, NULL)
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC)

    model = cast(GtkWidget Ptr, gtk_list_store_new (1, G_TYPE_STRING))
    tree_view = gtk_tree_view_new ()
    gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window),  tree_view)
    gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), GTK_TREE_MODEL (model))
    gtk_widget_show (tree_view)

    ' Add some messages to the window
    For i = 0 To 9
        Dim As String msg
        msg = "Message #" + Str(i + 1)
        gtk_list_store_append (GTK_LIST_STORE (model), @iter)
        gtk_list_store_set (GTK_LIST_STORE (model),  @iter, 0, Strptr(msg), -1)
    Next i

    cell = gtk_cell_renderer_text_new ()

    column = gtk_tree_view_column_new_with_attributes ("Messages", cell, "text", 0, NULL)

    gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), GTK_TREE_VIEW_COLUMN (column))

    Return scrolled_window

End Function

' Add some text to text widget 
Sub insert_text Cdecl(Byval buffer As GtkTextBuffer Ptr)

    Dim As GtkTextIter iter
    Dim As Zstring * 1024 buf_text

    buf_text = !"From: pathfinder@nasa.gov\n"
    buf_text += !"To: mom@nasa.gov\n"
    buf_text += !"Subject: Made it!\n"
    buf_text += !"\n"
    buf_text += !"We just got in this morning. The weather has been\n"
    buf_text += !"great - clear but cold, and there are lots of fun sights.\n"
    buf_text += !"Sojourner says hi. See you soon.\n"
    buf_text += !" -Path\n"

    gtk_text_buffer_get_iter_at_offset (buffer, @iter, 0)
    gtk_text_buffer_insert (buffer, @iter,  buf_text, -1)
End Sub

' Create a scrolled text area that displays a "message"
Function create_text Cdecl( ) As GtkWidget Ptr

    Dim As GtkWidget Ptr scrolled_window
    Dim As GtkWidget Ptr  view_text
    Dim As GtkTextBuffer Ptr buffer

    view_text = gtk_text_view_new ()
    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view_text))

    scrolled_window = gtk_scrolled_window_new (NULL, NULL)
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC)

    gtk_container_add (GTK_CONTAINER (scrolled_window), view_text)
    insert_text (buffer)

    gtk_widget_show_all (scrolled_window)

    Return scrolled_window

End Function

Sub insert_text2 Cdecl(Byval buffer As GtkTextBuffer Ptr)

    Dim As GtkTextIter iter
    Dim As Zstring * 1024 buf_text

    buf_text = !"From: pathfinder@nasa.gov\n"
    buf_text += !"To: mom@nasa.gov\n"
    buf_text += !"Subject: Made it!\n"
    buf_text += !"\n"
    buf_text += !"We just got in this morning. The weather has been\n"
    buf_text += !"great - clear but cold, and there are lots of fun sights.\n"
    buf_text += !"Sojourner says hi. See you soon.\n"
    buf_text += !" -Path\n"

    gtk_text_buffer_get_iter_at_offset (buffer, @iter, 0)
    gtk_text_buffer_insert (buffer, @iter,  buf_text, -1)
End Sub

' Create a scrolled text area that displays a "message"
Function create_text2 Cdecl( ) As GtkWidget Ptr

    Dim As GtkWidget Ptr scrolled_window
    Dim As GtkWidget Ptr  view_text
    Dim As GtkTextBuffer Ptr buffer

    view_text = gtk_text_view_new ()
    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view_text))

    scrolled_window = gtk_scrolled_window_new (NULL, NULL)
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC)

    gtk_container_add (GTK_CONTAINER (scrolled_window), view_text)
    insert_text2 (buffer)

    gtk_widget_show_all (scrolled_window)

    Return scrolled_window

End Function

    Dim As GtkWidget Ptr win
    Dim As GtkWidget Ptr menu
    Dim As GtkWidget Ptr menu_bar
    Dim As GtkWidget Ptr datei_menu, bearbeiten_menu, optionen_menu, hilfe_menu
    Dim As GtkWidget Ptr menu_neu, menu_open, menu_import, menu_export, menu_druck, menu_exit
    Dim As GtkWidget Ptr menu_copy, menu_cut, menu_paste, menu_tier, menu_feld, menu_symbol
    Dim As GtkWidget Ptr menu_einstell, menu_doku, menu_kosmo, menu_uber
    Dim As GtkWidget Ptr vbox
    Dim As GtkWidget Ptr button
    Dim As String buf
    Dim As gint i
 
    'dim as GtkWidget ptr win2
  'dim as GtkWidget ptr vbox2
  'dim as GtkWidget ptr text_view
  'dim as GtkWidget ptr button2
  'dim as GtkTextBuffer ptr buffer
  
    gtk_init (NULL, NULL)

    ' create a new main window
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL)
    gtk_window_set_title (GTK_WINDOW (win), "Sanskrit Workshop")
    gtk_widget_set_size_request (GTK_WIDGET (win), 1024, 768)
    gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER)
    g_signal_connect (G_OBJECT (win), "delete-event", G_CALLBACK (@gtk_main_quit), NULL)
                      
    ' datei
    menu = gtk_menu_new ()
    menu_neu = gtk_menu_item_new_with_label (Strptr("Neu"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_neu)
    g_signal_connect_swapped (G_OBJECT (menu_neu), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Neu"))
    gtk_widget_show (menu_neu)
    
    menu_open = gtk_menu_item_new_with_label (Strptr("Öffnen"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_open)
    g_signal_connect_swapped (G_OBJECT (menu_open), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Öffnen"))
    gtk_widget_show (menu_open)
    
    menu_import = gtk_menu_item_new_with_label (Strptr("Import"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_import)
    g_signal_connect_swapped (G_OBJECT (menu_import), "activate", G_CALLBACK (@import_file_cb),  g_strdup ("Import"))
    gtk_widget_show (menu_import)
    
    menu_export = gtk_menu_item_new_with_label (Strptr("Export"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_export)
    g_signal_connect_swapped (G_OBJECT (menu_export), "activate", G_CALLBACK (@export_file_cb),  g_strdup ("Export"))
    gtk_widget_show (menu_export)
    
    menu_druck = gtk_menu_item_new_with_label (Strptr("Drucken"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_druck)
    g_signal_connect_swapped (G_OBJECT (menu_druck), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Drucken"))
    gtk_widget_show (menu_druck)
    
    menu_exit = gtk_menu_item_new_with_label (Strptr("Beenden"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_exit)
    'g_signal_connect_swapped (G_OBJECT (menu_exit), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Beenden"))
   ' g_signal_connect_swapped (G_OBJECT(menu_exit), "activate", G_CALLBACK (@menuitem_response), NULL)
    g_signal_connect(G_OBJECT(menu_exit), "activate", G_CALLBACK(@gtk_main_quit), NULL)
    gtk_widget_show (menu_exit)
    
    datei_menu = gtk_menu_item_new_with_label ("Datei")
    gtk_widget_show (datei_menu)
    gtk_menu_item_set_submenu (GTK_MENU_ITEM (datei_menu), menu)
    
    ' bearbeiten
    menu = gtk_menu_new ()
    menu_neu = gtk_menu_item_new_with_label (Strptr("Kopieren"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_neu)
    g_signal_connect_swapped (G_OBJECT (menu_neu), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Kopieren"))
    gtk_widget_show (menu_neu)
    
    menu_open = gtk_menu_item_new_with_label (Strptr("Ausschneiden"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_open)
    g_signal_connect_swapped (G_OBJECT (menu_open), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Ausschneiden"))
    gtk_widget_show (menu_open)
    
    menu_exit = gtk_menu_item_new_with_label (Strptr("Einfügen"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_exit)
    g_signal_connect_swapped (G_OBJECT (menu_exit), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Einfügen"))
    gtk_widget_show (menu_exit)
    
    bearbeiten_menu = gtk_menu_item_new_with_label ("Bearbeiten")
    gtk_widget_show (bearbeiten_menu)
    gtk_menu_item_set_submenu (GTK_MENU_ITEM (bearbeiten_menu), menu)
    
    ' hilfe
    menu = gtk_menu_new ()
    menu_doku = gtk_menu_item_new_with_label (Strptr("Dokumentation"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_doku)
    g_signal_connect_swapped (G_OBJECT (menu_doku), "activate", G_CALLBACK (@menuitem_response),  g_strdup ("Dokumentation"))
    gtk_widget_show (menu_doku)
   
    
    menu_uber = gtk_menu_item_new_with_label (Strptr("Über"))
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_uber)
    g_signal_connect_swapped (G_OBJECT (menu_uber), "activate", G_CALLBACK (@about_cb),  g_strdup ("Über"))
    gtk_widget_show (menu_uber)
    
    hilfe_menu = gtk_menu_item_new_with_label ("Hilfe")
    gtk_widget_show (hilfe_menu)
    gtk_menu_item_set_submenu (GTK_MENU_ITEM (hilfe_menu), menu)
    
    
    
    ' A vbox to put a menu and a button in:
    vbox = gtk_vbox_new (FALSE, 0)
    gtk_container_add (GTK_CONTAINER (win), vbox)
    gtk_widget_show (vbox)

    ' Create a menu-bar to hold the menus and add it to our main window
    menu_bar = gtk_menu_bar_new ()
    gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2)
    gtk_widget_show (menu_bar)
    
    ' And finally we append the menu-item to the menu-bar
    gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), datei_menu)
    gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), bearbeiten_menu)
    gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), hilfe_menu)
    
  '  Dim As GtkWidget Ptr win
    Dim As GtkWidget Ptr vpaned
    Dim As GtkWidget Ptr list
    Dim As GtkWidget Ptr text

    gtk_init (NULL, NULL)

    gtk_widget_set_size_request (GTK_WIDGET (win), 640, 480)

    ' create a vpaned widget and add it to our toplevel window
    vpaned = gtk_vpaned_new ()
    gtk_container_add (GTK_CONTAINER (win), vpaned)
    gtk_widget_show (vpaned)
    gtk_box_pack_end (GTK_BOX (vbox),vpaned, TRUE, TRUE, 2)
    
    text = create_text ()
    gtk_paned_pack1 (GTK_PANED (vpaned), text,1,1)
    gtk_widget_show (text)

    text = create_text2 ()
    gtk_paned_pack2 (GTK_PANED (vpaned), text,1,1)
    gtk_widget_show (text)
   
    gtk_widget_show (win)

    gtk_main ()

    End 0
Maybe of interest: this shows two areas in one window with changeable borders. Should work in linux and windows.
Gablea
Posts: 1104
Joined: Apr 06, 2010 0:05
Location: Northampton, United Kingdom
Contact:

Re: Muti window display

Post by Gablea »

Thanks I shall try that
Post Reply