From 5252d817ccb2f1acd25b6457c35512bcffcb6eda Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:45:24 +0200 Subject: [PATCH 1/6] Update --- flixopt/network_app.py | 48 +++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/flixopt/network_app.py b/flixopt/network_app.py index 957b9e4dd..7b43e372b 100644 --- a/flixopt/network_app.py +++ b/flixopt/network_app.py @@ -547,6 +547,7 @@ def toggle_sidebar(n_clicks): Input('edge-color-picker', 'value'), Input('node-size-slider', 'value'), Input('font-size-slider', 'value'), + Input('reset-btn', 'n_clicks'), # Add reset button as trigger ], [State('elements-store', 'data')], ) @@ -560,25 +561,37 @@ def update_visualization( edge_color, node_size, font_size, + reset_clicks, stored_elements, ): if not stored_elements: return no_update, no_update + ctx = callback_context + triggered_id = ctx.triggered[0]['prop_id'].split('.')[0] if ctx.triggered else None + + # Check if color scheme dropdown was changed or reset was clicked + use_preset = ( + triggered_id == 'color-scheme-dropdown' or triggered_id == 'reset-btn' or not any(ctx.triggered) + ) # Initial load + # Determine colors to use - if any(picker for picker in [bus_color, source_color, sink_color, storage_color, converter_color, edge_color]): + if use_preset: + # Use preset scheme colors + colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) + edge_color_hex = 'gray' # Default edge color for presets + else: # Use custom colors from pickers + default_colors = VisualizationConfig.DEFAULT_COLORS colors = { - 'Bus': bus_color.get('hex') if bus_color else '#7F8C8D', - 'Source': source_color.get('hex') if source_color else '#F1C40F', - 'Sink': sink_color.get('hex') if sink_color else '#F1C40F', - 'Storage': storage_color.get('hex') if storage_color else '#2980B9', - 'Converter': converter_color.get('hex') if converter_color else '#D35400', - 'Other': '#27AE60', + 'Bus': bus_color.get('hex') if bus_color else default_colors['Bus'], + 'Source': source_color.get('hex') if source_color else default_colors['Source'], + 'Sink': sink_color.get('hex') if sink_color else default_colors['Sink'], + 'Storage': storage_color.get('hex') if storage_color else default_colors['Storage'], + 'Converter': converter_color.get('hex') if converter_color else default_colors['Converter'], + 'Other': default_colors['Other'], } - else: - # Use preset scheme - colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) + edge_color_hex = edge_color.get('hex') if edge_color else 'gray' # Update element colors updated_elements = [] @@ -594,7 +607,6 @@ def update_visualization( updated_elements.append(element) # Create stylesheet - edge_color_hex = edge_color.get('hex') if edge_color else 'gray' stylesheet = [ { 'selector': 'node', @@ -685,12 +697,6 @@ def update_layout(selected_layout): @app.callback( [ Output('color-scheme-dropdown', 'value'), - Output('bus-color-picker', 'value'), - Output('source-color-picker', 'value'), - Output('sink-color-picker', 'value'), - Output('storage-color-picker', 'value'), - Output('converter-color-picker', 'value'), - Output('edge-color-picker', 'value'), Output('node-size-slider', 'value'), Output('font-size-slider', 'value'), Output('layout-dropdown', 'value'), @@ -700,13 +706,7 @@ def update_layout(selected_layout): def reset_controls(n_clicks): if n_clicks and n_clicks > 0: return ( - 'Default', # color scheme - {'hex': '#7F8C8D'}, # bus - {'hex': '#F1C40F'}, # source - {'hex': '#F1C40F'}, # sink - {'hex': '#2980B9'}, # storage - {'hex': '#D35400'}, # converter - {'hex': '#808080'}, # edge + 'Default', # color scheme - this will trigger the main callback 90, # node size 10, # font size 'klay', # layout From 18415c11eb21bf3b303c35d226e33fef12515a39 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:46:51 +0200 Subject: [PATCH 2/6] Update colorpickers from scheme --- flixopt/network_app.py | 72 ++++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/flixopt/network_app.py b/flixopt/network_app.py index 7b43e372b..c19a9050c 100644 --- a/flixopt/network_app.py +++ b/flixopt/network_app.py @@ -535,10 +535,33 @@ def toggle_sidebar(n_clicks): return sidebar_style, main_style + # Add this new callback to sync color pickers with color scheme + @app.callback( + [ + Output('bus-color-picker', 'value'), + Output('source-color-picker', 'value'), + Output('sink-color-picker', 'value'), + Output('storage-color-picker', 'value'), + Output('converter-color-picker', 'value'), + ], + [Input('color-scheme-dropdown', 'value')], + ) + def update_color_pickers(color_scheme): + """Update color pickers when color scheme changes""" + colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) + + return ( + {'hex': colors['Bus']}, + {'hex': colors['Source']}, + {'hex': colors['Sink']}, + {'hex': colors['Storage']}, + {'hex': colors['Converter']}, + ) + + # Updated main visualization callback - simplified logic @app.callback( [Output('cytoscape', 'elements'), Output('cytoscape', 'stylesheet')], [ - Input('color-scheme-dropdown', 'value'), Input('bus-color-picker', 'value'), Input('source-color-picker', 'value'), Input('sink-color-picker', 'value'), @@ -547,12 +570,10 @@ def toggle_sidebar(n_clicks): Input('edge-color-picker', 'value'), Input('node-size-slider', 'value'), Input('font-size-slider', 'value'), - Input('reset-btn', 'n_clicks'), # Add reset button as trigger ], [State('elements-store', 'data')], ) def update_visualization( - color_scheme, bus_color, source_color, sink_color, @@ -561,37 +582,22 @@ def update_visualization( edge_color, node_size, font_size, - reset_clicks, stored_elements, ): + """Update visualization based on current color picker values""" if not stored_elements: return no_update, no_update - ctx = callback_context - triggered_id = ctx.triggered[0]['prop_id'].split('.')[0] if ctx.triggered else None - - # Check if color scheme dropdown was changed or reset was clicked - use_preset = ( - triggered_id == 'color-scheme-dropdown' or triggered_id == 'reset-btn' or not any(ctx.triggered) - ) # Initial load - - # Determine colors to use - if use_preset: - # Use preset scheme colors - colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) - edge_color_hex = 'gray' # Default edge color for presets - else: - # Use custom colors from pickers - default_colors = VisualizationConfig.DEFAULT_COLORS - colors = { - 'Bus': bus_color.get('hex') if bus_color else default_colors['Bus'], - 'Source': source_color.get('hex') if source_color else default_colors['Source'], - 'Sink': sink_color.get('hex') if sink_color else default_colors['Sink'], - 'Storage': storage_color.get('hex') if storage_color else default_colors['Storage'], - 'Converter': converter_color.get('hex') if converter_color else default_colors['Converter'], - 'Other': default_colors['Other'], - } - edge_color_hex = edge_color.get('hex') if edge_color else 'gray' + # Use colors from pickers (which are now synced with scheme selection) + default_colors = VisualizationConfig.DEFAULT_COLORS + colors = { + 'Bus': bus_color.get('hex') if bus_color else default_colors['Bus'], + 'Source': source_color.get('hex') if source_color else default_colors['Source'], + 'Sink': sink_color.get('hex') if sink_color else default_colors['Sink'], + 'Storage': storage_color.get('hex') if storage_color else default_colors['Storage'], + 'Converter': converter_color.get('hex') if converter_color else default_colors['Converter'], + 'Other': default_colors['Other'], + } # Update element colors updated_elements = [] @@ -607,6 +613,7 @@ def update_visualization( updated_elements.append(element) # Create stylesheet + edge_color_hex = edge_color.get('hex') if edge_color else 'gray' stylesheet = [ { 'selector': 'node', @@ -693,23 +700,26 @@ def display_element_info(node_data, edge_data): def update_layout(selected_layout): return {'name': selected_layout} - # Reset callback + # Updated reset callback to include color pickers @app.callback( [ Output('color-scheme-dropdown', 'value'), Output('node-size-slider', 'value'), Output('font-size-slider', 'value'), Output('layout-dropdown', 'value'), + Output('edge-color-picker', 'value'), ], [Input('reset-btn', 'n_clicks')], ) def reset_controls(n_clicks): + """Reset all controls to defaults""" if n_clicks and n_clicks > 0: return ( - 'Default', # color scheme - this will trigger the main callback + 'Default', # color scheme (will trigger color picker updates) 90, # node size 10, # font size 'klay', # layout + {'hex': '#808080'}, # edge color ) return no_update From a598a0ea7b1a4e49d031b513ca2271c8dbfdbb8f Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Fri, 19 Sep 2025 09:29:39 +0200 Subject: [PATCH 3/6] Improve color picker and scheme handling --- flixopt/network_app.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/flixopt/network_app.py b/flixopt/network_app.py index c19a9050c..cdec24898 100644 --- a/flixopt/network_app.py +++ b/flixopt/network_app.py @@ -535,7 +535,7 @@ def toggle_sidebar(n_clicks): return sidebar_style, main_style - # Add this new callback to sync color pickers with color scheme + # Combined callback to handle both color scheme changes and reset @app.callback( [ Output('bus-color-picker', 'value'), @@ -544,11 +544,24 @@ def toggle_sidebar(n_clicks): Output('storage-color-picker', 'value'), Output('converter-color-picker', 'value'), ], - [Input('color-scheme-dropdown', 'value')], + [Input('color-scheme-dropdown', 'value'), Input('reset-btn', 'n_clicks')], ) - def update_color_pickers(color_scheme): - """Update color pickers when color scheme changes""" - colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) + def update_color_pickers(color_scheme, reset_clicks): + """Update color pickers when color scheme changes or reset is clicked""" + ctx = callback_context + + # Determine which input triggered the callback + if ctx.triggered: + trigger_id = ctx.triggered[0]['prop_id'].split('.')[0] + if trigger_id == 'reset-btn' and reset_clicks and reset_clicks > 0: + # Reset was clicked, use default colors + colors = VisualizationConfig.DEFAULT_COLORS + else: + # Color scheme changed + colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) + else: + # Initial load + colors = VisualizationConfig.COLOR_PRESETS.get(color_scheme, VisualizationConfig.DEFAULT_COLORS) return ( {'hex': colors['Bus']}, @@ -700,26 +713,26 @@ def display_element_info(node_data, edge_data): def update_layout(selected_layout): return {'name': selected_layout} - # Updated reset callback to include color pickers + # Reset callback for non-color-picker controls @app.callback( [ Output('color-scheme-dropdown', 'value'), + Output('edge-color-picker', 'value'), Output('node-size-slider', 'value'), Output('font-size-slider', 'value'), Output('layout-dropdown', 'value'), - Output('edge-color-picker', 'value'), ], [Input('reset-btn', 'n_clicks')], ) def reset_controls(n_clicks): - """Reset all controls to defaults""" + """Reset all controls to defaults (color pickers handled separately)""" if n_clicks and n_clicks > 0: return ( 'Default', # color scheme (will trigger color picker updates) + {'hex': '#808080'}, # edge color 90, # node size 10, # font size 'klay', # layout - {'hex': '#808080'}, # edge color ) return no_update From 4dcc0390227af5ccfe4b427ea536df5cf06e2a93 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:49:09 +0200 Subject: [PATCH 4/6] Update CHANGELOG.md --- CHANGELOG.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c7c80efa..4be71294f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,9 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] - ????-??-?? + +### Changed + +### Added + +### Deprecated + +### Fixed +- Fixed bug in the network_app that caused the color schemes to not work. Further, color pickers are now updated when selecting a color scheme. + +### Known issues + +### Development + ## [2.1.7] - 2025-09-13 This update is a maintenance release to improve Code Quality, CI and update the dependencies. From b8db1deaa611a0ca2a104048b0101c51830d55ba Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:38:01 +0200 Subject: [PATCH 5/6] Improve CHANGELOG.md --- CHANGELOG.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4be71294f..cac744301 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] - ????-??-?? - -### Changed +## [Unreleased] ### Added +### Changed + ### Deprecated ### Fixed -- Fixed bug in the network_app that caused the color schemes to not work. Further, color pickers are now updated when selecting a color scheme. +- Fix color scheme selection in network_app; color pickers now update when a scheme is selected. ### Known issues -### Development +### *Development* ## [2.1.7] - 2025-09-13 From ee74b8c7257a6aa79070581c83d396c024f6ac23 Mon Sep 17 00:00:00 2001 From: FBumann <117816358+FBumann@users.noreply.github.com> Date: Sun, 21 Sep 2025 20:42:45 +0200 Subject: [PATCH 6/6] Improved CHANGELOG.md template --- CHANGELOG.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cac744301..151d9758a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,12 +13,14 @@ Please remove all irrelevant sections before releasing. ## [Unreleased] - ????-??-?? -### Changed - ### Added +### Changed + ### Deprecated +### Removed + ### Fixed ### Known issues @@ -35,10 +37,12 @@ Until here --> ### Deprecated +### Removed + ### Fixed - Fix color scheme selection in network_app; color pickers now update when a scheme is selected. -### Known issues +### Known Issues ### *Development* @@ -50,7 +54,7 @@ There are no changes or new features. ### Added - Added __version__ to flixopt -### Development +### *Development* - ruff format the whole Codebase - Added renovate config - Added pre-commit