]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/filepicker.cpp
Incremental improvements to the file picker, introduction of ImageDelegate
[virtualjaguar] / src / gui / filepicker.cpp
1 //
2 // filepicker.cpp - A ROM chooser
3 //
4 // by James L. Hammons
5 // (C) 2010 Underground Software
6 //
7 // JLH = James L. Hammons <jlhamm@acm.org>
8 //
9 // Who  When        What
10 // ---  ----------  -------------------------------------------------------------
11 // JLH  01/22/2010  Created this file
12 // JLH  02/06/2010  Modified to use Qt model/view framework
13 //
14
15 #include "filepicker.h"
16
17 #include "crc32.h"
18 #include "filelistmodel.h"
19 #include "filethread.h"
20 #include "imagedelegate.h"
21 #include "settings.h"
22 #include "types.h"
23
24 struct RomIdentifier
25 {
26         const uint32 crc32;
27         const char name[128];
28         const char file[128];
29 };
30
31 RomIdentifier romList2[] = {
32         { 0x0509C85E, "Raiden (World)", "" },
33         { 0x08F15576, "Iron Soldier (World) (v1.04)", "" },
34         { 0x0957A072, "Kasumi Ninja (World)", "" },
35         { 0x0AC83D77, "NBA Jam T.E. (World)", "" },
36         { 0x0EC5369D, "Evolution - Dino Dudes (World)", "" },
37         { 0x0F6A1C2C, "Ultra Vortek (World)", "" },
38         { 0x14915F20, "White Men Can't Jump (World)", "" },
39         { 0x1660F070, "Power Drive Rally (World)", "" },
40         { 0x1E451446, "Trevor McFur in the Crescent Galaxy (World)", "" },
41         { 0x27594C6A, "Defender 2000 (World)", "" },
42         { 0x2E17D5DA, "Bubsy in Fractured Furry Tales (World)", "" },
43         { 0x348E6449, "Double Dragon V - The Shadow Falls (World)", "" },
44         { 0x3615AF6A, "Fever Pitch Soccer (World) (En,Fr,De,Es,It)", "" },
45         { 0x38A130ED, "Troy Aikman NFL Football (World)", "" },
46         { 0x3C044941, "Skyhammer (World)", "" },
47         { 0x42A13EC5, "Soccer Kid (World)", "" },
48         { 0x47EBC158, "Theme Park (World)", "" },
49         { 0x4899628F, "Hover Strike (World)", "" },
50         { 0x53DF6440, "Space War 2000 (World)", "" },
51         { 0x55A0669C, "[BIOS] Atari Jaguar Developer CD (World)", "" },
52         { 0x58272540, "Syndicate (World)", "" },
53         { 0x5A101212, "Sensible Soccer - International Edition (World)", "" },
54         { 0x5B6BB205, "Ruiner Pinball (World)", "" },
55         { 0x5CFF14AB, "Pinball Fantasies (World)", "" },
56         { 0x5E2CDBC0, "Doom (World)", "" },
57         { 0x61C7EEC0, "Zero 5 (World)", "" },
58         { 0x67F9AB3A, "Battle Sphere Gold (World)", "" },
59         { 0x687068D5, "[BIOS] Atari Jaguar CD (World)", "" },
60         { 0x6B2B95AD, "Tempest 2000 (World)", "" },
61         { 0x6EB774EB, "Worms (World)", "" },
62         { 0x6F8B2547, "Super Burnout (World)", "" },
63         { 0x817A2273, "Pitfall - The Mayan Adventure (World)", "" },
64         { 0x8975F48B, "Zool 2 (World)", "" },
65         { 0x8D15DBC6, "[BIOS] Atari Jaguar Stubulator '94 (World)", "" },
66         { 0x8FEA5AB0, "Dragon - The Bruce Lee Story (World)", "" },
67         { 0x97EB4651, "I-War (World)", "" },
68         { 0xA27823D8, "Ultra Vortek (World) (v0.94) (Beta)", "" },
69         { 0xA56D0798, "Protector - Special Edition (World)", "" },
70         { 0xA9F8A00E, "Rayman (World)", "" },
71         { 0xB14C4753, "Fight for Life (World)", "" },
72         { 0xBCB1A4BF, "Brutal Sports Football (World)", "" },
73         { 0xBDA405C6, "Cannon Fodder (World)", "" },
74         { 0xBDE67498, "Cybermorph (World) (Rev 1)", "" },
75         { 0xC5562581, "Zoop! (World)", "" },
76         { 0xC654681B, "Total Carnage (World)", "" },
77         { 0xC6C7BA62, "Fight for Life (World) (Alt)", "" },
78         { 0xC9608717, "Val d'Isere Skiing and Snowboarding (World)", "" },
79         { 0xCBFD822A, "Air Cars (World)", "" },
80         { 0xCD5BF827, "Attack of the Mutant Penguins (World)", "" },
81         { 0xD6C19E34, "Iron Soldier 2 (World)", "" },
82         { 0xDA9C4162, "Missile Command 3D (World)", "" },
83         { 0xDC187F82, "Alien vs Predator (World)", "" },
84         { 0xDE55DCC7, "Flashback - The Quest for Identity (World) (En,Fr)", "" },
85         { 0xE28756DE, "Atari Karts (World)", "" },
86         { 0xE60277BB, "[BIOS] Atari Jaguar Stubulator '93 (World)", "" },
87         { 0xE91BD644, "Wolfenstein 3D (World)", "" },
88         { 0xEC22F572, "SuperCross 3D (World)", "" },
89         { 0xECF854E7, "Cybermorph (World) (Rev 2)", "" },
90         { 0xEEE8D61D, "Club Drive (World)", "" },
91         { 0xF0360DB3, "Hyper Force (World)", "" },
92         { 0xFA7775AE, "Checkered Flag (World)", "" },
93         { 0xFAE31DD0, "Flip Out! (World)", "" },
94         { 0xFB731AAA, "[BIOS] Atari Jaguar (World)", "" },
95         { 0xFFFFFFFF, "***END***", "" }
96 };
97
98 /*
99 Our strategy here is like so:
100 Look at the files in the directory pointed to by ROMPath.
101 For each file in the directory, take the CRC32 of it and compare it to the CRC
102 in the romList[]. If there's a match, put it in a list and note it's index value
103 in romList for future reference.
104
105 When constructing the list, use the index to pull up an image of the cart and
106 put that in the list. User picks from a graphical image of the cart.
107
108 Ideally, the label will go into the archive along with the ROM image, but that's
109 for the future...
110 Maybe box art, screenshots will go as well...
111 */
112
113 //FilePickerWindow::FilePickerWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog)//could use Window as well...
114 FilePickerWindow::FilePickerWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Window)
115 {
116         setWindowTitle("Insert Cartridge...");
117
118 #if 0
119         fileList2 = new QListWidget(this);
120 //      addWidget(fileList);
121
122         QVBoxLayout * layout = new QVBoxLayout();
123 //      layout->setSizeConstraint(QLayout::SetFixedSize);
124         setLayout(layout);
125
126         layout->addWidget(fileList2);
127
128 //      PopulateList();
129         fileThread = new FileThread(this);
130
131         /*bool b =*/ connect(fileThread, SIGNAL(FoundAFile(unsigned long)), this, SLOT(AddFileToList(unsigned long)));
132 //printf("FilePickerWindow: Connection to FileThread %s...\n", (b ? "succeeded" : "failed"));
133
134         fileThread->Go(fileList2);
135 #else
136 //is there any reason why this must be cast as a QAbstractListModel?
137 //Also, need to think about data structure for the model...
138         model = new FileListModel();
139         fileList = new QListView();
140         fileList->setModel(model);
141         ImageDelegate * delegate = new ImageDelegate(this);
142         fileList->setItemDelegate(delegate);
143
144         QVBoxLayout * layout = new QVBoxLayout;
145         setLayout(layout);
146
147         layout->addWidget(fileList);
148         ((FileListModel *)model)->AddData(QIcon(":/res/generic.png"));
149         ((FileListModel *)model)->AddData(QIcon(":/res/generic.png"));
150 #endif
151 }
152
153 // Need a slot here to pickup stuff from the thread...
154
155 void FilePickerWindow::AddFileToList(unsigned long index)
156 {
157         printf("--> Found CRC: %08X...\n", romList2[index].crc32);
158 }
159
160
161 /*
162 void FilePickerWindow::PopulateList(void)
163 {
164         QDir romDir(vjs.ROMPath);
165         QFileInfoList list = romDir.entryInfoList();
166
167         for(int i=0; i<list.size(); i++)
168         {
169                 QFileInfo fileInfo = list.at(i);
170 //         std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
171 //                                                 .arg(fileInfo.fileName()));
172 //         std::cout << std::endl;
173                 QFile file(romDir.filePath(fileInfo.fileName()));
174                 uint8 * buffer = new uint8[fileInfo.size()];
175
176                 if (file.open(QIODevice::ReadOnly))
177                 {
178                         file.read((char *)buffer, fileInfo.size());
179                         uint32 crc = crc32_calcCheckSum(buffer, fileInfo.size());
180                         file.close();
181 //printf("FilePickerWindow: File crc == %08X...\n", crc);
182
183                         for(int j=0; romList2[j].crc32 != 0xFFFFFFFF; j++)
184                         {
185                                 if (romList2[j].crc32 == crc)
186                                 {
187 printf("FilePickerWindow: Found match [%s]...\n", romList2[j].name);
188                                         new QListWidgetItem(QIcon(":/res/generic.png"), romList2[j].name, fileList);
189                                         break;
190                                 }
191                         }
192                 }
193
194                 delete[] buffer;
195         }
196 }
197 */