From 0b2231639f9513b9760b6675cbc0c49610520000 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Sun, 5 Jan 2014 09:47:50 +0000 Subject: [PATCH 01/16] initial experiment with editor layout --- cockatrice/CMakeLists.txt | 2 + cockatrice/src/cardframe.cpp | 64 ++++++++++++++++++++++++++++++ cockatrice/src/cardframe.h | 32 +++++++++++++++ cockatrice/src/cardinfowidget.cpp | 38 ++++++++++-------- cockatrice/src/tab_deck_editor.cpp | 60 +++++++++++++++++----------- cockatrice/src/tab_deck_editor.h | 4 +- 6 files changed, 158 insertions(+), 42 deletions(-) create mode 100644 cockatrice/src/cardframe.cpp create mode 100644 cockatrice/src/cardframe.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 70de75a5..50e7eba8 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -33,6 +33,7 @@ SET(cockatrice_SOURCES src/dlg_load_deck_from_clipboard.cpp src/dlg_load_remote_deck.cpp src/cardinfowidget.cpp + src/cardframe.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp @@ -110,6 +111,7 @@ SET(cockatrice_HEADERS src/dlg_load_deck_from_clipboard.h src/dlg_load_remote_deck.h src/cardinfowidget.h + src/cardframe.h src/messagelogwidget.h src/zoneviewzone.h src/zoneviewwidget.h diff --git a/cockatrice/src/cardframe.cpp b/cockatrice/src/cardframe.cpp new file mode 100644 index 00000000..bdfca5cf --- /dev/null +++ b/cockatrice/src/cardframe.cpp @@ -0,0 +1,64 @@ +#include "cardframe.h" + +#include +#include "carditem.h" +#include "carddatabase.h" +#include "main.h" + +CardFrame::CardFrame(const QString &cardName, QWidget *parent, Qt::WindowFlags flags) + : QLabel(parent, flags) + , info(0) +{ + this->setAlignment(Qt::AlignCenter); + + setFrameStyle(QFrame::Panel | QFrame::Raised); + setFixedWidth(250); + + setCard(db->getCard(cardName)); +} + +void CardFrame::setCard(CardInfo *card) +{ + if (info) + disconnect(info, 0, this, 0); + info = card; + connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); + connect(info, SIGNAL(destroyed()), this, SLOT(clear())); + + updatePixmap(); +} + +void CardFrame::setCard(const QString &cardName) +{ + setCard(db->getCard(cardName)); +} + +void CardFrame::setCard(AbstractCardItem *card) +{ + setCard(card->getInfo()); +} + +void CardFrame::clear() +{ + setCard(db->getCard()); +} + +void CardFrame::updatePixmap() +{ + qreal aspectRatio = (qreal) CARD_HEIGHT / (qreal) CARD_WIDTH; + qreal pixmapWidth = this->width(); + + if (pixmapWidth == 0) + return; + + QPixmap *resizedPixmap = info->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)); + if (resizedPixmap) + this->setPixmap(*resizedPixmap); + else + this->setPixmap(*(db->getCard()->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)))); +} + +QString CardFrame::getCardName() const +{ + return info->getName(); +} diff --git a/cockatrice/src/cardframe.h b/cockatrice/src/cardframe.h new file mode 100644 index 00000000..465dff24 --- /dev/null +++ b/cockatrice/src/cardframe.h @@ -0,0 +1,32 @@ +#ifndef CARDFRAME_H +#define CARDFRAME_H + +#include +#include + +class AbstractCardItem; +class CardInfo; +class QResizeEvent; + +class CardFrame : public QLabel { + Q_OBJECT + +private: + CardInfo *info; + +public: + CardFrame(const QString &cardName = QString(), QWidget *parent = 0, Qt::WindowFlags f = 0); + QString getCardName() const; + +public slots: + void setCard(CardInfo *card); + void setCard(const QString &cardName); + void setCard(AbstractCardItem *card); + +private slots: + void clear(); + void updatePixmap(); + +}; + +#endif diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index e0ad1b7e..61b35453 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -51,23 +51,29 @@ CardInfoWidget::CardInfoWidget(ResizeMode _mode, const QString &cardName, QWidge textLabel->setReadOnly(true); QGridLayout *grid = new QGridLayout(this); - int row = 0; - if (mode == ModeGameTab) + if (mode == ModeGameTab) { + int row = 0; + grid->addWidget(dropList, row++, 1, 1, 1, Qt::AlignRight); - grid->addWidget(cardPicture, row++, 0, 1, 2); - grid->addWidget(nameLabel1, row, 0); - grid->addWidget(nameLabel2, row++, 1); - grid->addWidget(manacostLabel1, row, 0); - grid->addWidget(manacostLabel2, row++, 1); - grid->addWidget(cardtypeLabel1, row, 0); - grid->addWidget(cardtypeLabel2, row++, 1); - grid->addWidget(powtoughLabel1, row, 0); - grid->addWidget(powtoughLabel2, row++, 1); - grid->addWidget(loyaltyLabel1, row, 0); - grid->addWidget(loyaltyLabel2, row++, 1); - grid->addWidget(textLabel, row, 0, -1, 2); - grid->setRowStretch(row, 1); - grid->setColumnStretch(1, 1); + grid->addWidget(cardPicture, row++, 0, 1, 2); + grid->addWidget(nameLabel1, row, 0); + grid->addWidget(nameLabel2, row++, 1); + grid->addWidget(manacostLabel1, row, 0); + grid->addWidget(manacostLabel2, row++, 1); + grid->addWidget(cardtypeLabel1, row, 0); + grid->addWidget(cardtypeLabel2, row++, 1); + grid->addWidget(powtoughLabel1, row, 0); + grid->addWidget(powtoughLabel2, row++, 1); + grid->addWidget(loyaltyLabel1, row, 0); + grid->addWidget(loyaltyLabel2, row++, 1); + grid->addWidget(textLabel, row, 0, -1, 2); + grid->setRowStretch(row, 1); + grid->setColumnStretch(1, 1); + } else { + /*grid->addWidget(cardPicture, 0, 0); + grid->setRowStretch(0, 1); + grid->setColumnStretch(0, 1);*/ + } retranslateUi(); setFrameStyle(QFrame::Panel | QFrame::Raised); diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 216958ac..9ec0cac2 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -21,7 +21,6 @@ #include "carddatabase.h" #include "carddatabasemodel.h" #include "decklistmodel.h" -#include "cardinfowidget.h" #include "dlg_cardsearch.h" #include "dlg_load_deck_from_clipboard.h" #include "dlg_edit_tokens.h" @@ -34,6 +33,18 @@ #include "pending_command.h" #include "pb/response.pb.h" #include "pb/command_deck_upload.pb.h" +#include +#include +#include +#include +#include +#include +#include +#include "cardframe.h" +#include "carditem.h" +#include "carddatabase.h" +#include "main.h" +#include "settingscache.h" void SearchLineEdit::keyPressEvent(QKeyEvent *event) { @@ -85,25 +96,16 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); searchEdit->setTreeView(databaseView); - QVBoxLayout *leftFrame = new QVBoxLayout; - leftFrame->addLayout(searchLayout); - leftFrame->addWidget(databaseView); - - cardInfo = new CardInfoWidget(CardInfoWidget::ModeDeckEditor); + cardInfo = new CardFrame(); cardInfo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); QToolBar *verticalToolBar = new QToolBar; - verticalToolBar->setOrientation(Qt::Vertical); - verticalToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + verticalToolBar->setOrientation(Qt::Horizontal); verticalToolBar->setIconSize(QSize(24, 24)); QHBoxLayout *verticalToolBarLayout = new QHBoxLayout; - verticalToolBarLayout->addStretch(); + //verticalToolBarLayout->addStretch(); verticalToolBarLayout->addWidget(verticalToolBar); - verticalToolBarLayout->addStretch(); - - QVBoxLayout *middleFrame = new QVBoxLayout; - middleFrame->addWidget(cardInfo, 10); - middleFrame->addLayout(verticalToolBarLayout); + //verticalToolBarLayout->addStretch(); deckModel = new DeckListModel(this); connect(deckModel, SIGNAL(deckHashChanged()), this, SLOT(updateHash())); @@ -129,8 +131,8 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) grid->addWidget(nameLabel, 0, 0); grid->addWidget(nameEdit, 0, 1); - grid->addWidget(commentsLabel, 1, 0); - grid->addWidget(commentsEdit, 1, 1); + /*grid->addWidget(commentsLabel, 1, 0); + grid->addWidget(commentsEdit, 1, 1);*/ grid->addWidget(hashLabel1, 2, 0); grid->addWidget(hashLabel, 2, 1); @@ -152,15 +154,25 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) deckToolbarLayout->addWidget(deckToolBar); deckToolbarLayout->addStretch(); - QVBoxLayout *rightFrame = new QVBoxLayout; - rightFrame->addLayout(grid); - rightFrame->addWidget(deckView, 10); - rightFrame->addLayout(deckToolbarLayout); + QVBoxLayout *deckFrame = new QVBoxLayout; + deckFrame->addLayout(grid); + deckFrame->addWidget(deckView, 10); + deckFrame->addLayout(deckToolbarLayout); - QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addLayout(leftFrame, 10); - mainLayout->addLayout(middleFrame); - mainLayout->addLayout(rightFrame, 10); + QHBoxLayout *topFrame = new QHBoxLayout; + topFrame->addWidget(cardInfo, 10); + topFrame->addLayout(deckFrame); + + QVBoxLayout *botFrame = new QVBoxLayout; + QGridLayout *searchAndButtons = new QGridLayout; + searchAndButtons->addLayout(verticalToolBarLayout, 0, 0); + searchAndButtons->addLayout(searchLayout, 0, 1); + botFrame->addLayout(searchAndButtons); + botFrame->addWidget(databaseView); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(topFrame, 10); + mainLayout->addLayout(botFrame, 10); setLayout(mainLayout); aNewDeck = new QAction(QString(), this); diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 73ee8a14..9580aceb 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -10,7 +10,7 @@ class CardDatabaseDisplayModel; class DeckListModel; class QTreeView; class QTableView; -class CardInfoWidget; +class CardFrame; class QTextEdit; class DlgCardSearch; class QLabel; @@ -71,7 +71,7 @@ private: DeckListModel *deckModel; QTreeView *databaseView; QTreeView *deckView; - CardInfoWidget *cardInfo; + CardFrame *cardInfo; QLabel *searchLabel; SearchLineEdit *searchEdit; QLabel *nameLabel; From 863e437d4c8387c4d98aaf6e4a121aec6c7a776c Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Fri, 17 Jan 2014 10:06:45 +0000 Subject: [PATCH 02/16] added filter builder widget and filter tree filter builder takes filter options from user, then adds completed filters to the filter tree. the filter tree does not currently do anything. in the future it will filter the cards in the database view. --- cockatrice/CMakeLists.txt | 8 + cockatrice/src/cardfilter.cpp | 31 ++++ cockatrice/src/cardfilter.h | 39 +++++ cockatrice/src/cardinfowidget.cpp | 4 - cockatrice/src/filterbuilder.cpp | 83 ++++++++++ cockatrice/src/filterbuilder.h | 37 +++++ cockatrice/src/filterlist.cpp | 160 +++++++++++++++++++ cockatrice/src/filterlist.h | 123 ++++++++++++++ cockatrice/src/filterlistmodel.cpp | 247 +++++++++++++++++++++++++++++ cockatrice/src/filterlistmodel.h | 41 +++++ cockatrice/src/tab_deck_editor.cpp | 95 ++++++++--- cockatrice/src/tab_deck_editor.h | 5 + 12 files changed, 847 insertions(+), 26 deletions(-) create mode 100644 cockatrice/src/cardfilter.cpp create mode 100644 cockatrice/src/cardfilter.h create mode 100644 cockatrice/src/filterbuilder.cpp create mode 100644 cockatrice/src/filterbuilder.h create mode 100644 cockatrice/src/filterlist.cpp create mode 100644 cockatrice/src/filterlist.h create mode 100644 cockatrice/src/filterlistmodel.cpp create mode 100644 cockatrice/src/filterlistmodel.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 50e7eba8..97f771a9 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -34,6 +34,10 @@ SET(cockatrice_SOURCES src/dlg_load_remote_deck.cpp src/cardinfowidget.cpp src/cardframe.cpp + src/filterbuilder.cpp + src/cardfilter.cpp + src/filterlistmodel.cpp + src/filterlist.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp @@ -112,6 +116,10 @@ SET(cockatrice_HEADERS src/dlg_load_remote_deck.h src/cardinfowidget.h src/cardframe.h + src/filterbuilder.h + src/cardfilter.h + src/filterlistmodel.h + src/filterlist.h src/messagelogwidget.h src/zoneviewzone.h src/zoneviewwidget.h diff --git a/cockatrice/src/cardfilter.cpp b/cockatrice/src/cardfilter.cpp new file mode 100644 index 00000000..d6fe790e --- /dev/null +++ b/cockatrice/src/cardfilter.cpp @@ -0,0 +1,31 @@ +#include "cardfilter.h" + +const char *CardFilter::typeName(Type t) +{ + switch(t) { + case TypeAnd: + return "and"; + case TypeOr: + return "or"; + case TypeAndNot: + return "and not"; + case TypeOrNot: + return "or not"; + default: + return ""; + } +} + +const char *CardFilter::attrName(Attr a) +{ + switch(a) { + case AttrName: + return "name"; + case AttrType: + return "type"; + case AttrColor: + return "color"; + default: + return ""; + } +} diff --git a/cockatrice/src/cardfilter.h b/cockatrice/src/cardfilter.h new file mode 100644 index 00000000..67395c2d --- /dev/null +++ b/cockatrice/src/cardfilter.h @@ -0,0 +1,39 @@ +#ifndef CARDFILTER_H +#define CARDFILTER_H + +#include + +class CardFilter { +public: + enum Type { + TypeAnd = 0, + TypeOr, + TypeAndNot, + TypeOrNot, + TypeEnd + }; + + enum Attr { + AttrName = 0, + AttrType, + AttrColor, + AttrEnd + }; + +private: + enum Type t; + enum Attr a; + QString trm; + +public: + CardFilter(QString term, Type type, Attr attr) : trm(term), t(type), a(attr) {}; + + Type type() const { return t; } + const QString &term() const { return trm; } + Attr attr() const { return a; } + + static const char *typeName(Type t); + static const char *attrName(Attr a); +}; + +#endif diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index 61b35453..708da01c 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -69,10 +69,6 @@ CardInfoWidget::CardInfoWidget(ResizeMode _mode, const QString &cardName, QWidge grid->addWidget(textLabel, row, 0, -1, 2); grid->setRowStretch(row, 1); grid->setColumnStretch(1, 1); - } else { - /*grid->addWidget(cardPicture, 0, 0); - grid->setRowStretch(0, 1); - grid->setColumnStretch(0, 1);*/ } retranslateUi(); diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp new file mode 100644 index 00000000..53b93144 --- /dev/null +++ b/cockatrice/src/filterbuilder.cpp @@ -0,0 +1,83 @@ +#include "filterbuilder.h" + +#include +#include +#include +#include + +#include "cardfilter.h" + +FilterBuilder::FilterBuilder(QWidget *parent) + : QFrame(parent) +{ + int i; + + QVBoxLayout *layout = new QVBoxLayout; + QHBoxLayout *addFilter = new QHBoxLayout; + + filterCombo = new QComboBox; + for(i = 0; i < CardFilter::AttrEnd; i++) + filterCombo->addItem( + CardFilter::attrName(static_cast(i)), QVariant(i)); + + typeCombo = new QComboBox; + for(i = 0; i < CardFilter::TypeEnd; i++) + typeCombo->addItem( + CardFilter::typeName(static_cast(i)), QVariant(i)); + + QPushButton *ok = new QPushButton("+"); + ok->setMaximumSize(20, 20); + + addFilter->addWidget(ok); + addFilter->addWidget(typeCombo); + addFilter->addWidget(filterCombo, Qt::AlignLeft); + + edit = new QLineEdit; + edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + layout->addLayout(addFilter); + layout->addWidget(edit); + + setFrameStyle(QFrame::Plain | QFrame::Box); + layout->setAlignment(Qt::AlignTop); + setLayout(layout); + + connect(ok, SIGNAL(released()), this, SLOT(add_released())); + fltr = NULL; +} + +FilterBuilder::~FilterBuilder() +{ + destroyFilter(); +} + +void FilterBuilder::destroyFilter() +{ + if(fltr) + delete fltr; +} + +static int comboCurrentIntData(const QComboBox *combo) +{ + return combo->itemData(combo->currentIndex()).toInt(); +} + +void FilterBuilder::add_released() +{ + QString txt; + + txt = edit->text(); + if(txt.length() < 1) + return; + + destroyFilter(); + fltr = new CardFilter(txt, + static_cast(comboCurrentIntData(typeCombo)), + static_cast(comboCurrentIntData(filterCombo))); + emit add(fltr); +} + +bool FilterBuilder::filter(const CardFilter *f) const +{ + f = fltr; + return false; +} diff --git a/cockatrice/src/filterbuilder.h b/cockatrice/src/filterbuilder.h new file mode 100644 index 00000000..2762ba28 --- /dev/null +++ b/cockatrice/src/filterbuilder.h @@ -0,0 +1,37 @@ +#ifndef FILTERBUILDER_H +#define FILTERBUILDER_H + +#include + +class QCheckBox; +class QComboBox; +class QLineEdit; +class CardFilter; + +class FilterBuilder : public QFrame { + Q_OBJECT + +private: + QComboBox *typeCombo; + QComboBox *filterCombo; + QLineEdit *edit; + CardFilter *fltr; + + void destroyFilter(); + +public: + FilterBuilder(QWidget *parent = 0); + ~FilterBuilder(); + + bool filter(const CardFilter *f) const; + +signals: + void add(const CardFilter *f); + +public slots: +private slots: + void add_released(); +protected: +}; + +#endif diff --git a/cockatrice/src/filterlist.cpp b/cockatrice/src/filterlist.cpp new file mode 100644 index 00000000..35d7a0fc --- /dev/null +++ b/cockatrice/src/filterlist.cpp @@ -0,0 +1,160 @@ +#include "filterlist.h" +#include "CardFilter.h" + +#include + +LogicMap::~LogicMap() +{ + while(!isEmpty()) + delete takeFirst(); +} + +FilterItemList *LogicMap::typeList(CardFilter::Type type) +{ + LogicMap::iterator i; + int count; + + count = 0; + for(i = begin(); i != end(); i++) { + if ((*i)->type == type) + break; + count++; + } + if (i == end()) { + p->preInsertChild(this, count); + i = insert(i, new FilterItemList(type, this)); + p->postInsertChild(this, count); + } + + return *i; +} + +FilterListNode *LogicMap::parent() const +{ + return p; +} + +FilterListNode *LogicMap::nodeAt(int i) const +{ + return ((size() > i)? at(i) : NULL); +} + +void LogicMap::deleteAt(int i) +{ + delete takeAt(i); +} + +int LogicMap::index() const +{ + return p->indexOf(this); +} + +FilterListNode *FilterItemList::nodeAt(int i) const +{ + return ((size() > i)? at(i) : NULL); +} + +void FilterItemList::deleteAt(int i) { + delete takeAt(i); +} + +FilterItemList::~FilterItemList() +{ + while(!isEmpty()) + delete takeFirst(); +} + +FilterList::~FilterList() +{ + while(!logicAttrs.isEmpty()) { + delete logicAttrs.takeFirst(); + } +} + +LogicMap *FilterList::attrLogicMap(CardFilter::Attr attr) +{ + QList::iterator i; + int count; + + count = 0; + for(i = logicAttrs.begin(); i != logicAttrs.end(); i++) { + if((*i)->attr == attr) + break; + count++; + } + + if(i == logicAttrs.end()) { + preInsertChild(this, count); + i = logicAttrs.insert(i, new LogicMap(attr, this)); + postInsertChild(this, count); + } + + return *i; +} + +FilterItemList *FilterList::attrTypeList(CardFilter::Attr attr, + CardFilter::Type type) +{ + return attrLogicMap(attr)->typeList(type); +} + +int FilterList::findTermIndex(CardFilter::Attr attr, CardFilter::Type type, + const QString &term) +{ + FilterItemList *fis; + int i; + + fis = attrTypeList(attr, type); + for(i = 0; i < fis->count(); i++) + if((fis->at(i))->term == term) + return i; + + return -1; +} + +int FilterList::findTermIndex(const CardFilter *f) +{ + return findTermIndex(f->attr(), f->type(), f->term()); +} + +FilterListNode *FilterList::termNode(CardFilter::Attr attr, CardFilter::Type type, + const QString &term) +{ + FilterItemList *fis; + FilterItem *fi; + int i, count; + + fis = attrTypeList(attr, type); + i = findTermIndex(attr, type, term); + if(i < 0) { + fi = new FilterItem(term, fis); + count = fis->childCount(); + preInsertChild(fis, count); + fis->append(fi); + postInsertChild(fis, count); + return fi; + } + + return fis->at(i); +} + +FilterListNode *FilterList::termNode(const CardFilter *f) +{ + return termNode(f->attr(), f->type(), f->term()); +} + +FilterListNode *FilterList::attrTypeNode(CardFilter::Attr attr, + CardFilter::Type type) +{ + return attrTypeList(attr, type); +} + +int FilterList::count(CardFilter::Attr attr, CardFilter::Type type) +{ + return attrTypeList(attr, type)->count(); +} + +int FilterList::count(const CardFilter *f) +{ + return count(f->attr(), f->type()); +} diff --git a/cockatrice/src/filterlist.h b/cockatrice/src/filterlist.h new file mode 100644 index 00000000..aed58f7d --- /dev/null +++ b/cockatrice/src/filterlist.h @@ -0,0 +1,123 @@ +#ifndef FILTERLIST_H +#define FILTERLIST_H + +#include +#include +#include + +#include "cardfilter.h" + +class FilterListNode { +private: + bool enabled; +public: + FilterListNode() : enabled(true) {} + virtual bool isEnabled() const { return enabled; } + virtual void enable() { enabled = true; } + virtual void disable() { enabled = false; } + virtual FilterListNode *parent() const { return NULL; } + virtual FilterListNode *nodeAt(int i) const { return NULL; } + virtual void deleteAt(int i) {} + virtual int childCount() const { return 0; } + virtual int index() const { return -1; } + virtual QString text() const { return ""; } + virtual bool isLeaf() const { return false; } + virtual const char *textCStr() const { return text().toStdString().c_str(); } +}; + +class FilterItemList; +class FilterList; +class LogicMap + : public QList + , public FilterListNode { +private: + FilterList *const p; +public: + const CardFilter::Attr attr; + + LogicMap(CardFilter::Attr a, FilterList *parent) + : attr(a), p(parent) {} + ~LogicMap(); + FilterItemList *typeList(CardFilter::Type type); + virtual FilterListNode *parent() const; + virtual FilterListNode *nodeAt(int i) const; + virtual void deleteAt(int i); + virtual int childCount() const { return size(); } + virtual int index() const; + virtual QString text() const { return QString(CardFilter::attrName(attr)); } +}; + +class FilterItem; +class FilterItemList + : public QList + , public FilterListNode { +private: + LogicMap *const p; +public: + const CardFilter::Type type; + FilterItemList(CardFilter::Type t, LogicMap *parent) + : type(t), p(parent) {} + ~FilterItemList(); + CardFilter::Attr attr() const { return p->attr; } + virtual FilterListNode *parent() const { return p; } + virtual FilterListNode *nodeAt(int i) const; + virtual void deleteAt(int i); + virtual int childCount() const { return size(); } + virtual int index() const { return p->indexOf((FilterItemList *) this); } + virtual QString text() const { return QString(CardFilter::typeName(type)); } +}; + +class FilterItem : public FilterListNode { +private: + FilterItemList *const p; +public: + const QString term; + + FilterItem(QString trm, FilterItemList *parent) + : p(parent), term(trm) {} + + CardFilter::Attr attr() const { return p->attr(); } + CardFilter::Type type() const { return p->type; } + virtual FilterListNode *parent() const { return p; } + virtual int index() const { return p->indexOf((FilterItem *)this); } + virtual QString text() const { return term; } + virtual bool isLeaf() const { return true; } +}; + +class FilterList : public QObject, public FilterListNode { + Q_OBJECT + +signals: + void preInsertRow(const FilterListNode *parent, int i) const; + void postInsertRow(const FilterListNode *parent, int i) const; + +private: + QList logicAttrs; + + LogicMap *attrLogicMap(CardFilter::Attr attr); + FilterItemList *attrTypeList(CardFilter::Attr attr, + CardFilter::Type type); + +public: + ~FilterList(); + int indexOf(const LogicMap *val) const { return logicAttrs.indexOf((LogicMap *) val); } + int findTermIndex(CardFilter::Attr attr, CardFilter::Type type, + const QString &term); + int findTermIndex(const CardFilter *f); + FilterListNode *termNode(CardFilter::Attr attr, CardFilter::Type type, + const QString &term); + FilterListNode *termNode(const CardFilter *f); + FilterListNode *attrTypeNode(CardFilter::Attr attr, + CardFilter::Type type); + int count(CardFilter::Attr attr, CardFilter::Type type); + int count(const CardFilter *f); + virtual FilterListNode *nodeAt(int i) const { return ((logicAttrs.size() > i)? logicAttrs.at(i) : NULL); } + virtual void deleteAt(int i) { delete logicAttrs.takeAt(i); } + virtual int childCount() const { return logicAttrs.size(); } + virtual QString text() const { return QString("root"); } + virtual int index() const { return 0; } + void preInsertChild(const FilterListNode *p, int i) const { emit preInsertRow(p, i); } + void postInsertChild(const FilterListNode *p, int i) const { emit postInsertRow(p, i); } +}; + +#endif diff --git a/cockatrice/src/filterlistmodel.cpp b/cockatrice/src/filterlistmodel.cpp new file mode 100644 index 00000000..6bd84809 --- /dev/null +++ b/cockatrice/src/filterlistmodel.cpp @@ -0,0 +1,247 @@ +#include +#include "filterlistmodel.h" +#include "filterlist.h" +#include "cardfilter.h" + +FilterListModel::FilterListModel(QObject *parent) + : QAbstractItemModel(parent) +{ + filterList = new FilterList; + connect(filterList, + SIGNAL(preInsertRow(const FilterListNode *, int)), + this, SLOT(proxyBeginInsertRow(const FilterListNode *, int))); + connect(filterList, + SIGNAL(postInsertRow(const FilterListNode *, int)), + this, SLOT(proxyEndInsertRow(const FilterListNode *, int))); +} + +FilterListModel::~FilterListModel() +{ + delete filterList; +} + +void FilterListModel::proxyBeginInsertRow(const FilterListNode *node, int i) +{ + int idx; + + idx = node->index(); + if(idx >= 0) + beginInsertRows(createIndex(idx, 0, (void *) node), i, i); +} + +void FilterListModel::proxyEndInsertRow(const FilterListNode *node, int) +{ + int idx; + + idx = node->index(); + if(idx >= 0) + endInsertRows(); +} + +FilterListNode *FilterListModel::indexToNode(const QModelIndex &idx) const +{ + void *ip; + FilterListNode *node; + + if(!idx.isValid()) + return filterList; + + ip = idx.internalPointer(); + if(ip == NULL) + return filterList; + + node = static_cast(ip); + return node; +} + +void FilterListModel::addFilter(const CardFilter *f) +{ + emit layoutAboutToBeChanged(); + filterList->termNode(f); + emit layoutChanged(); +} + +int FilterListModel::rowCount(const QModelIndex &parent) const +{ + const FilterListNode *node; + int result; + + if(parent.column() > 0) + return 0; + + node = indexToNode(parent); + if(node) + result = node->childCount(); + else + result = 0; + + return result; +} + +int FilterListModel::columnCount(const QModelIndex &/*parent*/) const +{ + return 1; +} + +QVariant FilterListModel::data(const QModelIndex &index, int role) const +{ + const FilterListNode *node; + + if (!index.isValid()) + return QVariant(); + if (index.column() >= columnCount()) + return QVariant(); + + node = indexToNode(index); + if(node == NULL) + return QVariant(); + + switch (role) { + case Qt::FontRole: + if(!node->isLeaf()) { + QFont f; + f.setBold(true); + return f; + } + break; + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + case Qt::StatusTipRole: + case Qt::WhatsThisRole: + return node->text(); + case Qt::CheckStateRole: + if(node->isEnabled()) + return Qt::Checked; + else + return Qt::Unchecked; + default: + return QVariant(); + } + + return QVariant(); +} + +bool FilterListModel::setData(const QModelIndex &index, + const QVariant &value, int role) +{ + FilterListNode *node; + + if (!index.isValid()) + return false; + if (index.column() >= columnCount()) + return false; + if (role != Qt::CheckStateRole ) + return false; + + node = indexToNode(index); + if(node == NULL || node == filterList) + return false; + + Qt::CheckState state = static_cast(value.toInt()); + if(state == Qt::Checked) + node->enable(); + else + node->disable(); + + emit dataChanged(index, index); + return true; +} + +Qt::ItemFlags FilterListModel::flags(const QModelIndex &index) const +{ + const FilterListNode *node; + Qt::ItemFlags result; + + if (!index.isValid()) + return 0; + + node = indexToNode(index); + if(node == NULL) + return 0; + + result = Qt::ItemIsEnabled; + if(node == filterList) + return result; + + result |= Qt::ItemIsSelectable; + result |= Qt::ItemIsUserCheckable; + + return result; +} + +QModelIndex FilterListModel::nodeIndex(const FilterListNode *node, int row, int column) const +{ + FilterListNode *child; + + if (column > 0 || row >= node->childCount()) + return QModelIndex(); + + child = node->nodeAt(row); + return createIndex(row, column, child); +} + +QModelIndex FilterListModel::index(int row, int column, + const QModelIndex &parent) const +{ + const FilterListNode *node; + + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + node = indexToNode(parent); + if(node == NULL) + return QModelIndex(); + + return nodeIndex(node, row, column); +} + +QModelIndex FilterListModel::parent(const QModelIndex &ind) const +{ + const FilterListNode *node; + FilterListNode *parent; + int row; + QModelIndex idx; + + if (!ind.isValid()) + return QModelIndex(); + + node = indexToNode(ind); + if(node == NULL || node == filterList) + return QModelIndex(); + + parent = node->parent(); + if(parent) { + row = parent->index(); + if(row < 0) + return QModelIndex(); + idx = createIndex(row, 0, parent); + return idx; + } + + return QModelIndex(); +} + +bool FilterListModel::removeRows(int row, int count, const QModelIndex & parent) +{ + FilterListNode *node; + int i, last; + + last = row+count-1; + if (!parent.isValid() || count < 1 || row < 0) + return false; + + node = indexToNode(parent); + if(node == NULL || last >= node->childCount()) + return false; + + beginRemoveRows(parent, row, last); + for(i = 0; i < count; i++) + node->deleteAt(row); + endRemoveRows(); + + if(node != filterList && node->childCount() < 1) + return removeRow(parent.row(), parent.parent()); + + return true; +} diff --git a/cockatrice/src/filterlistmodel.h b/cockatrice/src/filterlistmodel.h new file mode 100644 index 00000000..de25f452 --- /dev/null +++ b/cockatrice/src/filterlistmodel.h @@ -0,0 +1,41 @@ +#ifndef FILTERLISTMODEL_H +#define FILTERLISTMODEL_H + +#include + +class FilterList; +class CardFilter; +class FilterListNode; + +class FilterListModel : public QAbstractItemModel { + Q_OBJECT +private: + FilterList *filterList; + +public slots: + void addFilter(const CardFilter *f); + +private slots: + void proxyBeginInsertRow(const FilterListNode *, int); + void proxyEndInsertRow(const FilterListNode *node, int i); + +private: + FilterListNode *indexToNode(const QModelIndex &idx) const; + QModelIndex nodeIndex(const FilterListNode *node, int row, int column) const; + +public: + FilterListModel(QObject *parent = 0); + ~FilterListModel(); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole); + Qt::ItemFlags flags(const QModelIndex &index) const; + QModelIndex parent(const QModelIndex &ind) const; + QModelIndex index(int row, int column, + const QModelIndex &parent) const; + bool removeRows(int row, int count, const QModelIndex & parent); +}; + +#endif diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 9ec0cac2..a7aded4c 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -41,10 +41,13 @@ #include #include #include "cardframe.h" +#include "filterbuilder.h" #include "carditem.h" #include "carddatabase.h" #include "main.h" #include "settingscache.h" +#include "filterlistmodel.h" +#include "filterlist.h" void SearchLineEdit::keyPressEvent(QKeyEvent *event) { @@ -131,28 +134,25 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) grid->addWidget(nameLabel, 0, 0); grid->addWidget(nameEdit, 0, 1); - /*grid->addWidget(commentsLabel, 1, 0); - grid->addWidget(commentsEdit, 1, 1);*/ - grid->addWidget(hashLabel1, 2, 0); grid->addWidget(hashLabel, 2, 1); - // Update price - aUpdatePrices = new QAction(QString(), this); - aUpdatePrices->setIcon(QIcon(":/resources/icon_update.png")); - connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices())); + // Update price + aUpdatePrices = new QAction(QString(), this); + aUpdatePrices->setIcon(QIcon(":/resources/icon_update.png")); + connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices())); if (!settingsCache->getPriceTagFeature()) aUpdatePrices->setVisible(false); - - QToolBar *deckToolBar = new QToolBar; - deckToolBar->setOrientation(Qt::Vertical); - deckToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - deckToolBar->setIconSize(QSize(24, 24)); - deckToolBar->addAction(aUpdatePrices); - QHBoxLayout *deckToolbarLayout = new QHBoxLayout; - deckToolbarLayout->addStretch(); - deckToolbarLayout->addWidget(deckToolBar); - deckToolbarLayout->addStretch(); + + QToolBar *deckToolBar = new QToolBar; + deckToolBar->setOrientation(Qt::Vertical); + deckToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + deckToolBar->setIconSize(QSize(24, 24)); + deckToolBar->addAction(aUpdatePrices); + QHBoxLayout *deckToolbarLayout = new QHBoxLayout; + deckToolbarLayout->addStretch(); + deckToolbarLayout->addWidget(deckToolBar); + deckToolbarLayout->addStretch(); QVBoxLayout *deckFrame = new QVBoxLayout; deckFrame->addLayout(grid); @@ -168,7 +168,30 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) searchAndButtons->addLayout(verticalToolBarLayout, 0, 0); searchAndButtons->addLayout(searchLayout, 0, 1); botFrame->addLayout(searchAndButtons); - botFrame->addWidget(databaseView); + + filterModel = new FilterListModel(); + filterView = new QTreeView; + filterView->setModel(filterModel); + filterView->setMaximumWidth(250); + filterView->setUniformRowHeights(true); + filterView->setHeaderHidden(true); + filterView->setExpandsOnDoubleClick(false); + filterView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); + connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)), + this, SLOT(filterViewCustomContextMenu(const QPoint &))); + FilterBuilder *filterBuilder = new FilterBuilder; + filterBuilder->setMaximumWidth(250); + connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); + + QVBoxLayout *filter = new QVBoxLayout; + filter->addWidget(filterBuilder, 0, Qt::AlignTop); + filter->addWidget(filterView); + + QHBoxLayout *dbFrame = new QHBoxLayout; + dbFrame->addLayout(filter); + dbFrame->addWidget(databaseView); + botFrame->addLayout(dbFrame); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topFrame, 10); @@ -234,16 +257,16 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) aAddCard->setIcon(QIcon(":/resources/arrow_right_green.svg")); connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard())); aAddCardToSideboard = new QAction(QString(), this); - aAddCardToSideboard->setIcon(QIcon(":/resources/add_to_sideboard.svg")); + aAddCardToSideboard->setIcon(QIcon(":/resources/add_to_sideboard.svg")); connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard())); aRemoveCard = new QAction(QString(), this); - aRemoveCard->setIcon(QIcon(":/resources/remove_row.svg")); + aRemoveCard->setIcon(QIcon(":/resources/remove_row.svg")); connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard())); aIncrement = new QAction(QString(), this); - aIncrement->setIcon(QIcon(":/resources/increment.svg")); + aIncrement->setIcon(QIcon(":/resources/increment.svg")); connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement())); aDecrement = new QAction(QString(), this); - aDecrement->setIcon(QIcon(":/resources/decrement.svg")); + aDecrement->setIcon(QIcon(":/resources/decrement.svg")); connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); verticalToolBar->addAction(aAddCard); @@ -632,3 +655,31 @@ void TabDeckEditor::setModified(bool _modified) modified = _modified; emit tabTextChanged(this, getTabText()); } + +void TabDeckEditor::filterViewCustomContextMenu(const QPoint &point) { + QMenu menu; + QAction *action; + QModelIndex idx; + + idx = filterView->indexAt(point); + if(!idx.isValid()) + return; + + action = menu.addAction(QString("delete")); + action->setData(point); + connect(&menu, SIGNAL(triggered(QAction *)), + this, SLOT(filterRemove(QAction *))); + menu.exec(filterView->mapToGlobal(point)); +} + +void TabDeckEditor::filterRemove(QAction *action) { + QPoint point; + QModelIndex idx; + + point = action->data().toPoint(); + idx = filterView->indexAt(point); + if(!idx.isValid()) + return; + + filterModel->removeRow(idx.row(), idx.parent()); +} diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 9580aceb..716f6ade 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -16,6 +16,7 @@ class DlgCardSearch; class QLabel; class DeckLoader; class Response; +class FilterListModel; class SearchLineEdit : public QLineEdit { private: @@ -61,6 +62,8 @@ private slots: void finishedUpdatingPrices(); void saveDeckRemoteFinished(const Response &r); + void filterViewCustomContextMenu(const QPoint &point); + void filterRemove(QAction *action); private: void addCardHelper(QString zoneName); void recursiveExpand(const QModelIndex &index); @@ -81,6 +84,8 @@ private: QLabel *hashLabel1; QLabel *hashLabel; DlgCardSearch *dlgCardSearch; + FilterListModel *filterModel; + QTreeView *filterView; QMenu *deckMenu, *dbMenu; QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose; From 3202243ed0b30699b9e65be6c07ef928f04eb78f Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Tue, 21 Jan 2014 23:37:22 +0000 Subject: [PATCH 03/16] connect filter list functionality to the CardDatabaseDisplayModel class enable/disable check boxes still not functional --- cockatrice/src/carddatabasemodel.cpp | 22 +++- cockatrice/src/carddatabasemodel.h | 6 + cockatrice/src/cardfilter.cpp | 6 + cockatrice/src/cardfilter.h | 5 + cockatrice/src/filterlist.cpp | 179 ++++++++++++++++++++++++++- cockatrice/src/filterlist.h | 28 ++++- cockatrice/src/filterlistmodel.cpp | 23 ++-- cockatrice/src/filterlistmodel.h | 3 +- cockatrice/src/tab_deck_editor.cpp | 1 + 9 files changed, 258 insertions(+), 15 deletions(-) diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index d63f6bde..559f8cc4 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -1,4 +1,5 @@ #include "carddatabasemodel.h" +#include "filterlist.h" CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, QObject *parent) : QAbstractListModel(parent), db(_db) @@ -109,6 +110,7 @@ CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) : QSortFilterProxyModel(parent), isToken(ShowAll) { + filterList = NULL; setFilterCaseSensitivity(Qt::CaseInsensitive); setSortCaseSensitivity(Qt::CaseInsensitive); } @@ -116,7 +118,7 @@ CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const { CardInfo const *info = static_cast(sourceModel())->getCard(sourceRow); - + if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken())) return false; @@ -144,6 +146,9 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex if (!cardTypes.contains(info->getMainCardType())) return false; + if (filterList != NULL) + return filterList->acceptsCard(info); + return true; } @@ -155,3 +160,18 @@ void CardDatabaseDisplayModel::clearSearch() cardColors.clear(); invalidateFilter(); } + +void CardDatabaseDisplayModel::setFilterList(const FilterList *filterList) +{ + if(this->filterList != NULL) + disconnect(this->filterList, 0, this, 0); + + this->filterList = filterList; + connect(this->filterList, SIGNAL(changed()), this, SLOT(filterListChanged())); + invalidate(); +} + +void CardDatabaseDisplayModel::filterListChanged() +{ + invalidate(); +} diff --git a/cockatrice/src/carddatabasemodel.h b/cockatrice/src/carddatabasemodel.h index b2998bfe..ba245b41 100644 --- a/cockatrice/src/carddatabasemodel.h +++ b/cockatrice/src/carddatabasemodel.h @@ -7,6 +7,8 @@ #include #include "carddatabase.h" +class FilterList; + class CardDatabaseModel : public QAbstractListModel { Q_OBJECT public: @@ -36,8 +38,10 @@ private: FilterBool isToken; QString cardNameBeginning, cardName, cardText; QSet cardNameSet, cardTypes, cardColors; + const FilterList *filterList; public: CardDatabaseDisplayModel(QObject *parent = 0); + void setFilterList(const FilterList *filterList); void setIsToken(FilterBool _isToken) { isToken = _isToken; invalidate(); } void setCardNameBeginning(const QString &_beginning) { cardNameBeginning = _beginning; invalidate(); } void setCardName(const QString &_cardName) { cardName = _cardName; invalidate(); } @@ -48,6 +52,8 @@ public: void clearSearch(); protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; +private slots: + void filterListChanged(); }; #endif diff --git a/cockatrice/src/cardfilter.cpp b/cockatrice/src/cardfilter.cpp index d6fe790e..27402921 100644 --- a/cockatrice/src/cardfilter.cpp +++ b/cockatrice/src/cardfilter.cpp @@ -25,6 +25,12 @@ const char *CardFilter::attrName(Attr a) return "type"; case AttrColor: return "color"; + case AttrText: + return "text"; + case AttrSet: + return "set"; + case AttrManaCost: + return "mana cost"; default: return ""; } diff --git a/cockatrice/src/cardfilter.h b/cockatrice/src/cardfilter.h index 67395c2d..f4f38771 100644 --- a/cockatrice/src/cardfilter.h +++ b/cockatrice/src/cardfilter.h @@ -13,10 +13,15 @@ public: TypeEnd }; + /* if you add an atribute here you also need to + * add its string representation in attrName */ enum Attr { AttrName = 0, AttrType, AttrColor, + AttrText, + AttrSet, + AttrManaCost, AttrEnd }; diff --git a/cockatrice/src/filterlist.cpp b/cockatrice/src/filterlist.cpp index 35d7a0fc..eaae7d1c 100644 --- a/cockatrice/src/filterlist.cpp +++ b/cockatrice/src/filterlist.cpp @@ -1,5 +1,6 @@ #include "filterlist.h" -#include "CardFilter.h" +#include "cardfilter.h" +#include "carddatabase.h" #include @@ -9,6 +10,17 @@ LogicMap::~LogicMap() delete takeFirst(); } +const FilterItemList *LogicMap::findTypeList(CardFilter::Type type) const +{ + LogicMap::const_iterator i; + + for(i = constBegin(); i != constEnd(); i++) + if ((*i)->type == type) + return *i; + + return NULL; +} + FilterItemList *LogicMap::typeList(CardFilter::Type type) { LogicMap::iterator i; @@ -158,3 +170,168 @@ int FilterList::count(const CardFilter *f) { return count(f->attr(), f->type()); } + +bool FilterList::acceptName(const CardInfo *info, const QString &term) const +{ + return info->getName().contains(term, Qt::CaseInsensitive); +} + +bool FilterList::acceptType(const CardInfo *info, const QString &term) const +{ + return info->getCardType().contains(term, Qt::CaseInsensitive); +} + +bool FilterList::acceptColor(const CardInfo *info, const QString &term) const +{ + QStringList::const_iterator i; + bool status; + + status = false; + for(i = info->getColors().constBegin(); i != info->getColors().constEnd(); i++) + if ((*i).contains(term, Qt::CaseInsensitive)) { + status = true; + break; + } + + return status; +} + +bool FilterList::acceptText(const CardInfo *info, const QString &term) const +{ + return info->getText().contains(term, Qt::CaseInsensitive); +} + +bool FilterList::acceptSet(const CardInfo *info, const QString &term) const +{ + SetList::const_iterator i; + bool status; + + status = false; + for(i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) + if ((*i)->getShortName() == term + || (*i)->getLongName().contains(term, Qt::CaseInsensitive)) { + status = true; + break; + } + + return status; +} + +bool FilterList::acceptManaCost(const CardInfo *info, const QString &term) const +{ + return (info->getManaCost() == term); +} + +bool FilterList::acceptCardAttr(const CardInfo *info, const QString &term, + CardFilter::Attr attr) const +{ + bool status; + + switch(attr) { + case CardFilter::AttrName: + status = acceptName(info, term); + break; + case CardFilter::AttrType: + status = acceptType(info, term); + break; + case CardFilter::AttrColor: + status = acceptColor(info, term); + break; + case CardFilter::AttrText: + status = acceptText(info, term); + break; + case CardFilter::AttrSet: + status = acceptSet(info, term); + break; + case CardFilter::AttrManaCost: + status = acceptManaCost(info, term); + break; + default: + status = true; /* ignore this attribute */ + } + + return status; +} + +bool FilterList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr, + const FilterItemList *fil) const +{ + FilterItemList::const_iterator i; + + for(i = fil->constBegin(); i != fil->constEnd(); i++) + if(!acceptCardAttr(info, (*i)->term, attr)) + return false; + + return true; +} + +bool FilterList::testTypeAndNot(const CardInfo *info, CardFilter::Attr attr, + const FilterItemList *fil) const +{ + FilterItemList::const_iterator i; + + for(i = fil->constBegin(); i != fil->constEnd(); i++) + if(acceptCardAttr(info, (*i)->term, attr)) + return false; + + return true; +} + +bool FilterList::testTypeOr(const CardInfo *info, CardFilter::Attr attr, + const FilterItemList *filOr, + const FilterItemList *filOrNot) const +{ + FilterItemList::const_iterator i; + bool status; + + if(filOr == NULL && filOrNot == NULL) + return true; + + status = false; + if (filOr != NULL) + for(i = filOr->constBegin(); i != filOr->constEnd(); i++) + if(acceptCardAttr(info, (*i)->term, attr)) { + status = true; + break; + } + if (status != true && filOrNot != NULL) + for(i = filOrNot->constBegin(); i != filOrNot->constEnd(); i++) + if(!acceptCardAttr(info, (*i)->term, attr)) { + status = true; + break; + } + + return status; +} + +bool FilterList::testAttr(const CardInfo *info, const LogicMap *lm) const +{ + bool status; + const FilterItemList *fil, *fil2; + + fil = lm->findTypeList(CardFilter::TypeAnd); + if (fil != NULL && !testTypeAnd(info, lm->attr, fil)) + return false; + + fil = lm->findTypeList(CardFilter::TypeAndNot); + if (fil != NULL && !testTypeAndNot(info, lm->attr, fil)) + return false; + + fil = lm->findTypeList(CardFilter::TypeOr); + fil2 = lm->findTypeList(CardFilter::TypeOrNot); + if (!testTypeOr(info, lm->attr, fil, fil2)) + return false; + + return true; +} + +bool FilterList::acceptsCard(const CardInfo *info) const +{ + QList::const_iterator i; + + for(i = logicAttrs.constBegin(); i != logicAttrs.constEnd(); i++) + if(!testAttr(info, *i)) + return false; + + return true; +} diff --git a/cockatrice/src/filterlist.h b/cockatrice/src/filterlist.h index aed58f7d..98b885bc 100644 --- a/cockatrice/src/filterlist.h +++ b/cockatrice/src/filterlist.h @@ -7,6 +7,8 @@ #include "cardfilter.h" +class CardInfo; + class FilterListNode { private: bool enabled; @@ -38,6 +40,7 @@ public: LogicMap(CardFilter::Attr a, FilterList *parent) : attr(a), p(parent) {} ~LogicMap(); + const FilterItemList *findTypeList(CardFilter::Type type) const; FilterItemList *typeList(CardFilter::Type type); virtual FilterListNode *parent() const; virtual FilterListNode *nodeAt(int i) const; @@ -55,6 +58,7 @@ private: LogicMap *const p; public: const CardFilter::Type type; + FilterItemList(CardFilter::Type t, LogicMap *parent) : type(t), p(parent) {} ~FilterItemList(); @@ -90,6 +94,7 @@ class FilterList : public QObject, public FilterListNode { signals: void preInsertRow(const FilterListNode *parent, int i) const; void postInsertRow(const FilterListNode *parent, int i) const; + void changed() const; private: QList logicAttrs; @@ -98,6 +103,24 @@ private: FilterItemList *attrTypeList(CardFilter::Attr attr, CardFilter::Type type); + bool acceptName(const CardInfo *info, const QString &term) const; + bool acceptType(const CardInfo *info, const QString &term) const; + bool acceptColor(const CardInfo *info, const QString &term) const; + bool acceptCardAttr(const CardInfo *info, const QString &term, + CardFilter::Attr attr) const; + bool acceptText(const CardInfo *info, const QString &term) const; + bool acceptSet(const CardInfo *info, const QString &term) const; + bool acceptManaCost(const CardInfo *info, const QString &term) const; + + bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr, + const FilterItemList *fil) const; + bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr, + const FilterItemList *fil) const; + bool testTypeOr(const CardInfo *info, CardFilter::Attr attr, + const FilterItemList *filOr, + const FilterItemList *filOrNot) const; + + bool testAttr(const CardInfo *info, const LogicMap *lm) const; public: ~FilterList(); int indexOf(const LogicMap *val) const { return logicAttrs.indexOf((LogicMap *) val); } @@ -117,7 +140,10 @@ public: virtual QString text() const { return QString("root"); } virtual int index() const { return 0; } void preInsertChild(const FilterListNode *p, int i) const { emit preInsertRow(p, i); } - void postInsertChild(const FilterListNode *p, int i) const { emit postInsertRow(p, i); } + void postInsertChild(const FilterListNode *p, int i) const { emit postInsertRow(p, i); emit changed(); } + void emitChanged() const { emit changed(); } + + bool acceptsCard(const CardInfo *info) const; }; #endif diff --git a/cockatrice/src/filterlistmodel.cpp b/cockatrice/src/filterlistmodel.cpp index 6bd84809..a6f2404b 100644 --- a/cockatrice/src/filterlistmodel.cpp +++ b/cockatrice/src/filterlistmodel.cpp @@ -6,18 +6,18 @@ FilterListModel::FilterListModel(QObject *parent) : QAbstractItemModel(parent) { - filterList = new FilterList; - connect(filterList, + fList = new FilterList; + connect(fList, SIGNAL(preInsertRow(const FilterListNode *, int)), this, SLOT(proxyBeginInsertRow(const FilterListNode *, int))); - connect(filterList, + connect(fList, SIGNAL(postInsertRow(const FilterListNode *, int)), this, SLOT(proxyEndInsertRow(const FilterListNode *, int))); } FilterListModel::~FilterListModel() { - delete filterList; + delete fList; } void FilterListModel::proxyBeginInsertRow(const FilterListNode *node, int i) @@ -44,11 +44,11 @@ FilterListNode *FilterListModel::indexToNode(const QModelIndex &idx) const FilterListNode *node; if(!idx.isValid()) - return filterList; + return fList; ip = idx.internalPointer(); if(ip == NULL) - return filterList; + return fList; node = static_cast(ip); return node; @@ -57,7 +57,7 @@ FilterListNode *FilterListModel::indexToNode(const QModelIndex &idx) const void FilterListModel::addFilter(const CardFilter *f) { emit layoutAboutToBeChanged(); - filterList->termNode(f); + fList->termNode(f); emit layoutChanged(); } @@ -135,7 +135,7 @@ bool FilterListModel::setData(const QModelIndex &index, return false; node = indexToNode(index); - if(node == NULL || node == filterList) + if(node == NULL || node == fList) return false; Qt::CheckState state = static_cast(value.toInt()); @@ -161,7 +161,7 @@ Qt::ItemFlags FilterListModel::flags(const QModelIndex &index) const return 0; result = Qt::ItemIsEnabled; - if(node == filterList) + if(node == fList) return result; result |= Qt::ItemIsSelectable; @@ -207,7 +207,7 @@ QModelIndex FilterListModel::parent(const QModelIndex &ind) const return QModelIndex(); node = indexToNode(ind); - if(node == NULL || node == filterList) + if(node == NULL || node == fList) return QModelIndex(); parent = node->parent(); @@ -239,8 +239,9 @@ bool FilterListModel::removeRows(int row, int count, const QModelIndex & parent) for(i = 0; i < count; i++) node->deleteAt(row); endRemoveRows(); + fList->emitChanged(); - if(node != filterList && node->childCount() < 1) + if(node != fList && node->childCount() < 1) return removeRow(parent.row(), parent.parent()); return true; diff --git a/cockatrice/src/filterlistmodel.h b/cockatrice/src/filterlistmodel.h index de25f452..944bb5b7 100644 --- a/cockatrice/src/filterlistmodel.h +++ b/cockatrice/src/filterlistmodel.h @@ -10,7 +10,7 @@ class FilterListNode; class FilterListModel : public QAbstractItemModel { Q_OBJECT private: - FilterList *filterList; + FilterList *fList; public slots: void addFilter(const CardFilter *f); @@ -26,6 +26,7 @@ private: public: FilterListModel(QObject *parent = 0); ~FilterListModel(); + const FilterList *filterList() const { return fList; } int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index a7aded4c..a1fc1022 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -170,6 +170,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) botFrame->addLayout(searchAndButtons); filterModel = new FilterListModel(); + databaseDisplayModel->setFilterList(filterModel->filterList()); filterView = new QTreeView; filterView->setModel(filterModel); filterView->setMaximumWidth(250); From 083005b8a9ff535608604061a71193d356f2c9c0 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Wed, 22 Jan 2014 08:32:00 +0000 Subject: [PATCH 04/16] implemented filter list enable/disable functionality also refactored much of the filter list code to be much cleaner and modular. --- cockatrice/src/filterlist.cpp | 327 ++++++++++++++--------------- cockatrice/src/filterlist.h | 130 +++++++----- cockatrice/src/filterlistmodel.cpp | 34 ++- cockatrice/src/filterlistmodel.h | 4 +- 4 files changed, 266 insertions(+), 229 deletions(-) diff --git a/cockatrice/src/filterlist.cpp b/cockatrice/src/filterlist.cpp index eaae7d1c..9a4b3a71 100644 --- a/cockatrice/src/filterlist.cpp +++ b/cockatrice/src/filterlist.cpp @@ -4,17 +4,48 @@ #include -LogicMap::~LogicMap() +template +FilterListNode *FilterListInnerNode::nodeAt(int i) const { - while(!isEmpty()) - delete takeFirst(); + return ((childNodes.size() > i)? childNodes.at(i) : NULL); +} + +template +void FilterListInnerNode::deleteAt(int i) +{ + preRemoveChild(this, i); + delete childNodes.takeAt(i); + postRemoveChild(this, i); + nodeChanged(); +} + +template +int FilterListInnerNode::childIndex(const FilterListNode *node) const +{ + FilterListNode *unconst; + T downcasted; + + /* to do the dynamic cast to T we will lose const'ness, but we can + * trust QList::indexOf */ + unconst = (FilterListNode *) node; + downcasted = dynamic_cast(unconst); + if(downcasted == NULL) + return -1; + return childNodes.indexOf(downcasted); +} + +template +FilterListInnerNode::~FilterListInnerNode() +{ + while(!childNodes.isEmpty()) + delete childNodes.takeFirst(); } const FilterItemList *LogicMap::findTypeList(CardFilter::Type type) const { - LogicMap::const_iterator i; + QList::const_iterator i; - for(i = constBegin(); i != constEnd(); i++) + for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) if ((*i)->type == type) return *i; @@ -23,19 +54,20 @@ const FilterItemList *LogicMap::findTypeList(CardFilter::Type type) const FilterItemList *LogicMap::typeList(CardFilter::Type type) { - LogicMap::iterator i; + QList::iterator i; int count; count = 0; - for(i = begin(); i != end(); i++) { + for(i = childNodes.begin(); i != childNodes.end(); i++) { if ((*i)->type == type) break; count++; } - if (i == end()) { - p->preInsertChild(this, count); - i = insert(i, new FilterItemList(type, this)); - p->postInsertChild(this, count); + if (i == childNodes.end()) { + preInsertChild(this, count); + i = childNodes.insert(i, new FilterItemList(type, this)); + postInsertChild(this, count); + nodeChanged(); } return *i; @@ -46,142 +78,81 @@ FilterListNode *LogicMap::parent() const return p; } -FilterListNode *LogicMap::nodeAt(int i) const +int FilterItemList::termIndex(const QString &term) const { - return ((size() > i)? at(i) : NULL); -} - -void LogicMap::deleteAt(int i) -{ - delete takeAt(i); -} - -int LogicMap::index() const -{ - return p->indexOf(this); -} - -FilterListNode *FilterItemList::nodeAt(int i) const -{ - return ((size() > i)? at(i) : NULL); -} - -void FilterItemList::deleteAt(int i) { - delete takeAt(i); -} - -FilterItemList::~FilterItemList() -{ - while(!isEmpty()) - delete takeFirst(); -} - -FilterList::~FilterList() -{ - while(!logicAttrs.isEmpty()) { - delete logicAttrs.takeFirst(); - } -} - -LogicMap *FilterList::attrLogicMap(CardFilter::Attr attr) -{ - QList::iterator i; - int count; - - count = 0; - for(i = logicAttrs.begin(); i != logicAttrs.end(); i++) { - if((*i)->attr == attr) - break; - count++; - } - - if(i == logicAttrs.end()) { - preInsertChild(this, count); - i = logicAttrs.insert(i, new LogicMap(attr, this)); - postInsertChild(this, count); - } - - return *i; -} - -FilterItemList *FilterList::attrTypeList(CardFilter::Attr attr, - CardFilter::Type type) -{ - return attrLogicMap(attr)->typeList(type); -} - -int FilterList::findTermIndex(CardFilter::Attr attr, CardFilter::Type type, - const QString &term) -{ - FilterItemList *fis; int i; - fis = attrTypeList(attr, type); - for(i = 0; i < fis->count(); i++) - if((fis->at(i))->term == term) + for(i = 0; i < childNodes.count(); i++) + if((childNodes.at(i))->term == term) return i; return -1; } -int FilterList::findTermIndex(const CardFilter *f) +FilterListNode *FilterItemList::termNode(const QString &term) { - return findTermIndex(f->attr(), f->type(), f->term()); -} - -FilterListNode *FilterList::termNode(CardFilter::Attr attr, CardFilter::Type type, - const QString &term) -{ - FilterItemList *fis; - FilterItem *fi; int i, count; + FilterItem *fi; - fis = attrTypeList(attr, type); - i = findTermIndex(attr, type, term); + i = termIndex(term); if(i < 0) { - fi = new FilterItem(term, fis); - count = fis->childCount(); - preInsertChild(fis, count); - fis->append(fi); - postInsertChild(fis, count); + fi = new FilterItem(term, this); + count = childNodes.count(); + preInsertChild(this, count); + childNodes.append(fi); + postInsertChild(this, count); + nodeChanged(); return fi; } - return fis->at(i); + return childNodes.at(i); } -FilterListNode *FilterList::termNode(const CardFilter *f) +bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const { - return termNode(f->attr(), f->type(), f->term()); + QList::const_iterator i; + + for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if (!(*i)->acceptCardAttr(info, attr)) + return false; + + return true; } -FilterListNode *FilterList::attrTypeNode(CardFilter::Attr attr, - CardFilter::Type type) +bool FilterItemList::testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const { - return attrTypeList(attr, type); + // if any one in the list is true, return false + return !testTypeOr(info, attr); } -int FilterList::count(CardFilter::Attr attr, CardFilter::Type type) +bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) const { - return attrTypeList(attr, type)->count(); + QList::const_iterator i; + + for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if ((*i)->acceptCardAttr(info, attr)) + return true; + + return false; } -int FilterList::count(const CardFilter *f) +bool FilterItemList::testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const { - return count(f->attr(), f->type()); + // if any one in the list is false, return true + return !testTypeAnd(info, attr); } -bool FilterList::acceptName(const CardInfo *info, const QString &term) const +bool FilterItem::acceptName(const CardInfo *info) const { return info->getName().contains(term, Qt::CaseInsensitive); } -bool FilterList::acceptType(const CardInfo *info, const QString &term) const +bool FilterItem::acceptType(const CardInfo *info) const { return info->getCardType().contains(term, Qt::CaseInsensitive); } -bool FilterList::acceptColor(const CardInfo *info, const QString &term) const +bool FilterItem::acceptColor(const CardInfo *info) const { QStringList::const_iterator i; bool status; @@ -196,12 +167,12 @@ bool FilterList::acceptColor(const CardInfo *info, const QString &term) const return status; } -bool FilterList::acceptText(const CardInfo *info, const QString &term) const +bool FilterItem::acceptText(const CardInfo *info) const { return info->getText().contains(term, Qt::CaseInsensitive); } -bool FilterList::acceptSet(const CardInfo *info, const QString &term) const +bool FilterItem::acceptSet(const CardInfo *info) const { SetList::const_iterator i; bool status; @@ -217,34 +188,36 @@ bool FilterList::acceptSet(const CardInfo *info, const QString &term) const return status; } -bool FilterList::acceptManaCost(const CardInfo *info, const QString &term) const +bool FilterItem::acceptManaCost(const CardInfo *info) const { return (info->getManaCost() == term); } -bool FilterList::acceptCardAttr(const CardInfo *info, const QString &term, - CardFilter::Attr attr) const +bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const { bool status; + if(!isEnabled()) + return true; + switch(attr) { case CardFilter::AttrName: - status = acceptName(info, term); + status = acceptName(info); break; case CardFilter::AttrType: - status = acceptType(info, term); + status = acceptType(info); break; case CardFilter::AttrColor: - status = acceptColor(info, term); + status = acceptColor(info); break; case CardFilter::AttrText: - status = acceptText(info, term); + status = acceptText(info); break; case CardFilter::AttrSet: - status = acceptSet(info, term); + status = acceptSet(info); break; case CardFilter::AttrManaCost: - status = acceptManaCost(info, term); + status = acceptManaCost(info); break; default: status = true; /* ignore this attribute */ @@ -253,84 +226,104 @@ bool FilterList::acceptCardAttr(const CardInfo *info, const QString &term, return status; } -bool FilterList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr, - const FilterItemList *fil) const +/* need to define these here to make QT happy, otherwise + * moc doesnt find some of the FilterListInnerNode symbols. + */ +FilterList::FilterList() {} +FilterList::~FilterList() {} + +LogicMap *FilterList::attrLogicMap(CardFilter::Attr attr) { - FilterItemList::const_iterator i; + QList::iterator i; + int count; - for(i = fil->constBegin(); i != fil->constEnd(); i++) - if(!acceptCardAttr(info, (*i)->term, attr)) - return false; + count = 0; + for(i = childNodes.begin(); i != childNodes.end(); i++) { + if((*i)->attr == attr) + break; + count++; + } - return true; + if(i == childNodes.end()) { + preInsertChild(this, count); + i = childNodes.insert(i, new LogicMap(attr, this)); + postInsertChild(this, count); + nodeChanged(); + } + + return *i; } -bool FilterList::testTypeAndNot(const CardInfo *info, CardFilter::Attr attr, - const FilterItemList *fil) const +FilterItemList *FilterList::attrTypeList(CardFilter::Attr attr, + CardFilter::Type type) { - FilterItemList::const_iterator i; - - for(i = fil->constBegin(); i != fil->constEnd(); i++) - if(acceptCardAttr(info, (*i)->term, attr)) - return false; - - return true; + return attrLogicMap(attr)->typeList(type); } -bool FilterList::testTypeOr(const CardInfo *info, CardFilter::Attr attr, - const FilterItemList *filOr, - const FilterItemList *filOrNot) const +int FilterList::findTermIndex(CardFilter::Attr attr, CardFilter::Type type, + const QString &term) { - FilterItemList::const_iterator i; - bool status; + attrTypeList(attr, type)->termIndex(term); +} - if(filOr == NULL && filOrNot == NULL) - return true; +int FilterList::findTermIndex(const CardFilter *f) +{ + return findTermIndex(f->attr(), f->type(), f->term()); +} - status = false; - if (filOr != NULL) - for(i = filOr->constBegin(); i != filOr->constEnd(); i++) - if(acceptCardAttr(info, (*i)->term, attr)) { - status = true; - break; - } - if (status != true && filOrNot != NULL) - for(i = filOrNot->constBegin(); i != filOrNot->constEnd(); i++) - if(!acceptCardAttr(info, (*i)->term, attr)) { - status = true; - break; - } +FilterListNode *FilterList::termNode(CardFilter::Attr attr, CardFilter::Type type, + const QString &term) +{ + return attrTypeList(attr, type)->termNode(term); +} - return status; +FilterListNode *FilterList::termNode(const CardFilter *f) +{ + return termNode(f->attr(), f->type(), f->term()); +} + +FilterListNode *FilterList::attrTypeNode(CardFilter::Attr attr, + CardFilter::Type type) +{ + return attrTypeList(attr, type); } bool FilterList::testAttr(const CardInfo *info, const LogicMap *lm) const { + const FilterItemList *fil; bool status; - const FilterItemList *fil, *fil2; + + status = true; fil = lm->findTypeList(CardFilter::TypeAnd); - if (fil != NULL && !testTypeAnd(info, lm->attr, fil)) + if (fil != NULL && fil->isEnabled() && !fil->testTypeAnd(info, lm->attr)) return false; fil = lm->findTypeList(CardFilter::TypeAndNot); - if (fil != NULL && !testTypeAndNot(info, lm->attr, fil)) + if (fil != NULL && fil->isEnabled() && !fil->testTypeAndNot(info, lm->attr)) return false; fil = lm->findTypeList(CardFilter::TypeOr); - fil2 = lm->findTypeList(CardFilter::TypeOrNot); - if (!testTypeOr(info, lm->attr, fil, fil2)) - return false; + if (fil != NULL && fil->isEnabled()) { + status = false; + // if this is true we can return because it is OR'd with the OrNot list + if (fil->testTypeOr(info, lm->attr)) + return true; + } - return true; + fil = lm->findTypeList(CardFilter::TypeOrNot); + if (fil != NULL && fil->isEnabled() && fil->testTypeOrNot(info, lm->attr)) + return true; + + return status; } bool FilterList::acceptsCard(const CardInfo *info) const { QList::const_iterator i; - for(i = logicAttrs.constBegin(); i != logicAttrs.constEnd(); i++) - if(!testAttr(info, *i)) + for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if ((*i)->isEnabled() && !testAttr(info, *i)) return false; return true; diff --git a/cockatrice/src/filterlist.h b/cockatrice/src/filterlist.h index 98b885bc..20f78984 100644 --- a/cockatrice/src/filterlist.h +++ b/cockatrice/src/filterlist.h @@ -15,45 +15,71 @@ private: public: FilterListNode() : enabled(true) {} virtual bool isEnabled() const { return enabled; } - virtual void enable() { enabled = true; } - virtual void disable() { enabled = false; } + virtual void enable() { enabled = true; nodeChanged(); } + virtual void disable() { enabled = false; nodeChanged(); } virtual FilterListNode *parent() const { return NULL; } virtual FilterListNode *nodeAt(int i) const { return NULL; } virtual void deleteAt(int i) {} virtual int childCount() const { return 0; } - virtual int index() const { return -1; } + virtual int childIndex(const FilterListNode *node) const { return -1; } + virtual int index() const { return (parent() != NULL)? parent()->childIndex(this) : -1; } virtual QString text() const { return ""; } virtual bool isLeaf() const { return false; } virtual const char *textCStr() const { return text().toStdString().c_str(); } + virtual void nodeChanged() const { + printf("%s -> ", textCStr()); + if (parent() != NULL) parent()->nodeChanged(); + } + virtual void preInsertChild(const FilterListNode *p, int i) const { + //printf("%s -> ", textCStr()); + if (parent() != NULL) parent()->preInsertChild(p, i); + } + virtual void postInsertChild(const FilterListNode *p, int i) const { + //printf("%s -> ", textCStr()); + if (parent() != NULL) parent()->postInsertChild(p, i); + } + virtual void preRemoveChild(const FilterListNode *p, int i) const { + printf("%s -> ", textCStr()); + if (parent() != NULL) parent()->preRemoveChild(p, i); + } + virtual void postRemoveChild(const FilterListNode *p, int i) const { + printf("%s -> ", textCStr()); + if (parent() != NULL) parent()->postRemoveChild(p, i); + } +}; + +template +class FilterListInnerNode : public FilterListNode { +protected: + QList childNodes; +public: + ~FilterListInnerNode(); + FilterListNode *nodeAt(int i) const; + void deleteAt(int i); + int childCount() const { return childNodes.size(); } + int childIndex(const FilterListNode *node) const; }; class FilterItemList; class FilterList; -class LogicMap - : public QList - , public FilterListNode { +class LogicMap : public FilterListInnerNode { + private: FilterList *const p; + public: const CardFilter::Attr attr; LogicMap(CardFilter::Attr a, FilterList *parent) : attr(a), p(parent) {} - ~LogicMap(); const FilterItemList *findTypeList(CardFilter::Type type) const; FilterItemList *typeList(CardFilter::Type type); - virtual FilterListNode *parent() const; - virtual FilterListNode *nodeAt(int i) const; - virtual void deleteAt(int i); - virtual int childCount() const { return size(); } - virtual int index() const; - virtual QString text() const { return QString(CardFilter::attrName(attr)); } + FilterListNode *parent() const; + QString text() const { return QString(CardFilter::attrName(attr)); } }; class FilterItem; -class FilterItemList - : public QList - , public FilterListNode { +class FilterItemList : public FilterListInnerNode { private: LogicMap *const p; public: @@ -61,14 +87,16 @@ public: FilterItemList(CardFilter::Type t, LogicMap *parent) : type(t), p(parent) {} - ~FilterItemList(); CardFilter::Attr attr() const { return p->attr; } - virtual FilterListNode *parent() const { return p; } - virtual FilterListNode *nodeAt(int i) const; - virtual void deleteAt(int i); - virtual int childCount() const { return size(); } - virtual int index() const { return p->indexOf((FilterItemList *) this); } - virtual QString text() const { return QString(CardFilter::typeName(type)); } + FilterListNode *parent() const { return p; } + int termIndex(const QString &term) const; + FilterListNode *termNode(const QString &term); + QString text() const { return QString(CardFilter::typeName(type)); } + + bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeOr(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const; }; class FilterItem : public FilterListNode { @@ -82,48 +110,38 @@ public: CardFilter::Attr attr() const { return p->attr(); } CardFilter::Type type() const { return p->type; } - virtual FilterListNode *parent() const { return p; } - virtual int index() const { return p->indexOf((FilterItem *)this); } - virtual QString text() const { return term; } - virtual bool isLeaf() const { return true; } + FilterListNode *parent() const { return p; } + QString text() const { return term; } + bool isLeaf() const { return true; } + + bool acceptName(const CardInfo *info) const; + bool acceptType(const CardInfo *info) const; + bool acceptColor(const CardInfo *info) const; + bool acceptText(const CardInfo *info) const; + bool acceptSet(const CardInfo *info) const; + bool acceptManaCost(const CardInfo *info) const; + bool acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const; }; -class FilterList : public QObject, public FilterListNode { +class FilterList : public QObject, public FilterListInnerNode { Q_OBJECT signals: void preInsertRow(const FilterListNode *parent, int i) const; void postInsertRow(const FilterListNode *parent, int i) const; + void preRemoveRow(const FilterListNode *parent, int i) const; + void postRemoveRow(const FilterListNode *parent, int i) const; void changed() const; private: - QList logicAttrs; - LogicMap *attrLogicMap(CardFilter::Attr attr); FilterItemList *attrTypeList(CardFilter::Attr attr, CardFilter::Type type); - bool acceptName(const CardInfo *info, const QString &term) const; - bool acceptType(const CardInfo *info, const QString &term) const; - bool acceptColor(const CardInfo *info, const QString &term) const; - bool acceptCardAttr(const CardInfo *info, const QString &term, - CardFilter::Attr attr) const; - bool acceptText(const CardInfo *info, const QString &term) const; - bool acceptSet(const CardInfo *info, const QString &term) const; - bool acceptManaCost(const CardInfo *info, const QString &term) const; - - bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr, - const FilterItemList *fil) const; - bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr, - const FilterItemList *fil) const; - bool testTypeOr(const CardInfo *info, CardFilter::Attr attr, - const FilterItemList *filOr, - const FilterItemList *filOrNot) const; - bool testAttr(const CardInfo *info, const LogicMap *lm) const; public: + FilterList(); ~FilterList(); - int indexOf(const LogicMap *val) const { return logicAttrs.indexOf((LogicMap *) val); } int findTermIndex(CardFilter::Attr attr, CardFilter::Type type, const QString &term); int findTermIndex(const CardFilter *f); @@ -132,16 +150,14 @@ public: FilterListNode *termNode(const CardFilter *f); FilterListNode *attrTypeNode(CardFilter::Attr attr, CardFilter::Type type); - int count(CardFilter::Attr attr, CardFilter::Type type); - int count(const CardFilter *f); - virtual FilterListNode *nodeAt(int i) const { return ((logicAttrs.size() > i)? logicAttrs.at(i) : NULL); } - virtual void deleteAt(int i) { delete logicAttrs.takeAt(i); } - virtual int childCount() const { return logicAttrs.size(); } - virtual QString text() const { return QString("root"); } - virtual int index() const { return 0; } + QString text() const { return QString("root"); } + int index() const { return 0; } + + void nodeChanged() const { printf("root\n"); emit changed(); } void preInsertChild(const FilterListNode *p, int i) const { emit preInsertRow(p, i); } - void postInsertChild(const FilterListNode *p, int i) const { emit postInsertRow(p, i); emit changed(); } - void emitChanged() const { emit changed(); } + void postInsertChild(const FilterListNode *p, int i) const { emit postInsertRow(p, i); } + void preRemoveChild(const FilterListNode *p, int i) const { printf("root\n"); emit preRemoveRow(p, i); } + void postRemoveChild(const FilterListNode *p, int i) const { printf("root\n"); emit postRemoveRow(p, i); } bool acceptsCard(const CardInfo *info) const; }; diff --git a/cockatrice/src/filterlistmodel.cpp b/cockatrice/src/filterlistmodel.cpp index a6f2404b..2185ff5c 100644 --- a/cockatrice/src/filterlistmodel.cpp +++ b/cockatrice/src/filterlistmodel.cpp @@ -13,6 +13,12 @@ FilterListModel::FilterListModel(QObject *parent) connect(fList, SIGNAL(postInsertRow(const FilterListNode *, int)), this, SLOT(proxyEndInsertRow(const FilterListNode *, int))); + connect(fList, + SIGNAL(preRemoveRow(const FilterListNode *, int)), + this, SLOT(proxyBeginRemoveRow(const FilterListNode *, int))); + connect(fList, + SIGNAL(postRemoveRow(const FilterListNode *, int)), + this, SLOT(proxyEndRemoveRow(const FilterListNode *, int))); } FilterListModel::~FilterListModel() @@ -38,6 +44,24 @@ void FilterListModel::proxyEndInsertRow(const FilterListNode *node, int) endInsertRows(); } +void FilterListModel::proxyBeginRemoveRow(const FilterListNode *node, int i) +{ + int idx; + + idx = node->index(); + if(idx >= 0) + beginRemoveRows(createIndex(idx, 0, (void *) node), i, i); +} + +void FilterListModel::proxyEndRemoveRow(const FilterListNode *node, int) +{ + int idx; + + idx = node->index(); + if(idx >= 0) + endRemoveRows(); +} + FilterListNode *FilterListModel::indexToNode(const QModelIndex &idx) const { void *ip; @@ -235,11 +259,13 @@ bool FilterListModel::removeRows(int row, int count, const QModelIndex & parent) if(node == NULL || last >= node->childCount()) return false; - beginRemoveRows(parent, row, last); - for(i = 0; i < count; i++) + printf("delete children in %s\n", node->textCStr()); + fflush(stdout); + for(i = 0; i < count; i++) { + printf(" delete %d\n", i); + fflush(stdout); node->deleteAt(row); - endRemoveRows(); - fList->emitChanged(); + } if(node != fList && node->childCount() < 1) return removeRow(parent.row(), parent.parent()); diff --git a/cockatrice/src/filterlistmodel.h b/cockatrice/src/filterlistmodel.h index 944bb5b7..73cdb7e9 100644 --- a/cockatrice/src/filterlistmodel.h +++ b/cockatrice/src/filterlistmodel.h @@ -17,7 +17,9 @@ public slots: private slots: void proxyBeginInsertRow(const FilterListNode *, int); - void proxyEndInsertRow(const FilterListNode *node, int i); + void proxyEndInsertRow(const FilterListNode *, int); + void proxyBeginRemoveRow(const FilterListNode *, int); + void proxyEndRemoveRow(const FilterListNode *, int); private: FilterListNode *indexToNode(const QModelIndex &idx) const; From 16d30fb9e1c9fe8baf566d4a236fe2e706daec67 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Wed, 22 Jan 2014 20:52:52 +0000 Subject: [PATCH 05/16] miscellaneous code cleanup renamed filter list modules to filter tree to more accurately reflect the nature of the data structure. --- cockatrice/CMakeLists.txt | 8 +- cockatrice/src/carddatabasemodel.cpp | 20 +-- cockatrice/src/carddatabasemodel.h | 8 +- cockatrice/src/cardfilter.cpp | 4 +- cockatrice/src/cardfilter.h | 2 +- cockatrice/src/filterbuilder.cpp | 14 +- cockatrice/src/filterbuilder.h | 2 - .../src/{filterlist.cpp => filtertree.cpp} | 76 +++++----- cockatrice/src/{filterlist.h => filtertree.h} | 78 +++++----- ...ilterlistmodel.cpp => filtertreemodel.cpp} | 142 +++++++++--------- .../{filterlistmodel.h => filtertreemodel.h} | 30 ++-- cockatrice/src/tab_deck_editor.cpp | 15 +- cockatrice/src/tab_deck_editor.h | 4 +- 13 files changed, 197 insertions(+), 206 deletions(-) rename cockatrice/src/{filterlist.cpp => filtertree.cpp} (74%) rename cockatrice/src/{filterlist.h => filtertree.h} (65%) rename cockatrice/src/{filterlistmodel.cpp => filtertreemodel.cpp} (53%) rename cockatrice/src/{filterlistmodel.h => filtertreemodel.h} (53%) diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 97f771a9..a1e8683a 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -36,8 +36,8 @@ SET(cockatrice_SOURCES src/cardframe.cpp src/filterbuilder.cpp src/cardfilter.cpp - src/filterlistmodel.cpp - src/filterlist.cpp + src/filtertreemodel.cpp + src/filtertree.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp @@ -118,8 +118,8 @@ SET(cockatrice_HEADERS src/cardframe.h src/filterbuilder.h src/cardfilter.h - src/filterlistmodel.h - src/filterlist.h + src/filtertreemodel.h + src/filtertree.h src/messagelogwidget.h src/zoneviewzone.h src/zoneviewwidget.h diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index 559f8cc4..7f314abe 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -1,5 +1,5 @@ #include "carddatabasemodel.h" -#include "filterlist.h" +#include "filtertree.h" CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, QObject *parent) : QAbstractListModel(parent), db(_db) @@ -110,7 +110,7 @@ CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) : QSortFilterProxyModel(parent), isToken(ShowAll) { - filterList = NULL; + filterTree = NULL; setFilterCaseSensitivity(Qt::CaseInsensitive); setSortCaseSensitivity(Qt::CaseInsensitive); } @@ -146,8 +146,8 @@ bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex if (!cardTypes.contains(info->getMainCardType())) return false; - if (filterList != NULL) - return filterList->acceptsCard(info); + if (filterTree != NULL) + return filterTree->acceptsCard(info); return true; } @@ -161,17 +161,17 @@ void CardDatabaseDisplayModel::clearSearch() invalidateFilter(); } -void CardDatabaseDisplayModel::setFilterList(const FilterList *filterList) +void CardDatabaseDisplayModel::setFilterTree(const FilterTree *filterTree) { - if(this->filterList != NULL) - disconnect(this->filterList, 0, this, 0); + if (this->filterTree != NULL) + disconnect(this->filterTree, 0, this, 0); - this->filterList = filterList; - connect(this->filterList, SIGNAL(changed()), this, SLOT(filterListChanged())); + this->filterTree = filterTree; + connect(this->filterTree, SIGNAL(changed()), this, SLOT(filterTreeChanged())); invalidate(); } -void CardDatabaseDisplayModel::filterListChanged() +void CardDatabaseDisplayModel::filterTreeChanged() { invalidate(); } diff --git a/cockatrice/src/carddatabasemodel.h b/cockatrice/src/carddatabasemodel.h index ba245b41..dd72e58d 100644 --- a/cockatrice/src/carddatabasemodel.h +++ b/cockatrice/src/carddatabasemodel.h @@ -7,7 +7,7 @@ #include #include "carddatabase.h" -class FilterList; +class FilterTree; class CardDatabaseModel : public QAbstractListModel { Q_OBJECT @@ -38,10 +38,10 @@ private: FilterBool isToken; QString cardNameBeginning, cardName, cardText; QSet cardNameSet, cardTypes, cardColors; - const FilterList *filterList; + const FilterTree *filterTree; public: CardDatabaseDisplayModel(QObject *parent = 0); - void setFilterList(const FilterList *filterList); + void setFilterTree(const FilterTree *filterTree); void setIsToken(FilterBool _isToken) { isToken = _isToken; invalidate(); } void setCardNameBeginning(const QString &_beginning) { cardNameBeginning = _beginning; invalidate(); } void setCardName(const QString &_cardName) { cardName = _cardName; invalidate(); } @@ -53,7 +53,7 @@ public: protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; private slots: - void filterListChanged(); + void filterTreeChanged(); }; #endif diff --git a/cockatrice/src/cardfilter.cpp b/cockatrice/src/cardfilter.cpp index 27402921..38017377 100644 --- a/cockatrice/src/cardfilter.cpp +++ b/cockatrice/src/cardfilter.cpp @@ -2,7 +2,7 @@ const char *CardFilter::typeName(Type t) { - switch(t) { + switch (t) { case TypeAnd: return "and"; case TypeOr: @@ -18,7 +18,7 @@ const char *CardFilter::typeName(Type t) const char *CardFilter::attrName(Attr a) { - switch(a) { + switch (a) { case AttrName: return "name"; case AttrType: diff --git a/cockatrice/src/cardfilter.h b/cockatrice/src/cardfilter.h index f4f38771..539cdb0c 100644 --- a/cockatrice/src/cardfilter.h +++ b/cockatrice/src/cardfilter.h @@ -11,7 +11,7 @@ public: TypeAndNot, TypeOrNot, TypeEnd - }; + }; /* if you add an atribute here you also need to * add its string representation in attrName */ diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp index 53b93144..6e659752 100644 --- a/cockatrice/src/filterbuilder.cpp +++ b/cockatrice/src/filterbuilder.cpp @@ -16,12 +16,12 @@ FilterBuilder::FilterBuilder(QWidget *parent) QHBoxLayout *addFilter = new QHBoxLayout; filterCombo = new QComboBox; - for(i = 0; i < CardFilter::AttrEnd; i++) + for (i = 0; i < CardFilter::AttrEnd; i++) filterCombo->addItem( CardFilter::attrName(static_cast(i)), QVariant(i)); typeCombo = new QComboBox; - for(i = 0; i < CardFilter::TypeEnd; i++) + for (i = 0; i < CardFilter::TypeEnd; i++) typeCombo->addItem( CardFilter::typeName(static_cast(i)), QVariant(i)); @@ -52,7 +52,7 @@ FilterBuilder::~FilterBuilder() void FilterBuilder::destroyFilter() { - if(fltr) + if (fltr) delete fltr; } @@ -66,7 +66,7 @@ void FilterBuilder::add_released() QString txt; txt = edit->text(); - if(txt.length() < 1) + if (txt.length() < 1) return; destroyFilter(); @@ -75,9 +75,3 @@ void FilterBuilder::add_released() static_cast(comboCurrentIntData(filterCombo))); emit add(fltr); } - -bool FilterBuilder::filter(const CardFilter *f) const -{ - f = fltr; - return false; -} diff --git a/cockatrice/src/filterbuilder.h b/cockatrice/src/filterbuilder.h index 2762ba28..c126c82b 100644 --- a/cockatrice/src/filterbuilder.h +++ b/cockatrice/src/filterbuilder.h @@ -23,8 +23,6 @@ public: FilterBuilder(QWidget *parent = 0); ~FilterBuilder(); - bool filter(const CardFilter *f) const; - signals: void add(const CardFilter *f); diff --git a/cockatrice/src/filterlist.cpp b/cockatrice/src/filtertree.cpp similarity index 74% rename from cockatrice/src/filterlist.cpp rename to cockatrice/src/filtertree.cpp index 9a4b3a71..852ff5cd 100644 --- a/cockatrice/src/filterlist.cpp +++ b/cockatrice/src/filtertree.cpp @@ -1,17 +1,17 @@ -#include "filterlist.h" +#include "filtertree.h" #include "cardfilter.h" #include "carddatabase.h" #include template -FilterListNode *FilterListInnerNode::nodeAt(int i) const +FilterTreeNode *FilterTreeBranch::nodeAt(int i) const { return ((childNodes.size() > i)? childNodes.at(i) : NULL); } template -void FilterListInnerNode::deleteAt(int i) +void FilterTreeBranch::deleteAt(int i) { preRemoveChild(this, i); delete childNodes.takeAt(i); @@ -20,24 +20,24 @@ void FilterListInnerNode::deleteAt(int i) } template -int FilterListInnerNode::childIndex(const FilterListNode *node) const +int FilterTreeBranch::childIndex(const FilterTreeNode *node) const { - FilterListNode *unconst; + FilterTreeNode *unconst; T downcasted; /* to do the dynamic cast to T we will lose const'ness, but we can * trust QList::indexOf */ - unconst = (FilterListNode *) node; + unconst = (FilterTreeNode *) node; downcasted = dynamic_cast(unconst); - if(downcasted == NULL) + if (downcasted == NULL) return -1; return childNodes.indexOf(downcasted); } template -FilterListInnerNode::~FilterListInnerNode() +FilterTreeBranch::~FilterTreeBranch() { - while(!childNodes.isEmpty()) + while (!childNodes.isEmpty()) delete childNodes.takeFirst(); } @@ -45,7 +45,7 @@ const FilterItemList *LogicMap::findTypeList(CardFilter::Type type) const { QList::const_iterator i; - for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) if ((*i)->type == type) return *i; @@ -58,7 +58,7 @@ FilterItemList *LogicMap::typeList(CardFilter::Type type) int count; count = 0; - for(i = childNodes.begin(); i != childNodes.end(); i++) { + for (i = childNodes.begin(); i != childNodes.end(); i++) { if ((*i)->type == type) break; count++; @@ -73,7 +73,7 @@ FilterItemList *LogicMap::typeList(CardFilter::Type type) return *i; } -FilterListNode *LogicMap::parent() const +FilterTreeNode *LogicMap::parent() const { return p; } @@ -82,20 +82,20 @@ int FilterItemList::termIndex(const QString &term) const { int i; - for(i = 0; i < childNodes.count(); i++) - if((childNodes.at(i))->term == term) + for (i = 0; i < childNodes.count(); i++) + if ((childNodes.at(i))->term == term) return i; return -1; } -FilterListNode *FilterItemList::termNode(const QString &term) +FilterTreeNode *FilterItemList::termNode(const QString &term) { int i, count; FilterItem *fi; i = termIndex(term); - if(i < 0) { + if (i < 0) { fi = new FilterItem(term, this); count = childNodes.count(); preInsertChild(this, count); @@ -112,7 +112,7 @@ bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) co { QList::const_iterator i; - for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) if (!(*i)->acceptCardAttr(info, attr)) return false; @@ -129,7 +129,7 @@ bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) con { QList::const_iterator i; - for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) if ((*i)->acceptCardAttr(info, attr)) return true; @@ -158,7 +158,7 @@ bool FilterItem::acceptColor(const CardInfo *info) const bool status; status = false; - for(i = info->getColors().constBegin(); i != info->getColors().constEnd(); i++) + for (i = info->getColors().constBegin(); i != info->getColors().constEnd(); i++) if ((*i).contains(term, Qt::CaseInsensitive)) { status = true; break; @@ -178,7 +178,7 @@ bool FilterItem::acceptSet(const CardInfo *info) const bool status; status = false; - for(i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) + for (i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) if ((*i)->getShortName() == term || (*i)->getLongName().contains(term, Qt::CaseInsensitive)) { status = true; @@ -197,10 +197,10 @@ bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) con { bool status; - if(!isEnabled()) + if (!isEnabled()) return true; - switch(attr) { + switch (attr) { case CardFilter::AttrName: status = acceptName(info); break; @@ -227,24 +227,24 @@ bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) con } /* need to define these here to make QT happy, otherwise - * moc doesnt find some of the FilterListInnerNode symbols. + * moc doesnt find some of the FilterTreeBranch symbols. */ -FilterList::FilterList() {} -FilterList::~FilterList() {} +FilterTree::FilterTree() {} +FilterTree::~FilterTree() {} -LogicMap *FilterList::attrLogicMap(CardFilter::Attr attr) +LogicMap *FilterTree::attrLogicMap(CardFilter::Attr attr) { QList::iterator i; int count; count = 0; - for(i = childNodes.begin(); i != childNodes.end(); i++) { - if((*i)->attr == attr) + for (i = childNodes.begin(); i != childNodes.end(); i++) { + if ((*i)->attr == attr) break; count++; } - if(i == childNodes.end()) { + if (i == childNodes.end()) { preInsertChild(this, count); i = childNodes.insert(i, new LogicMap(attr, this)); postInsertChild(this, count); @@ -254,41 +254,41 @@ LogicMap *FilterList::attrLogicMap(CardFilter::Attr attr) return *i; } -FilterItemList *FilterList::attrTypeList(CardFilter::Attr attr, +FilterItemList *FilterTree::attrTypeList(CardFilter::Attr attr, CardFilter::Type type) { return attrLogicMap(attr)->typeList(type); } -int FilterList::findTermIndex(CardFilter::Attr attr, CardFilter::Type type, +int FilterTree::findTermIndex(CardFilter::Attr attr, CardFilter::Type type, const QString &term) { attrTypeList(attr, type)->termIndex(term); } -int FilterList::findTermIndex(const CardFilter *f) +int FilterTree::findTermIndex(const CardFilter *f) { return findTermIndex(f->attr(), f->type(), f->term()); } -FilterListNode *FilterList::termNode(CardFilter::Attr attr, CardFilter::Type type, +FilterTreeNode *FilterTree::termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term) { return attrTypeList(attr, type)->termNode(term); } -FilterListNode *FilterList::termNode(const CardFilter *f) +FilterTreeNode *FilterTree::termNode(const CardFilter *f) { return termNode(f->attr(), f->type(), f->term()); } -FilterListNode *FilterList::attrTypeNode(CardFilter::Attr attr, +FilterTreeNode *FilterTree::attrTypeNode(CardFilter::Attr attr, CardFilter::Type type) { return attrTypeList(attr, type); } -bool FilterList::testAttr(const CardInfo *info, const LogicMap *lm) const +bool FilterTree::testAttr(const CardInfo *info, const LogicMap *lm) const { const FilterItemList *fil; bool status; @@ -318,11 +318,11 @@ bool FilterList::testAttr(const CardInfo *info, const LogicMap *lm) const return status; } -bool FilterList::acceptsCard(const CardInfo *info) const +bool FilterTree::acceptsCard(const CardInfo *info) const { QList::const_iterator i; - for(i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) if ((*i)->isEnabled() && !testAttr(info, *i)) return false; diff --git a/cockatrice/src/filterlist.h b/cockatrice/src/filtertree.h similarity index 65% rename from cockatrice/src/filterlist.h rename to cockatrice/src/filtertree.h index 20f78984..1ee84ffa 100644 --- a/cockatrice/src/filterlist.h +++ b/cockatrice/src/filtertree.h @@ -1,5 +1,5 @@ -#ifndef FILTERLIST_H -#define FILTERLIST_H +#ifndef FILTERTREE_H +#define FILTERTREE_H #include #include @@ -9,19 +9,19 @@ class CardInfo; -class FilterListNode { +class FilterTreeNode { private: bool enabled; public: - FilterListNode() : enabled(true) {} + FilterTreeNode() : enabled(true) {} virtual bool isEnabled() const { return enabled; } virtual void enable() { enabled = true; nodeChanged(); } virtual void disable() { enabled = false; nodeChanged(); } - virtual FilterListNode *parent() const { return NULL; } - virtual FilterListNode *nodeAt(int i) const { return NULL; } + virtual FilterTreeNode *parent() const { return NULL; } + virtual FilterTreeNode *nodeAt(int i) const { return NULL; } virtual void deleteAt(int i) {} virtual int childCount() const { return 0; } - virtual int childIndex(const FilterListNode *node) const { return -1; } + virtual int childIndex(const FilterTreeNode *node) const { return -1; } virtual int index() const { return (parent() != NULL)? parent()->childIndex(this) : -1; } virtual QString text() const { return ""; } virtual bool isLeaf() const { return false; } @@ -30,56 +30,56 @@ public: printf("%s -> ", textCStr()); if (parent() != NULL) parent()->nodeChanged(); } - virtual void preInsertChild(const FilterListNode *p, int i) const { + virtual void preInsertChild(const FilterTreeNode *p, int i) const { //printf("%s -> ", textCStr()); if (parent() != NULL) parent()->preInsertChild(p, i); } - virtual void postInsertChild(const FilterListNode *p, int i) const { + virtual void postInsertChild(const FilterTreeNode *p, int i) const { //printf("%s -> ", textCStr()); if (parent() != NULL) parent()->postInsertChild(p, i); } - virtual void preRemoveChild(const FilterListNode *p, int i) const { + virtual void preRemoveChild(const FilterTreeNode *p, int i) const { printf("%s -> ", textCStr()); if (parent() != NULL) parent()->preRemoveChild(p, i); } - virtual void postRemoveChild(const FilterListNode *p, int i) const { + virtual void postRemoveChild(const FilterTreeNode *p, int i) const { printf("%s -> ", textCStr()); if (parent() != NULL) parent()->postRemoveChild(p, i); } }; template -class FilterListInnerNode : public FilterListNode { +class FilterTreeBranch : public FilterTreeNode { protected: QList childNodes; public: - ~FilterListInnerNode(); - FilterListNode *nodeAt(int i) const; + ~FilterTreeBranch(); + FilterTreeNode *nodeAt(int i) const; void deleteAt(int i); int childCount() const { return childNodes.size(); } - int childIndex(const FilterListNode *node) const; + int childIndex(const FilterTreeNode *node) const; }; class FilterItemList; -class FilterList; -class LogicMap : public FilterListInnerNode { +class FilterTree; +class LogicMap : public FilterTreeBranch { private: - FilterList *const p; + FilterTree *const p; public: const CardFilter::Attr attr; - LogicMap(CardFilter::Attr a, FilterList *parent) + LogicMap(CardFilter::Attr a, FilterTree *parent) : attr(a), p(parent) {} const FilterItemList *findTypeList(CardFilter::Type type) const; FilterItemList *typeList(CardFilter::Type type); - FilterListNode *parent() const; + FilterTreeNode *parent() const; QString text() const { return QString(CardFilter::attrName(attr)); } }; class FilterItem; -class FilterItemList : public FilterListInnerNode { +class FilterItemList : public FilterTreeBranch { private: LogicMap *const p; public: @@ -88,9 +88,9 @@ public: FilterItemList(CardFilter::Type t, LogicMap *parent) : type(t), p(parent) {} CardFilter::Attr attr() const { return p->attr; } - FilterListNode *parent() const { return p; } + FilterTreeNode *parent() const { return p; } int termIndex(const QString &term) const; - FilterListNode *termNode(const QString &term); + FilterTreeNode *termNode(const QString &term); QString text() const { return QString(CardFilter::typeName(type)); } bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; @@ -99,7 +99,7 @@ public: bool testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const; }; -class FilterItem : public FilterListNode { +class FilterItem : public FilterTreeNode { private: FilterItemList *const p; public: @@ -110,7 +110,7 @@ public: CardFilter::Attr attr() const { return p->attr(); } CardFilter::Type type() const { return p->type; } - FilterListNode *parent() const { return p; } + FilterTreeNode *parent() const { return p; } QString text() const { return term; } bool isLeaf() const { return true; } @@ -123,14 +123,14 @@ public: bool acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const; }; -class FilterList : public QObject, public FilterListInnerNode { +class FilterTree : public QObject, public FilterTreeBranch { Q_OBJECT signals: - void preInsertRow(const FilterListNode *parent, int i) const; - void postInsertRow(const FilterListNode *parent, int i) const; - void preRemoveRow(const FilterListNode *parent, int i) const; - void postRemoveRow(const FilterListNode *parent, int i) const; + void preInsertRow(const FilterTreeNode *parent, int i) const; + void postInsertRow(const FilterTreeNode *parent, int i) const; + void preRemoveRow(const FilterTreeNode *parent, int i) const; + void postRemoveRow(const FilterTreeNode *parent, int i) const; void changed() const; private: @@ -140,24 +140,24 @@ private: bool testAttr(const CardInfo *info, const LogicMap *lm) const; public: - FilterList(); - ~FilterList(); + FilterTree(); + ~FilterTree(); int findTermIndex(CardFilter::Attr attr, CardFilter::Type type, const QString &term); int findTermIndex(const CardFilter *f); - FilterListNode *termNode(CardFilter::Attr attr, CardFilter::Type type, + FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term); - FilterListNode *termNode(const CardFilter *f); - FilterListNode *attrTypeNode(CardFilter::Attr attr, + FilterTreeNode *termNode(const CardFilter *f); + FilterTreeNode *attrTypeNode(CardFilter::Attr attr, CardFilter::Type type); QString text() const { return QString("root"); } int index() const { return 0; } void nodeChanged() const { printf("root\n"); emit changed(); } - void preInsertChild(const FilterListNode *p, int i) const { emit preInsertRow(p, i); } - void postInsertChild(const FilterListNode *p, int i) const { emit postInsertRow(p, i); } - void preRemoveChild(const FilterListNode *p, int i) const { printf("root\n"); emit preRemoveRow(p, i); } - void postRemoveChild(const FilterListNode *p, int i) const { printf("root\n"); emit postRemoveRow(p, i); } + void preInsertChild(const FilterTreeNode *p, int i) const { emit preInsertRow(p, i); } + void postInsertChild(const FilterTreeNode *p, int i) const { emit postInsertRow(p, i); } + void preRemoveChild(const FilterTreeNode *p, int i) const { printf("root\n"); emit preRemoveRow(p, i); } + void postRemoveChild(const FilterTreeNode *p, int i) const { printf("root\n"); emit postRemoveRow(p, i); } bool acceptsCard(const CardInfo *info) const; }; diff --git a/cockatrice/src/filterlistmodel.cpp b/cockatrice/src/filtertreemodel.cpp similarity index 53% rename from cockatrice/src/filterlistmodel.cpp rename to cockatrice/src/filtertreemodel.cpp index 2185ff5c..d23c46ed 100644 --- a/cockatrice/src/filterlistmodel.cpp +++ b/cockatrice/src/filtertreemodel.cpp @@ -1,100 +1,100 @@ #include -#include "filterlistmodel.h" -#include "filterlist.h" +#include "filtertreemodel.h" +#include "filtertree.h" #include "cardfilter.h" -FilterListModel::FilterListModel(QObject *parent) +FilterTreeModel::FilterTreeModel(QObject *parent) : QAbstractItemModel(parent) { - fList = new FilterList; - connect(fList, - SIGNAL(preInsertRow(const FilterListNode *, int)), - this, SLOT(proxyBeginInsertRow(const FilterListNode *, int))); - connect(fList, - SIGNAL(postInsertRow(const FilterListNode *, int)), - this, SLOT(proxyEndInsertRow(const FilterListNode *, int))); - connect(fList, - SIGNAL(preRemoveRow(const FilterListNode *, int)), - this, SLOT(proxyBeginRemoveRow(const FilterListNode *, int))); - connect(fList, - SIGNAL(postRemoveRow(const FilterListNode *, int)), - this, SLOT(proxyEndRemoveRow(const FilterListNode *, int))); + fTree = new FilterTree; + connect(fTree, + SIGNAL(preInsertRow(const FilterTreeNode *, int)), + this, SLOT(proxyBeginInsertRow(const FilterTreeNode *, int))); + connect(fTree, + SIGNAL(postInsertRow(const FilterTreeNode *, int)), + this, SLOT(proxyEndInsertRow(const FilterTreeNode *, int))); + connect(fTree, + SIGNAL(preRemoveRow(const FilterTreeNode *, int)), + this, SLOT(proxyBeginRemoveRow(const FilterTreeNode *, int))); + connect(fTree, + SIGNAL(postRemoveRow(const FilterTreeNode *, int)), + this, SLOT(proxyEndRemoveRow(const FilterTreeNode *, int))); } -FilterListModel::~FilterListModel() +FilterTreeModel::~FilterTreeModel() { - delete fList; + delete fTree; } -void FilterListModel::proxyBeginInsertRow(const FilterListNode *node, int i) +void FilterTreeModel::proxyBeginInsertRow(const FilterTreeNode *node, int i) { int idx; idx = node->index(); - if(idx >= 0) + if (idx >= 0) beginInsertRows(createIndex(idx, 0, (void *) node), i, i); } -void FilterListModel::proxyEndInsertRow(const FilterListNode *node, int) +void FilterTreeModel::proxyEndInsertRow(const FilterTreeNode *node, int) { int idx; idx = node->index(); - if(idx >= 0) + if (idx >= 0) endInsertRows(); } -void FilterListModel::proxyBeginRemoveRow(const FilterListNode *node, int i) +void FilterTreeModel::proxyBeginRemoveRow(const FilterTreeNode *node, int i) { int idx; idx = node->index(); - if(idx >= 0) + if (idx >= 0) beginRemoveRows(createIndex(idx, 0, (void *) node), i, i); } -void FilterListModel::proxyEndRemoveRow(const FilterListNode *node, int) +void FilterTreeModel::proxyEndRemoveRow(const FilterTreeNode *node, int) { int idx; idx = node->index(); - if(idx >= 0) + if (idx >= 0) endRemoveRows(); } -FilterListNode *FilterListModel::indexToNode(const QModelIndex &idx) const +FilterTreeNode *FilterTreeModel::indexToNode(const QModelIndex &idx) const { void *ip; - FilterListNode *node; + FilterTreeNode *node; - if(!idx.isValid()) - return fList; + if (!idx.isValid()) + return fTree; ip = idx.internalPointer(); - if(ip == NULL) - return fList; + if (ip == NULL) + return fTree; - node = static_cast(ip); + node = static_cast(ip); return node; } -void FilterListModel::addFilter(const CardFilter *f) +void FilterTreeModel::addFilter(const CardFilter *f) { emit layoutAboutToBeChanged(); - fList->termNode(f); + fTree->termNode(f); emit layoutChanged(); } -int FilterListModel::rowCount(const QModelIndex &parent) const +int FilterTreeModel::rowCount(const QModelIndex &parent) const { - const FilterListNode *node; + const FilterTreeNode *node; int result; - if(parent.column() > 0) + if (parent.column() > 0) return 0; node = indexToNode(parent); - if(node) + if (node) result = node->childCount(); else result = 0; @@ -102,14 +102,14 @@ int FilterListModel::rowCount(const QModelIndex &parent) const return result; } -int FilterListModel::columnCount(const QModelIndex &/*parent*/) const +int FilterTreeModel::columnCount(const QModelIndex &/*parent*/) const { return 1; } -QVariant FilterListModel::data(const QModelIndex &index, int role) const +QVariant FilterTreeModel::data(const QModelIndex &index, int role) const { - const FilterListNode *node; + const FilterTreeNode *node; if (!index.isValid()) return QVariant(); @@ -117,12 +117,12 @@ QVariant FilterListModel::data(const QModelIndex &index, int role) const return QVariant(); node = indexToNode(index); - if(node == NULL) + if (node == NULL) return QVariant(); switch (role) { case Qt::FontRole: - if(!node->isLeaf()) { + if (!node->isLeaf()) { QFont f; f.setBold(true); return f; @@ -135,7 +135,7 @@ QVariant FilterListModel::data(const QModelIndex &index, int role) const case Qt::WhatsThisRole: return node->text(); case Qt::CheckStateRole: - if(node->isEnabled()) + if (node->isEnabled()) return Qt::Checked; else return Qt::Unchecked; @@ -146,10 +146,10 @@ QVariant FilterListModel::data(const QModelIndex &index, int role) const return QVariant(); } -bool FilterListModel::setData(const QModelIndex &index, +bool FilterTreeModel::setData(const QModelIndex &index, const QVariant &value, int role) { - FilterListNode *node; + FilterTreeNode *node; if (!index.isValid()) return false; @@ -159,33 +159,33 @@ bool FilterListModel::setData(const QModelIndex &index, return false; node = indexToNode(index); - if(node == NULL || node == fList) + if (node == NULL || node == fTree) return false; Qt::CheckState state = static_cast(value.toInt()); - if(state == Qt::Checked) + if (state == Qt::Checked) node->enable(); - else + else node->disable(); emit dataChanged(index, index); - return true; + return true; } -Qt::ItemFlags FilterListModel::flags(const QModelIndex &index) const +Qt::ItemFlags FilterTreeModel::flags(const QModelIndex &index) const { - const FilterListNode *node; + const FilterTreeNode *node; Qt::ItemFlags result; if (!index.isValid()) return 0; node = indexToNode(index); - if(node == NULL) + if (node == NULL) return 0; result = Qt::ItemIsEnabled; - if(node == fList) + if (node == fTree) return result; result |= Qt::ItemIsSelectable; @@ -194,9 +194,9 @@ Qt::ItemFlags FilterListModel::flags(const QModelIndex &index) const return result; } -QModelIndex FilterListModel::nodeIndex(const FilterListNode *node, int row, int column) const +QModelIndex FilterTreeModel::nodeIndex(const FilterTreeNode *node, int row, int column) const { - FilterListNode *child; + FilterTreeNode *child; if (column > 0 || row >= node->childCount()) return QModelIndex(); @@ -205,25 +205,25 @@ QModelIndex FilterListModel::nodeIndex(const FilterListNode *node, int row, int return createIndex(row, column, child); } -QModelIndex FilterListModel::index(int row, int column, +QModelIndex FilterTreeModel::index(int row, int column, const QModelIndex &parent) const { - const FilterListNode *node; + const FilterTreeNode *node; if (!hasIndex(row, column, parent)) return QModelIndex(); node = indexToNode(parent); - if(node == NULL) + if (node == NULL) return QModelIndex(); return nodeIndex(node, row, column); } -QModelIndex FilterListModel::parent(const QModelIndex &ind) const +QModelIndex FilterTreeModel::parent(const QModelIndex &ind) const { - const FilterListNode *node; - FilterListNode *parent; + const FilterTreeNode *node; + FilterTreeNode *parent; int row; QModelIndex idx; @@ -231,13 +231,13 @@ QModelIndex FilterListModel::parent(const QModelIndex &ind) const return QModelIndex(); node = indexToNode(ind); - if(node == NULL || node == fList) + if (node == NULL || node == fTree) return QModelIndex(); parent = node->parent(); - if(parent) { + if (parent) { row = parent->index(); - if(row < 0) + if (row < 0) return QModelIndex(); idx = createIndex(row, 0, parent); return idx; @@ -246,9 +246,9 @@ QModelIndex FilterListModel::parent(const QModelIndex &ind) const return QModelIndex(); } -bool FilterListModel::removeRows(int row, int count, const QModelIndex & parent) +bool FilterTreeModel::removeRows(int row, int count, const QModelIndex & parent) { - FilterListNode *node; + FilterTreeNode *node; int i, last; last = row+count-1; @@ -256,18 +256,18 @@ bool FilterListModel::removeRows(int row, int count, const QModelIndex & parent) return false; node = indexToNode(parent); - if(node == NULL || last >= node->childCount()) + if (node == NULL || last >= node->childCount()) return false; printf("delete children in %s\n", node->textCStr()); fflush(stdout); - for(i = 0; i < count; i++) { + for (i = 0; i < count; i++) { printf(" delete %d\n", i); fflush(stdout); node->deleteAt(row); } - if(node != fList && node->childCount() < 1) + if (node != fTree && node->childCount() < 1) return removeRow(parent.row(), parent.parent()); return true; diff --git a/cockatrice/src/filterlistmodel.h b/cockatrice/src/filtertreemodel.h similarity index 53% rename from cockatrice/src/filterlistmodel.h rename to cockatrice/src/filtertreemodel.h index 73cdb7e9..fd2e7e33 100644 --- a/cockatrice/src/filterlistmodel.h +++ b/cockatrice/src/filtertreemodel.h @@ -1,34 +1,34 @@ -#ifndef FILTERLISTMODEL_H -#define FILTERLISTMODEL_H +#ifndef FILTERTREEMODEL_H +#define FILTERTREEMODEL_H #include -class FilterList; +class FilterTree; class CardFilter; -class FilterListNode; +class FilterTreeNode; -class FilterListModel : public QAbstractItemModel { +class FilterTreeModel : public QAbstractItemModel { Q_OBJECT private: - FilterList *fList; + FilterTree *fTree; public slots: void addFilter(const CardFilter *f); private slots: - void proxyBeginInsertRow(const FilterListNode *, int); - void proxyEndInsertRow(const FilterListNode *, int); - void proxyBeginRemoveRow(const FilterListNode *, int); - void proxyEndRemoveRow(const FilterListNode *, int); + void proxyBeginInsertRow(const FilterTreeNode *, int); + void proxyEndInsertRow(const FilterTreeNode *, int); + void proxyBeginRemoveRow(const FilterTreeNode *, int); + void proxyEndRemoveRow(const FilterTreeNode *, int); private: - FilterListNode *indexToNode(const QModelIndex &idx) const; - QModelIndex nodeIndex(const FilterListNode *node, int row, int column) const; + FilterTreeNode *indexToNode(const QModelIndex &idx) const; + QModelIndex nodeIndex(const FilterTreeNode *node, int row, int column) const; public: - FilterListModel(QObject *parent = 0); - ~FilterListModel(); - const FilterList *filterList() const { return fList; } + FilterTreeModel(QObject *parent = 0); + ~FilterTreeModel(); + const FilterTree *filterTree() const { return fTree; } int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index a1fc1022..57b48135 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -42,12 +42,11 @@ #include #include "cardframe.h" #include "filterbuilder.h" -#include "carditem.h" -#include "carddatabase.h" +//#include "carditem.h" +//#include "carddatabase.h" #include "main.h" #include "settingscache.h" -#include "filterlistmodel.h" -#include "filterlist.h" +#include "filtertreemodel.h" void SearchLineEdit::keyPressEvent(QKeyEvent *event) { @@ -169,8 +168,8 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) searchAndButtons->addLayout(searchLayout, 0, 1); botFrame->addLayout(searchAndButtons); - filterModel = new FilterListModel(); - databaseDisplayModel->setFilterList(filterModel->filterList()); + filterModel = new FilterTreeModel(); + databaseDisplayModel->setFilterTree(filterModel->filterTree()); filterView = new QTreeView; filterView->setModel(filterModel); filterView->setMaximumWidth(250); @@ -663,7 +662,7 @@ void TabDeckEditor::filterViewCustomContextMenu(const QPoint &point) { QModelIndex idx; idx = filterView->indexAt(point); - if(!idx.isValid()) + if (!idx.isValid()) return; action = menu.addAction(QString("delete")); @@ -679,7 +678,7 @@ void TabDeckEditor::filterRemove(QAction *action) { point = action->data().toPoint(); idx = filterView->indexAt(point); - if(!idx.isValid()) + if (!idx.isValid()) return; filterModel->removeRow(idx.row(), idx.parent()); diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 716f6ade..2b955c3f 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -16,7 +16,7 @@ class DlgCardSearch; class QLabel; class DeckLoader; class Response; -class FilterListModel; +class FilterTreeModel; class SearchLineEdit : public QLineEdit { private: @@ -84,7 +84,7 @@ private: QLabel *hashLabel1; QLabel *hashLabel; DlgCardSearch *dlgCardSearch; - FilterListModel *filterModel; + FilterTreeModel *filterModel; QTreeView *filterView; QMenu *deckMenu, *dbMenu; From c786e180c39db86c5e4b1f4104bf65cc45c41801 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Sun, 26 Jan 2014 23:20:35 +0000 Subject: [PATCH 06/16] reverted back to original deck editor layout but including filtertree the original layout is actually more space efficient if using CardFrame instead of CardInfoWidget and reducing the size of the deck editor toolbar. this commit also removes the old search feature by removing the search button and the clear search button. the clear search menu item is left in place, however it now clears the filtertree. finally, the stretch factor for the right frame in the main layout was reduced to zero so that the card database gets priority for extra space. this makes more sense because the deck editor does not actually need very much horizontal space. --- cockatrice/src/carddatabasemodel.cpp | 4 +- cockatrice/src/carddatabasemodel.h | 4 +- cockatrice/src/cardframe.cpp | 9 +- cockatrice/src/cardframe.h | 2 +- cockatrice/src/filtertree.cpp | 6 ++ cockatrice/src/filtertree.h | 19 ++-- cockatrice/src/filtertreemodel.h | 2 +- cockatrice/src/tab_deck_editor.cpp | 154 ++++++++++----------------- cockatrice/src/tab_deck_editor.h | 5 +- 9 files changed, 80 insertions(+), 125 deletions(-) diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index 7f314abe..ddddddfe 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -158,10 +158,12 @@ void CardDatabaseDisplayModel::clearSearch() cardText.clear(); cardTypes.clear(); cardColors.clear(); + if (filterTree != NULL) + filterTree->clear(); invalidateFilter(); } -void CardDatabaseDisplayModel::setFilterTree(const FilterTree *filterTree) +void CardDatabaseDisplayModel::setFilterTree(FilterTree *filterTree) { if (this->filterTree != NULL) disconnect(this->filterTree, 0, this, 0); diff --git a/cockatrice/src/carddatabasemodel.h b/cockatrice/src/carddatabasemodel.h index dd72e58d..621eff5a 100644 --- a/cockatrice/src/carddatabasemodel.h +++ b/cockatrice/src/carddatabasemodel.h @@ -38,10 +38,10 @@ private: FilterBool isToken; QString cardNameBeginning, cardName, cardText; QSet cardNameSet, cardTypes, cardColors; - const FilterTree *filterTree; + FilterTree *filterTree; public: CardDatabaseDisplayModel(QObject *parent = 0); - void setFilterTree(const FilterTree *filterTree); + void setFilterTree(FilterTree *filterTree); void setIsToken(FilterBool _isToken) { isToken = _isToken; invalidate(); } void setCardNameBeginning(const QString &_beginning) { cardNameBeginning = _beginning; invalidate(); } void setCardName(const QString &_cardName) { cardName = _cardName; invalidate(); } diff --git a/cockatrice/src/cardframe.cpp b/cockatrice/src/cardframe.cpp index bdfca5cf..dd4191ef 100644 --- a/cockatrice/src/cardframe.cpp +++ b/cockatrice/src/cardframe.cpp @@ -5,15 +5,12 @@ #include "carddatabase.h" #include "main.h" -CardFrame::CardFrame(const QString &cardName, QWidget *parent, Qt::WindowFlags flags) - : QLabel(parent, flags) +CardFrame::CardFrame(const QString &cardName, QWidget *parent) + : QLabel(parent) , info(0) { - this->setAlignment(Qt::AlignCenter); - setFrameStyle(QFrame::Panel | QFrame::Raised); - setFixedWidth(250); - + setMaximumWidth(250); setCard(db->getCard(cardName)); } diff --git a/cockatrice/src/cardframe.h b/cockatrice/src/cardframe.h index 465dff24..1dccf821 100644 --- a/cockatrice/src/cardframe.h +++ b/cockatrice/src/cardframe.h @@ -15,7 +15,7 @@ private: CardInfo *info; public: - CardFrame(const QString &cardName = QString(), QWidget *parent = 0, Qt::WindowFlags f = 0); + CardFrame(const QString &cardName = QString(), QWidget *parent = 0); QString getCardName() const; public slots: diff --git a/cockatrice/src/filtertree.cpp b/cockatrice/src/filtertree.cpp index 852ff5cd..9e647e82 100644 --- a/cockatrice/src/filtertree.cpp +++ b/cockatrice/src/filtertree.cpp @@ -328,3 +328,9 @@ bool FilterTree::acceptsCard(const CardInfo *info) const return true; } + +void FilterTree::clear() +{ + while(childCount() > 0) + deleteAt(0); +} diff --git a/cockatrice/src/filtertree.h b/cockatrice/src/filtertree.h index 1ee84ffa..816bf97a 100644 --- a/cockatrice/src/filtertree.h +++ b/cockatrice/src/filtertree.h @@ -27,23 +27,18 @@ public: virtual bool isLeaf() const { return false; } virtual const char *textCStr() const { return text().toStdString().c_str(); } virtual void nodeChanged() const { - printf("%s -> ", textCStr()); if (parent() != NULL) parent()->nodeChanged(); } virtual void preInsertChild(const FilterTreeNode *p, int i) const { - //printf("%s -> ", textCStr()); if (parent() != NULL) parent()->preInsertChild(p, i); } virtual void postInsertChild(const FilterTreeNode *p, int i) const { - //printf("%s -> ", textCStr()); if (parent() != NULL) parent()->postInsertChild(p, i); } virtual void preRemoveChild(const FilterTreeNode *p, int i) const { - printf("%s -> ", textCStr()); if (parent() != NULL) parent()->preRemoveChild(p, i); } virtual void postRemoveChild(const FilterTreeNode *p, int i) const { - printf("%s -> ", textCStr()); if (parent() != NULL) parent()->postRemoveChild(p, i); } }; @@ -139,6 +134,13 @@ private: CardFilter::Type type); bool testAttr(const CardInfo *info, const LogicMap *lm) const; + + void nodeChanged() const { emit changed(); } + void preInsertChild(const FilterTreeNode *p, int i) const { emit preInsertRow(p, i); } + void postInsertChild(const FilterTreeNode *p, int i) const { emit postInsertRow(p, i); } + void preRemoveChild(const FilterTreeNode *p, int i) const { emit preRemoveRow(p, i); } + void postRemoveChild(const FilterTreeNode *p, int i) const { emit postRemoveRow(p, i); } + public: FilterTree(); ~FilterTree(); @@ -153,13 +155,8 @@ public: QString text() const { return QString("root"); } int index() const { return 0; } - void nodeChanged() const { printf("root\n"); emit changed(); } - void preInsertChild(const FilterTreeNode *p, int i) const { emit preInsertRow(p, i); } - void postInsertChild(const FilterTreeNode *p, int i) const { emit postInsertRow(p, i); } - void preRemoveChild(const FilterTreeNode *p, int i) const { printf("root\n"); emit preRemoveRow(p, i); } - void postRemoveChild(const FilterTreeNode *p, int i) const { printf("root\n"); emit postRemoveRow(p, i); } - bool acceptsCard(const CardInfo *info) const; + void clear(); }; #endif diff --git a/cockatrice/src/filtertreemodel.h b/cockatrice/src/filtertreemodel.h index fd2e7e33..7e49e9b1 100644 --- a/cockatrice/src/filtertreemodel.h +++ b/cockatrice/src/filtertreemodel.h @@ -28,7 +28,7 @@ private: public: FilterTreeModel(QObject *parent = 0); ~FilterTreeModel(); - const FilterTree *filterTree() const { return fTree; } + FilterTree *filterTree() const { return fTree; } int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 57b48135..2de449f4 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -21,7 +21,7 @@ #include "carddatabase.h" #include "carddatabasemodel.h" #include "decklistmodel.h" -#include "dlg_cardsearch.h" +#include "cardinfowidget.h" #include "dlg_load_deck_from_clipboard.h" #include "dlg_edit_tokens.h" #include "main.h" @@ -33,20 +33,9 @@ #include "pending_command.h" #include "pb/response.pb.h" #include "pb/command_deck_upload.pb.h" -#include -#include -#include -#include -#include -#include -#include +#include "filtertreemodel.h" #include "cardframe.h" #include "filterbuilder.h" -//#include "carditem.h" -//#include "carddatabase.h" -#include "main.h" -#include "settingscache.h" -#include "filtertreemodel.h" void SearchLineEdit::keyPressEvent(QKeyEvent *event) { @@ -58,9 +47,6 @@ void SearchLineEdit::keyPressEvent(QKeyEvent *event) TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) : Tab(_tabSupervisor, parent), modified(false) { - aSearch = new QAction(QString(), this); - aSearch->setIcon(QIcon(":/resources/icon_search.svg")); - connect(aSearch, SIGNAL(triggered()), this, SLOT(actSearch())); aClearSearch = new QAction(QString(), this); aClearSearch->setIcon(QIcon(":/resources/icon_clearsearch.svg")); connect(aClearSearch, SIGNAL(triggered()), this, SLOT(actClearSearch())); @@ -70,16 +56,15 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) searchLabel->setBuddy(searchEdit); connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); connect(searchEdit, SIGNAL(returnPressed()), this, SLOT(actAddCard())); - QToolButton *searchButton = new QToolButton; - searchButton->setDefaultAction(aSearch); - QToolButton *clearSearchButton = new QToolButton; - clearSearchButton->setDefaultAction(aClearSearch); + + QToolBar *deckEditToolBar = new QToolBar; + deckEditToolBar->setOrientation(Qt::Horizontal); + deckEditToolBar->setIconSize(QSize(24, 24)); QHBoxLayout *searchLayout = new QHBoxLayout; + searchLayout->addWidget(deckEditToolBar); searchLayout->addWidget(searchLabel); searchLayout->addWidget(searchEdit); - searchLayout->addWidget(searchButton); - searchLayout->addWidget(clearSearchButton); databaseModel = new CardDatabaseModel(db, this); databaseDisplayModel = new CardDatabaseDisplayModel(this); @@ -98,16 +83,33 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); searchEdit->setTreeView(databaseView); - cardInfo = new CardFrame(); - cardInfo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); + QVBoxLayout *leftFrame = new QVBoxLayout; + leftFrame->addLayout(searchLayout); + leftFrame->addWidget(databaseView); - QToolBar *verticalToolBar = new QToolBar; - verticalToolBar->setOrientation(Qt::Horizontal); - verticalToolBar->setIconSize(QSize(24, 24)); - QHBoxLayout *verticalToolBarLayout = new QHBoxLayout; - //verticalToolBarLayout->addStretch(); - verticalToolBarLayout->addWidget(verticalToolBar); - //verticalToolBarLayout->addStretch(); + cardInfo = new CardFrame(); + filterModel = new FilterTreeModel(); + databaseDisplayModel->setFilterTree(filterModel->filterTree()); + filterView = new QTreeView; + filterView->setModel(filterModel); + filterView->setMaximumWidth(250); + filterView->setUniformRowHeights(true); + filterView->setHeaderHidden(true); + filterView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); + connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)), + this, SLOT(filterViewCustomContextMenu(const QPoint &))); + FilterBuilder *filterBuilder = new FilterBuilder; + filterBuilder->setMaximumWidth(250); + connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); + + QVBoxLayout *filter = new QVBoxLayout; + filter->addWidget(filterBuilder, 0, Qt::AlignTop); + filter->addWidget(filterView, 10); + + QVBoxLayout *middleFrame = new QVBoxLayout; + middleFrame->addWidget(cardInfo, 0, Qt::AlignTop); + middleFrame->addLayout(filter, 10); deckModel = new DeckListModel(this); connect(deckModel, SIGNAL(deckHashChanged()), this, SLOT(updateHash())); @@ -133,6 +135,9 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) grid->addWidget(nameLabel, 0, 0); grid->addWidget(nameEdit, 0, 1); + grid->addWidget(commentsLabel, 1, 0); + grid->addWidget(commentsEdit, 1, 1); + grid->addWidget(hashLabel1, 2, 0); grid->addWidget(hashLabel, 2, 1); @@ -153,49 +158,15 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) deckToolbarLayout->addWidget(deckToolBar); deckToolbarLayout->addStretch(); - QVBoxLayout *deckFrame = new QVBoxLayout; - deckFrame->addLayout(grid); - deckFrame->addWidget(deckView, 10); - deckFrame->addLayout(deckToolbarLayout); + QVBoxLayout *rightFrame = new QVBoxLayout; + rightFrame->addLayout(grid); + rightFrame->addWidget(deckView, 10); + rightFrame->addLayout(deckToolbarLayout); - QHBoxLayout *topFrame = new QHBoxLayout; - topFrame->addWidget(cardInfo, 10); - topFrame->addLayout(deckFrame); - - QVBoxLayout *botFrame = new QVBoxLayout; - QGridLayout *searchAndButtons = new QGridLayout; - searchAndButtons->addLayout(verticalToolBarLayout, 0, 0); - searchAndButtons->addLayout(searchLayout, 0, 1); - botFrame->addLayout(searchAndButtons); - - filterModel = new FilterTreeModel(); - databaseDisplayModel->setFilterTree(filterModel->filterTree()); - filterView = new QTreeView; - filterView->setModel(filterModel); - filterView->setMaximumWidth(250); - filterView->setUniformRowHeights(true); - filterView->setHeaderHidden(true); - filterView->setExpandsOnDoubleClick(false); - filterView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); - connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)), - this, SLOT(filterViewCustomContextMenu(const QPoint &))); - FilterBuilder *filterBuilder = new FilterBuilder; - filterBuilder->setMaximumWidth(250); - connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); - - QVBoxLayout *filter = new QVBoxLayout; - filter->addWidget(filterBuilder, 0, Qt::AlignTop); - filter->addWidget(filterView); - - QHBoxLayout *dbFrame = new QHBoxLayout; - dbFrame->addLayout(filter); - dbFrame->addWidget(databaseView); - botFrame->addLayout(dbFrame); - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->addLayout(topFrame, 10); - mainLayout->addLayout(botFrame, 10); + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->addLayout(leftFrame, 10); + mainLayout->addLayout(middleFrame); + mainLayout->addLayout(rightFrame); setLayout(mainLayout); aNewDeck = new QAction(QString(), this); @@ -249,7 +220,6 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) dbMenu->addAction(aEditSets); dbMenu->addAction(aEditTokens); dbMenu->addSeparator(); - dbMenu->addAction(aSearch); dbMenu->addAction(aClearSearch); addTabMenu(dbMenu); @@ -269,14 +239,12 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) aDecrement->setIcon(QIcon(":/resources/decrement.svg")); connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); - verticalToolBar->addAction(aAddCard); - verticalToolBar->addAction(aAddCardToSideboard); - verticalToolBar->addAction(aRemoveCard); - verticalToolBar->addAction(aIncrement); - verticalToolBar->addAction(aDecrement); - verticalToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - - dlgCardSearch = new DlgCardSearch(this); + deckEditToolBar->addAction(aAddCard); + deckEditToolBar->addAction(aAddCardToSideboard); + deckEditToolBar->addAction(aRemoveCard); + deckEditToolBar->addAction(aIncrement); + deckEditToolBar->addAction(aDecrement); + deckEditToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); retranslateUi(); @@ -290,7 +258,6 @@ TabDeckEditor::~TabDeckEditor() void TabDeckEditor::retranslateUi() { - aSearch->setText(tr("&Search...")); aClearSearch->setText(tr("&Clear search")); searchLabel->setText(tr("&Search for:")); @@ -299,11 +266,11 @@ void TabDeckEditor::retranslateUi() hashLabel1->setText(tr("Hash:")); aUpdatePrices->setText(tr("&Update prices")); - aUpdatePrices->setShortcut(tr("Ctrl+U")); - - aNewDeck->setText(tr("&New deck")); - aLoadDeck->setText(tr("&Load deck...")); - aSaveDeck->setText(tr("&Save deck")); + aUpdatePrices->setShortcut(tr("Ctrl+U")); + + aNewDeck->setText(tr("&New deck")); + aLoadDeck->setText(tr("&Load deck...")); + aSaveDeck->setText(tr("&Save deck")); aSaveDeckAs->setText(tr("Save deck &as...")); aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard...")); aSaveDeckToClipboard->setText(tr("Save deck to clip&board")); @@ -532,17 +499,6 @@ void TabDeckEditor::actEditTokens() db->saveToFile(settingsCache->getTokenDatabasePath(), true); } -void TabDeckEditor::actSearch() -{ - if (dlgCardSearch->exec()) { - searchEdit->clear(); - databaseDisplayModel->setCardName(dlgCardSearch->getCardName()); - databaseDisplayModel->setCardText(dlgCardSearch->getCardText()); - databaseDisplayModel->setCardTypes(dlgCardSearch->getCardTypes()); - databaseDisplayModel->setCardColors(dlgCardSearch->getCardColors()); - } -} - void TabDeckEditor::actClearSearch() { databaseDisplayModel->clearSearch(); diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 2b955c3f..3554df82 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -12,7 +12,6 @@ class QTreeView; class QTableView; class CardFrame; class QTextEdit; -class DlgCardSearch; class QLabel; class DeckLoader; class Response; @@ -50,7 +49,6 @@ private slots: void actEditSets(); void actEditTokens(); - void actSearch(); void actClearSearch(); void actAddCard(); @@ -83,13 +81,12 @@ private: QTextEdit *commentsEdit; QLabel *hashLabel1; QLabel *hashLabel; - DlgCardSearch *dlgCardSearch; FilterTreeModel *filterModel; QTreeView *filterView; QMenu *deckMenu, *dbMenu; QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose; - QAction *aEditSets, *aEditTokens, *aSearch, *aClearSearch; + QAction *aEditSets, *aEditTokens, *aClearSearch; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices; bool modified; From 5d223b5917e73b68e3e1510a20976832097ded41 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Tue, 28 Jan 2014 23:51:18 +0000 Subject: [PATCH 07/16] clear the filter term text edit box appropriately clear the text box when the '+' button is pressed or when the filter attribute is changed. also changed the frame style to match the card frame style. --- cockatrice/src/filterbuilder.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp index 6e659752..3b520663 100644 --- a/cockatrice/src/filterbuilder.cpp +++ b/cockatrice/src/filterbuilder.cpp @@ -37,11 +37,12 @@ FilterBuilder::FilterBuilder(QWidget *parent) layout->addLayout(addFilter); layout->addWidget(edit); - setFrameStyle(QFrame::Plain | QFrame::Box); + setFrameStyle(QFrame::Panel | QFrame::Raised); layout->setAlignment(Qt::AlignTop); setLayout(layout); connect(ok, SIGNAL(released()), this, SLOT(add_released())); + connect(filterCombo, SIGNAL(currentIndexChanged(int)), edit, SLOT(clear())); fltr = NULL; } @@ -74,4 +75,5 @@ void FilterBuilder::add_released() static_cast(comboCurrentIntData(typeCombo)), static_cast(comboCurrentIntData(filterCombo))); emit add(fltr); + edit->clear(); } From f77054f20d9cf963fea09f8f7458656a24e97edb Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Wed, 29 Jan 2014 00:19:34 +0000 Subject: [PATCH 08/16] refactor cardframe as a parent of a text card frame and a picture card frame cardframe is now a stacked widget that prefers to show the card picture only so that the screen can be more space efficient and the card pixel map can be displayed as a larger size. however if the card pixel map can not be loaded for some reason, the cardframe class will automatically switch to the text version of the card. a menu item was added under the database menu to allow for users to prefer card text only. --- cockatrice/CMakeLists.txt | 4 ++ cockatrice/src/cardframe.cpp | 44 ++++++++++---------- cockatrice/src/cardframe.h | 22 ++++++---- cockatrice/src/cardinfopicture.cpp | 53 +++++++++++++++++++++++ cockatrice/src/cardinfopicture.h | 34 +++++++++++++++ cockatrice/src/cardinfotext.cpp | 67 ++++++++++++++++++++++++++++++ cockatrice/src/cardinfotext.h | 31 ++++++++++++++ cockatrice/src/tab_deck_editor.cpp | 8 +++- cockatrice/src/tab_deck_editor.h | 2 +- 9 files changed, 231 insertions(+), 34 deletions(-) create mode 100644 cockatrice/src/cardinfopicture.cpp create mode 100644 cockatrice/src/cardinfopicture.h create mode 100644 cockatrice/src/cardinfotext.cpp create mode 100644 cockatrice/src/cardinfotext.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index a1e8683a..4012795f 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -34,6 +34,8 @@ SET(cockatrice_SOURCES src/dlg_load_remote_deck.cpp src/cardinfowidget.cpp src/cardframe.cpp + src/cardinfopicture.cpp + src/cardinfotext.cpp src/filterbuilder.cpp src/cardfilter.cpp src/filtertreemodel.cpp @@ -116,6 +118,8 @@ SET(cockatrice_HEADERS src/dlg_load_remote_deck.h src/cardinfowidget.h src/cardframe.h + src/cardinfopicture.h + src/cardinfotext.h src/filterbuilder.h src/cardfilter.h src/filtertreemodel.h diff --git a/cockatrice/src/cardframe.cpp b/cockatrice/src/cardframe.cpp index dd4191ef..89b3cb6b 100644 --- a/cockatrice/src/cardframe.cpp +++ b/cockatrice/src/cardframe.cpp @@ -1,16 +1,27 @@ #include "cardframe.h" -#include #include "carditem.h" #include "carddatabase.h" #include "main.h" +#include "cardinfopicture.h" +#include "cardinfotext.h" -CardFrame::CardFrame(const QString &cardName, QWidget *parent) - : QLabel(parent) +CardFrame::CardFrame(int width, int height, + const QString &cardName, QWidget *parent) + : QStackedWidget(parent) , info(0) + , cardTextOnly(false) { setFrameStyle(QFrame::Panel | QFrame::Raised); - setMaximumWidth(250); + setMaximumWidth(width); + setMinimumWidth(width); + setMaximumHeight(height); + setMinimumHeight(height); + pic = new CardInfoPicture(width); + addWidget(pic); + text = new CardInfoText(); + addWidget(text); + connect(pic, SIGNAL(hasPictureChanged()), this, SLOT(hasPictureChanged())); setCard(db->getCard(cardName)); } @@ -19,10 +30,9 @@ void CardFrame::setCard(CardInfo *card) if (info) disconnect(info, 0, this, 0); info = card; - connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); connect(info, SIGNAL(destroyed()), this, SLOT(clear())); - - updatePixmap(); + text->setCard(info); + pic->setCard(info); } void CardFrame::setCard(const QString &cardName) @@ -40,22 +50,10 @@ void CardFrame::clear() setCard(db->getCard()); } -void CardFrame::updatePixmap() +void CardFrame::hasPictureChanged() { - qreal aspectRatio = (qreal) CARD_HEIGHT / (qreal) CARD_WIDTH; - qreal pixmapWidth = this->width(); - - if (pixmapWidth == 0) - return; - - QPixmap *resizedPixmap = info->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)); - if (resizedPixmap) - this->setPixmap(*resizedPixmap); + if (pic->hasPicture() && !cardTextOnly) + setCurrentWidget(pic); else - this->setPixmap(*(db->getCard()->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)))); -} - -QString CardFrame::getCardName() const -{ - return info->getName(); + setCurrentWidget(text); } diff --git a/cockatrice/src/cardframe.h b/cockatrice/src/cardframe.h index 1dccf821..c241c51a 100644 --- a/cockatrice/src/cardframe.h +++ b/cockatrice/src/cardframe.h @@ -1,32 +1,36 @@ #ifndef CARDFRAME_H #define CARDFRAME_H -#include -#include +#include class AbstractCardItem; class CardInfo; -class QResizeEvent; +class CardInfoPicture; +class CardInfoText; -class CardFrame : public QLabel { +class CardFrame : public QStackedWidget { Q_OBJECT private: CardInfo *info; + CardInfoPicture *pic; + CardInfoText *text; + bool cardTextOnly; public: - CardFrame(const QString &cardName = QString(), QWidget *parent = 0); - QString getCardName() const; + CardFrame(int width, int height, const QString &cardName = QString(), + QWidget *parent = 0); + void setCardTextOnly(bool status) { cardTextOnly = status; hasPictureChanged(); } public slots: void setCard(CardInfo *card); void setCard(const QString &cardName); void setCard(AbstractCardItem *card); + void clear(); private slots: - void clear(); - void updatePixmap(); - + void hasPictureChanged(); + void toggleCardTextOnly() { setCardTextOnly(!cardTextOnly); } }; #endif diff --git a/cockatrice/src/cardinfopicture.cpp b/cockatrice/src/cardinfopicture.cpp new file mode 100644 index 00000000..7a7d6195 --- /dev/null +++ b/cockatrice/src/cardinfopicture.cpp @@ -0,0 +1,53 @@ +#include "cardinfopicture.h" + +#include +#include "carditem.h" +#include "carddatabase.h" +#include "main.h" + +CardInfoPicture::CardInfoPicture(int maximumWidth, QWidget *parent) + : QLabel(parent) + , info(0) + , noPicture(true) +{ + setMaximumWidth(maximumWidth); +} + +void CardInfoPicture::setNoPicture(bool status) +{ + if (noPicture != status) { + noPicture = status; + emit hasPictureChanged(); + } +} + +void CardInfoPicture::setCard(CardInfo *card) +{ + if (info) + disconnect(info, 0, this, 0); + info = card; + connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); + + updatePixmap(); +} + +void CardInfoPicture::updatePixmap() +{ + qreal aspectRatio = (qreal) CARD_HEIGHT / (qreal) CARD_WIDTH; + qreal pixmapWidth = this->width(); + + if (pixmapWidth == 0) { + setNoPicture(true); + return; + } + + QPixmap *resizedPixmap = info->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)); + if (resizedPixmap) { + setNoPicture(false); + this->setPixmap(*resizedPixmap); + } + else { + setNoPicture(true); + this->setPixmap(*(db->getCard()->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)))); + } +} diff --git a/cockatrice/src/cardinfopicture.h b/cockatrice/src/cardinfopicture.h new file mode 100644 index 00000000..9f34da94 --- /dev/null +++ b/cockatrice/src/cardinfopicture.h @@ -0,0 +1,34 @@ +#ifndef CARDINFOPICTURE_H +#define CARDINFOPICTURE_H + +#include + +class AbstractCardItem; +class CardInfo; + +class CardInfoPicture : public QLabel { + Q_OBJECT + +signals: + void hasPictureChanged(); + +private: + CardInfo *info; + bool noPicture; + +public: + CardInfoPicture(int maximumWidth, QWidget *parent = 0); + bool hasPicture() const { return !noPicture; } + +private: + void setNoPicture(bool status); + +public slots: + void setCard(CardInfo *card); + +private slots: + void updatePixmap(); + +}; + +#endif diff --git a/cockatrice/src/cardinfotext.cpp b/cockatrice/src/cardinfotext.cpp new file mode 100644 index 00000000..9e59f33b --- /dev/null +++ b/cockatrice/src/cardinfotext.cpp @@ -0,0 +1,67 @@ +#include "cardinfotext.h" + +#include +#include +#include +#include "carditem.h" +#include "carddatabase.h" +#include "main.h" + +CardInfoText::CardInfoText(QWidget *parent) + : QFrame(parent) + , info(0) +{ + nameLabel1 = new QLabel; + nameLabel2 = new QLabel; + nameLabel2->setWordWrap(true); + manacostLabel1 = new QLabel; + manacostLabel2 = new QLabel; + manacostLabel2->setWordWrap(true); + cardtypeLabel1 = new QLabel; + cardtypeLabel2 = new QLabel; + cardtypeLabel2->setWordWrap(true); + powtoughLabel1 = new QLabel; + powtoughLabel2 = new QLabel; + loyaltyLabel1 = new QLabel; + loyaltyLabel2 = new QLabel; + + textLabel = new QTextEdit(); + textLabel->setReadOnly(true); + + QGridLayout *grid = new QGridLayout(this); + int row = 0; + grid->addWidget(nameLabel1, row, 0); + grid->addWidget(nameLabel2, row++, 1); + grid->addWidget(manacostLabel1, row, 0); + grid->addWidget(manacostLabel2, row++, 1); + grid->addWidget(cardtypeLabel1, row, 0); + grid->addWidget(cardtypeLabel2, row++, 1); + grid->addWidget(powtoughLabel1, row, 0); + grid->addWidget(powtoughLabel2, row++, 1); + grid->addWidget(loyaltyLabel1, row, 0); + grid->addWidget(loyaltyLabel2, row++, 1); + grid->addWidget(textLabel, row, 0, -1, 2); + grid->setRowStretch(row, 1); + grid->setColumnStretch(1, 1); + + retranslateUi(); +} + +void CardInfoText::setCard(CardInfo *card) +{ + nameLabel2->setText(card->getName()); + manacostLabel2->setText(card->getManaCost()); + cardtypeLabel2->setText(card->getCardType()); + powtoughLabel2->setText(card->getPowTough()); + loyaltyLabel2->setText(card->getLoyalty() > 0 ? QString::number(card->getLoyalty()) : QString()); + textLabel->setText(card->getText()); +} + +void CardInfoText::retranslateUi() +{ + nameLabel1->setText(tr("Name:")); + manacostLabel1->setText(tr("Mana cost:")); + cardtypeLabel1->setText(tr("Card type:")); + powtoughLabel1->setText(tr("P / T:")); + loyaltyLabel1->setText(tr("Loyalty:")); +} diff --git a/cockatrice/src/cardinfotext.h b/cockatrice/src/cardinfotext.h new file mode 100644 index 00000000..0b555230 --- /dev/null +++ b/cockatrice/src/cardinfotext.h @@ -0,0 +1,31 @@ +#ifndef CARDINFOTEXT_H +#define CARDINFOTEXT_H + +#include + +class QLabel; +class QTextEdit; +class CardInfo; + +class CardInfoText : public QFrame { + Q_OBJECT + +private: + QLabel *nameLabel1, *nameLabel2; + QLabel *manacostLabel1, *manacostLabel2; + QLabel *cardtypeLabel1, *cardtypeLabel2; + QLabel *powtoughLabel1, *powtoughLabel2; + QLabel *loyaltyLabel1, *loyaltyLabel2; + QTextEdit *textLabel; + + CardInfo *info; + +public: + CardInfoText(QWidget *parent = 0); + void retranslateUi(); + +public slots: + void setCard(CardInfo *card); +}; + +#endif diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 2de449f4..38179197 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -87,7 +87,11 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) leftFrame->addLayout(searchLayout); leftFrame->addWidget(databaseView); - cardInfo = new CardFrame(); + cardInfo = new CardFrame(250, 356); + aCardTextOnly = new QAction(QString(), this); + aCardTextOnly->setCheckable(true); + connect(aCardTextOnly, SIGNAL(triggered()), cardInfo, SLOT(toggleCardTextOnly())); + filterModel = new FilterTreeModel(); databaseDisplayModel->setFilterTree(filterModel->filterTree()); filterView = new QTreeView; @@ -221,6 +225,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) dbMenu->addAction(aEditTokens); dbMenu->addSeparator(); dbMenu->addAction(aClearSearch); + dbMenu->addAction(aCardTextOnly); addTabMenu(dbMenu); aAddCard = new QAction(QString(), this); @@ -258,6 +263,7 @@ TabDeckEditor::~TabDeckEditor() void TabDeckEditor::retranslateUi() { + aCardTextOnly->setText(tr("&Show card text only")); aClearSearch->setText(tr("&Clear search")); searchLabel->setText(tr("&Search for:")); diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 3554df82..0821e605 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -86,7 +86,7 @@ private: QMenu *deckMenu, *dbMenu; QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose; - QAction *aEditSets, *aEditTokens, *aClearSearch; + QAction *aEditSets, *aEditTokens, *aClearSearch, *aCardTextOnly; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices; bool modified; From f6e9676c75816214b02af50d1a544ee7dc552294 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Wed, 29 Jan 2014 07:15:44 +0000 Subject: [PATCH 09/16] revert cardinfowidget to its original content reverted cardinfowidget to its original form at commit 95c6058dc3027df51f114b5b4350306d6bff8217 before i messed with it. i didnt intend to make changes to it. --- cockatrice/src/cardinfowidget.cpp | 34 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/cockatrice/src/cardinfowidget.cpp b/cockatrice/src/cardinfowidget.cpp index 708da01c..e0ad1b7e 100644 --- a/cockatrice/src/cardinfowidget.cpp +++ b/cockatrice/src/cardinfowidget.cpp @@ -51,25 +51,23 @@ CardInfoWidget::CardInfoWidget(ResizeMode _mode, const QString &cardName, QWidge textLabel->setReadOnly(true); QGridLayout *grid = new QGridLayout(this); - if (mode == ModeGameTab) { - int row = 0; - + int row = 0; + if (mode == ModeGameTab) grid->addWidget(dropList, row++, 1, 1, 1, Qt::AlignRight); - grid->addWidget(cardPicture, row++, 0, 1, 2); - grid->addWidget(nameLabel1, row, 0); - grid->addWidget(nameLabel2, row++, 1); - grid->addWidget(manacostLabel1, row, 0); - grid->addWidget(manacostLabel2, row++, 1); - grid->addWidget(cardtypeLabel1, row, 0); - grid->addWidget(cardtypeLabel2, row++, 1); - grid->addWidget(powtoughLabel1, row, 0); - grid->addWidget(powtoughLabel2, row++, 1); - grid->addWidget(loyaltyLabel1, row, 0); - grid->addWidget(loyaltyLabel2, row++, 1); - grid->addWidget(textLabel, row, 0, -1, 2); - grid->setRowStretch(row, 1); - grid->setColumnStretch(1, 1); - } + grid->addWidget(cardPicture, row++, 0, 1, 2); + grid->addWidget(nameLabel1, row, 0); + grid->addWidget(nameLabel2, row++, 1); + grid->addWidget(manacostLabel1, row, 0); + grid->addWidget(manacostLabel2, row++, 1); + grid->addWidget(cardtypeLabel1, row, 0); + grid->addWidget(cardtypeLabel2, row++, 1); + grid->addWidget(powtoughLabel1, row, 0); + grid->addWidget(powtoughLabel2, row++, 1); + grid->addWidget(loyaltyLabel1, row, 0); + grid->addWidget(loyaltyLabel2, row++, 1); + grid->addWidget(textLabel, row, 0, -1, 2); + grid->setRowStretch(row, 1); + grid->setColumnStretch(1, 1); retranslateUi(); setFrameStyle(QFrame::Panel | QFrame::Raised); From 2b7ea0c9837c85b158feca88a7d5870f7d20003c Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Mon, 24 Mar 2014 21:03:26 +0000 Subject: [PATCH 10/16] refactored deck editor UI key shortcuts The global shortcuts were removed in favor of key events which are only triggered when a widget has focus. This is necessary to allow different widgets to react differently to the 'enter' key. The current key configuration is: search edit focused: * left/right: decrease/increase card count for selected database card * enter: add selected card to deck * ctrl-enter: add selected card to deck sideboard * ctrl-left/right: decrease/increase card count in sideboard for selected card database focused: the same as with search edit. deckview focused: * left/right: decrease/increase card count for selected deckview card * enter: increase count for selected deckview card * delete/backspace: delete selected card from deck --- cockatrice/CMakeLists.txt | 2 + cockatrice/src/decklistmodel.cpp | 35 +++++++++- cockatrice/src/decklistmodel.h | 3 + cockatrice/src/filterbuilder.cpp | 5 +- cockatrice/src/filterbuilder.h | 2 +- cockatrice/src/keysignals.cpp | 49 ++++++++++++++ cockatrice/src/keysignals.h | 30 +++++++++ cockatrice/src/tab_deck_editor.cpp | 105 ++++++++++++++++++++++------- cockatrice/src/tab_deck_editor.h | 11 +++ 9 files changed, 212 insertions(+), 30 deletions(-) create mode 100644 cockatrice/src/keysignals.cpp create mode 100644 cockatrice/src/keysignals.h diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index 4012795f..c90a00d7 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -26,6 +26,7 @@ SET(cockatrice_SOURCES src/handzone.cpp src/handcounter.cpp src/carddatabase.cpp + src/keysignals.cpp src/gameview.cpp src/gameselector.cpp src/decklistmodel.cpp @@ -110,6 +111,7 @@ SET(cockatrice_HEADERS src/handzone.h src/handcounter.h src/carddatabase.h + src/keysignals.h src/gameview.h src/gameselector.h src/decklistmodel.h diff --git a/cockatrice/src/decklistmodel.cpp b/cockatrice/src/decklistmodel.cpp index 6abbba86..68062ead 100644 --- a/cockatrice/src/decklistmodel.cpp +++ b/cockatrice/src/decklistmodel.cpp @@ -169,8 +169,7 @@ Qt::ItemFlags DeckListModel::flags(const QModelIndex &index) const return 0; Qt::ItemFlags result = Qt::ItemIsEnabled; - if (getNode(index)) - result |= Qt::ItemIsSelectable; + result |= Qt::ItemIsSelectable; return result; } @@ -236,6 +235,38 @@ InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerD return newNode; } +DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName) const +{ + InnerDecklistNode *zoneNode, *typeNode; + CardInfo *info; + QString cardType; + + zoneNode = dynamic_cast(root->findChild(zoneName)); + if(!zoneNode) + return NULL; + + info = db->getCard(cardName); + if(!info) + return NULL; + + cardType = info->getMainCardType(); + typeNode = dynamic_cast(zoneNode->findChild(cardType)); + if(!typeNode) + return NULL; + + return dynamic_cast(typeNode->findChild(cardName)); +} + +QModelIndex DeckListModel::findCard(const QString &cardName, const QString &zoneName) const +{ + DecklistModelCardNode *cardNode; + + cardNode = findCardNode(cardName, zoneName); + if(!cardNode) + return QModelIndex(); + return nodeToIndex(cardNode); +} + QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneName) { InnerDecklistNode *zoneNode = createNodeIfNeeded(zoneName, root); diff --git a/cockatrice/src/decklistmodel.h b/cockatrice/src/decklistmodel.h index 4d81d007..43c8e2a3 100644 --- a/cockatrice/src/decklistmodel.h +++ b/cockatrice/src/decklistmodel.h @@ -45,6 +45,8 @@ public: Qt::ItemFlags flags(const QModelIndex &index) const; bool setData(const QModelIndex &index, const QVariant &value, int role); bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); + + QModelIndex findCard(const QString &cardName, const QString &zoneName) const; QModelIndex addCard(const QString &cardName, const QString &zoneName); void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); void cleanList(); @@ -56,6 +58,7 @@ private: InnerDecklistNode *root; InnerDecklistNode *createNodeIfNeeded(const QString &name, InnerDecklistNode *parent); QModelIndex nodeToIndex(AbstractDecklistNode *node) const; + DecklistModelCardNode *findCardNode(const QString &cardName, const QString &zoneName) const; void emitRecursiveUpdates(const QModelIndex &index); void sortHelper(InnerDecklistNode *node, Qt::SortOrder order); diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp index 3b520663..2e0bc73d 100644 --- a/cockatrice/src/filterbuilder.cpp +++ b/cockatrice/src/filterbuilder.cpp @@ -41,7 +41,8 @@ FilterBuilder::FilterBuilder(QWidget *parent) layout->setAlignment(Qt::AlignTop); setLayout(layout); - connect(ok, SIGNAL(released()), this, SLOT(add_released())); + connect(edit, SIGNAL(returnPressed()), this, SLOT(emit_add())); + connect(ok, SIGNAL(released()), this, SLOT(emit_add())); connect(filterCombo, SIGNAL(currentIndexChanged(int)), edit, SLOT(clear())); fltr = NULL; } @@ -62,7 +63,7 @@ static int comboCurrentIntData(const QComboBox *combo) return combo->itemData(combo->currentIndex()).toInt(); } -void FilterBuilder::add_released() +void FilterBuilder::emit_add() { QString txt; diff --git a/cockatrice/src/filterbuilder.h b/cockatrice/src/filterbuilder.h index c126c82b..1d0565f3 100644 --- a/cockatrice/src/filterbuilder.h +++ b/cockatrice/src/filterbuilder.h @@ -28,7 +28,7 @@ signals: public slots: private slots: - void add_released(); + void emit_add(); protected: }; diff --git a/cockatrice/src/keysignals.cpp b/cockatrice/src/keysignals.cpp new file mode 100644 index 00000000..1994e387 --- /dev/null +++ b/cockatrice/src/keysignals.cpp @@ -0,0 +1,49 @@ +#include "keysignals.h" +#include + +bool KeySignals::eventFilter(QObject * /*object*/, QEvent *event) { + QKeyEvent *kevent; + + if(event->type() != QEvent::KeyPress) + return false; + + kevent = static_cast(event); + switch(kevent->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + if(kevent->modifiers() & Qt::ControlModifier) + emit onCtrlEnter(); + else + emit onEnter(); + break; + case Qt::Key_Right: + if(kevent->modifiers() & Qt::ControlModifier) + emit onCtrlRight(); + else + emit onRight(); + + if(!filterLROn) + return false; + break; + case Qt::Key_Left: + if(kevent->modifiers() & Qt::ControlModifier) + emit onCtrlLeft(); + else + emit onLeft(); + + if(!filterLROn) + return false; + break; + case Qt::Key_Delete: + case Qt::Key_Backspace: + emit onDelete(); + + if(!filterDeleteOn) + return false; + break; + default: + return false; + } + + return true; +} diff --git a/cockatrice/src/keysignals.h b/cockatrice/src/keysignals.h new file mode 100644 index 00000000..006e0ce3 --- /dev/null +++ b/cockatrice/src/keysignals.h @@ -0,0 +1,30 @@ +#include +#include + +class KeySignals : public QObject { + Q_OBJECT + +private: + bool filterDeleteOn; + bool filterLROn; + +signals: + void onEnter(); + void onCtrlEnter(); + void onLeft(); + void onCtrlLeft(); + void onRight(); + void onCtrlRight(); + void onDelete(); + +protected: + virtual bool eventFilter(QObject *, QEvent *event); + +public: + KeySignals() + : filterDeleteOn(true) + , filterLROn(true) + {} + void filterDelete(bool on) { filterDeleteOn = on; } + void filterLeftRight(bool on) { filterLROn = on; } +}; diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 38179197..8454cd25 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -54,8 +54,15 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) searchLabel = new QLabel(); searchEdit = new SearchLineEdit; searchLabel->setBuddy(searchEdit); + searchKeySignals.filterDelete(false); + searchEdit->installEventFilter(&searchKeySignals); connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); - connect(searchEdit, SIGNAL(returnPressed()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); + connect(&searchKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); + connect(&searchKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); QToolBar *deckEditToolBar = new QToolBar; deckEditToolBar->setOrientation(Qt::Horizontal); @@ -71,6 +78,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) databaseDisplayModel->setSourceModel(databaseModel); databaseDisplayModel->setFilterKeyColumn(0); databaseDisplayModel->sort(0, Qt::AscendingOrder); + databaseView = new QTreeView(); databaseView->setModel(databaseDisplayModel); databaseView->setUniformRowHeights(true); @@ -81,6 +89,14 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) databaseView->resizeColumnToContents(0); connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &))); connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); + databaseView->installEventFilter(&dbViewKeySignals); + connect(&dbViewKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); + connect(&dbViewKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); + connect(&dbViewKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); + connect(&dbViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); + connect(&dbViewKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); + connect(&dbViewKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); + searchEdit->setTreeView(databaseView); QVBoxLayout *leftFrame = new QVBoxLayout; @@ -121,7 +137,13 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) deckView->setModel(deckModel); deckView->setUniformRowHeights(true); deckView->header()->setResizeMode(QHeaderView::ResizeToContents); + deckViewKeySignals.filterLeftRight(false); + deckView->installEventFilter(&deckViewKeySignals); connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); + connect(&deckViewKeySignals, SIGNAL(onEnter()), this, SLOT(actIncrement())); + connect(&deckViewKeySignals, SIGNAL(onRight()), this, SLOT(actIncrement())); + connect(&deckViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrement())); + connect(&deckViewKeySignals, SIGNAL(onDelete()), this, SLOT(actRemoveCard())); nameLabel = new QLabel(); nameEdit = new QLineEdit; @@ -286,9 +308,8 @@ void TabDeckEditor::retranslateUi() aClose->setShortcut(tr("Ctrl+Q")); aAddCard->setText(tr("Add card to &maindeck")); - aAddCard->setShortcuts(QList() << QKeySequence(tr("Return")) << QKeySequence(tr("Enter"))); aAddCardToSideboard->setText(tr("Add card to &sideboard")); - aAddCardToSideboard->setShortcuts(QList() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter"))); + aRemoveCard->setText(tr("&Remove row")); aRemoveCard->setShortcut(tr("Del")); aIncrement->setText(tr("&Increment number")); @@ -517,18 +538,27 @@ void TabDeckEditor::recursiveExpand(const QModelIndex &index) deckView->expand(index); } -void TabDeckEditor::addCardHelper(QString zoneName) +CardInfo *TabDeckEditor::currentCardInfo() const { const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex(); if (!currentIndex.isValid()) - return; + return NULL; const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); - CardInfo *info = db->getCard(cardName); + return db->getCard(cardName); +} + +void TabDeckEditor::addCardHelper(QString zoneName) +{ + const CardInfo *info; + + info = currentCardInfo(); + if(!info) + return; if (info->getIsToken()) zoneName = "tokens"; - - QModelIndex newCardIndex = deckModel->addCard(cardName, zoneName); + + QModelIndex newCardIndex = deckModel->addCard(info->getName(), zoneName); recursiveExpand(newCardIndex); deckView->setCurrentIndex(newCardIndex); @@ -554,31 +584,56 @@ void TabDeckEditor::actRemoveCard() setModified(true); } +void TabDeckEditor::offsetCountAtIndex(const QModelIndex &idx, int offset) +{ + if (!idx.isValid() || offset == 0) + return; + + const QModelIndex numberIndex = idx.sibling(idx.row(), 0); + const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); + deckView->setCurrentIndex(numberIndex); + if ((count + offset) <= 0) + deckModel->removeRow(idx.row(), idx.parent()); + else + deckModel->setData(numberIndex, count + offset, Qt::EditRole); + setModified(true); +} + +void TabDeckEditor::decrementCardHelper(QString zoneName) +{ + const CardInfo *info; + QModelIndex idx; + + info = currentCardInfo(); + if(!info) + return; + if (info->getIsToken()) + zoneName = "tokens"; + + idx = deckModel->findCard(info->getName(), zoneName); + offsetCountAtIndex(idx, -1); +} + +void TabDeckEditor::actDecrementCard() +{ + decrementCardHelper("main"); +} + +void TabDeckEditor::actDecrementCardFromSideboard() +{ + decrementCardHelper("side"); +} + void TabDeckEditor::actIncrement() { const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - if (!currentIndex.isValid()) - return; - const QModelIndex numberIndex = currentIndex.sibling(currentIndex.row(), 0); - const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); - deckView->setCurrentIndex(numberIndex); - deckModel->setData(numberIndex, count + 1, Qt::EditRole); - setModified(true); + offsetCountAtIndex(currentIndex, 1); } void TabDeckEditor::actDecrement() { const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - if (!currentIndex.isValid()) - return; - const QModelIndex numberIndex = currentIndex.sibling(currentIndex.row(), 0); - const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); - deckView->setCurrentIndex(numberIndex); - if (count == 1) - deckModel->removeRow(currentIndex.row(), currentIndex.parent()); - else - deckModel->setData(numberIndex, count - 1, Qt::EditRole); - setModified(true); + offsetCountAtIndex(currentIndex, -1); } void TabDeckEditor::actUpdatePrices() diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 0821e605..8dde3e58 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -4,6 +4,7 @@ #include "tab.h" #include #include +#include "keysignals.h" class CardDatabaseModel; class CardDatabaseDisplayModel; @@ -16,6 +17,7 @@ class QLabel; class DeckLoader; class Response; class FilterTreeModel; +class CardInfo; class SearchLineEdit : public QLineEdit { private: @@ -56,6 +58,9 @@ private slots: void actRemoveCard(); void actIncrement(); void actDecrement(); + void actDecrementCard(); + void actDecrementCardFromSideboard(); + void actUpdatePrices(); void finishedUpdatingPrices(); @@ -63,7 +68,10 @@ private slots: void filterViewCustomContextMenu(const QPoint &point); void filterRemove(QAction *action); private: + CardInfo *currentCardInfo() const; void addCardHelper(QString zoneName); + void offsetCountAtIndex(const QModelIndex &idx, int offset); + void decrementCardHelper(QString zoneName); void recursiveExpand(const QModelIndex &index); bool confirmClose(); @@ -71,10 +79,13 @@ private: CardDatabaseDisplayModel *databaseDisplayModel; DeckListModel *deckModel; QTreeView *databaseView; + KeySignals dbViewKeySignals; QTreeView *deckView; + KeySignals deckViewKeySignals; CardFrame *cardInfo; QLabel *searchLabel; SearchLineEdit *searchEdit; + KeySignals searchKeySignals; QLabel *nameLabel; QLineEdit *nameEdit; QLabel *commentsLabel; From 610f0b6f6f7e50ee27610108e83596cfe568108e Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Mon, 24 Mar 2014 23:52:30 +0000 Subject: [PATCH 11/16] make sure filtertree stuff translates The logic types and attribute names were not previously being translated by the tr(...) function. --- cockatrice/src/filterbuilder.cpp | 8 ++++++-- cockatrice/src/filtertree.h | 11 ++++++----- cockatrice/src/filtertreemodel.cpp | 5 ++++- cockatrice/src/tab_deck_editor.cpp | 7 ++++--- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp index 2e0bc73d..128cd7bc 100644 --- a/cockatrice/src/filterbuilder.cpp +++ b/cockatrice/src/filterbuilder.cpp @@ -18,12 +18,16 @@ FilterBuilder::FilterBuilder(QWidget *parent) filterCombo = new QComboBox; for (i = 0; i < CardFilter::AttrEnd; i++) filterCombo->addItem( - CardFilter::attrName(static_cast(i)), QVariant(i)); + tr(CardFilter::attrName(static_cast(i))), + QVariant(i) + ); typeCombo = new QComboBox; for (i = 0; i < CardFilter::TypeEnd; i++) typeCombo->addItem( - CardFilter::typeName(static_cast(i)), QVariant(i)); + tr(CardFilter::typeName(static_cast(i))), + QVariant(i) + ); QPushButton *ok = new QPushButton("+"); ok->setMaximumSize(20, 20); diff --git a/cockatrice/src/filtertree.h b/cockatrice/src/filtertree.h index 816bf97a..a404e5a0 100644 --- a/cockatrice/src/filtertree.h +++ b/cockatrice/src/filtertree.h @@ -23,9 +23,9 @@ public: virtual int childCount() const { return 0; } virtual int childIndex(const FilterTreeNode *node) const { return -1; } virtual int index() const { return (parent() != NULL)? parent()->childIndex(this) : -1; } - virtual QString text() const { return ""; } + virtual QString text() const { return QString(textCStr()); } virtual bool isLeaf() const { return false; } - virtual const char *textCStr() const { return text().toStdString().c_str(); } + virtual const char *textCStr() const { return ""; } virtual void nodeChanged() const { if (parent() != NULL) parent()->nodeChanged(); } @@ -70,7 +70,7 @@ public: const FilterItemList *findTypeList(CardFilter::Type type) const; FilterItemList *typeList(CardFilter::Type type); FilterTreeNode *parent() const; - QString text() const { return QString(CardFilter::attrName(attr)); } + const char* textCStr() const { return CardFilter::attrName(attr); } }; class FilterItem; @@ -86,7 +86,7 @@ public: FilterTreeNode *parent() const { return p; } int termIndex(const QString &term) const; FilterTreeNode *termNode(const QString &term); - QString text() const { return QString(CardFilter::typeName(type)); } + const char *textCStr() const { return CardFilter::typeName(type); } bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const; @@ -107,6 +107,7 @@ public: CardFilter::Type type() const { return p->type; } FilterTreeNode *parent() const { return p; } QString text() const { return term; } + const char *textCStr() const { return term.toStdString().c_str(); } bool isLeaf() const { return true; } bool acceptName(const CardInfo *info) const; @@ -152,7 +153,7 @@ public: FilterTreeNode *termNode(const CardFilter *f); FilterTreeNode *attrTypeNode(CardFilter::Attr attr, CardFilter::Type type); - QString text() const { return QString("root"); } + const char *textCStr() { return "root"; } int index() const { return 0; } bool acceptsCard(const CardInfo *info) const; diff --git a/cockatrice/src/filtertreemodel.cpp b/cockatrice/src/filtertreemodel.cpp index d23c46ed..8b3c57a3 100644 --- a/cockatrice/src/filtertreemodel.cpp +++ b/cockatrice/src/filtertreemodel.cpp @@ -133,7 +133,10 @@ QVariant FilterTreeModel::data(const QModelIndex &index, int role) const case Qt::ToolTipRole: case Qt::StatusTipRole: case Qt::WhatsThisRole: - return node->text(); + if(!node->isLeaf()) + return tr(node->textCStr()); + else + return node->text(); case Qt::CheckStateRole: if (node->isEnabled()) return Qt::Checked; diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 8454cd25..75d6312b 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -285,7 +285,7 @@ TabDeckEditor::~TabDeckEditor() void TabDeckEditor::retranslateUi() { - aCardTextOnly->setText(tr("&Show card text only")); + aCardTextOnly->setText(tr("Show card text only")); aClearSearch->setText(tr("&Clear search")); searchLabel->setText(tr("&Search for:")); @@ -591,11 +591,12 @@ void TabDeckEditor::offsetCountAtIndex(const QModelIndex &idx, int offset) const QModelIndex numberIndex = idx.sibling(idx.row(), 0); const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); + const int new_count = count + offset; deckView->setCurrentIndex(numberIndex); - if ((count + offset) <= 0) + if (new_count <= 0) deckModel->removeRow(idx.row(), idx.parent()); else - deckModel->setData(numberIndex, count + offset, Qt::EditRole); + deckModel->setData(numberIndex, new_count, Qt::EditRole); setModified(true); } From 378cc91c176b7896b4c7f9b931ed2eda26a24af8 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Tue, 25 Mar 2014 00:07:58 +0000 Subject: [PATCH 12/16] delete debug printf statements this should fix the compilation issue mentioned by mattkelly --- cockatrice/src/filtertreemodel.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cockatrice/src/filtertreemodel.cpp b/cockatrice/src/filtertreemodel.cpp index 8b3c57a3..c004ba22 100644 --- a/cockatrice/src/filtertreemodel.cpp +++ b/cockatrice/src/filtertreemodel.cpp @@ -262,13 +262,8 @@ bool FilterTreeModel::removeRows(int row, int count, const QModelIndex & parent) if (node == NULL || last >= node->childCount()) return false; - printf("delete children in %s\n", node->textCStr()); - fflush(stdout); - for (i = 0; i < count; i++) { - printf(" delete %d\n", i); - fflush(stdout); + for (i = 0; i < count; i++) node->deleteAt(row); - } if (node != fTree && node->childCount() < 1) return removeRow(parent.row(), parent.parent()); From 748aac7ee85073deb3b285f3fd59f78b4bcf060d Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Tue, 25 Mar 2014 01:13:41 +0000 Subject: [PATCH 13/16] whitespace modifications in preparation for merge --- cockatrice/src/carddatabasemodel.cpp | 224 +++---- cockatrice/src/carddatabasemodel.h | 66 +- cockatrice/src/decklistmodel.cpp | 598 +++++++++--------- cockatrice/src/decklistmodel.h | 84 +-- cockatrice/src/tab_deck_editor.cpp | 906 +++++++++++++-------------- cockatrice/src/tab_deck_editor.h | 148 ++--- 6 files changed, 1013 insertions(+), 1013 deletions(-) diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index ddddddfe..0abdf70a 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -2,12 +2,12 @@ #include "filtertree.h" CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, QObject *parent) - : QAbstractListModel(parent), db(_db) + : QAbstractListModel(parent), db(_db) { - connect(db, SIGNAL(cardListChanged()), this, SLOT(updateCardList())); - connect(db, SIGNAL(cardAdded(CardInfo *)), this, SLOT(cardAdded(CardInfo *))); - connect(db, SIGNAL(cardRemoved(CardInfo *)), this, SLOT(cardRemoved(CardInfo *))); - updateCardList(); + connect(db, SIGNAL(cardListChanged()), this, SLOT(updateCardList())); + connect(db, SIGNAL(cardAdded(CardInfo *)), this, SLOT(cardAdded(CardInfo *))); + connect(db, SIGNAL(cardRemoved(CardInfo *)), this, SLOT(cardRemoved(CardInfo *))); + updateCardList(); } CardDatabaseModel::~CardDatabaseModel() @@ -16,164 +16,164 @@ CardDatabaseModel::~CardDatabaseModel() int CardDatabaseModel::rowCount(const QModelIndex &/*parent*/) const { - return cardList.size(); + return cardList.size(); } int CardDatabaseModel::columnCount(const QModelIndex &/*parent*/) const { - return 5; + return 5; } QVariant CardDatabaseModel::data(const QModelIndex &index, int role) const { - if (!index.isValid()) - return QVariant(); - if ((index.row() >= cardList.size()) || (index.column() >= 5)) - return QVariant(); - if (role != Qt::DisplayRole) - return QVariant(); + if (!index.isValid()) + return QVariant(); + if ((index.row() >= cardList.size()) || (index.column() >= 5)) + return QVariant(); + if (role != Qt::DisplayRole) + return QVariant(); - CardInfo *card = cardList.at(index.row()); - switch (index.column()){ - case 0: return card->getName(); - case 1: { - QStringList setList; - const QList &sets = card->getSets(); - for (int i = 0; i < sets.size(); i++) - setList << sets[i]->getShortName(); - return setList.join(", "); - } - case 2: return card->getManaCost(); - case 3: return card->getCardType(); - case 4: return card->getPowTough(); - default: return QVariant(); - } + CardInfo *card = cardList.at(index.row()); + switch (index.column()){ + case 0: return card->getName(); + case 1: { + QStringList setList; + const QList &sets = card->getSets(); + for (int i = 0; i < sets.size(); i++) + setList << sets[i]->getShortName(); + return setList.join(", "); + } + case 2: return card->getManaCost(); + case 3: return card->getCardType(); + case 4: return card->getPowTough(); + default: return QVariant(); + } } QVariant CardDatabaseModel::headerData(int section, Qt::Orientation orientation, int role) const { - if (role != Qt::DisplayRole) - return QVariant(); - if (orientation != Qt::Horizontal) - return QVariant(); - switch (section) { - case 0: return QString(tr("Name")); - case 1: return QString(tr("Sets")); - case 2: return QString(tr("Mana cost")); - case 3: return QString(tr("Card type")); - case 4: return QString(tr("P/T")); - default: return QVariant(); - } + if (role != Qt::DisplayRole) + return QVariant(); + if (orientation != Qt::Horizontal) + return QVariant(); + switch (section) { + case 0: return QString(tr("Name")); + case 1: return QString(tr("Sets")); + case 2: return QString(tr("Mana cost")); + case 3: return QString(tr("Card type")); + case 4: return QString(tr("P/T")); + default: return QVariant(); + } } void CardDatabaseModel::updateCardList() { - for (int i = 0; i < cardList.size(); ++i) - disconnect(cardList[i], 0, this, 0); - - cardList = db->getCardList(); - for (int i = 0; i < cardList.size(); ++i) - connect(cardList[i], SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); - - reset(); + for (int i = 0; i < cardList.size(); ++i) + disconnect(cardList[i], 0, this, 0); + + cardList = db->getCardList(); + for (int i = 0; i < cardList.size(); ++i) + connect(cardList[i], SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); + + reset(); } void CardDatabaseModel::cardInfoChanged(CardInfo *card) { - const int row = cardList.indexOf(card); - if (row == -1) - return; - - emit dataChanged(index(row, 0), index(row, 4)); + const int row = cardList.indexOf(card); + if (row == -1) + return; + + emit dataChanged(index(row, 0), index(row, 4)); } void CardDatabaseModel::cardAdded(CardInfo *card) { - beginInsertRows(QModelIndex(), cardList.size(), cardList.size()); - cardList.append(card); - connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); - endInsertRows(); + beginInsertRows(QModelIndex(), cardList.size(), cardList.size()); + cardList.append(card); + connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); + endInsertRows(); } void CardDatabaseModel::cardRemoved(CardInfo *card) { - const int row = cardList.indexOf(card); - if (row == -1) - return; - - beginRemoveRows(QModelIndex(), row, row); - cardList.removeAt(row); - endRemoveRows(); + const int row = cardList.indexOf(card); + if (row == -1) + return; + + beginRemoveRows(QModelIndex(), row, row); + cardList.removeAt(row); + endRemoveRows(); } CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) - : QSortFilterProxyModel(parent), - isToken(ShowAll) + : QSortFilterProxyModel(parent), + isToken(ShowAll) { - filterTree = NULL; - setFilterCaseSensitivity(Qt::CaseInsensitive); - setSortCaseSensitivity(Qt::CaseInsensitive); + filterTree = NULL; + setFilterCaseSensitivity(Qt::CaseInsensitive); + setSortCaseSensitivity(Qt::CaseInsensitive); } bool CardDatabaseDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const { - CardInfo const *info = static_cast(sourceModel())->getCard(sourceRow); + CardInfo const *info = static_cast(sourceModel())->getCard(sourceRow); - if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken())) - return false; - - if (!cardNameBeginning.isEmpty()) - if (!info->getName().startsWith(cardNameBeginning, Qt::CaseInsensitive)) - return false; - - if (!cardName.isEmpty()) - if (!info->getName().contains(cardName, Qt::CaseInsensitive)) - return false; - - if (!cardNameSet.isEmpty()) - if (!cardNameSet.contains(info->getName())) - return false; - - if (!cardText.isEmpty()) - if (!info->getText().contains(cardText, Qt::CaseInsensitive)) - return false; - - if (!cardColors.isEmpty()) - if (QSet::fromList(info->getColors()).intersect(cardColors).isEmpty() && !(info->getColors().isEmpty() && cardColors.contains("X"))) - return false; - - if (!cardTypes.isEmpty()) - if (!cardTypes.contains(info->getMainCardType())) - return false; + if (((isToken == ShowTrue) && !info->getIsToken()) || ((isToken == ShowFalse) && info->getIsToken())) + return false; + + if (!cardNameBeginning.isEmpty()) + if (!info->getName().startsWith(cardNameBeginning, Qt::CaseInsensitive)) + return false; + + if (!cardName.isEmpty()) + if (!info->getName().contains(cardName, Qt::CaseInsensitive)) + return false; + + if (!cardNameSet.isEmpty()) + if (!cardNameSet.contains(info->getName())) + return false; + + if (!cardText.isEmpty()) + if (!info->getText().contains(cardText, Qt::CaseInsensitive)) + return false; + + if (!cardColors.isEmpty()) + if (QSet::fromList(info->getColors()).intersect(cardColors).isEmpty() && !(info->getColors().isEmpty() && cardColors.contains("X"))) + return false; + + if (!cardTypes.isEmpty()) + if (!cardTypes.contains(info->getMainCardType())) + return false; - if (filterTree != NULL) - return filterTree->acceptsCard(info); + if (filterTree != NULL) + return filterTree->acceptsCard(info); - return true; + return true; } void CardDatabaseDisplayModel::clearSearch() { - cardName.clear(); - cardText.clear(); - cardTypes.clear(); - cardColors.clear(); - if (filterTree != NULL) - filterTree->clear(); - invalidateFilter(); + cardName.clear(); + cardText.clear(); + cardTypes.clear(); + cardColors.clear(); + if (filterTree != NULL) + filterTree->clear(); + invalidateFilter(); } void CardDatabaseDisplayModel::setFilterTree(FilterTree *filterTree) { - if (this->filterTree != NULL) - disconnect(this->filterTree, 0, this, 0); + if (this->filterTree != NULL) + disconnect(this->filterTree, 0, this, 0); - this->filterTree = filterTree; - connect(this->filterTree, SIGNAL(changed()), this, SLOT(filterTreeChanged())); - invalidate(); + this->filterTree = filterTree; + connect(this->filterTree, SIGNAL(changed()), this, SLOT(filterTreeChanged())); + invalidate(); } void CardDatabaseDisplayModel::filterTreeChanged() { - invalidate(); + invalidate(); } diff --git a/cockatrice/src/carddatabasemodel.h b/cockatrice/src/carddatabasemodel.h index 621eff5a..eb0f5bc2 100644 --- a/cockatrice/src/carddatabasemodel.h +++ b/cockatrice/src/carddatabasemodel.h @@ -10,50 +10,50 @@ class FilterTree; class CardDatabaseModel : public QAbstractListModel { - Q_OBJECT + Q_OBJECT public: - CardDatabaseModel(CardDatabase *_db, QObject *parent = 0); - ~CardDatabaseModel(); - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - CardDatabase *getDatabase() const { return db; } - CardInfo *getCard(int index) const { return cardList[index]; } + CardDatabaseModel(CardDatabase *_db, QObject *parent = 0); + ~CardDatabaseModel(); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + CardDatabase *getDatabase() const { return db; } + CardInfo *getCard(int index) const { return cardList[index]; } private: - QList cardList; - CardDatabase *db; + QList cardList; + CardDatabase *db; private slots: - void updateCardList(); - void cardAdded(CardInfo *card); - void cardRemoved(CardInfo *card); - void cardInfoChanged(CardInfo *card); + void updateCardList(); + void cardAdded(CardInfo *card); + void cardRemoved(CardInfo *card); + void cardInfoChanged(CardInfo *card); }; class CardDatabaseDisplayModel : public QSortFilterProxyModel { - Q_OBJECT + Q_OBJECT public: - enum FilterBool { ShowTrue, ShowFalse, ShowAll }; + enum FilterBool { ShowTrue, ShowFalse, ShowAll }; private: - FilterBool isToken; - QString cardNameBeginning, cardName, cardText; - QSet cardNameSet, cardTypes, cardColors; - FilterTree *filterTree; + FilterBool isToken; + QString cardNameBeginning, cardName, cardText; + QSet cardNameSet, cardTypes, cardColors; + FilterTree *filterTree; public: - CardDatabaseDisplayModel(QObject *parent = 0); - void setFilterTree(FilterTree *filterTree); - void setIsToken(FilterBool _isToken) { isToken = _isToken; invalidate(); } - void setCardNameBeginning(const QString &_beginning) { cardNameBeginning = _beginning; invalidate(); } - void setCardName(const QString &_cardName) { cardName = _cardName; invalidate(); } - void setCardNameSet(const QSet &_cardNameSet) { cardNameSet = _cardNameSet; invalidate(); } - void setCardText(const QString &_cardText) { cardText = _cardText; invalidate(); } - void setCardTypes(const QSet &_cardTypes) { cardTypes = _cardTypes; invalidate(); } - void setCardColors(const QSet &_cardColors) { cardColors = _cardColors; invalidate(); } - void clearSearch(); + CardDatabaseDisplayModel(QObject *parent = 0); + void setFilterTree(FilterTree *filterTree); + void setIsToken(FilterBool _isToken) { isToken = _isToken; invalidate(); } + void setCardNameBeginning(const QString &_beginning) { cardNameBeginning = _beginning; invalidate(); } + void setCardName(const QString &_cardName) { cardName = _cardName; invalidate(); } + void setCardNameSet(const QSet &_cardNameSet) { cardNameSet = _cardNameSet; invalidate(); } + void setCardText(const QString &_cardText) { cardText = _cardText; invalidate(); } + void setCardTypes(const QSet &_cardTypes) { cardTypes = _cardTypes; invalidate(); } + void setCardColors(const QSet &_cardColors) { cardColors = _cardColors; invalidate(); } + void clearSearch(); protected: - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; private slots: - void filterTreeChanged(); + void filterTreeChanged(); }; #endif diff --git a/cockatrice/src/decklistmodel.cpp b/cockatrice/src/decklistmodel.cpp index 68062ead..e8518046 100644 --- a/cockatrice/src/decklistmodel.cpp +++ b/cockatrice/src/decklistmodel.cpp @@ -14,454 +14,454 @@ #include "deck_loader.h" DeckListModel::DeckListModel(QObject *parent) - : QAbstractItemModel(parent) + : QAbstractItemModel(parent) { - deckList = new DeckLoader; - connect(deckList, SIGNAL(deckLoaded()), this, SLOT(rebuildTree())); - connect(deckList, SIGNAL(deckHashChanged()), this, SIGNAL(deckHashChanged())); - root = new InnerDecklistNode; + deckList = new DeckLoader; + connect(deckList, SIGNAL(deckLoaded()), this, SLOT(rebuildTree())); + connect(deckList, SIGNAL(deckHashChanged()), this, SIGNAL(deckHashChanged())); + root = new InnerDecklistNode; } DeckListModel::~DeckListModel() { - delete root; - delete deckList; + delete root; + delete deckList; } void DeckListModel::rebuildTree() { - root->clearTree(); - InnerDecklistNode *listRoot = deckList->getRoot(); - for (int i = 0; i < listRoot->size(); i++) { - InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); - InnerDecklistNode *node = new InnerDecklistNode(currentZone->getName(), root); - for (int j = 0; j < currentZone->size(); j++) { - DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); - // XXX better sanity checking - if (!currentCard) - continue; + root->clearTree(); + InnerDecklistNode *listRoot = deckList->getRoot(); + for (int i = 0; i < listRoot->size(); i++) { + InnerDecklistNode *currentZone = dynamic_cast(listRoot->at(i)); + InnerDecklistNode *node = new InnerDecklistNode(currentZone->getName(), root); + for (int j = 0; j < currentZone->size(); j++) { + DecklistCardNode *currentCard = dynamic_cast(currentZone->at(j)); + // XXX better sanity checking + if (!currentCard) + continue; - CardInfo *info = db->getCard(currentCard->getName()); - QString cardType; - if (!info) - cardType = "unknown"; - else - cardType = info->getMainCardType(); - InnerDecklistNode *cardTypeNode = dynamic_cast(node->findChild(cardType)); - if (!cardTypeNode) - cardTypeNode = new InnerDecklistNode(cardType, node); + CardInfo *info = db->getCard(currentCard->getName()); + QString cardType; + if (!info) + cardType = "unknown"; + else + cardType = info->getMainCardType(); + InnerDecklistNode *cardTypeNode = dynamic_cast(node->findChild(cardType)); + if (!cardTypeNode) + cardTypeNode = new InnerDecklistNode(cardType, node); - new DecklistModelCardNode(currentCard, cardTypeNode); - } - } + new DecklistModelCardNode(currentCard, cardTypeNode); + } + } - reset(); + reset(); } int DeckListModel::rowCount(const QModelIndex &parent) const { -// debugIndexInfo("rowCount", parent); - InnerDecklistNode *node = getNode(parent); - if (node) - return node->size(); - else - return 0; +// debugIndexInfo("rowCount", parent); + InnerDecklistNode *node = getNode(parent); + if (node) + return node->size(); + else + return 0; } int DeckListModel::columnCount(const QModelIndex &/*parent*/) const { - if (settingsCache->getPriceTagFeature()) - return 3; - else - return 2; + if (settingsCache->getPriceTagFeature()) + return 3; + else + return 2; } QVariant DeckListModel::data(const QModelIndex &index, int role) const { -// debugIndexInfo("data", index); - if (!index.isValid()) - return QVariant(); +// debugIndexInfo("data", index); + if (!index.isValid()) + return QVariant(); if (index.column() >= columnCount()) - return QVariant(); + return QVariant(); - AbstractDecklistNode *temp = static_cast(index.internalPointer()); - DecklistModelCardNode *card = dynamic_cast(temp); - if (!card) { - InnerDecklistNode *node = dynamic_cast(temp); - switch (role) { - case Qt::FontRole: { - QFont f; - f.setBold(true); - return f; - } - case Qt::DisplayRole: - case Qt::EditRole: - switch (index.column()) { + AbstractDecklistNode *temp = static_cast(index.internalPointer()); + DecklistModelCardNode *card = dynamic_cast(temp); + if (!card) { + InnerDecklistNode *node = dynamic_cast(temp); + switch (role) { + case Qt::FontRole: { + QFont f; + f.setBold(true); + return f; + } + case Qt::DisplayRole: + case Qt::EditRole: + switch (index.column()) { case 0: return node->recursiveCount(true); case 1: return node->getVisibleName(); case 2: return QString().sprintf("$%.2f", node->recursivePrice(true)); - default: return QVariant(); - } - case Qt::BackgroundRole: { - int color = 90 + 60 * node->depth(); - return QBrush(QColor(color, 255, color)); - } - default: return QVariant(); - } - } else { - switch (role) { - case Qt::DisplayRole: - case Qt::EditRole: { - switch (index.column()) { + default: return QVariant(); + } + case Qt::BackgroundRole: { + int color = 90 + 60 * node->depth(); + return QBrush(QColor(color, 255, color)); + } + default: return QVariant(); + } + } else { + switch (role) { + case Qt::DisplayRole: + case Qt::EditRole: { + switch (index.column()) { case 0: return card->getNumber(); case 1: return card->getName(); case 2: return QString().sprintf("$%.2f", card->getTotalPrice()); - default: return QVariant(); - } - } - case Qt::BackgroundRole: { - int color = 255 - (index.row() % 2) * 30; - return QBrush(QColor(color, color, color)); - } - default: return QVariant(); - } - } + default: return QVariant(); + } + } + case Qt::BackgroundRole: { + int color = 255 - (index.row() % 2) * 30; + return QBrush(QColor(color, color, color)); + } + default: return QVariant(); + } + } } QVariant DeckListModel::headerData(int section, Qt::Orientation orientation, int role) const { - if ((role != Qt::DisplayRole) || (orientation != Qt::Horizontal)) - return QVariant(); + if ((role != Qt::DisplayRole) || (orientation != Qt::Horizontal)) + return QVariant(); if (section >= columnCount()) - return QVariant(); - switch (section) { + return QVariant(); + switch (section) { case 0: return tr("Number"); case 1: return tr("Card"); case 2: return tr("Price"); - default: return QVariant(); - } + default: return QVariant(); + } } QModelIndex DeckListModel::index(int row, int column, const QModelIndex &parent) const { -// debugIndexInfo("index", parent); - if (!hasIndex(row, column, parent)) - return QModelIndex(); +// debugIndexInfo("index", parent); + if (!hasIndex(row, column, parent)) + return QModelIndex(); - InnerDecklistNode *parentNode = getNode(parent); - if (row >= parentNode->size()) - return QModelIndex(); + InnerDecklistNode *parentNode = getNode(parent); + if (row >= parentNode->size()) + return QModelIndex(); - return createIndex(row, column, parentNode->at(row)); + return createIndex(row, column, parentNode->at(row)); } QModelIndex DeckListModel::parent(const QModelIndex &ind) const { - if (!ind.isValid()) - return QModelIndex(); + if (!ind.isValid()) + return QModelIndex(); - return nodeToIndex(static_cast(ind.internalPointer())->getParent()); + return nodeToIndex(static_cast(ind.internalPointer())->getParent()); } Qt::ItemFlags DeckListModel::flags(const QModelIndex &index) const { - if (!index.isValid()) - return 0; + if (!index.isValid()) + return 0; - Qt::ItemFlags result = Qt::ItemIsEnabled; - result |= Qt::ItemIsSelectable; + Qt::ItemFlags result = Qt::ItemIsEnabled; + result |= Qt::ItemIsSelectable; - return result; + return result; } void DeckListModel::emitRecursiveUpdates(const QModelIndex &index) { - if (!index.isValid()) - return; - emit dataChanged(index, index); - emitRecursiveUpdates(index.parent()); + if (!index.isValid()) + return; + emit dataChanged(index, index); + emitRecursiveUpdates(index.parent()); } bool DeckListModel::setData(const QModelIndex &index, const QVariant &value, int role) { - DecklistModelCardNode *node = getNode(index); - if (!node || (role != Qt::EditRole)) - return false; + DecklistModelCardNode *node = getNode(index); + if (!node || (role != Qt::EditRole)) + return false; - switch (index.column()) { + switch (index.column()) { case 0: node->setNumber(value.toInt()); break; case 1: node->setName(value.toString()); break; case 2: node->setPrice(value.toFloat()); break; - default: return false; - } - emitRecursiveUpdates(index); - deckList->updateDeckHash(); - return true; + default: return false; + } + emitRecursiveUpdates(index); + deckList->updateDeckHash(); + return true; } bool DeckListModel::removeRows(int row, int count, const QModelIndex &parent) { - InnerDecklistNode *node = getNode(parent); - if (!node) - return false; - if (row + count > node->size()) - return false; + InnerDecklistNode *node = getNode(parent); + if (!node) + return false; + if (row + count > node->size()) + return false; - beginRemoveRows(parent, row, row + count - 1); - for (int i = 0; i < count; i++) { - AbstractDecklistNode *toDelete = node->takeAt(row); - if (DecklistModelCardNode *temp = dynamic_cast(toDelete)) - deckList->deleteNode(temp->getDataNode()); - delete toDelete; - } - endRemoveRows(); + beginRemoveRows(parent, row, row + count - 1); + for (int i = 0; i < count; i++) { + AbstractDecklistNode *toDelete = node->takeAt(row); + if (DecklistModelCardNode *temp = dynamic_cast(toDelete)) + deckList->deleteNode(temp->getDataNode()); + delete toDelete; + } + endRemoveRows(); - if (!node->size() && (node != root)) - removeRows(parent.row(), 1, parent.parent()); - else - emitRecursiveUpdates(parent); + if (!node->size() && (node != root)) + removeRows(parent.row(), 1, parent.parent()); + else + emitRecursiveUpdates(parent); - return true; + return true; } InnerDecklistNode *DeckListModel::createNodeIfNeeded(const QString &name, InnerDecklistNode *parent) { - InnerDecklistNode *newNode = dynamic_cast(parent->findChild(name)); - if (!newNode) { - beginInsertRows(nodeToIndex(parent), parent->size(), parent->size()); - newNode = new InnerDecklistNode(name, parent); - endInsertRows(); - } - return newNode; + InnerDecklistNode *newNode = dynamic_cast(parent->findChild(name)); + if (!newNode) { + beginInsertRows(nodeToIndex(parent), parent->size(), parent->size()); + newNode = new InnerDecklistNode(name, parent); + endInsertRows(); + } + return newNode; } DecklistModelCardNode *DeckListModel::findCardNode(const QString &cardName, const QString &zoneName) const { - InnerDecklistNode *zoneNode, *typeNode; - CardInfo *info; - QString cardType; + InnerDecklistNode *zoneNode, *typeNode; + CardInfo *info; + QString cardType; - zoneNode = dynamic_cast(root->findChild(zoneName)); - if(!zoneNode) - return NULL; + zoneNode = dynamic_cast(root->findChild(zoneName)); + if(!zoneNode) + return NULL; - info = db->getCard(cardName); - if(!info) - return NULL; + info = db->getCard(cardName); + if(!info) + return NULL; - cardType = info->getMainCardType(); - typeNode = dynamic_cast(zoneNode->findChild(cardType)); - if(!typeNode) - return NULL; + cardType = info->getMainCardType(); + typeNode = dynamic_cast(zoneNode->findChild(cardType)); + if(!typeNode) + return NULL; - return dynamic_cast(typeNode->findChild(cardName)); + return dynamic_cast(typeNode->findChild(cardName)); } QModelIndex DeckListModel::findCard(const QString &cardName, const QString &zoneName) const { - DecklistModelCardNode *cardNode; + DecklistModelCardNode *cardNode; - cardNode = findCardNode(cardName, zoneName); - if(!cardNode) - return QModelIndex(); - return nodeToIndex(cardNode); + cardNode = findCardNode(cardName, zoneName); + if(!cardNode) + return QModelIndex(); + return nodeToIndex(cardNode); } QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneName) { - InnerDecklistNode *zoneNode = createNodeIfNeeded(zoneName, root); + InnerDecklistNode *zoneNode = createNodeIfNeeded(zoneName, root); - CardInfo *info = db->getCard(cardName); - QString cardType = info->getMainCardType(); - InnerDecklistNode *cardTypeNode = createNodeIfNeeded(cardType, zoneNode); + CardInfo *info = db->getCard(cardName); + QString cardType = info->getMainCardType(); + InnerDecklistNode *cardTypeNode = createNodeIfNeeded(cardType, zoneNode); - DecklistModelCardNode *cardNode = dynamic_cast(cardTypeNode->findChild(cardName)); - if (!cardNode) { - DecklistCardNode *decklistCard = deckList->addCard(cardName, zoneName); - QModelIndex parentIndex = nodeToIndex(cardTypeNode); - beginInsertRows(parentIndex, cardTypeNode->size(), cardTypeNode->size()); - cardNode = new DecklistModelCardNode(decklistCard, cardTypeNode); - endInsertRows(); - sort(1); - emitRecursiveUpdates(parentIndex); - return nodeToIndex(cardNode); - } else { - cardNode->setNumber(cardNode->getNumber() + 1); - QModelIndex ind = nodeToIndex(cardNode); - emitRecursiveUpdates(ind); - deckList->updateDeckHash(); - return ind; - } + DecklistModelCardNode *cardNode = dynamic_cast(cardTypeNode->findChild(cardName)); + if (!cardNode) { + DecklistCardNode *decklistCard = deckList->addCard(cardName, zoneName); + QModelIndex parentIndex = nodeToIndex(cardTypeNode); + beginInsertRows(parentIndex, cardTypeNode->size(), cardTypeNode->size()); + cardNode = new DecklistModelCardNode(decklistCard, cardTypeNode); + endInsertRows(); + sort(1); + emitRecursiveUpdates(parentIndex); + return nodeToIndex(cardNode); + } else { + cardNode->setNumber(cardNode->getNumber() + 1); + QModelIndex ind = nodeToIndex(cardNode); + emitRecursiveUpdates(ind); + deckList->updateDeckHash(); + return ind; + } } QModelIndex DeckListModel::nodeToIndex(AbstractDecklistNode *node) const { - if (node == root) - return QModelIndex(); - return createIndex(node->getParent()->indexOf(node), 0, node); + if (node == root) + return QModelIndex(); + return createIndex(node->getParent()->indexOf(node), 0, node); } void DeckListModel::sortHelper(InnerDecklistNode *node, Qt::SortOrder order) { - // Sort children of node and save the information needed to - // update the list of persistent indexes. - QVector > sortResult = node->sort(order); - - QModelIndexList from, to; - for (int i = sortResult.size() - 1; i >= 0; --i) { - const int fromRow = sortResult[i].first; - const int toRow = sortResult[i].second; - AbstractDecklistNode *temp = node->at(toRow); - for (int j = columnCount(); j; --j) { - from << createIndex(fromRow, 0, temp); - to << createIndex(toRow, 0, temp); - } - } - changePersistentIndexList(from, to); - - // Recursion - for (int i = node->size() - 1; i >= 0; --i) { - InnerDecklistNode *subNode = dynamic_cast(node->at(i)); - if (subNode) - sortHelper(subNode, order); - } + // Sort children of node and save the information needed to + // update the list of persistent indexes. + QVector > sortResult = node->sort(order); + + QModelIndexList from, to; + for (int i = sortResult.size() - 1; i >= 0; --i) { + const int fromRow = sortResult[i].first; + const int toRow = sortResult[i].second; + AbstractDecklistNode *temp = node->at(toRow); + for (int j = columnCount(); j; --j) { + from << createIndex(fromRow, 0, temp); + to << createIndex(toRow, 0, temp); + } + } + changePersistentIndexList(from, to); + + // Recursion + for (int i = node->size() - 1; i >= 0; --i) { + InnerDecklistNode *subNode = dynamic_cast(node->at(i)); + if (subNode) + sortHelper(subNode, order); + } } void DeckListModel::sort(int /*column*/, Qt::SortOrder order) { - emit layoutAboutToBeChanged(); - sortHelper(root, order); - emit layoutChanged(); + emit layoutAboutToBeChanged(); + sortHelper(root, order); + emit layoutChanged(); } void DeckListModel::cleanList() { - setDeckList(new DeckLoader); + setDeckList(new DeckLoader); } void DeckListModel::setDeckList(DeckLoader *_deck) { - delete deckList; - deckList = _deck; - connect(deckList, SIGNAL(deckLoaded()), this, SLOT(rebuildTree())); - connect(deckList, SIGNAL(deckHashChanged()), this, SIGNAL(deckHashChanged())); - rebuildTree(); + delete deckList; + deckList = _deck; + connect(deckList, SIGNAL(deckLoaded()), this, SLOT(rebuildTree())); + connect(deckList, SIGNAL(deckHashChanged()), this, SIGNAL(deckHashChanged())); + rebuildTree(); } void DeckListModel::printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node) { - const int totalColumns = settingsCache->getPriceTagFeature() ? 3 : 2; + const int totalColumns = settingsCache->getPriceTagFeature() ? 3 : 2; - if (node->height() == 1) { - QTextBlockFormat blockFormat; - QTextCharFormat charFormat; - charFormat.setFontPointSize(11); - charFormat.setFontWeight(QFont::Bold); - cursor->insertBlock(blockFormat, charFormat); - QString priceStr; - if (settingsCache->getPriceTagFeature()) - priceStr = QString().sprintf(": $%.2f", node->recursivePrice(true)); + if (node->height() == 1) { + QTextBlockFormat blockFormat; + QTextCharFormat charFormat; + charFormat.setFontPointSize(11); + charFormat.setFontWeight(QFont::Bold); + cursor->insertBlock(blockFormat, charFormat); + QString priceStr; + if (settingsCache->getPriceTagFeature()) + priceStr = QString().sprintf(": $%.2f", node->recursivePrice(true)); cursor->insertText(QString("%1: %2").arg(node->getVisibleName()).arg(node->recursiveCount(true)).append(priceStr)); - QTextTableFormat tableFormat; - tableFormat.setCellPadding(0); - tableFormat.setCellSpacing(0); - tableFormat.setBorder(0); + QTextTableFormat tableFormat; + tableFormat.setCellPadding(0); + tableFormat.setCellSpacing(0); + tableFormat.setBorder(0); QTextTable *table = cursor->insertTable(node->size() + 1, totalColumns, tableFormat); - for (int i = 0; i < node->size(); i++) { - AbstractDecklistCardNode *card = dynamic_cast(node->at(i)); + for (int i = 0; i < node->size(); i++) { + AbstractDecklistCardNode *card = dynamic_cast(node->at(i)); - QTextCharFormat cellCharFormat; - cellCharFormat.setFontPointSize(9); + QTextCharFormat cellCharFormat; + cellCharFormat.setFontPointSize(9); - QTextTableCell cell = table->cellAt(i, 0); - cell.setFormat(cellCharFormat); - QTextCursor cellCursor = cell.firstCursorPosition(); - cellCursor.insertText(QString("%1 ").arg(card->getNumber())); + QTextTableCell cell = table->cellAt(i, 0); + cell.setFormat(cellCharFormat); + QTextCursor cellCursor = cell.firstCursorPosition(); + cellCursor.insertText(QString("%1 ").arg(card->getNumber())); - cell = table->cellAt(i, 1); - cell.setFormat(cellCharFormat); - cellCursor = cell.firstCursorPosition(); - cellCursor.insertText(card->getName()); + cell = table->cellAt(i, 1); + cell.setFormat(cellCharFormat); + cellCursor = cell.firstCursorPosition(); + cellCursor.insertText(card->getName()); - if (settingsCache->getPriceTagFeature()) { - cell = table->cellAt(i, 2); - cell.setFormat(cellCharFormat); - cellCursor = cell.firstCursorPosition(); - cellCursor.insertText(QString().sprintf("$%.2f ", card->getTotalPrice())); - } - } - } else if (node->height() == 2) { - QTextBlockFormat blockFormat; - QTextCharFormat charFormat; - charFormat.setFontPointSize(14); - charFormat.setFontWeight(QFont::Bold); + if (settingsCache->getPriceTagFeature()) { + cell = table->cellAt(i, 2); + cell.setFormat(cellCharFormat); + cellCursor = cell.firstCursorPosition(); + cellCursor.insertText(QString().sprintf("$%.2f ", card->getTotalPrice())); + } + } + } else if (node->height() == 2) { + QTextBlockFormat blockFormat; + QTextCharFormat charFormat; + charFormat.setFontPointSize(14); + charFormat.setFontWeight(QFont::Bold); - cursor->insertBlock(blockFormat, charFormat); - QString priceStr; - if (settingsCache->getPriceTagFeature()) - priceStr = QString().sprintf(": $%.2f", node->recursivePrice(true)); + cursor->insertBlock(blockFormat, charFormat); + QString priceStr; + if (settingsCache->getPriceTagFeature()) + priceStr = QString().sprintf(": $%.2f", node->recursivePrice(true)); cursor->insertText(QString("%1: %2").arg(node->getVisibleName()).arg(node->recursiveCount(true)).append(priceStr)); - QTextTableFormat tableFormat; - tableFormat.setCellPadding(10); - tableFormat.setCellSpacing(0); - tableFormat.setBorder(0); - QVector constraints; - for (int i = 0; i < totalColumns; i++) - constraints << QTextLength(QTextLength::PercentageLength, 100.0 / totalColumns); - tableFormat.setColumnWidthConstraints(constraints); + QTextTableFormat tableFormat; + tableFormat.setCellPadding(10); + tableFormat.setCellSpacing(0); + tableFormat.setBorder(0); + QVector constraints; + for (int i = 0; i < totalColumns; i++) + constraints << QTextLength(QTextLength::PercentageLength, 100.0 / totalColumns); + tableFormat.setColumnWidthConstraints(constraints); - QTextTable *table = cursor->insertTable(1, totalColumns, tableFormat); - for (int i = 0; i < node->size(); i++) { - QTextCursor cellCursor = table->cellAt(0, (i * totalColumns) / node->size()).lastCursorPosition(); - printDeckListNode(&cellCursor, dynamic_cast(node->at(i))); - } - } - cursor->movePosition(QTextCursor::End); + QTextTable *table = cursor->insertTable(1, totalColumns, tableFormat); + for (int i = 0; i < node->size(); i++) { + QTextCursor cellCursor = table->cellAt(0, (i * totalColumns) / node->size()).lastCursorPosition(); + printDeckListNode(&cellCursor, dynamic_cast(node->at(i))); + } + } + cursor->movePosition(QTextCursor::End); } void DeckListModel::printDeckList(QPrinter *printer) { - QTextDocument doc; + QTextDocument doc; - QFont font("Serif"); - font.setStyleHint(QFont::Serif); - doc.setDefaultFont(font); + QFont font("Serif"); + font.setStyleHint(QFont::Serif); + doc.setDefaultFont(font); - QTextCursor cursor(&doc); + QTextCursor cursor(&doc); - QTextBlockFormat headerBlockFormat; - QTextCharFormat headerCharFormat; - headerCharFormat.setFontPointSize(16); - headerCharFormat.setFontWeight(QFont::Bold); + QTextBlockFormat headerBlockFormat; + QTextCharFormat headerCharFormat; + headerCharFormat.setFontPointSize(16); + headerCharFormat.setFontWeight(QFont::Bold); - cursor.insertBlock(headerBlockFormat, headerCharFormat); - cursor.insertText(deckList->getName()); + cursor.insertBlock(headerBlockFormat, headerCharFormat); + cursor.insertText(deckList->getName()); - headerCharFormat.setFontPointSize(12); - cursor.insertBlock(headerBlockFormat, headerCharFormat); - cursor.insertText(deckList->getComments()); - cursor.insertBlock(headerBlockFormat, headerCharFormat); + headerCharFormat.setFontPointSize(12); + cursor.insertBlock(headerBlockFormat, headerCharFormat); + cursor.insertText(deckList->getComments()); + cursor.insertBlock(headerBlockFormat, headerCharFormat); - for (int i = 0; i < root->size(); i++) { - cursor.insertHtml("
"); - //cursor.insertHtml("
"); - cursor.insertBlock(headerBlockFormat, headerCharFormat); + for (int i = 0; i < root->size(); i++) { + cursor.insertHtml("
"); + //cursor.insertHtml("
"); + cursor.insertBlock(headerBlockFormat, headerCharFormat); - printDeckListNode(&cursor, dynamic_cast(root->at(i))); - } + printDeckListNode(&cursor, dynamic_cast(root->at(i))); + } - doc.print(printer); + doc.print(printer); } void DeckListModel::pricesUpdated(InnerDecklistNode *node) { - if (!node) - node = root; - - if (node->isEmpty()) - return; - - emit dataChanged(createIndex(0, 2, node->at(0)), createIndex(node->size() - 1, 2, node->last())); + if (!node) + node = root; + + if (node->isEmpty()) + return; + + emit dataChanged(createIndex(0, 2, node->at(0)), createIndex(node->size() - 1, 2, node->last())); } diff --git a/cockatrice/src/decklistmodel.h b/cockatrice/src/decklistmodel.h index 43c8e2a3..3ef47642 100644 --- a/cockatrice/src/decklistmodel.h +++ b/cockatrice/src/decklistmodel.h @@ -13,63 +13,63 @@ class QTextCursor; class DecklistModelCardNode : public AbstractDecklistCardNode { private: - DecklistCardNode *dataNode; + DecklistCardNode *dataNode; public: - DecklistModelCardNode(DecklistCardNode *_dataNode, InnerDecklistNode *_parent) : AbstractDecklistCardNode(_parent), dataNode(_dataNode) { } - int getNumber() const { return dataNode->getNumber(); } - void setNumber(int _number) { dataNode->setNumber(_number); } + DecklistModelCardNode(DecklistCardNode *_dataNode, InnerDecklistNode *_parent) : AbstractDecklistCardNode(_parent), dataNode(_dataNode) { } + int getNumber() const { return dataNode->getNumber(); } + void setNumber(int _number) { dataNode->setNumber(_number); } float getPrice() const { return dataNode->getPrice(); } void setPrice(float _price) { dataNode->setPrice(_price); } - QString getName() const { return dataNode->getName(); } - void setName(const QString &_name) { dataNode->setName(_name); } - DecklistCardNode *getDataNode() const { return dataNode; } + QString getName() const { return dataNode->getName(); } + void setName(const QString &_name) { dataNode->setName(_name); } + DecklistCardNode *getDataNode() const { return dataNode; } }; class DeckListModel : public QAbstractItemModel { - Q_OBJECT + Q_OBJECT private slots: - void rebuildTree(); + void rebuildTree(); public slots: - void printDeckList(QPrinter *printer); + void printDeckList(QPrinter *printer); signals: - void deckHashChanged(); + void deckHashChanged(); public: - DeckListModel(QObject *parent = 0); - ~DeckListModel(); - int rowCount(const QModelIndex &parent = QModelIndex()) const; + DeckListModel(QObject *parent = 0); + ~DeckListModel(); + int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role) const; - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; - QModelIndex parent(const QModelIndex &index) const; - Qt::ItemFlags flags(const QModelIndex &index) const; - bool setData(const QModelIndex &index, const QVariant &value, int role); - bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); + QVariant data(const QModelIndex &index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + bool setData(const QModelIndex &index, const QVariant &value, int role); + bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); - QModelIndex findCard(const QString &cardName, const QString &zoneName) const; - QModelIndex addCard(const QString &cardName, const QString &zoneName); - void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); - void cleanList(); - DeckLoader *getDeckList() const { return deckList; } - void setDeckList(DeckLoader *_deck); - void pricesUpdated(InnerDecklistNode *node = 0); + QModelIndex findCard(const QString &cardName, const QString &zoneName) const; + QModelIndex addCard(const QString &cardName, const QString &zoneName); + void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); + void cleanList(); + DeckLoader *getDeckList() const { return deckList; } + void setDeckList(DeckLoader *_deck); + void pricesUpdated(InnerDecklistNode *node = 0); private: - DeckLoader *deckList; - InnerDecklistNode *root; - InnerDecklistNode *createNodeIfNeeded(const QString &name, InnerDecklistNode *parent); - QModelIndex nodeToIndex(AbstractDecklistNode *node) const; - DecklistModelCardNode *findCardNode(const QString &cardName, const QString &zoneName) const; - void emitRecursiveUpdates(const QModelIndex &index); - void sortHelper(InnerDecklistNode *node, Qt::SortOrder order); + DeckLoader *deckList; + InnerDecklistNode *root; + InnerDecklistNode *createNodeIfNeeded(const QString &name, InnerDecklistNode *parent); + QModelIndex nodeToIndex(AbstractDecklistNode *node) const; + DecklistModelCardNode *findCardNode(const QString &cardName, const QString &zoneName) const; + void emitRecursiveUpdates(const QModelIndex &index); + void sortHelper(InnerDecklistNode *node, Qt::SortOrder order); - void printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node); + void printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node); - template T getNode(const QModelIndex &index) const - { - if (!index.isValid()) - return dynamic_cast(root); - return dynamic_cast(static_cast(index.internalPointer())); - } + template T getNode(const QModelIndex &index) const + { + if (!index.isValid()) + return dynamic_cast(root); + return dynamic_cast(static_cast(index.internalPointer())); + } }; #endif diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 75d6312b..ee5c240c 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -39,665 +39,665 @@ void SearchLineEdit::keyPressEvent(QKeyEvent *event) { - if (treeView && ((event->key() == Qt::Key_Up) || (event->key() == Qt::Key_Down))) - QCoreApplication::sendEvent(treeView, event); - QLineEdit::keyPressEvent(event); + if (treeView && ((event->key() == Qt::Key_Up) || (event->key() == Qt::Key_Down))) + QCoreApplication::sendEvent(treeView, event); + QLineEdit::keyPressEvent(event); } TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) - : Tab(_tabSupervisor, parent), modified(false) + : Tab(_tabSupervisor, parent), modified(false) { - aClearSearch = new QAction(QString(), this); - aClearSearch->setIcon(QIcon(":/resources/icon_clearsearch.svg")); - connect(aClearSearch, SIGNAL(triggered()), this, SLOT(actClearSearch())); + aClearSearch = new QAction(QString(), this); + aClearSearch->setIcon(QIcon(":/resources/icon_clearsearch.svg")); + connect(aClearSearch, SIGNAL(triggered()), this, SLOT(actClearSearch())); - searchLabel = new QLabel(); - searchEdit = new SearchLineEdit; - searchLabel->setBuddy(searchEdit); - searchKeySignals.filterDelete(false); - searchEdit->installEventFilter(&searchKeySignals); - connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); - connect(&searchKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); - connect(&searchKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); - connect(&searchKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); - connect(&searchKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); - connect(&searchKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); - connect(&searchKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); + searchLabel = new QLabel(); + searchEdit = new SearchLineEdit; + searchLabel->setBuddy(searchEdit); + searchKeySignals.filterDelete(false); + searchEdit->installEventFilter(&searchKeySignals); + connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); + connect(&searchKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); + connect(&searchKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); + connect(&searchKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); - QToolBar *deckEditToolBar = new QToolBar; - deckEditToolBar->setOrientation(Qt::Horizontal); - deckEditToolBar->setIconSize(QSize(24, 24)); + QToolBar *deckEditToolBar = new QToolBar; + deckEditToolBar->setOrientation(Qt::Horizontal); + deckEditToolBar->setIconSize(QSize(24, 24)); - QHBoxLayout *searchLayout = new QHBoxLayout; - searchLayout->addWidget(deckEditToolBar); - searchLayout->addWidget(searchLabel); - searchLayout->addWidget(searchEdit); + QHBoxLayout *searchLayout = new QHBoxLayout; + searchLayout->addWidget(deckEditToolBar); + searchLayout->addWidget(searchLabel); + searchLayout->addWidget(searchEdit); - databaseModel = new CardDatabaseModel(db, this); - databaseDisplayModel = new CardDatabaseDisplayModel(this); - databaseDisplayModel->setSourceModel(databaseModel); - databaseDisplayModel->setFilterKeyColumn(0); - databaseDisplayModel->sort(0, Qt::AscendingOrder); + databaseModel = new CardDatabaseModel(db, this); + databaseDisplayModel = new CardDatabaseDisplayModel(this); + databaseDisplayModel->setSourceModel(databaseModel); + databaseDisplayModel->setFilterKeyColumn(0); + databaseDisplayModel->sort(0, Qt::AscendingOrder); - databaseView = new QTreeView(); - databaseView->setModel(databaseDisplayModel); - databaseView->setUniformRowHeights(true); - databaseView->setRootIsDecorated(false); - databaseView->setAlternatingRowColors(true); - databaseView->setSortingEnabled(true); - databaseView->sortByColumn(0, Qt::AscendingOrder); - databaseView->resizeColumnToContents(0); - connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &))); - connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); - databaseView->installEventFilter(&dbViewKeySignals); - connect(&dbViewKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); - connect(&dbViewKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); - connect(&dbViewKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); - connect(&dbViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); - connect(&dbViewKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); - connect(&dbViewKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); + databaseView = new QTreeView(); + databaseView->setModel(databaseDisplayModel); + databaseView->setUniformRowHeights(true); + databaseView->setRootIsDecorated(false); + databaseView->setAlternatingRowColors(true); + databaseView->setSortingEnabled(true); + databaseView->sortByColumn(0, Qt::AscendingOrder); + databaseView->resizeColumnToContents(0); + connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &))); + connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); + databaseView->installEventFilter(&dbViewKeySignals); + connect(&dbViewKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); + connect(&dbViewKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); + connect(&dbViewKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); + connect(&dbViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); + connect(&dbViewKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); + connect(&dbViewKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); - searchEdit->setTreeView(databaseView); + searchEdit->setTreeView(databaseView); - QVBoxLayout *leftFrame = new QVBoxLayout; - leftFrame->addLayout(searchLayout); - leftFrame->addWidget(databaseView); + QVBoxLayout *leftFrame = new QVBoxLayout; + leftFrame->addLayout(searchLayout); + leftFrame->addWidget(databaseView); - cardInfo = new CardFrame(250, 356); - aCardTextOnly = new QAction(QString(), this); - aCardTextOnly->setCheckable(true); - connect(aCardTextOnly, SIGNAL(triggered()), cardInfo, SLOT(toggleCardTextOnly())); + cardInfo = new CardFrame(250, 356); + aCardTextOnly = new QAction(QString(), this); + aCardTextOnly->setCheckable(true); + connect(aCardTextOnly, SIGNAL(triggered()), cardInfo, SLOT(toggleCardTextOnly())); - filterModel = new FilterTreeModel(); - databaseDisplayModel->setFilterTree(filterModel->filterTree()); - filterView = new QTreeView; - filterView->setModel(filterModel); - filterView->setMaximumWidth(250); - filterView->setUniformRowHeights(true); - filterView->setHeaderHidden(true); - filterView->setContextMenuPolicy(Qt::CustomContextMenu); - connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); - connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)), - this, SLOT(filterViewCustomContextMenu(const QPoint &))); - FilterBuilder *filterBuilder = new FilterBuilder; - filterBuilder->setMaximumWidth(250); - connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); + filterModel = new FilterTreeModel(); + databaseDisplayModel->setFilterTree(filterModel->filterTree()); + filterView = new QTreeView; + filterView->setModel(filterModel); + filterView->setMaximumWidth(250); + filterView->setUniformRowHeights(true); + filterView->setHeaderHidden(true); + filterView->setContextMenuPolicy(Qt::CustomContextMenu); + connect(filterModel, SIGNAL(layoutChanged()), filterView, SLOT(expandAll())); + connect(filterView, SIGNAL(customContextMenuRequested(const QPoint &)), + this, SLOT(filterViewCustomContextMenu(const QPoint &))); + FilterBuilder *filterBuilder = new FilterBuilder; + filterBuilder->setMaximumWidth(250); + connect(filterBuilder, SIGNAL(add(const CardFilter *)), filterModel, SLOT(addFilter(const CardFilter *))); - QVBoxLayout *filter = new QVBoxLayout; - filter->addWidget(filterBuilder, 0, Qt::AlignTop); - filter->addWidget(filterView, 10); + QVBoxLayout *filter = new QVBoxLayout; + filter->addWidget(filterBuilder, 0, Qt::AlignTop); + filter->addWidget(filterView, 10); - QVBoxLayout *middleFrame = new QVBoxLayout; - middleFrame->addWidget(cardInfo, 0, Qt::AlignTop); - middleFrame->addLayout(filter, 10); + QVBoxLayout *middleFrame = new QVBoxLayout; + middleFrame->addWidget(cardInfo, 0, Qt::AlignTop); + middleFrame->addLayout(filter, 10); - deckModel = new DeckListModel(this); - connect(deckModel, SIGNAL(deckHashChanged()), this, SLOT(updateHash())); - deckView = new QTreeView(); - deckView->setModel(deckModel); - deckView->setUniformRowHeights(true); - deckView->header()->setResizeMode(QHeaderView::ResizeToContents); - deckViewKeySignals.filterLeftRight(false); - deckView->installEventFilter(&deckViewKeySignals); - connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); - connect(&deckViewKeySignals, SIGNAL(onEnter()), this, SLOT(actIncrement())); - connect(&deckViewKeySignals, SIGNAL(onRight()), this, SLOT(actIncrement())); - connect(&deckViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrement())); - connect(&deckViewKeySignals, SIGNAL(onDelete()), this, SLOT(actRemoveCard())); + deckModel = new DeckListModel(this); + connect(deckModel, SIGNAL(deckHashChanged()), this, SLOT(updateHash())); + deckView = new QTreeView(); + deckView->setModel(deckModel); + deckView->setUniformRowHeights(true); + deckView->header()->setResizeMode(QHeaderView::ResizeToContents); + deckViewKeySignals.filterLeftRight(false); + deckView->installEventFilter(&deckViewKeySignals); + connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); + connect(&deckViewKeySignals, SIGNAL(onEnter()), this, SLOT(actIncrement())); + connect(&deckViewKeySignals, SIGNAL(onRight()), this, SLOT(actIncrement())); + connect(&deckViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrement())); + connect(&deckViewKeySignals, SIGNAL(onDelete()), this, SLOT(actRemoveCard())); - nameLabel = new QLabel(); - nameEdit = new QLineEdit; - nameLabel->setBuddy(nameEdit); - connect(nameEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateName(const QString &))); - commentsLabel = new QLabel(); - commentsEdit = new QTextEdit; - commentsEdit->setMaximumHeight(70); - commentsLabel->setBuddy(commentsEdit); - connect(commentsEdit, SIGNAL(textChanged()), this, SLOT(updateComments())); - hashLabel1 = new QLabel(); - hashLabel = new QLabel; + nameLabel = new QLabel(); + nameEdit = new QLineEdit; + nameLabel->setBuddy(nameEdit); + connect(nameEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateName(const QString &))); + commentsLabel = new QLabel(); + commentsEdit = new QTextEdit; + commentsEdit->setMaximumHeight(70); + commentsLabel->setBuddy(commentsEdit); + connect(commentsEdit, SIGNAL(textChanged()), this, SLOT(updateComments())); + hashLabel1 = new QLabel(); + hashLabel = new QLabel; - QGridLayout *grid = new QGridLayout; - grid->addWidget(nameLabel, 0, 0); - grid->addWidget(nameEdit, 0, 1); + QGridLayout *grid = new QGridLayout; + grid->addWidget(nameLabel, 0, 0); + grid->addWidget(nameEdit, 0, 1); - grid->addWidget(commentsLabel, 1, 0); - grid->addWidget(commentsEdit, 1, 1); + grid->addWidget(commentsLabel, 1, 0); + grid->addWidget(commentsEdit, 1, 1); - grid->addWidget(hashLabel1, 2, 0); - grid->addWidget(hashLabel, 2, 1); + grid->addWidget(hashLabel1, 2, 0); + grid->addWidget(hashLabel, 2, 1); - // Update price - aUpdatePrices = new QAction(QString(), this); - aUpdatePrices->setIcon(QIcon(":/resources/icon_update.png")); - connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices())); - if (!settingsCache->getPriceTagFeature()) - aUpdatePrices->setVisible(false); + // Update price + aUpdatePrices = new QAction(QString(), this); + aUpdatePrices->setIcon(QIcon(":/resources/icon_update.png")); + connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices())); + if (!settingsCache->getPriceTagFeature()) + aUpdatePrices->setVisible(false); - QToolBar *deckToolBar = new QToolBar; - deckToolBar->setOrientation(Qt::Vertical); - deckToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - deckToolBar->setIconSize(QSize(24, 24)); - deckToolBar->addAction(aUpdatePrices); - QHBoxLayout *deckToolbarLayout = new QHBoxLayout; - deckToolbarLayout->addStretch(); - deckToolbarLayout->addWidget(deckToolBar); - deckToolbarLayout->addStretch(); - - QVBoxLayout *rightFrame = new QVBoxLayout; - rightFrame->addLayout(grid); - rightFrame->addWidget(deckView, 10); - rightFrame->addLayout(deckToolbarLayout); + QToolBar *deckToolBar = new QToolBar; + deckToolBar->setOrientation(Qt::Vertical); + deckToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + deckToolBar->setIconSize(QSize(24, 24)); + deckToolBar->addAction(aUpdatePrices); + QHBoxLayout *deckToolbarLayout = new QHBoxLayout; + deckToolbarLayout->addStretch(); + deckToolbarLayout->addWidget(deckToolBar); + deckToolbarLayout->addStretch(); + + QVBoxLayout *rightFrame = new QVBoxLayout; + rightFrame->addLayout(grid); + rightFrame->addWidget(deckView, 10); + rightFrame->addLayout(deckToolbarLayout); - QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addLayout(leftFrame, 10); - mainLayout->addLayout(middleFrame); - mainLayout->addLayout(rightFrame); - setLayout(mainLayout); - - aNewDeck = new QAction(QString(), this); - aNewDeck->setShortcuts(QKeySequence::New); - connect(aNewDeck, SIGNAL(triggered()), this, SLOT(actNewDeck())); - aLoadDeck = new QAction(QString(), this); - aLoadDeck->setShortcuts(QKeySequence::Open); - connect(aLoadDeck, SIGNAL(triggered()), this, SLOT(actLoadDeck())); - aSaveDeck = new QAction(QString(), this); - aSaveDeck->setShortcuts(QKeySequence::Save); - connect(aSaveDeck, SIGNAL(triggered()), this, SLOT(actSaveDeck())); - aSaveDeckAs = new QAction(QString(), this); -// aSaveDeckAs->setShortcuts(QKeySequence::SaveAs); - connect(aSaveDeckAs, SIGNAL(triggered()), this, SLOT(actSaveDeckAs())); - aLoadDeckFromClipboard = new QAction(QString(), this); - connect(aLoadDeckFromClipboard, SIGNAL(triggered()), this, SLOT(actLoadDeckFromClipboard())); - aLoadDeckFromClipboard->setShortcuts(QKeySequence::Paste); - aSaveDeckToClipboard = new QAction(QString(), this); - connect(aSaveDeckToClipboard, SIGNAL(triggered()), this, SLOT(actSaveDeckToClipboard())); - aSaveDeckToClipboard->setShortcuts(QKeySequence::Copy); - aPrintDeck = new QAction(QString(), this); - aPrintDeck->setShortcuts(QKeySequence::Print); - connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck())); - aAnalyzeDeck = new QAction(QString(), this); - connect(aAnalyzeDeck, SIGNAL(triggered()), this, SLOT(actAnalyzeDeck())); - aClose = new QAction(QString(), this); - connect(aClose, SIGNAL(triggered()), this, SLOT(closeRequest())); + QHBoxLayout *mainLayout = new QHBoxLayout; + mainLayout->addLayout(leftFrame, 10); + mainLayout->addLayout(middleFrame); + mainLayout->addLayout(rightFrame); + setLayout(mainLayout); + + aNewDeck = new QAction(QString(), this); + aNewDeck->setShortcuts(QKeySequence::New); + connect(aNewDeck, SIGNAL(triggered()), this, SLOT(actNewDeck())); + aLoadDeck = new QAction(QString(), this); + aLoadDeck->setShortcuts(QKeySequence::Open); + connect(aLoadDeck, SIGNAL(triggered()), this, SLOT(actLoadDeck())); + aSaveDeck = new QAction(QString(), this); + aSaveDeck->setShortcuts(QKeySequence::Save); + connect(aSaveDeck, SIGNAL(triggered()), this, SLOT(actSaveDeck())); + aSaveDeckAs = new QAction(QString(), this); +// aSaveDeckAs->setShortcuts(QKeySequence::SaveAs); + connect(aSaveDeckAs, SIGNAL(triggered()), this, SLOT(actSaveDeckAs())); + aLoadDeckFromClipboard = new QAction(QString(), this); + connect(aLoadDeckFromClipboard, SIGNAL(triggered()), this, SLOT(actLoadDeckFromClipboard())); + aLoadDeckFromClipboard->setShortcuts(QKeySequence::Paste); + aSaveDeckToClipboard = new QAction(QString(), this); + connect(aSaveDeckToClipboard, SIGNAL(triggered()), this, SLOT(actSaveDeckToClipboard())); + aSaveDeckToClipboard->setShortcuts(QKeySequence::Copy); + aPrintDeck = new QAction(QString(), this); + aPrintDeck->setShortcuts(QKeySequence::Print); + connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck())); + aAnalyzeDeck = new QAction(QString(), this); + connect(aAnalyzeDeck, SIGNAL(triggered()), this, SLOT(actAnalyzeDeck())); + aClose = new QAction(QString(), this); + connect(aClose, SIGNAL(triggered()), this, SLOT(closeRequest())); - aEditSets = new QAction(QString(), this); - connect(aEditSets, SIGNAL(triggered()), this, SLOT(actEditSets())); - aEditTokens = new QAction(QString(), this); - connect(aEditTokens, SIGNAL(triggered()), this, SLOT(actEditTokens())); + aEditSets = new QAction(QString(), this); + connect(aEditSets, SIGNAL(triggered()), this, SLOT(actEditSets())); + aEditTokens = new QAction(QString(), this); + connect(aEditTokens, SIGNAL(triggered()), this, SLOT(actEditTokens())); - deckMenu = new QMenu(this); - deckMenu->addAction(aNewDeck); - deckMenu->addAction(aLoadDeck); - deckMenu->addAction(aSaveDeck); - deckMenu->addAction(aSaveDeckAs); - deckMenu->addSeparator(); - deckMenu->addAction(aLoadDeckFromClipboard); - deckMenu->addAction(aSaveDeckToClipboard); - deckMenu->addSeparator(); - deckMenu->addAction(aPrintDeck); - deckMenu->addSeparator(); - deckMenu->addAction(aAnalyzeDeck); - deckMenu->addSeparator(); - deckMenu->addAction(aClose); - addTabMenu(deckMenu); + deckMenu = new QMenu(this); + deckMenu->addAction(aNewDeck); + deckMenu->addAction(aLoadDeck); + deckMenu->addAction(aSaveDeck); + deckMenu->addAction(aSaveDeckAs); + deckMenu->addSeparator(); + deckMenu->addAction(aLoadDeckFromClipboard); + deckMenu->addAction(aSaveDeckToClipboard); + deckMenu->addSeparator(); + deckMenu->addAction(aPrintDeck); + deckMenu->addSeparator(); + deckMenu->addAction(aAnalyzeDeck); + deckMenu->addSeparator(); + deckMenu->addAction(aClose); + addTabMenu(deckMenu); - dbMenu = new QMenu(this); - dbMenu->addAction(aEditSets); - dbMenu->addAction(aEditTokens); - dbMenu->addSeparator(); - dbMenu->addAction(aClearSearch); - dbMenu->addAction(aCardTextOnly); - addTabMenu(dbMenu); + dbMenu = new QMenu(this); + dbMenu->addAction(aEditSets); + dbMenu->addAction(aEditTokens); + dbMenu->addSeparator(); + dbMenu->addAction(aClearSearch); + dbMenu->addAction(aCardTextOnly); + addTabMenu(dbMenu); - aAddCard = new QAction(QString(), this); - aAddCard->setIcon(QIcon(":/resources/arrow_right_green.svg")); - connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard())); - aAddCardToSideboard = new QAction(QString(), this); - aAddCardToSideboard->setIcon(QIcon(":/resources/add_to_sideboard.svg")); - connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard())); - aRemoveCard = new QAction(QString(), this); - aRemoveCard->setIcon(QIcon(":/resources/remove_row.svg")); - connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard())); - aIncrement = new QAction(QString(), this); - aIncrement->setIcon(QIcon(":/resources/increment.svg")); - connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement())); - aDecrement = new QAction(QString(), this); - aDecrement->setIcon(QIcon(":/resources/decrement.svg")); - connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); + aAddCard = new QAction(QString(), this); + aAddCard->setIcon(QIcon(":/resources/arrow_right_green.svg")); + connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard())); + aAddCardToSideboard = new QAction(QString(), this); + aAddCardToSideboard->setIcon(QIcon(":/resources/add_to_sideboard.svg")); + connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard())); + aRemoveCard = new QAction(QString(), this); + aRemoveCard->setIcon(QIcon(":/resources/remove_row.svg")); + connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard())); + aIncrement = new QAction(QString(), this); + aIncrement->setIcon(QIcon(":/resources/increment.svg")); + connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement())); + aDecrement = new QAction(QString(), this); + aDecrement->setIcon(QIcon(":/resources/decrement.svg")); + connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); - deckEditToolBar->addAction(aAddCard); - deckEditToolBar->addAction(aAddCardToSideboard); - deckEditToolBar->addAction(aRemoveCard); - deckEditToolBar->addAction(aIncrement); - deckEditToolBar->addAction(aDecrement); - deckEditToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - - retranslateUi(); - - resize(950, 700); + deckEditToolBar->addAction(aAddCard); + deckEditToolBar->addAction(aAddCardToSideboard); + deckEditToolBar->addAction(aRemoveCard); + deckEditToolBar->addAction(aIncrement); + deckEditToolBar->addAction(aDecrement); + deckEditToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + + retranslateUi(); + + resize(950, 700); } TabDeckEditor::~TabDeckEditor() { - emit deckEditorClosing(this); + emit deckEditorClosing(this); } void TabDeckEditor::retranslateUi() { - aCardTextOnly->setText(tr("Show card text only")); - aClearSearch->setText(tr("&Clear search")); - searchLabel->setText(tr("&Search for:")); - - nameLabel->setText(tr("Deck &name:")); - commentsLabel->setText(tr("&Comments:")); - hashLabel1->setText(tr("Hash:")); - - aUpdatePrices->setText(tr("&Update prices")); - aUpdatePrices->setShortcut(tr("Ctrl+U")); + aCardTextOnly->setText(tr("Show card text only")); + aClearSearch->setText(tr("&Clear search")); + searchLabel->setText(tr("&Search for:")); + + nameLabel->setText(tr("Deck &name:")); + commentsLabel->setText(tr("&Comments:")); + hashLabel1->setText(tr("Hash:")); + + aUpdatePrices->setText(tr("&Update prices")); + aUpdatePrices->setShortcut(tr("Ctrl+U")); - aNewDeck->setText(tr("&New deck")); - aLoadDeck->setText(tr("&Load deck...")); - aSaveDeck->setText(tr("&Save deck")); - aSaveDeckAs->setText(tr("Save deck &as...")); - aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard...")); - aSaveDeckToClipboard->setText(tr("Save deck to clip&board")); - aPrintDeck->setText(tr("&Print deck...")); - aAnalyzeDeck->setText(tr("&Analyze deck on deckstats.net")); - aClose->setText(tr("&Close")); - aClose->setShortcut(tr("Ctrl+Q")); - - aAddCard->setText(tr("Add card to &maindeck")); - aAddCardToSideboard->setText(tr("Add card to &sideboard")); + aNewDeck->setText(tr("&New deck")); + aLoadDeck->setText(tr("&Load deck...")); + aSaveDeck->setText(tr("&Save deck")); + aSaveDeckAs->setText(tr("Save deck &as...")); + aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard...")); + aSaveDeckToClipboard->setText(tr("Save deck to clip&board")); + aPrintDeck->setText(tr("&Print deck...")); + aAnalyzeDeck->setText(tr("&Analyze deck on deckstats.net")); + aClose->setText(tr("&Close")); + aClose->setShortcut(tr("Ctrl+Q")); + + aAddCard->setText(tr("Add card to &maindeck")); + aAddCardToSideboard->setText(tr("Add card to &sideboard")); - aRemoveCard->setText(tr("&Remove row")); - aRemoveCard->setShortcut(tr("Del")); - aIncrement->setText(tr("&Increment number")); - aIncrement->setShortcut(tr("+")); - aDecrement->setText(tr("&Decrement number")); - aDecrement->setShortcut(tr("-")); - - deckMenu->setTitle(tr("&Deck editor")); - dbMenu->setTitle(tr("C&ard database")); - - aEditSets->setText(tr("&Edit sets...")); - aEditTokens->setText(tr("Edit &tokens...")); + aRemoveCard->setText(tr("&Remove row")); + aRemoveCard->setShortcut(tr("Del")); + aIncrement->setText(tr("&Increment number")); + aIncrement->setShortcut(tr("+")); + aDecrement->setText(tr("&Decrement number")); + aDecrement->setShortcut(tr("-")); + + deckMenu->setTitle(tr("&Deck editor")); + dbMenu->setTitle(tr("C&ard database")); + + aEditSets->setText(tr("&Edit sets...")); + aEditTokens->setText(tr("Edit &tokens...")); } QString TabDeckEditor::getTabText() const { - QString result = tr("Deck: %1").arg(nameEdit->text()); - if (modified) - result.prepend("* "); - return result; + QString result = tr("Deck: %1").arg(nameEdit->text()); + if (modified) + result.prepend("* "); + return result; } void TabDeckEditor::updateName(const QString &name) { - deckModel->getDeckList()->setName(name); - setModified(true); + deckModel->getDeckList()->setName(name); + setModified(true); } void TabDeckEditor::updateComments() { - deckModel->getDeckList()->setComments(commentsEdit->toPlainText()); - setModified(true); + deckModel->getDeckList()->setComments(commentsEdit->toPlainText()); + setModified(true); } void TabDeckEditor::updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &/*previous*/) { - cardInfo->setCard(current.sibling(current.row(), 0).data().toString()); + cardInfo->setCard(current.sibling(current.row(), 0).data().toString()); } void TabDeckEditor::updateCardInfoRight(const QModelIndex ¤t, const QModelIndex &/*previous*/) { - if (!current.isValid()) - return; - if (!current.model()->hasChildren(current.sibling(current.row(), 0))) - cardInfo->setCard(current.sibling(current.row(), 1).data().toString()); + if (!current.isValid()) + return; + if (!current.model()->hasChildren(current.sibling(current.row(), 0))) + cardInfo->setCard(current.sibling(current.row(), 1).data().toString()); } void TabDeckEditor::updateSearch(const QString &search) { - databaseDisplayModel->setCardNameBeginning(search); - QModelIndexList sel = databaseView->selectionModel()->selectedRows(); - if (sel.isEmpty() && databaseDisplayModel->rowCount()) - databaseView->selectionModel()->setCurrentIndex(databaseDisplayModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); + databaseDisplayModel->setCardNameBeginning(search); + QModelIndexList sel = databaseView->selectionModel()->selectedRows(); + if (sel.isEmpty() && databaseDisplayModel->rowCount()) + databaseView->selectionModel()->setCurrentIndex(databaseDisplayModel->index(0, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } void TabDeckEditor::updateHash() { - hashLabel->setText(deckModel->getDeckList()->getDeckHash()); + hashLabel->setText(deckModel->getDeckList()->getDeckHash()); } bool TabDeckEditor::confirmClose() { - if (modified) { - QMessageBox::StandardButton ret = QMessageBox::warning(this, tr("Are you sure?"), - tr("The decklist has been modified.\nDo you want to save the changes?"), - QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); - if (ret == QMessageBox::Save) - return actSaveDeck(); - else if (ret == QMessageBox::Cancel) - return false; - } - return true; + if (modified) { + QMessageBox::StandardButton ret = QMessageBox::warning(this, tr("Are you sure?"), + tr("The decklist has been modified.\nDo you want to save the changes?"), + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); + if (ret == QMessageBox::Save) + return actSaveDeck(); + else if (ret == QMessageBox::Cancel) + return false; + } + return true; } void TabDeckEditor::closeRequest() { - if (confirmClose()) - deleteLater(); + if (confirmClose()) + deleteLater(); } void TabDeckEditor::actNewDeck() { - if (!confirmClose()) - return; + if (!confirmClose()) + return; - deckModel->cleanList(); - nameEdit->setText(QString()); - commentsEdit->setText(QString()); - hashLabel->setText(QString()); - setModified(false); + deckModel->cleanList(); + nameEdit->setText(QString()); + commentsEdit->setText(QString()); + hashLabel->setText(QString()); + setModified(false); } void TabDeckEditor::actLoadDeck() { - if (!confirmClose()) - return; + if (!confirmClose()) + return; - QFileDialog dialog(this, tr("Load deck")); - dialog.setDirectory(settingsCache->getDeckPath()); - dialog.setNameFilters(DeckLoader::fileNameFilters); - if (!dialog.exec()) - return; + QFileDialog dialog(this, tr("Load deck")); + dialog.setDirectory(settingsCache->getDeckPath()); + dialog.setNameFilters(DeckLoader::fileNameFilters); + if (!dialog.exec()) + return; - QString fileName = dialog.selectedFiles().at(0); - DeckLoader::FileFormat fmt = DeckLoader::getFormatFromNameFilter(dialog.selectedNameFilter()); - - DeckLoader *l = new DeckLoader; - if (l->loadFromFile(fileName, fmt)) - setDeck(l); - else - delete l; + QString fileName = dialog.selectedFiles().at(0); + DeckLoader::FileFormat fmt = DeckLoader::getFormatFromNameFilter(dialog.selectedNameFilter()); + + DeckLoader *l = new DeckLoader; + if (l->loadFromFile(fileName, fmt)) + setDeck(l); + else + delete l; } void TabDeckEditor::saveDeckRemoteFinished(const Response &response) { - if (response.response_code() != Response::RespOk) - QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.")); - else - setModified(false); + if (response.response_code() != Response::RespOk) + QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.")); + else + setModified(false); } bool TabDeckEditor::actSaveDeck() { - DeckLoader *const deck = deckModel->getDeckList(); - if (deck->getLastRemoteDeckId() != -1) { - Command_DeckUpload cmd; - cmd.set_deck_id(deck->getLastRemoteDeckId()); - cmd.set_deck_list(deck->writeToString_Native().toStdString()); - - PendingCommand *pend = AbstractClient::prepareSessionCommand(cmd); - connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this, SLOT(saveDeckRemoteFinished(Response))); - tabSupervisor->getClient()->sendCommand(pend); - - return true; - } else if (deck->getLastFileName().isEmpty()) - return actSaveDeckAs(); - else if (deck->saveToFile(deck->getLastFileName(), deck->getLastFileFormat())) { - setModified(false); - return true; - } - QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.\nPlease check that the directory is writable and try again.")); - return false; + DeckLoader *const deck = deckModel->getDeckList(); + if (deck->getLastRemoteDeckId() != -1) { + Command_DeckUpload cmd; + cmd.set_deck_id(deck->getLastRemoteDeckId()); + cmd.set_deck_list(deck->writeToString_Native().toStdString()); + + PendingCommand *pend = AbstractClient::prepareSessionCommand(cmd); + connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this, SLOT(saveDeckRemoteFinished(Response))); + tabSupervisor->getClient()->sendCommand(pend); + + return true; + } else if (deck->getLastFileName().isEmpty()) + return actSaveDeckAs(); + else if (deck->saveToFile(deck->getLastFileName(), deck->getLastFileFormat())) { + setModified(false); + return true; + } + QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.\nPlease check that the directory is writable and try again.")); + return false; } bool TabDeckEditor::actSaveDeckAs() { - QFileDialog dialog(this, tr("Save deck")); - dialog.setDirectory(settingsCache->getDeckPath()); - dialog.setAcceptMode(QFileDialog::AcceptSave); - dialog.setConfirmOverwrite(true); - dialog.setDefaultSuffix("cod"); - dialog.setNameFilters(DeckLoader::fileNameFilters); - dialog.selectFile(deckModel->getDeckList()->getName()); - if (!dialog.exec()) - return false; + QFileDialog dialog(this, tr("Save deck")); + dialog.setDirectory(settingsCache->getDeckPath()); + dialog.setAcceptMode(QFileDialog::AcceptSave); + dialog.setConfirmOverwrite(true); + dialog.setDefaultSuffix("cod"); + dialog.setNameFilters(DeckLoader::fileNameFilters); + dialog.selectFile(deckModel->getDeckList()->getName()); + if (!dialog.exec()) + return false; - QString fileName = dialog.selectedFiles().at(0); - DeckLoader::FileFormat fmt = DeckLoader::getFormatFromNameFilter(dialog.selectedNameFilter()); + QString fileName = dialog.selectedFiles().at(0); + DeckLoader::FileFormat fmt = DeckLoader::getFormatFromNameFilter(dialog.selectedNameFilter()); - if (!deckModel->getDeckList()->saveToFile(fileName, fmt)) { - QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.\nPlease check that the directory is writable and try again.")); - return false; - } - setModified(false); - return true; + if (!deckModel->getDeckList()->saveToFile(fileName, fmt)) { + QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.\nPlease check that the directory is writable and try again.")); + return false; + } + setModified(false); + return true; } void TabDeckEditor::actLoadDeckFromClipboard() { - if (!confirmClose()) - return; - - DlgLoadDeckFromClipboard dlg; - if (!dlg.exec()) - return; - - setDeck(dlg.getDeckList()); - setModified(true); + if (!confirmClose()) + return; + + DlgLoadDeckFromClipboard dlg; + if (!dlg.exec()) + return; + + setDeck(dlg.getDeckList()); + setModified(true); } void TabDeckEditor::actSaveDeckToClipboard() { - QString buffer; - QTextStream stream(&buffer); - deckModel->getDeckList()->saveToStream_Plain(stream); - QApplication::clipboard()->setText(buffer, QClipboard::Clipboard); - QApplication::clipboard()->setText(buffer, QClipboard::Selection); + QString buffer; + QTextStream stream(&buffer); + deckModel->getDeckList()->saveToStream_Plain(stream); + QApplication::clipboard()->setText(buffer, QClipboard::Clipboard); + QApplication::clipboard()->setText(buffer, QClipboard::Selection); } void TabDeckEditor::actPrintDeck() { - QPrintPreviewDialog *dlg = new QPrintPreviewDialog(this); - connect(dlg, SIGNAL(paintRequested(QPrinter *)), deckModel, SLOT(printDeckList(QPrinter *))); - dlg->exec(); + QPrintPreviewDialog *dlg = new QPrintPreviewDialog(this); + connect(dlg, SIGNAL(paintRequested(QPrinter *)), deckModel, SLOT(printDeckList(QPrinter *))); + dlg->exec(); } void TabDeckEditor::actAnalyzeDeck() { - DeckStatsInterface *interface = new DeckStatsInterface(this); // it deletes itself when done - interface->analyzeDeck(deckModel->getDeckList()); + DeckStatsInterface *interface = new DeckStatsInterface(this); // it deletes itself when done + interface->analyzeDeck(deckModel->getDeckList()); } void TabDeckEditor::actEditSets() { - WndSets *w = new WndSets; - w->setWindowModality(Qt::WindowModal); - w->show(); + WndSets *w = new WndSets; + w->setWindowModality(Qt::WindowModal); + w->show(); } void TabDeckEditor::actEditTokens() { - DlgEditTokens dlg(databaseModel); - dlg.exec(); - db->saveToFile(settingsCache->getTokenDatabasePath(), true); + DlgEditTokens dlg(databaseModel); + dlg.exec(); + db->saveToFile(settingsCache->getTokenDatabasePath(), true); } void TabDeckEditor::actClearSearch() { - databaseDisplayModel->clearSearch(); + databaseDisplayModel->clearSearch(); } void TabDeckEditor::recursiveExpand(const QModelIndex &index) { - if (index.parent().isValid()) - recursiveExpand(index.parent()); - deckView->expand(index); + if (index.parent().isValid()) + recursiveExpand(index.parent()); + deckView->expand(index); } CardInfo *TabDeckEditor::currentCardInfo() const { - const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex(); - if (!currentIndex.isValid()) - return NULL; - const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); - - return db->getCard(cardName); + const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex(); + if (!currentIndex.isValid()) + return NULL; + const QString cardName = currentIndex.sibling(currentIndex.row(), 0).data().toString(); + + return db->getCard(cardName); } void TabDeckEditor::addCardHelper(QString zoneName) { - const CardInfo *info; + const CardInfo *info; - info = currentCardInfo(); - if(!info) - return; - if (info->getIsToken()) - zoneName = "tokens"; + info = currentCardInfo(); + if(!info) + return; + if (info->getIsToken()) + zoneName = "tokens"; - QModelIndex newCardIndex = deckModel->addCard(info->getName(), zoneName); - recursiveExpand(newCardIndex); - deckView->setCurrentIndex(newCardIndex); + QModelIndex newCardIndex = deckModel->addCard(info->getName(), zoneName); + recursiveExpand(newCardIndex); + deckView->setCurrentIndex(newCardIndex); - setModified(true); + setModified(true); } void TabDeckEditor::actAddCard() { - addCardHelper("main"); + addCardHelper("main"); } void TabDeckEditor::actAddCardToSideboard() { - addCardHelper("side"); + addCardHelper("side"); } void TabDeckEditor::actRemoveCard() { - const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - if (!currentIndex.isValid() || deckModel->hasChildren(currentIndex)) - return; - deckModel->removeRow(currentIndex.row(), currentIndex.parent()); - setModified(true); + const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); + if (!currentIndex.isValid() || deckModel->hasChildren(currentIndex)) + return; + deckModel->removeRow(currentIndex.row(), currentIndex.parent()); + setModified(true); } void TabDeckEditor::offsetCountAtIndex(const QModelIndex &idx, int offset) { - if (!idx.isValid() || offset == 0) - return; + if (!idx.isValid() || offset == 0) + return; - const QModelIndex numberIndex = idx.sibling(idx.row(), 0); - const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); - const int new_count = count + offset; - deckView->setCurrentIndex(numberIndex); - if (new_count <= 0) - deckModel->removeRow(idx.row(), idx.parent()); - else - deckModel->setData(numberIndex, new_count, Qt::EditRole); - setModified(true); + const QModelIndex numberIndex = idx.sibling(idx.row(), 0); + const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); + const int new_count = count + offset; + deckView->setCurrentIndex(numberIndex); + if (new_count <= 0) + deckModel->removeRow(idx.row(), idx.parent()); + else + deckModel->setData(numberIndex, new_count, Qt::EditRole); + setModified(true); } void TabDeckEditor::decrementCardHelper(QString zoneName) { - const CardInfo *info; - QModelIndex idx; + const CardInfo *info; + QModelIndex idx; - info = currentCardInfo(); - if(!info) - return; - if (info->getIsToken()) - zoneName = "tokens"; + info = currentCardInfo(); + if(!info) + return; + if (info->getIsToken()) + zoneName = "tokens"; - idx = deckModel->findCard(info->getName(), zoneName); - offsetCountAtIndex(idx, -1); + idx = deckModel->findCard(info->getName(), zoneName); + offsetCountAtIndex(idx, -1); } void TabDeckEditor::actDecrementCard() { - decrementCardHelper("main"); + decrementCardHelper("main"); } void TabDeckEditor::actDecrementCardFromSideboard() { - decrementCardHelper("side"); + decrementCardHelper("side"); } void TabDeckEditor::actIncrement() { - const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - offsetCountAtIndex(currentIndex, 1); + const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); + offsetCountAtIndex(currentIndex, 1); } void TabDeckEditor::actDecrement() { - const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); - offsetCountAtIndex(currentIndex, -1); + const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex(); + offsetCountAtIndex(currentIndex, -1); } void TabDeckEditor::actUpdatePrices() { - aUpdatePrices->setDisabled(true); - PriceUpdater *up = new PriceUpdater(deckModel->getDeckList()); - connect(up, SIGNAL(finishedUpdate()), this, SLOT(finishedUpdatingPrices())); - up->updatePrices(); + aUpdatePrices->setDisabled(true); + PriceUpdater *up = new PriceUpdater(deckModel->getDeckList()); + connect(up, SIGNAL(finishedUpdate()), this, SLOT(finishedUpdatingPrices())); + up->updatePrices(); } void TabDeckEditor::finishedUpdatingPrices() { - deckModel->pricesUpdated(); - setModified(true); - aUpdatePrices->setDisabled(false); + deckModel->pricesUpdated(); + setModified(true); + aUpdatePrices->setDisabled(false); } void TabDeckEditor::setDeck(DeckLoader *_deck) { - deckModel->setDeckList(_deck); + deckModel->setDeckList(_deck); - nameEdit->setText(deckModel->getDeckList()->getName()); - commentsEdit->setText(deckModel->getDeckList()->getComments()); - updateHash(); - deckModel->sort(1); - deckView->expandAll(); - setModified(false); - - db->cacheCardPixmaps(deckModel->getDeckList()->getCardList()); - deckView->expandAll(); - setModified(false); + nameEdit->setText(deckModel->getDeckList()->getName()); + commentsEdit->setText(deckModel->getDeckList()->getComments()); + updateHash(); + deckModel->sort(1); + deckView->expandAll(); + setModified(false); + + db->cacheCardPixmaps(deckModel->getDeckList()->getCardList()); + deckView->expandAll(); + setModified(false); } void TabDeckEditor::setModified(bool _modified) { - modified = _modified; - emit tabTextChanged(this, getTabText()); + modified = _modified; + emit tabTextChanged(this, getTabText()); } void TabDeckEditor::filterViewCustomContextMenu(const QPoint &point) { - QMenu menu; - QAction *action; - QModelIndex idx; + QMenu menu; + QAction *action; + QModelIndex idx; - idx = filterView->indexAt(point); - if (!idx.isValid()) - return; + idx = filterView->indexAt(point); + if (!idx.isValid()) + return; - action = menu.addAction(QString("delete")); - action->setData(point); - connect(&menu, SIGNAL(triggered(QAction *)), - this, SLOT(filterRemove(QAction *))); - menu.exec(filterView->mapToGlobal(point)); + action = menu.addAction(QString("delete")); + action->setData(point); + connect(&menu, SIGNAL(triggered(QAction *)), + this, SLOT(filterRemove(QAction *))); + menu.exec(filterView->mapToGlobal(point)); } void TabDeckEditor::filterRemove(QAction *action) { - QPoint point; - QModelIndex idx; + QPoint point; + QModelIndex idx; - point = action->data().toPoint(); - idx = filterView->indexAt(point); - if (!idx.isValid()) - return; + point = action->data().toPoint(); + idx = filterView->indexAt(point); + if (!idx.isValid()) + return; - filterModel->removeRow(idx.row(), idx.parent()); + filterModel->removeRow(idx.row(), idx.parent()); } diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index 8dde3e58..349f28eb 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -20,98 +20,98 @@ class FilterTreeModel; class CardInfo; class SearchLineEdit : public QLineEdit { - private: - QTreeView *treeView; - protected: - void keyPressEvent(QKeyEvent *event); - public: - SearchLineEdit() : QLineEdit(), treeView(0) { } - void setTreeView(QTreeView *_treeView) { treeView = _treeView; } + private: + QTreeView *treeView; + protected: + void keyPressEvent(QKeyEvent *event); + public: + SearchLineEdit() : QLineEdit(), treeView(0) { } + void setTreeView(QTreeView *_treeView) { treeView = _treeView; } }; class TabDeckEditor : public Tab { - Q_OBJECT + Q_OBJECT private slots: - void updateName(const QString &name); - void updateComments(); - void updateHash(); - void updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &previous); - void updateCardInfoRight(const QModelIndex ¤t, const QModelIndex &previous); - void updateSearch(const QString &search); + void updateName(const QString &name); + void updateComments(); + void updateHash(); + void updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &previous); + void updateCardInfoRight(const QModelIndex ¤t, const QModelIndex &previous); + void updateSearch(const QString &search); - void actNewDeck(); - void actLoadDeck(); - bool actSaveDeck(); - bool actSaveDeckAs(); - void actLoadDeckFromClipboard(); - void actSaveDeckToClipboard(); - void actPrintDeck(); - void actAnalyzeDeck(); + void actNewDeck(); + void actLoadDeck(); + bool actSaveDeck(); + bool actSaveDeckAs(); + void actLoadDeckFromClipboard(); + void actSaveDeckToClipboard(); + void actPrintDeck(); + void actAnalyzeDeck(); - void actEditSets(); - void actEditTokens(); - - void actClearSearch(); + void actEditSets(); + void actEditTokens(); + + void actClearSearch(); - void actAddCard(); - void actAddCardToSideboard(); - void actRemoveCard(); - void actIncrement(); - void actDecrement(); - void actDecrementCard(); - void actDecrementCardFromSideboard(); + void actAddCard(); + void actAddCardToSideboard(); + void actRemoveCard(); + void actIncrement(); + void actDecrement(); + void actDecrementCard(); + void actDecrementCardFromSideboard(); void actUpdatePrices(); void finishedUpdatingPrices(); - void saveDeckRemoteFinished(const Response &r); - void filterViewCustomContextMenu(const QPoint &point); - void filterRemove(QAction *action); + void saveDeckRemoteFinished(const Response &r); + void filterViewCustomContextMenu(const QPoint &point); + void filterRemove(QAction *action); private: - CardInfo *currentCardInfo() const; - void addCardHelper(QString zoneName); - void offsetCountAtIndex(const QModelIndex &idx, int offset); - void decrementCardHelper(QString zoneName); - void recursiveExpand(const QModelIndex &index); - bool confirmClose(); + CardInfo *currentCardInfo() const; + void addCardHelper(QString zoneName); + void offsetCountAtIndex(const QModelIndex &idx, int offset); + void decrementCardHelper(QString zoneName); + void recursiveExpand(const QModelIndex &index); + bool confirmClose(); - CardDatabaseModel *databaseModel; - CardDatabaseDisplayModel *databaseDisplayModel; - DeckListModel *deckModel; - QTreeView *databaseView; - KeySignals dbViewKeySignals; - QTreeView *deckView; - KeySignals deckViewKeySignals; - CardFrame *cardInfo; - QLabel *searchLabel; - SearchLineEdit *searchEdit; - KeySignals searchKeySignals; - QLabel *nameLabel; - QLineEdit *nameEdit; - QLabel *commentsLabel; - QTextEdit *commentsEdit; - QLabel *hashLabel1; - QLabel *hashLabel; - FilterTreeModel *filterModel; - QTreeView *filterView; + CardDatabaseModel *databaseModel; + CardDatabaseDisplayModel *databaseDisplayModel; + DeckListModel *deckModel; + QTreeView *databaseView; + KeySignals dbViewKeySignals; + QTreeView *deckView; + KeySignals deckViewKeySignals; + CardFrame *cardInfo; + QLabel *searchLabel; + SearchLineEdit *searchEdit; + KeySignals searchKeySignals; + QLabel *nameLabel; + QLineEdit *nameEdit; + QLabel *commentsLabel; + QTextEdit *commentsEdit; + QLabel *hashLabel1; + QLabel *hashLabel; + FilterTreeModel *filterModel; + QTreeView *filterView; - QMenu *deckMenu, *dbMenu; - QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose; - QAction *aEditSets, *aEditTokens, *aClearSearch, *aCardTextOnly; + QMenu *deckMenu, *dbMenu; + QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aAnalyzeDeck, *aClose; + QAction *aEditSets, *aEditTokens, *aClearSearch, *aCardTextOnly; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices; - - bool modified; + + bool modified; public: - TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent = 0); - ~TabDeckEditor(); - void retranslateUi(); - QString getTabText() const; - void setDeck(DeckLoader *_deckLoader); - void setModified(bool _windowModified); + TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent = 0); + ~TabDeckEditor(); + void retranslateUi(); + QString getTabText() const; + void setDeck(DeckLoader *_deckLoader); + void setModified(bool _windowModified); public slots: - void closeRequest(); + void closeRequest(); signals: - void deckEditorClosing(TabDeckEditor *tab); + void deckEditorClosing(TabDeckEditor *tab); }; #endif From cd4d04be3ee9533a01fec58d2d3e7bacc7f6ba34 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Tue, 25 Mar 2014 02:28:42 +0000 Subject: [PATCH 14/16] change tabs into 4 spaces in new files --- cockatrice/src/cardfilter.cpp | 56 ++--- cockatrice/src/cardfilter.h | 56 ++--- cockatrice/src/cardframe.cpp | 56 ++--- cockatrice/src/cardframe.h | 28 +-- cockatrice/src/cardinfopicture.cpp | 56 ++--- cockatrice/src/cardinfopicture.h | 18 +- cockatrice/src/cardinfotext.cpp | 88 ++++---- cockatrice/src/cardinfotext.h | 22 +- cockatrice/src/filterbuilder.cpp | 94 ++++---- cockatrice/src/filterbuilder.h | 18 +- cockatrice/src/filtertree.cpp | 340 ++++++++++++++--------------- cockatrice/src/filtertree.h | 204 ++++++++--------- cockatrice/src/filtertreemodel.cpp | 328 ++++++++++++++-------------- cockatrice/src/filtertreemodel.h | 44 ++-- cockatrice/src/keysignals.cpp | 76 +++---- cockatrice/src/keysignals.h | 34 +-- 16 files changed, 759 insertions(+), 759 deletions(-) diff --git a/cockatrice/src/cardfilter.cpp b/cockatrice/src/cardfilter.cpp index 38017377..fb59adcf 100644 --- a/cockatrice/src/cardfilter.cpp +++ b/cockatrice/src/cardfilter.cpp @@ -2,36 +2,36 @@ const char *CardFilter::typeName(Type t) { - switch (t) { - case TypeAnd: - return "and"; - case TypeOr: - return "or"; - case TypeAndNot: - return "and not"; - case TypeOrNot: - return "or not"; - default: - return ""; - } + switch (t) { + case TypeAnd: + return "and"; + case TypeOr: + return "or"; + case TypeAndNot: + return "and not"; + case TypeOrNot: + return "or not"; + default: + return ""; + } } const char *CardFilter::attrName(Attr a) { - switch (a) { - case AttrName: - return "name"; - case AttrType: - return "type"; - case AttrColor: - return "color"; - case AttrText: - return "text"; - case AttrSet: - return "set"; - case AttrManaCost: - return "mana cost"; - default: - return ""; - } + switch (a) { + case AttrName: + return "name"; + case AttrType: + return "type"; + case AttrColor: + return "color"; + case AttrText: + return "text"; + case AttrSet: + return "set"; + case AttrManaCost: + return "mana cost"; + default: + return ""; + } } diff --git a/cockatrice/src/cardfilter.h b/cockatrice/src/cardfilter.h index 539cdb0c..47a85ea6 100644 --- a/cockatrice/src/cardfilter.h +++ b/cockatrice/src/cardfilter.h @@ -5,40 +5,40 @@ class CardFilter { public: - enum Type { - TypeAnd = 0, - TypeOr, - TypeAndNot, - TypeOrNot, - TypeEnd - }; + enum Type { + TypeAnd = 0, + TypeOr, + TypeAndNot, + TypeOrNot, + TypeEnd + }; - /* if you add an atribute here you also need to - * add its string representation in attrName */ - enum Attr { - AttrName = 0, - AttrType, - AttrColor, - AttrText, - AttrSet, - AttrManaCost, - AttrEnd - }; + /* if you add an atribute here you also need to + * add its string representation in attrName */ + enum Attr { + AttrName = 0, + AttrType, + AttrColor, + AttrText, + AttrSet, + AttrManaCost, + AttrEnd + }; private: - enum Type t; - enum Attr a; - QString trm; - + enum Type t; + enum Attr a; + QString trm; + public: - CardFilter(QString term, Type type, Attr attr) : trm(term), t(type), a(attr) {}; + CardFilter(QString term, Type type, Attr attr) : trm(term), t(type), a(attr) {}; - Type type() const { return t; } - const QString &term() const { return trm; } - Attr attr() const { return a; } + Type type() const { return t; } + const QString &term() const { return trm; } + Attr attr() const { return a; } - static const char *typeName(Type t); - static const char *attrName(Attr a); + static const char *typeName(Type t); + static const char *attrName(Attr a); }; #endif diff --git a/cockatrice/src/cardframe.cpp b/cockatrice/src/cardframe.cpp index 89b3cb6b..2ec2b42c 100644 --- a/cockatrice/src/cardframe.cpp +++ b/cockatrice/src/cardframe.cpp @@ -7,53 +7,53 @@ #include "cardinfotext.h" CardFrame::CardFrame(int width, int height, - const QString &cardName, QWidget *parent) - : QStackedWidget(parent) - , info(0) - , cardTextOnly(false) + const QString &cardName, QWidget *parent) + : QStackedWidget(parent) + , info(0) + , cardTextOnly(false) { - setFrameStyle(QFrame::Panel | QFrame::Raised); - setMaximumWidth(width); - setMinimumWidth(width); - setMaximumHeight(height); - setMinimumHeight(height); - pic = new CardInfoPicture(width); - addWidget(pic); - text = new CardInfoText(); - addWidget(text); - connect(pic, SIGNAL(hasPictureChanged()), this, SLOT(hasPictureChanged())); - setCard(db->getCard(cardName)); + setFrameStyle(QFrame::Panel | QFrame::Raised); + setMaximumWidth(width); + setMinimumWidth(width); + setMaximumHeight(height); + setMinimumHeight(height); + pic = new CardInfoPicture(width); + addWidget(pic); + text = new CardInfoText(); + addWidget(text); + connect(pic, SIGNAL(hasPictureChanged()), this, SLOT(hasPictureChanged())); + setCard(db->getCard(cardName)); } void CardFrame::setCard(CardInfo *card) { - if (info) - disconnect(info, 0, this, 0); - info = card; - connect(info, SIGNAL(destroyed()), this, SLOT(clear())); - text->setCard(info); - pic->setCard(info); + if (info) + disconnect(info, 0, this, 0); + info = card; + connect(info, SIGNAL(destroyed()), this, SLOT(clear())); + text->setCard(info); + pic->setCard(info); } void CardFrame::setCard(const QString &cardName) { - setCard(db->getCard(cardName)); + setCard(db->getCard(cardName)); } void CardFrame::setCard(AbstractCardItem *card) { - setCard(card->getInfo()); + setCard(card->getInfo()); } void CardFrame::clear() { - setCard(db->getCard()); + setCard(db->getCard()); } void CardFrame::hasPictureChanged() { - if (pic->hasPicture() && !cardTextOnly) - setCurrentWidget(pic); - else - setCurrentWidget(text); + if (pic->hasPicture() && !cardTextOnly) + setCurrentWidget(pic); + else + setCurrentWidget(text); } diff --git a/cockatrice/src/cardframe.h b/cockatrice/src/cardframe.h index c241c51a..d75ce45a 100644 --- a/cockatrice/src/cardframe.h +++ b/cockatrice/src/cardframe.h @@ -9,28 +9,28 @@ class CardInfoPicture; class CardInfoText; class CardFrame : public QStackedWidget { - Q_OBJECT + Q_OBJECT private: - CardInfo *info; - CardInfoPicture *pic; - CardInfoText *text; - bool cardTextOnly; + CardInfo *info; + CardInfoPicture *pic; + CardInfoText *text; + bool cardTextOnly; public: - CardFrame(int width, int height, const QString &cardName = QString(), - QWidget *parent = 0); - void setCardTextOnly(bool status) { cardTextOnly = status; hasPictureChanged(); } + CardFrame(int width, int height, const QString &cardName = QString(), + QWidget *parent = 0); + void setCardTextOnly(bool status) { cardTextOnly = status; hasPictureChanged(); } public slots: - void setCard(CardInfo *card); - void setCard(const QString &cardName); - void setCard(AbstractCardItem *card); - void clear(); + void setCard(CardInfo *card); + void setCard(const QString &cardName); + void setCard(AbstractCardItem *card); + void clear(); private slots: - void hasPictureChanged(); - void toggleCardTextOnly() { setCardTextOnly(!cardTextOnly); } + void hasPictureChanged(); + void toggleCardTextOnly() { setCardTextOnly(!cardTextOnly); } }; #endif diff --git a/cockatrice/src/cardinfopicture.cpp b/cockatrice/src/cardinfopicture.cpp index 7a7d6195..8b560958 100644 --- a/cockatrice/src/cardinfopicture.cpp +++ b/cockatrice/src/cardinfopicture.cpp @@ -6,48 +6,48 @@ #include "main.h" CardInfoPicture::CardInfoPicture(int maximumWidth, QWidget *parent) - : QLabel(parent) - , info(0) - , noPicture(true) + : QLabel(parent) + , info(0) + , noPicture(true) { - setMaximumWidth(maximumWidth); + setMaximumWidth(maximumWidth); } void CardInfoPicture::setNoPicture(bool status) { - if (noPicture != status) { - noPicture = status; - emit hasPictureChanged(); - } + if (noPicture != status) { + noPicture = status; + emit hasPictureChanged(); + } } void CardInfoPicture::setCard(CardInfo *card) { - if (info) - disconnect(info, 0, this, 0); - info = card; - connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); + if (info) + disconnect(info, 0, this, 0); + info = card; + connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap())); - updatePixmap(); + updatePixmap(); } void CardInfoPicture::updatePixmap() { - qreal aspectRatio = (qreal) CARD_HEIGHT / (qreal) CARD_WIDTH; - qreal pixmapWidth = this->width(); + qreal aspectRatio = (qreal) CARD_HEIGHT / (qreal) CARD_WIDTH; + qreal pixmapWidth = this->width(); - if (pixmapWidth == 0) { - setNoPicture(true); - return; - } + if (pixmapWidth == 0) { + setNoPicture(true); + return; + } - QPixmap *resizedPixmap = info->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)); - if (resizedPixmap) { - setNoPicture(false); - this->setPixmap(*resizedPixmap); - } - else { - setNoPicture(true); - this->setPixmap(*(db->getCard()->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)))); - } + QPixmap *resizedPixmap = info->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)); + if (resizedPixmap) { + setNoPicture(false); + this->setPixmap(*resizedPixmap); + } + else { + setNoPicture(true); + this->setPixmap(*(db->getCard()->getPixmap(QSize(pixmapWidth, pixmapWidth * aspectRatio)))); + } } diff --git a/cockatrice/src/cardinfopicture.h b/cockatrice/src/cardinfopicture.h index 9f34da94..2773f99f 100644 --- a/cockatrice/src/cardinfopicture.h +++ b/cockatrice/src/cardinfopicture.h @@ -7,27 +7,27 @@ class AbstractCardItem; class CardInfo; class CardInfoPicture : public QLabel { - Q_OBJECT + Q_OBJECT signals: - void hasPictureChanged(); + void hasPictureChanged(); private: - CardInfo *info; - bool noPicture; + CardInfo *info; + bool noPicture; public: - CardInfoPicture(int maximumWidth, QWidget *parent = 0); - bool hasPicture() const { return !noPicture; } + CardInfoPicture(int maximumWidth, QWidget *parent = 0); + bool hasPicture() const { return !noPicture; } private: - void setNoPicture(bool status); + void setNoPicture(bool status); public slots: - void setCard(CardInfo *card); + void setCard(CardInfo *card); private slots: - void updatePixmap(); + void updatePixmap(); }; diff --git a/cockatrice/src/cardinfotext.cpp b/cockatrice/src/cardinfotext.cpp index 9e59f33b..21336a83 100644 --- a/cockatrice/src/cardinfotext.cpp +++ b/cockatrice/src/cardinfotext.cpp @@ -8,60 +8,60 @@ #include "main.h" CardInfoText::CardInfoText(QWidget *parent) - : QFrame(parent) - , info(0) + : QFrame(parent) + , info(0) { - nameLabel1 = new QLabel; - nameLabel2 = new QLabel; - nameLabel2->setWordWrap(true); - manacostLabel1 = new QLabel; - manacostLabel2 = new QLabel; - manacostLabel2->setWordWrap(true); - cardtypeLabel1 = new QLabel; - cardtypeLabel2 = new QLabel; - cardtypeLabel2->setWordWrap(true); - powtoughLabel1 = new QLabel; - powtoughLabel2 = new QLabel; - loyaltyLabel1 = new QLabel; - loyaltyLabel2 = new QLabel; + nameLabel1 = new QLabel; + nameLabel2 = new QLabel; + nameLabel2->setWordWrap(true); + manacostLabel1 = new QLabel; + manacostLabel2 = new QLabel; + manacostLabel2->setWordWrap(true); + cardtypeLabel1 = new QLabel; + cardtypeLabel2 = new QLabel; + cardtypeLabel2->setWordWrap(true); + powtoughLabel1 = new QLabel; + powtoughLabel2 = new QLabel; + loyaltyLabel1 = new QLabel; + loyaltyLabel2 = new QLabel; - textLabel = new QTextEdit(); - textLabel->setReadOnly(true); + textLabel = new QTextEdit(); + textLabel->setReadOnly(true); - QGridLayout *grid = new QGridLayout(this); - int row = 0; - grid->addWidget(nameLabel1, row, 0); - grid->addWidget(nameLabel2, row++, 1); - grid->addWidget(manacostLabel1, row, 0); - grid->addWidget(manacostLabel2, row++, 1); - grid->addWidget(cardtypeLabel1, row, 0); - grid->addWidget(cardtypeLabel2, row++, 1); - grid->addWidget(powtoughLabel1, row, 0); - grid->addWidget(powtoughLabel2, row++, 1); - grid->addWidget(loyaltyLabel1, row, 0); - grid->addWidget(loyaltyLabel2, row++, 1); - grid->addWidget(textLabel, row, 0, -1, 2); - grid->setRowStretch(row, 1); - grid->setColumnStretch(1, 1); + QGridLayout *grid = new QGridLayout(this); + int row = 0; + grid->addWidget(nameLabel1, row, 0); + grid->addWidget(nameLabel2, row++, 1); + grid->addWidget(manacostLabel1, row, 0); + grid->addWidget(manacostLabel2, row++, 1); + grid->addWidget(cardtypeLabel1, row, 0); + grid->addWidget(cardtypeLabel2, row++, 1); + grid->addWidget(powtoughLabel1, row, 0); + grid->addWidget(powtoughLabel2, row++, 1); + grid->addWidget(loyaltyLabel1, row, 0); + grid->addWidget(loyaltyLabel2, row++, 1); + grid->addWidget(textLabel, row, 0, -1, 2); + grid->setRowStretch(row, 1); + grid->setColumnStretch(1, 1); - retranslateUi(); + retranslateUi(); } void CardInfoText::setCard(CardInfo *card) { - nameLabel2->setText(card->getName()); - manacostLabel2->setText(card->getManaCost()); - cardtypeLabel2->setText(card->getCardType()); - powtoughLabel2->setText(card->getPowTough()); - loyaltyLabel2->setText(card->getLoyalty() > 0 ? QString::number(card->getLoyalty()) : QString()); - textLabel->setText(card->getText()); + nameLabel2->setText(card->getName()); + manacostLabel2->setText(card->getManaCost()); + cardtypeLabel2->setText(card->getCardType()); + powtoughLabel2->setText(card->getPowTough()); + loyaltyLabel2->setText(card->getLoyalty() > 0 ? QString::number(card->getLoyalty()) : QString()); + textLabel->setText(card->getText()); } void CardInfoText::retranslateUi() { - nameLabel1->setText(tr("Name:")); - manacostLabel1->setText(tr("Mana cost:")); - cardtypeLabel1->setText(tr("Card type:")); - powtoughLabel1->setText(tr("P / T:")); - loyaltyLabel1->setText(tr("Loyalty:")); + nameLabel1->setText(tr("Name:")); + manacostLabel1->setText(tr("Mana cost:")); + cardtypeLabel1->setText(tr("Card type:")); + powtoughLabel1->setText(tr("P / T:")); + loyaltyLabel1->setText(tr("Loyalty:")); } diff --git a/cockatrice/src/cardinfotext.h b/cockatrice/src/cardinfotext.h index 0b555230..c0f59480 100644 --- a/cockatrice/src/cardinfotext.h +++ b/cockatrice/src/cardinfotext.h @@ -8,24 +8,24 @@ class QTextEdit; class CardInfo; class CardInfoText : public QFrame { - Q_OBJECT + Q_OBJECT private: - QLabel *nameLabel1, *nameLabel2; - QLabel *manacostLabel1, *manacostLabel2; - QLabel *cardtypeLabel1, *cardtypeLabel2; - QLabel *powtoughLabel1, *powtoughLabel2; - QLabel *loyaltyLabel1, *loyaltyLabel2; - QTextEdit *textLabel; + QLabel *nameLabel1, *nameLabel2; + QLabel *manacostLabel1, *manacostLabel2; + QLabel *cardtypeLabel1, *cardtypeLabel2; + QLabel *powtoughLabel1, *powtoughLabel2; + QLabel *loyaltyLabel1, *loyaltyLabel2; + QTextEdit *textLabel; - CardInfo *info; + CardInfo *info; public: - CardInfoText(QWidget *parent = 0); - void retranslateUi(); + CardInfoText(QWidget *parent = 0); + void retranslateUi(); public slots: - void setCard(CardInfo *card); + void setCard(CardInfo *card); }; #endif diff --git a/cockatrice/src/filterbuilder.cpp b/cockatrice/src/filterbuilder.cpp index 128cd7bc..f594a5de 100644 --- a/cockatrice/src/filterbuilder.cpp +++ b/cockatrice/src/filterbuilder.cpp @@ -8,77 +8,77 @@ #include "cardfilter.h" FilterBuilder::FilterBuilder(QWidget *parent) - : QFrame(parent) -{ - int i; + : QFrame(parent) +{ + int i; - QVBoxLayout *layout = new QVBoxLayout; - QHBoxLayout *addFilter = new QHBoxLayout; + QVBoxLayout *layout = new QVBoxLayout; + QHBoxLayout *addFilter = new QHBoxLayout; - filterCombo = new QComboBox; - for (i = 0; i < CardFilter::AttrEnd; i++) - filterCombo->addItem( - tr(CardFilter::attrName(static_cast(i))), - QVariant(i) - ); + filterCombo = new QComboBox; + for (i = 0; i < CardFilter::AttrEnd; i++) + filterCombo->addItem( + tr(CardFilter::attrName(static_cast(i))), + QVariant(i) + ); - typeCombo = new QComboBox; - for (i = 0; i < CardFilter::TypeEnd; i++) - typeCombo->addItem( - tr(CardFilter::typeName(static_cast(i))), - QVariant(i) - ); + typeCombo = new QComboBox; + for (i = 0; i < CardFilter::TypeEnd; i++) + typeCombo->addItem( + tr(CardFilter::typeName(static_cast(i))), + QVariant(i) + ); - QPushButton *ok = new QPushButton("+"); - ok->setMaximumSize(20, 20); + QPushButton *ok = new QPushButton("+"); + ok->setMaximumSize(20, 20); - addFilter->addWidget(ok); - addFilter->addWidget(typeCombo); - addFilter->addWidget(filterCombo, Qt::AlignLeft); + addFilter->addWidget(ok); + addFilter->addWidget(typeCombo); + addFilter->addWidget(filterCombo, Qt::AlignLeft); - edit = new QLineEdit; - edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - layout->addLayout(addFilter); - layout->addWidget(edit); + edit = new QLineEdit; + edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + layout->addLayout(addFilter); + layout->addWidget(edit); - setFrameStyle(QFrame::Panel | QFrame::Raised); - layout->setAlignment(Qt::AlignTop); - setLayout(layout); + setFrameStyle(QFrame::Panel | QFrame::Raised); + layout->setAlignment(Qt::AlignTop); + setLayout(layout); - connect(edit, SIGNAL(returnPressed()), this, SLOT(emit_add())); - connect(ok, SIGNAL(released()), this, SLOT(emit_add())); - connect(filterCombo, SIGNAL(currentIndexChanged(int)), edit, SLOT(clear())); - fltr = NULL; + connect(edit, SIGNAL(returnPressed()), this, SLOT(emit_add())); + connect(ok, SIGNAL(released()), this, SLOT(emit_add())); + connect(filterCombo, SIGNAL(currentIndexChanged(int)), edit, SLOT(clear())); + fltr = NULL; } FilterBuilder::~FilterBuilder() { - destroyFilter(); + destroyFilter(); } void FilterBuilder::destroyFilter() { - if (fltr) - delete fltr; + if (fltr) + delete fltr; } static int comboCurrentIntData(const QComboBox *combo) { - return combo->itemData(combo->currentIndex()).toInt(); + return combo->itemData(combo->currentIndex()).toInt(); } void FilterBuilder::emit_add() { - QString txt; + QString txt; - txt = edit->text(); - if (txt.length() < 1) - return; + txt = edit->text(); + if (txt.length() < 1) + return; - destroyFilter(); - fltr = new CardFilter(txt, - static_cast(comboCurrentIntData(typeCombo)), - static_cast(comboCurrentIntData(filterCombo))); - emit add(fltr); - edit->clear(); + destroyFilter(); + fltr = new CardFilter(txt, + static_cast(comboCurrentIntData(typeCombo)), + static_cast(comboCurrentIntData(filterCombo))); + emit add(fltr); + edit->clear(); } diff --git a/cockatrice/src/filterbuilder.h b/cockatrice/src/filterbuilder.h index 1d0565f3..6438e383 100644 --- a/cockatrice/src/filterbuilder.h +++ b/cockatrice/src/filterbuilder.h @@ -9,26 +9,26 @@ class QLineEdit; class CardFilter; class FilterBuilder : public QFrame { - Q_OBJECT + Q_OBJECT private: - QComboBox *typeCombo; - QComboBox *filterCombo; - QLineEdit *edit; - CardFilter *fltr; + QComboBox *typeCombo; + QComboBox *filterCombo; + QLineEdit *edit; + CardFilter *fltr; - void destroyFilter(); + void destroyFilter(); public: - FilterBuilder(QWidget *parent = 0); - ~FilterBuilder(); + FilterBuilder(QWidget *parent = 0); + ~FilterBuilder(); signals: void add(const CardFilter *f); public slots: private slots: - void emit_add(); + void emit_add(); protected: }; diff --git a/cockatrice/src/filtertree.cpp b/cockatrice/src/filtertree.cpp index 9e647e82..e1dc3101 100644 --- a/cockatrice/src/filtertree.cpp +++ b/cockatrice/src/filtertree.cpp @@ -7,223 +7,223 @@ template FilterTreeNode *FilterTreeBranch::nodeAt(int i) const { - return ((childNodes.size() > i)? childNodes.at(i) : NULL); + return ((childNodes.size() > i)? childNodes.at(i) : NULL); } template void FilterTreeBranch::deleteAt(int i) { - preRemoveChild(this, i); - delete childNodes.takeAt(i); - postRemoveChild(this, i); - nodeChanged(); + preRemoveChild(this, i); + delete childNodes.takeAt(i); + postRemoveChild(this, i); + nodeChanged(); } template int FilterTreeBranch::childIndex(const FilterTreeNode *node) const { - FilterTreeNode *unconst; - T downcasted; + FilterTreeNode *unconst; + T downcasted; - /* to do the dynamic cast to T we will lose const'ness, but we can - * trust QList::indexOf */ - unconst = (FilterTreeNode *) node; - downcasted = dynamic_cast(unconst); - if (downcasted == NULL) - return -1; - return childNodes.indexOf(downcasted); + /* to do the dynamic cast to T we will lose const'ness, but we can + * trust QList::indexOf */ + unconst = (FilterTreeNode *) node; + downcasted = dynamic_cast(unconst); + if (downcasted == NULL) + return -1; + return childNodes.indexOf(downcasted); } template FilterTreeBranch::~FilterTreeBranch() { - while (!childNodes.isEmpty()) - delete childNodes.takeFirst(); + while (!childNodes.isEmpty()) + delete childNodes.takeFirst(); } const FilterItemList *LogicMap::findTypeList(CardFilter::Type type) const { - QList::const_iterator i; + QList::const_iterator i; - for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) - if ((*i)->type == type) - return *i; + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if ((*i)->type == type) + return *i; - return NULL; + return NULL; } FilterItemList *LogicMap::typeList(CardFilter::Type type) { - QList::iterator i; - int count; + QList::iterator i; + int count; - count = 0; - for (i = childNodes.begin(); i != childNodes.end(); i++) { - if ((*i)->type == type) - break; - count++; - } - if (i == childNodes.end()) { - preInsertChild(this, count); - i = childNodes.insert(i, new FilterItemList(type, this)); - postInsertChild(this, count); - nodeChanged(); - } + count = 0; + for (i = childNodes.begin(); i != childNodes.end(); i++) { + if ((*i)->type == type) + break; + count++; + } + if (i == childNodes.end()) { + preInsertChild(this, count); + i = childNodes.insert(i, new FilterItemList(type, this)); + postInsertChild(this, count); + nodeChanged(); + } - return *i; + return *i; } FilterTreeNode *LogicMap::parent() const { - return p; + return p; } int FilterItemList::termIndex(const QString &term) const { - int i; + int i; - for (i = 0; i < childNodes.count(); i++) - if ((childNodes.at(i))->term == term) - return i; + for (i = 0; i < childNodes.count(); i++) + if ((childNodes.at(i))->term == term) + return i; - return -1; + return -1; } FilterTreeNode *FilterItemList::termNode(const QString &term) { - int i, count; - FilterItem *fi; + int i, count; + FilterItem *fi; - i = termIndex(term); - if (i < 0) { - fi = new FilterItem(term, this); - count = childNodes.count(); - preInsertChild(this, count); - childNodes.append(fi); - postInsertChild(this, count); - nodeChanged(); - return fi; - } + i = termIndex(term); + if (i < 0) { + fi = new FilterItem(term, this); + count = childNodes.count(); + preInsertChild(this, count); + childNodes.append(fi); + postInsertChild(this, count); + nodeChanged(); + return fi; + } - return childNodes.at(i); + return childNodes.at(i); } bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const { - QList::const_iterator i; + QList::const_iterator i; - for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) - if (!(*i)->acceptCardAttr(info, attr)) - return false; + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if (!(*i)->acceptCardAttr(info, attr)) + return false; - return true; + return true; } bool FilterItemList::testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const { - // if any one in the list is true, return false - return !testTypeOr(info, attr); + // if any one in the list is true, return false + return !testTypeOr(info, attr); } bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) const { - QList::const_iterator i; + QList::const_iterator i; - for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) - if ((*i)->acceptCardAttr(info, attr)) - return true; + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if ((*i)->acceptCardAttr(info, attr)) + return true; - return false; + return false; } bool FilterItemList::testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const { - // if any one in the list is false, return true - return !testTypeAnd(info, attr); + // if any one in the list is false, return true + return !testTypeAnd(info, attr); } bool FilterItem::acceptName(const CardInfo *info) const { - return info->getName().contains(term, Qt::CaseInsensitive); + return info->getName().contains(term, Qt::CaseInsensitive); } bool FilterItem::acceptType(const CardInfo *info) const { - return info->getCardType().contains(term, Qt::CaseInsensitive); + return info->getCardType().contains(term, Qt::CaseInsensitive); } bool FilterItem::acceptColor(const CardInfo *info) const { - QStringList::const_iterator i; - bool status; + QStringList::const_iterator i; + bool status; - status = false; - for (i = info->getColors().constBegin(); i != info->getColors().constEnd(); i++) - if ((*i).contains(term, Qt::CaseInsensitive)) { - status = true; - break; - } + status = false; + for (i = info->getColors().constBegin(); i != info->getColors().constEnd(); i++) + if ((*i).contains(term, Qt::CaseInsensitive)) { + status = true; + break; + } - return status; + return status; } bool FilterItem::acceptText(const CardInfo *info) const { - return info->getText().contains(term, Qt::CaseInsensitive); + return info->getText().contains(term, Qt::CaseInsensitive); } bool FilterItem::acceptSet(const CardInfo *info) const { - SetList::const_iterator i; - bool status; + SetList::const_iterator i; + bool status; - status = false; - for (i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) - if ((*i)->getShortName() == term - || (*i)->getLongName().contains(term, Qt::CaseInsensitive)) { - status = true; - break; - } + status = false; + for (i = info->getSets().constBegin(); i != info->getSets().constEnd(); i++) + if ((*i)->getShortName() == term + || (*i)->getLongName().contains(term, Qt::CaseInsensitive)) { + status = true; + break; + } - return status; + return status; } bool FilterItem::acceptManaCost(const CardInfo *info) const { - return (info->getManaCost() == term); + return (info->getManaCost() == term); } bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const { - bool status; + bool status; - if (!isEnabled()) - return true; + if (!isEnabled()) + return true; - switch (attr) { - case CardFilter::AttrName: - status = acceptName(info); - break; - case CardFilter::AttrType: - status = acceptType(info); - break; - case CardFilter::AttrColor: - status = acceptColor(info); - break; - case CardFilter::AttrText: - status = acceptText(info); - break; - case CardFilter::AttrSet: - status = acceptSet(info); - break; - case CardFilter::AttrManaCost: - status = acceptManaCost(info); - break; - default: - status = true; /* ignore this attribute */ - } + switch (attr) { + case CardFilter::AttrName: + status = acceptName(info); + break; + case CardFilter::AttrType: + status = acceptType(info); + break; + case CardFilter::AttrColor: + status = acceptColor(info); + break; + case CardFilter::AttrText: + status = acceptText(info); + break; + case CardFilter::AttrSet: + status = acceptSet(info); + break; + case CardFilter::AttrManaCost: + status = acceptManaCost(info); + break; + default: + status = true; /* ignore this attribute */ + } - return status; + return status; } /* need to define these here to make QT happy, otherwise @@ -234,103 +234,103 @@ FilterTree::~FilterTree() {} LogicMap *FilterTree::attrLogicMap(CardFilter::Attr attr) { - QList::iterator i; - int count; + QList::iterator i; + int count; - count = 0; - for (i = childNodes.begin(); i != childNodes.end(); i++) { - if ((*i)->attr == attr) - break; - count++; - } + count = 0; + for (i = childNodes.begin(); i != childNodes.end(); i++) { + if ((*i)->attr == attr) + break; + count++; + } - if (i == childNodes.end()) { - preInsertChild(this, count); - i = childNodes.insert(i, new LogicMap(attr, this)); - postInsertChild(this, count); - nodeChanged(); - } + if (i == childNodes.end()) { + preInsertChild(this, count); + i = childNodes.insert(i, new LogicMap(attr, this)); + postInsertChild(this, count); + nodeChanged(); + } - return *i; + return *i; } FilterItemList *FilterTree::attrTypeList(CardFilter::Attr attr, - CardFilter::Type type) + CardFilter::Type type) { - return attrLogicMap(attr)->typeList(type); + return attrLogicMap(attr)->typeList(type); } int FilterTree::findTermIndex(CardFilter::Attr attr, CardFilter::Type type, - const QString &term) + const QString &term) { - attrTypeList(attr, type)->termIndex(term); + attrTypeList(attr, type)->termIndex(term); } int FilterTree::findTermIndex(const CardFilter *f) { - return findTermIndex(f->attr(), f->type(), f->term()); + return findTermIndex(f->attr(), f->type(), f->term()); } FilterTreeNode *FilterTree::termNode(CardFilter::Attr attr, CardFilter::Type type, - const QString &term) + const QString &term) { - return attrTypeList(attr, type)->termNode(term); + return attrTypeList(attr, type)->termNode(term); } FilterTreeNode *FilterTree::termNode(const CardFilter *f) { - return termNode(f->attr(), f->type(), f->term()); + return termNode(f->attr(), f->type(), f->term()); } FilterTreeNode *FilterTree::attrTypeNode(CardFilter::Attr attr, - CardFilter::Type type) + CardFilter::Type type) { - return attrTypeList(attr, type); + return attrTypeList(attr, type); } bool FilterTree::testAttr(const CardInfo *info, const LogicMap *lm) const { - const FilterItemList *fil; - bool status; + const FilterItemList *fil; + bool status; - status = true; + status = true; - fil = lm->findTypeList(CardFilter::TypeAnd); - if (fil != NULL && fil->isEnabled() && !fil->testTypeAnd(info, lm->attr)) - return false; + fil = lm->findTypeList(CardFilter::TypeAnd); + if (fil != NULL && fil->isEnabled() && !fil->testTypeAnd(info, lm->attr)) + return false; - fil = lm->findTypeList(CardFilter::TypeAndNot); - if (fil != NULL && fil->isEnabled() && !fil->testTypeAndNot(info, lm->attr)) - return false; + fil = lm->findTypeList(CardFilter::TypeAndNot); + if (fil != NULL && fil->isEnabled() && !fil->testTypeAndNot(info, lm->attr)) + return false; - fil = lm->findTypeList(CardFilter::TypeOr); - if (fil != NULL && fil->isEnabled()) { - status = false; - // if this is true we can return because it is OR'd with the OrNot list - if (fil->testTypeOr(info, lm->attr)) - return true; - } + fil = lm->findTypeList(CardFilter::TypeOr); + if (fil != NULL && fil->isEnabled()) { + status = false; + // if this is true we can return because it is OR'd with the OrNot list + if (fil->testTypeOr(info, lm->attr)) + return true; + } - fil = lm->findTypeList(CardFilter::TypeOrNot); - if (fil != NULL && fil->isEnabled() && fil->testTypeOrNot(info, lm->attr)) - return true; + fil = lm->findTypeList(CardFilter::TypeOrNot); + if (fil != NULL && fil->isEnabled() && fil->testTypeOrNot(info, lm->attr)) + return true; - return status; + return status; } bool FilterTree::acceptsCard(const CardInfo *info) const { - QList::const_iterator i; + QList::const_iterator i; - for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) - if ((*i)->isEnabled() && !testAttr(info, *i)) - return false; + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + if ((*i)->isEnabled() && !testAttr(info, *i)) + return false; - return true; + return true; } void FilterTree::clear() { - while(childCount() > 0) - deleteAt(0); + while(childCount() > 0) + deleteAt(0); } diff --git a/cockatrice/src/filtertree.h b/cockatrice/src/filtertree.h index a404e5a0..9a5fc531 100644 --- a/cockatrice/src/filtertree.h +++ b/cockatrice/src/filtertree.h @@ -11,48 +11,48 @@ class CardInfo; class FilterTreeNode { private: - bool enabled; + bool enabled; public: - FilterTreeNode() : enabled(true) {} - virtual bool isEnabled() const { return enabled; } - virtual void enable() { enabled = true; nodeChanged(); } - virtual void disable() { enabled = false; nodeChanged(); } - virtual FilterTreeNode *parent() const { return NULL; } - virtual FilterTreeNode *nodeAt(int i) const { return NULL; } - virtual void deleteAt(int i) {} - virtual int childCount() const { return 0; } - virtual int childIndex(const FilterTreeNode *node) const { return -1; } - virtual int index() const { return (parent() != NULL)? parent()->childIndex(this) : -1; } - virtual QString text() const { return QString(textCStr()); } - virtual bool isLeaf() const { return false; } - virtual const char *textCStr() const { return ""; } - virtual void nodeChanged() const { - if (parent() != NULL) parent()->nodeChanged(); - } - virtual void preInsertChild(const FilterTreeNode *p, int i) const { - if (parent() != NULL) parent()->preInsertChild(p, i); - } - virtual void postInsertChild(const FilterTreeNode *p, int i) const { - if (parent() != NULL) parent()->postInsertChild(p, i); - } - virtual void preRemoveChild(const FilterTreeNode *p, int i) const { - if (parent() != NULL) parent()->preRemoveChild(p, i); - } - virtual void postRemoveChild(const FilterTreeNode *p, int i) const { - if (parent() != NULL) parent()->postRemoveChild(p, i); - } + FilterTreeNode() : enabled(true) {} + virtual bool isEnabled() const { return enabled; } + virtual void enable() { enabled = true; nodeChanged(); } + virtual void disable() { enabled = false; nodeChanged(); } + virtual FilterTreeNode *parent() const { return NULL; } + virtual FilterTreeNode *nodeAt(int i) const { return NULL; } + virtual void deleteAt(int i) {} + virtual int childCount() const { return 0; } + virtual int childIndex(const FilterTreeNode *node) const { return -1; } + virtual int index() const { return (parent() != NULL)? parent()->childIndex(this) : -1; } + virtual QString text() const { return QString(textCStr()); } + virtual bool isLeaf() const { return false; } + virtual const char *textCStr() const { return ""; } + virtual void nodeChanged() const { + if (parent() != NULL) parent()->nodeChanged(); + } + virtual void preInsertChild(const FilterTreeNode *p, int i) const { + if (parent() != NULL) parent()->preInsertChild(p, i); + } + virtual void postInsertChild(const FilterTreeNode *p, int i) const { + if (parent() != NULL) parent()->postInsertChild(p, i); + } + virtual void preRemoveChild(const FilterTreeNode *p, int i) const { + if (parent() != NULL) parent()->preRemoveChild(p, i); + } + virtual void postRemoveChild(const FilterTreeNode *p, int i) const { + if (parent() != NULL) parent()->postRemoveChild(p, i); + } }; template class FilterTreeBranch : public FilterTreeNode { protected: - QList childNodes; + QList childNodes; public: - ~FilterTreeBranch(); - FilterTreeNode *nodeAt(int i) const; - void deleteAt(int i); - int childCount() const { return childNodes.size(); } - int childIndex(const FilterTreeNode *node) const; + ~FilterTreeBranch(); + FilterTreeNode *nodeAt(int i) const; + void deleteAt(int i); + int childCount() const { return childNodes.size(); } + int childIndex(const FilterTreeNode *node) const; }; class FilterItemList; @@ -60,104 +60,104 @@ class FilterTree; class LogicMap : public FilterTreeBranch { private: - FilterTree *const p; + FilterTree *const p; public: - const CardFilter::Attr attr; + const CardFilter::Attr attr; - LogicMap(CardFilter::Attr a, FilterTree *parent) - : attr(a), p(parent) {} - const FilterItemList *findTypeList(CardFilter::Type type) const; - FilterItemList *typeList(CardFilter::Type type); - FilterTreeNode *parent() const; - const char* textCStr() const { return CardFilter::attrName(attr); } + LogicMap(CardFilter::Attr a, FilterTree *parent) + : attr(a), p(parent) {} + const FilterItemList *findTypeList(CardFilter::Type type) const; + FilterItemList *typeList(CardFilter::Type type); + FilterTreeNode *parent() const; + const char* textCStr() const { return CardFilter::attrName(attr); } }; class FilterItem; class FilterItemList : public FilterTreeBranch { private: - LogicMap *const p; + LogicMap *const p; public: - const CardFilter::Type type; + const CardFilter::Type type; - FilterItemList(CardFilter::Type t, LogicMap *parent) - : type(t), p(parent) {} - CardFilter::Attr attr() const { return p->attr; } - FilterTreeNode *parent() const { return p; } - int termIndex(const QString &term) const; - FilterTreeNode *termNode(const QString &term); - const char *textCStr() const { return CardFilter::typeName(type); } + FilterItemList(CardFilter::Type t, LogicMap *parent) + : type(t), p(parent) {} + CardFilter::Attr attr() const { return p->attr; } + FilterTreeNode *parent() const { return p; } + int termIndex(const QString &term) const; + FilterTreeNode *termNode(const QString &term); + const char *textCStr() const { return CardFilter::typeName(type); } - bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; - bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const; - bool testTypeOr(const CardInfo *info, CardFilter::Attr attr) const; - bool testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeAnd(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeAndNot(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeOr(const CardInfo *info, CardFilter::Attr attr) const; + bool testTypeOrNot(const CardInfo *info, CardFilter::Attr attr) const; }; class FilterItem : public FilterTreeNode { private: - FilterItemList *const p; + FilterItemList *const p; public: - const QString term; + const QString term; - FilterItem(QString trm, FilterItemList *parent) - : p(parent), term(trm) {} + FilterItem(QString trm, FilterItemList *parent) + : p(parent), term(trm) {} - CardFilter::Attr attr() const { return p->attr(); } - CardFilter::Type type() const { return p->type; } - FilterTreeNode *parent() const { return p; } - QString text() const { return term; } - const char *textCStr() const { return term.toStdString().c_str(); } - bool isLeaf() const { return true; } + CardFilter::Attr attr() const { return p->attr(); } + CardFilter::Type type() const { return p->type; } + FilterTreeNode *parent() const { return p; } + QString text() const { return term; } + const char *textCStr() const { return term.toStdString().c_str(); } + bool isLeaf() const { return true; } - bool acceptName(const CardInfo *info) const; - bool acceptType(const CardInfo *info) const; - bool acceptColor(const CardInfo *info) const; - bool acceptText(const CardInfo *info) const; - bool acceptSet(const CardInfo *info) const; - bool acceptManaCost(const CardInfo *info) const; - bool acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const; + bool acceptName(const CardInfo *info) const; + bool acceptType(const CardInfo *info) const; + bool acceptColor(const CardInfo *info) const; + bool acceptText(const CardInfo *info) const; + bool acceptSet(const CardInfo *info) const; + bool acceptManaCost(const CardInfo *info) const; + bool acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) const; }; class FilterTree : public QObject, public FilterTreeBranch { - Q_OBJECT + Q_OBJECT signals: - void preInsertRow(const FilterTreeNode *parent, int i) const; - void postInsertRow(const FilterTreeNode *parent, int i) const; - void preRemoveRow(const FilterTreeNode *parent, int i) const; - void postRemoveRow(const FilterTreeNode *parent, int i) const; - void changed() const; + void preInsertRow(const FilterTreeNode *parent, int i) const; + void postInsertRow(const FilterTreeNode *parent, int i) const; + void preRemoveRow(const FilterTreeNode *parent, int i) const; + void postRemoveRow(const FilterTreeNode *parent, int i) const; + void changed() const; private: - LogicMap *attrLogicMap(CardFilter::Attr attr); - FilterItemList *attrTypeList(CardFilter::Attr attr, - CardFilter::Type type); + LogicMap *attrLogicMap(CardFilter::Attr attr); + FilterItemList *attrTypeList(CardFilter::Attr attr, + CardFilter::Type type); - bool testAttr(const CardInfo *info, const LogicMap *lm) const; + bool testAttr(const CardInfo *info, const LogicMap *lm) const; - void nodeChanged() const { emit changed(); } - void preInsertChild(const FilterTreeNode *p, int i) const { emit preInsertRow(p, i); } - void postInsertChild(const FilterTreeNode *p, int i) const { emit postInsertRow(p, i); } - void preRemoveChild(const FilterTreeNode *p, int i) const { emit preRemoveRow(p, i); } - void postRemoveChild(const FilterTreeNode *p, int i) const { emit postRemoveRow(p, i); } + void nodeChanged() const { emit changed(); } + void preInsertChild(const FilterTreeNode *p, int i) const { emit preInsertRow(p, i); } + void postInsertChild(const FilterTreeNode *p, int i) const { emit postInsertRow(p, i); } + void preRemoveChild(const FilterTreeNode *p, int i) const { emit preRemoveRow(p, i); } + void postRemoveChild(const FilterTreeNode *p, int i) const { emit postRemoveRow(p, i); } public: - FilterTree(); - ~FilterTree(); - int findTermIndex(CardFilter::Attr attr, CardFilter::Type type, - const QString &term); - int findTermIndex(const CardFilter *f); - FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, - const QString &term); - FilterTreeNode *termNode(const CardFilter *f); - FilterTreeNode *attrTypeNode(CardFilter::Attr attr, - CardFilter::Type type); - const char *textCStr() { return "root"; } - int index() const { return 0; } + FilterTree(); + ~FilterTree(); + int findTermIndex(CardFilter::Attr attr, CardFilter::Type type, + const QString &term); + int findTermIndex(const CardFilter *f); + FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, + const QString &term); + FilterTreeNode *termNode(const CardFilter *f); + FilterTreeNode *attrTypeNode(CardFilter::Attr attr, + CardFilter::Type type); + const char *textCStr() { return "root"; } + int index() const { return 0; } - bool acceptsCard(const CardInfo *info) const; - void clear(); + bool acceptsCard(const CardInfo *info) const; + void clear(); }; #endif diff --git a/cockatrice/src/filtertreemodel.cpp b/cockatrice/src/filtertreemodel.cpp index c004ba22..5fed7766 100644 --- a/cockatrice/src/filtertreemodel.cpp +++ b/cockatrice/src/filtertreemodel.cpp @@ -4,269 +4,269 @@ #include "cardfilter.h" FilterTreeModel::FilterTreeModel(QObject *parent) - : QAbstractItemModel(parent) + : QAbstractItemModel(parent) { - fTree = new FilterTree; - connect(fTree, - SIGNAL(preInsertRow(const FilterTreeNode *, int)), - this, SLOT(proxyBeginInsertRow(const FilterTreeNode *, int))); - connect(fTree, - SIGNAL(postInsertRow(const FilterTreeNode *, int)), - this, SLOT(proxyEndInsertRow(const FilterTreeNode *, int))); - connect(fTree, - SIGNAL(preRemoveRow(const FilterTreeNode *, int)), - this, SLOT(proxyBeginRemoveRow(const FilterTreeNode *, int))); - connect(fTree, - SIGNAL(postRemoveRow(const FilterTreeNode *, int)), - this, SLOT(proxyEndRemoveRow(const FilterTreeNode *, int))); + fTree = new FilterTree; + connect(fTree, + SIGNAL(preInsertRow(const FilterTreeNode *, int)), + this, SLOT(proxyBeginInsertRow(const FilterTreeNode *, int))); + connect(fTree, + SIGNAL(postInsertRow(const FilterTreeNode *, int)), + this, SLOT(proxyEndInsertRow(const FilterTreeNode *, int))); + connect(fTree, + SIGNAL(preRemoveRow(const FilterTreeNode *, int)), + this, SLOT(proxyBeginRemoveRow(const FilterTreeNode *, int))); + connect(fTree, + SIGNAL(postRemoveRow(const FilterTreeNode *, int)), + this, SLOT(proxyEndRemoveRow(const FilterTreeNode *, int))); } FilterTreeModel::~FilterTreeModel() { - delete fTree; + delete fTree; } void FilterTreeModel::proxyBeginInsertRow(const FilterTreeNode *node, int i) { - int idx; + int idx; - idx = node->index(); - if (idx >= 0) - beginInsertRows(createIndex(idx, 0, (void *) node), i, i); + idx = node->index(); + if (idx >= 0) + beginInsertRows(createIndex(idx, 0, (void *) node), i, i); } void FilterTreeModel::proxyEndInsertRow(const FilterTreeNode *node, int) { - int idx; + int idx; - idx = node->index(); - if (idx >= 0) - endInsertRows(); + idx = node->index(); + if (idx >= 0) + endInsertRows(); } void FilterTreeModel::proxyBeginRemoveRow(const FilterTreeNode *node, int i) { - int idx; + int idx; - idx = node->index(); - if (idx >= 0) - beginRemoveRows(createIndex(idx, 0, (void *) node), i, i); + idx = node->index(); + if (idx >= 0) + beginRemoveRows(createIndex(idx, 0, (void *) node), i, i); } void FilterTreeModel::proxyEndRemoveRow(const FilterTreeNode *node, int) { - int idx; + int idx; - idx = node->index(); - if (idx >= 0) - endRemoveRows(); + idx = node->index(); + if (idx >= 0) + endRemoveRows(); } FilterTreeNode *FilterTreeModel::indexToNode(const QModelIndex &idx) const { - void *ip; - FilterTreeNode *node; + void *ip; + FilterTreeNode *node; - if (!idx.isValid()) - return fTree; + if (!idx.isValid()) + return fTree; - ip = idx.internalPointer(); - if (ip == NULL) - return fTree; + ip = idx.internalPointer(); + if (ip == NULL) + return fTree; - node = static_cast(ip); - return node; + node = static_cast(ip); + return node; } void FilterTreeModel::addFilter(const CardFilter *f) { - emit layoutAboutToBeChanged(); - fTree->termNode(f); - emit layoutChanged(); + emit layoutAboutToBeChanged(); + fTree->termNode(f); + emit layoutChanged(); } int FilterTreeModel::rowCount(const QModelIndex &parent) const { - const FilterTreeNode *node; - int result; + const FilterTreeNode *node; + int result; - if (parent.column() > 0) - return 0; + if (parent.column() > 0) + return 0; - node = indexToNode(parent); - if (node) - result = node->childCount(); - else - result = 0; + node = indexToNode(parent); + if (node) + result = node->childCount(); + else + result = 0; - return result; + return result; } int FilterTreeModel::columnCount(const QModelIndex &/*parent*/) const { - return 1; + return 1; } QVariant FilterTreeModel::data(const QModelIndex &index, int role) const { - const FilterTreeNode *node; + const FilterTreeNode *node; - if (!index.isValid()) - return QVariant(); - if (index.column() >= columnCount()) - return QVariant(); + if (!index.isValid()) + return QVariant(); + if (index.column() >= columnCount()) + return QVariant(); - node = indexToNode(index); - if (node == NULL) - return QVariant(); + node = indexToNode(index); + if (node == NULL) + return QVariant(); - switch (role) { - case Qt::FontRole: - if (!node->isLeaf()) { - QFont f; - f.setBold(true); - return f; - } - break; - case Qt::DisplayRole: - case Qt::EditRole: - case Qt::ToolTipRole: - case Qt::StatusTipRole: - case Qt::WhatsThisRole: - if(!node->isLeaf()) - return tr(node->textCStr()); - else - return node->text(); - case Qt::CheckStateRole: - if (node->isEnabled()) - return Qt::Checked; - else - return Qt::Unchecked; - default: - return QVariant(); - } + switch (role) { + case Qt::FontRole: + if (!node->isLeaf()) { + QFont f; + f.setBold(true); + return f; + } + break; + case Qt::DisplayRole: + case Qt::EditRole: + case Qt::ToolTipRole: + case Qt::StatusTipRole: + case Qt::WhatsThisRole: + if(!node->isLeaf()) + return tr(node->textCStr()); + else + return node->text(); + case Qt::CheckStateRole: + if (node->isEnabled()) + return Qt::Checked; + else + return Qt::Unchecked; + default: + return QVariant(); + } - return QVariant(); + return QVariant(); } bool FilterTreeModel::setData(const QModelIndex &index, - const QVariant &value, int role) + const QVariant &value, int role) { - FilterTreeNode *node; + FilterTreeNode *node; - if (!index.isValid()) - return false; - if (index.column() >= columnCount()) - return false; - if (role != Qt::CheckStateRole ) - return false; + if (!index.isValid()) + return false; + if (index.column() >= columnCount()) + return false; + if (role != Qt::CheckStateRole ) + return false; - node = indexToNode(index); - if (node == NULL || node == fTree) - return false; + node = indexToNode(index); + if (node == NULL || node == fTree) + return false; - Qt::CheckState state = static_cast(value.toInt()); - if (state == Qt::Checked) - node->enable(); - else - node->disable(); + Qt::CheckState state = static_cast(value.toInt()); + if (state == Qt::Checked) + node->enable(); + else + node->disable(); - emit dataChanged(index, index); - return true; -} + emit dataChanged(index, index); + return true; +} Qt::ItemFlags FilterTreeModel::flags(const QModelIndex &index) const { - const FilterTreeNode *node; - Qt::ItemFlags result; + const FilterTreeNode *node; + Qt::ItemFlags result; - if (!index.isValid()) - return 0; + if (!index.isValid()) + return 0; - node = indexToNode(index); - if (node == NULL) - return 0; + node = indexToNode(index); + if (node == NULL) + return 0; - result = Qt::ItemIsEnabled; - if (node == fTree) - return result; + result = Qt::ItemIsEnabled; + if (node == fTree) + return result; - result |= Qt::ItemIsSelectable; - result |= Qt::ItemIsUserCheckable; + result |= Qt::ItemIsSelectable; + result |= Qt::ItemIsUserCheckable; - return result; + return result; } QModelIndex FilterTreeModel::nodeIndex(const FilterTreeNode *node, int row, int column) const { - FilterTreeNode *child; + FilterTreeNode *child; - if (column > 0 || row >= node->childCount()) - return QModelIndex(); + if (column > 0 || row >= node->childCount()) + return QModelIndex(); - child = node->nodeAt(row); - return createIndex(row, column, child); + child = node->nodeAt(row); + return createIndex(row, column, child); } QModelIndex FilterTreeModel::index(int row, int column, - const QModelIndex &parent) const + const QModelIndex &parent) const { - const FilterTreeNode *node; + const FilterTreeNode *node; - if (!hasIndex(row, column, parent)) - return QModelIndex(); + if (!hasIndex(row, column, parent)) + return QModelIndex(); - node = indexToNode(parent); - if (node == NULL) - return QModelIndex(); + node = indexToNode(parent); + if (node == NULL) + return QModelIndex(); - return nodeIndex(node, row, column); + return nodeIndex(node, row, column); } QModelIndex FilterTreeModel::parent(const QModelIndex &ind) const { - const FilterTreeNode *node; - FilterTreeNode *parent; - int row; - QModelIndex idx; + const FilterTreeNode *node; + FilterTreeNode *parent; + int row; + QModelIndex idx; - if (!ind.isValid()) - return QModelIndex(); + if (!ind.isValid()) + return QModelIndex(); - node = indexToNode(ind); - if (node == NULL || node == fTree) - return QModelIndex(); + node = indexToNode(ind); + if (node == NULL || node == fTree) + return QModelIndex(); - parent = node->parent(); - if (parent) { - row = parent->index(); - if (row < 0) - return QModelIndex(); - idx = createIndex(row, 0, parent); - return idx; - } + parent = node->parent(); + if (parent) { + row = parent->index(); + if (row < 0) + return QModelIndex(); + idx = createIndex(row, 0, parent); + return idx; + } - return QModelIndex(); + return QModelIndex(); } bool FilterTreeModel::removeRows(int row, int count, const QModelIndex & parent) { - FilterTreeNode *node; - int i, last; + FilterTreeNode *node; + int i, last; - last = row+count-1; - if (!parent.isValid() || count < 1 || row < 0) - return false; + last = row+count-1; + if (!parent.isValid() || count < 1 || row < 0) + return false; - node = indexToNode(parent); - if (node == NULL || last >= node->childCount()) - return false; + node = indexToNode(parent); + if (node == NULL || last >= node->childCount()) + return false; - for (i = 0; i < count; i++) - node->deleteAt(row); + for (i = 0; i < count; i++) + node->deleteAt(row); - if (node != fTree && node->childCount() < 1) - return removeRow(parent.row(), parent.parent()); + if (node != fTree && node->childCount() < 1) + return removeRow(parent.row(), parent.parent()); - return true; + return true; } diff --git a/cockatrice/src/filtertreemodel.h b/cockatrice/src/filtertreemodel.h index 7e49e9b1..ac90db57 100644 --- a/cockatrice/src/filtertreemodel.h +++ b/cockatrice/src/filtertreemodel.h @@ -8,37 +8,37 @@ class CardFilter; class FilterTreeNode; class FilterTreeModel : public QAbstractItemModel { - Q_OBJECT + Q_OBJECT private: - FilterTree *fTree; + FilterTree *fTree; public slots: - void addFilter(const CardFilter *f); + void addFilter(const CardFilter *f); private slots: - void proxyBeginInsertRow(const FilterTreeNode *, int); - void proxyEndInsertRow(const FilterTreeNode *, int); - void proxyBeginRemoveRow(const FilterTreeNode *, int); - void proxyEndRemoveRow(const FilterTreeNode *, int); + void proxyBeginInsertRow(const FilterTreeNode *, int); + void proxyEndInsertRow(const FilterTreeNode *, int); + void proxyBeginRemoveRow(const FilterTreeNode *, int); + void proxyEndRemoveRow(const FilterTreeNode *, int); private: - FilterTreeNode *indexToNode(const QModelIndex &idx) const; - QModelIndex nodeIndex(const FilterTreeNode *node, int row, int column) const; + FilterTreeNode *indexToNode(const QModelIndex &idx) const; + QModelIndex nodeIndex(const FilterTreeNode *node, int row, int column) const; public: - FilterTreeModel(QObject *parent = 0); - ~FilterTreeModel(); - FilterTree *filterTree() const { return fTree; } - int rowCount(const QModelIndex &parent = QModelIndex()) const; - int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role) const; - bool setData(const QModelIndex &index, const QVariant &value, - int role = Qt::EditRole); - Qt::ItemFlags flags(const QModelIndex &index) const; - QModelIndex parent(const QModelIndex &ind) const; - QModelIndex index(int row, int column, - const QModelIndex &parent) const; - bool removeRows(int row, int count, const QModelIndex & parent); + FilterTreeModel(QObject *parent = 0); + ~FilterTreeModel(); + FilterTree *filterTree() const { return fTree; } + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole); + Qt::ItemFlags flags(const QModelIndex &index) const; + QModelIndex parent(const QModelIndex &ind) const; + QModelIndex index(int row, int column, + const QModelIndex &parent) const; + bool removeRows(int row, int count, const QModelIndex & parent); }; #endif diff --git a/cockatrice/src/keysignals.cpp b/cockatrice/src/keysignals.cpp index 1994e387..326b006e 100644 --- a/cockatrice/src/keysignals.cpp +++ b/cockatrice/src/keysignals.cpp @@ -2,48 +2,48 @@ #include bool KeySignals::eventFilter(QObject * /*object*/, QEvent *event) { - QKeyEvent *kevent; + QKeyEvent *kevent; - if(event->type() != QEvent::KeyPress) - return false; + if(event->type() != QEvent::KeyPress) + return false; - kevent = static_cast(event); - switch(kevent->key()) { - case Qt::Key_Return: - case Qt::Key_Enter: - if(kevent->modifiers() & Qt::ControlModifier) - emit onCtrlEnter(); - else - emit onEnter(); - break; - case Qt::Key_Right: - if(kevent->modifiers() & Qt::ControlModifier) - emit onCtrlRight(); - else - emit onRight(); + kevent = static_cast(event); + switch(kevent->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + if(kevent->modifiers() & Qt::ControlModifier) + emit onCtrlEnter(); + else + emit onEnter(); + break; + case Qt::Key_Right: + if(kevent->modifiers() & Qt::ControlModifier) + emit onCtrlRight(); + else + emit onRight(); - if(!filterLROn) - return false; - break; - case Qt::Key_Left: - if(kevent->modifiers() & Qt::ControlModifier) - emit onCtrlLeft(); - else - emit onLeft(); + if(!filterLROn) + return false; + break; + case Qt::Key_Left: + if(kevent->modifiers() & Qt::ControlModifier) + emit onCtrlLeft(); + else + emit onLeft(); - if(!filterLROn) - return false; - break; - case Qt::Key_Delete: - case Qt::Key_Backspace: - emit onDelete(); + if(!filterLROn) + return false; + break; + case Qt::Key_Delete: + case Qt::Key_Backspace: + emit onDelete(); - if(!filterDeleteOn) - return false; - break; - default: - return false; - } + if(!filterDeleteOn) + return false; + break; + default: + return false; + } - return true; + return true; } diff --git a/cockatrice/src/keysignals.h b/cockatrice/src/keysignals.h index 006e0ce3..78ddf1e2 100644 --- a/cockatrice/src/keysignals.h +++ b/cockatrice/src/keysignals.h @@ -2,29 +2,29 @@ #include class KeySignals : public QObject { - Q_OBJECT + Q_OBJECT private: - bool filterDeleteOn; - bool filterLROn; + bool filterDeleteOn; + bool filterLROn; signals: - void onEnter(); - void onCtrlEnter(); - void onLeft(); - void onCtrlLeft(); - void onRight(); - void onCtrlRight(); - void onDelete(); + void onEnter(); + void onCtrlEnter(); + void onLeft(); + void onCtrlLeft(); + void onRight(); + void onCtrlRight(); + void onDelete(); protected: - virtual bool eventFilter(QObject *, QEvent *event); + virtual bool eventFilter(QObject *, QEvent *event); public: - KeySignals() - : filterDeleteOn(true) - , filterLROn(true) - {} - void filterDelete(bool on) { filterDeleteOn = on; } - void filterLeftRight(bool on) { filterLROn = on; } + KeySignals() + : filterDeleteOn(true) + , filterLROn(true) + {} + void filterDelete(bool on) { filterDeleteOn = on; } + void filterLeftRight(bool on) { filterLROn = on; } }; From 040d9d15a3579c644abe9d475666da514944ba32 Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Thu, 24 Apr 2014 19:49:50 +0000 Subject: [PATCH 15/16] bug fix: move isEnabled test out of acceptCardAttr in the case of AND'ed filter terms, returning true from acceptCardAttr will be equivalent to ignoring the disabled term, but in the case of OR'ed terms, returning true will incorrectly cause all cards to be accepted. the fix is to test for whether the term is enabled before calling acceptCardAttr and continue if disabled. --- cockatrice/src/filtertree.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cockatrice/src/filtertree.cpp b/cockatrice/src/filtertree.cpp index e1dc3101..4c28028b 100644 --- a/cockatrice/src/filtertree.cpp +++ b/cockatrice/src/filtertree.cpp @@ -112,9 +112,12 @@ bool FilterItemList::testTypeAnd(const CardInfo *info, CardFilter::Attr attr) co { QList::const_iterator i; - for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) { + if (!(*i)->isEnabled()) + continue; if (!(*i)->acceptCardAttr(info, attr)) return false; + } return true; } @@ -129,9 +132,12 @@ bool FilterItemList::testTypeOr(const CardInfo *info, CardFilter::Attr attr) con { QList::const_iterator i; - for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) + for (i = childNodes.constBegin(); i != childNodes.constEnd(); i++) { + if (!(*i)->isEnabled()) + continue; if ((*i)->acceptCardAttr(info, attr)) return true; + } return false; } @@ -197,9 +203,6 @@ bool FilterItem::acceptCardAttr(const CardInfo *info, CardFilter::Attr attr) con { bool status; - if (!isEnabled()) - return true; - switch (attr) { case CardFilter::AttrName: status = acceptName(info); From 841847cda4eb7fe9512514d4ad79aa88e1af49cb Mon Sep 17 00:00:00 2001 From: sylvanbasilisk Date: Thu, 24 Apr 2014 20:17:21 +0000 Subject: [PATCH 16/16] update to hotkey settings in deck editor tab removed LEFT/RIGHT increment/decrement while the card database/quicksearch edit have focus. LEFT/RIGHT increment/decrement remains while the deck view has focus. also, now the card database delegates focus the quicksearch editor so that any characters typed while the card database has focus will narrow the search down using the quicksearch filter. `control`+`alt`+`-`/`=` now increment/decrement the mainboard and `control`+`alt`+`[`/`]` now increment/decrement the sideboard (alt could not be used alone as OSX inserts special characters using alt. --- cockatrice/src/keysignals.cpp | 48 ++++++++++++++++++++---------- cockatrice/src/keysignals.h | 19 ++++-------- cockatrice/src/tab_deck_editor.cpp | 23 +++++++------- cockatrice/src/tab_deck_editor.h | 1 - 4 files changed, 47 insertions(+), 44 deletions(-) diff --git a/cockatrice/src/keysignals.cpp b/cockatrice/src/keysignals.cpp index 326b006e..5db58cb5 100644 --- a/cockatrice/src/keysignals.cpp +++ b/cockatrice/src/keysignals.cpp @@ -11,39 +11,55 @@ bool KeySignals::eventFilter(QObject * /*object*/, QEvent *event) { switch(kevent->key()) { case Qt::Key_Return: case Qt::Key_Enter: - if(kevent->modifiers() & Qt::ControlModifier) + if (kevent->modifiers().testFlag(Qt::AltModifier) + && kevent->modifiers().testFlag(Qt::ControlModifier) ) + emit onCtrlAltEnter(); + else if (kevent->modifiers() & Qt::ControlModifier) emit onCtrlEnter(); else emit onEnter(); + break; case Qt::Key_Right: - if(kevent->modifiers() & Qt::ControlModifier) - emit onCtrlRight(); - else - emit onRight(); + emit onRight(); - if(!filterLROn) - return false; break; case Qt::Key_Left: - if(kevent->modifiers() & Qt::ControlModifier) - emit onCtrlLeft(); - else - emit onLeft(); + emit onLeft(); - if(!filterLROn) - return false; break; case Qt::Key_Delete: case Qt::Key_Backspace: emit onDelete(); - if(!filterDeleteOn) - return false; + break; + case Qt::Key_Minus: + if (kevent->modifiers().testFlag(Qt::AltModifier) + && kevent->modifiers().testFlag(Qt::ControlModifier) ) + emit onCtrlAltMinus(); + + break; + case Qt::Key_Equal: + if (kevent->modifiers().testFlag(Qt::AltModifier) + && kevent->modifiers().testFlag(Qt::ControlModifier) ) + emit onCtrlAltEqual(); + + break; + case Qt::Key_BracketLeft: + if (kevent->modifiers().testFlag(Qt::AltModifier) + && kevent->modifiers().testFlag(Qt::ControlModifier) ) + emit onCtrlAltLBracket(); + + break; + case Qt::Key_BracketRight: + if (kevent->modifiers().testFlag(Qt::AltModifier) + && kevent->modifiers().testFlag(Qt::ControlModifier) ) + emit onCtrlAltRBracket(); + break; default: return false; } - return true; + return false; } diff --git a/cockatrice/src/keysignals.h b/cockatrice/src/keysignals.h index 78ddf1e2..23a07b77 100644 --- a/cockatrice/src/keysignals.h +++ b/cockatrice/src/keysignals.h @@ -4,27 +4,18 @@ class KeySignals : public QObject { Q_OBJECT -private: - bool filterDeleteOn; - bool filterLROn; - signals: void onEnter(); void onCtrlEnter(); + void onCtrlAltEnter(); void onLeft(); - void onCtrlLeft(); void onRight(); - void onCtrlRight(); void onDelete(); + void onCtrlAltMinus(); + void onCtrlAltEqual(); + void onCtrlAltLBracket(); + void onCtrlAltRBracket(); protected: virtual bool eventFilter(QObject *, QEvent *event); - -public: - KeySignals() - : filterDeleteOn(true) - , filterLROn(true) - {} - void filterDelete(bool on) { filterDeleteOn = on; } - void filterLeftRight(bool on) { filterLROn = on; } }; diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 075ee918..91c8819e 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -54,15 +54,17 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) searchLabel = new QLabel(); searchEdit = new SearchLineEdit; searchLabel->setBuddy(searchEdit); + setFocusProxy(searchEdit); + setFocusPolicy(Qt::ClickFocus); - searchKeySignals.filterDelete(false); searchEdit->installEventFilter(&searchKeySignals); connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &))); connect(&searchKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); - connect(&searchKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); - connect(&searchKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); - connect(&searchKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); - connect(&searchKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltEqual()), this, SLOT(actAddCard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltRBracket()), this, SLOT(actAddCardToSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltMinus()), this, SLOT(actDecrementCard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltLBracket()), this, SLOT(actDecrementCardFromSideboard())); + connect(&searchKeySignals, SIGNAL(onCtrlAltEnter()), this, SLOT(actAddCardToSideboard())); connect(&searchKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); QToolBar *deckEditToolBar = new QToolBar; @@ -81,6 +83,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) databaseDisplayModel->sort(0, Qt::AscendingOrder); databaseView = new QTreeView(); + databaseView->setFocusProxy(searchEdit); databaseView->setModel(databaseDisplayModel); databaseView->setUniformRowHeights(true); databaseView->setRootIsDecorated(false); @@ -90,13 +93,6 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) databaseView->resizeColumnToContents(0); connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &))); connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard())); - databaseView->installEventFilter(&dbViewKeySignals); - connect(&dbViewKeySignals, SIGNAL(onEnter()), this, SLOT(actAddCard())); - connect(&dbViewKeySignals, SIGNAL(onRight()), this, SLOT(actAddCard())); - connect(&dbViewKeySignals, SIGNAL(onCtrlRight()), this, SLOT(actAddCardToSideboard())); - connect(&dbViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrementCard())); - connect(&dbViewKeySignals, SIGNAL(onCtrlLeft()), this, SLOT(actDecrementCardFromSideboard())); - connect(&dbViewKeySignals, SIGNAL(onCtrlEnter()), this, SLOT(actAddCardToSideboard())); searchEdit->setTreeView(databaseView); QVBoxLayout *leftFrame = new QVBoxLayout; @@ -137,10 +133,11 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) deckView->setModel(deckModel); deckView->setUniformRowHeights(true); deckView->header()->setResizeMode(QHeaderView::ResizeToContents); - deckViewKeySignals.filterLeftRight(false); deckView->installEventFilter(&deckViewKeySignals); connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); connect(&deckViewKeySignals, SIGNAL(onEnter()), this, SLOT(actIncrement())); + connect(&deckViewKeySignals, SIGNAL(onCtrlAltEqual()), this, SLOT(actIncrement())); + connect(&deckViewKeySignals, SIGNAL(onCtrlAltMinus()), this, SLOT(actDecrement())); connect(&deckViewKeySignals, SIGNAL(onRight()), this, SLOT(actIncrement())); connect(&deckViewKeySignals, SIGNAL(onLeft()), this, SLOT(actDecrement())); connect(&deckViewKeySignals, SIGNAL(onDelete()), this, SLOT(actRemoveCard())); diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index bcdca8d3..3acf1d15 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -80,7 +80,6 @@ private: DeckListModel *deckModel; QTreeView *databaseView; - KeySignals dbViewKeySignals; QTreeView *deckView; KeySignals deckViewKeySignals; CardFrame *cardInfo;