15#ifndef LUA_DEBUGGER_UTILS_H
16#define LUA_DEBUGGER_UTILS_H
23#include <QKeySequence>
26#include <QStandardItem>
27#include <QStandardItemModel>
34#include "epan/wslua/wslua_debugger.h"
56 while (item && item->parent())
58 item = item->parent();
66 bool rootExpanded =
false;
80 const QString &rootKey,
const QString &key,
bool expanded);
84 const QString &rootKey);
89namespace LuaDebuggerSettingsKeys
91constexpr const char *Theme =
"theme";
94constexpr const char *MainSplitter =
"mainSplitterState";
95constexpr const char *LeftSplitter =
"leftSplitterState";
96constexpr const char *EvalSplitter =
"evalSplitterState";
97constexpr const char *SectionVariables =
"sectionVariables";
98constexpr const char *SectionStack =
"sectionStack";
99constexpr const char *SectionFiles =
"sectionFiles";
100constexpr const char *SectionBreakpoints =
"sectionBreakpoints";
101constexpr const char *SectionEval =
"sectionEval";
102constexpr const char *SectionSettings =
"sectionSettings";
103constexpr const char *SectionWatch =
"sectionWatch";
104constexpr const char *Breakpoints =
"breakpoints";
105constexpr const char *Watches =
"watches";
109constexpr qint32 FileTreePathRole =
static_cast<qint32
>(Qt::UserRole);
110constexpr qint32 FileTreeIsDirectoryRole =
static_cast<qint32
>(Qt::UserRole + 1);
111constexpr qint32 BreakpointFileRole =
static_cast<qint32
>(Qt::UserRole + 2);
112constexpr qint32 BreakpointLineRole =
static_cast<qint32
>(Qt::UserRole + 3);
113constexpr qint32 BreakpointConditionRole =
static_cast<qint32
>(Qt::UserRole + 30);
114constexpr qint32 BreakpointHitCountRole =
static_cast<qint32
>(Qt::UserRole + 31);
115constexpr qint32 BreakpointHitTargetRole =
static_cast<qint32
>(Qt::UserRole + 32);
116constexpr qint32 BreakpointConditionErrRole =
static_cast<qint32
>(Qt::UserRole + 33);
117constexpr qint32 BreakpointLogMessageRole =
static_cast<qint32
>(Qt::UserRole + 34);
118constexpr qint32 BreakpointHitModeRole =
static_cast<qint32
>(Qt::UserRole + 35);
119constexpr qint32 BreakpointLogAlsoPauseRole =
static_cast<qint32
>(Qt::UserRole + 36);
120constexpr qint32 StackItemFileRole =
static_cast<qint32
>(Qt::UserRole + 4);
121constexpr qint32 StackItemLineRole =
static_cast<qint32
>(Qt::UserRole + 5);
122constexpr qint32 StackItemNavigableRole =
static_cast<qint32
>(Qt::UserRole + 6);
123constexpr qint32 StackItemLevelRole =
static_cast<qint32
>(Qt::UserRole + 7);
124constexpr qint32 VariablePathRole =
static_cast<qint32
>(Qt::UserRole + 8);
125constexpr qint32 VariableTypeRole =
static_cast<qint32
>(Qt::UserRole + 9);
126constexpr qint32 VariableCanExpandRole =
static_cast<qint32
>(Qt::UserRole + 10);
127constexpr qint32 WatchSpecRole =
static_cast<qint32
>(Qt::UserRole + 11);
128constexpr qint32 WatchSubpathRole =
static_cast<qint32
>(Qt::UserRole + 13);
129constexpr qint32 WatchPendingNewRole =
static_cast<qint32
>(Qt::UserRole + 15);
130constexpr qint32 ChangedFlashSerialRole =
static_cast<qint32
>(Qt::UserRole + 20);
132constexpr qsizetype WATCH_TOOLTIP_MAX_CHARS = 4096;
133constexpr int WATCH_EXPR_MAX_CHARS = 65536;
134constexpr int CHANGED_FLASH_MS = 500;
135constexpr int WATCH_PLACEHOLDER_DEFER_MS = 250;
136constexpr QChar CHANGE_KEY_SEP = QChar(0x1F);
141extern const QKeySequence kLuaDbgCtxGoToLine;
142extern const QKeySequence kLuaDbgCtxRunToLine;
143extern const QKeySequence kLuaDbgCtxWatchEdit;
144extern const QKeySequence kLuaDbgCtxWatchCopyValue;
145extern const QKeySequence kLuaDbgCtxWatchDuplicate;
146extern const QKeySequence kLuaDbgCtxWatchRemoveAll;
147extern const QKeySequence kLuaDbgCtxAddWatch;
148extern const QKeySequence kLuaDbgCtxToggleBreakpoint;
149extern const QKeySequence kLuaDbgCtxReloadLuaPlugins;
150extern const QKeySequence kLuaDbgCtxRemoveAllBreakpoints;
159namespace LuaDebuggerItems
165 if (!indexInRow.isValid())
169 return indexInRow.sibling(indexInRow.row(), col).data(Qt::DisplayRole).toString();
173inline QStandardItem *
rowCol0(QStandardItemModel *model, QStandardItem *cell)
179 const QModelIndex ix = model->indexFromItem(cell);
184 return model->itemFromIndex(ix.sibling(ix.row(), 0));
188inline QStandardItem *
cellAt(QStandardItemModel *model, QStandardItem *col0,
int col)
190 if (!model || !col0 || col0->column() != 0)
194 QStandardItem *par = col0->parent();
197 return model->item(col0->row(), col);
199 return par->child(col0->row(), col);
202inline QString text(QStandardItemModel *model, QStandardItem *col0,
int col)
204 QStandardItem *c = cellAt(model, col0, col);
205 return c ? c->text() : QString();
208inline void setText(QStandardItemModel *model, QStandardItem *col0,
int col,
const QString &t)
210 QStandardItem *c =
cellAt(model, col0, col);
217inline void setToolTip(QStandardItemModel *model, QStandardItem *col0,
int col,
const QString &tip)
219 QStandardItem *c =
cellAt(model, col0, col);
226inline void setFont(QStandardItemModel *model, QStandardItem *col0,
int col,
const QFont &font)
228 QStandardItem *c =
cellAt(model, col0, col);
235inline void setForeground(QStandardItemModel *model, QStandardItem *col0,
int col,
const QBrush &brush)
237 QStandardItem *c =
cellAt(model, col0, col);
240 c->setForeground(brush);
244inline void setBackground(QStandardItemModel *model, QStandardItem *col0,
int col,
const QBrush &brush)
246 QStandardItem *c =
cellAt(model, col0, col);
249 c->setBackground(brush);
253inline void setIcon(QStandardItemModel *model, QStandardItem *col0,
int col,
const QIcon &icon)
255 QStandardItem *c =
cellAt(model, col0, col);
262inline void setTextAlignment(QStandardItemModel *model, QStandardItem *col0,
int col, Qt::Alignment align)
264 QStandardItem *c =
cellAt(model, col0, col);
267 c->setTextAlignment(align);
271inline QModelIndex indexCol0(QStandardItemModel *model, QStandardItem *col0)
273 if (!model || !col0 || col0->column() != 0)
275 return QModelIndex();
277 return model->indexFromItem(col0);
280inline bool isExpanded(QTreeView *tree, QStandardItemModel *model, QStandardItem *col0)
282 const QModelIndex ix = indexCol0(model, col0);
283 return ix.isValid() && tree->isExpanded(ix);
286inline void setExpanded(QTreeView *tree, QStandardItemModel *model, QStandardItem *col0,
bool expanded)
288 const QModelIndex ix = indexCol0(model, col0);
291 tree->setExpanded(ix, expanded);
299namespace LuaDebuggerPath
302bool watchSpecIsGlobalScoped(
const QString &spec);
304bool variablesPathIsGlobalScoped(
const QString &path);
306QString changeKey(
int stackLevel,
const QString &path);
308QString watchSpecFromChangeKey(
const QString &key);
310QString stripWatchExpressionErrorPrefix(
const QString &errStr);
312template <
class Key,
class Map>
313bool shouldMarkChanged(
const Map &baseline,
const Key &key,
const QString &newVal,
bool flashNew =
false)
315 const auto it = baseline.constFind(key);
316 if (it != baseline.constEnd())
318 return *it != newVal;
320 return flashNew && !baseline.isEmpty();
323QString variableSectionRootKeyFromItem(
const QStandardItem *item);
325bool watchSpecUsesPathResolution(
const QString &spec);
327QString variableTreeChildPath(
const QString &parentPath,
const QString &nameText);
329QString expressionWatchChildSubpath(
const QString &parentSubpath,
const QString &nameText);
331bool variableChildrenShouldSortByName(
const QString &parentPath);
338 bool canExpand =
false;
344void applyVariableExpansionIndicator(QStandardItem *anchor,
bool canExpand,
bool enabledOnlyPlaceholder,
345 int columnCount = 3);
347QString watchVariablePathForSpec(
const QString &spec);
349QString watchResolvedVariablePathForTooltip(
const QString &spec);
351void watchRootSetVariablePathRoleFromSpec(QStandardItem *row,
const QString &spec);
353QString watchPathOriginSuffix(
const QStandardItem *item,
const QString &spec);
355QString capWatchTooltipText(
const QString &s);
357QString watchPathParentKey(
const QString &path);
359void applyWatchChildRowTextAndTooltip(QStandardItem *specItem,
const QString &rawVal,
const QString &typeText);
361int watchSubpathBoundaryCount(
const QString &subpath);
363QStandardItem *findWatchItemBySubpathOrPathKey(QStandardItem *subtree,
const QString &key);
365QStandardItem *findVariableTreeItemByPathKey(QStandardItem *subtree,
const QString &key);
367using TreePathKeyFinder = QStandardItem *(*)(QStandardItem *,
const QString &);
369void reexpandTreeDescendantsByPathKeys(QTreeView *tree, QStandardItemModel *model, QStandardItem *subtree,
370 QStringList pathKeys, TreePathKeyFinder findByKey);
372void reexpandWatchDescendantsByPathKeys(QTreeView *tree, QStandardItemModel *model, QStandardItem *subtree,
373 QStringList pathKeys);
375void clearWatchFilterErrorChrome(QStandardItem *specItem, QTreeView *tree);
377void applyWatchFilterErrorChrome(QStandardItem *specItem, QTreeView *tree);
379void setupWatchRootItemFromSpec(QStandardItem *specItem, QStandardItem *valueItem,
const QString &spec);
381QStandardItem *findVariableItemByPathRecursive(QStandardItem *node,
const QString &path);
383QString watchItemExpansionKey(
const QStandardItem *item);
396 const QFont &baseFont,
const QColor &color,
408 const QFont &baseFont,
const QPalette &palette,
413extern const QString kLuaDbgHeaderMinus;
426extern const QString kLuaDbgHeaderToolButtonStyle;
428enum class LuaDbgBpHeaderIconMode
435QIcon luaDbgBreakpointHeaderIconForMode(
const QFont *editorFont, LuaDbgBpHeaderIconMode mode,
int headerSide,
438void styleLuaDebuggerHeaderBreakpointToggleButton(QToolButton *btn,
int side);
440void styleLuaDebuggerHeaderFittedTextButton(QToolButton *btn,
int side,
const QFont &titleFont,
441 const QStringList &glyphs);
443void styleLuaDebuggerHeaderPlusMinusButton(QToolButton *btn,
int side,
const QFont &titleFont);
445void styleLuaDebuggerHeaderIconOnlyButton(QToolButton *btn,
int side);
478 void attach(Ui::LuaDebuggerDialog *ui, QTreeView *breakpointsTree);
496 Ui::LuaDebuggerDialog *ui_ =
nullptr;
497 QTreeView *breakpointsTree_ =
nullptr;
538 void refreshChangedValueBrushes(QTreeView *watchTree, QWidget *paletteFallback);
540 void snapshotBaselinesOnPauseEntry();
542 void updatePauseEntryFrameIdentity();
544 void setPauseEntryStackLevel(
int level) { pauseEntryStackLevel_ = level; }
562 void clearAllChangeBaselines();
569 void clearChangeBaselinesForWatchSpec(
const QString &spec);
571 void pruneChangeBaselinesToLiveWatchSpecs(QStandardItemModel *watchModel);
573 bool changeHighlightAllowed(
int stackSelectionLevel)
const;
600 QHash<QString , QString> watchRootBaseline_;
601 QHash<QString , QString> watchRootCurrent_;
602 QHash<QString , QHash<QString , QString>> watchChildBaseline_;
603 QHash<QString , QHash<QString , QString>> watchChildCurrent_;
604 QHash<QString , QString> variablesBaseline_;
605 QHash<QString , QString> variablesCurrent_;
607 QSet<QString > variablesBaselineParents_;
608 QSet<QString > variablesCurrentParents_;
609 QHash<QString , QSet<QString >> watchChildBaselineParents_;
610 QHash<QString , QSet<QString >> watchChildCurrentParents_;
612 QBrush changedValueBrush_;
613 QBrush changedFlashBrush_;
614 bool isPauseEntryRefresh_ =
false;
615 qint32 flashSerial_ = 0;
616 int pauseEntryStackLevel_ = 0;
617 QString pauseEntryFrame0Identity_;
618 bool pauseEntryFrame0MatchesPrev_ =
false;
"Value changed since last pause" highlighter for the Watch and Variables trees.
Definition lua_debugger_utils.h:534
bool observeWatchRootValue(const QString &rootKey, const QString &value)
Record the latest value for a watch root keyed by the composite rootKey. Returns true if the new valu...
Definition lua_debugger_utils.cpp:1318
void setPauseEntryRefresh(bool active)
Toggle the pause-entry refresh flag. The dialog turns it on for the duration of the pause-entry refre...
Definition lua_debugger_utils.h:550
bool observeVariablesValue(const QString &variablesKey, const QString &value, bool parentVisited)
Variables-tree counterpart to observeWatchChildValue.
Definition lua_debugger_utils.cpp:1348
bool observeVariablesParent(const QString &parentKey)
Variables-tree counterpart to observeWatchChildParent.
Definition lua_debugger_utils.cpp:1341
void applyChangedVisuals(QObject *timerOwner, QStandardItem *anchor, bool changed)
Stamp the anchor row with the change visuals; isPauseEntryRefresh_ is consulted internally so callers...
Definition lua_debugger_utils.cpp:1246
bool observeWatchChildValue(const QString &rootKey, const QString &childPath, const QString &value, bool parentVisited)
Record the latest value for a watch-child row at rootKey/childPath. parentVisited is the result of ob...
Definition lua_debugger_utils.cpp:1332
void clearWatchBaselines()
Wipe watch-side baselines (root + child value maps and visited-parent sets). Variables-tree maps are ...
Definition lua_debugger_utils.cpp:1308
bool observeWatchChildParent(const QString &rootKey, const QString &parentPath)
Record parentPath as a visited parent in the watch-child visited-parents set keyed by rootKey....
Definition lua_debugger_utils.cpp:1325
Top-level dialog hosting the Lua debugger UI components.
Definition lua_debugger_dialog.h:165
Centralised keyboard-shortcut dispatcher for the Lua debugger dialog's eventFilter().
Definition lua_debugger_utils.h:470
bool reserveShortcutOverride(const QKeyEvent *ke) const
Pre-empt a debugger-owned shortcut on QEvent::ShortcutOverride.
Definition lua_debugger_utils.cpp:1007
bool handleKeyPress(QObject *obj, const QKeyEvent *ke)
Handle a QEvent::KeyPress delivered to the debugger UI.
Definition lua_debugger_utils.cpp:1023
void attach(Ui::LuaDebuggerDialog *ui, QTreeView *breakpointsTree)
Wire the router to the dialog's Ui struct and breakpoints tree. Must be called once,...
Definition lua_debugger_utils.cpp:1001
const QString kLuaDbgHeaderEdit
Definition lua_debugger_utils.cpp:651
QStringList luaDbgTreeSectionExpandedSubpaths(const QHash< QString, LuaDbgTreeSectionExpansionState > &map, const QString &rootKey)
Expanded-descendant subpaths recorded for rootKey, or empty.
Definition lua_debugger_utils.cpp:120
const QString kLuaDbgRowExtras
Definition lua_debugger_utils.cpp:654
void luaDbgRecordTreeSectionRootExpansion(QHash< QString, LuaDbgTreeSectionExpansionState > &map, const QString &rootKey, bool expanded)
Record / clear root-level expansion for rootKey in map. Mutates map in place; collapsing a root with ...
Definition lua_debugger_utils.cpp:71
QIcon luaDbgPaintedGlyphIcon(const QString &glyph, int side, qreal dpr, const QFont &baseFont, const QColor &color, int margin=1)
Definition lua_debugger_utils.cpp:701
QStandardItem * luaDbgWatchRootItem(QStandardItem *item)
Definition lua_debugger_utils.h:54
void luaDbgRecordTreeSectionSubpathExpansion(QHash< QString, LuaDbgTreeSectionExpansionState > &map, const QString &rootKey, const QString &key, bool expanded)
Add / remove one descendant subpath key under rootKey in map. Mirrors luaDbgRecordTreeSectionRootExpa...
Definition lua_debugger_utils.cpp:90
const QString kLuaDbgHeaderPlus
Definition lua_debugger_utils.cpp:649
const QString kLuaDbgHeaderRemoveAll
Definition lua_debugger_utils.cpp:652
constexpr const char * DebuggerEnabled
Definition lua_debugger_utils.h:93
QString rowColumnDisplayText(const QModelIndex &indexInRow, int col)
Definition lua_debugger_utils.h:163
QKeySequence luaDbgSeqFromKeyEvent(const QKeyEvent *ke)
Build a key sequence from a key event for matching against QAction shortcuts. Wraps the Qt5/Qt6 modif...
Definition lua_debugger_utils.cpp:146
QString luaDebuggerSettingsFilePath()
Definition lua_debugger_utils.cpp:65
QIcon luaDbgMakeSelectionAwareIcon(const QIcon &base, const QPalette &palette)
Definition lua_debugger_utils.cpp:862
constexpr int kLuaDbgEvalOutputMaxLines
Definition lua_debugger_utils.h:139
QIcon luaDbgPaintedGlyphButtonIcon(const QString &glyph, int side, qreal dpr, const QFont &baseFont, const QPalette &palette, int margin=2)
Definition lua_debugger_utils.cpp:776
QStandardItem * rowCol0(QStandardItemModel *model, QStandardItem *cell)
Definition lua_debugger_utils.h:173
const QString kLuaDbgRowLog
Definition lua_debugger_utils.cpp:653
QStandardItem * cellAt(QStandardItemModel *model, QStandardItem *col0, int col)
Definition lua_debugger_utils.h:188
Definition lua_debugger_utils.h:65
Definition lua_debugger_utils.h:334
Variable structure for inspection.
Definition wslua_debugger.h:421