@@ -614,6 +614,7 @@ def MakeToolBar(self):
614614 tb .AddControl (level_label )
615615 tb .AddControl (self .spin )
616616
617+
617618 ### add button to define downward and upward rules
618619 ID_UPWARD = self .toggle_list [4 ]
619620 ID_DOWNWARD = self .toggle_list [5 ]
@@ -626,7 +627,11 @@ def MakeToolBar(self):
626627
627628 ##############################################################################################
628629
629- for i in (3 ,8 ,12 ,17 ,21 ):
630+ # Bouton d'information de la toolbar (NOUVEAU)
631+ ID_TOOLBAR_INFO = self .toggle_list [6 ]
632+ self .tools .append (tb .AddTool (ID_TOOLBAR_INFO , "" , load_and_resize_image ("info.png" ), shortHelp = "Toolbar Help" ))
633+
634+ for i in (3 ,8 ,12 ,17 ,21 ,23 ):
630635 tb .InsertSeparator (i )
631636
632637 ### undo and redo button desabled
@@ -638,12 +643,30 @@ def MakeToolBar(self):
638643 ### default direct connector toogled
639644 tb .ToggleTool (self .toggle_list [0 ], 1 )
640645
641- ### Binding
646+ # Bindings
642647 tool_bindings = [
643- self .OnNew , self .OnOpenFile , self .OnPrintPreview , self .OnSaveFile , self .OnSaveAsFile ,
644- self .OnUndo , self .OnRedo , self .OnZoom , self .OnUnZoom , self .AnnuleZoom ,
645- self .OnPriorityGUI , self .OnCheck , self .OnPlugins , self .OnSimulation ,
646- self .OnDirectConnector , self .OnSquareConnector , self .OnLinearConnector , self .OnCurveConnector
648+ self .OnNew ,
649+ self .OnOpenFile ,
650+ self .OnPrintPreview ,
651+ self .OnSaveFile ,
652+ self .OnSaveAsFile ,
653+ self .OnUndo ,
654+ self .OnRedo ,
655+ self .OnZoom ,
656+ self .OnUnZoom ,
657+ self .AnnuleZoom ,
658+ self .OnPriorityGUI ,
659+ self .OnCheck ,
660+ self .OnPlugins ,
661+ self .OnSimulation ,
662+ self .OnDirectConnector ,
663+ self .OnSquareConnector ,
664+ self .OnLinearConnector ,
665+ self .OnCurveConnector ,
666+ None , # Placeholder for level_label (no binding)
667+ None , # Placeholder for spin (has its own binding)
668+ self .OnDownWard ,
669+ self .OnUpWard
647670 ]
648671
649672 for tool , handler in zip (self .tools , tool_bindings ):
@@ -657,10 +680,108 @@ def MakeToolBar(self):
657680 self .Bind (wx .EVT_TOOL , self .OnUpWard , id = ID_UPWARD )
658681 self .Bind (wx .EVT_TOOL , self .OnDownWard , id = ID_DOWNWARD )
659682
683+ self .Bind (wx .EVT_TOOL , self .OnShowToolbarHelp , id = ID_TOOLBAR_INFO )
660684 tb .Realize ()
661685
662686 # self.SetToolBar(tb)
663687
688+ def OnShowToolbarHelp (self , event ):
689+ """Show help dialog about toolbar buttons"""
690+
691+ help_msg = _ (
692+ "DEVSimPy TOOLBAR GUIDE\n \n "
693+ "═══════════════════════════════════════\n \n "
694+ "FILE OPERATIONS:\n \n "
695+ "• New (📄): Create a new empty DEVS diagram\n "
696+ " Shortcut: Ctrl+N\n \n "
697+ "• Open (📂): Load an existing .dsp or .yaml diagram file\n "
698+ " Shortcut: Ctrl+O\n \n "
699+ "• Print Preview (🖨️): Preview diagram before printing\n "
700+ " Shortcut: Ctrl+P\n \n "
701+ "• Save (💾): Save current diagram to file\n "
702+ " Shortcut: Ctrl+S\n "
703+ " If file is new, will prompt for filename\n \n "
704+ "• Save As (💾+): Save diagram with a new name\n "
705+ " Creates a copy with different filename\n \n "
706+ "═══════════════════════════════════════\n \n "
707+ "EDITING OPERATIONS:\n \n "
708+ "• Undo (↶): Undo last action\n "
709+ " Click to undo once\n "
710+ " Hold to see full history\n \n "
711+ "• Redo (↷): Redo previously undone action\n "
712+ " Click to redo once\n "
713+ " Hold to see forward history\n \n "
714+ "═══════════════════════════════════════\n \n "
715+ "VIEW OPERATIONS:\n \n "
716+ "• Zoom In (🔍+): Enlarge diagram view\n "
717+ " Makes models appear bigger\n \n "
718+ "• Zoom Out (🔍-): Reduce diagram view\n "
719+ " Makes models appear smaller\n \n "
720+ "• Reset Zoom (🔍): Return to 100% normal size\n "
721+ " Cancels all zoom operations\n \n "
722+ "═══════════════════════════════════════\n \n "
723+ "DEVS TOOLS:\n \n "
724+ "• Priority (F3): Define execution order for coupled models\n "
725+ " (PyDEVS only - not available in PyPDEVS)\n \n "
726+ "• Debugger (F4): Check diagram for errors\n "
727+ " Validates model connections and structure\n "
728+ " Must run before simulation\n \n "
729+ "• Plugins: Manage DEVSimPy plugins\n "
730+ " Enable/disable extensions\n "
731+ " Configure plugin settings\n \n "
732+ "• Simulation (F5): Launch simulation dialog\n "
733+ " Start DEVS simulation process\n "
734+ " Configure simulation parameters\n \n "
735+ "═══════════════════════════════════════\n \n "
736+ "CONNECTION TYPES:\n \n "
737+ "Choose how connections between models are drawn:\n \n "
738+ "• Direct (—): Straight line connections\n "
739+ " Shortest path between ports\n \n "
740+ "• Square (⌐⌙): Right-angle connections\n "
741+ " Horizontal then vertical routing\n \n "
742+ "• Linear (╱): Diagonal straight lines\n "
743+ " Direct but with angle constraints\n \n "
744+ "• Curve (∿): Curved/bezier connections\n "
745+ " Smooth rounded paths\n \n "
746+ "═══════════════════════════════════════\n \n "
747+ "ABSTRACTION HIERARCHY:\n \n "
748+ "• Level: Select abstraction level (0-20)\n "
749+ " Level 0: Base diagram\n "
750+ " Level 1+: Abstract views with DAM/UAM\n \n "
751+ "• Downward (⬇): Configure downward abstraction rules\n "
752+ " Define how to aggregate lower levels\n \n "
753+ "• Upward (⬆): Configure upward abstraction rules\n "
754+ " Define how to detail higher levels\n \n "
755+ "Note: DAM (Downward Abstraction Manager) and UAM (Upward\n "
756+ "Abstraction Manager) are only available at level > 0\n \n "
757+ "═══════════════════════════════════════\n \n "
758+ "TIPS:\n \n "
759+ "- Always save before simulation\n "
760+ "- Run Debugger (F4) before Simulation (F5)\n "
761+ "- Use connection types for cleaner diagrams\n "
762+ "- Undo/Redo support most editing operations\n "
763+ "- Zoom controls help with large diagrams\n "
764+ "- Abstraction levels enable hierarchical modeling"
765+ )
766+
767+ try :
768+ import wx .lib .dialogs
769+ dlg = wx .lib .dialogs .ScrolledMessageDialog (
770+ self ,
771+ help_msg ,
772+ _ ("Toolbar Help" ),
773+ size = (650 , 600 )
774+ )
775+ dlg .ShowModal ()
776+ dlg .Destroy ()
777+ except Exception as e :
778+ # Fallback
779+ wx .MessageBox (
780+ help_msg ,
781+ _ ("Toolbar Help" ),
782+ wx .OK | wx .ICON_INFORMATION
783+ )
784+
664785 def GetExportPathsList (self ):
665786 """ Return the list of exported path.
666787 """
0 commit comments