private void RefreshExternHighlightData(System.ReadOnlySpan <uint> externNodes) { ProtoGraph? graph = _ActiveGraph?.InternalProtoGraph; ProcessRecord?processrec = graph?.ProcessData; if (processrec == null || graph is null) { return; } foreach (uint nodeIdx in externNodes) { NodeData?n = graph.GetNode(nodeIdx); System.Diagnostics.Debug.Assert(n is not null); if (!_activeHighlights.displayedModules.TryGetValue(n.GlobalModuleID, out moduleEntry modentry)) { modentry = new moduleEntry(); modentry.symbols = new Dictionary <ulong, symbolInfo>(); modentry.path = processrec.GetModulePath(n.GlobalModuleID); _activeHighlights.displayedModules.Add(n.GlobalModuleID, modentry); } if (!modentry.symbols.TryGetValue(n.Address, out symbolInfo symentry)) { symentry = new symbolInfo(); symentry.address = n.Address; symentry.selected = false; symentry.moduleID = n.GlobalModuleID; string?foundName; if (processrec.GetSymbol(n.GlobalModuleID, n.Address, out foundName) && foundName is not null) { symentry.name = foundName; } else { symentry.name = "[No Symbol Name]"; } symentry.threadNodes = new List <uint>() { n.Index }; modentry.symbols.Add(n.Address, symentry); } else { if (!symentry.threadNodes.Contains(n.Index)) { symentry.threadNodes.Add(n.Index); } } } _activeHighlights.LastExternNodeCount = externNodes.Length; }
private void DrawSymbolsSelectControls(PlottedGraph plot) { float height = 30; if (_activeHighlights.selectedHighlightTab == 0) { if (ImGui.BeginChild(ImGui.GetID("highlightSymsControls"), new Vector2(ImGui.GetContentRegionAvail().X, height))) { ImGui.AlignTextToFramePadding(); ImGui.Text($"{_activeHighlights.SelectedSymbols.Count} highlighted symbols ({plot.HighlightedSymbolNodes.Count} nodes)"); ImGui.SameLine(); ImGui.Dummy(new Vector2(6, 10)); ImGui.SameLine(); if (ImGui.Button("Clear")) { foreach (var sym in _activeHighlights.SelectedSymbols) { symbolInfo symdat = _activeHighlights.displayedModules[sym.moduleID].symbols[sym.address]; symdat.selected = false; _activeHighlights.displayedModules[sym.moduleID].symbols[sym.address] = symdat; } plot.LayoutState.Lock.EnterUpgradeableReadLock(); plot.RemoveHighlightedNodes(plot.HighlightedSymbolNodes, CONSTANTS.HighlightType.Externals); plot.LayoutState.Lock.ExitUpgradeableReadLock(); _activeHighlights.SelectedSymbols.Clear(); } /* * ImGui.SameLine(ImGui.GetContentRegionAvail().X - 100); * ImGui.PushStyleColor(ImGuiCol.Button, Themes.GetThemeColourUINT(Themes.eThemeColour.GraphBackground)); * ImGui.PushStyleColor(ImGuiCol.Text, WritableRgbaFloat.ToUint(Color.Cyan)); * if (ImGui.Button("Highlight Colour")) * { * //todo: highlight colour picker * } * ImGui.PopStyleColor(); * ImGui.PopStyleColor(); */ ImGui.EndChild(); } } }
private static void HandleMouseoverSym(PlottedGraph plot, moduleEntry module_modentry, symbolInfo syminfo) { module_modentry.symbols[syminfo.address] = syminfo; if (syminfo.hovered) { plot.AddHighlightedNodes(syminfo.threadNodes, CONSTANTS.HighlightType.Externals); } else { plot.RemoveHighlightedNodes(syminfo.threadNodes, CONSTANTS.HighlightType.Externals); } }
private void DrawModSymTreeNodes(PlottedGraph plot) { string LowerFilterText = _activeHighlights.SymFilterText.ToLower(); foreach (moduleEntry module_modentry in _activeHighlights.displayedModules.Values) { var keyslist = module_modentry.symbols.Keys.ToArray(); bool hasFilterMatches = false; bool moduleMatchesFilter = false; if (_activeHighlights.SymFilterText.Length == 0) { hasFilterMatches = true; } else if (module_modentry.path.ToLower().Contains(LowerFilterText)) { moduleMatchesFilter = true; hasFilterMatches = true; } else { foreach (ulong symaddr in keyslist) { symbolInfo syminfo = module_modentry.symbols[symaddr]; if (syminfo.name.ToLower().Contains(LowerFilterText)) { hasFilterMatches = true; break; } } } if (hasFilterMatches) { if (ImGui.TreeNode($"{module_modentry.path}")) { float cursX = ImGui.GetCursorPosX() + 75; foreach (ulong symaddr in keyslist) { symbolInfo syminfo = module_modentry.symbols[symaddr]; if (_activeHighlights.SymFilterText.Length > 0 && !moduleMatchesFilter && !syminfo.name.ToLower().Contains(_activeHighlights.SymFilterText.ToLower()) ) { continue; } ImGui.SetCursorPosX(10); ImGui.BeginGroup(); if (ImGui.Selectable($"{syminfo.name}", syminfo.selected)) { HandleSelectedSym(plot, module_modentry, syminfo); } if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) { ImGui.OpenPopup("HighlightColorPicker"); } if (ImGui.BeginPopup("HighlightColorPicker")) { ImGui.PushStyleColor(ImGuiCol.Text, 0xffffffff); ImGui.Text($"Configuring highlight colour for {syminfo.name} (0x{syminfo.address}:x)"); ImGuiColorEditFlags flags = ImGuiColorEditFlags.NoInputs; flags |= ImGuiColorEditFlags.AlphaBar; if (ImGui.ColorPicker4("Highlight Colour", ref _activeColorPick1, flags)) { foreach (uint node in syminfo.threadNodes) { plot.SetCustomHighlightColour((int)node, _activeColorPick1); } } ImGui.Text("Highlight active:"); ImGui.SameLine(); if (SmallWidgets.ToggleButton("NodeActiveHighlightToggle", syminfo.selected, "Node is highlighted")) { HandleSelectedSym(plot, module_modentry, syminfo); } ImGui.PopStyleColor(); ImGui.EndPopup(); } ImGui.SameLine(190); ImGui.Text($"0x{syminfo.address:X}"); ImGui.SameLine(305); ImGui.Text($"{syminfo.threadNodes.Count}"); ImGui.EndGroup(); if (!syminfo.selected) { if (ImGui.IsItemHovered(ImGuiHoveredFlags.None)) { if (syminfo.hovered == false) { syminfo.hovered = true; HandleMouseoverSym(plot, module_modentry, syminfo); } } else { if (syminfo.hovered == true) { syminfo.hovered = false; HandleMouseoverSym(plot, module_modentry, syminfo); } } } } ImGui.TreePop(); } } } }
private void HandleSelectedSym(PlottedGraph plot, moduleEntry module_modentry, symbolInfo syminfo) { syminfo.selected = !syminfo.selected; module_modentry.symbols[syminfo.address] = syminfo; plot.LayoutState.Lock.EnterUpgradeableReadLock(); plot.LayoutState.GetAttributes(plot.ActiveLayoutStyle, out float[]? attribsArray); if (syminfo.selected) { plot.AddHighlightedNodes(syminfo.threadNodes, CONSTANTS.HighlightType.Externals); _activeHighlights.SelectedSymbols.Add(syminfo); } else { plot.RemoveHighlightedNodes(syminfo.threadNodes, CONSTANTS.HighlightType.Externals); _activeHighlights.SelectedSymbols = _activeHighlights.SelectedSymbols.Where(s => s.address != syminfo.address).ToList(); } plot.LayoutState.Lock.ExitUpgradeableReadLock(); }