ff7tk  0.02
Toolkit for making FF7 Tools
SlotSelect.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // copyright 2012 -2016 Chris Rizzitello <sithlord48@gmail.com> //
3 // //
4 // This file is part of FF7tk //
5 // //
6 // FF7tk is free software: you can redistribute it and/or modify //
7 // it under the terms of the GNU General Public License as published by //
8 // the Free Software Foundation, either version 3 of the License, or //
9 // (at your option) any later version. //
10 // //
11 // FF7tk is distributed in the hope that it will be useful, //
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of //
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
14 // GNU General Public License for more details. //
15 /****************************************************************************/
16 #include "SlotSelect.h"
17 
18 SlotSelect::SlotSelect(qreal Scale,FF7Save *data, bool showLoad,QWidget *parent):QDialog(parent)
19 {
20  scale=Scale;
21  ff7 = data;
22  list_preview = new QScrollArea();
23  btnNew = new QPushButton (QIcon::fromTheme(QString("document-open"),QPixmap()),tr("Load Another File"));
24  connect (btnNew,SIGNAL(clicked()),this, SLOT(newFile()));
25  setWindowFlags(((windowFlags() | Qt::CustomizeWindowHint)& ~Qt::WindowCloseButtonHint));//remove close button
26  setWindowTitle(tr("Select A Slot"));
27  preview_layout = new QVBoxLayout;
28  frm_preview = new QFrame;
29  frm_preview->setLayout(preview_layout);
30  frm_preview->setContentsMargins(0,0,0,0);
31  preview_layout->setContentsMargins(0,0,0,0);
32  preview_layout->setSpacing(3);
33  for(int i=0;i<15;i++)
34  {
35  preview[i] = new SlotPreview(i,scale);
36  preview_layout->addWidget(preview[i]);
37  setSlotPreview(i);
38  }
39  //frm_preview->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred);
40  list_preview->setWidget(frm_preview);
41  list_preview->setContentsMargins(0,0,0,0);
42  QVBoxLayout *dialog_layout = new QVBoxLayout;
43  dialog_layout->setContentsMargins(0,0,0,0);
44  dialog_layout->setSpacing(2);
45  dialog_layout->addWidget(list_preview);
46  dialog_layout->addWidget(btnNew);
47  this->showLoad(showLoad); //by defalut hide the load new save button
48  this->setLayout(dialog_layout);
49  setFixedWidth(preview[1]->contentsRect().size().width() +contentsMargins().left()+contentsMargins().right()+ list_preview->verticalScrollBar()->widthMM()+14*scale);
50  this->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Preferred);
51 }
52 void SlotSelect::button_clicked(int s){this->done(s);}
53 
55 {
56  if(ff7->type()!="PC")
57  {
58  if((ff7->psx_block_type(s)!=FF7Save::BLOCK_MAIN) && (ff7->psx_block_type(s) != FF7Save::BLOCK_DELETED_MAIN)){return;}//only can remove Main blocks (they will clean up their sub blocks).
59  int size = ff7->psx_block_size(s);
60  for (int i=0; i<size; i++)
61  {
62  int t=ff7->psx_block_next(s);
63  ff7->clearSlot(s);
64  ReIntSlot(s);
65  s=t;
66  }
67  }
68  else
69  {
70  ff7->clearSlot(s);
71  ReIntSlot(s);
72  }
73 }
74 
76 {
77  if(ff7->isFF7(s)){ff7->copySlot(s);}
78  //don't Copy Non FF7 Slots Since we don't modify their region data
79  else{/*NOT FF7 SAVE INGORE*/}
80 }
81 
83 {
84  if(ff7->psx_block_type(s)==FF7Save::BLOCK_MIDLINK || ff7->psx_block_type(s)==FF7Save::BLOCK_ENDLINK){return;}//Don't Overwrite parts of other saves.
85  if( (!ff7->isFF7(s)) && (ff7->type()!="PC") && (ff7->psx_block_size(s)>1))
86  {
87  int old_s = s;
88  int size = ff7->psx_block_size(s);
89  for(int i=0;i<size;i++)
90  {
91  int t=ff7->psx_block_next(s);
92  ff7->clearSlot(s);
93  ReIntSlot(s);
94  s=t;
95  }
96  s=old_s;
97  }
98  ff7->pasteSlot(s);
99  ReIntSlot(s);
100 }
101 
103 {
104  preview[s]->~SlotPreview();
105  preview[s]= new SlotPreview(s,scale);
106  preview_layout->insertWidget(s,preview[s]);
107  setSlotPreview(s);
108 }
109 
111 {
113  {
115  preview[s]->setPsxIcon(ff7->slotIcon(s));
116  QString Slottext;
117  switch (ff7->psx_block_type(s))
118  {
119  case FF7Save::BLOCK_MIDLINK: Slottext =tr(" Mid-Linked Block, Next Data Chunk @ Slot:%1").arg(QString::number(ff7->psx_block_next(s)+1)); break;
120  case FF7Save::BLOCK_DELETED_MIDLINK: Slottext =tr(" Mid-Linked Block (Deleted), Next Data Chunk @ Slot:%1").arg(QString::number(ff7->psx_block_next(s)+1)); break;
121  case FF7Save::BLOCK_ENDLINK: Slottext =tr(" End Of Linked Blocks"); break;
122  case FF7Save::BLOCK_DELETED_ENDLINK: Slottext =tr(" End Of Linked Blocks (Deleted)"); break;
123  default: Slottext = tr("ERROR"); break;
124  }
125  preview[s]->setLocation(Slottext);
126  }
127 
128  else if(ff7->isFF7(s))
129  {
131  //show real Dialog background.
132  QImage image(2, 2, QImage::Format_ARGB32);
133  image.setPixel(0, 0, ff7->dialogColorUL(s).rgb());
134  image.setPixel(1, 0, ff7->dialogColorUR(s).rgb());
135  image.setPixel(0, 1, ff7->dialogColorLL(s).rgb());
136  image.setPixel(1, 1, ff7->dialogColorLR(s).rgb());
137  QImage gradient = image.scaled(preview[s]->width(),preview[s]->height(),Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
138  preview[s]->setPixmap(QPixmap::fromImage(gradient));
141  preview[s]->setName(ff7->descName(s));
142  preview[s]->setLevel(ff7->descLevel(s));
143  preview[s]->setGil(ff7->descGil(s));
144  preview[s]->setTime((ff7->descTime(s)/3600),(ff7->descTime(s)/60 %60));
145  }
146  else if(ff7->region(s).isEmpty() || ff7->psx_block_type(s) ==FF7Save::BLOCK_EMPTY )
147  {
149  }
150  else
151  {// all other psx saves.
153  preview[s]->setPsxIcon(ff7->slotIcon(s));
154  QString Slottext= ff7->psxDesc(s);
155  Slottext.prepend(" ");
157  Slottext.append(tr("\n\t Game Uses %1 Save Block").arg(QString::number(ff7->psx_block_size(s))));
158  if(ff7->psx_block_next(s)!=0xFF){Slottext.append(tr("s; Next Data Chunk @ Slot:%1").arg(QString::number(ff7->psx_block_next(s)+1)));}
159  preview[s]->setLocation(Slottext);
160  }
161  //more checks after this....
162  //for any item
163  connect(preview[s],SIGNAL(clicked(int)),this,SLOT(button_clicked(int)));
164  connect(preview[s],SIGNAL(btn_remove_clicked(int)),this,SLOT(remove_slot(int)));
165  connect(preview[s],SIGNAL(btn_copy_clicked(int)),this,SLOT(copy_slot(int)));
166  connect(preview[s],SIGNAL(btn_paste_clicked(int)),this,SLOT(paste_slot(int)));
167 }
168 
170 {
171  this->done(-1);
172 }
173 
174 void SlotSelect::showLoad(bool show)
175 {
176  btnNew->setVisible(show);
177  if(show){this->setMinimumHeight(442);}
178  else{this->setMinimumHeight(420);}
179 }
QList< QByteArray > slotIcon(int s)
return slots save icon. each new frame will be appended to the list.
Definition: FF7Save.cpp:1578
void newFile(void)
Definition: SlotSelect.cpp:169
Preview a Single Slot on a Psx memory card or FF7 Save file.
Definition: SlotPreview.h:34
FF7Save * ff7
Definition: SlotSelect.h:66
quint8 psx_block_next(int s)
Definition: FF7Save.cpp:1200
QVBoxLayout * preview_layout
Definition: SlotSelect.h:61
qreal scale
Definition: SlotSelect.h:68
quint32 descGil(int s)
Definition: FF7Save.cpp:1667
QColor dialogColorUL(int s)
Definition: FF7Save.cpp:1895
void showLoad(bool shown)
Definition: SlotSelect.cpp:174
QColor dialogColorLL(int s)
Definition: FF7Save.cpp:1897
FF7Char Chars
Definition: SlotSelect.h:67
QString psxDesc(int s)
Get Description Text for PSX Slot.
Definition: FF7Save.cpp:1256
quint32 descTime(int s)
Definition: FF7Save.cpp:1677
void setPsxIcon(QByteArray icon_data, quint8 frames=1)
void setSlotPreview(int s)
Definition: SlotSelect.cpp:110
QString type(void)
Definition: FF7Save.cpp:1329
QString region(int s)
Definition: FF7Save.cpp:1109
FF7 Save in slot.
Definition: SlotPreview.h:39
PSX Game or linked block.
Definition: SlotPreview.h:39
void setLocation(QString)
void setTime(int hour, int min)
void setMode(int mode)
Definition: SlotPreview.cpp:67
QString descName(int s)
Definition: FF7Save.cpp:1620
QString descLocation(int s)
Definition: FF7Save.cpp:1638
void paste_slot(int s)
Definition: SlotSelect.cpp:82
void copySlot(int s)
copy a slot Sin to the buffer
Definition: FF7Save.cpp:1149
edit saves from Final Fantasy 7
Definition: FF7Save.h:58
void setGil(int)
void remove_slot(int s)
Definition: SlotSelect.cpp:54
void pasteSlot(int s)
paste from the buffer into a slot
Definition: FF7Save.cpp:1150
void setName(QString)
void copy_slot(int s)
Definition: SlotSelect.cpp:75
void button_clicked(int s)
Definition: SlotSelect.cpp:52
QScrollArea * list_preview
Definition: SlotSelect.h:62
bool isFF7(int s)
Definition: FF7Save.cpp:1292
SlotPreview * preview[15]
Definition: SlotSelect.h:63
quint8 psx_block_size(int s)
Definition: FF7Save.cpp:1230
SlotSelect(qreal Scale=1, FF7Save *data=0, bool showLoad=false, QWidget *parent=0)
create a new SlotSelect Dialog.
Definition: SlotSelect.cpp:18
void setLevel(int)
quint8 descParty(int s, int char_num)
Definition: FF7Save.cpp:1659
quint8 descLevel(int s)
Definition: FF7Save.cpp:1658
QColor dialogColorUR(int s)
Definition: FF7Save.cpp:1896
void setParty(QPixmap p1, QPixmap p2, QPixmap p3)
QFrame * frm_preview
Definition: SlotSelect.h:60
QColor dialogColorLR(int s)
Definition: FF7Save.cpp:1898
QPixmap pixmap(int who)
Menu icon for a character.
Definition: FF7Char.cpp:25
QPushButton * btnNew
Definition: SlotSelect.h:64
void ReIntSlot(int s)
Definition: SlotSelect.cpp:102
void clearSlot(int s)
clear a slot
Definition: FF7Save.cpp:591
quint8 psx_block_type(int s)
Definition: FF7Save.cpp:1159