2 // CartFilesListWin.cpp - List files in the cartdridge
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- -----------------------------------------------------------
10 // JPM Oct./2018 Created this file, and changed position of the status bar
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 TVlayout(new QVBoxLayout
),
30 Mlayout(new QVBoxLayout
),
31 layout(new QVBoxLayout
),
32 treeView(new QTreeView
),
33 standardModel(new QStandardItemModel
),
34 rootNode(new QStandardItem
),
36 TVstatusbar(new QStatusBar
),
40 CartDirType(CFL_NOTYPE
)
42 setWindowTitle(tr("Cartdridge directory & files"));
45 QFont
fixedFont("Lucida Console", 8, QFont::Normal
);
46 fixedFont
.setStyleHint(QFont::TypeWriter
);
48 // Set the new layout with proper identation and readibility
49 #ifdef CFL_BUFFERTREAM
50 model
->setColumnCount(5);
52 model
->setColumnCount(4);
54 model
->setHeaderData(0, Qt::Horizontal
, QObject::tr("File"));
55 model
->setHeaderData(1, Qt::Horizontal
, QObject::tr("Address"));
56 model
->setHeaderData(2, Qt::Horizontal
, QObject::tr("Size"));
57 model
->setHeaderData(3, Qt::Horizontal
, QObject::tr("Seek"));
58 #ifdef CFL_BUFFERTREAM
59 model
->setHeaderData(4, Qt::Horizontal
, QObject::tr("Stream"));
62 TableView
->setModel(model
);
63 TableView
->setEditTriggers(QAbstractItemView::NoEditTriggers
);
64 TableView
->setShowGrid(0);
65 TableView
->setFont(fixedFont
);
66 TableView
->verticalHeader()->setDefaultSectionSize(TableView
->verticalHeader()->minimumSectionSize());
67 TableView
->verticalHeader()->setDefaultAlignment(Qt::AlignRight
);
68 TVlayout
->addWidget(TableView
);
69 TVlayout
->addWidget(TVstatusbar
);
72 rootNode
= standardModel
->invisibleRootItem();
74 treeView
->setModel(standardModel
);
75 treeView
->expandAll();
76 Mlayout
->addWidget(treeView
);
79 layout
->addLayout(TVlayout
);
80 layout
->addLayout(Mlayout
);
86 CartFilesListWindow::~CartFilesListWindow(void)
92 void CartFilesListWindow::Reset(void)
94 standardModel
->setRowCount(0);
95 model
->setRowCount(0);
100 CartUsedBytes
= CartNbrFiles
= CartDirType
= nbItem
= 0;
105 void CartFilesListWindow::RefreshContents(void)
114 if (CartDirType
= GetDirType())
116 if ((CartNbrFiles
= GetNbrFiles()))
118 if ((CartDirectory
= (CARTDIRINFO
*)CreateInfos()))
121 sprintf(msg
, "%u files | %u bytes in cartdridge", (unsigned int)CartNbrFiles
, (unsigned int)CartUsedBytes
);
126 sprintf(msg
, "Cannot use directory");
127 Error
= CFL_NODIRUSE
;
132 sprintf(msg
, "No files");
133 Error
= CFL_NOFILESLIST
;
138 sprintf(msg
, "No directory found");
139 Error
= CFL_NODIRECTORYLIST
;
142 // Display status bar
145 if ((Error
& CFL_WARNING
))
147 TVstatusbar
->setStyleSheet("background-color: lightyellow; font: bold");
151 TVstatusbar
->setStyleSheet("background-color: tomato; font: bold");
156 TVstatusbar
->setStyleSheet("background-color: lightgreen; font: bold");
158 TVstatusbar
->showMessage(QString(msg
));
168 // Get files number in the directory
169 size_t CartFilesListWindow::GetNbrFiles(void)
174 return ((DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_End") - DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb"))) / sizeof(long);
184 // Get directory type
185 size_t CartFilesListWindow::GetDirType(void)
187 if (DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory"))
189 return CFL_OSJAGTYPE
;
198 // Get filename from index (starting from 0)
199 void CartFilesListWindow::GetFileInfos(CARTDIRINFO
*Ptr
, size_t index
)
207 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb") + (index
* sizeof(long));
208 Adr
= (OSJAGDir
*)&jagMemSpace
[Offset
= GET32(jagMemSpace
, Offset
)];
209 if (strlen(Adr
->Filename
))
211 Ptr
->PtrFilename
= Adr
->Filename
;
216 Ptr
->PtrFilename
= (char *)"(null)";
218 Ptr
->PtrDataFile
= GET32(jagMemSpace
, Offset
);
219 Ptr
->SizeFile
= GET32(jagMemSpace
, (Offset
+ sizeof(long)));
228 // Create information from the directory information
229 void *CartFilesListWindow::CreateInfos(void)
231 CARTDIRINFO
*Ptr
= (CARTDIRINFO
*)calloc(CartNbrFiles
, sizeof(CARTDIRINFO
));
232 model
->setRowCount(0);
234 for (int i
= 0; i
< CartNbrFiles
; i
++)
236 GetFileInfos(&Ptr
[i
], i
);
237 AddFilename(Ptr
[i
].PtrFilename
, rootNode
, 0);
238 // Display row content
240 model
->setItem(i
, 0, new QStandardItem(QString("%1").arg(Ptr
[i
].PtrFilename
)));
243 model
->setItem(i
, 1, new QStandardItem(QString("0x%1").arg(Ptr
[i
].PtrDataFile
, 6, 16, QChar('0'))));
244 model
->setItem(i
, 2, new QStandardItem(QString("0x%1").arg(Ptr
[i
].SizeFile
, 6, 16, QChar('0'))));
246 CartUsedBytes
+= Ptr
[i
].SizeFile
;
253 // Update the variables information (seek and stream buffer)
254 void CartFilesListWindow::UpdateInfos(void)
258 for (int i
= 0; i
< CartNbrFiles
; i
++)
260 // Check if file validity (exitence)
261 if (CartDirectory
[i
].valid
)
263 // Get the current seek and tentatively check validity (must be included in the ram zone)
264 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_SeekPosition") + (i
* sizeof(long));
265 if ((CartDirectory
[i
].CurrentSeek
= GET32(jagMemSpace
, Offset
)) < vjs
.DRAM_size
)
267 model
->setItem(i
, 3, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].CurrentSeek
, 6, 16, QChar('0'))));
270 // Get stream buffer address and check validity (must be included in the ram zone)
271 Offset
= DBGManager_GetAdrFromSymbolName((char *)"OSJAG_PtrBuffer") + (i
* sizeof(long));
272 if (((CartDirectory
[i
].PtrBufferStream
= GET32(jagMemSpace
, Offset
)) < vjs
.DRAM_size
) && CartDirectory
[i
].PtrBufferStream
)
274 #ifdef CFL_BUFFERTREAM
275 model
->setItem(i
, 4, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].PtrBufferStream
, 6, 16, QChar('0'))));
277 if (!CartDirectory
[i
].SizeFile
)
279 model
->setItem(i
, 1, new QStandardItem(QString("0x%1").arg(CartDirectory
[i
].PtrBufferStream
, 6, 16, QChar('0'))));
285 #ifdef CFL_BUFFERTREAM
286 model
->setItem(i
, 4, new QStandardItem(QString("%1").arg("")));
288 if (!CartDirectory
[i
].SizeFile
)
290 model
->setItem(i
, 1, new QStandardItem(QString("%1").arg("")));
299 // Add source code filename in the list
300 void CartFilesListWindow::AddFilename(char *FileName
, QStandardItem
*root
, size_t ItemPos
)
302 char *Ptr
= FileName
;
303 Sfileitem
*PtrNewFile
;
307 while ((a
= *Ptr
++) && ((a
!= '\\') && (a
!= '/')));
311 strncpy(Buffer
, FileName
, (Ptr
- FileName
- 1));
312 Buffer
[(Ptr
- FileName
- 1)] = 0;
316 strcpy(Buffer
, FileName
);
318 PtrNewFile
= (Sfileitem
*)AddItem(Buffer
, ItemPos
);
319 if (!PtrNewFile
->PreviousItem
)
321 PtrNewFile
->PreviousItem
= root
;
322 root
->appendRow(PtrNewFile
->Item
);
323 PtrNewFile
->Item
->setEditable(false);
328 return (AddFilename(Ptr
, PtrNewFile
->Item
, (ItemPos
+ 1)));
333 // Add item to the list
334 // Return void * on new item or already existing one
335 void *CartFilesListWindow::AddItem(char *ItemName
, size_t ItemPos
)
337 Sfileitem
*Ptr
= fileItems
;
339 // Look for already existing item
340 for (size_t i
= 0; i
< nbItem
; i
++)
342 if ((Ptr
->column
== ItemPos
) && !strcmp(Ptr
->Item
->text().toLocal8Bit().constData(), ItemName
))
352 // Add item in the list
353 fileItems
= (Sfileitem
*)realloc(fileItems
, (sizeof(Sfileitem
) * ++nbItem
));
354 (fileItems
+ (nbItem
- 1))->column
= ItemPos
;
355 (fileItems
+ (nbItem
- 1))->PreviousItem
= NULL
;
356 (fileItems
+ (nbItem
- 1))->Item
= new QStandardItem(ItemName
);
357 return (fileItems
+ (nbItem
- 1));
362 void CartFilesListWindow::keyPressEvent(QKeyEvent
* e
)
364 if (e
->key() == Qt::Key_Escape
)