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
dc0f21cc
Commit
dc0f21cc
authored
Jan 19, 2011
by
brukie
Browse files
Threaded picture caching
parent
9ece3cb7
Changes
9
Hide whitespace changes
Inline
Side-by-side
cockatrice/cockatrice.pro
View file @
dc0f21cc
...
@@ -28,7 +28,6 @@ HEADERS += src/abstractcounter.h \
...
@@ -28,7 +28,6 @@ HEADERS += src/abstractcounter.h \
src
/
handcounter
.
h
\
src
/
handcounter
.
h
\
src
/
carddatabase
.
h
\
src
/
carddatabase
.
h
\
src
/
gameview
.
h
\
src
/
gameview
.
h
\
src
/
deck_picturecacher
.
h
\
src
/
decklistmodel
.
h
\
src
/
decklistmodel
.
h
\
src
/
dlg_load_deck_from_clipboard
.
h
\
src
/
dlg_load_deck_from_clipboard
.
h
\
src
/
dlg_load_remote_deck
.
h
\
src
/
dlg_load_remote_deck
.
h
\
...
@@ -111,7 +110,6 @@ SOURCES += src/abstractcounter.cpp \
...
@@ -111,7 +110,6 @@ SOURCES += src/abstractcounter.cpp \
src
/
handcounter
.
cpp
\
src
/
handcounter
.
cpp
\
src
/
carddatabase
.
cpp
\
src
/
carddatabase
.
cpp
\
src
/
gameview
.
cpp
\
src
/
gameview
.
cpp
\
src
/
deck_picturecacher
.
cpp
\
src
/
decklistmodel
.
cpp
\
src
/
decklistmodel
.
cpp
\
src
/
dlg_load_deck_from_clipboard
.
cpp
\
src
/
dlg_load_deck_from_clipboard
.
cpp
\
src
/
dlg_load_remote_deck
.
cpp
\
src
/
dlg_load_remote_deck
.
cpp
\
...
...
cockatrice/src/carddatabase.cpp
View file @
dc0f21cc
...
@@ -60,6 +60,62 @@ void SetList::sortByKey()
...
@@ -60,6 +60,62 @@ void SetList::sortByKey()
qSort
(
begin
(),
end
(),
CompareFunctor
());
qSort
(
begin
(),
end
(),
CompareFunctor
());
}
}
PictureLoadingThread
::
PictureLoadingThread
(
QObject
*
parent
)
:
QThread
(
parent
)
{
}
PictureLoadingThread
::~
PictureLoadingThread
()
{
quit
();
wait
();
}
void
PictureLoadingThread
::
run
()
{
forever
{
mutex
.
lock
();
if
(
loadQueue
.
isEmpty
())
{
mutex
.
unlock
();
return
;
}
CardInfo
*
card
=
loadQueue
.
takeFirst
();
QString
correctedName
=
card
->
getCorrectedName
();
QString
picsPath
=
_picsPath
;
SetList
sortedSets
=
card
->
getSets
();
mutex
.
unlock
();
sortedSets
.
sortByKey
();
QImage
image
;
for
(
int
i
=
0
;
i
<
sortedSets
.
size
();
i
++
)
{
if
(
image
.
load
(
QString
(
"%1/%2/%3.full.jpg"
).
arg
(
picsPath
).
arg
(
sortedSets
[
i
]
->
getShortName
()).
arg
(
correctedName
)))
break
;
if
(
image
.
load
(
QString
(
"%1/%2/%3%4.full.jpg"
).
arg
(
picsPath
).
arg
(
sortedSets
[
i
]
->
getShortName
()).
arg
(
correctedName
).
arg
(
1
)))
break
;
}
if
(
image
.
isNull
())
image
.
load
(
QString
(
"%1/%2/%3.full.jpg"
).
arg
(
picsPath
).
arg
(
"downloadedPics"
).
arg
(
correctedName
));
emit
imageLoaded
(
card
,
image
);
}
}
void
PictureLoadingThread
::
loadImage
(
CardInfo
*
card
)
{
QMutexLocker
locker
(
&
mutex
);
loadQueue
.
append
(
card
);
if
(
!
isRunning
())
start
(
LowPriority
);
}
void
PictureLoadingThread
::
setPicsPath
(
const
QString
&
path
)
{
QMutexLocker
locker
(
&
mutex
);
_picsPath
=
path
;
}
CardInfo
::
CardInfo
(
CardDatabase
*
_db
,
const
QString
&
_name
,
const
QString
&
_manacost
,
const
QString
&
_cardtype
,
const
QString
&
_powtough
,
const
QString
&
_text
,
const
QStringList
&
_colors
,
bool
_cipt
,
int
_tableRow
,
const
SetList
&
_sets
,
const
QString
&
_picURL
)
CardInfo
::
CardInfo
(
CardDatabase
*
_db
,
const
QString
&
_name
,
const
QString
&
_manacost
,
const
QString
&
_cardtype
,
const
QString
&
_powtough
,
const
QString
&
_text
,
const
QStringList
&
_colors
,
bool
_cipt
,
int
_tableRow
,
const
SetList
&
_sets
,
const
QString
&
_picURL
)
:
db
(
_db
),
name
(
_name
),
sets
(
_sets
),
manacost
(
_manacost
),
cardtype
(
_cardtype
),
powtough
(
_powtough
),
text
(
_text
),
colors
(
_colors
),
picURL
(
_picURL
),
cipt
(
_cipt
),
tableRow
(
_tableRow
),
pixmap
(
NULL
)
:
db
(
_db
),
name
(
_name
),
sets
(
_sets
),
manacost
(
_manacost
),
cardtype
(
_cardtype
),
powtough
(
_powtough
),
text
(
_text
),
colors
(
_colors
),
picURL
(
_picURL
),
cipt
(
_cipt
),
tableRow
(
_tableRow
),
pixmap
(
NULL
)
{
{
...
@@ -119,36 +175,24 @@ QPixmap *CardInfo::loadPixmap()
...
@@ -119,36 +175,24 @@ QPixmap *CardInfo::loadPixmap()
if
(
pixmap
)
if
(
pixmap
)
return
pixmap
;
return
pixmap
;
pixmap
=
new
QPixmap
();
pixmap
=
new
QPixmap
();
QString
picsPath
=
settingsCache
->
getPicsPath
();
if
(
!
QDir
(
picsPath
).
exists
())
return
pixmap
;
if
(
getName
().
isEmpty
())
{
if
(
getName
().
isEmpty
())
{
pixmap
->
load
(
settingsCache
->
getCardBackPicturePath
());
pixmap
->
load
(
settingsCache
->
getCardBackPicturePath
());
return
pixmap
;
return
pixmap
;
}
}
SetList
sortedSets
=
sets
;
db
->
loadImage
(
this
);
sortedSets
.
sortByKey
();
QString
debugOutput
=
QString
(
"CardDatabase: loading pixmap for '%1' from "
).
arg
(
getName
());
for
(
int
i
=
0
;
i
<
sortedSets
.
size
();
i
++
)
debugOutput
.
append
(
QString
(
"%1, "
).
arg
(
sortedSets
[
i
]
->
getShortName
()));
qDebug
(
debugOutput
.
toLatin1
());
QString
correctedName
=
getCorrectedName
();
for
(
int
i
=
0
;
i
<
sortedSets
.
size
();
i
++
)
{
if
(
pixmap
->
load
(
QString
(
"%1/%2/%3.full.jpg"
).
arg
(
picsPath
).
arg
(
sortedSets
[
i
]
->
getShortName
()).
arg
(
correctedName
)))
return
pixmap
;
if
(
pixmap
->
load
(
QString
(
"%1/%2/%3%4.full.jpg"
).
arg
(
picsPath
).
arg
(
sortedSets
[
i
]
->
getShortName
()).
arg
(
correctedName
).
arg
(
1
)))
return
pixmap
;
}
if
(
pixmap
->
load
(
QString
(
"%1/%2/%3.full.jpg"
).
arg
(
picsPath
).
arg
(
"downloadedPics"
).
arg
(
correctedName
)))
return
pixmap
;
if
(
settingsCache
->
getPicDownload
())
db
->
startPicDownload
(
this
);
return
pixmap
;
return
pixmap
;
}
}
void
CardInfo
::
imageLoaded
(
const
QImage
&
image
)
{
if
(
!
image
.
isNull
())
{
*
pixmap
=
QPixmap
::
fromImage
(
image
);
emit
pixmapUpdated
();
}
else
if
(
settingsCache
->
getPicDownload
())
db
->
startPicDownload
(
this
);
}
QPixmap
*
CardInfo
::
getPixmap
(
QSize
size
)
QPixmap
*
CardInfo
::
getPixmap
(
QSize
size
)
{
{
qDebug
(
QString
(
"CardInfo::getPixmap(%1, %2) for %3"
).
arg
(
size
.
width
()).
arg
(
size
.
height
()).
arg
(
getName
()).
toLatin1
());
qDebug
(
QString
(
"CardInfo::getPixmap(%1, %2) for %3"
).
arg
(
size
.
width
()).
arg
(
size
.
height
()).
arg
(
getName
()).
toLatin1
());
...
@@ -243,6 +287,11 @@ CardDatabase::CardDatabase(QObject *parent)
...
@@ -243,6 +287,11 @@ CardDatabase::CardDatabase(QObject *parent)
connect
(
networkManager
,
SIGNAL
(
finished
(
QNetworkReply
*
)),
this
,
SLOT
(
picDownloadFinished
(
QNetworkReply
*
)));
connect
(
networkManager
,
SIGNAL
(
finished
(
QNetworkReply
*
)),
this
,
SLOT
(
picDownloadFinished
(
QNetworkReply
*
)));
loadCardDatabase
();
loadCardDatabase
();
loadingThread
=
new
PictureLoadingThread
(
this
);
loadingThread
->
setPicsPath
(
settingsCache
->
getPicsPath
());
connect
(
loadingThread
,
SIGNAL
(
imageLoaded
(
CardInfo
*
,
QImage
)),
this
,
SLOT
(
imageLoaded
(
CardInfo
*
,
QImage
)));
loadingThread
->
start
();
noCard
=
new
CardInfo
(
this
);
noCard
=
new
CardInfo
(
this
);
noCard
->
loadPixmap
();
// cache pixmap for card back
noCard
->
loadPixmap
();
// cache pixmap for card back
...
@@ -532,3 +581,21 @@ QStringList CardDatabase::getAllMainCardTypes() const
...
@@ -532,3 +581,21 @@ QStringList CardDatabase::getAllMainCardTypes() const
types
.
insert
(
cardIterator
.
next
().
value
()
->
getMainCardType
());
types
.
insert
(
cardIterator
.
next
().
value
()
->
getMainCardType
());
return
types
.
toList
();
return
types
.
toList
();
}
}
void
CardDatabase
::
cacheCardPixmaps
(
const
QStringList
&
cardNames
)
{
qDebug
(
"pixmapCache started"
);
for
(
int
i
=
0
;
i
<
cardNames
.
size
();
++
i
)
getCard
(
cardNames
[
i
])
->
loadPixmap
();
qDebug
(
"pixmapCache finished"
);
}
void
CardDatabase
::
loadImage
(
CardInfo
*
card
)
{
loadingThread
->
loadImage
(
card
);
}
void
CardDatabase
::
imageLoaded
(
CardInfo
*
card
,
QImage
image
)
{
card
->
imageLoaded
(
image
);
}
\ No newline at end of file
cockatrice/src/carddatabase.h
View file @
dc0f21cc
...
@@ -8,6 +8,8 @@
...
@@ -8,6 +8,8 @@
#include
<QList>
#include
<QList>
#include
<QXmlStreamReader>
#include
<QXmlStreamReader>
#include
<QNetworkRequest>
#include
<QNetworkRequest>
#include
<QThread>
#include
<QMutex>
class
CardDatabase
;
class
CardDatabase
;
class
CardInfo
;
class
CardInfo
;
...
@@ -35,6 +37,23 @@ public:
...
@@ -35,6 +37,23 @@ public:
void
sortByKey
();
void
sortByKey
();
};
};
class
PictureLoadingThread
:
public
QThread
{
Q_OBJECT
private:
QString
_picsPath
;
QList
<
CardInfo
*>
loadQueue
;
QMutex
mutex
;
protected:
void
run
();
public:
PictureLoadingThread
(
QObject
*
parent
);
~
PictureLoadingThread
();
void
setPicsPath
(
const
QString
&
path
);
void
loadImage
(
CardInfo
*
card
);
signals:
void
imageLoaded
(
CardInfo
*
card
,
const
QImage
&
image
);
};
class
CardInfo
:
public
QObject
{
class
CardInfo
:
public
QObject
{
Q_OBJECT
Q_OBJECT
private:
private:
...
@@ -85,6 +104,7 @@ public:
...
@@ -85,6 +104,7 @@ public:
QPixmap
*
getPixmap
(
QSize
size
);
QPixmap
*
getPixmap
(
QSize
size
);
void
clearPixmapCache
();
void
clearPixmapCache
();
void
clearPixmapCacheMiss
();
void
clearPixmapCacheMiss
();
void
imageLoaded
(
const
QImage
&
image
);
public
slots
:
public
slots
:
void
updatePixmapCache
();
void
updatePixmapCache
();
signals:
signals:
...
@@ -102,6 +122,7 @@ protected:
...
@@ -102,6 +122,7 @@ protected:
bool
downloadRunning
;
bool
downloadRunning
;
bool
loadSuccess
;
bool
loadSuccess
;
CardInfo
*
noCard
;
CardInfo
*
noCard
;
PictureLoadingThread
*
loadingThread
;
private:
private:
void
loadCardsFromXml
(
QXmlStreamReader
&
xml
);
void
loadCardsFromXml
(
QXmlStreamReader
&
xml
);
void
loadSetsFromXml
(
QXmlStreamReader
&
xml
);
void
loadSetsFromXml
(
QXmlStreamReader
&
xml
);
...
@@ -120,6 +141,8 @@ public:
...
@@ -120,6 +141,8 @@ public:
QStringList
getAllColors
()
const
;
QStringList
getAllColors
()
const
;
QStringList
getAllMainCardTypes
()
const
;
QStringList
getAllMainCardTypes
()
const
;
bool
getLoadSuccess
()
const
{
return
loadSuccess
;
}
bool
getLoadSuccess
()
const
{
return
loadSuccess
;
}
void
cacheCardPixmaps
(
const
QStringList
&
cardNames
);
void
loadImage
(
CardInfo
*
card
);
public
slots
:
public
slots
:
void
clearPixmapCache
();
void
clearPixmapCache
();
bool
loadCardDatabase
(
const
QString
&
path
);
bool
loadCardDatabase
(
const
QString
&
path
);
...
@@ -127,6 +150,7 @@ public slots:
...
@@ -127,6 +150,7 @@ public slots:
private
slots
:
private
slots
:
void
picDownloadFinished
(
QNetworkReply
*
reply
);
void
picDownloadFinished
(
QNetworkReply
*
reply
);
void
picDownloadChanged
();
void
picDownloadChanged
();
void
imageLoaded
(
CardInfo
*
card
,
QImage
image
);
};
};
#endif
#endif
cockatrice/src/deck_picturecacher.cpp
deleted
100644 → 0
View file @
9ece3cb7
#include
<QProgressDialog>
#include
"deck_picturecacher.h"
#include
"decklist.h"
#include
"carddatabase.h"
#include
"main.h"
void
Deck_PictureCacher
::
cacheHelper
(
InnerDecklistNode
*
item
,
QProgressDialog
*
progress
)
{
for
(
int
i
=
0
;
i
<
item
->
size
();
i
++
)
{
DecklistCardNode
*
node
=
dynamic_cast
<
DecklistCardNode
*>
(
item
->
at
(
i
));
if
(
node
)
{
db
->
getCard
(
node
->
getName
())
->
loadPixmap
();
progress
->
setValue
(
progress
->
value
()
+
1
);
}
else
cacheHelper
(
dynamic_cast
<
InnerDecklistNode
*>
(
item
->
at
(
i
)),
progress
);
}
}
void
Deck_PictureCacher
::
cachePictures
(
DeckList
*
deck
,
QWidget
*
parent
)
{
int
totalCards
=
deck
->
getRoot
()
->
recursiveCount
();
QProgressDialog
progress
(
tr
(
"Caching card pictures..."
),
QString
(),
0
,
totalCards
,
parent
);
progress
.
setMinimumDuration
(
1000
);
progress
.
setWindowModality
(
Qt
::
WindowModal
);
cacheHelper
(
deck
->
getRoot
(),
&
progress
);
}
\ No newline at end of file
cockatrice/src/deck_picturecacher.h
deleted
100644 → 0
View file @
9ece3cb7
#ifndef DECK_PICTURECACHER_H
#define DECK_PICTURECACHER_H
#include
<QObject>
class
InnerDecklistNode
;
class
QProgressDialog
;
class
DeckList
;
class
QWidget
;
class
Deck_PictureCacher
:
public
QObject
{
Q_OBJECT
private:
static
void
cacheHelper
(
InnerDecklistNode
*
item
,
QProgressDialog
*
progress
);
public:
static
void
cachePictures
(
DeckList
*
deck
,
QWidget
*
parent
);
};
#endif
cockatrice/src/tab_game.cpp
View file @
dc0f21cc
...
@@ -18,7 +18,6 @@
...
@@ -18,7 +18,6 @@
#include
"zoneviewwidget.h"
#include
"zoneviewwidget.h"
#include
"deckview.h"
#include
"deckview.h"
#include
"decklist.h"
#include
"decklist.h"
#include
"deck_picturecacher.h"
#include
"protocol_items.h"
#include
"protocol_items.h"
#include
"dlg_load_remote_deck.h"
#include
"dlg_load_remote_deck.h"
#include
"abstractclient.h"
#include
"abstractclient.h"
...
@@ -26,6 +25,7 @@
...
@@ -26,6 +25,7 @@
#include
"arrowitem.h"
#include
"arrowitem.h"
#include
"main.h"
#include
"main.h"
#include
"settingscache.h"
#include
"settingscache.h"
#include
"carddatabase.h"
ReadyStartButton
::
ReadyStartButton
(
QWidget
*
parent
)
ReadyStartButton
::
ReadyStartButton
(
QWidget
*
parent
)
:
QPushButton
(
parent
),
readyStart
(
false
)
:
QPushButton
(
parent
),
readyStart
(
false
)
...
@@ -131,7 +131,7 @@ void DeckViewContainer::deckSelectFinished(ProtocolResponse *r)
...
@@ -131,7 +131,7 @@ void DeckViewContainer::deckSelectFinished(ProtocolResponse *r)
if
(
!
resp
)
if
(
!
resp
)
return
;
return
;
Deck_PictureCacher
::
cachePicture
s
(
resp
->
getDeck
()
,
this
);
db
->
cacheCardPixmap
s
(
resp
->
getDeck
()
->
getCardList
()
);
deckView
->
setDeck
(
new
DeckList
(
resp
->
getDeck
()));
deckView
->
setDeck
(
new
DeckList
(
resp
->
getDeck
()));
readyStartButton
->
setEnabled
(
true
);
readyStartButton
->
setEnabled
(
true
);
}
}
...
@@ -508,7 +508,7 @@ void TabGame::eventGameStateChanged(Event_GameStateChanged *event, GameEventCont
...
@@ -508,7 +508,7 @@ void TabGame::eventGameStateChanged(Event_GameStateChanged *event, GameEventCont
}
}
player
->
processPlayerInfo
(
pl
);
player
->
processPlayerInfo
(
pl
);
if
(
player
->
getLocal
()
&&
!
pl
->
getDeck
()
->
isEmpty
())
{
if
(
player
->
getLocal
()
&&
!
pl
->
getDeck
()
->
isEmpty
())
{
Deck_PictureCacher
::
cachePictures
(
pl
->
getDeck
(),
this
);
db
->
cacheCardPixmaps
(
pl
->
getDeck
()
->
getCardList
()
);
deckViewContainers
.
value
(
player
->
getId
())
->
setDeck
(
new
DeckList
(
pl
->
getDeck
()));
deckViewContainers
.
value
(
player
->
getId
())
->
setDeck
(
new
DeckList
(
pl
->
getDeck
()));
}
}
}
}
...
...
cockatrice/src/window_deckeditor.cpp
View file @
dc0f21cc
...
@@ -22,7 +22,6 @@
...
@@ -22,7 +22,6 @@
#include
"carddatabasemodel.h"
#include
"carddatabasemodel.h"
#include
"decklistmodel.h"
#include
"decklistmodel.h"
#include
"cardinfowidget.h"
#include
"cardinfowidget.h"
#include
"deck_picturecacher.h"
#include
"dlg_cardsearch.h"
#include
"dlg_cardsearch.h"
#include
"dlg_load_deck_from_clipboard.h"
#include
"dlg_load_deck_from_clipboard.h"
#include
"main.h"
#include
"main.h"
...
@@ -466,8 +465,8 @@ void WndDeckEditor::setDeck(DeckList *_deck, const QString &_lastFileName, DeckL
...
@@ -466,8 +465,8 @@ void WndDeckEditor::setDeck(DeckList *_deck, const QString &_lastFileName, DeckL
deckModel
->
sort
(
1
);
deckModel
->
sort
(
1
);
deckView
->
expandAll
();
deckView
->
expandAll
();
setWindowModified
(
false
);
setWindowModified
(
false
);
Deck_PictureCacher
::
cachePictures
(
_deck
,
this
);
db
->
cacheCardPixmaps
(
_deck
->
getCardList
()
);
deckView
->
expandAll
();
deckView
->
expandAll
();
setWindowModified
(
false
);
setWindowModified
(
false
);
}
}
common/decklist.cpp
View file @
dc0f21cc
...
@@ -468,6 +468,24 @@ void DeckList::cleanList()
...
@@ -468,6 +468,24 @@ void DeckList::cleanList()
setComments
();
setComments
();
}
}
void
DeckList
::
getCardListHelper
(
InnerDecklistNode
*
item
,
QSet
<
QString
>
&
result
)
const
{
for
(
int
i
=
0
;
i
<
item
->
size
();
++
i
)
{
DecklistCardNode
*
node
=
dynamic_cast
<
DecklistCardNode
*>
(
item
->
at
(
i
));
if
(
node
)
result
.
insert
(
node
->
getName
());
else
getCardListHelper
(
dynamic_cast
<
InnerDecklistNode
*>
(
item
->
at
(
i
)),
result
);
}
}
QStringList
DeckList
::
getCardList
()
const
{
QSet
<
QString
>
result
;
getCardListHelper
(
root
,
result
);
return
result
.
toList
();
}
DecklistCardNode
*
DeckList
::
addCard
(
const
QString
&
cardName
,
const
QString
&
zoneName
)
DecklistCardNode
*
DeckList
::
addCard
(
const
QString
&
cardName
,
const
QString
&
zoneName
)
{
{
InnerDecklistNode
*
zoneNode
=
dynamic_cast
<
InnerDecklistNode
*>
(
root
->
findChild
(
zoneName
));
InnerDecklistNode
*
zoneNode
=
dynamic_cast
<
InnerDecklistNode
*>
(
root
->
findChild
(
zoneName
));
...
...
common/decklist.h
View file @
dc0f21cc
...
@@ -6,6 +6,7 @@
...
@@ -6,6 +6,7 @@
#include
<QPair>
#include
<QPair>
#include
<QObject>
#include
<QObject>
#include
<QStringList>
#include
<QStringList>
#include
<QSet>
#include
"serializable_item.h"
#include
"serializable_item.h"
class
CardDatabase
;
class
CardDatabase
;
...
@@ -115,6 +116,7 @@ private:
...
@@ -115,6 +116,7 @@ private:
InnerDecklistNode
*
currentZone
;
InnerDecklistNode
*
currentZone
;
SideboardPlan
*
currentSideboardPlan
;
SideboardPlan
*
currentSideboardPlan
;
QString
currentElementText
;
QString
currentElementText
;
void
getCardListHelper
(
InnerDecklistNode
*
node
,
QSet
<
QString
>
&
result
)
const
;
signals:
signals:
void
deckLoaded
();
void
deckLoaded
();
public
slots
:
public
slots
:
...
@@ -149,6 +151,7 @@ public:
...
@@ -149,6 +151,7 @@ public:
void
cleanList
();
void
cleanList
();
bool
isEmpty
()
const
{
return
root
->
isEmpty
()
&&
name
.
isEmpty
()
&&
comments
.
isEmpty
()
&&
sideboardPlans
.
isEmpty
();
}
bool
isEmpty
()
const
{
return
root
->
isEmpty
()
&&
name
.
isEmpty
()
&&
comments
.
isEmpty
()
&&
sideboardPlans
.
isEmpty
();
}
QStringList
getCardList
()
const
;
InnerDecklistNode
*
getRoot
()
const
{
return
root
;
}
InnerDecklistNode
*
getRoot
()
const
{
return
root
;
}
DecklistCardNode
*
addCard
(
const
QString
&
cardName
,
const
QString
&
zoneName
);
DecklistCardNode
*
addCard
(
const
QString
&
cardName
,
const
QString
&
zoneName
);
...
...
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