diff --git a/HISTORY.md b/HISTORY.md index 1fa14e77..698ce2b7 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -18,6 +18,13 @@ # along with this program. If not, see . --> +## 0.2.271 - 2025-09-11 + +- Prevent dockable floating containers from shrinking to their original size + so snapped-out diagrams expand when the window is resized or maximized. +- Add regression coverage ensuring dockable floating content tracks window + size changes after resizing. + ## 0.2.270 - 2025-09-10 - Restore standard decorations on detached notebooks so floating windows offer diff --git a/gui/utils/dockable_diagram_window.py b/gui/utils/dockable_diagram_window.py index 6d0afbf1..e0497216 100644 --- a/gui/utils/dockable_diagram_window.py +++ b/gui/utils/dockable_diagram_window.py @@ -55,6 +55,15 @@ def _ensure_float_container(self, win: tk.Toplevel) -> ttk.Frame: container = ttk.Frame(win) container.pack(expand=True, fill="both") self._float_container = container + else: + try: + container.pack_configure(expand=True, fill="both") + except tk.TclError: + container.pack(expand=True, fill="both") + try: + container.pack_propagate(False) + except tk.TclError: + pass return container def _release_from_geometry(self) -> None: diff --git a/metrics.json b/metrics.json index 0647a588..a85a9747 100644 --- a/metrics.json +++ b/metrics.json @@ -1,596 +1,466 @@ { "total_files": 17, - "total_loc": 5628, + "total_loc": 5637, "total_functions": 186, - "average_complexity": 6.16, + "average_complexity": 6.17, "files": [ { - "file": "gui/utils/detached_window.py", - "loc": 65, + "file": "gui/utils/icon_factory.py", + "loc": 952, "functions": [ { - "name": "__init__", - "lineno": 37, - "complexity": 1 + "name": "_put_safe", + "lineno": 24, + "complexity": 3 }, { - "name": "add", - "lineno": 51, + "name": "_draw_bug", + "lineno": 30, + "complexity": 12 + }, + { + "name": "create_icon", + "lineno": 67, + "complexity": 324 + }, + { + "name": "_grad", + "lineno": 105, "complexity": 1 }, { - "name": "add_moved_widget", - "lineno": 56, - "complexity": 2 + "name": "_wpt", + "lineno": 461, + "complexity": 1 }, { - "name": "_ensure_toolbox", - "lineno": 66, - "complexity": 7 + "name": "_rot", + "lineno": 487, + "complexity": 1 }, { - "name": "_activate_hooks", - "lineno": 82, + "name": "draw_node", + "lineno": 826, "complexity": 4 }, { - "name": "_on_destroy", - "lineno": 95, + "name": "draw_line", + "lineno": 832, "complexity": 2 } ] }, { - "file": "gui/utils/table_controller.py", - "loc": 98, + "file": "gui/utils/drawing_helper.py", + "loc": 2449, "functions": [ { - "name": "__init__", - "lineno": 41, - "complexity": 6 + "name": "init_diagram_canvas", + "lineno": 43, + "complexity": 3 }, { - "name": "clear", - "lineno": 79, + "name": "draw_90_connection", + "lineno": 946, "complexity": 1 }, { - "name": "insert_row", - "lineno": 84, - "complexity": 2 - }, - { - "name": "_adjust_text", - "lineno": 94, - "complexity": 8 - }, - { - "name": "adjust_text", - "lineno": 121, + "name": "__init__", + "lineno": 68, "complexity": 1 }, { - "name": "move_up", - "lineno": 126, + "name": "clear_cache", + "lineno": 71, "complexity": 1 }, { - "name": "move_down", - "lineno": 130, - "complexity": 1 - } - ] - }, - { - "file": "gui/utils/logger.py", - "loc": 199, - "functions": [ - { - "name": "init_log_window", - "lineno": 45, + "name": "_resolve_outline", + "lineno": 75, "complexity": 2 }, { - "name": "set_toggle_button", - "lineno": 125, - "complexity": 1 + "name": "_interpolate_color", + "lineno": 81, + "complexity": 3 }, { - "name": "show_log", - "lineno": 131, - "complexity": 7 + "name": "_fill_gradient_polygon", + "lineno": 102, + "complexity": 12 }, { - "name": "_animate_hide", - "lineno": 157, - "complexity": 3 + "name": "_fill_gradient_circle", + "lineno": 130, + "complexity": 4 }, { - "name": "hide_log", - "lineno": 169, + "name": "_fill_gradient_oval", + "lineno": 156, "complexity": 6 }, { - "name": "toggle_log", - "lineno": 187, - "complexity": 3 - }, - { - "name": "show_temporarily", - "lineno": 195, + "name": "_fill_gradient_rect", + "lineno": 183, "complexity": 4 }, { - "name": "_raise_widget", - "lineno": 223, + "name": "get_text_size", + "lineno": 194, "complexity": 2 }, { - "name": "_update_line_numbers", - "lineno": 231, - "complexity": 4 + "name": "draw_page_clone_shape", + "lineno": 201, + "complexity": 1 }, { - "name": "log_message", + "name": "draw_shared_marker", "lineno": 243, - "complexity": 3 - } - ] - }, - { - "file": "gui/utils/node_utils.py", - "loc": 24, - "functions": [ - { - "name": "resolve_original", - "lineno": 25, - "complexity": 4 - } - ] - }, - { - "file": "gui/utils/dockable_diagram_window.py", - "loc": 98, - "functions": [ - { - "name": "__init__", - "lineno": 33, "complexity": 1 }, { - "name": "win", - "lineno": 39, - "complexity": 3 + "name": "_segment_intersection", + "lineno": 255, + "complexity": 4 }, { - "name": "_ensure_float_container", - "lineno": 50, - "complexity": 3 + "name": "point_on_shape", + "lineno": 272, + "complexity": 22 }, { - "name": "_release_from_geometry", - "lineno": 60, - "complexity": 6 + "name": "draw_90_connection", + "lineno": 331, + "complexity": 4 }, { - "name": "_on_destroy", - "lineno": 78, - "complexity": 1 + "name": "compute_rotated_and_gate_vertices", + "lineno": 371, + "complexity": 5 }, { - "name": "dock", - "lineno": 87, - "complexity": 7 + "name": "draw_rotated_and_gate_shape", + "lineno": 387, + "complexity": 8 }, { - "name": "float", - "lineno": 109, - "complexity": 7 - } - ] - }, - { - "file": "gui/utils/tk_utils.py", - "loc": 99, - "functions": [ - { - "name": "cancel_after_events", - "lineno": 29, - "complexity": 30 + "name": "draw_rotated_or_gate_shape", + "lineno": 486, + "complexity": 15 }, { - "name": "reparent_widget", - "lineno": 100, - "complexity": 9 + "name": "draw_rotated_and_gate_clone_shape", + "lineno": 594, + "complexity": 1 }, { - "name": "_cancel_ident", - "lineno": 35, - "complexity": 8 - } - ] - }, - { - "file": "gui/utils/name_utils.py", - "loc": 108, - "functions": [ + "name": "draw_rotated_or_gate_clone_shape", + "lineno": 635, + "complexity": 1 + }, { - "name": "_collect_gsn_diagrams", - "lineno": 35, + "name": "draw_triangle_shape", + "lineno": 676, "complexity": 4 }, { - "name": "collect_work_product_names_v1", - "lineno": 45, - "complexity": 6 + "name": "draw_circle_event_shape", + "lineno": 765, + "complexity": 2 }, { - "name": "collect_work_product_names_v2", - "lineno": 58, - "complexity": 8 + "name": "draw_circle_event_clone_shape", + "lineno": 859, + "complexity": 1 }, { - "name": "collect_work_product_names_v3", - "lineno": 75, - "complexity": 6 + "name": "draw_triangle_clone_shape", + "lineno": 898, + "complexity": 2 }, { - "name": "collect_work_product_names_v4", - "lineno": 85, - "complexity": 8 + "name": "_scaled_font", + "lineno": 977, + "complexity": 1 }, { - "name": "unique_name_v1", - "lineno": 101, - "complexity": 3 + "name": "draw_goal_shape", + "lineno": 982, + "complexity": 2 }, { - "name": "unique_name_v2", - "lineno": 113, - "complexity": 3 + "name": "draw_module_shape", + "lineno": 1027, + "complexity": 2 }, { - "name": "unique_name_v3", - "lineno": 125, - "complexity": 3 + "name": "_draw_arrow", + "lineno": 1086, + "complexity": 4 }, { - "name": "unique_name_v4", - "lineno": 137, - "complexity": 3 - } - ] - }, - { - "file": "gui/utils/icon_factory.py", - "loc": 952, - "functions": [ - { - "name": "_put_safe", - "lineno": 24, - "complexity": 3 + "name": "draw_solved_by_connection", + "lineno": 1131, + "complexity": 4 }, { - "name": "_draw_bug", - "lineno": 30, - "complexity": 12 + "name": "draw_in_context_connection", + "lineno": 1208, + "complexity": 4 }, { - "name": "create_icon", - "lineno": 67, - "complexity": 324 + "name": "draw_strategy_shape", + "lineno": 1291, + "complexity": 2 }, { - "name": "_grad", - "lineno": 105, - "complexity": 1 + "name": "draw_solution_shape", + "lineno": 1330, + "complexity": 2 }, { - "name": "_wpt", - "lineno": 461, - "complexity": 1 + "name": "draw_assumption_shape", + "lineno": 1372, + "complexity": 2 }, { - "name": "_rot", - "lineno": 487, - "complexity": 1 + "name": "draw_justification_shape", + "lineno": 1427, + "complexity": 2 }, { - "name": "draw_node", - "lineno": 826, - "complexity": 4 + "name": "draw_context_shape", + "lineno": 1482, + "complexity": 2 }, { - "name": "draw_line", - "lineno": 832, + "name": "_draw_module_reference_box", + "lineno": 1585, "complexity": 2 - } - ] - }, - { - "file": "gui/utils/closable_notebook.py", - "loc": 1028, - "functions": [ - { - "name": "__init__", - "lineno": 57, - "complexity": 3 }, { - "name": "add", - "lineno": 170, - "complexity": 5 + "name": "draw_away_goal_shape", + "lineno": 1668, + "complexity": 2 }, { - "name": "close_all_floating", - "lineno": 195, - "complexity": 4 + "name": "draw_away_solution_shape", + "lineno": 1741, + "complexity": 2 }, { - "name": "_on_tab_press", - "lineno": 221, - "complexity": 1 + "name": "draw_away_context_shape", + "lineno": 1814, + "complexity": 2 }, { - "name": "_on_tab_release", - "lineno": 226, - "complexity": 1 + "name": "_draw_away_assumption_or_justification", + "lineno": 1906, + "complexity": 2 }, { - "name": "_on_tab_motion", - "lineno": 231, + "name": "draw_away_assumption_shape", + "lineno": 2008, "complexity": 1 }, { - "name": "_on_tab_changed", - "lineno": 240, + "name": "draw_away_justification_shape", + "lineno": 2038, "complexity": 1 }, { - "name": "_on_focus_in", - "lineno": 243, + "name": "draw_away_module_shape", + "lineno": 2068, "complexity": 1 }, { - "name": "_handle_tab_focus", - "lineno": 246, - "complexity": 5 + "name": "draw_away_context_shape", + "lineno": 2078, + "complexity": 3 }, { - "name": "_get_widget", - "lineno": 277, + "name": "_draw_away_assumption_or_justification", + "lineno": 2174, "complexity": 2 }, { - "name": "_call_method", - "lineno": 283, - "complexity": 3 + "name": "draw_away_assumption_shape", + "lineno": 2248, + "complexity": 1 }, { - "name": "_strategy_load_only", - "lineno": 290, + "name": "draw_away_justification_shape", + "lineno": 2278, "complexity": 1 }, { - "name": "_strategy_swap_load_unload", - "lineno": 295, - "complexity": 3 + "name": "draw_away_module_shape", + "lineno": 2308, + "complexity": 1 }, { - "name": "_strategy_event_based", - "lineno": 304, - "complexity": 4 + "name": "_scaled_font", + "lineno": 2319, + "complexity": 1 }, { - "name": "_strategy_swap_event_based", - "lineno": 314, - "complexity": 4 + "name": "draw_goal_shape", + "lineno": 2325, + "complexity": 2 }, { - "name": "_create_close_image", - "lineno": 326, + "name": "draw_module_shape", + "lineno": 2339, "complexity": 2 }, { - "name": "_on_press", - "lineno": 334, - "complexity": 5 + "name": "_draw_module_reference_box", + "lineno": 2362, + "complexity": 2 }, { - "name": "_on_motion", - "lineno": 363, - "complexity": 4 + "name": "draw_away_goal_shape", + "lineno": 2427, + "complexity": 2 }, { - "name": "_on_release", - "lineno": 371, - "complexity": 3 + "name": "draw_away_solution_shape", + "lineno": 2456, + "complexity": 2 }, { - "name": "_handle_close", - "lineno": 379, - "complexity": 9 + "name": "draw_away_context_shape", + "lineno": 2515, + "complexity": 2 }, { - "name": "_finalize_drag", - "lineno": 412, - "complexity": 6 + "name": "_draw_away_assumption_or_justification", + "lineno": 2591, + "complexity": 2 }, { - "name": "_is_outside", - "lineno": 430, - "complexity": 4 + "name": "draw_away_assumption_shape", + "lineno": 2665, + "complexity": 1 }, { - "name": "_target_notebook", - "lineno": 438, - "complexity": 4 + "name": "draw_away_justification_shape", + "lineno": 2671, + "complexity": 1 }, { - "name": "_move_tab", - "lineno": 455, - "complexity": 18 + "name": "rotate_point", + "lineno": 379, + "complexity": 1 }, { - "name": "_replace_widget_paths", - "lineno": 541, - "complexity": 3 - }, + "name": "cubic_bezier", + "lineno": 504, + "complexity": 1 + } + ] + }, + { + "file": "gui/utils/window_controls.py", + "loc": 26, + "functions": [ { - "name": "_reschedule_after_callbacks", - "lineno": 558, - "complexity": 9 - }, + "name": "restore_window_buttons", + "lineno": 25, + "complexity": 6 + } + ] + }, + { + "file": "gui/utils/logger.py", + "loc": 199, + "functions": [ { - "name": "_copy_widget_bindings", - "lineno": 590, - "complexity": 11 + "name": "init_log_window", + "lineno": 45, + "complexity": 2 }, { - "name": "_copy_widget_layout", - "lineno": 632, - "complexity": 6 + "name": "set_toggle_button", + "lineno": 125, + "complexity": 1 }, { - "name": "_apply_pack_layout", - "lineno": 656, - "complexity": 10 + "name": "show_log", + "lineno": 131, + "complexity": 7 }, { - "name": "_apply_grid_layout", - "lineno": 690, - "complexity": 9 + "name": "_animate_hide", + "lineno": 157, + "complexity": 3 }, { - "name": "_configure_grid_weights", - "lineno": 721, - "complexity": 14 - }, - { - "name": "_apply_place_layout", - "lineno": 753, - "complexity": 9 - }, - { - "name": "_copy_tree_item", - "lineno": 783, - "complexity": 8 - }, - { - "name": "_cancel_after_events", - "lineno": 819, - "complexity": 1 - }, - { - "name": "_ensure_fills", - "lineno": 826, + "name": "hide_log", + "lineno": 169, "complexity": 6 }, { - "name": "_raise_widgets", - "lineno": 849, - "complexity": 9 - }, - { - "name": "_detach_tab", - "lineno": 891, - "complexity": 9 - }, - { - "name": "rewrite_option_references", - "lineno": 947, - "complexity": 19 - }, - { - "name": "rebind_scrollbars", - "lineno": 998, - "complexity": 15 - }, - { - "name": "update_canvas_windows", - "lineno": 1039, - "complexity": 10 - }, - { - "name": "_reassign_widget_references", - "lineno": 1063, + "name": "toggle_log", + "lineno": 187, "complexity": 3 }, { - "name": "_find_toolbar_frame", - "lineno": 1073, - "complexity": 14 + "name": "show_temporarily", + "lineno": 195, + "complexity": 4 }, { - "name": "_collect_expected_children", - "lineno": 1117, - "complexity": 6 + "name": "_raise_widget", + "lineno": 223, + "complexity": 2 }, { - "name": "_prune_widget_tree", - "lineno": 1138, - "complexity": 13 + "name": "_update_line_numbers", + "lineno": 231, + "complexity": 4 }, { - "name": "_traverse_widgets", - "lineno": 1179, + "name": "log_message", + "lineno": 243, "complexity": 3 - }, + } + ] + }, + { + "file": "gui/utils/detached_window.py", + "loc": 65, + "functions": [ { - "name": "_prune_duplicates", - "lineno": 1193, + "name": "__init__", + "lineno": 37, "complexity": 1 }, { - "name": "_safe_destroy", - "lineno": 1204, - "complexity": 3 - }, - { - "name": "_reset_drag", - "lineno": 1217, - "complexity": 6 - }, - { - "name": "_safe_forget", - "lineno": 486, - "complexity": 5 + "name": "add", + "lineno": 51, + "complexity": 1 }, { - "name": "_restore", - "lineno": 502, + "name": "add_moved_widget", + "lineno": 56, "complexity": 2 }, { - "name": "recurse", - "lineno": 641, - "complexity": 6 - }, - { - "name": "_on_destroy", - "lineno": 929, - "complexity": 3 + "name": "_ensure_toolbox", + "lineno": 66, + "complexity": 7 }, { - "name": "_forget", - "lineno": 184, - "complexity": 1 + "name": "_activate_hooks", + "lineno": 82, + "complexity": 4 }, { "name": "_on_destroy", - "lineno": 903, - "complexity": 3 - } - ] - }, - { - "file": "gui/utils/widget_transfer_manager.py", - "loc": 83, - "functions": [ - { - "name": "detach_tab", - "lineno": 39, - "complexity": 13 + "lineno": 95, + "complexity": 2 } ] }, @@ -631,408 +501,538 @@ ] }, { - "file": "gui/utils/tooltip.py", - "loc": 89, + "file": "gui/utils/closable_notebook.py", + "loc": 1028, "functions": [ { "name": "__init__", - "lineno": 30, - "complexity": 2 + "lineno": 57, + "complexity": 3 }, { - "name": "_schedule", - "lineno": 42, - "complexity": 1 + "name": "add", + "lineno": 170, + "complexity": 5 }, { - "name": "_show", - "lineno": 46, - "complexity": 12 + "name": "close_all_floating", + "lineno": 195, + "complexity": 4 }, { - "name": "show", - "lineno": 113, + "name": "_on_tab_press", + "lineno": 221, "complexity": 1 }, { - "name": "hide", - "lineno": 118, + "name": "_on_tab_release", + "lineno": 226, "complexity": 1 }, { - "name": "_hide", - "lineno": 122, - "complexity": 2 - }, - { - "name": "_unschedule", - "lineno": 128, - "complexity": 2 - } - ] - }, - { - "file": "gui/utils/drawing_helper.py", - "loc": 2449, - "functions": [ - { - "name": "init_diagram_canvas", - "lineno": 43, - "complexity": 3 + "name": "_on_tab_motion", + "lineno": 231, + "complexity": 1 }, { - "name": "draw_90_connection", - "lineno": 946, + "name": "_on_tab_changed", + "lineno": 240, "complexity": 1 }, { - "name": "__init__", - "lineno": 68, + "name": "_on_focus_in", + "lineno": 243, "complexity": 1 }, { - "name": "clear_cache", - "lineno": 71, - "complexity": 1 + "name": "_handle_tab_focus", + "lineno": 246, + "complexity": 5 }, { - "name": "_resolve_outline", - "lineno": 75, + "name": "_get_widget", + "lineno": 277, "complexity": 2 }, { - "name": "_interpolate_color", - "lineno": 81, + "name": "_call_method", + "lineno": 283, "complexity": 3 }, { - "name": "_fill_gradient_polygon", - "lineno": 102, - "complexity": 12 + "name": "_strategy_load_only", + "lineno": 290, + "complexity": 1 }, { - "name": "_fill_gradient_circle", - "lineno": 130, - "complexity": 4 + "name": "_strategy_swap_load_unload", + "lineno": 295, + "complexity": 3 }, { - "name": "_fill_gradient_oval", - "lineno": 156, - "complexity": 6 + "name": "_strategy_event_based", + "lineno": 304, + "complexity": 4 }, { - "name": "_fill_gradient_rect", - "lineno": 183, + "name": "_strategy_swap_event_based", + "lineno": 314, "complexity": 4 }, { - "name": "get_text_size", - "lineno": 194, + "name": "_create_close_image", + "lineno": 326, "complexity": 2 }, { - "name": "draw_page_clone_shape", - "lineno": 201, - "complexity": 1 + "name": "_on_press", + "lineno": 334, + "complexity": 5 }, { - "name": "draw_shared_marker", - "lineno": 243, - "complexity": 1 + "name": "_on_motion", + "lineno": 363, + "complexity": 4 }, { - "name": "_segment_intersection", - "lineno": 255, - "complexity": 4 + "name": "_on_release", + "lineno": 371, + "complexity": 3 }, { - "name": "point_on_shape", - "lineno": 272, - "complexity": 22 + "name": "_handle_close", + "lineno": 379, + "complexity": 9 }, { - "name": "draw_90_connection", - "lineno": 331, + "name": "_finalize_drag", + "lineno": 412, + "complexity": 6 + }, + { + "name": "_is_outside", + "lineno": 430, "complexity": 4 }, { - "name": "compute_rotated_and_gate_vertices", - "lineno": 371, - "complexity": 5 + "name": "_target_notebook", + "lineno": 438, + "complexity": 4 }, { - "name": "draw_rotated_and_gate_shape", - "lineno": 387, - "complexity": 8 + "name": "_move_tab", + "lineno": 455, + "complexity": 18 }, { - "name": "draw_rotated_or_gate_shape", - "lineno": 486, - "complexity": 15 + "name": "_replace_widget_paths", + "lineno": 541, + "complexity": 3 }, { - "name": "draw_rotated_and_gate_clone_shape", - "lineno": 594, - "complexity": 1 + "name": "_reschedule_after_callbacks", + "lineno": 558, + "complexity": 9 }, { - "name": "draw_rotated_or_gate_clone_shape", - "lineno": 635, - "complexity": 1 + "name": "_copy_widget_bindings", + "lineno": 590, + "complexity": 11 }, { - "name": "draw_triangle_shape", - "lineno": 676, - "complexity": 4 + "name": "_copy_widget_layout", + "lineno": 632, + "complexity": 6 }, { - "name": "draw_circle_event_shape", - "lineno": 765, - "complexity": 2 + "name": "_apply_pack_layout", + "lineno": 656, + "complexity": 10 }, { - "name": "draw_circle_event_clone_shape", - "lineno": 859, - "complexity": 1 + "name": "_apply_grid_layout", + "lineno": 690, + "complexity": 9 }, { - "name": "draw_triangle_clone_shape", - "lineno": 898, - "complexity": 2 + "name": "_configure_grid_weights", + "lineno": 721, + "complexity": 14 }, { - "name": "_scaled_font", - "lineno": 977, + "name": "_apply_place_layout", + "lineno": 753, + "complexity": 9 + }, + { + "name": "_copy_tree_item", + "lineno": 783, + "complexity": 8 + }, + { + "name": "_cancel_after_events", + "lineno": 819, "complexity": 1 }, { - "name": "draw_goal_shape", - "lineno": 982, - "complexity": 2 + "name": "_ensure_fills", + "lineno": 826, + "complexity": 6 }, { - "name": "draw_module_shape", - "lineno": 1027, - "complexity": 2 + "name": "_raise_widgets", + "lineno": 849, + "complexity": 9 }, { - "name": "_draw_arrow", - "lineno": 1086, - "complexity": 4 + "name": "_detach_tab", + "lineno": 891, + "complexity": 9 }, { - "name": "draw_solved_by_connection", - "lineno": 1131, - "complexity": 4 + "name": "rewrite_option_references", + "lineno": 947, + "complexity": 19 }, { - "name": "draw_in_context_connection", - "lineno": 1208, - "complexity": 4 + "name": "rebind_scrollbars", + "lineno": 998, + "complexity": 15 }, { - "name": "draw_strategy_shape", - "lineno": 1291, - "complexity": 2 + "name": "update_canvas_windows", + "lineno": 1039, + "complexity": 10 }, { - "name": "draw_solution_shape", - "lineno": 1330, - "complexity": 2 + "name": "_reassign_widget_references", + "lineno": 1063, + "complexity": 3 }, { - "name": "draw_assumption_shape", - "lineno": 1372, - "complexity": 2 + "name": "_find_toolbar_frame", + "lineno": 1073, + "complexity": 14 }, { - "name": "draw_justification_shape", - "lineno": 1427, - "complexity": 2 + "name": "_collect_expected_children", + "lineno": 1117, + "complexity": 6 }, { - "name": "draw_context_shape", - "lineno": 1482, - "complexity": 2 + "name": "_prune_widget_tree", + "lineno": 1138, + "complexity": 13 }, { - "name": "_draw_module_reference_box", - "lineno": 1585, - "complexity": 2 + "name": "_traverse_widgets", + "lineno": 1179, + "complexity": 3 }, { - "name": "draw_away_goal_shape", - "lineno": 1668, - "complexity": 2 + "name": "_prune_duplicates", + "lineno": 1193, + "complexity": 1 }, { - "name": "draw_away_solution_shape", - "lineno": 1741, - "complexity": 2 + "name": "_safe_destroy", + "lineno": 1204, + "complexity": 3 }, { - "name": "draw_away_context_shape", - "lineno": 1814, - "complexity": 2 + "name": "_reset_drag", + "lineno": 1217, + "complexity": 6 }, { - "name": "_draw_away_assumption_or_justification", - "lineno": 1906, + "name": "_safe_forget", + "lineno": 486, + "complexity": 5 + }, + { + "name": "_restore", + "lineno": 502, "complexity": 2 }, { - "name": "draw_away_assumption_shape", - "lineno": 2008, - "complexity": 1 + "name": "recurse", + "lineno": 641, + "complexity": 6 }, { - "name": "draw_away_justification_shape", - "lineno": 2038, - "complexity": 1 + "name": "_on_destroy", + "lineno": 929, + "complexity": 3 }, { - "name": "draw_away_module_shape", - "lineno": 2068, + "name": "_forget", + "lineno": 184, "complexity": 1 }, { - "name": "draw_away_context_shape", - "lineno": 2078, + "name": "_on_destroy", + "lineno": 903, "complexity": 3 + } + ] + }, + { + "file": "gui/utils/config_utils.py", + "loc": 28, + "functions": [ + { + "name": "_reload_local_config", + "lineno": 45, + "complexity": 1 }, { - "name": "_draw_away_assumption_or_justification", - "lineno": 2174, + "name": "regenerate_requirement_patterns", + "lineno": 50, + "complexity": 1 + } + ] + }, + { + "file": "gui/utils/tooltip.py", + "loc": 89, + "functions": [ + { + "name": "__init__", + "lineno": 30, "complexity": 2 }, { - "name": "draw_away_assumption_shape", - "lineno": 2248, + "name": "_schedule", + "lineno": 42, "complexity": 1 }, { - "name": "draw_away_justification_shape", - "lineno": 2278, - "complexity": 1 + "name": "_show", + "lineno": 46, + "complexity": 12 }, { - "name": "draw_away_module_shape", - "lineno": 2308, + "name": "show", + "lineno": 113, "complexity": 1 }, { - "name": "_scaled_font", - "lineno": 2319, + "name": "hide", + "lineno": 118, "complexity": 1 }, { - "name": "draw_goal_shape", - "lineno": 2325, + "name": "_hide", + "lineno": 122, "complexity": 2 }, { - "name": "draw_module_shape", - "lineno": 2339, + "name": "_unschedule", + "lineno": 128, "complexity": 2 + } + ] + }, + { + "file": "gui/utils/analysis_utils.py", + "loc": 45, + "functions": [ + { + "name": "classify_scenarios", + "lineno": 34, + "complexity": 9 }, { - "name": "_draw_module_reference_box", - "lineno": 2362, - "complexity": 2 + "name": "load_default_mechanisms", + "lineno": 56, + "complexity": 5 + } + ] + }, + { + "file": "gui/utils/name_utils.py", + "loc": 108, + "functions": [ + { + "name": "_collect_gsn_diagrams", + "lineno": 35, + "complexity": 4 }, { - "name": "draw_away_goal_shape", - "lineno": 2427, - "complexity": 2 + "name": "collect_work_product_names_v1", + "lineno": 45, + "complexity": 6 }, { - "name": "draw_away_solution_shape", - "lineno": 2456, - "complexity": 2 + "name": "collect_work_product_names_v2", + "lineno": 58, + "complexity": 8 }, { - "name": "draw_away_context_shape", - "lineno": 2515, - "complexity": 2 + "name": "collect_work_product_names_v3", + "lineno": 75, + "complexity": 6 }, { - "name": "_draw_away_assumption_or_justification", - "lineno": 2591, - "complexity": 2 + "name": "collect_work_product_names_v4", + "lineno": 85, + "complexity": 8 }, { - "name": "draw_away_assumption_shape", - "lineno": 2665, - "complexity": 1 + "name": "unique_name_v1", + "lineno": 101, + "complexity": 3 }, { - "name": "draw_away_justification_shape", - "lineno": 2671, - "complexity": 1 + "name": "unique_name_v2", + "lineno": 113, + "complexity": 3 }, { - "name": "rotate_point", - "lineno": 379, - "complexity": 1 + "name": "unique_name_v3", + "lineno": 125, + "complexity": 3 }, { - "name": "cubic_bezier", - "lineno": 504, - "complexity": 1 + "name": "unique_name_v4", + "lineno": 137, + "complexity": 3 } ] }, { - "file": "gui/utils/config_utils.py", - "loc": 28, + "file": "gui/utils/widget_transfer_manager.py", + "loc": 83, "functions": [ { - "name": "_reload_local_config", - "lineno": 45, + "name": "detach_tab", + "lineno": 39, + "complexity": 13 + } + ] + }, + { + "file": "gui/utils/__init__.py", + "loc": 24, + "functions": [ + { + "name": "add_treeview_scrollbars", + "lineno": 41, "complexity": 1 + } + ] + }, + { + "file": "gui/utils/tk_utils.py", + "loc": 99, + "functions": [ + { + "name": "cancel_after_events", + "lineno": 29, + "complexity": 30 }, { - "name": "regenerate_requirement_patterns", - "lineno": 50, - "complexity": 1 + "name": "reparent_widget", + "lineno": 100, + "complexity": 9 + }, + { + "name": "_cancel_ident", + "lineno": 35, + "complexity": 8 } ] }, { - "file": "gui/utils/window_controls.py", - "loc": 26, + "file": "gui/utils/node_utils.py", + "loc": 24, "functions": [ { - "name": "restore_window_buttons", + "name": "resolve_original", "lineno": 25, - "complexity": 6 + "complexity": 4 } ] }, { - "file": "gui/utils/analysis_utils.py", - "loc": 45, + "file": "gui/utils/table_controller.py", + "loc": 98, "functions": [ { - "name": "classify_scenarios", - "lineno": 34, - "complexity": 9 + "name": "__init__", + "lineno": 41, + "complexity": 6 }, { - "name": "load_default_mechanisms", - "lineno": 56, - "complexity": 5 + "name": "clear", + "lineno": 79, + "complexity": 1 + }, + { + "name": "insert_row", + "lineno": 84, + "complexity": 2 + }, + { + "name": "_adjust_text", + "lineno": 94, + "complexity": 8 + }, + { + "name": "adjust_text", + "lineno": 121, + "complexity": 1 + }, + { + "name": "move_up", + "lineno": 126, + "complexity": 1 + }, + { + "name": "move_down", + "lineno": 130, + "complexity": 1 } ] }, { - "file": "gui/utils/__init__.py", - "loc": 24, + "file": "gui/utils/dockable_diagram_window.py", + "loc": 107, "functions": [ { - "name": "add_treeview_scrollbars", - "lineno": 41, + "name": "__init__", + "lineno": 33, "complexity": 1 + }, + { + "name": "win", + "lineno": 39, + "complexity": 3 + }, + { + "name": "_ensure_float_container", + "lineno": 50, + "complexity": 5 + }, + { + "name": "_release_from_geometry", + "lineno": 69, + "complexity": 6 + }, + { + "name": "_on_destroy", + "lineno": 87, + "complexity": 1 + }, + { + "name": "dock", + "lineno": 96, + "complexity": 7 + }, + { + "name": "float", + "lineno": 118, + "complexity": 7 } ] } diff --git a/tests/detachment/window/test_dockable_diagram_window.py b/tests/detachment/window/test_dockable_diagram_window.py index 319f1dfa..6dbf18e5 100644 --- a/tests/detachment/window/test_dockable_diagram_window.py +++ b/tests/detachment/window/test_dockable_diagram_window.py @@ -135,6 +135,38 @@ def test_float_reparents_into_container(self) -> None: dw.win.destroy() root.destroy() + def test_float_resizes_content_with_window(self) -> None: + try: + root = tk.Tk() + except tk.TclError: + pytest.skip("Tk not available") + nb = ClosableNotebook(root) + nb.pack() + frame = ttk.Frame(nb) + canvas = tk.Canvas(frame) + canvas.pack(expand=True, fill="both") + dw = DockableDiagramWindow(frame) + + nb.add(frame, text="T1") + nb.forget(frame) + dw.float(240, 200, 0, 0, "T1") + + win = dw.win + container = dw._float_container + assert container is not None + win.update_idletasks() + initial_w, initial_h = frame.winfo_width(), frame.winfo_height() + + win.geometry("480x420+0+0") + win.update_idletasks() + container.update_idletasks() + + assert frame.winfo_width() == container.winfo_width() >= initial_w + assert frame.winfo_height() == container.winfo_height() >= initial_h + + win.destroy() + root.destroy() + def test_dock_withdraws_floating_window(self) -> None: try: root = tk.Tk()