diff --git a/src/ag-window.c b/src/ag-window.c index e9ebc0e..31bf686 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -1264,19 +1264,83 @@ ag_window_delete_action(GSimpleAction *action, g_action_group_activate_action(G_ACTION_GROUP(window), "refresh", NULL); } +static void +ag_window_js_callback(GObject *object, GAsyncResult *res, gpointer user_data) +{ + WebKitJavascriptResult *js_result; + GError *err = NULL; + + if ((js_result = webkit_web_view_run_javascript_finish( + WEBKIT_WEB_VIEW(object), + res, + &err + )) != NULL) { + webkit_javascript_result_unref(js_result); + } +} + +static void +ag_window_connection_action(GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GVariant *current_state; + const gchar *state; + gchar *js_code = NULL; + AgWindowPrivate *priv = ag_window_get_instance_private( + AG_WINDOW(user_data) + ); + static gchar *js = "aspects = document.getElementById('aspects');\n" \ + "antiscia = document.getElementById('antiscia');\n" \ + "aspects.setAttribute('visibility', '%s');\n" \ + "antiscia.setAttribute('visibility', '%s');\n"; + + current_state = g_action_get_state(G_ACTION(action)); + + if (g_variant_equal(current_state, parameter)) { + return; + } + + g_action_change_state(G_ACTION(action), parameter); + + state = g_variant_get_string(parameter, NULL); + + if (strcmp("aspects", state) == 0) { + g_debug("Switching to aspects"); + js_code = g_strdup_printf(js, "visible", "hidden"); + } else if (strcmp("antiscia", state) == 0) { + g_debug("Switching to antiscia"); + js_code = g_strdup_printf(js, "hidden", "visible"); + } else { + g_warning("Connection type '%s' is invalid", state); + } + + if (js_code) { + webkit_web_view_run_javascript( + WEBKIT_WEB_VIEW(priv->chart_web_view), + js_code, + NULL, + ag_window_js_callback, + NULL + ); + g_free(js_code); + } +} + static GActionEntry win_entries[] = { - { "close", ag_window_close_action, NULL, NULL, NULL }, - { "save", ag_window_save_action, NULL, NULL, NULL }, - { "export", ag_window_export_action, NULL, NULL, NULL }, - { "export-svg", ag_window_export_svg_action, NULL, NULL, NULL }, - { "view-menu", ag_window_view_menu_action, NULL, "false", NULL }, - { "gear-menu", ag_window_gear_menu_action, NULL, "false", NULL }, - { "change-tab", ag_window_change_tab_action, "s", "'edit'", NULL }, - { "new-chart", ag_window_new_chart_action, NULL, NULL, NULL }, - { "back", ag_window_back_action, NULL, NULL, NULL }, - { "refresh", ag_window_refresh_action, NULL, NULL, NULL }, - { "selection", ag_window_selection_mode_action, NULL, "false", NULL }, - { "delete", ag_window_delete_action, NULL, NULL, NULL }, + { "close", ag_window_close_action, NULL, NULL, NULL }, + { "save", ag_window_save_action, NULL, NULL, NULL }, + { "export", ag_window_export_action, NULL, NULL, NULL }, + { "export-svg", ag_window_export_svg_action, NULL, NULL, NULL }, + { "view-menu", ag_window_view_menu_action, NULL, "false", NULL }, + { "gear-menu", ag_window_gear_menu_action, NULL, "false", NULL }, + { "change-tab", ag_window_change_tab_action, "s", "'edit'", NULL }, + { "new-chart", ag_window_new_chart_action, NULL, NULL, NULL }, + { "back", ag_window_back_action, NULL, NULL, NULL }, + { "refresh", ag_window_refresh_action, NULL, NULL, NULL }, + { "selection", ag_window_selection_mode_action, NULL, "false", NULL }, + { "delete", ag_window_delete_action, NULL, NULL, NULL }, + { "connection", ag_window_connection_action, "s", "'aspects'", NULL }, }; static void diff --git a/src/resources/ui/ag-window.ui b/src/resources/ui/ag-window.ui index 7a43f58..c60a8a1 100644 --- a/src/resources/ui/ag-window.ui +++ b/src/resources/ui/ag-window.ui @@ -765,6 +765,27 @@ True False + + + True + False + Aspects + False + win.connection + 'aspects' + + + + + True + False + Antiscia + False + toolbar_aspect + win.connection + 'antiscia' + + start