2 // CartFilesListWin.cpp - List files in the cartridge
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- -----------------------------------------------------------
10 // JPM Oct./2018 Created this file, and changed position of the status bar
11 // JPM Aug./2019 Update texts descriptions
15 // To allow file opening / viewing
16 // Remove/modify the 1st information, named '1', at the top
20 #include "debugger/CartFilesListWin.h"
23 #include "debugger/DBGManager.h"
27 CartFilesListWindow::CartFilesListWindow(QWidget
* parent
/*= 0*/) : QWidget(parent
, Qt::Dialog
),
28 TableView(new QTableView
),
29 model(new QStandardItemModel
),
30 TVlayout(new QVBoxLayout
),
31 Mlayout(new QVBoxLayout
),
32 layout(new QVBoxLayout
),
33 treeView(new QTreeView
),
34 standardModel(new QStandardItemModel
),
35 rootNode(new QStandardItem
),
37 TVstatusbar(new QStatusBar
),
41 CartDirType(CFL_NOTYPE
)
43 setWindowTitle(tr("cartridge directory & files"));
46 QFont
fixedFont("Lucida Console", 8, QFont::Normal
);
47 fixedFont
.setStyleHint(QFont::TypeWriter
);
49 // Set the new layout with proper identation and readibility
50 #ifdef CFL_BUFFERTREAM
51 model
->setColumnCount(5);
53 model
->setColumnCount(4);
55 model
->setHeaderData(0, Qt::Horizontal
, QObject::tr("File"));
56 model
->setHeaderData(1, Qt::Horizontal
, QObject::tr("Address"));
57 model
->setHeaderData(2, Qt::Horizontal
, QObject::tr("Size"));
58 model
->setHeaderData(3, Qt::Horizontal
, QObject::tr("Seek"));
59 #ifdef CFL_BUFFERTREAM
60 model
->setHeaderData(4, Qt::Horizontal
, QObject::tr("Stream"));
63 TableView
->setModel(model
);
64 TableView
->setEditTriggers(QAbstractItemView::NoEditTriggers
);
65 TableView
->setShowGrid(0);
66 TableView
->setFont(fixedFont
);
67 TableView
->verticalHeader()->setDefaultSectionSize(TableView
->verticalHeader()->minimumSectionSize());
68 TableView
->verticalHeader()->setDefaultAlignment(Qt::AlignRight
);
69 TVlayout
->addWidget(TableView
);
70 TVlayout
->addWidget(TVstatusbar
);
73 rootNode
= standardModel
->invisibleRootItem();
75 treeView
->setModel(standardModel
);
76 treeView
->expandAll();
77 Mlayout
->addWidget(treeView
);
80 layout
->addLayout(TVlayout
);
81 layout
->addLayout(Mlayout
);
87 CartFilesListWindow::~CartFilesListWindow(void)
93 void CartFilesListWindow::Reset(void)
95 standardModel
->setRowCount(0);
96 model
->setRowCount(0);
100 CartDirectory
= NULL
;
101 CartUsedBytes
= CartNbrFiles
= CartDirType
= nbItem
= 0;
106 void CartFilesListWindow::RefreshContents(void)
115 if (CartDirType
= GetDirType())
117 if ((CartNbrFiles
= GetNbrFiles()))
119 if ((CartDirectory
= (CARTDIRINFO
*)CreateInfos()))
122 sprintf(msg
, "%u files | %u bytes in cartridge", (unsigned int)CartNbrFiles
, (unsigned int)CartUsedBytes
);
127 sprintf(msg
, "Cannot use directory");
128 Error
= CFL_NODIRUSE
;
133 sprintf(msg
, "No files");
134 Error
= CFL_NOFILESLIST
;
139 sprintf(msg
, "No directory found");
140 Error
= CFL_NODIRECTORYLIST
;
143 // Display status bar
146 if ((Error
& CFL_WARNING
))
148 TVstatusbar
->setStyleSheet("background-color: lightyellow; font: bold");
152 TVstatusbar
->setStyleSheet("background-color: tomato; font: bold");
157 TVstatusbar
->setStyleSheet("background-color: lightgreen; font: bold");
159 TVstatusbar
->showMessage(QString(msg
));
169 // Get files number in the cartridge directory
170 size_t CartFilesListWindow::GetNbrFiles(void)
175 return ((DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_End") - DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb"))) / sizeof(long);
185 // Get cartridge directory type
186 size_t CartFilesListWindow::GetDirType(void)
188 if (DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory"))
190 return CFL_OSJAGTYPE
;
199 // Get filename from index (starting from 0)
200 void CartFilesListWindow::GetFileInfos(CARTDIRINFO
*Ptr
, size_t index
)
208 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb") + (index
* sizeof(long));
209 Adr
= (OSJAGDir
*)&jagMemSpace
[Offset
= GET32(jagMemSpace
, Offset
)];
210 if (strlen(Adr
->Filename
))
212 Ptr
->PtrFilename
= Adr
->Filename
;
217 Ptr
->PtrFilename
= (char *)"(null)";
219 Ptr
->PtrDataFile
= GET32(jagMemSpace
, Offset
);
220 Ptr
->SizeFile
= GET32(jagMemSpace
, (Offset
+ sizeof(long)));
229 // Create information from the cartridge directory information
230 void *CartFilesListWindow::CreateInfos(void)
232 CARTDIRINFO
*Ptr
= (CARTDIRINFO
*)calloc(CartNbrFiles
, sizeof(CARTDIRINFO
));
233 model
->setRowCount(0);
235 for (int i
= 0; i
< CartNbrFiles
; i
++)
237 GetFileInfos(&Ptr
[i
], i
);
238 AddFilename(Ptr
[i
].PtrFilename
, rootNode
, 0);
239 // Display row content
241 model
->setItem(i
, 0, new QStandardItem(QString("%1").arg(Ptr
[i
].PtrFilename
)));
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'))));
271 // Get stream buffer address and check validity (must be included in the ram zone)
272 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_PtrBuffer") + (i
* sizeof(long));
273 if (((CartDirectory
[i
].PtrBufferStream
= GET32(jagMemSpace
, Offset
)) < vjs
.DRAM_size
) && CartDirectory
[i
].PtrBufferStream
)
275 #ifdef CFL_BUFFERTREAM
276 model
->setItem(i
, 4, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].PtrBufferStream
, 6, 16, QChar('0'))));
278 if (!CartDirectory
[i
].SizeFile
)
280 model
->setItem(i
, 1, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].PtrBufferStream
, 6, 16, QChar('0'))));
286 #ifdef CFL_BUFFERTREAM
287 model
->setItem(i
, 4, new QStandardItem(QString("%1").arg("")));
289 if (!CartDirectory
[i
].SizeFile
)
291 model
->setItem(i
, 1, new QStandardItem(QString("%1").arg("")));
300 // Add source code filename in the list
301 void CartFilesListWindow::AddFilename(char *FileName
, QStandardItem
*root
, size_t ItemPos
)
303 char *Ptr
= FileName
;
304 Sfileitem
*PtrNewFile
;
308 while ((a
= *Ptr
++) && ((a
!= '\\') && (a
!= '/')));
312 strncpy(Buffer
, FileName
, (Ptr
- FileName
- 1));
313 Buffer
[(Ptr
- FileName
- 1)] = 0;
317 strcpy(Buffer
, FileName
);
319 PtrNewFile
= (Sfileitem
*)AddItem(Buffer
, ItemPos
);
320 if (!PtrNewFile
->PreviousItem
)
322 PtrNewFile
->PreviousItem
= root
;
323 root
->appendRow(PtrNewFile
->Item
);
324 PtrNewFile
->Item
->setEditable(false);
329 return (AddFilename(Ptr
, PtrNewFile
->Item
, (ItemPos
+ 1)));
334 // Add item to the list
335 // Return void * on new item or already existing one
336 void *CartFilesListWindow::AddItem(char *ItemName
, size_t ItemPos
)
338 Sfileitem
*Ptr
= fileItems
;
340 // Look for already existing item
341 for (size_t i
= 0; i
< nbItem
; i
++)
343 if ((Ptr
->column
== ItemPos
) && !strcmp(Ptr
->Item
->text().toLocal8Bit().constData(), ItemName
))
353 // Add item in the list
354 fileItems
= (Sfileitem
*)realloc(fileItems
, (sizeof(Sfileitem
) * ++nbItem
));
355 (fileItems
+ (nbItem
- 1))->column
= ItemPos
;
356 (fileItems
+ (nbItem
- 1))->PreviousItem
= NULL
;
357 (fileItems
+ (nbItem
- 1))->Item
= new QStandardItem(ItemName
);
358 return (fileItems
+ (nbItem
- 1));
363 void CartFilesListWindow::keyPressEvent(QKeyEvent
* e
)
365 if (e
->key() == Qt::Key_Escape
)