diff options
Diffstat (limited to 'src/gui/editor.c')
-rw-r--r-- | src/gui/editor.c | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/src/gui/editor.c b/src/gui/editor.c index 6785753..d1f90d5 100644 --- a/src/gui/editor.c +++ b/src/gui/editor.c @@ -47,6 +47,7 @@ #include "../core/global.h" #include "../core/params.h" #include "../gtkext/easygtk.h" +#include "../gtkext/gtkdisplaypanel.h" #include "../gtkext/gtkdockable.h" #include "../gtkext/gtkdockstation.h" #include "../gtkext/support.h" @@ -214,6 +215,11 @@ static void notify_paned_handle_position_change(GObject *, GParamSpec *, gpointe /* Réagit à un changement du projet principal. */ static void notify_editor_project_change(GStudyProject *, bool); +/* Assure un positionnement initial idéal. */ +static gboolean scroll_for_the_first_time(GtkWidget *, GdkEvent *, GLoadedContent *); + +/* Affiche le contenu qui vient de rejoindre un projet donné. */ +void on_editor_loaded_content_added(GStudyProject *, GLoadedContent *, void *); @@ -1612,7 +1618,12 @@ static void notify_editor_project_change(GStudyProject *project, bool new) if (new) { - /* ... */ + + g_signal_connect(project, "content-added", G_CALLBACK(on_editor_loaded_content_added), NULL); + + + + /* TODO : show_all()... */ } @@ -1623,9 +1634,86 @@ static void notify_editor_project_change(GStudyProject *project, bool new) g_study_project_hide(project); + g_signal_handlers_disconnect_by_func(project, G_CALLBACK(on_editor_loaded_content_added), NULL); + } } + + +/****************************************************************************** +* * +* Paramètres : project = project impliqué dans l'opération. * +* content = nouveau contenu à présenter dans l'éditeur. * +* unused = adresse non utilisée ici. * +* * +* Description : Affiche le contenu qui vient de rejoindre un projet donné. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void on_editor_loaded_content_added(GStudyProject *project, GLoadedContent *content, void *unused) +{ + GtkWidget *selected; /* Interface de prédilection */ + const char *name; /* Titre associé au binaire */ + const char *lname; /* Description du binaire */ + GPanelItem *panel; /* Nouveau panneau à integrer */ + + selected = g_loaded_content_build_view(content, 0); + + name = g_loaded_content_describe(content, false); + lname = g_loaded_content_describe(content, true); + + panel = g_panel_item_new(PIP_BINARY_VIEW, name, lname, selected, true, "N"); + register_panel_item(panel, get_main_configuration()); + + g_signal_connect(selected, "size-allocate", G_CALLBACK(scroll_for_the_first_time), content); + + g_panel_item_dock(panel); + + update_project_area(project); + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant d'affichage nouvellement porté à l'écran.* +* event = informations liées à l'événement. * +* content = contenu chargé associé au composant d'affichage. * +* * +* Description : Assure un positionnement initial idéal. * +* * +* Retour : FALSE. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean scroll_for_the_first_time(GtkWidget *widget, GdkEvent *event, GLoadedContent *content) +{ + GExeFormat *format; /* Format associé au binaire */ + vmpa2t target; /* Position initiale à viser */ + + g_signal_handlers_disconnect_by_func(widget, G_CALLBACK(scroll_for_the_first_time), content); + + if (G_IS_LOADED_BINARY(content)) + { + format = g_loaded_binary_get_format(G_LOADED_BINARY(content)); + + if (g_exe_format_get_main_address(format, &target)) + gtk_display_panel_request_move(GTK_DISPLAY_PANEL(widget), &target); + + g_object_unref(G_OBJECT(format)); + + } + + return FALSE; + +} |