|
Post by bigbass on Oct 28, 2013 17:48:41 GMT 1
Hey vovchik thanks for the suggestions That treeview is the simplistic demo it still needs callbacks and more options I looked at several other examples of treeview none being easy to convert (yet) and it may be better to add features in steps since this widget is more complex than others most likely why it is not used often man.chinaunix.net/develop/GTK+/2.6/gtk/TreeWidget.htmldemo1 simple basic demo2 has callbacks demo3 add everything to make a practical widget Joe
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Oct 28, 2013 20:06:39 GMT 1
*** DELETED ***
|
|
|
Post by bigbass on Oct 29, 2013 17:09:45 GMT 1
reserved for widget example embedding gtk in bacon demo2 has callbacks
|
|
|
Post by bigbass on Oct 30, 2013 8:34:56 GMT 1
reserved for widget example embedding gtk in bacon demo3 add everything to make a practical widget
|
|
Deleted
Deleted Member
Posts: 0
|
Post by Deleted on Oct 30, 2013 10:29:13 GMT 1
*** DELETED ***
|
|
|
Post by bigbass on Oct 30, 2013 17:08:19 GMT 1
reserved for widget example embedding gtk in bacon Here is a working C code demo I have to port this to BaCon still very far from being an easy one to use but anyway we need an example of all the possible widgets this demo by default uses the status bar as the call back so it will display what you selected gtk_tree_view_with_tree_store2.c edited to update code to gtk2/3 and use local icons gcc gtk_tree_view_with_tree_store2.c -o gtk_tree_view_with_tree_store2 `pkg-config --cflags --libs gtk+-2.0` #include <gtk/gtk.h>
enum { PIXBUF_COL, TEXT_COL };
createModel() { const gchar *files[] = {"/usr/share/icons/hicolor/32x32/apps/blueman.png", "/usr/share/icons/hicolor/32x32/apps/gimp.png", "/usr/share/icons/hicolor/32x32/apps/pidgin.png", "/usr/share/icons/hicolor/32x32/apps/tomboy.png"}; gchar *stocks[] = { GTK_STOCK_DIALOG_WARNING, GTK_STOCK_STOP, GTK_STOCK_NEW, GTK_STOCK_CLEAR, GTK_STOCK_OPEN };
gchar *stockNames[] = { "WARNING", "STOP", "NEW", "GTK_STOCK_CLEAR", "GTK_STOCK_OPEN" };
GtkWidget *cellView; GdkPixbuf *pixbuf; GtkTreeIter iter1, iter2; GtkTreeStore *store; gint i, j, s;
store = gtk_tree_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING); cellView = gtk_cell_view_new(); for(i = 0; i < 4; i++) { pixbuf = gdk_pixbuf_new_from_file(files[i], NULL); gtk_tree_store_append(store, &iter1, NULL); gtk_tree_store_set(store, &iter1, PIXBUF_COL, pixbuf, TEXT_COL, files[i], -1); g_object_unref(pixbuf);
for(j = 0; j < 3; j++) { s = rand() % 5; pixbuf = gtk_widget_render_icon(cellView, stocks[s], GTK_ICON_SIZE_BUTTON, NULL); gtk_tree_store_append(store, &iter2, &iter1); gtk_tree_store_set(store, &iter2, PIXBUF_COL, pixbuf, TEXT_COL, stockNames[s], -1); g_object_unref(pixbuf); } }
return GTK_TREE_MODEL(store); }
gboolean selection_changed(GtkTreeSelection *selection, GtkLabel *label) { GtkTreeView *treeView; GtkTreeModel *model; GtkTreeIter iter; gchar *active; treeView = gtk_tree_selection_get_tree_view(selection); model = gtk_tree_view_get_model(treeView); gtk_tree_selection_get_selected(selection, &model, &iter); gtk_tree_model_get(model, &iter, 1, &active, -1);
gtk_label_set_text(label, active); }
int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *treeView; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *label; GtkWidget *vbox; GtkTreeSelection *selection;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "GtkTreeView"); gtk_window_set_default_size(GTK_WINDOW(window), 200, 50);
treeView = gtk_tree_view_new_with_model(createModel());
renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes( "Icon", renderer, "pixbuf", PIXBUF_COL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes( "Filename", renderer, "text", TEXT_COL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW (treeView), column);
label = gtk_label_new("caterpillar.jpg"); vbox = gtk_vbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), treeView, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 5); gtk_container_add(GTK_CONTAINER(window), vbox);
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeView)); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(selection_changed), label);
g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0; }
|
|
|
Post by bigbass on Nov 17, 2013 6:57:30 GMT 1
Get the mouse button that was clicked
left ,center or right mouse button detected
finally a simple demo!
can be useful for many things see result in the terminal
Joe
PRAGMA LDFLAGS pkg-config --cflags --libs gtk+-2.0 PRAGMA INCLUDE gtk-2.0/gtk/gtk.h
'---gtk_ commands PROTO gtk_window_begin_move_drag PROTO gtk_init PROTO gtk_window_new PROTO gtk_window_set_position PROTO gtk_window_set_default_size PROTO gtk_window_set_title PROTO gtk_window_set_decorated PROTO gtk_widget_add_events PROTO gtk_widget_show PROTO gtk_main PROTO QUIT gtk_main_quit
'---g_ commands PROTO g_signal_connect PROTO g_signal_connect_swapped
PROTO g_signal_connect_data ALIAS CALLBACK
'===================== SUB exit_prog '===================== gtk_main_quit END SUB
'========================================================================================= FUNCTION on_button_press (GtkWidget* widget, GdkEventButton * event, GdkWindowEdge edge) '========================================================================================= '--- using value 1 is left mouse button '--- using value 2 is middle mouse button '--- using value 3 is right mouse button PRINT "you pressed the mouse button number " , event->button RETURN FALSE END FUNCTION
DECLARE *window TYPE GtkWidget
gtk_init(0, 0)
window = gtk_window_new(GTK_WINDOW_TOPLEVEL) gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER) gtk_window_set_default_size(GTK_WINDOW(window), 230, 150) gtk_window_set_title(GTK_WINDOW(window), "mouse button detect") gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK)
g_signal_connect(G_OBJECT(window), "button-press-event", G_CALLBACK(on_button_press), NULL)
CALLBACK(window, "delete-event", exit_prog, 0, 0, 0)
gtk_widget_show(window)
gtk_main()
|
|
|
Post by vovchik on Nov 17, 2013 11:22:32 GMT 1
Dear Joe,
Works nicely, as usual. Might be nice to group all the mouse bits together eventually - get mousexy, clicks, wheel movement, motion detection etc - and some of your very useful keyboard bits - under a 'user interaction' heading or something similar.
Thanks....
With kind regards, vovchik
|
|
|
Post by bigbass on Nov 17, 2013 16:14:54 GMT 1
Hey vovchik
I agree that was the bare basic this one added the xy and drag n drop still have to figure out a good mouse wheel example to port the keyboard is already done just have to add that pat of the code
PRAGMA LDFLAGS pkg-config --cflags --libs gtk+-2.0
PRAGMA INCLUDE gtk-2.0/gtk/gtk.h
'---gtk_ commands PROTO gtk_window_begin_move_drag PROTO gtk_init PROTO gtk_window_new PROTO gtk_window_set_position PROTO gtk_window_set_default_size PROTO gtk_window_set_title PROTO gtk_window_set_decorated PROTO gtk_widget_add_events PROTO gtk_widget_show PROTO gtk_main PROTO QUIT gtk_main_quit
'---g_ commands PROTO g_signal_connect PROTO g_signal_connect_swapped
PROTO g_signal_connect_data ALIAS CALLBACK PROTO sprintf
'--- may be needed for gtk 3 GDK_CORE_DEVICE_EVENTS = 1
'===================== SUB exit_prog '===================== gtk_main_quit END SUB
'========================================================================================= SUB frame_callback(GtkWindow *window, GdkEvent *event, gpointer data) '========================================================================================= LOCAL x, y TYPE int DECLARE buf[10] TYPE char x = event->configure.x y = event->configure.y sprintf(buf, "%d, %d", x, y) gtk_window_set_title(window, buf) END SUB
'========================================================================================= FUNCTION on_button_press (GtkWidget* widget, GdkEventButton * event, GdkWindowEdge edge) '========================================================================================= '--- using value 1 is left mouse button '--- using value 2 is middle mouse button '--- using value 3 is right mouse button
num = event->button
PRINT "you pressed the mouse button number " , num gtk_window_begin_move_drag(GTK_WINDOW(gtk_widget_get_toplevel(widget)), event->button, event- >x_root,event->y_root, event->time) PRINT "X event " , event->x_root PRINT "Y event " , event->y_root
IF num == 1 THEN PRINT "one" END IF
IF num == 2 THEN PRINT "two" END IF
IF num == 3 THEN PRINT "three" END IF
RETURN FALSE
END FUNCTION
DECLARE *window TYPE GtkWidget
gtk_init(0, 0)
window = gtk_window_new(GTK_WINDOW_TOPLEVEL) gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER) gtk_window_set_default_size(GTK_WINDOW(window), 230, 150) gtk_window_set_title(GTK_WINDOW(window), "mouse button detect")
gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK)
g_signal_connect(G_OBJECT(window), "button-press-event", G_CALLBACK(on_button_press), NULL) g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(frame_callback), NULL)
CALLBACK(window, "delete-event", exit_prog, 0, 0, 0)
gtk_widget_show(window)
gtk_main()
|
|
|
Post by bigbass on Nov 29, 2013 18:09:46 GMT 1
Where does PROTO fit into BaCon ?
1.)Here is one example how to get low level signals from the mouse you learn about what's really going on under the hood
2.)compile time is very fast
3.)we all want simple syntax which c and gtk don't provide the ALIAS helps that but is still heavy
4.)I see this as a pre step to get code into BaCon or I should say porting gtk showing everything transparently nothing else needed but the code that is used doing it all without a library to handle the syntax conversion
this allows for you to see just one widget at a time without sorting through a lot of other code
I prefer HUG syntax so I hope the work that was done with PROTO can be used to add more widgets to HUG and may also be helpful to get it into the goocanvas
maybe someone would like to convert this to an include file and use it with HUG I would like to start converting some of the widgets to include files keeping everything clean just focusing on one widget
mouse-get.bac
displays what mouse button was pressed in the titlebar and in the terminal
PRAGMA LDFLAGS pkg-config --cflags --libs gtk+-2.0 PRAGMA INCLUDE gtk-2.0/gtk/gtk.h
'mouse-get.bac '---gtk_ commands PROTO gtk_window_begin_move_drag ALIAS BEGIN_DRAG PROTO gtk_init PROTO gtk_window_new ALIAS WINDOW PROTO gtk_window_set_position ALIAS WINDOW_POSITION PROTO gtk_window_set_default_size ALIAS WINDOW_SIZE PROTO gtk_window_set_title ALIAS TITLE PROTO gtk_widget_add_events ALIAS ADD_EVENTS PROTO gtk_widget_show ALIAS SHOW PROTO gtk_main ALIAS DISPLAY PROTO gtk_main_quit ALIAS QUIT
'---g_ commands PROTO g_signal_connect ALIAS CALLBACK_GTK PROTO g_signal_connect_data ALIAS CALLBACK
DECLARE *window TYPE GtkWidget
'===================== SUB exit_prog '===================== QUIT END SUB
'========================================================================================= FUNCTION on_button_press (GtkWidget* widget, GdkEventButton * event, GdkWindowEdge edge) '========================================================================================= '--- using value 1 is left mouse button '--- using value 2 is middle mouse button '--- using value 3 is right mouse button PRINT "you pressed the mouse button number " , event->button
'---problem have to force the integer from the pointer for BaCon to see it num = event->button
IF num == 1 THEN PRINT "one" TITLE(GTK_WINDOW(window), "you clicked one") PRINT "X event " , event->x_root PRINT "Y event " , event->y_root END IF
IF num == 2 THEN PRINT "two" TITLE(GTK_WINDOW(window), "you clicked two") PRINT "X event " , event->x_root PRINT "Y event " , event->y_root END IF
IF num == 3 THEN PRINT "three" TITLE(GTK_WINDOW(window), "you clicked three") PRINT "X event " , event->x_root PRINT "Y event " , event->y_root END IF
RETURN FALSE END FUNCTION
gtk_init(0, 0)
window = WINDOW(GTK_WINDOW_TOPLEVEL) WINDOW_POSITION(GTK_WINDOW(window), GTK_WIN_POS_CENTER) WINDOW_SIZE(GTK_WINDOW(window), 230, 150)
TITLE(GTK_WINDOW(window), "mouse button detect") ADD_EVENTS(window, GDK_BUTTON_PRESS_MASK)
CALLBACK_GTK(G_OBJECT(window), "button-press-event", G_CALLBACK(on_button_press), NULL) CALLBACK(window, "delete-event", exit_prog, 0, 0, 0)
SHOW(window) DISPLAY
|
|
|
Post by bigbass on Nov 30, 2013 16:39:20 GMT 1
Finally figured out the mouse scroll wheel! why does gtk have to be so ugly to something that should be simple ? I didn't find an example to convert I got lucky and figured out what to change anyway we now have an example and no USEC ENDUSEC getting the mouse scroll if it was up or down added the keyboard event too user interactionwiki.basic-converter.org/index.php/User-interaction.bacuser-interaction.bac
|
|
|
Post by vovchik on Nov 30, 2013 19:40:09 GMT 1
Dear Joe,
That is really nice and - I might add - not ugly, like my earlier scrollwheel bit using USEC was. And very compact, too. Thanks.
With kind regards, vovchik
|
|
|
Post by bigbass on May 4, 2014 23:28:20 GMT 1
It has been awhile since I posted a proto gtk example here but it is time to simplify things maybe I was trying to be "too transparent showing everything on one page " so for those who want minimum code in userland here it goes This is pure gtk code baconized with just an include.bac file when you need a filechooser just add the include file maybe the idea of using an alias and proto will be clearer now filechooser-alias.tar.gz (6.93 KB) You need to have gtk3 and geany installed *easy to do one in gtk2 also if needed for the demo (later you could edit it for your default viewer) INCLUDE filechooser_include.bac
INIT (0, 0) '--- we call the filechooser FCHOOSER CALLBACK(dialog, "destroy", exit_prog, 0, 0, 0) DISPLAY
|
|
|
Post by alexfish on Jun 8, 2014 15:34:42 GMT 1
Hi All
problems I found with Proto
1. getting values back as in button states 'this was a big bug bare' in gtk , also same applies when using other toolkits had to implement a separate lib compiled as in same method below , ie to get to the low level functions of the widget 2. constantly having to define each widget IE DECLARE win TYPE GtkWidget 3. finding a consistent method that allows ease of use when using libs other than GTK 4. Asserting BASIC type functionality based on HUG
in 1. solved , by the use of GETPROPERY + ensure correct value is passed with reference to defining the function with TYPE example
FUNCTION BUTTON_STATE(WIDGET *widget) TYPE int
in 2. solved this using ALIAS WIDGET and preceding the widget function with WIDGET *mywidget
PROTO GtkWidget ALIAS WIDGET in 3 . solved by 1 & 2
in 4. I do not think there is a perfect Solution esp when dealing with different API's one can see the obvious when in HUG have ATTACH , we can assume if a table then it could be ATTACHTABLE , for simplistic reading have used type extension underscore IE ATTACH_TABLE , so can also be a matter of choice if one Wants to use the singular as ATTACHTABLE or TABLEATTACH 'just rename it'
so here putting Latest Bacon Beta to the test , sort of based on first post by Peter
+ think it is important when posting widgets we can get the functionally of the widget to work as intended
Have fun + BR
Alex
a bit of code + remember to use Latest Bacon Beta 3.0.1
SUB INIT PRAGMA LDFLAGS `pkg-config --libs gtk+-2.0` PRAGMA OPTIONS `pkg-config --cflags gtk+-2.0 ` PRAGMA INCLUDE gtk-2.0/gtk/gtk.h
PROTO gtk_init
PROTO gtk_widget_set_size_request PROTO g_signal_connect_data PROTO gtk_table_new PROTO gtk_container_add PROTO gtk_button_new_with_label PROTO gtk_table_attach_defaults PROTO gtk_widget_show_all PROTO gtk_main
PROTO g_object_get
PROTO GtkWidget ALIAS WIDGET
gtk_init(0, 0)
PROTO GETPROPERTY DEF FN GETPROPERTY(widget, name, ...) = g_object_get(widget, name, __VA_ARGS__, NULL)
END SUB
FUNCTION WINDOW(STRING title$,int width,int height)
PROTO gtk_window_new PROTO gtk_window_set_title PROTO gtk_window_set_position LOCAL *win TYPE WIDGET
win = gtk_window_new(GTK_WINDOW_TOPLEVEL) gtk_window_set_title(GTK_WINDOW(win), title$) gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER) gtk_widget_set_size_request(win, width, height) g_signal_connect_data(win, "delete-event", G_CALLBACK(gtk_exit), 0, 0, 0) gtk_widget_show_all(win)
RETURN win END FUNCTION
FUNCTION TABLE(WIDGET *widget,int rows,int columns,int homogeneous) PROTO gtk_table_new
LOCAL *table TYPE WIDGET table = gtk_table_new(rows, columns, homogeneous) gtk_container_add(GTK_CONTAINER(widget), table) gtk_widget_show_all(table) RETURN table END FUNCTION
FUNCTION BUTTON(WIDGET *dummy,STRING title$,int width ,int height)
PROTO gtk_button_new_with_label LOCAL *button TYPE WIDGET
button = gtk_button_new_with_label(title$) gtk_widget_set_size_request(button, width, height) gtk_widget_show_all(button) RETURN button
END FUNCTION
FUNCTION BUTTON_STATE(WIDGET *widget) TYPE int
'@ here use the get property to get states since "gtk_toggle_button_get_active" failed LOCAL val TYPE int GETPROPERTY(widget,"active",&val) RETURN val END FUNCTION
FUNCTION CHECK(WIDGET *widget,STRING title$,int width ,int height) PROTO gtk_check_button_new_with_label LOCAL *check TYPE WIDGET
check=gtk_check_button_new_with_label(title$) gtk_widget_set_size_request(check, width, height) gtk_widget_show_all(check) RETURN check
END FUNCTION
SUB ATTACH_TABLE(WIDGET *parent ,WIDGET *child,int left_attach , int right_attach , int top_attach ,int bottom_attach) PROTO gtk_table_attach_defaults gtk_table_attach_defaults(GTK_TABLE(parent), child, left_attach, right_attach, top_attach,bottom_attach) END SUB
SUB SHOW(WIDGET *widget) gtk_widget_show_all(widget) END SUB
SUB DISPLAY gtk_main END SUB
SUB CALLBACK(WIDGET *widget,STRING action$,void* address) PROTO g_signal_connect_data g_signal_connect_data(widget,action$, G_CALLBACK(address), 0, 0, 0) END SUB
SUB QUIT() PROTO gtk_main_quit gtk_main_quit() END SUB
SUB GET_CHECK(WIDGET *widget) LOCAL val TYPE int val=BUTTON_STATE(widget) PRINT val
END SUB
'@ always INIT INIT
'@ the precede where (*widget) is not necessary , can IE use WIDGET *win '@ have used brackets for aesthetics only
WIDGET(*win) = WINDOW("Test Win",600,400)
'@ need to define what type of container/layout required , here using TABLE WIDGET(*grid) = TABLE(win,55,50,TRUE) WIDGET(*but) = BUTTON(win,"Quit",-1,-1) WIDGET(*ck) = CHECK(win,"My Check",-1,-1)
ATTACH_TABLE(grid,ck,1,10,44,50) ATTACH_TABLE(grid,but,41, 49, 44, 50)
CALLBACK(but,"clicked",QUIT) CALLBACK(ck,"clicked",GET_CHECK) DISPLAY
|
|
|
Post by bigbass on Jun 8, 2014 16:38:55 GMT 1
Hey Alex Thanks for the functions there are some things we could combine together to make things still a bit easier using the first example snippet here basic-converter.proboards.com/thread/447/embedding-external-libraries-gtk-demo?page=1I had done all the widgets that are on the gtk2 and gtk3 main site ported to BaCon so we have many widgets ready for fine tuning into an easier lib this was a long process of testing before all the nice new features have been added to the compiler making things even better 1.)remove headers to get rid of casting code like gtk does status:done 2.)remove G_CALLBACK status:done 3.)remove the pointer DECLARES (not bad but can be cleaned up more) one example removed the need for LOCAL *win,*grid,*button TYPE GtkWidget status:done 4.)make gtk more friendly with ALIAS code looks more like HUG status:done here is the same code as in the first example but updated using some new methods Joe '--- using shared lib instead of the usual pragma include
'--- link to the shared libs directly
'--- Needed for gtk2 PRAGMA LDFLAGS gtk-x11-2.0
'--- Needed to connect signals PRAGMA LDFLAGS gobject-2.0
PROTO gtk_init ALIAS INIT PROTO gtk_main_quit ALIAS QUIT PROTO gtk_window_new ALIAS WINDOW PROTO gtk_window_set_default_size ALIAS WINDOW_SIZE PROTO gtk_window_set_title ALIAS TITLE PROTO gtk_table_new ALIAS TABLE PROTO gtk_container_add ALIAS CONTAINER PROTO gtk_table_attach_defaults ALIAS ATTACH_TABLE PROTO gtk_button_new_from_stock ALIAS BUTTON PROTO gtk_table_attach_defaults ALIAS ATTACH_TABLE PROTO g_signal_connect_data ALIAS CALLBACK PROTO gtk_widget_show_all ALIAS SHOW PROTO gtk_label_new ALIAS LABEL PROTO gtk_main ALIAS DISPLAY
SUB exit_prog gtk_main_quit END SUB
INIT(0, 0)
window = WINDOW() WINDOW_SIZE(window, 200, 200) TITLE(window, "Hello world ")
table = TABLE(15, 15, 1) CONTAINER(window, table) label = LABEL("Bacon and GTK shared lib example!") ATTACH_TABLE(table, label, 1, 8, 3, 7)
button = BUTTON("gtk-quit") ATTACH_TABLE(table, button, 10, 14, 12, 14)
CALLBACK(window, "delete-event", exit_prog, 0, 0, 0) CALLBACK(button, "clicked", exit_prog, 0, 0, 0)
SHOW(window) DISPLAY
|
|