2 // allwatchbrowser.cpp - All Watch
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- -----------------------------------------------------------
10 // JPM 12/07/2017 Created this file
11 // JPM 09/14/2018 Added a status bar, better status report and set information values in a tab
12 // JPM April/2019 Added a sorting filter, tableview unique rows creation
16 // Better presentation
17 // To set the information display at the right
18 // To understand/fix the problem with the sorting filter
19 // Display arrays information
20 // Display structures information
23 //#define AW_SORTINGFILTER // Authorise the sorting filtes
24 //#define AW_DEBUGNUMVARIABLE 4415 // Set the global variable number to debug
25 #ifndef AW_DEBUGNUMVARIABLE
26 #define AW_STARTNUMVARIABLE 0 // Must be kept to 0 in case of no debug is required
28 #define AW_STARTNUMVARIABLE AW_DEBUGNUMVARIABLE - 1
32 #include "debugger/allwatchbrowser.h"
34 #include "debugger/DBGManager.h"
38 AllWatchBrowserWindow::AllWatchBrowserWindow(QWidget
* parent
/*= 0*/) : QWidget(parent
, Qt::Dialog
),
39 layout(new QVBoxLayout
),
40 symbol(new QLineEdit
),
41 search(new QPushButton(tr("Search"))),
43 text(new QTextBrowser
),
45 TableView(new QTableView
),
46 model(new QStandardItemModel
),
50 statusbar(new QStatusBar
),
53 setWindowTitle(tr("All Watch"));
56 QFont
fixedFont("Lucida Console", 8, QFont::Normal
);
57 fixedFont
.setStyleHint(QFont::TypeWriter
);
60 // Set original layout
61 text
->setFont(fixedFont
);
62 layout
->addWidget(text
);
64 // Set the new layout with proper identation and readibility
65 model
->setColumnCount(3);
66 model
->setHeaderData(0, Qt::Horizontal
, QObject::tr("Name"));
67 model
->setHeaderData(1, Qt::Horizontal
, QObject::tr("Value"));
68 model
->setHeaderData(2, Qt::Horizontal
, QObject::tr("Type"));
70 TableView
->setModel(model
);
71 TableView
->setEditTriggers(QAbstractItemView::NoEditTriggers
);
72 TableView
->setShowGrid(0);
73 TableView
->setFont(fixedFont
);
74 TableView
->verticalHeader()->setDefaultSectionSize(TableView
->verticalHeader()->minimumSectionSize());
75 TableView
->verticalHeader()->setDefaultAlignment(Qt::AlignRight
);
76 layout
->addWidget(TableView
);
80 QHBoxLayout
* hbox1
= new QHBoxLayout
;
81 symbol
->setPlaceholderText("symbol name");
82 hbox1
->addWidget(symbol
);
83 hbox1
->addWidget(search
);
84 layout
->addLayout(hbox1
);
87 layout
->addWidget(statusbar
);
91 connect(search
, SIGNAL(clicked()), this, SLOT(SearchSymbol()));
92 connect(symbol
, SIGNAL(cursorPositionChanged(int, int)), this, SLOT(SelectSearchSymbol()));
97 AllWatchBrowserWindow::~AllWatchBrowserWindow(void)
103 // Search the symbol in the watch list
104 void AllWatchBrowserWindow::SearchSymbol(void)
109 // user cannot enter symbol to allow the search
110 symbol
->setDisabled(true);
112 // look for the symbol in the watch list
113 for (i
= AW_STARTNUMVARIABLE
; (i
< NbWatch
) && !found
; i
++)
115 // check symbol presence
116 if (!symbol
->text().compare(PtrWatchInfo
[i
].PtrVariableName
, Qt::CaseSensitive
))
124 // remove previous highlight
127 model
->item((int)(CurrentWatch
- 1), 0)->setBackground(QColor(255, 255, 255));
128 model
->item((int)(CurrentWatch
- 1), 1)->setBackground(QColor(255, 255, 255));
129 model
->item((int)(CurrentWatch
- 1), 2)->setBackground(QColor(255, 255, 255));
131 // Get the slider maximum position
132 int MaxSlider
= TableView
->verticalScrollBar()->maximum();
133 // Number of items displayed in the scroll bar slider
134 int DeltaSlider
= (int)NbWatch
- MaxSlider
;
135 // set the scroll bar
136 TableView
->verticalScrollBar()->setSliderPosition((int)i
- (DeltaSlider
/ 2) - 1);
137 // highlight watch symbol
139 model
->item((int)(CurrentWatch
- 1), 0)->setBackground(QColor(0xff, 0xfa, 0xcd));
140 model
->item((int)(CurrentWatch
- 1), 1)->setBackground(QColor(0xff, 0xfa, 0xcd));
141 model
->item((int)(CurrentWatch
- 1), 2)->setBackground(QColor(0xff, 0xfa, 0xcd));
148 symbol
->setStyleSheet("color: red");
151 // user can enter a symbol
152 symbol
->setEnabled(true);
158 void AllWatchBrowserWindow::SelectSearchSymbol(void)
160 symbol
->setStyleSheet("color: black");
165 void AllWatchBrowserWindow::Reset(void)
174 void AllWatchBrowserWindow::RefreshContents(void)
177 #ifdef AW_LAYOUTTEXTS
181 size_t Error
= AW_NOERROR
;
188 // Pre-catch the information for each global variables
189 if (NbWatch
= DBGManager_GetNbGlobalVariables())
191 PtrWatchInfo
= (WatchInfo
*)calloc(NbWatch
, sizeof(WatchInfo
));
192 #ifndef AW_LAYOUTTEXTS
193 #ifdef AW_SORTINGFILTER
194 TableView
->setSortingEnabled(false);
196 model
->setRowCount(0);
198 for (uint32_t i
= AW_STARTNUMVARIABLE
; i
< NbWatch
; i
++)
200 PtrWatchInfo
[i
].PtrVariableName
= DBGManager_GetGlobalVariableName(i
+ 1);
201 PtrWatchInfo
[i
].TypeTag
= DBGManager_GetGlobalVariableTypeTag(i
+ 1);
202 #ifdef AW_LAYOUTTEXTS
203 PtrWatchInfo
[i
].addr
= DBGManager_GetGlobalVariableAdr(i
+ 1);
204 if (!strlen(PtrWatchInfo
[i
].PtrVariableBaseTypeName
= DBGManager_GetGlobalVariableTypeName(i
+ 1)))
206 PtrWatchInfo
[i
].PtrVariableBaseTypeName
= (char *)"<font color='#ff0000'>N/A</font>";
209 PtrWatchInfo
[i
].PtrVariableBaseTypeName
= DBGManager_GetGlobalVariableTypeName(i
+ 1);
218 for (uint32_t i
= AW_STARTNUMVARIABLE
; i
< NbWatch
; i
++)
220 if ((PtrWatchInfo
[i
].TypeTag
& (DBG_TAG_TYPE_array
| DBG_TAG_TYPE_structure
)))
222 #if defined(AW_SUPPORTARRAY) || defined(AW_SUPPORTSTRUCTURE)
223 //PtrValue = (char *)memcpy(Value, &jaguarMainRAM[PtrWatchInfo[i].addr], 20);
231 PtrValue
= DBGManager_GetGlobalVariableValue(i
+ 1);
233 #ifdef AW_LAYOUTTEXTS
236 WatchAll
+= QString("<br>");
238 sprintf(string
, "%i : %s | %s | 0x%06X | %s", (i
+ 1), PtrWatchInfo
[i
].PtrVariableBaseTypeName
, PtrWatchInfo
[i
].PtrVariableName
, (unsigned int)PtrWatchInfo
[i
].addr
, PtrValue
? PtrValue
: (char *)"<font color='#ff0000'>N/A</font>");
239 WatchAll
+= QString(string
);
241 model
->setItem(i
, 0, new QStandardItem(QString("%1").arg(PtrWatchInfo
[i
].PtrVariableName
)));
242 model
->setItem(i
, 1, new QStandardItem(QString("%1").arg(PtrValue
)));
243 model
->setItem(i
, 2, new QStandardItem(QString("%1").arg(PtrWatchInfo
[i
].PtrVariableBaseTypeName
)));
246 #ifdef AW_LAYOUTTEXTS
248 text
->setText(WatchAll
);
250 #ifdef AW_SORTINGFILTER
251 TableView
->setSortingEnabled(true);
254 sprintf(msg
, "Ready");
258 sprintf(msg
, "No watches");
259 Error
= AW_NOALLWATCH
;
262 // Display status bar
265 if ((Error
& AW_WARNING
))
267 statusbar
->setStyleSheet("background-color: lightyellow; font: bold");
271 statusbar
->setStyleSheet("background-color: tomato; font: bold");
276 statusbar
->setStyleSheet("background-color: lightgreen; font: bold");
278 statusbar
->showMessage(QString(msg
));
283 // Handle keyboard event
284 void AllWatchBrowserWindow::keyPressEvent(QKeyEvent
* e
)
286 // ESC to close / hide the window
287 if (e
->key() == Qt::Key_Escape
)
294 if (e
->key() == Qt::Key_Return
)