fix(graph): persist viewport while navigating
This commit is contained in:
parent
6b43379e75
commit
ab6e04faea
7 changed files with 128 additions and 0 deletions
|
|
@ -125,6 +125,7 @@ typedef void (*MainWindowGraphNodeMovedCallback)(
|
||||||
double y,
|
double y,
|
||||||
gpointer user_data
|
gpointer user_data
|
||||||
);
|
);
|
||||||
|
typedef void (*MainWindowGraphTransformChangedCallback)(gpointer user_data);
|
||||||
|
|
||||||
typedef void (*MainWindowExtractionDropCallback)(
|
typedef void (*MainWindowExtractionDropCallback)(
|
||||||
const char *file_path,
|
const char *file_path,
|
||||||
|
|
@ -251,6 +252,10 @@ void main_window_set_graph_node_moved_callback(
|
||||||
MainWindowGraphNodeMovedCallback callback,
|
MainWindowGraphNodeMovedCallback callback,
|
||||||
gpointer user_data
|
gpointer user_data
|
||||||
);
|
);
|
||||||
|
void main_window_set_graph_transform_changed_callback(
|
||||||
|
MainWindow *main_window,
|
||||||
|
MainWindowGraphTransformChangedCallback callback,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
void main_window_set_extraction_drop_callback(
|
void main_window_set_extraction_drop_callback(
|
||||||
MainWindow *main_window,
|
MainWindow *main_window,
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,10 @@ typedef void (*InvestigationGraphViewNodeMovedCallback)(
|
||||||
gpointer user_data
|
gpointer user_data
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef void (*InvestigationGraphViewTransformChangedCallback)(
|
||||||
|
gpointer user_data
|
||||||
|
);
|
||||||
|
|
||||||
/** @brief Callback appelé lorsqu'une extraction est déposée sur le graphe. */
|
/** @brief Callback appelé lorsqu'une extraction est déposée sur le graphe. */
|
||||||
typedef void (*InvestigationGraphViewExtractionDropCallback)(
|
typedef void (*InvestigationGraphViewExtractionDropCallback)(
|
||||||
const char *file_path,
|
const char *file_path,
|
||||||
|
|
@ -177,6 +181,12 @@ void investigation_graph_view_set_node_moved_callback(
|
||||||
gpointer user_data
|
gpointer user_data
|
||||||
);
|
);
|
||||||
|
|
||||||
|
void investigation_graph_view_set_transform_changed_callback(
|
||||||
|
InvestigationGraphView *graph_view,
|
||||||
|
InvestigationGraphViewTransformChangedCallback callback,
|
||||||
|
gpointer user_data
|
||||||
|
);
|
||||||
|
|
||||||
void investigation_graph_view_set_extraction_drop_callback(
|
void investigation_graph_view_set_extraction_drop_callback(
|
||||||
InvestigationGraphView *graph_view,
|
InvestigationGraphView *graph_view,
|
||||||
InvestigationGraphViewExtractionDropCallback callback,
|
InvestigationGraphViewExtractionDropCallback callback,
|
||||||
|
|
|
||||||
|
|
@ -55,6 +55,7 @@ typedef void (*WorkspaceGraphNodeMovedCallback)(
|
||||||
double y,
|
double y,
|
||||||
gpointer user_data
|
gpointer user_data
|
||||||
);
|
);
|
||||||
|
typedef void (*WorkspaceGraphTransformChangedCallback)(gpointer user_data);
|
||||||
|
|
||||||
typedef void (*WorkspaceExtractionDropCallback)(
|
typedef void (*WorkspaceExtractionDropCallback)(
|
||||||
const char *file_path,
|
const char *file_path,
|
||||||
|
|
@ -324,6 +325,10 @@ void workspace_set_graph_node_moved_callback(
|
||||||
WorkspaceGraphNodeMovedCallback callback,
|
WorkspaceGraphNodeMovedCallback callback,
|
||||||
gpointer user_data
|
gpointer user_data
|
||||||
);
|
);
|
||||||
|
void workspace_set_graph_transform_changed_callback(
|
||||||
|
Workspace *workspace,
|
||||||
|
WorkspaceGraphTransformChangedCallback callback,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
void workspace_set_extraction_drop_callback(
|
void workspace_set_extraction_drop_callback(
|
||||||
Workspace *workspace,
|
Workspace *workspace,
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,7 @@ struct Application
|
||||||
InvestigationGraphLayout *graph_layout;
|
InvestigationGraphLayout *graph_layout;
|
||||||
guint64 graph_load_generation;
|
guint64 graph_load_generation;
|
||||||
gboolean graph_viewport_restored;
|
gboolean graph_viewport_restored;
|
||||||
|
guint graph_viewport_save_source_id;
|
||||||
|
|
||||||
char *selected_evidence_identifier;
|
char *selected_evidence_identifier;
|
||||||
char *pending_relation_selection_identifier;
|
char *pending_relation_selection_identifier;
|
||||||
|
|
@ -278,6 +279,25 @@ static void application_save_graph_viewport(Application *application)
|
||||||
g_clear_error(&error);
|
g_clear_error(&error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean application_save_graph_viewport_timeout(gpointer user_data)
|
||||||
|
{
|
||||||
|
Application *application = user_data;
|
||||||
|
if (application == NULL) return G_SOURCE_REMOVE;
|
||||||
|
application->graph_viewport_save_source_id = 0U;
|
||||||
|
application_save_graph_viewport(application);
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void application_on_graph_transform_changed(gpointer user_data)
|
||||||
|
{
|
||||||
|
Application *application = user_data;
|
||||||
|
if (application == NULL) return;
|
||||||
|
if (application->graph_viewport_save_source_id != 0U)
|
||||||
|
g_source_remove(application->graph_viewport_save_source_id);
|
||||||
|
application->graph_viewport_save_source_id = g_timeout_add(
|
||||||
|
250U, application_save_graph_viewport_timeout, application);
|
||||||
|
}
|
||||||
|
|
||||||
static void application_restore_graph_viewport(Application *application)
|
static void application_restore_graph_viewport(Application *application)
|
||||||
{
|
{
|
||||||
GraphNodePositionDao *dao = NULL;
|
GraphNodePositionDao *dao = NULL;
|
||||||
|
|
@ -2665,6 +2685,11 @@ static gboolean application_install_session(
|
||||||
application->tree_model
|
application->tree_model
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (application->graph_viewport_save_source_id != 0U)
|
||||||
|
{
|
||||||
|
g_source_remove(application->graph_viewport_save_source_id);
|
||||||
|
application->graph_viewport_save_source_id = 0U;
|
||||||
|
}
|
||||||
application_save_graph_viewport(application);
|
application_save_graph_viewport(application);
|
||||||
investigation_session_close(
|
investigation_session_close(
|
||||||
application->session
|
application->session
|
||||||
|
|
@ -7841,6 +7866,10 @@ static void application_on_activate(
|
||||||
application_on_graph_node_moved,
|
application_on_graph_node_moved,
|
||||||
application
|
application
|
||||||
);
|
);
|
||||||
|
main_window_set_graph_transform_changed_callback(
|
||||||
|
application->main_window,
|
||||||
|
application_on_graph_transform_changed,
|
||||||
|
application);
|
||||||
main_window_set_extraction_drop_callback(
|
main_window_set_extraction_drop_callback(
|
||||||
application->main_window, application_on_extraction_dropped,
|
application->main_window, application_on_extraction_dropped,
|
||||||
application);
|
application);
|
||||||
|
|
@ -8126,6 +8155,11 @@ void application_free(
|
||||||
application
|
application
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (application->graph_viewport_save_source_id != 0U)
|
||||||
|
{
|
||||||
|
g_source_remove(application->graph_viewport_save_source_id);
|
||||||
|
application->graph_viewport_save_source_id = 0U;
|
||||||
|
}
|
||||||
application_save_graph_viewport(application);
|
application_save_graph_viewport(application);
|
||||||
|
|
||||||
application_clear_graph(
|
application_clear_graph(
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,8 @@ struct MainWindow
|
||||||
|
|
||||||
gpointer
|
gpointer
|
||||||
graph_node_moved_user_data;
|
graph_node_moved_user_data;
|
||||||
|
MainWindowGraphTransformChangedCallback graph_transform_changed_callback;
|
||||||
|
gpointer graph_transform_changed_user_data;
|
||||||
|
|
||||||
MainWindowExtractionDropCallback extraction_drop_callback;
|
MainWindowExtractionDropCallback extraction_drop_callback;
|
||||||
gpointer extraction_drop_user_data;
|
gpointer extraction_drop_user_data;
|
||||||
|
|
@ -514,6 +516,15 @@ static void main_window_on_graph_node_moved(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void main_window_on_graph_transform_changed(gpointer user_data)
|
||||||
|
{
|
||||||
|
MainWindow *main_window = user_data;
|
||||||
|
if (main_window != NULL &&
|
||||||
|
main_window->graph_transform_changed_callback != NULL)
|
||||||
|
main_window->graph_transform_changed_callback(
|
||||||
|
main_window->graph_transform_changed_user_data);
|
||||||
|
}
|
||||||
|
|
||||||
static void main_window_on_extraction_dropped(const char *file_path,
|
static void main_window_on_extraction_dropped(const char *file_path,
|
||||||
const char *target_entity_identifier, gpointer user_data)
|
const char *target_entity_identifier, gpointer user_data)
|
||||||
{
|
{
|
||||||
|
|
@ -978,6 +989,9 @@ MainWindow *main_window_new(
|
||||||
main_window_on_graph_node_moved,
|
main_window_on_graph_node_moved,
|
||||||
main_window
|
main_window
|
||||||
);
|
);
|
||||||
|
workspace_set_graph_transform_changed_callback(
|
||||||
|
main_window->workspace, main_window_on_graph_transform_changed,
|
||||||
|
main_window);
|
||||||
workspace_set_extraction_drop_callback(main_window->workspace,
|
workspace_set_extraction_drop_callback(main_window->workspace,
|
||||||
main_window_on_extraction_dropped, main_window);
|
main_window_on_extraction_dropped, main_window);
|
||||||
|
|
||||||
|
|
@ -1803,6 +1817,16 @@ void main_window_set_graph_node_moved_callback(
|
||||||
user_data;
|
user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void main_window_set_graph_transform_changed_callback(
|
||||||
|
MainWindow *main_window,
|
||||||
|
MainWindowGraphTransformChangedCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
if (main_window == NULL) return;
|
||||||
|
main_window->graph_transform_changed_callback = callback;
|
||||||
|
main_window->graph_transform_changed_user_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
void main_window_set_extraction_drop_callback(
|
void main_window_set_extraction_drop_callback(
|
||||||
MainWindow *main_window,
|
MainWindow *main_window,
|
||||||
MainWindowExtractionDropCallback callback,
|
MainWindowExtractionDropCallback callback,
|
||||||
|
|
@ -2070,6 +2094,8 @@ void main_window_free(
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
workspace_set_graph_transform_changed_callback(
|
||||||
|
main_window->workspace, NULL, NULL);
|
||||||
|
|
||||||
workspace_set_reset_graph_layout_callback(
|
workspace_set_reset_graph_layout_callback(
|
||||||
main_window->workspace,
|
main_window->workspace,
|
||||||
|
|
|
||||||
|
|
@ -121,6 +121,8 @@ struct InvestigationGraphView
|
||||||
|
|
||||||
InvestigationGraphViewNodeMovedCallback node_moved_callback;
|
InvestigationGraphViewNodeMovedCallback node_moved_callback;
|
||||||
gpointer node_moved_user_data;
|
gpointer node_moved_user_data;
|
||||||
|
InvestigationGraphViewTransformChangedCallback transform_changed_callback;
|
||||||
|
gpointer transform_changed_user_data;
|
||||||
InvestigationGraphViewExtractionDropCallback extraction_drop_callback;
|
InvestigationGraphViewExtractionDropCallback extraction_drop_callback;
|
||||||
gpointer extraction_drop_user_data;
|
gpointer extraction_drop_user_data;
|
||||||
|
|
||||||
|
|
@ -317,6 +319,10 @@ static void investigation_graph_view_zoom_at_point(
|
||||||
gtk_widget_queue_draw(
|
gtk_widget_queue_draw(
|
||||||
graph_view->drawing_area
|
graph_view->drawing_area
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (graph_view->transform_changed_callback != NULL)
|
||||||
|
graph_view->transform_changed_callback(
|
||||||
|
graph_view->transform_changed_user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -513,6 +519,10 @@ static void investigation_graph_view_on_scale_changed(
|
||||||
gtk_widget_queue_draw(
|
gtk_widget_queue_draw(
|
||||||
graph_view->drawing_area
|
graph_view->drawing_area
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (graph_view->transform_changed_callback != NULL)
|
||||||
|
graph_view->transform_changed_callback(
|
||||||
|
graph_view->transform_changed_user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1201,6 +1211,10 @@ static void investigation_graph_view_on_drag_update(
|
||||||
graph_view->drag_origin_offset_y +
|
graph_view->drag_origin_offset_y +
|
||||||
offset_y;
|
offset_y;
|
||||||
|
|
||||||
|
if (graph_view->transform_changed_callback != NULL)
|
||||||
|
graph_view->transform_changed_callback(
|
||||||
|
graph_view->transform_changed_user_data);
|
||||||
|
|
||||||
gtk_widget_queue_draw(
|
gtk_widget_queue_draw(
|
||||||
graph_view->drawing_area
|
graph_view->drawing_area
|
||||||
);
|
);
|
||||||
|
|
@ -4462,6 +4476,16 @@ void investigation_graph_view_set_node_moved_callback(
|
||||||
user_data;
|
user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void investigation_graph_view_set_transform_changed_callback(
|
||||||
|
InvestigationGraphView *graph_view,
|
||||||
|
InvestigationGraphViewTransformChangedCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
if (graph_view == NULL) return;
|
||||||
|
graph_view->transform_changed_callback = callback;
|
||||||
|
graph_view->transform_changed_user_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
void investigation_graph_view_set_extraction_drop_callback(
|
void investigation_graph_view_set_extraction_drop_callback(
|
||||||
InvestigationGraphView *graph_view,
|
InvestigationGraphView *graph_view,
|
||||||
InvestigationGraphViewExtractionDropCallback callback,
|
InvestigationGraphViewExtractionDropCallback callback,
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,8 @@ struct Workspace
|
||||||
|
|
||||||
gpointer
|
gpointer
|
||||||
graph_node_moved_user_data;
|
graph_node_moved_user_data;
|
||||||
|
WorkspaceGraphTransformChangedCallback graph_transform_changed_callback;
|
||||||
|
gpointer graph_transform_changed_user_data;
|
||||||
|
|
||||||
WorkspaceExtractionDropCallback extraction_drop_callback;
|
WorkspaceExtractionDropCallback extraction_drop_callback;
|
||||||
gpointer extraction_drop_user_data;
|
gpointer extraction_drop_user_data;
|
||||||
|
|
@ -749,6 +751,14 @@ static void workspace_on_graph_node_moved(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void workspace_on_graph_transform_changed(gpointer user_data)
|
||||||
|
{
|
||||||
|
Workspace *workspace = user_data;
|
||||||
|
if (workspace != NULL && workspace->graph_transform_changed_callback != NULL)
|
||||||
|
workspace->graph_transform_changed_callback(
|
||||||
|
workspace->graph_transform_changed_user_data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Transmet la sélection du graphe au volet de détails.
|
* @brief Transmet la sélection du graphe au volet de détails.
|
||||||
*/
|
*/
|
||||||
|
|
@ -1966,6 +1976,8 @@ Workspace *workspace_new(void)
|
||||||
workspace_on_graph_node_moved,
|
workspace_on_graph_node_moved,
|
||||||
workspace
|
workspace
|
||||||
);
|
);
|
||||||
|
investigation_graph_view_set_transform_changed_callback(
|
||||||
|
workspace->graph_view, workspace_on_graph_transform_changed, workspace);
|
||||||
investigation_graph_view_set_extraction_drop_callback(
|
investigation_graph_view_set_extraction_drop_callback(
|
||||||
workspace->graph_view, workspace_on_extraction_dropped, workspace);
|
workspace->graph_view, workspace_on_extraction_dropped, workspace);
|
||||||
|
|
||||||
|
|
@ -3473,6 +3485,16 @@ void workspace_set_graph_node_moved_callback(
|
||||||
user_data;
|
user_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void workspace_set_graph_transform_changed_callback(
|
||||||
|
Workspace *workspace,
|
||||||
|
WorkspaceGraphTransformChangedCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
if (workspace == NULL) return;
|
||||||
|
workspace->graph_transform_changed_callback = callback;
|
||||||
|
workspace->graph_transform_changed_user_data = user_data;
|
||||||
|
}
|
||||||
|
|
||||||
void workspace_set_extraction_drop_callback(
|
void workspace_set_extraction_drop_callback(
|
||||||
Workspace *workspace,
|
Workspace *workspace,
|
||||||
WorkspaceExtractionDropCallback callback,
|
WorkspaceExtractionDropCallback callback,
|
||||||
|
|
@ -3680,6 +3702,8 @@ void workspace_free(Workspace *workspace)
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
investigation_graph_view_set_transform_changed_callback(
|
||||||
|
workspace->graph_view, NULL, NULL);
|
||||||
|
|
||||||
entity_details_panel_set_close_callback(
|
entity_details_panel_set_close_callback(
|
||||||
workspace->entity_details_panel,
|
workspace->entity_details_panel,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue