#include #include #include #include "callback.h" #include "automaton.h" #include "display.h" #include "tree.h" #include "texts.h" // https://blog.gtk.org/2020/09/08/on-list-models/ < TODO // https://docs.gtk.org/gtk4/visual_index.html < widgets gallery GtkFrame *get_frame_with_label(){ // EN ATTENDANT DE SAVOIR UTILISER : GtkTextTagTable , GtkTextBuffer GtkFrame *space_specif = GTK_FRAME(gtk_frame_new ("Space (run / edit) specifications")); GtkWidget *any_Label = GTK_WIDGET (gtk_label_new (get_space_run_edit_specif())); gtk_frame_set_child (GTK_FRAME (space_specif), GTK_WIDGET (any_Label)); return space_specif; } GtkWidget *get_edit_rules_page_new(){ GtkPaned *hpaned = GTK_PANED (gtk_paned_new (GTK_ORIENTATION_HORIZONTAL)); GtkWidget *arbre_des_règles = gtk_frame_new ("Arbre des règles"); GtkWidget *édition_de_la_règle_sélectionnée = gtk_frame_new ("Édition de la règle sélectionnée"); gtk_paned_set_start_child (hpaned, GTK_WIDGET (arbre_des_règles)); gtk_paned_set_end_child (hpaned, GTK_WIDGET (édition_de_la_règle_sélectionnée)); // gtk_widget_set_size_request (GTK_WIDGET (hpaned), W, H); gtk_paned_set_wide_handle (hpaned, TRUE); return GTK_WIDGET (hpaned); } GtkWidget *get_edit_measures_page_new(){ GtkWidget *measures_grid = gtk_grid_new(); return measures_grid; } GtkWidget *get_edit_results_page_new(){ GtkWidget *xxx_grid = gtk_grid_new(); return xxx_grid; } GtkWidget *get_edit_discuss_page_new(){ GtkWidget *xxx_grid = gtk_grid_new(); return xxx_grid; } GtkWidget *get_edit_help_page_new(){ GtkWidget *edit_help_grid = gtk_grid_new(); gtk_grid_attach (GTK_GRID(edit_help_grid), GTK_WIDGET(get_frame_with_label()), 0, 0, 1, 1); return edit_help_grid; } GtkWidget *get_measures_page_new(){ GtkWidget *measures_grid = gtk_grid_new(); gtk_grid_attach (GTK_GRID (measures_grid), gtk_button_new_with_label ("movements"), 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (measures_grid), gtk_button_new_with_label ("transports"), 1, 0, 1, 1); gtk_grid_attach (GTK_GRID (measures_grid), gtk_button_new_with_label ("transformations"), 2, 0, 1, 1); gtk_grid_attach (GTK_GRID (measures_grid), gtk_button_new_with_label ("objects"), 0, 1, 1, 1); gtk_grid_attach (GTK_GRID (measures_grid), gtk_button_new_with_label ("situations"), 1, 1, 1, 1); return measures_grid; } GtkWidget *get_results_page_new(){ GtkWidget *results_grid = gtk_grid_new(); gtk_grid_attach (GTK_GRID(results_grid), gtk_button_new_with_label ("Repartitions"), 0, 0, 1, 1); gtk_grid_attach (GTK_GRID(results_grid), gtk_button_new_with_label ("Correlations"), 0, 1, 1, 1); gtk_grid_attach (GTK_GRID(results_grid), gtk_button_new_with_label ("Evolutions"), 0, 2, 1, 1); return results_grid; } GtkWidget *get_discuss_page_new(){ GtkWidget *discuss_grid = gtk_grid_new(); gtk_grid_attach (GTK_GRID (discuss_grid), gtk_button_new_with_label ("Interpretations"), 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (discuss_grid), gtk_button_new_with_label ("Discussions"), 0, 1, 1, 1); return discuss_grid; } GtkWidget *get_help_page_new(){ GtkWidget *run_help_grid = gtk_grid_new(); gtk_grid_attach (GTK_GRID(run_help_grid), GTK_WIDGET(get_frame_with_label()), 0, 0, 1, 1); return run_help_grid; } GtkWidget *get_edit_space_page_new(){ GtkWidget *space_grid = gtk_grid_new(); gtk_grid_attach (GTK_GRID(space_grid), get_image_ALL_SPACE(), 0, 0, 1, 3); gtk_grid_attach (GTK_GRID(space_grid), get_OBJECTS_and_SITUATIONS(), 0, 4, 1, 1); gtk_grid_attach (GTK_GRID(space_grid), GTK_WIDGET (get_XYZ_box()), 1, 0, 1, 2); gtk_grid_attach (GTK_GRID(space_grid), GTK_WIDGET (get_ZOOM_box()), 1, 2, 1, 2); gtk_grid_attach (GTK_GRID(space_grid), GTK_WIDGET (get_edit_TOOL_box()), 1, 3, 1, 2); gtk_widget_set_size_request (space_grid, W, H); return space_grid; } //------------------------------------------------------------------------------ GtkWidget *get_selected_rules_vpaned_new(){ GtkPaned *V_selected_1_vs_2 = GTK_PANED (gtk_paned_new (GTK_ORIENTATION_VERTICAL)); GtkBox *up_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2)); gtk_box_append (up_box, GTK_WIDGET (get_image_GLUTAMATE())); gtk_box_append (up_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_VERTICAL))); gtk_box_append (up_box, GTK_WIDGET (get_image_GLUTAMINE())); GtkBox *bottom_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2)); gtk_box_append (bottom_box, GTK_WIDGET (get_image_ATP())); gtk_box_append (bottom_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_VERTICAL))); gtk_box_append (bottom_box, GTK_WIDGET (get_image_AMP())); gtk_paned_set_start_child (V_selected_1_vs_2, GTK_WIDGET (up_box)); gtk_paned_set_end_child (V_selected_1_vs_2, GTK_WIDGET (bottom_box)); return GTK_WIDGET (V_selected_1_vs_2); } GtkWidget *get_TIME_EXEC_controls_box(){ GtkBox *top_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2)); gtk_box_append (top_box, GTK_WIDGET (get_ELAPSED_TIME_ProgressBar())); gtk_box_append (top_box, GTK_WIDGET(gtk_separator_new (GTK_ORIENTATION_VERTICAL))); gtk_box_append (top_box, GTK_WIDGET (get_RUN_STOP_box())); return GTK_WIDGET (top_box); } GtkWidget *get_SPACE_VIEW_box(){ GtkBox *right_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 2)); gtk_box_append (right_box, GTK_WIDGET (get_XYZ_box())); gtk_box_append (right_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (right_box, GTK_WIDGET (get_ZOOM_box())); GtkBox *middle_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2)); gtk_box_append (middle_box, GTK_WIDGET (get_image_ALL_SPACE())); ////////////////////////// gtk_box_append (middle_box, GTK_WIDGET (get_GLArea())); gtk_box_append (middle_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_VERTICAL))); gtk_box_append (middle_box, GTK_WIDGET (right_box)); return GTK_WIDGET (middle_box); } GtkWidget *get_SPACE_EDIT_controls_box() { GtkWidget *label_ad_hoc = gtk_label_new ("_____________\n\ SPACE EDIT\n controls\n_____________"); return GTK_WIDGET (label_ad_hoc); } GtkWidget *get_STATE_VIEW_box(){ GtkBox *space_view_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 2)); gtk_box_append (space_view_box, GTK_WIDGET (get_OBJECTS_and_SITUATIONS())); gtk_box_append (space_view_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (space_view_box, GTK_WIDGET (get_SPACE_VIEW_box())); gtk_box_append (space_view_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (space_view_box, GTK_WIDGET (get_TIME_EXEC_controls_box())); return GTK_WIDGET (space_view_box); } void window_main_child_bottom (GtkBox *page_box){ // gtk_box_append (page_box, GTK_WIDGET (get_TIME_EXEC_controls_box())); // gtk_box_append (page_box, GTK_WIDGET (get_SPACE_EDIT_controls_box())); } // static void icons_for_fun (GtkHeaderBar *header_bar); void window_header_bar (GtkWindow *main_window, char *title){ GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ()); gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header_bar), gtk_label_new (title)); gtk_window_set_titlebar (main_window, header_bar); GtkButton *btt_XOR_EXEC_EDIT = GTK_BUTTON (gtk_toggle_button_new ()); gtk_button_set_icon_name (btt_XOR_EXEC_EDIT, "system-run-symbolic"); gtk_button_set_icon_name (btt_XOR_EXEC_EDIT, "power-profile-performance-symbolic"); g_signal_connect (btt_XOR_EXEC_EDIT, "clicked", G_CALLBACK (on_toggle_EXEC_EDIT), NULL); GtkWidget *any_Label = GTK_WIDGET (gtk_label_new (" | ")); // https://docs.gtk.org/gtk4/class.Stack.html GtkWidget *a_switcher = gtk_stack_switcher_new (); GtkWidget *a_stack = gtk_stack_new (); GtkStackPage* stack_child_space = gtk_stack_add_child (GTK_STACK (a_stack), GTK_WIDGET (get_STATE_VIEW_box())); GtkStackPage* stack_child_rules = gtk_stack_add_child (GTK_STACK (a_stack), GTK_WIDGET (get_edit_rules_page_new())); GtkStackPage* stack_child_data = gtk_stack_add_child (GTK_STACK (a_stack), GTK_WIDGET (get_measures_page_new())); gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (a_switcher), GTK_STACK (a_stack)); gtk_stack_add_titled (GTK_STACK (a_stack), GTK_WIDGET (get_STATE_VIEW_box()), "a_name", "space"); gtk_stack_add_titled (GTK_STACK (a_stack), GTK_WIDGET (get_edit_rules_page_new()), "another_name", "rules"); gtk_stack_add_titled (GTK_STACK (a_stack), GTK_WIDGET (get_measures_page_new()), "a_third_name", "data analysis"); // gtk_stack_page_set_visible (*self, TRUE); // gtk_window_set_child (main_window, GTK_WIDGET (gtk_stack_get_visible_child (GTK_STACK (a_stack)))); gtk_stack_set_visible_child (GTK_STACK (a_stack), GTK_WIDGET (get_STATE_VIEW_box())); gtk_stack_set_visible_child (GTK_STACK (a_stack), GTK_WIDGET (get_edit_rules_page_new())); gtk_widget_set_visible (GTK_WIDGET (get_edit_rules_page_new()), TRUE); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (btt_XOR_EXEC_EDIT)); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (any_Label)); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (a_switcher)); } void window_main_child (GtkWindow *main_window, int selected_page){ GtkBox *page_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 2)); gtk_box_append (page_box, GTK_WIDGET (get_OBJECTS_and_SITUATIONS())); gtk_box_append (page_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (page_box, GTK_WIDGET (get_SPACE_VIEW_box())); gtk_box_append (page_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (page_box, GTK_WIDGET (get_TIME_EXEC_controls_box())); gtk_window_set_child (main_window, GTK_WIDGET (page_box)); } void main_window_design (GtkWindow *main_window){ // window_main_child (main_window, STATE); window_header_bar (main_window, "E coli (with permission from David S. Goodsell, 2009)"); gtk_window_present (GTK_WINDOW (main_window)); } /* // icons_for_fun (GTK_HEADER_BAR (header_bar)); // https://iconduck.com/sets/adwaita-icon-theme static void icons_for_fun (GtkHeaderBar *header_bar) { GtkButton *go_home = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (go_home, "go-home-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (go_home)); GtkButton *user_trash = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (user_trash, "user-trash-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (user_trash)); GtkButton *help_biblio = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (help_biblio, "accessories-dictionary-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (help_biblio)); GtkButton *help_doc = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (help_doc, "emblem-documents-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (help_doc)); GtkButton *help_about = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (help_about, "help-about-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (help_about)); GtkButton *help_faq = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (help_faq, "help-faq-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (help_faq)); GtkButton *terminal = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (terminal, "utilities-terminal-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (terminal)); GtkButton *search = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (search, "folder-saved-search-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (search)); GtkButton *preferences_desktop_appearance = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (preferences_desktop_appearance, "preferences-desktop-appearance-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (preferences_desktop_appearance)); GtkButton *preferences_system = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (preferences_system, "preferences-system-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (preferences_system)); GtkButton *document_properties = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (document_properties, "document-properties-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (document_properties)); GtkButton *text_edit = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (text_edit, "text-editor-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (text_edit)); GtkButton *applications_utilities = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (applications_utilities, "applications-utilities-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (applications_utilities)); GtkButton *open_menu = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (open_menu, "open-menu-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (open_menu)); GtkButton *power_max = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (power_max, "power-profile-performance-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (power_max)); GtkButton *power_middle = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (power_middle, "power-profile-balanced-rtl-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (power_middle)); GtkButton *power_low = GTK_BUTTON (gtk_button_new ()); gtk_button_set_icon_name (power_low, "power-profile-power-saver-symbolic"); gtk_header_bar_pack_end (header_bar, GTK_WIDGET (power_low)); } * * * * * * * * * * * * * Je fais un essai avec un stack_switcher 2024-06-18 void window_header_bar (GtkWindow *window, char *title){ GtkWidget *header_bar = GTK_WIDGET (gtk_header_bar_new ()); gtk_header_bar_set_title_widget (GTK_HEADER_BAR (header_bar), gtk_label_new (title)); gtk_window_set_titlebar (window, header_bar); // GtkWidget my_window_controls = *gtk_window_controls_new (GTK_PACK_END); // _START // gtk_window_controls_set_decoration_layout (GTK_WINDOW_CONTROLS(my_window_controls), NULL); // const char* layout); gpointer no_local_data = NULL; GtkButton *btt_MODEL_RUN_STOP = GTK_BUTTON (gtk_button_new_with_label (" run ")); g_signal_connect (btt_MODEL_RUN_STOP, "clicked", G_CALLBACK (on_toggle_MODEL_RUN_STOP), no_local_data); GtkButton *btt_XOR_EXEC_EDIT = GTK_BUTTON (gtk_toggle_button_new ()); gtk_button_set_icon_name (btt_XOR_EXEC_EDIT, "system-run-symbolic"); gtk_button_set_icon_name (btt_XOR_EXEC_EDIT, "power-profile-performance-symbolic"); g_signal_connect (btt_XOR_EXEC_EDIT, "clicked", G_CALLBACK (on_toggle_EXEC_EDIT), btt_MODEL_RUN_STOP); // GtkWidget* separe = gtk_separator_new (GTK_ORIENTATION_VERTICAL); // gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (separe)); GtkWidget *any_Label = GTK_WIDGET (gtk_label_new (" | ")); GtkButton *btt_open_STATE = GTK_BUTTON (gtk_check_button_new_with_label ("state")); GtkButton *btt_open_RULES = GTK_BUTTON (gtk_check_button_new_with_label ("rules")); GtkButton *btt_open_DATA = GTK_BUTTON (gtk_check_button_new_with_label ("data analysis")); GtkCheckButton *group_STATE_RULES_DATA = GTK_CHECK_BUTTON (gtk_check_button_new ()); gtk_check_button_set_group (GTK_CHECK_BUTTON (btt_open_STATE), group_STATE_RULES_DATA); gtk_check_button_set_group (GTK_CHECK_BUTTON (btt_open_RULES), group_STATE_RULES_DATA); gtk_check_button_set_group (GTK_CHECK_BUTTON (btt_open_DATA), group_STATE_RULES_DATA); gtk_check_button_set_active (GTK_CHECK_BUTTON (btt_open_STATE), TRUE); // int selected = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (btt_open_STATE)); // if (0) printf("%d\n", selected); // if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (btt_open_STATE))) // g_signal_connect (btt_open_STATE, "toggled", G_CALLBACK (on_open_STATE), no_local_data); // g_signal_connect (btt_open_RULES, "toggled", G_CALLBACK (on_open_RULES), no_local_data); // g_signal_connect (btt_open_DATA, "toggled", G_CALLBACK (on_open_DATA), no_local_data); GtkBox *page_box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL, 2)); gtk_box_append (page_box, GTK_WIDGET (get_OBJECTS_and_SITUATIONS())); gtk_box_append (page_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (page_box, GTK_WIDGET (get_SPACE_VIEW_box())); gtk_box_append (page_box, GTK_WIDGET (gtk_separator_new (GTK_ORIENTATION_HORIZONTAL))); gtk_box_append (page_box, GTK_WIDGET (get_TIME_EXEC_controls_box())); // GObject *a_stack_page = g_object_new (GTK_STACK_PAGE ? ); // https://docs.gtk.org/gobject/tutorial.html#how-to-define-and-implement-a-new-gobject GtkWidget *a_stack = gtk_stack_new (); GtkWidget *a_switcher = gtk_stack_switcher_new (); gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (a_switcher), GTK_STACK (a_stack)); gtk_stack_add_titled (GTK_STACK (a_stack), GTK_WIDGET (page_box), "a_name", "space"); // gtk_stack_page_set_visible (*self, TRUE); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (btt_XOR_EXEC_EDIT)); // gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (btt_MODEL_RUN_STOP)); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (any_Label)); // gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (btt_open_STATE)); // gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (btt_open_RULES)); // gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (btt_open_DATA)); gtk_header_bar_pack_start (GTK_HEADER_BAR (header_bar), GTK_WIDGET (a_switcher)); // icons_for_fun (GTK_HEADER_BAR (header_bar)); // https://iconduck.com/sets/adwaita-icon-theme } */