Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Donald Haase
Cockatrice
Commits
3202243e
Commit
3202243e
authored
Jan 21, 2014
by
sylvanbasilisk
Browse files
connect filter list functionality to the CardDatabaseDisplayModel class
enable/disable check boxes still not functional
parent
863e437d
Changes
9
Hide whitespace changes
Inline
Side-by-side
cockatrice/src/carddatabasemodel.cpp
View file @
3202243e
#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
<
CardDatabaseModel
*>
(
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
();
}
cockatrice/src/carddatabasemodel.h
View file @
3202243e
...
...
@@ -7,6 +7,8 @@
#include
<QSet>
#include
"carddatabase.h"
class
FilterList
;
class
CardDatabaseModel
:
public
QAbstractListModel
{
Q_OBJECT
public:
...
...
@@ -36,8 +38,10 @@ private:
FilterBool
isToken
;
QString
cardNameBeginning
,
cardName
,
cardText
;
QSet
<
QString
>
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
cockatrice/src/cardfilter.cpp
View file @
3202243e
...
...
@@ -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
""
;
}
...
...
cockatrice/src/cardfilter.h
View file @
3202243e
...
...
@@ -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
};
...
...
cockatrice/src/filterlist.cpp
View file @
3202243e
#include
"filterlist.h"
#include
"CardFilter.h"
#include
"cardfilter.h"
#include
"carddatabase.h"
#include
<QList>
...
...
@@ -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
<
LogicMap
*>::
const_iterator
i
;
for
(
i
=
logicAttrs
.
constBegin
();
i
!=
logicAttrs
.
constEnd
();
i
++
)
if
(
!
testAttr
(
info
,
*
i
))
return
false
;
return
true
;
}
cockatrice/src/filterlist.h
View file @
3202243e
...
...
@@ -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
<
LogicMap
*>
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
cockatrice/src/filterlistmodel.cpp
View file @
3202243e
...
...
@@ -6,18 +6,18 @@
FilterListModel
::
FilterListModel
(
QObject
*
parent
)
:
QAbstractItemModel
(
parent
)
{
f
ilter
List
=
new
FilterList
;
connect
(
f
ilter
List
,
fList
=
new
FilterList
;
connect
(
fList
,
SIGNAL
(
preInsertRow
(
const
FilterListNode
*
,
int
)),
this
,
SLOT
(
proxyBeginInsertRow
(
const
FilterListNode
*
,
int
)));
connect
(
f
ilter
List
,
connect
(
fList
,
SIGNAL
(
postInsertRow
(
const
FilterListNode
*
,
int
)),
this
,
SLOT
(
proxyEndInsertRow
(
const
FilterListNode
*
,
int
)));
}
FilterListModel
::~
FilterListModel
()
{
delete
f
ilter
List
;
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
f
ilter
List
;
return
fList
;
ip
=
idx
.
internalPointer
();
if
(
ip
==
NULL
)
return
f
ilter
List
;
return
fList
;
node
=
static_cast
<
FilterListNode
*>
(
ip
);
return
node
;
...
...
@@ -57,7 +57,7 @@ FilterListNode *FilterListModel::indexToNode(const QModelIndex &idx) const
void
FilterListModel
::
addFilter
(
const
CardFilter
*
f
)
{
emit
layoutAboutToBeChanged
();
f
ilter
List
->
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
==
f
ilter
List
)
if
(
node
==
NULL
||
node
==
fList
)
return
false
;
Qt
::
CheckState
state
=
static_cast
<
Qt
::
CheckState
>
(
value
.
toInt
());
...
...
@@ -161,7 +161,7 @@ Qt::ItemFlags FilterListModel::flags(const QModelIndex &index) const
return
0
;
result
=
Qt
::
ItemIsEnabled
;
if
(
node
==
f
ilter
List
)
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
==
f
ilter
List
)
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
!=
f
ilter
List
&&
node
->
childCount
()
<
1
)
if
(
node
!=
fList
&&
node
->
childCount
()
<
1
)
return
removeRow
(
parent
.
row
(),
parent
.
parent
());
return
true
;
...
...
cockatrice/src/filterlistmodel.h
View file @
3202243e
...
...
@@ -10,7 +10,7 @@ class FilterListNode;
class
FilterListModel
:
public
QAbstractItemModel
{
Q_OBJECT
private:
FilterList
*
f
ilter
List
;
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
;
...
...
cockatrice/src/tab_deck_editor.cpp
View file @
3202243e
...
...
@@ -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
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment