|
Post by alexfish on May 29, 2012 16:50:03 GMT 1
RE POST Re: Anyone interested in collaborating on a RAD « Reply #49 Yesterday at 7:22am » SEE ATTACHMENTS for code regards alexfish Attachments:
|
|
2lss
Full Member
Posts: 140
|
Post by 2lss on May 29, 2012 17:14:35 GMT 1
Hi Guys, Before you go much further you may want to consider the end product. Do you think the user should be able to take advantage of their screen real estate with a resizeable GUI and scrollable layout area? Definitely. I threw the initial demo together in a short amount of time, but wanted to go back and change things around. It looks like you got it figured out. The only other thing I was considering was changing to a gtk table instead of gtk fixed and creating a white background for the GUI preview.
|
|
mobeus
Junior Member
Posts: 86
|
Post by mobeus on May 29, 2012 17:47:10 GMT 1
Hi 2lss,
Ha, no not really. HUG does not support this type of window configuration right now. I didn’t want to waste a bunch of time so the screen shot is a glade mockup.
Been thinking about making an include file to extend HUG without hacking hug.bac. Like throw in a function to return a blank RAD builder window with the vbox hbox and split pane so HUG could furnish the rest of the widgets. Maybe?
Take a look at GtkLayout. It works like a fixed but has better capabilities.
|
|
|
Post by bigbass on May 29, 2012 19:01:47 GMT 1
Right now we have some healthy progress many important pieces are coming together (from everyone) we can pick and choose what to use and adapt them
Me for one as vovchik mentioned am thinking of a CAD type front end using a canvas that will generate the widget names and x-y locations automatically then the result file.bac would have to be compiled but the widget code is made for you still a lot more work to be done for each widget but this gets the idea I will have buttons to select different widgets to build like GIMP the terminal shows the output ) for now) that will be modified to output to a file.bac when you like the placement you press Save
ah ... the bbc spaces and tabs it looked so nice before the post will fix it tonight
Joe
INCLUDE hug.bac
canvas_x = 400 canvas_y = 380
' we want to "echo out" text in the entry '---------------------- SUB entry_demo() '---------------------- PRINT "entry_demo" PRINT GRAB$(My_entry_title) END SUB
' we want to "echo out" text in the entry '---------------------- SUB entry_demo2() '---------------------- PRINT "entry_demo2" PRINT GRAB$(My_entry_x) END SUB
' we want to "echo out" text in the entry '---------------------- SUB entry_demo3() '---------------------- PRINT "entry_demo3" PRINT GRAB$(My_entry_y) END SUB
' we want to "echo out" text in the entry '---------------------- SUB SAVE_DATA() '---------------------- PRINT "save data will auto make the widget and send to a file " PRINT GRAB$(My_entry_unique_name) PRINT GRAB$(My_entry_title) PRINT GRAB$(My_entry_x) PRINT GRAB$(My_entry_y) END SUB
'---------------------- SUB CLEAN_SCREEN() '---------------------- 'clear terminal output CLEAR 'redraw canvas again canvas = CANVAS(canvas_x, canvas_y) ATTACH(win, canvas, 0,0) My_entry_unique_name = ENTRY("", 220, 25) ATTACH(win, My_entry_unique_name, 435, 20 ) My_entry_title = ENTRY("", 220, 25) ATTACH(win, My_entry_title, 435, 50 ) entry_x$ = " " My_entry_x = ENTRY(entry_x$, 50, 25) ATTACH(win, My_entry_x, 435, 80 ) entry_y$ = " " My_entry_y = ENTRY(entry_y$, 50, 25) ATTACH(win, My_entry_y , 435, 110 ) CALLBACK(clean, CLEAN_SCREEN) CALLBACK(canvas, HandleMouse) CALLBACK(myquit, QUIT) CALLBACK(My_entry_title, entry_demo) CALLBACK(My_entry_x, entry_demo2) CALLBACK(My_entry_y, entry_demo3) 'CALLBACK(button_save, SAVE_DATA) END SUB
'---------------------- SUB HandleMouse() '---------------------- cursor_x = MOUSE(0) cursor_y = MOUSE(1) IF MOUSE(2) = 1 THEN PRINT PRINT cursor_x, " cursor_x" PRINT cursor_y, " cursor_y" PRINT DRAW(canvas) SYNC LINE("blue", 0, cursor_y, 400, cursor_y) LINE("red", cursor_x, 0, cursor_x, 440) PICTURE("/usr/share/pixmaps/close.png", cursor_x, cursor_y, 84, 26) My_entry_unique_name = ENTRY("unique name", 220, 25) ATTACH(win, My_entry_unique_name, 435, 20 ) My_entry_title = ENTRY("BUTTON", 220, 25) ATTACH(win, My_entry_title, 435, 50 ) CALLBACK(My_entry_title, entry_demo) entry_x$ = CONCAT$(STR$(cursor_x)) My_entry_x = ENTRY(entry_x$, 50, 25) ATTACH(win, My_entry_x, 435, 80 ) CALLBACK(My_entry_x, entry_demo2) entry_y$ = CONCAT$(STR$(cursor_y)) My_entry_y = ENTRY(entry_y$, 50, 25) ATTACH(win, My_entry_y , 435, 110 ) CALLBACK(My_entry_y, entry_demo3) CALLBACK(button_save, SAVE_DATA) END IF END SUB
'---------------------- 'MAIN GUI '---------------------- INIT HUGOPTIONS("CANVAS GL") HUGOPTIONS("GL_FREEZE 1") HUGOPTIONS("NOSCALING")
win = WINDOW("Get x and y positions", 750, 440) canvas = CANVAS(canvas_x, canvas_y) ATTACH(win, canvas, 0, 0)
mark1 = MARK("Left click to start", 300, 15) ATTACH (win, mark1, 42, 400)
clean = BUTTON("Clean", 70, 30) myquit = BUTTON("Quit", 70, 30) button_save = BUTTON("Save", 70, 30) ATTACH(win, clean, 10 ,390) ATTACH(win, myquit, 318, 390) ATTACH(win, button_save, 410, 180) FRAME_STR = FRAME(330, 150) ATTACH( win, FRAME_STR, 410, 10 ) My_entry_title = ENTRY("widget name", 220, 25) ATTACH(win, My_entry_title, 435, 50 ) CALLBACK(My_entry_title, entry_demo) mark2 = MARK("x value", 300, 15) ATTACH (win, mark2, 380, 80) entry_x$ = CONCAT$(STR$(cursor_x)) My_entry_x = ENTRY(entry_x$, 50, 25) ATTACH(win, My_entry_x, 435, 80 ) CALLBACK(My_entry_x, entry_demo2) mark3 = MARK("y value", 300, 15) ATTACH (win, mark3, 380, 110) entry_y$ = CONCAT$(STR$(cursor_y)) My_entry_y = ENTRY(entry_y$, 50, 25) ATTACH(win, My_entry_y , 435, 110 ) CALLBACK(My_entry_y, entry_demo3) CALLBACK(clean, CLEAN_SCREEN) CALLBACK(canvas, HandleMouse) CALLBACK(myquit, QUIT) 'CALLBACK(button_save, SAVE_DATA) DISPLAY
|
|
mobeus
Junior Member
Posts: 86
|
Post by mobeus on May 29, 2012 21:58:18 GMT 1
Yeah, I don't know about you guys but I'm having fun! Playing around at extending HUG here. Its a RAD builder window based on 2lss' code much like the screen shot I posted above. You can mix HUG widgets with raw gtk windows BTW how do you guys get the code to post as formatted with the indents? INCLUDE hug.bac INIT
CONST gtk$ = HUGLIB$("gtk") GLOBAL active_widget, X DECLARE widget_x_pos ASSOC NUMBER DECLARE widget_y_pos ASSOC NUMBER
IMPORT "gtk_fixed_move(long,long,int,int)" FROM gtk$ TYPE void
'=== RADWINDOW IMPORTS === IMPORT "gtk_vbox_new(int,int)" FROM gtk$ TYPE long IMPORT "gtk_hbox_new(int,int)" FROM gtk$ TYPE long
IMPORT "gtk_hpaned_new()" FROM gtk$ TYPE long IMPORT "gtk_paned_pack1(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_paned_pack2(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_paned_set_position(long,int)" FROM gtk$ TYPE void
IMPORT "gtk_box_pack_start(long,long,int,int,int)" FROM gtk$ TYPE void
IMPORT "gtk_layout_new()" FROM gtk$ TYPE long IMPORT "gtk_layout_set_size(long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_layout_put(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_layout_move(long,long,int,int)" FROM gtk$ TYPE void
IMPORT "gtk_scrolled_window_new(long,long)" FROM gtk$ TYPE long IMPORT "gtk_scrolled_window_set_policy(long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_scrolled_window_set_shadow_type(long,int)" FROM gtk$ TYPE void
IMPORT "gtk_menu_bar_new" FROM gtk$ TYPE long IMPORT "gtk_menu_item_new" FROM gtk$ TYPE long IMPORT "gtk_menu_item_new_with_mnemonic(char*)" FROM gtk$ TYPE long IMPORT "gtk_menu_item_new_with_label(char*)" FROM gtk$ TYPE long IMPORT "gtk_menu_item_set_submenu(long,long)" FROM gtk$ TYPE void IMPORT "gtk_menu_new" FROM gtk$ TYPE long IMPORT "gtk_menu_shell_append(long,long)" FROM gtk$ TYPE void IMPORT "gtk_menu_item_set_submenu(long,long)" FROM gtk$ TYPE void
'=== RADWINDOW GLOBALS === DECLARE rad_pallet_container TYPE long DECLARE rad_layout_container TYPE long DECLARE rad_paned TYPE long
FUNCTION RADWINDOW (STRING hug_title$, int hug_xsize, int hug_ysize)
LOCAL win, layer, dim, i
win = gtk_window_new(GTK_WINDOW_TOPLEVEL) gtk_window_set_title(win, hug_title$) gtk_window_set_position(win, GTK_WIN_POS_CENTER)
g_signal_connect_data(win, "delete-event", exit, 0, 0, 0) g_signal_connect_data(win, "key-press-event", hug_key_press, 0, 0, 0)
'============================================================================== 'HACK ' Setup vbox MAIN CONTAINER rw_vboxmain = gtk_vbox_new(0, 0) ' Create menubar rw_menubar = gtk_menu_bar_new() ' Create FILE submenu fmenu = gtk_menu_new() file_menu = gtk_menu_item_new_with_mnemonic("_Open...") save_menu = gtk_menu_item_new_with_mnemonic("_Save") saveas_menu = gtk_menu_item_new_with_mnemonic("S_ave as...") sep15 = gtk_menu_item_new() new_menu = gtk_menu_item_new_with_mnemonic("_New") sep5 = gtk_menu_item_new() exit_menu = gtk_menu_item_new_with_mnemonic("_Exit") gtk_menu_shell_append(fmenu, file_menu) gtk_menu_shell_append(fmenu, save_menu) gtk_menu_shell_append(fmenu, saveas_menu) gtk_menu_shell_append(fmenu, sep5) gtk_menu_shell_append(fmenu, exit_menu) fmenu_item = gtk_menu_item_new_with_mnemonic("_File") gtk_menu_item_set_submenu(fmenu_item, fmenu) gtk_menu_shell_append(rw_menubar, fmenu_item)
' Horiz. Pane rw_panemain = gtk_hpaned_new () ' Setup hbox WIDGET PALLET CONTAINER rw_fixed = gtk_fixed_new(0, 0) ' Scrollew window for layout rw_scrolled = gtk_scrolled_window_new(0, 0) gtk_scrolled_window_set_policy(rw_scrolled, 1, 1) gtk_scrolled_window_set_shadow_type(rw_scrolled, 3) rw_layout = gtk_layout_new(0,0) gtk_layout_set_size(rw_layout, 1440, 900) gtk_container_add(rw_scrolled, rw_layout) gtk_paned_pack1 (rw_panemain, rw_fixed, FALSE, TRUE) gtk_paned_pack2 (rw_panemain, rw_scrolled, TRUE, TRUE)
gtk_box_pack_start(rw_vboxmain, rw_menubar, 0, 0, 0) gtk_box_pack_start(rw_vboxmain, rw_panemain, 1, 1, 2)
gtk_container_add(win, rw_vboxmain)
rad_pallet_container = rw_fixed rad_layout_container = rw_layout rad_paned = rw_panemain
'==============================================================================
gtk_widget_set_size_request(win, INT(hug_xsize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(hug_ysize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(win)
hug_winstate(STR$(win)) = 0
hug_widget_xsize(STR$(win)) = hug_xsize hug_widget_ysize(STR$(win)) = hug_ysize hug_widget_signal(STR$(win)) = 1 hug_widget_s_widget(STR$(win)) = win hug_widget_type$(STR$(win)) = "window" 'HACK hug_widget_attach(STR$(win)) = 0 hug_widget_font(STR$(win)) = win hug_widget_focus(STR$(win)) = win
RETURN win
END FUNCTION
' Add a button to gui builder and save x/y coordinates in associative arrays SUB Add_button_widget() INCR X button_widget = BUTTON(CONCAT$("Button ", STR$(X)), 80, 30) gtk_layout_put(rad_layout_container, button_widget, 5, 15) widget_x_pos(STR$(button_widget)) = 5 widget_y_pos(STR$(button_widget)) = 15 CALLBACK(button_widget, Register_properties) END SUB
' Bring up the Properties tab when the widget is clicked and set position in spin buttons SUB Register_properties(NUMBER widget) active_widget = widget SET(tabs, 1) SET(spin_x_pos, widget_x_pos(STR$(widget))) SET(spin_y_pos, widget_y_pos(STR$(widget))) END SUB
' When the X or Y position spin button is changed move the widget SUB Move_widget(NUMBER widget) gtk_layout_move(rad_layout_container, active_widget, GET(spin_x_pos), GET(spin_y_pos)) END SUB
' Position of the gui builder gui_x_pos = 280 gui_y_pos = 5 ' Size of the gui builder gui_x_size = 315 gui_y_size = 440
newwin = RADWINDOW("BaCon RAD", 700, 450)
gtk_paned_set_position(rad_paned, 320) ' Create Widgets tab--------- tabs = NOTEBOOK("Widgets", 270, 1440) 'ATTACH(rad_pallet_container, tabs, 5, 5) gtk_container_add(rad_pallet_container, tabs)
frame2 = FRAME(255, 1440) TEXT(frame2, "Click to add to GUI") ATTACH(tabs, frame2, 5, 5)
widget_button = BUTTON("Button", 60, 30) ATTACH(tabs, widget_button, 10, 40) CALLBACK(widget_button, Add_button_widget)
' Create Properties tab ------ TEXT(tabs, "Properties")
' Position frame2 = FRAME(255, 70) TEXT(frame2, "Postion") ATTACH(tabs, frame2, 5, 5)
mark1 = MARK("X:", 25, 25) ATTACH(tabs, mark1, 20, 35) spin_x_pos = SPIN(50, 30, 0, gui_x_pos + gui_x_size, 1) ATTACH(tabs, spin_x_pos, 50, 30) CALLBACK(spin_x_pos, Move_widget)
mark2 = MARK("Y:", 25, 25) ATTACH(tabs, mark2, 140, 35) spin_y_pos = SPIN(50, 30, 0, gui_y_pos + gui_y_size, 1) ATTACH(tabs, spin_y_pos, 170, 30) CALLBACK(spin_y_pos, Move_widget)
' Size frame3 = FRAME(255, 70) TEXT(frame3, "Size") ATTACH(tabs, frame3, 5, 85)
mark3 = MARK("To be continued....", 150, 25) ATTACH(tabs, mark3, 50, 115)
' Set the notebook to display first tab SET(tabs, 0)
DISPLAY
|
|
|
Post by bigbass on May 29, 2012 22:37:54 GMT 1
mobeusreplace leading spaces with tabs *just cleaned up my example had some stray spaces I forgot too having fun! we have a great group of people interested in this project a great start ----------------------------------------------------------------------------- also alexfish your hugdemo now compiles and works on my box ----------------------------------------------------------------------------- @ 2lss looking good with your new improvements ---------------------------------------------------------------------------- @ vovchik thanks for the hundreds of things you added it will take me months to learn all the great code examples you did for BaCon / HUG ....if I could only learn faster Joe
|
|
|
Post by alexfish on May 29, 2012 23:40:05 GMT 1
Hi ALL As part of this project here is an idea , "HUG Executor" Remember the short hand file loader This can also be used as the executor for the rad tool I have left the two files more or less as is with exception of argv to load a project file,but not complete in as far as the working widget , so left as is , but can edit the variables within the test-file.bac . work is still in progress This type of tool will save repetitive compiling , Think about it The file load and executor is as they say , work in progress Feel free to comment , I need your feed bac , as in back ADDED: this is a response to and quote: "The suggestion of fragadelic, e.g. using a plain canvas for it all, could solve a lot of these issues. But it will remain a lot of work nevertheless. Also drawing on a canvas does not really show how the resulting GUI will look like. I don't see how a 'preview without compilation' can be achieved". Regards alexfish Attachments:
|
|
2lss
Full Member
Posts: 140
|
Post by 2lss on May 30, 2012 2:17:27 GMT 1
Guys,
I merged my latest code with mobeus's latest. I changed the structure around a bit for my own understanding/sanity ;D.
mobeus: Do you know of a way to change the background of the layout area? (i.e. the gtk_layout)
I will probably try adding the nice icon buttons posted by alexfish next.
I'm also thinking about adding a 'canvas' layout with bigbass's code.
INCLUDE "hug.bac"
CONST gtk$ = HUGLIB$("gtk") CONST gob$ = HUGLIB$("gobject") GLOBAL active_widget, X, rad_layout_container DECLARE widget_name$ ASSOC STRING DECLARE widget_x_pos ASSOC NUMBER DECLARE widget_y_pos ASSOC NUMBER DECLARE widget_x_size ASSOC NUMBER DECLARE widget_y_size ASSOC NUMBER
' Import GTK functions IMPORT "gtk_button_clicked(long)" FROM gtk$ TYPE void IMPORT "gtk_button_set_image(long,long)" FROM gtk$ TYPE void IMPORT "gtk_fixed_move(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_fixed_new" FROM gtk$ TYPE long IMPORT "gtk_widget_set_size_request(long,int,int)" FROM gtk$ TYPE void
IMPORT "gtk_vbox_new(int,int)" FROM gtk$ TYPE long IMPORT "gtk_hbox_new(int,int)" FROM gtk$ TYPE long
IMPORT "gtk_hpaned_new()" FROM gtk$ TYPE long IMPORT "gtk_paned_pack1(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_paned_pack2(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_paned_set_position(long,int)" FROM gtk$ TYPE void
IMPORT "gtk_box_pack_start(long,long,int,int,int)" FROM gtk$ TYPE void
IMPORT "gtk_layout_new()" FROM gtk$ TYPE long IMPORT "gtk_layout_set_size(long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_layout_put(long,long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_layout_move(long,long,int,int)" FROM gtk$ TYPE void
IMPORT "gtk_scrolled_window_new(long,long)" FROM gtk$ TYPE long IMPORT "gtk_scrolled_window_set_policy(long,int,int)" FROM gtk$ TYPE void IMPORT "gtk_scrolled_window_set_shadow_type(long,int)" FROM gtk$ TYPE void
IMPORT "gtk_menu_bar_new" FROM gtk$ TYPE long IMPORT "gtk_menu_item_new" FROM gtk$ TYPE long IMPORT "gtk_menu_item_new_with_mnemonic(char*)" FROM gtk$ TYPE long IMPORT "gtk_menu_item_new_with_label(char*)" FROM gtk$ TYPE long IMPORT "gtk_menu_item_set_submenu(long,long)" FROM gtk$ TYPE void IMPORT "gtk_menu_new" FROM gtk$ TYPE long IMPORT "gtk_menu_shell_append(long,long)" FROM gtk$ TYPE void IMPORT "gtk_menu_item_set_submenu(long,long)" FROM gtk$ TYPE void
' Import GOBJECT functions IMPORT "g_signal_connect_object(long,char*,void*,long,int)" FROM gob$ TYPE long IMPORT "g_signal_handler_block(long,long)" FROM gob$ TYPE void IMPORT "g_signal_handler_unblock(long,long)" FROM gob$ TYPE void
SUB fixed_layout () ' Scrollew window for layout rw_scrolled = gtk_scrolled_window_new(0, 0) gtk_scrolled_window_set_policy(rw_scrolled, 1, 1) gtk_scrolled_window_set_shadow_type(rw_scrolled, 3) rad_layout_container = gtk_layout_new(0,0) gtk_layout_set_size(rad_layout_container, 1440, 900) gtk_container_add(rw_scrolled, rad_layout_container) gtk_paned_pack2 (rw_panemain, rw_scrolled, TRUE, TRUE)
' Show everything on newwin gtk_widget_show_all(newwin)
' Grey-out layout button DISABLE(fixed_layout_button) END SUB
' Add a button to gui builder and save x/y coordinates in associative arrays SUB Add_button_widget() INCR X ENABLE(tabs) button_widget = BUTTON(CONCAT$("Button ", STR$(X)), 80, 30) ' ATTACH(fixed_container, button_widget, 5, 15) gtk_layout_put(rad_layout_container, button_widget, 5, 15) widget_name$(STR$(button_widget)) = CONCAT$("Button ", STR$(X)) widget_x_pos(STR$(button_widget)) = 5 widget_y_pos(STR$(button_widget)) = 15 widget_x_size(STR$(button_widget)) = 80 widget_y_size(STR$(button_widget)) = 30 CALLBACK(button_widget, Register_properties) gtk_button_clicked(button_widget) FOCUS(button_widget) END SUB
' Bring up the Properties tab when the widget is clicked and set position in spin buttons SUB Register_properties(NUMBER widget) active_widget = widget SET(tabs, 1) g_signal_handler_block(spin_x_pos, x_pos_handler) g_signal_handler_block(spin_y_pos, y_pos_handler) g_signal_handler_block(spin_x_size, x_size_handler) g_signal_handler_block(spin_y_size, y_size_handler) TEXT(entry1, widget_name$(STR$(widget))) SET(spin_x_pos, widget_x_pos(STR$(widget))) SET(spin_y_pos, widget_y_pos(STR$(widget))) SET(spin_x_size, widget_x_size(STR$(widget))) SET(spin_y_size, widget_y_size(STR$(widget))) g_signal_handler_unblock(spin_x_pos, x_pos_handler) g_signal_handler_unblock(spin_y_pos, y_pos_handler) g_signal_handler_unblock(spin_x_size, x_size_handler) g_signal_handler_unblock(spin_y_size, y_size_handler) END SUB
' When text is entered into ENTRY, changet the text on widget SUB Change_text(NUMBER widget) widget_name$(STR$(active_widget)) = GRAB$(entry1) ' gtk_label_set_text(active_widget, GRAB$(entry1)) TEXT(active_widget, GRAB$(entry1)) END SUB
' When the X or Y position spin button is changed move the widget SUB Move_widget(NUMBER widget) widget_x_pos(STR$(active_widget)) = GET(spin_x_pos) widget_y_pos(STR$(active_widget)) = GET(spin_y_pos) gtk_layout_move(rad_layout_container, active_widget, GET(spin_x_pos), GET(spin_y_pos)) END SUB
' When the X or Y size spin button is changed resize the widget SUB Resize_widget(NUMBER widget) widget_x_size(STR$(active_widget)) = GET(spin_x_size) widget_y_size(STR$(active_widget)) = GET(spin_y_size) gtk_widget_set_size_request(active_widget, GET(spin_x_size), GET(spin_y_size)) END SUB
INIT
' Size of window hug_xsize = 700 hug_ysize = 450 ' Position of the gui builder gui_x_pos = 280 gui_y_pos = 5 ' Size of the gui builder gui_x_size = 315 gui_y_size = 440
' Create main window newwin = gtk_window_new(GTK_WINDOW_TOPLEVEL) gtk_window_set_title(newwin, "BaCon RAD") gtk_window_set_position(newwin, GTK_WIN_POS_CENTER) g_signal_connect_data(newwin, "delete-event", exit, 0, 0, 0) g_signal_connect_data(newwin, "key-press-event", hug_key_press, 0, 0, 0)
' Setup vbox MAIN CONTAINER rw_vboxmain = gtk_vbox_new(0, 0) gtk_container_add(newwin, rw_vboxmain)
' Create menubar rw_menubar = gtk_menu_bar_new()
' Create FILE submenu fmenu = gtk_menu_new() file_menu = gtk_menu_item_new_with_mnemonic("_Open...") save_menu = gtk_menu_item_new_with_mnemonic("_Save") saveas_menu = gtk_menu_item_new_with_mnemonic("S_ave as...") sep15 = gtk_menu_item_new() new_menu = gtk_menu_item_new_with_mnemonic("_New") sep5 = gtk_menu_item_new() exit_menu = gtk_menu_item_new_with_mnemonic("_Exit") gtk_menu_shell_append(fmenu, file_menu) gtk_menu_shell_append(fmenu, save_menu) gtk_menu_shell_append(fmenu, saveas_menu) gtk_menu_shell_append(fmenu, sep5) gtk_menu_shell_append(fmenu, exit_menu) fmenu_item = gtk_menu_item_new_with_mnemonic("_File") gtk_menu_item_set_submenu(fmenu_item, fmenu) gtk_menu_shell_append(rw_menubar, fmenu_item) gtk_box_pack_start(rw_vboxmain, rw_menubar, 0, 0, 0)
' Create widget pallet rw_panemain = gtk_hpaned_new () gtk_paned_set_position(rw_panemain, 320) rad_pallet_container = gtk_fixed_new(0, 0) gtk_paned_pack1 (rw_panemain, rad_pallet_container, FALSE, TRUE) gtk_box_pack_start(rw_vboxmain, rw_panemain, 1, 1, 2)
' Create Widgets tab--------- tabs = NOTEBOOK("Widgets", 270, 440) gtk_container_add(rad_pallet_container, tabs)
' Select Layout Frame frame0 = FRAME(255, 60) TEXT(frame0, "Select Layout") ATTACH(tabs, frame0, 5, 5)
' GTK Fixed Layout button fixed_layout_button = BUTTON("Fixed", 70, 30) ATTACH(tabs, fixed_layout_button, 40, 30) CALLBACK(fixed_layout_button, fixed_layout)
' GL Canvas Layout button canvas_layout_button = BUTTON("Canvas", 70, 30) ATTACH(tabs, canvas_layout_button, 150, 30) 'CALLBACK(canvas_layout_button, canvas_layout)
frame1 = FRAME(255, 330) TEXT(frame1, "Click to add to GUI") ATTACH(tabs, frame1, 5, 75)
widget_button = BUTTON("Button", 60, 30) ATTACH(tabs, widget_button, 10, 100) CALLBACK(widget_button, Add_button_widget)
' Create Properties tab ------ TEXT(tabs, "Properties")
' Widget Text Frame frame2 = FRAME(255, 60) TEXT(frame2, "Widget Text") ATTACH(tabs, frame2, 5, 5)
entry1 = ENTRY("", 245, 25) ATTACH(tabs, entry1, 10, 30) CALLBACK(entry1, Change_text)
' Widget Position frame3 = FRAME(255, 70) TEXT(frame3, "Postion") ATTACH(tabs, frame3, 5, 75)
mark1 = MARK("X:", 25, 25) ATTACH(tabs, mark1, 20, 105) spin_x_pos = SPIN(50, 30, 0, gui_x_pos + gui_x_size, 1) ATTACH(tabs, spin_x_pos, 50, 100) x_pos_handler = g_signal_connect_object(spin_x_pos, "value-changed", Move_widget, 0, 0)
mark2 = MARK("Y:", 25, 25) ATTACH(tabs, mark2, 140, 105) spin_y_pos = SPIN(50, 30, 0, gui_y_pos + gui_y_size, 1) ATTACH(tabs, spin_y_pos, 170, 100) y_pos_handler = g_signal_connect_object(spin_y_pos, "value-changed", Move_widget, 0, 0)
' Widget Size frame4 = FRAME(255, 70) TEXT(frame4, "Size") ATTACH(tabs, frame4, 5, 155)
mark3 = MARK("X:", 25, 25) ATTACH(tabs, mark3, 20, 185) spin_x_size = SPIN(50, 30, 0, gui_x_pos + gui_x_size, 1) ATTACH(tabs, spin_x_size, 50, 185) x_size_handler = g_signal_connect_object(spin_x_size, "value-changed", Resize_widget, 0, 0)
mark4 = MARK("Y:", 25, 25) ATTACH(tabs, mark4, 140, 185) spin_y_size = SPIN(50, 30, 0, gui_y_pos + gui_y_size, 1) ATTACH(tabs, spin_y_size, 170, 185) y_size_handler = g_signal_connect_object(spin_y_size, "value-changed", Resize_widget, 0, 0)
' Set the notebook to display first tab SET(tabs, 0)
gtk_widget_set_size_request(newwin, INT(hug_xsize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR), INT(hug_ysize*HUG_FONT_SIZE_FACTOR*HUG_XFT_SIZE_FACTOR)) IF HUG_WIDGET_SHOW THEN gtk_widget_show_all(newwin)
DISPLAY
|
|
|
Post by alexfish on May 30, 2012 3:39:31 GMT 1
|
|
|
Post by vovchik on May 30, 2012 6:33:32 GMT 1
Dear axelfish,
The links may confuse - since that is GTK1.x and we are using gtk2.x. Some examples might be OK, though and require little modification.
With kind regards, vovchik
|
|
|
Post by alexfish on May 30, 2012 7:54:04 GMT 1
have done compile of some of the code , seems to be ok at present can't find all code of 1.2 in the gtk2+ tutorial , or at least can't find it through the devhelper , also may be of interest of arm platform , re likes of debian arm have updated with a link to a gtk2 tut and tips regards alexfish
|
|
|
Post by alexfish on May 30, 2012 9:06:46 GMT 1
Hi Guys, Before you go much further you may want to consider the end product. Do you think the user should be able to take advantage of their screen real estate with a resizeable GUI and scrollable layout area? Can achieve this with HUG , start window something like INCLUDE "hug.bac" HUGOPTIONS("TABLE 1 1") INIT
window = WINDOW("Real Estate Window", 600, 400) NoteBook=NOTEBOOK("NoteBook", 1, 1) ATTACH(window,NoteBook,0,0) DISPLAY ADDED More Real Estate INCLUDE "hug.bac" INCLUDE "StatusBar.bac" HUGOPTIONS("TABLE 1 1") INIT
window = WINDOW("Real Estate Window", 600, 400) NoteBook=NOTEBOOK("NoteBook", 1,23) ATTACH(window,NoteBook,0,0) status = STATUSBAR(1, 1) ATTACH(window, status,0, 23) TEXT(status, "Hello world! This is a statusbar.") DISPLAY
Can Look here for Status Bar basic-converter.proboards.com/index.cgi?board=codeNice Work Can also try the Hug-Executor -- pre-demo ,, posted above ,, no need to keep recompiling ADDED SOME MORE:: but will need to adjust hard coded include files etc / notice the Edit box to the right , ' coded by AlexFish ' SET hard coded includes + hardcoded link /your/pings/*png' INCLUDE "/home/alexfish/bacon/lib/hug.bac"
' Get our self-defined widgets INCLUDE "/home/alexfish/bacon/lib/StatusBar.bac" HUGOPTIONS("CANVAS GL") 'HUGOPTIONS("CANVAS GTK") HUGOPTIONS("GL_FREEZE 1") NewHorz$=STR$(SCREENSIZE(0)) NewVert$=STR$(SCREENSIZE(1)) PRINT NewHorz$ PRINT NewVert$ HUGOPTIONS("TABLE 80 20") HUGOPTIONS("NOSCALING") ' Create window win_main = 0 M = 0 '@ SetVseparator SUB SetVseparator IF win_main = 1 THEN Vsep2=VSEPARATOR(20) ATTACH(Win_Main,Vsep2,3,0) HIDE(Win_Main) SHOW(Win_Main) END IF END SUB SUB New_Project IF win_main = 0 THEN HugTableNew$=CONCAT$("TABLE",NewHorz$,NewVert$) HUGOPTIONS("TABLE 0 0") Win_Main=WINDOW("Main Form",600,400) SHOW(Win_Main)
win_main = 1 END IF END SUB SUB Hide_Form IF win_main = 1 THEN HIDE(Win_Main) END IF END SUB SUB Show_Form IF win_main = 1 THEN SHOW(Win_Main) END IF END SUB
SUB SetMark IF win_main = 1 THEN mark2=MARK("Mark",1,1) ATTACH(Win_Main,mark2,0,0) HIDE(Win_Main) SHOW(Win_Main) END IF END SUB
SUB SetButton IF win_main = 1 THEN but2=BUTTON("OK",1,1) ATTACH(Win_Main,but2,1,0) HIDE(Win_Main) SHOW(Win_Main) END IF END SUB
SUB SetFrame IF win_main = 1 THEN frame2=FRAME(1,1) ATTACH(Win_Main,frame2,2,0) HIDE(Win_Main) SHOW(Win_Main) END IF END SUB win = WINDOW("hug rad", 600, 400) 'SET(win,1) ' Create statusbar ' status = STATUSBAR(80, 1) ' ATTACH(win, status, 0, 20) topframe=FRAME(80,1) ATTACH(win,topframe,0,0) ProjectFrame=FRAME(50,14) ATTACH(win,ProjectFrame,14,1) TEXT(ProjectFrame,"View Port")
widgetframe=FRAME(13,19) ATTACH(win,widgetframe,1,1) TEXT(widgetframe,"Widgets") '@ MARK("caption", xsize, ysize) Mark=IMAGE("/home/alexfish/bacon/pings/Mark.png",2,1) ATTACH(win,Mark,2,2) PROPERTY(Mark, "tooltip-text", "MARK(<caption>, xsize, ysize)") '@ BUTTON("caption", xsize, ysize) Button=IMAGE("/home/alexfish/bacon/pings/Button.png",2,1) ATTACH(win,Button,6,2) PROPERTY(Button, "tooltip-text", "BUTTON(<caption>, xsize, ysize)")
'@ FRAME(xsize, ysize) Frame=IMAGE("/home/alexfish/bacon/pings/Frame.png",2,1) ATTACH(win,Frame,10,2) PROPERTY(Frame, "tooltip-text", "FRAME(xsize, ysize)")
'@ Notebook Notebook=IMAGE("/home/alexfish/bacon/pings/Notebook.png",2,1) ATTACH(win,Notebook,2,3) PROPERTY(Notebook, "tooltip-text", "NOTEBOOK(<caption>, xsize, ysize)")
'@ Entry DONE Entry=IMAGE("/home/alexfish/bacon/pings/Entry.png",2,1) ATTACH(win,Entry,6,3) PROPERTY(Entry, "tooltip-text", "ENTRY(<text>, xsize, ysize)")
'@ Password DONE Password=IMAGE("/home/alexfish/bacon/pings/Password.png",2,1) ATTACH(win,Password,10,3) PROPERTY(Password, "tooltip-text", "PASSWORD(<text>, xsize, ysize)")
'@ Hseparator Hseparator=IMAGE("/home/alexfish/bacon/pings/Hseparator.png",2,1) ATTACH(win,Hseparator,2,4) PROPERTY(Hseparator, "tooltip-text", "Hseparator(Xsize)")
'@ Vseparator Vseparator=IMAGE("/home/alexfish/bacon/pings/Vseparator.png",2,1) ATTACH(win,Vseparator,8,4) PROPERTY(Vseparator, "tooltip-text", "Vseparator(Ysize)")
'@ Edit Edit=IMAGE("/home/alexfish/bacon/pings/Edit.png",2,1) ATTACH(win,Edit,2,5) PROPERTY(Edit, "tooltip-text", "EDIT(xsize, ysize)") '@ Combo Combo=IMAGE("/home/alexfish/bacon/pings/Combo.png",2,1) ATTACH(win,Combo,6,5) PROPERTY(Combo, "tooltip-text", "COMBO(<text>, xsize, ysize)")
'@ Image Image=IMAGE("/home/alexfish/bacon/pings/Image.png",2,1) ATTACH(win,Image,2,6) PROPERTY(Image, "tooltip-text", "IMAGE(<file>, xsize, ysize)") '@ Canvas Canvas=IMAGE("/home/alexfish/bacon/pings/Canvas.png",2,1) ATTACH(win,Canvas,6,6) PROPERTY(Canvas, "tooltip-text", "CANVAS(xsize, ysize)")
'@ Toggle Toggle=IMAGE("/home/alexfish/bacon/pings/Button.png",2,1) ATTACH(win,Toggle,2,7) PROPERTY(Toggle, "tooltip-text", "TOGGLE(<caption>, xsize, ysize)") '@ Check Check=IMAGE("/home/alexfish/bacon/pings/Check.png",2,1) ATTACH(win,Check,6,7) PROPERTY(Check, "tooltip-text", "CHECK(<caption>, xsize, ysize)") '@ Radio Radio=IMAGE("/home/alexfish/bacon/pings/Radio.png",2,1) ATTACH(win,Radio,10,7) PROPERTY(Radio, "tooltip-text", "RADIO(<caption>, xsize, ysize, group)")
'@ Spin Spin=IMAGE("/home/alexfish/bacon/pings/Spin.png",2,1) ATTACH(win,Spin,2,8) PROPERTY(Spin, "tooltip-text", "SPIN(xsize, ysize, start, end, step)") '@ Progressbar Progressbar=IMAGE("/home/alexfish/bacon/pings/Progressbar.png",2,1) ATTACH(win,Progressbar,6,8) PROPERTY(Progressbar, "tooltip-text", "PROGRESSBAR(<caption>, xsize, ysize)")
'@ Hslider Hslider=IMAGE("/home/alexfish/bacon/pings/Hslider.png",2,1) ATTACH(win,Hslider,2,7) PROPERTY(Hslider, "tooltip-text", "HSLIDER(xsize, ysize, begin, end, step)")
'@ Vslider Vslider=IMAGE("/home/alexfish/bacon/pings/Vslider.png",2,1) ATTACH(win,Vslider,6,7) PROPERTY(Vslider, "tooltip-text", "VSLIDER(xsize, ysize, begin, end, step)")
'@ Stock Stock=COMBO("Stock Buttons",11,1) ATTACH(win,Stock,2,9) PROPERTY(Stock, "tooltip-text", "STOCK(<stock-id>, xsize, ysize)") 'MainCanvas=CANVAS(48,13) 'ATTACH(win,MainCanvas,12,1) '@ PICTURE("file", xposition, yposition, xsize, ysize 'img=IMAGE("/home/alexfish/bacon/pings/screen1.png",48,13) 'ATTACH(win,img,12,1) 'vslider=VSLIDER(2, 13, 1, 80, .05) 'ATTACH(win, vslider,10, 1) 'hslider=HSLIDER(49, 1, 1, 80, .05) 'ATTACH(win, hslider,14, 14) but1=BUTTON("New_form",4,1) ATTACH(win,but1,65,1) but2=BUTTON("Show-form",4,1) ATTACH(win,but2,70,1) but3=BUTTON("Hide-form",4,1) ATTACH(win,but3,75,1) Ed=EDIT(15,10) ATTACH(win,Ed,65,3) ' HAVE SHOWN HOW TO DO IN PREVIOUS ' Set a text in the new statusbar 'TEXT(status, "Hello world! This is a statusbar.")
CALLBACK(but1,New_Project) CALLBACK(but2,Show_Form) CALLBACK(but3,Hide_Form) '@ Mark CALLBACK(Mark,SetMark) '@ SetButton CALLBACK(Button,SetButton) '@ Frame CALLBACK(Frame,SetFrame) '@ Hseparator CALLBACK(Vseparator,SetVseparator) 'TEXT(toolbar, "Hello world! This is a toolbar.") 'SET(win,1) ' Endless GTK loop DISPLAY have fun , and regards alexfish
|
|
|
Post by vovchik on May 30, 2012 14:05:16 GMT 1
Dear guys, This might be useful. I changed the IMPORT definition and now can grab the mouse x:y in a non-canvas widget. I am certain set will also work. But will it screw up anything else? And, the X:Y values seem to be dependent on screen resolution, as I note some disagreement between the real/requested max widget values and the displayed size. Though there is some login to it, so the returned values might have have to be massaged by a DPI or screen res factor. With kind regards, vovchik INCLUDE "hug.bac" INIT ' Changed IMPORT types 'IMPORT "gtk_widget_get_pointer(long,int*,int*)" FROM "libgtk-x11-2.0.so" TYPE void IMPORT "gtk_widget_get_pointer(long,long,long)" FROM "libgtk-x11-2.0.so" TYPE void
' callback
SUB GETMOUSE() gtk_widget_get_pointer(but, ADDRESS(x), ADDRESS(y)) PRINT x, ":", y TEXT(coordinates, CONCAT$("Coordinates (x:y): ", STR$(x), ":", STR$(y))) END SUB
' main
DECLARE x, y window = WINDOW("X-Y test", 200, 200) but = BUTTON("Press me", 100,100) coordinates = MARK("Coordinates (x:y)", 200, 30) ATTACH(window, but, 50, 50) ATTACH(window, coordinates, 0, 165) CALLBACK(but, GETMOUSE) DISPLAY
|
|
|
Post by vovchik on May 30, 2012 14:48:23 GMT 1
Dear guys, Solved the DPI/coordinate values problem. This seems to do the trick. stackoverflow.com/questions/417384/get-dpi-settings-via-gtkWith kind regards, vovchik INCLUDE "hug.bac" INIT ' Changed IMPORT types 'IMPORT "gtk_widget_get_pointer(long,int*,int*)" FROM "libgtk-x11-2.0.so" TYPE void IMPORT "gtk_widget_get_pointer(long,long,long)" FROM "libgtk-x11-2.0.so" TYPE void ' Get DPI IMPORT "gdk_screen_get_default" FROM "libgdk-x11-2.0.so" TYPE long IMPORT "gdk_screen_get_resolution(long)" FROM "libgdk-x11-2.0.so" TYPE double
SUB GETMOUSE() LOCAL fixed_x, fixed_y TYPE NUMBER gtk_widget_get_pointer(but, ADDRESS(x), ADDRESS(y)) fixed_x = x * factor fixed_y = y * factor PRINT fixed_x, ":", fixed_y TEXT(coordinates, CONCAT$("Coordinates (x:y): ", STR$(fixed_x), ":", STR$(fixed_y))) END SUB
DECLARE x, y DECLARE factor TYPE FLOATING screen = gdk_screen_get_default() dpi = gdk_screen_get_resolution(screen) factor = (float)dpi/100 PRINT "DPI: ", dpi window = WINDOW("X-Y test", 200, 200) but = BUTTON("Press me", 100,100) coordinates = MARK("Coordinates (x:y)", 200, 30) ATTACH(window, but, 50, 50) ATTACH(window, coordinates, 0, 165) CALLBACK(but, GETMOUSE) DISPLAY
|
|
mobeus
Junior Member
Posts: 86
|
Post by mobeus on May 30, 2012 16:30:31 GMT 1
Hi Guys,
I would like this to be my contribution to the project.
I am building a generic blank RAD builder window that looks and functions similar to the Glade window. The window is resizeable, the left pane will be suitable for buttons and images (the pallet), the center pane for the layout, and the right pane suitable for editing widgets & settings. The right pane will be able to be hidden and shown at will. The left and right panes will contain a GtkFixed so HUG ATTACH should work with them.
To use it in your RAD project all that will be needed in your code is the IMPORTs, an INCLUDE, and few variables. To create the RAD GUI will just take a single function call, then you can populate it as desired. Just like HUG. I can go ahead and supply the File menu and a toolbar if you all wish. You would have to supply the callback functions for these.
@ 2lss, please hold off on incorporating my previous paned window code. There are gtk issues when putting widgets in the left pane. If you haven’t noticed already, expose the spin buttons on tab 2 and drag the pane slider to the left. Other widgets have the same problem. Sorry, I don’t know how to set a background on the layout yet.
Regards, Mobeus
|
|