2 // CartFilesListWin.cpp - List files in the cartdridge
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- -----------------------------------------------------------
10 // JPM 10/26/2018 Created this file
14 // To allow file opening / viewing
15 // Remove/modify the 1st information, named '1', at the top
19 #include "debugger/CartFilesListWin.h"
22 #include "debugger/DBGManager.h"
26 CartFilesListWindow::CartFilesListWindow(QWidget
* parent
/*= 0*/) : QWidget(parent
, Qt::Dialog
),
27 TableView(new QTableView
),
28 model(new QStandardItemModel
),
29 layout(new QVBoxLayout
),
30 treeView(new QTreeView
),
31 standardModel(new QStandardItemModel
),
32 rootNode(new QStandardItem
),
34 statusbar(new QStatusBar
),
38 CartDirType(CFL_NOTYPE
)
40 setWindowTitle(tr("Cartdridge directory & files"));
43 QFont
fixedFont("Lucida Console", 8, QFont::Normal
);
44 fixedFont
.setStyleHint(QFont::TypeWriter
);
46 // Set the new layout with proper identation and readibility
47 #ifdef CFL_BUFFERTREAM
48 model
->setColumnCount(5);
50 model
->setColumnCount(4);
52 model
->setHeaderData(0, Qt::Horizontal
, QObject::tr("File"));
53 model
->setHeaderData(1, Qt::Horizontal
, QObject::tr("Address"));
54 model
->setHeaderData(2, Qt::Horizontal
, QObject::tr("Size"));
55 model
->setHeaderData(3, Qt::Horizontal
, QObject::tr("Seek"));
56 #ifdef CFL_BUFFERTREAM
57 model
->setHeaderData(4, Qt::Horizontal
, QObject::tr("Stream"));
60 TableView
->setModel(model
);
61 TableView
->setEditTriggers(QAbstractItemView::NoEditTriggers
);
62 TableView
->setShowGrid(0);
63 TableView
->setFont(fixedFont
);
64 TableView
->verticalHeader()->setDefaultSectionSize(TableView
->verticalHeader()->minimumSectionSize());
65 TableView
->verticalHeader()->setDefaultAlignment(Qt::AlignRight
);
66 layout
->addWidget(TableView
);
69 rootNode
= standardModel
->invisibleRootItem();
71 treeView
->setModel(standardModel
);
72 treeView
->expandAll();
73 layout
->addWidget(treeView
);
76 layout
->addWidget(statusbar
);
82 CartFilesListWindow::~CartFilesListWindow(void)
88 void CartFilesListWindow::Reset(void)
90 standardModel
->setRowCount(0);
91 model
->setRowCount(0);
96 CartUsedBytes
= CartNbrFiles
= CartDirType
= nbItem
= 0;
101 void CartFilesListWindow::RefreshContents(void)
110 if (CartDirType
= GetDirType())
112 if ((CartNbrFiles
= GetNbrFiles()))
114 if ((CartDirectory
= (CARTDIRINFO
*)CreateInfos()))
117 sprintf(msg
, "%u files | %u bytes in cartdridge", (unsigned int)CartNbrFiles
, (unsigned int)CartUsedBytes
);
122 sprintf(msg
, "Cannot use directory");
123 Error
= CFL_NODIRUSE
;
128 sprintf(msg
, "No files");
129 Error
= CFL_NOFILESLIST
;
134 sprintf(msg
, "No directory found");
135 Error
= CFL_NODIRECTORYLIST
;
138 // Display status bar
141 if ((Error
& CFL_WARNING
))
143 statusbar
->setStyleSheet("background-color: lightyellow; font: bold");
147 statusbar
->setStyleSheet("background-color: tomato; font: bold");
152 statusbar
->setStyleSheet("background-color: lightgreen; font: bold");
154 statusbar
->showMessage(QString(msg
));
164 // Get files number in the directory
165 size_t CartFilesListWindow::GetNbrFiles(void)
170 return ((DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_End") - DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb"))) / sizeof(long);
180 // Get directory type
181 size_t CartFilesListWindow::GetDirType(void)
183 if (DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory"))
185 return CFL_OSJAGTYPE
;
194 // Get filename from index (starting from 0)
195 void CartFilesListWindow::GetFileInfos(CARTDIRINFO
*Ptr
, size_t index
)
203 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb") + (index
* sizeof(long));
204 Adr
= (OSJAGDir
*)&jagMemSpace
[Offset
= GET32(jagMemSpace
, Offset
)];
205 if (strlen(Adr
->Filename
))
207 Ptr
->PtrFilename
= Adr
->Filename
;
212 Ptr
->PtrFilename
= (char *)"(null)";
214 Ptr
->PtrDataFile
= GET32(jagMemSpace
, Offset
);
215 Ptr
->SizeFile
= GET32(jagMemSpace
, (Offset
+ sizeof(long)));
224 // Create information from the directory information
225 void *CartFilesListWindow::CreateInfos(void)
227 CARTDIRINFO
*Ptr
= (CARTDIRINFO
*)calloc(CartNbrFiles
, sizeof(CARTDIRINFO
));
228 model
->setRowCount(0);
230 for (int i
= 0; i
< CartNbrFiles
; i
++)
232 GetFileInfos(&Ptr
[i
], i
);
233 AddFilename(Ptr
[i
].PtrFilename
, rootNode
, 0);
234 // Display row content
236 model
->setItem(i
, 0, new QStandardItem(QString("%1").arg(Ptr
[i
].PtrFilename
)));
237 if (!Ptr
[i
].SizeFile
)
239 //model->setItem(i, 1, new QStandardItem(QString("%1").arg("")));
240 //model->setItem(i, 2, new QStandardItem(QString("%1").arg("")));
244 model
->setItem(i
, 1, new QStandardItem(QString("0x%1").arg(Ptr
[i
].PtrDataFile
, 6, 16, QChar('0'))));
245 model
->setItem(i
, 2, new QStandardItem(QString("0x%1").arg(Ptr
[i
].SizeFile
, 6, 16, QChar('0'))));
247 CartUsedBytes
+= Ptr
[i
].SizeFile
;
254 // Update the variables information (seek and stream buffer)
255 void CartFilesListWindow::UpdateInfos(void)
259 for (int i
= 0; i
< CartNbrFiles
; i
++)
261 // Check if file validity (exitence)
262 if (CartDirectory
[i
].valid
)
264 // Get the current seek and tentatively check validity (must be included in the ram zone)
265 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_SeekPosition") + (i
* sizeof(long));
266 if ((CartDirectory
[i
].CurrentSeek
= GET32(jagMemSpace
, Offset
)) < vjs
.DRAM_size
)
268 model
->setItem(i
, 3, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].CurrentSeek
, 6, 16, QChar('0'))));
272 //model->setItem(i, 3, new QStandardItem(QString("%1").arg("")));
275 // Get stream buffer address and check validity (must be included in the ram zone)
276 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_PtrBuffer") + (i
* sizeof(long));
277 if (((CartDirectory
[i
].PtrBufferStream
= GET32(jagMemSpace
, Offset
)) < vjs
.DRAM_size
) && CartDirectory
[i
].PtrBufferStream
)
279 #ifdef CFL_BUFFERTREAM
280 model
->setItem(i
, 4, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].PtrBufferStream
, 6, 16, QChar('0'))));
282 if (!CartDirectory
[i
].SizeFile
)
284 model
->setItem(i
, 1, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].PtrBufferStream
, 6, 16, QChar('0'))));
290 #ifdef CFL_BUFFERTREAM
291 model
->setItem(i
, 4, new QStandardItem(QString("%1").arg("")));
293 if (!CartDirectory
[i
].SizeFile
)
295 model
->setItem(i
, 1, new QStandardItem(QString("%1").arg("")));
304 // Add source code filename in the list
305 void CartFilesListWindow::AddFilename(char *FileName
, QStandardItem
*root
, size_t ItemPos
)
307 char *Ptr
= FileName
;
308 Sfileitem
*PtrNewFile
;
312 while ((a
= *Ptr
++) && ((a
!= '\\') && (a
!= '/')));
316 strncpy(Buffer
, FileName
, (Ptr
- FileName
- 1));
317 Buffer
[(Ptr
- FileName
- 1)] = 0;
321 strcpy(Buffer
, FileName
);
323 PtrNewFile
= (Sfileitem
*)AddItem(Buffer
, ItemPos
);
324 if (!PtrNewFile
->PreviousItem
)
326 PtrNewFile
->PreviousItem
= root
;
327 root
->appendRow(PtrNewFile
->Item
);
328 PtrNewFile
->Item
->setEditable(false);
333 return (AddFilename(Ptr
, PtrNewFile
->Item
, (ItemPos
+ 1)));
338 // Add item to the list
339 // Return void * on new item or already existing one
340 void *CartFilesListWindow::AddItem(char *ItemName
, size_t ItemPos
)
342 Sfileitem
*Ptr
= fileItems
;
344 // Look for already existing item
345 for (size_t i
= 0; i
< nbItem
; i
++)
347 if ((Ptr
->column
== ItemPos
) && !strcmp(Ptr
->Item
->text().toLocal8Bit().constData(), ItemName
))
357 // Add item in the list
358 fileItems
= (Sfileitem
*)realloc(fileItems
, (sizeof(Sfileitem
) * ++nbItem
));
359 (fileItems
+ (nbItem
- 1))->column
= ItemPos
;
360 (fileItems
+ (nbItem
- 1))->PreviousItem
= NULL
;
361 (fileItems
+ (nbItem
- 1))->Item
= new QStandardItem(ItemName
);
362 return (fileItems
+ (nbItem
- 1));
367 void CartFilesListWindow::keyPressEvent(QKeyEvent
* e
)
369 if (e
->key() == Qt::Key_Escape
)