123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- {
- Converted from C to Pascal by Artur Bac
- <[email protected]>
- Reda Poland
- }
- {$MODE objfpc}
- {$H+}
- {$S+}
- {$HINTS ON}
- {$ifdef win32}
- {$define extdecl := stdcall;}
- {$APPTYPE GUI}
- {$endif}
- {$ifdef Unix}
- {$define extdecl := cdecl;}
- {$endif}
- Program tool_bar;
- uses glib,gdk,gtk;
- Const
- //* XPM */
- gtk_xpm : array[0..44]of pgchar = (
- '32 39 5 1',
- '. c none',
- '+ c black',
- '@ c #3070E0',
- '# c #F05050',
- '$ c #35E035',
- '................+...............',
- '..............+++++.............',
- '............+++++@@++...........',
- '..........+++++@@@@@@++.........',
- '........++++@@@@@@@@@@++........',
- '......++++@@++++++++@@@++.......',
- '.....+++@@@+++++++++++@@@++.....',
- '...+++@@@@+++@@@@@@++++@@@@+....',
- '..+++@@@@+++@@@@@@@@+++@@@@@++..',
- '.++@@@@@@+++@@@@@@@@@@@@@@@@@@++',
- '.+#+@@@@@@++@@@@+++@@@@@@@@@@@@+',
- '.+##++@@@@+++@@@+++++@@@@@@@@$@.',
- '.+###++@@@@+++@@@+++@@@@@++$$$@.',
- '.+####+++@@@+++++++@@@@@+@$$$$@.',
- '.+#####+++@@@@+++@@@@++@$$$$$$+.',
- '.+######++++@@@@@@@++@$$$$$$$$+.',
- '.+#######+##+@@@@+++$$$$$$@@$$+.',
- '.+###+++##+##+@@++@$$$$$$++$$$+.',
- '.+###++++##+##+@@$$$$$$$@+@$$@+.',
- '.+###++++++#+++@$$@+@$$@++$$$@+.',
- '.+####+++++++#++$$@+@$$++$$$$+..',
- '.++####++++++#++$$@+@$++@$$$$+..',
- '.+#####+++++##++$$++@+++$$$$$+..',
- '.++####+++##+#++$$+++++@$$$$$+..',
- '.++####+++####++$$++++++@$$$@+..',
- '.+#####++#####++$$+++@++++@$@+..',
- '.+#####++#####++$$++@$$@+++$@@..',
- '.++####++#####++$$++$$$$$+@$@++.',
- '.++####++#####++$$++$$$$$$$$+++.',
- '.+++####+#####++$$++$$$$$$$@+++.',
- '..+++#########+@$$+@$$$$$$+++...',
- '...+++########+@$$$$$$$$@+++....',
- '.....+++######+@$$$$$$$+++......',
- '......+++#####+@$$$$$@++........',
- '.......+++####+@$$$$+++.........',
- '.........++###+$$$@++...........',
- '..........++##+$@+++............',
- '...........+++++++..............',
- '.............++++...............');
- { This function is connected to the Close button or
- closing the window from the WM }
- function BOOL_TO_GINT(data : boolean) : gint;
- Begin
- if data then
- BOOL_TO_GINT:=1
- else
- BOOL_TO_GINT:=0;
- end;
- function delete_event (widget : PGtkWidget ;
- event : PGdkEvent;
- data : gpointer) : boolean ; cdecl;
- Begin
- gtk_main_quit ();
- delete_event :=FALSE;
- end;
- {The above beginning seems for sure familiar to you if it's not your first GTK program.
- There is one additional thing though,
- we include a nice XPM picture to serve as an icon for all of the buttons.
- }
- Var
- close_button : PGtkWidget; { This button will emit signal to close application }
- tooltips_button : PGtkWidget; { to enable/disable tooltips }
- text_button : PGtkWidget;
- icon_button : PGtkWidget;
- both_button : PGtkWidget; { radio buttons for toolbar style }
- entry : PGtkWidget; { a text entry to show packing any widget into toolbar }
- //In fact not all of the above widgets are needed here,
- //but to make things clearer I put them all together.
- { that's easy... when one of the buttons is toggled, we just
- * check which one is active and set the style of the toolbar
- * accordingly
- * ATTENTION: our toolbar is passed as data to callback ! }
- Procedure radio_event (widget : PGTkWidget; data : gpointer); cdecl;
- Begin
- if (gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON (text_button))) then
- gtk_toolbar_set_style(GTK_TOOLBAR ( data ), GTK_TOOLBAR_TEXT)
- else begin
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (icon_button))) then
- gtk_toolbar_set_style(GTK_TOOLBAR ( data ), GTK_TOOLBAR_ICONS);
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (both_button))) then
- gtk_toolbar_set_style(GTK_TOOLBAR ( data ), GTK_TOOLBAR_BOTH);
- end;
- End;
- { even easier, just check given toggle button and enable/disable
- * tooltips }
- Procedure toggle_event (widget : PGtkWidget; data : gpointer); cdecl;
- Begin
- {Due to gtk specification
- void gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
- gboolean enable);
- In Pasal unit this functioni is implemented as
- procedure gtk_toolbar_set_tooltips (toolbar:PGtkToolbar;
- enable:gint);
- cdecl;external gtkdll name 'gtk_toolbar_set_tooltips';
- so we have to change boolean to gint with function BOOL_TO_GINT implemented
- on the top of source
- }
- gtk_toolbar_set_tooltips (GTK_TOOLBAR ( data ),
- BOOL_TO_GINT(
- gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON (widget))));
- End;
- {The above are just two callback functions that will be called
- when one of the buttons on a toolbar is pressed.
- You should already be familiar with things like this if you've already used toggle buttons
- and radio buttons.
- }
- Var
- { Here is our main window (a dialog) and a handle for the handlebox }
- dialog : PGtkWidget;
- handlebox : PGtkWidget;
- { Ok, we need a toolbar, an icon with a mask (one for all of
- the buttons) and an icon widget to put this icon in (but
- we'll create a separate widget for each button) }
- toolbar : PGtkWidget;
- icon : PGdkPixmap;
- mask : PGdkBitmap;
- iconw : PGtkWidget;
- style : PGtkStyle;
- Begin
- { this is called in all GTK application. }
- gtk_set_locale (); //It important for apps taht use local language specific characters
- gtk_init (@argc, @argv);
- gtk_rc_init;
- { create a new window with a given title, and nice size }
- dialog := gtk_dialog_new ();
- gtk_window_set_title ( GTK_WINDOW ( dialog ) , 'GTKToolbar Tutorial');
- gtk_widget_set_usize( GTK_WIDGET ( dialog ) , 600 , 300 );
- set_allow_shrink(PGtkWindow(dialog)^,BM_ALLOW_SHRINK);
- { typically we quit if someone tries to close us }
- gtk_signal_connect ( GTK_OBJECT ( dialog ), 'delete_event',
- GTK_SIGNAL_FUNC ( @delete_event ), NULL);
- { we need to realize the window because we use pixmaps for
- * items on the toolbar in the context of it }
- gtk_widget_realize ( dialog );
- { to make it nice we'll put the toolbar into the handle box,
- * so that it can be detached from the main window }
- handlebox := gtk_handle_box_new ();
- gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG(dialog)^.vbox ),
- handlebox, FALSE, FALSE, 5 );
- {The above should be similar to any other GTK application.
- Just initialization of GTK, creating the window, etc.
- There is only one thing that probably needs some explanation:
- a handle box. A handle box is just another box that can be used to pack widgets in to.
- The difference between it and typical boxes is that it can be detached from
- a parent window (or, in fact, the handle box remains in the parent,
- but it is reduced to a very small rectangle, while all of its contents
- are reparented to a new freely floating window). It is usually nice
- to have a detachable toolbar, so these two widgets occur together quite often.
- toolbar will be horizontal, with both icons and text, and
- * with 5pxl spaces between items and finally,
- * we'll also put it into our handlebox }
- toolbar := gtk_toolbar_new ( GTK_ORIENTATION_HORIZONTAL,
- GTK_TOOLBAR_BOTH );
- gtk_container_set_border_width ( GTK_CONTAINER ( toolbar ) , 5 );
- gtk_toolbar_set_space_size ( GTK_TOOLBAR ( toolbar ), 5 );
- gtk_container_add ( GTK_CONTAINER ( handlebox ) , toolbar );
- { now we create icon with mask: we'll reuse it to create
- * icon widgets for toolbar items }
- style := gtk_widget_get_style( dialog );
- icon := gdk_pixmap_create_from_xpm_d ( dialog^.window, @mask,
- @style^.fg_gc, gtk_xpm );
- {Well, what we do above is just a straightforward initialization of the toolbar widget
- and creation of a GDK pixmap with its mask.
- If you want to know something more about using pixmaps,
- refer to GDK documentation or to the Pixmaps section earlier in this tutorial.}
- { our first item is <close> button }
- iconw := gtk_pixmap_new ( icon, mask ); { icon widget }
- close_button :=
- gtk_toolbar_append_item ( GTK_TOOLBAR (toolbar), { our toolbar }
- 'Close', { button label }
- 'Closes this app', { this button's tooltip }
- 'Private', { tooltip private info }
- iconw, { icon widget }
- GTK_SIGNAL_FUNC (@delete_event), { a signal }
- NULL );
- gtk_toolbar_append_space ( GTK_TOOLBAR ( toolbar ) ); { space after item }
- {In the above code you see the simplest case: adding a button to toolbar.
- Just before appending a new item, we have to construct a pixmap widget
- to serve as an icon for this item; this step will have to be repeated for each new item.
- Just after the item we also add a space, so the following items will not touch each other.
- As you see gtk_toolbar_append_item returns a pointer to our newly created button widget,
- so that we can work with it in the normal way.}
- { now, let's make our radio buttons group... }
- iconw := gtk_pixmap_new ( icon, mask );
- icon_button := gtk_toolbar_append_element(
- GTK_TOOLBAR(toolbar),
- GTK_TOOLBAR_CHILD_RADIOBUTTON, { a type of element }
- NULL, { pointer to widget }
- 'Icon', { label }
- 'Only icons in toolbar', { tooltip }
- 'Private', { tooltip private string }
- iconw, { icon }
- GTK_SIGNAL_FUNC (@radio_event), { signal }
- toolbar); { data for signal }
- gtk_toolbar_append_space ( GTK_TOOLBAR ( toolbar ) );
- {Here we begin creating a radio buttons group.
- To do this we use gtk_toolbar_append_element.
- In fact, using this function one can also +add simple items or even spaces
- (type := GTK_TOOLBAR_CHILD_SPACE or +GTK_TOOLBAR_CHILD_BUTTON).
- In the above case we start creating a radio group.
- In creating other radio buttons for this group a pointer to the previous button in the group
- is required, so that a list of buttons can be easily constructed
- (see the section on Radio Buttons earlier in this tutorial).
- following radio buttons refer to previous ones }
- iconw := gtk_pixmap_new ( icon, mask );
- text_button :=
- gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
- GTK_TOOLBAR_CHILD_RADIOBUTTON,
- icon_button,
- 'Text',
- 'Only texts in toolbar',
- 'Private',
- iconw,
- GTK_SIGNAL_FUNC (@radio_event),
- toolbar);
- gtk_toolbar_append_space ( GTK_TOOLBAR ( toolbar ) );
- iconw := gtk_pixmap_new ( icon, mask );
- both_button :=
- gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
- GTK_TOOLBAR_CHILD_RADIOBUTTON,
- text_button,
- 'Both',
- 'Icons and text in toolbar',
- 'Private',
- iconw,
- GTK_SIGNAL_FUNC (@radio_event),
- toolbar);
- gtk_toolbar_append_space ( GTK_TOOLBAR ( toolbar ) );
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(both_button),TRUE);
- {In the end we have to set the state of one of the buttons manually
- (otherwise they all stay in active state, preventing us from switching between them).}
- { here we have just a simple toggle button }
- iconw := gtk_pixmap_new ( icon, mask );
- tooltips_button :=
- gtk_toolbar_append_element(GTK_TOOLBAR(toolbar),
- GTK_TOOLBAR_CHILD_TOGGLEBUTTON,
- NULL,
- 'Tooltips',
- 'Toolbar with or without tips',
- 'Private',
- iconw,
- GTK_SIGNAL_FUNC (@toggle_event),
- toolbar);
- gtk_toolbar_append_space ( GTK_TOOLBAR ( toolbar ) );
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tooltips_button),TRUE);
- {A toggle button can be created in the obvious way
- (if one knows how to create radio buttons already).}
- { to pack a widget into toolbar, we only have to
- create it and append it with an appropriate tooltip }
- entry := gtk_entry_new ();
- gtk_toolbar_append_widget( GTK_TOOLBAR (toolbar),
- entry,
- 'This is just an entry',
- 'Private' );
- { well, it isn't created within thetoolbar, so we must still show it }
- gtk_widget_show ( entry );
- {As you see, adding any kind of widget to a toolbar is simple.
- The one thing you have to remember is that this widget must be shown manually
- (contrary to other items which will be shown together with the toolbar).}
- { that's it ! let's show everything. }
- gtk_widget_show ( toolbar );
- gtk_widget_show (handlebox);
- gtk_widget_show ( dialog );
- { rest in gtk_main and wait for the fun to begin! }
- gtk_main ();
- End.
|