ff7tk  0.02
Toolkit for making FF7 Tools
ItemList.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 "ItemList.h"
17 
18 bool ItemList::eventFilter(QObject *obj, QEvent *ev)
19 {//Catch toolTip related events and process them(i.e custom tooltips :P)
20  if(obj->isWidgetType() && obj->objectName()== "ItemList")
21  {//our object will be the itemlist always in this event.
22  int row=-1;//row @ -1 this way we can catch when were not over A QTableWidgetItem
23  QTableWidgetItem *tbl_item=itemAt(mapFromGlobal(viewport()->cursor().pos()));
24  if(tbl_item !=0){row =tbl_item->row();}//And only update our row if vaild.
25  if(ev->type() == QEvent::ToolTip)
26  {//ToolTip Event Popup.
27  if(createdTooltip)
28  {//We already are showing a tooltip
29  if(row ==-1)
30  {//Invaild Row (off widget perhaps)
31  itemPreview->close();
32  createdTooltip=false;
33  return true;
34  }
35  else
36  {//On a QTableWidgetItem if we are on the same one do nothing
37  if(Items.itemId(itemlist.at(row))==itemPreview->id()){return true;}
38  else
39  {//otherwise close our old ItemPreview
40  itemPreview->close();
41  createdTooltip=false;
42  return true;
43  }
44  }
45  }//end of If(createdToolTip)
46  //If our Entry is an Empty Item then don't show a tooltip
47  if(Items.itemId(itemlist.at(row))==FF7Item::EmptyItem){return true;}
48  else
49  {//unless our xcoord is off on the scrollbar) show for item in row
50  //scrollbars are ontop of the viewport and trigger events for items below.
51  //the width() function returns inner size so it stops at scrollbar
52  if(mapFromGlobal(cursor().pos()).x()>viewport()->width()){return true;}
53  //make an ItemPreview, but give it A ToolTip Flags so it looks/acts as one
54  itemPreview = new ItemPreview(Qt::ToolTip,scale);
56  itemPreview->setGeometry(QRect(cursor().pos(),itemPreview->size()));
57  itemPreview->show();
58  createdTooltip=true;
59  return true;
60  }
61  }//End of ToolTip Event Processing
62  else if(ev->type()==QEvent::HoverLeave)
63  {//HoverLeave Event is used to clean up tooltips when needed.
64  if(createdTooltip)
65  {//if we have made a tooltip then we need to clean it up.
66  if(row ==-1)
67  {//off widget maybe , but not on a QTableWidgetItem
68  itemPreview->close();
69  createdTooltip=false;
70  return true;
71  }
72  else
73  {//This case is called when a tooltip is spawned as its placed under your cursor
74  if(Items.itemId(itemlist.at(row))==itemPreview->id()){return true;}
75  else
76  {//if the item is the same do nothing, otherwise you have to close your tooltip
77  itemPreview->close();
78  createdTooltip=false;
79  return true;
80  }
81  }
82  }//End Of HoverLeave Processing
83  else{return event(ev);}
84  }
85  else{return event(ev);}
86  }
87  else{return false;}
88 }
89 ItemList::ItemList(qreal Scale,QWidget *parent) : QTableWidget(parent)
90 {
91  scale = Scale;
92  setObjectName("ItemList");
93  installEventFilter(this);
94  createdTooltip=false;
95  itemQtyLimit=127;
96  setRowCount(320);
97  setColumnCount(3);
98  setStyleSheet(QString(";"));//set a style and itemSelector will have a normal size column 1
99  setEditTriggers(QAbstractItemView::NoEditTriggers);// thats a long 0
100  setContextMenuPolicy(Qt::NoContextMenu);
101  setSelectionMode(QAbstractItemView::NoSelection);
102  itemSelector = new ItemSelector();
103  createdSelector=true;
104  setCellWidget(0,0,itemSelector);
105  setColumnWidth(0,itemSelector->combo_type_width());
106  setColumnWidth(1,itemSelector->combo_item_width());
107  setColumnWidth(2,itemSelector->qty_width());
109  connect(this,SIGNAL(currentCellChanged(int,int,int,int)),this,SLOT(listSelectionChanged(int,int,int,int)));
110  horizontalHeader()->hide();
111  verticalHeader()->hide();
112  verticalScrollBar()->setToolTip("");//negate custom tooltip
113  for(int i=0;i<320;i++){itemlist.append(FF7Item::EmptyItemData);}//initlize the data.
114  itemSelector->setFixedHeight(fontMetrics().height());
115  setFixedWidth(itemSelector->frameGeometry().width()+ verticalScrollBar()->width() + contentsMargins().left() + contentsMargins().right()+6);
116  itemSelector->close();
117  createdSelector = false;
118  itemupdate();// redraw Display After data init.
119 }
120 
122 {
123  itemQtyLimit = maxQty;
124  //check that any items Qty is not greater then the new Qty. if so fix it.
125  for(int i=0;i<320;i++)
126  {
127  if( (Items.itemQty(itemlist.at(i)) > itemQtyLimit) && (itemlist.at(i)!=FF7Item::EmptyItemData ) )
128  {//qty not above limit and item is not empty.
130  }
131  else{continue;}
132  }
133  itemupdate();
134 }
135 
136 void ItemList::setItems(QList<quint16> items)
137 {
138  itemlist = items;
139  if(createdSelector){itemSelector->close();createdSelector=false;}
140  if(createdTooltip){itemPreview->close();createdTooltip=false;}
141  itemupdate();
142 }
144 {
145  if(createdTooltip){itemPreview->close();createdTooltip=false;}
146 
147  itemlist.replace(sender()->objectName().toInt(),item);
148  if(item == FF7Item::EmptyItemData)
149  {
150  QTableWidgetItem *newItem = new QTableWidgetItem("",0);
151  setItem(sender()->objectName().toInt(),0,newItem);
152  newItem = new QTableWidgetItem(tr("-------EMPTY--------"),0);
153  setItem(sender()->objectName().toInt(),1,newItem);
154  setRowHeight(sender()->objectName().toInt(),fontMetrics().height()+9);
155  newItem = new QTableWidgetItem("",0);
156  setItem(sender()->objectName().toInt(),2,newItem);
157  }
158  else if(createdSelector)
159  {
160  for(int i=0;i<3;i++)
161  {
162  QTableWidgetItem* newItem = new QTableWidgetItem("",0);
163  setItem(sender()->objectName().toInt(),i,newItem);
164  }
165  }
166  emit(itemsChanged(itemlist));
167 }
168 
170 {
171  int j= currentRow();
172  int column0width =columnWidth(0);
173  int column1width =columnWidth(1);
174  int column2width =columnWidth(2);
175  int selectorLocation=321;
176  clearContents();
177  setColumnWidth(0,column0width);
178  setColumnWidth(1,column1width);
179  setColumnWidth(2,column2width);
180  setRowCount(320);
181  if(createdSelector){selectorLocation = itemSelector->objectName().toInt(); itemSelector->setMaximumQty(itemQtyLimit);}
182  for (int i=0;i<320;i++) // set up items
183  {
184  if(i == selectorLocation){continue;}
185  else{updateItem(i);}
186 
187  }
188  blockSignals(true);
189  if(createdSelector)
190  {
191  setCurrentCell(j,0);
192  setCellWidget(j,0,itemSelector);
193  if(itemlist.at(j)== FF7Item::EmptyItemData){/*nice empty under the selector*/}
194  else
195  {//wipe the data under the selector so its easier to read.
196  for(int i=0;i<3;i++)
197  {
198  QTableWidgetItem *newItem = new QTableWidgetItem("",0);
199  setItem(j,i,newItem);
200  }
201  }
203  }
204  blockSignals(false);
205 }
206 void ItemList::listSelectionChanged(int row,int colum,int prevRow,int prevColum)
207 {
208  if(createdSelector){itemSelector->close();createdSelector=false;}
209  if(createdTooltip){itemPreview->close();createdTooltip=false;}
210  if(prevColum>=0 ||prevColum<=0){/*Stop warning about unused var.*/}
211  if(colum<0||row <0){return;}//Ingore if selecting -1 (clearContents)
212  if (prevRow>=0){updateItem(prevRow);}//update the previews Row so its filled again.
215  createdSelector = true;
217  itemSelector->setObjectName(QString::number(row));
218 
219  if(itemlist.at(row)==FF7Item::EmptyItemData){/*nice Empty Item under the selector*/}
220  else
221  {//Clear whats under the selector
222  for(int i=0;i<3;i++)
223  {
224  QTableWidgetItem *newItem = new QTableWidgetItem("",0);
225  setItem(row,i,newItem);
226  }
227  }
228  itemSelector->setMinimumWidth(itemSelector->width());
229  setCellWidget(row,0,itemSelector);
231  connect(itemSelector,SIGNAL(item_changed(quint16)),this,SLOT(itemSelector_changed(quint16)));
232 }
233 void ItemList::updateItem(int row)
234 {
235  QTableWidgetItem *newItem;
236  if (itemlist.at(row) == FF7Item::EmptyItemData)
237  {
238  newItem = new QTableWidgetItem("",0);
239  setItem(row,0,newItem);
240  newItem = new QTableWidgetItem(tr("-------EMPTY--------"),0);
241  setItem(row,1,newItem);
242  newItem = new QTableWidgetItem("",0);
243  setItem(row,2,newItem);
244  }
245  else if(Items.itemId(itemlist.at(row)) > 319)
246  {
247  newItem = new QTableWidgetItem("",0);
248  setItem(row,0,newItem);
249  newItem = new QTableWidgetItem(tr("-------BAD ID-------"),0);
250  setItem(row,1,newItem);
251  newItem = new QTableWidgetItem("",0);
252  setItem(row,2,newItem);
253  }
254  else
255  {
256  QString qty;
257  //Replaced by new item engine. (Vegeta_Ss4)
258  newItem = new QTableWidgetItem(Items.icon(Items.itemId(itemlist.at(row))),"",0);
259  setItem(row,0,newItem);
260  newItem = new QTableWidgetItem(Items.name(Items.itemId(itemlist.at(row))),0);
261  setItem(row,1, newItem);
262  newItem = new QTableWidgetItem(qty.setNum(Items.itemQty(itemlist.at(row))),0);
263  setItem(row,2,newItem);
264  }
265  setRowHeight(row,fontMetrics().height()+9);
266 }
267 void ItemList::setEditableItemCombo(bool editable){editableItemCombo=editable;}
QList< quint16 > itemlist
Definition: ItemList.h:53
void setCurrentItem(quint16 ff7item)
void itemsChanged(QList< quint16 > items)
void setMaximumItemQty(int maxQty)
Definition: ItemList.cpp:121
void itemupdate()
Definition: ItemList.cpp:169
void itemSelector_changed(quint16)
Definition: ItemList.cpp:143
bool eventFilter(QObject *, QEvent *)
Definition: ItemList.cpp:18
void setItems(QList< quint16 > items)
Definition: ItemList.cpp:136
void setEditableItemCombo(bool)
Definition: ItemList.cpp:267
int itemQtyLimit
Definition: ItemList.h:50
quint8 itemQty(quint16 item)
get item id from item
Definition: FF7Item.cpp:157
void setItem(quint16)
int combo_item_width()
void updateItem(int row)
Definition: ItemList.cpp:233
ItemPreview * itemPreview
Definition: ItemList.h:52
bool createdSelector
Definition: ItemList.h:54
void setEditableItemCombo(bool editable)
QString name(int id)
get an items name
Definition: FF7Item.cpp:19
quint16 itemId(quint16 item)
get item id from item
Definition: FF7Item.cpp:151
quint16 itemEncode(quint16 id, quint8 qty)
Encode quint16 in to a rawitem.
Definition: FF7Item.cpp:111
void listSelectionChanged(int row, int colum, int prevRow, int prevColum)
Definition: ItemList.cpp:206
void setFixedHeight(int h)
bool createdTooltip
Definition: ItemList.h:55
FF7Item Items
Definition: ItemList.h:49
void setMaximumQty(int maxQty)
ItemSelector * itemSelector
Definition: ItemList.h:51
bool editableItemCombo
Definition: ItemList.h:56
QIcon icon(int id)
get an items picture as qicon
Definition: FF7Item.cpp:23
qreal scale
Definition: ItemList.h:57
int combo_type_width()
ItemList(qreal Scale=1, QWidget *parent=0)
Definition: ItemList.cpp:89
int id(void)