mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-01-13 13:37:36 -08:00
Compare commits
1 Commits
master
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b395ef555a |
@@ -39,34 +39,6 @@ CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
|
||||
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::onCardRemoval);
|
||||
}
|
||||
|
||||
// Just here so it can get overwritten in subclasses.
|
||||
void CardGroupDisplayWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
QWidget::resizeEvent(event);
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// User Interaction
|
||||
// =====================================================================================================================
|
||||
|
||||
void CardGroupDisplayWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mousePressEvent(event);
|
||||
if (selectionModel) {
|
||||
selectionModel->clearSelection();
|
||||
}
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card)
|
||||
{
|
||||
emit cardClicked(event, card);
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::onHover(const ExactCard &card)
|
||||
{
|
||||
emit cardHovered(card);
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
|
||||
{
|
||||
auto proxyModel = qobject_cast<QAbstractProxyModel *>(selectionModel->model());
|
||||
@@ -104,9 +76,15 @@ void CardGroupDisplayWidget::onSelectionChanged(const QItemSelection &selected,
|
||||
}
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// Display Widget Management
|
||||
// =====================================================================================================================
|
||||
void CardGroupDisplayWidget::clearAllDisplayWidgets()
|
||||
{
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
auto displayWidget = indexToWidgetMap.value(idx);
|
||||
removeFromLayout(displayWidget);
|
||||
indexToWidgetMap.remove(idx);
|
||||
delete displayWidget;
|
||||
}
|
||||
}
|
||||
|
||||
QWidget *CardGroupDisplayWidget::constructWidgetForIndex(QPersistentModelIndex index)
|
||||
{
|
||||
@@ -156,20 +134,6 @@ void CardGroupDisplayWidget::updateCardDisplays()
|
||||
}
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::clearAllDisplayWidgets()
|
||||
{
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
auto displayWidget = indexToWidgetMap.value(idx);
|
||||
removeFromLayout(displayWidget);
|
||||
indexToWidgetMap.remove(idx);
|
||||
delete displayWidget;
|
||||
}
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// DeckListModel Signal Responses
|
||||
// =====================================================================================================================
|
||||
|
||||
void CardGroupDisplayWidget::onCardAddition(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
if (!trackedIndex.isValid()) {
|
||||
@@ -214,4 +178,27 @@ void CardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSort
|
||||
|
||||
clearAllDisplayWidgets();
|
||||
updateCardDisplays();
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
QWidget::mousePressEvent(event);
|
||||
if (selectionModel) {
|
||||
selectionModel->clearSelection();
|
||||
}
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card)
|
||||
{
|
||||
emit cardClicked(event, card);
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::onHover(const ExactCard &card)
|
||||
{
|
||||
emit cardHovered(card);
|
||||
}
|
||||
|
||||
void CardGroupDisplayWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
QWidget::resizeEvent(event);
|
||||
}
|
||||
@@ -23,7 +23,6 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
|
||||
displayType(_displayType), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity),
|
||||
cardSizeWidget(_cardSizeWidget)
|
||||
{
|
||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
layout = new QVBoxLayout(this);
|
||||
setLayout(layout);
|
||||
|
||||
@@ -47,20 +46,6 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
|
||||
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval);
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// User Interaction
|
||||
// =====================================================================================================================
|
||||
|
||||
void DeckCardZoneDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card)
|
||||
{
|
||||
emit cardClicked(event, card, zoneName);
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::onHover(const ExactCard &card)
|
||||
{
|
||||
emit cardHovered(card);
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
|
||||
{
|
||||
for (auto &range : selected) {
|
||||
@@ -84,9 +69,17 @@ void DeckCardZoneDisplayWidget::onSelectionChanged(const QItemSelection &selecte
|
||||
}
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// Display Widget Management
|
||||
// =====================================================================================================================
|
||||
void DeckCardZoneDisplayWidget::cleanupInvalidCardGroup(CardGroupDisplayWidget *displayWidget)
|
||||
{
|
||||
cardGroupLayout->removeWidget(displayWidget);
|
||||
displayWidget->setParent(nullptr);
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
if (!idx.isValid()) {
|
||||
indexToWidgetMap.remove(idx);
|
||||
}
|
||||
}
|
||||
delete displayWidget;
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::constructAppropriateWidget(QPersistentModelIndex index)
|
||||
{
|
||||
@@ -148,45 +141,6 @@ void DeckCardZoneDisplayWidget::displayCards()
|
||||
}
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType)
|
||||
{
|
||||
displayType = _displayType;
|
||||
QLayoutItem *item;
|
||||
while ((item = cardGroupLayout->takeAt(0)) != nullptr) {
|
||||
if (item->widget()) {
|
||||
item->widget()->deleteLater();
|
||||
} else if (item->layout()) {
|
||||
item->layout()->deleteLater();
|
||||
}
|
||||
delete item;
|
||||
}
|
||||
|
||||
indexToWidgetMap.clear();
|
||||
|
||||
// We gotta wait for all the deleteLater's to finish so we fire after the next event cycle
|
||||
|
||||
auto timer = new QTimer(this);
|
||||
timer->setSingleShot(true);
|
||||
connect(timer, &QTimer::timeout, this, [this]() { displayCards(); });
|
||||
timer->start();
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::cleanupInvalidCardGroup(CardGroupDisplayWidget *displayWidget)
|
||||
{
|
||||
cardGroupLayout->removeWidget(displayWidget);
|
||||
displayWidget->setParent(nullptr);
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
if (!idx.isValid()) {
|
||||
indexToWidgetMap.remove(idx);
|
||||
}
|
||||
}
|
||||
delete displayWidget;
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// DeckListModel Signal Responses
|
||||
// =====================================================================================================================
|
||||
|
||||
void DeckCardZoneDisplayWidget::onCategoryAddition(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
if (!trackedIndex.isValid()) {
|
||||
@@ -219,6 +173,48 @@ void DeckCardZoneDisplayWidget::onCategoryRemoval(const QModelIndex &parent, int
|
||||
}
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
QWidget::resizeEvent(event);
|
||||
for (QObject *child : layout->children()) {
|
||||
QWidget *widget = qobject_cast<QWidget *>(child);
|
||||
if (widget) {
|
||||
widget->setMaximumWidth(width());
|
||||
}
|
||||
}
|
||||
}
|
||||
void DeckCardZoneDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card)
|
||||
{
|
||||
emit cardClicked(event, card, zoneName);
|
||||
}
|
||||
void DeckCardZoneDisplayWidget::onHover(const ExactCard &card)
|
||||
{
|
||||
emit cardHovered(card);
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType)
|
||||
{
|
||||
displayType = _displayType;
|
||||
QLayoutItem *item;
|
||||
while ((item = cardGroupLayout->takeAt(0)) != nullptr) {
|
||||
if (item->widget()) {
|
||||
item->widget()->deleteLater();
|
||||
} else if (item->layout()) {
|
||||
item->layout()->deleteLater();
|
||||
}
|
||||
delete item;
|
||||
}
|
||||
|
||||
indexToWidgetMap.clear();
|
||||
|
||||
// We gotta wait for all the deleteLater's to finish so we fire after the next event cycle
|
||||
|
||||
auto timer = new QTimer(this);
|
||||
timer->setSingleShot(true);
|
||||
connect(timer, &QTimer::timeout, this, [this]() { displayCards(); });
|
||||
timer->start();
|
||||
}
|
||||
|
||||
void DeckCardZoneDisplayWidget::onActiveGroupCriteriaChanged(QString _activeGroupCriteria)
|
||||
{
|
||||
activeGroupCriteria = _activeGroupCriteria;
|
||||
|
||||
@@ -40,6 +40,7 @@ public:
|
||||
QPersistentModelIndex trackedIndex;
|
||||
QString zoneName;
|
||||
void addCardsToOverlapWidget();
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
|
||||
public slots:
|
||||
void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);
|
||||
|
||||
@@ -459,15 +459,12 @@ void DeckEditorDeckDockWidget::syncBannerCardComboBoxSelectionWithDeck()
|
||||
}
|
||||
}
|
||||
|
||||
void DeckEditorDeckDockWidget::setSelectedIndex(const QModelIndex &newCardIndex, bool preserveWidgetFocus)
|
||||
void DeckEditorDeckDockWidget::setSelectedIndex(const QModelIndex &newCardIndex)
|
||||
{
|
||||
deckView->clearSelection();
|
||||
deckView->setCurrentIndex(newCardIndex);
|
||||
recursiveExpand(newCardIndex);
|
||||
|
||||
if (!preserveWidgetFocus) {
|
||||
deckView->setFocus(Qt::FocusReason::MouseFocusReason);
|
||||
}
|
||||
deckView->setFocus(Qt::FocusReason::MouseFocusReason);
|
||||
}
|
||||
|
||||
void DeckEditorDeckDockWidget::syncDisplayWidgetsToModel()
|
||||
|
||||
@@ -100,7 +100,7 @@ private slots:
|
||||
void writeComments();
|
||||
void writeBannerCard(int);
|
||||
void applyActiveGroupCriteria();
|
||||
void setSelectedIndex(const QModelIndex &newCardIndex, bool preserveWidgetFocus);
|
||||
void setSelectedIndex(const QModelIndex &newCardIndex);
|
||||
void updateHash();
|
||||
void refreshShortcuts();
|
||||
void updateShowBannerCardComboBox(bool visible);
|
||||
|
||||
@@ -182,7 +182,7 @@ QModelIndex DeckStateManager::addCard(const ExactCard &card, const QString &zone
|
||||
QModelIndex idx = modifyDeck(reason, [&card, &zone](auto model) { return model->addCard(card, zone); });
|
||||
|
||||
if (idx.isValid()) {
|
||||
emit focusIndexChanged(idx, true);
|
||||
emit focusIndexChanged(idx);
|
||||
}
|
||||
|
||||
return idx;
|
||||
@@ -208,7 +208,7 @@ QModelIndex DeckStateManager::decrementCard(const ExactCard &card, const QString
|
||||
}
|
||||
|
||||
if (idx.isValid()) {
|
||||
emit focusIndexChanged(idx, true);
|
||||
emit focusIndexChanged(idx);
|
||||
}
|
||||
|
||||
return idx;
|
||||
|
||||
@@ -290,9 +290,8 @@ signals:
|
||||
/**
|
||||
* The selected card on any views connected to this deck should be changed to this index.
|
||||
* @param index The model index
|
||||
* @param preserveWidgetFocus Whether to keep the widget focus unchanged
|
||||
*/
|
||||
void focusIndexChanged(QModelIndex index, bool preserveWidgetFocus);
|
||||
void focusIndexChanged(QModelIndex index);
|
||||
};
|
||||
|
||||
#endif // COCKATRICE_DECK_STATE_MANAGER_H
|
||||
@@ -198,7 +198,7 @@ void CardAmountWidget::addPrinting(const QString &zone)
|
||||
});
|
||||
|
||||
if (newCardIndex.isValid()) {
|
||||
emit deckStateManager->focusIndexChanged(newCardIndex, false);
|
||||
emit deckStateManager->focusIndexChanged(newCardIndex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,36 +38,6 @@ VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent,
|
||||
mainLayout->setContentsMargins(9, 0, 9, 5);
|
||||
mainLayout->setSpacing(0);
|
||||
|
||||
initializeDisplayOptionsAndSearchWidget();
|
||||
|
||||
initializeScrollAreaAndZoneContainer();
|
||||
|
||||
cardSizeWidget = new CardSizeWidget(this, nullptr, SettingsCache::instance().getVisualDeckEditorCardSize());
|
||||
connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(),
|
||||
&SettingsCache::setVisualDeckEditorCardSize);
|
||||
|
||||
mainLayout->addWidget(displayOptionsAndSearch);
|
||||
mainLayout->addWidget(scrollArea);
|
||||
mainLayout->addWidget(cardSizeWidget);
|
||||
|
||||
connectDeckListModel();
|
||||
|
||||
constructZoneWidgetsFromDeckListModel();
|
||||
|
||||
if (selectionModel) {
|
||||
connect(selectionModel, &QItemSelectionModel::selectionChanged, this,
|
||||
&VisualDeckEditorWidget::onSelectionChanged);
|
||||
}
|
||||
|
||||
retranslateUi();
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// Constructor helpers
|
||||
// =====================================================================================================================
|
||||
|
||||
void VisualDeckEditorWidget::initializeSearchBarAndCompleter()
|
||||
{
|
||||
searchBar = new QLineEdit(this);
|
||||
connect(searchBar, &QLineEdit::returnPressed, this, [=, this]() {
|
||||
if (!searchBar->hasFocus())
|
||||
@@ -139,10 +109,12 @@ void VisualDeckEditorWidget::initializeSearchBarAndCompleter()
|
||||
emit cardAdditionRequested(card);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::initializeDisplayOptionsWidget()
|
||||
{
|
||||
displayOptionsAndSearch = new QWidget(this);
|
||||
displayOptionsAndSearchLayout = new QHBoxLayout(displayOptionsAndSearch);
|
||||
displayOptionsAndSearchLayout->setAlignment(Qt::AlignLeft);
|
||||
displayOptionsAndSearch->setLayout(displayOptionsAndSearchLayout);
|
||||
|
||||
displayOptionsWidget = new VisualDeckDisplayOptionsWidget(this);
|
||||
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::displayTypeChanged, this,
|
||||
&VisualDeckEditorWidget::displayTypeChanged);
|
||||
@@ -150,26 +122,11 @@ void VisualDeckEditorWidget::initializeDisplayOptionsWidget()
|
||||
&VisualDeckEditorWidget::activeGroupCriteriaChanged);
|
||||
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::sortCriteriaChanged, this,
|
||||
&VisualDeckEditorWidget::activeSortCriteriaChanged);
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::initializeDisplayOptionsAndSearchWidget()
|
||||
{
|
||||
initializeSearchBarAndCompleter();
|
||||
|
||||
initializeDisplayOptionsWidget();
|
||||
|
||||
displayOptionsAndSearch = new QWidget(this);
|
||||
displayOptionsAndSearchLayout = new QHBoxLayout(displayOptionsAndSearch);
|
||||
displayOptionsAndSearchLayout->setAlignment(Qt::AlignLeft);
|
||||
displayOptionsAndSearch->setLayout(displayOptionsAndSearchLayout);
|
||||
|
||||
displayOptionsAndSearchLayout->addWidget(displayOptionsWidget);
|
||||
displayOptionsAndSearchLayout->addWidget(searchBar);
|
||||
displayOptionsAndSearchLayout->addWidget(searchPushButton);
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::initializeScrollAreaAndZoneContainer()
|
||||
{
|
||||
scrollArea = new QScrollArea(this);
|
||||
scrollArea->setWidgetResizable(true);
|
||||
scrollArea->setMinimumSize(0, 0);
|
||||
@@ -179,19 +136,31 @@ void VisualDeckEditorWidget::initializeScrollAreaAndZoneContainer()
|
||||
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
||||
|
||||
zoneContainer = new QWidget(scrollArea);
|
||||
zoneContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
zoneContainerLayout = new QVBoxLayout(zoneContainer);
|
||||
zoneContainer->setLayout(zoneContainerLayout);
|
||||
scrollArea->addScrollBarWidget(zoneContainer, Qt::AlignHCenter);
|
||||
scrollArea->setWidget(zoneContainer);
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::connectDeckListModel()
|
||||
{
|
||||
cardSizeWidget = new CardSizeWidget(this, nullptr, SettingsCache::instance().getVisualDeckEditorCardSize());
|
||||
connect(cardSizeWidget, &CardSizeWidget::cardSizeSettingUpdated, &SettingsCache::instance(),
|
||||
&SettingsCache::setVisualDeckEditorCardSize);
|
||||
|
||||
mainLayout->addWidget(displayOptionsAndSearch);
|
||||
mainLayout->addWidget(scrollArea);
|
||||
mainLayout->addWidget(cardSizeWidget);
|
||||
|
||||
connect(deckListModel, &DeckListModel::modelReset, this, &VisualDeckEditorWidget::decklistModelReset);
|
||||
connect(deckListModel, &DeckListModel::dataChanged, this, &VisualDeckEditorWidget::decklistDataChanged);
|
||||
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &VisualDeckEditorWidget::onCardAddition);
|
||||
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &VisualDeckEditorWidget::onCardRemoval);
|
||||
constructZoneWidgetsFromDeckListModel();
|
||||
|
||||
if (selectionModel) {
|
||||
connect(selectionModel, &QItemSelectionModel::selectionChanged, this,
|
||||
&VisualDeckEditorWidget::onSelectionChanged);
|
||||
}
|
||||
|
||||
retranslateUi();
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::retranslateUi()
|
||||
@@ -202,9 +171,96 @@ void VisualDeckEditorWidget::retranslateUi()
|
||||
"preferred printing to the deck on pressing enter"));
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// Display Widget Management
|
||||
// =====================================================================================================================
|
||||
void VisualDeckEditorWidget::setSelectionModel(QItemSelectionModel *model)
|
||||
{
|
||||
if (selectionModel == model) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (selectionModel) {
|
||||
// TODO: Possibly disconnect old ones?
|
||||
}
|
||||
|
||||
selectionModel = model;
|
||||
|
||||
if (selectionModel) {
|
||||
connect(selectionModel, &QItemSelectionModel::selectionChanged, this,
|
||||
&VisualDeckEditorWidget::onSelectionChanged);
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
|
||||
{
|
||||
for (auto &range : selected) {
|
||||
for (int row = range.top(); row <= range.bottom(); ++row) {
|
||||
QModelIndex idx = range.model()->index(row, 0, range.parent());
|
||||
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
|
||||
if (it != indexToWidgetMap.end()) {
|
||||
// it.value()->setHighlighted(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &range : deselected) {
|
||||
for (int row = range.top(); row <= range.bottom(); ++row) {
|
||||
QModelIndex idx = range.model()->index(row, 0, range.parent());
|
||||
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
|
||||
if (it != indexToWidgetMap.end()) {
|
||||
// it.value()->setHighlighted(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::clearAllDisplayWidgets()
|
||||
{
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
auto displayWidget = indexToWidgetMap.value(idx);
|
||||
zoneContainerLayout->removeWidget(displayWidget);
|
||||
indexToWidgetMap.remove(idx);
|
||||
delete displayWidget;
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::cleanupInvalidZones(DeckCardZoneDisplayWidget *displayWidget)
|
||||
{
|
||||
zoneContainerLayout->removeWidget(displayWidget);
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
if (!idx.isValid()) {
|
||||
indexToWidgetMap.remove(idx);
|
||||
}
|
||||
}
|
||||
delete displayWidget;
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::onCardAddition(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
if (parent == deckListModel->getRoot()) {
|
||||
for (int i = first; i <= last; i++) {
|
||||
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 0, deckListModel->getRoot()));
|
||||
|
||||
if (indexToWidgetMap.contains(index)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
constructZoneWidgetForIndex(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::onCardRemoval(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
Q_UNUSED(first);
|
||||
Q_UNUSED(last);
|
||||
for (const QPersistentModelIndex &idx : indexToWidgetMap.keys()) {
|
||||
if (!idx.isValid()) {
|
||||
zoneContainerLayout->removeWidget(indexToWidgetMap.value(idx));
|
||||
indexToWidgetMap.value(idx)->deleteLater();
|
||||
indexToWidgetMap.remove(idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::constructZoneWidgetForIndex(QPersistentModelIndex persistent)
|
||||
{
|
||||
@@ -256,58 +312,10 @@ void VisualDeckEditorWidget::updateZoneWidgets()
|
||||
{
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::clearAllDisplayWidgets()
|
||||
void VisualDeckEditorWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
auto displayWidget = indexToWidgetMap.value(idx);
|
||||
zoneContainerLayout->removeWidget(displayWidget);
|
||||
indexToWidgetMap.remove(idx);
|
||||
delete displayWidget;
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::cleanupInvalidZones(DeckCardZoneDisplayWidget *displayWidget)
|
||||
{
|
||||
zoneContainerLayout->removeWidget(displayWidget);
|
||||
for (auto idx : indexToWidgetMap.keys()) {
|
||||
if (!idx.isValid()) {
|
||||
indexToWidgetMap.remove(idx);
|
||||
}
|
||||
}
|
||||
delete displayWidget;
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// DeckModel Signals Management
|
||||
// =====================================================================================================================
|
||||
|
||||
void VisualDeckEditorWidget::onCardAddition(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
if (parent == deckListModel->getRoot()) {
|
||||
for (int i = first; i <= last; i++) {
|
||||
QPersistentModelIndex index = QPersistentModelIndex(deckListModel->index(i, 0, deckListModel->getRoot()));
|
||||
|
||||
if (indexToWidgetMap.contains(index)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
constructZoneWidgetForIndex(index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::onCardRemoval(const QModelIndex &parent, int first, int last)
|
||||
{
|
||||
Q_UNUSED(parent);
|
||||
Q_UNUSED(first);
|
||||
Q_UNUSED(last);
|
||||
for (const QPersistentModelIndex &idx : indexToWidgetMap.keys()) {
|
||||
if (!idx.isValid()) {
|
||||
zoneContainerLayout->removeWidget(indexToWidgetMap.value(idx));
|
||||
indexToWidgetMap.value(idx)->deleteLater();
|
||||
indexToWidgetMap.remove(idx);
|
||||
}
|
||||
}
|
||||
QWidget::resizeEvent(event);
|
||||
zoneContainer->setMaximumWidth(scrollArea->viewport()->width());
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::decklistModelReset()
|
||||
@@ -326,17 +334,6 @@ void VisualDeckEditorWidget::decklistDataChanged(QModelIndex topLeft, QModelInde
|
||||
updateZoneWidgets();
|
||||
}
|
||||
|
||||
// =====================================================================================================================
|
||||
// User Interaction
|
||||
// =====================================================================================================================
|
||||
|
||||
void VisualDeckEditorWidget::onCardClick(QMouseEvent *event,
|
||||
CardInfoPictureWithTextOverlayWidget *instance,
|
||||
QString zoneName)
|
||||
{
|
||||
emit cardClicked(event, instance, zoneName);
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::onHover(const ExactCard &hoveredCard)
|
||||
{
|
||||
// If user has any card selected, ignore hover
|
||||
@@ -351,43 +348,9 @@ void VisualDeckEditorWidget::onHover(const ExactCard &hoveredCard)
|
||||
// highlightHoveredCard(hoveredCard);
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::setSelectionModel(QItemSelectionModel *model)
|
||||
void VisualDeckEditorWidget::onCardClick(QMouseEvent *event,
|
||||
CardInfoPictureWithTextOverlayWidget *instance,
|
||||
QString zoneName)
|
||||
{
|
||||
if (selectionModel == model) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (selectionModel) {
|
||||
// TODO: Possibly disconnect old ones?
|
||||
}
|
||||
|
||||
selectionModel = model;
|
||||
|
||||
if (selectionModel) {
|
||||
connect(selectionModel, &QItemSelectionModel::selectionChanged, this,
|
||||
&VisualDeckEditorWidget::onSelectionChanged);
|
||||
}
|
||||
}
|
||||
|
||||
void VisualDeckEditorWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
|
||||
{
|
||||
for (auto &range : selected) {
|
||||
for (int row = range.top(); row <= range.bottom(); ++row) {
|
||||
QModelIndex idx = range.model()->index(row, 0, range.parent());
|
||||
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
|
||||
if (it != indexToWidgetMap.end()) {
|
||||
// it.value()->setHighlighted(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto &range : deselected) {
|
||||
for (int row = range.top(); row <= range.bottom(); ++row) {
|
||||
QModelIndex idx = range.model()->index(row, 0, range.parent());
|
||||
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
|
||||
if (it != indexToWidgetMap.end()) {
|
||||
// it.value()->setHighlighted(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
emit cardClicked(event, instance, zoneName);
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ public:
|
||||
explicit VisualDeckEditorWidget(QWidget *parent, DeckListModel *deckListModel, QItemSelectionModel *selectionModel);
|
||||
void retranslateUi();
|
||||
void clearAllDisplayWidgets();
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
|
||||
void setDeckList(const DeckList &_deckListModel);
|
||||
|
||||
@@ -69,13 +70,6 @@ signals:
|
||||
void cardAdditionRequested(const ExactCard &card);
|
||||
void displayTypeChanged(DisplayType displayType);
|
||||
|
||||
protected:
|
||||
void initializeSearchBarAndCompleter();
|
||||
void initializeDisplayOptionsWidget();
|
||||
void initializeDisplayOptionsAndSearchWidget();
|
||||
void initializeScrollAreaAndZoneContainer();
|
||||
void connectDeckListModel();
|
||||
|
||||
protected slots:
|
||||
void onHover(const ExactCard &hoveredCard);
|
||||
void onCardClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance, QString zoneName);
|
||||
@@ -97,6 +91,7 @@ private:
|
||||
QWidget *zoneContainer;
|
||||
QVBoxLayout *zoneContainerLayout;
|
||||
// OverlapControlWidget *overlapControlWidget;
|
||||
QWidget *container;
|
||||
QHash<QPersistentModelIndex, QWidget *> indexToWidgetMap;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,17 +1,9 @@
|
||||
@page user_reference User Reference
|
||||
|
||||
# Deck Management
|
||||
|
||||
- @subpage search_syntax_help
|
||||
- @subpage deck_search_syntax_help
|
||||
|
||||
- @subpage creating_decks
|
||||
- @subpage importing_decks
|
||||
- @subpage editing_decks
|
||||
- @subpage exporting_decks
|
||||
|
||||
# Release Channels
|
||||
|
||||
- @subpage beta_release
|
||||
|
||||
# Syntax Help
|
||||
|
||||
- @subpage search_syntax_help
|
||||
- @subpage deck_search_syntax_help
|
||||
@@ -1,54 +0,0 @@
|
||||
@page beta_release Beta Release
|
||||
|
||||
The beta version of Cockatrice features all the newest features before they make their way into the latest stable
|
||||
release.
|
||||
It allows us to test these features ahead of time and you to give feedback on them.
|
||||
We release new betas very frequently and usually release a follow-up beta with a fix within a day or two if we break
|
||||
anything. In contrast, stable releases are released much less frequently but ensured to be stable.
|
||||
|
||||
# What to Expect from the Beta
|
||||
|
||||
Using the beta and giving feedback on it helps us improve Cockatrice a lot.
|
||||
We do not perform any automatic data collection so your voluntary feedback is the only way for us to get a sense of what
|
||||
you enjoy, expect, or would like to change.
|
||||
|
||||
We highly appreciate your active participation and feedback.
|
||||
|
||||
That being said, some words of warning should be issued:
|
||||
|
||||
The beta release may contain unfinished features, bugs, or performance issues.
|
||||
It is intended for testing and feedback and may be less stable than the default release.
|
||||
|
||||
We recommend using the beta only if you are comfortable encountering issues and helping us improve Cockatrice.
|
||||
|
||||
# Switching to the Beta
|
||||
|
||||
To switch to the Beta, navigate to your settings, using the Tab "Cockatrice → Settings" or Ctrl + Shift + P (default
|
||||
shortcut).
|
||||
|
||||
Within the settings, in the first tab 'General', the first section 'Personal Settings' contains the setting 'Release
|
||||
Channel'.
|
||||
|
||||
\image html release_channel_beta.png
|
||||
|
||||
Switch this to 'Beta'.
|
||||
|
||||
Afterwards, close your settings, and use the 'Help' tab to search for a client update. You should be prompted to install
|
||||
the beta version.
|
||||
|
||||
# Switching back to Stable
|
||||
|
||||
Follow the same steps as above, but set Release Channel to 'Default'.
|
||||
|
||||
# Giving Feedback
|
||||
|
||||
If you encounter a bug or unexpected behavior while using the beta, please report it on:
|
||||
|
||||
- GitHub: https://github.com/Cockatrice/Cockatrice/issues
|
||||
- Discord: https://discord.gg/4hNswvHeFd in #beta-testing
|
||||
|
||||
When reporting issues, please include:
|
||||
|
||||
- Your operating system
|
||||
- The beta version number (found in 'Help → About Cockatrice')
|
||||
- Steps to reproduce the problem, if possible
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 92 KiB |
@@ -2,22 +2,22 @@
|
||||
<context>
|
||||
<name>IntroPage</name>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="127"/>
|
||||
<location filename="src/oraclewizard.cpp" line="215"/>
|
||||
<source>Introduction</source>
|
||||
<translation>Einführung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="128"/>
|
||||
<location filename="src/oraclewizard.cpp" line="216"/>
|
||||
<source>This wizard will import the list of sets, cards, and tokens that will be used by Cockatrice.</source>
|
||||
<translation>Dieser Assistent wird eine Liste aller Editionen, Karten und Spielsteine importieren, die von Cockatrice genutzt werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="130"/>
|
||||
<location filename="src/oraclewizard.cpp" line="218"/>
|
||||
<source>Interface language:</source>
|
||||
<translation>Interfacesprache:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="131"/>
|
||||
<location filename="src/oraclewizard.cpp" line="219"/>
|
||||
<source>Version:</source>
|
||||
<translation>Version:</translation>
|
||||
</message>
|
||||
@@ -25,134 +25,134 @@
|
||||
<context>
|
||||
<name>LoadSetsPage</name>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="200"/>
|
||||
<location filename="src/oraclewizard.cpp" line="288"/>
|
||||
<source>Source selection</source>
|
||||
<translation>Quellenauswahl</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="201"/>
|
||||
<location filename="src/oraclewizard.cpp" line="289"/>
|
||||
<source>Please specify a compatible source for the list of sets and cards. You can specify a URL address that will be downloaded or use an existing file from your computer.</source>
|
||||
<translation>Bitte geben Sie eine kompatible Quelle für die Liste der Editionen und Karten an. Sie können eine URL-Adresse zum Herunterladen angeben oder eine existierende Datei von Ihrem Computer verwenden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="205"/>
|
||||
<location filename="src/oraclewizard.cpp" line="293"/>
|
||||
<source>Download URL:</source>
|
||||
<translation>Download URL:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="206"/>
|
||||
<location filename="src/oraclewizard.cpp" line="294"/>
|
||||
<source>Local file:</source>
|
||||
<translation>Lokale Datei:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="207"/>
|
||||
<location filename="src/oraclewizard.cpp" line="295"/>
|
||||
<source>Restore default URL</source>
|
||||
<translation>Standard-URL wiederherstellen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="208"/>
|
||||
<location filename="src/oraclewizard.cpp" line="296"/>
|
||||
<source>Choose file...</source>
|
||||
<translation>Datei auswählen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="218"/>
|
||||
<location filename="src/oraclewizard.cpp" line="306"/>
|
||||
<source>Load sets file</source>
|
||||
<translation>Editionsdatei wird geladen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="228"/>
|
||||
<location filename="src/oraclewizard.cpp" line="316"/>
|
||||
<source>Sets file (%1)</source>
|
||||
<oldsource>Sets JSON file (%1)</oldsource>
|
||||
<translation>Sets Datei (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="258"/>
|
||||
<location filename="src/pages.cpp" line="277"/>
|
||||
<location filename="src/pages.cpp" line="282"/>
|
||||
<location filename="src/pages.cpp" line="354"/>
|
||||
<location filename="src/pages.cpp" line="485"/>
|
||||
<location filename="src/pages.cpp" line="498"/>
|
||||
<location filename="src/pages.cpp" line="519"/>
|
||||
<location filename="src/oraclewizard.cpp" line="346"/>
|
||||
<location filename="src/oraclewizard.cpp" line="365"/>
|
||||
<location filename="src/oraclewizard.cpp" line="370"/>
|
||||
<location filename="src/oraclewizard.cpp" line="438"/>
|
||||
<location filename="src/oraclewizard.cpp" line="569"/>
|
||||
<location filename="src/oraclewizard.cpp" line="582"/>
|
||||
<location filename="src/oraclewizard.cpp" line="603"/>
|
||||
<source>Error</source>
|
||||
<translation>Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="258"/>
|
||||
<location filename="src/oraclewizard.cpp" line="346"/>
|
||||
<source>The provided URL is not valid.</source>
|
||||
<translation>Die eingegebene URL ist nicht gültig.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="262"/>
|
||||
<location filename="src/oraclewizard.cpp" line="350"/>
|
||||
<source>Downloading (0MB)</source>
|
||||
<translation>Herunterladen (0MB)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="277"/>
|
||||
<location filename="src/oraclewizard.cpp" line="365"/>
|
||||
<source>Please choose a file.</source>
|
||||
<translation>Bitte wähle eine Datei aus.</translation>
|
||||
<translation>Bitte wählen Sie eine Datei.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="282"/>
|
||||
<location filename="src/oraclewizard.cpp" line="370"/>
|
||||
<source>Cannot open file '%1'.</source>
|
||||
<translation>Datei '%1' kann nicht geöffnet werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="345"/>
|
||||
<location filename="src/oraclewizard.cpp" line="429"/>
|
||||
<source>Downloading (%1MB)</source>
|
||||
<translation>Herunterladen (%1MB)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="354"/>
|
||||
<location filename="src/oraclewizard.cpp" line="438"/>
|
||||
<source>Network error: %1.</source>
|
||||
<translation>Netzwerkfehler: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="392"/>
|
||||
<location filename="src/oraclewizard.cpp" line="476"/>
|
||||
<source>Parsing file</source>
|
||||
<translation>Datei wird verarbeitet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="414"/>
|
||||
<location filename="src/oraclewizard.cpp" line="498"/>
|
||||
<source>Xz extraction failed.</source>
|
||||
<translation>Fehler beim Extrahieren der xz Datei.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="421"/>
|
||||
<location filename="src/oraclewizard.cpp" line="505"/>
|
||||
<source>Sorry, this version of Oracle does not support xz compressed files.</source>
|
||||
<translation>Es tut uns Leid, diese Version von Oracle unterstützt keine xz komprimierten Dateien.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="441"/>
|
||||
<location filename="src/oraclewizard.cpp" line="525"/>
|
||||
<source>Failed to open Zip archive: %1.</source>
|
||||
<translation>Fehler beim Öffnen des Zip Archivs: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="446"/>
|
||||
<location filename="src/oraclewizard.cpp" line="530"/>
|
||||
<source>Zip extraction failed: the Zip archive doesn't contain exactly one file.</source>
|
||||
<translation>Fehler beim Extrahieren: Das Zip Archiv enthält mehr als eine Datei.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="454"/>
|
||||
<location filename="src/oraclewizard.cpp" line="538"/>
|
||||
<source>Zip extraction failed: %1.</source>
|
||||
<translation>Fehler beim Extrahieren: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="462"/>
|
||||
<location filename="src/oraclewizard.cpp" line="546"/>
|
||||
<source>Sorry, this version of Oracle does not support zipped files.</source>
|
||||
<translation>Es tut uns Leid, diese Version von Oracle unterstützt keine Zip Archive.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="485"/>
|
||||
<location filename="src/oraclewizard.cpp" line="569"/>
|
||||
<source>Failed to interpret downloaded data.</source>
|
||||
<translation>Interpretation der heruntergeladenen Daten fehlgeschlagen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="498"/>
|
||||
<location filename="src/oraclewizard.cpp" line="582"/>
|
||||
<source>Do you want to download the uncompressed file instead?</source>
|
||||
<translation>Möchten Sie stattdessen die unkomprimierte Datei herunterladen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="520"/>
|
||||
<location filename="src/oraclewizard.cpp" line="604"/>
|
||||
<source>The file was retrieved successfully, but it does not contain any sets data.</source>
|
||||
<translation>Die Datei wurde erfolgreich abgerufen, sie enthält aber keine Editionsdaten.</translation>
|
||||
</message>
|
||||
@@ -160,57 +160,42 @@
|
||||
<context>
|
||||
<name>LoadSpoilersPage</name>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="716"/>
|
||||
<location filename="src/oraclewizard.cpp" line="790"/>
|
||||
<source>Save spoiler database</source>
|
||||
<translation>Speichere Spoilerdatenbank</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="721"/>
|
||||
<location filename="src/oraclewizard.cpp" line="795"/>
|
||||
<source>XML; spoiler database (*.xml)</source>
|
||||
<translation>XML; Spoilerdatenbank (*.xml)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="726"/>
|
||||
<source>spoiler</source>
|
||||
<translation>Spoiler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="731"/>
|
||||
<location filename="src/oraclewizard.cpp" line="800"/>
|
||||
<source>Spoilers import</source>
|
||||
<translation>Spoilerimport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="732"/>
|
||||
<location filename="src/oraclewizard.cpp" line="801"/>
|
||||
<source>Please specify a compatible source for spoiler data.</source>
|
||||
<translation>Bitte geben Sie eine kompatible Quelle für Spoilerdaten an.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="734"/>
|
||||
<location filename="src/oraclewizard.cpp" line="803"/>
|
||||
<source>Download URL:</source>
|
||||
<translation>Download URL:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="735"/>
|
||||
<source>Local file:</source>
|
||||
<translation>Lokale Datei:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="736"/>
|
||||
<location filename="src/oraclewizard.cpp" line="804"/>
|
||||
<source>Restore default URL</source>
|
||||
<translation>Standard-URL wiederherstellen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="737"/>
|
||||
<source>Choose file...</source>
|
||||
<translation>Datei auswählen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="739"/>
|
||||
<location filename="src/oraclewizard.cpp" line="805"/>
|
||||
<source>The spoiler database will be saved at the following location:</source>
|
||||
<translation>Die Spoilerdatenbank wird in folgendem Pfad gespeichert:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="741"/>
|
||||
<location filename="src/oraclewizard.cpp" line="807"/>
|
||||
<source>Save to a custom path (not recommended)</source>
|
||||
<translation>Speichere in benutzerdefiniertem Pfad (nicht empfohlen)</translation>
|
||||
</message>
|
||||
@@ -218,57 +203,42 @@
|
||||
<context>
|
||||
<name>LoadTokensPage</name>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="671"/>
|
||||
<location filename="src/oraclewizard.cpp" line="753"/>
|
||||
<source>Save token database</source>
|
||||
<translation>Speichere Spielsteindatenbank</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="676"/>
|
||||
<location filename="src/oraclewizard.cpp" line="758"/>
|
||||
<source>XML; token database (*.xml)</source>
|
||||
<translation>XML; Spielsteindatenbank (*.xml)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="681"/>
|
||||
<source>tokens</source>
|
||||
<translation>Spielsteine</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="686"/>
|
||||
<location filename="src/oraclewizard.cpp" line="763"/>
|
||||
<source>Tokens import</source>
|
||||
<translation>Spielsteinimport</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="687"/>
|
||||
<location filename="src/oraclewizard.cpp" line="764"/>
|
||||
<source>Please specify a compatible source for token data.</source>
|
||||
<translation>Bitte geben Sie eine kompatible Quelle für Spielsteindaten an.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="689"/>
|
||||
<location filename="src/oraclewizard.cpp" line="766"/>
|
||||
<source>Download URL:</source>
|
||||
<translation>Download URL:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="690"/>
|
||||
<source>Local file:</source>
|
||||
<translation>Lokale Datei:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="691"/>
|
||||
<location filename="src/oraclewizard.cpp" line="767"/>
|
||||
<source>Restore default URL</source>
|
||||
<translation>Standard-URL wiederherstellen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="692"/>
|
||||
<source>Choose file...</source>
|
||||
<translation>Datei auswählen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="694"/>
|
||||
<location filename="src/oraclewizard.cpp" line="768"/>
|
||||
<source>The token database will be saved at the following location:</source>
|
||||
<translation>Die Spielsteindatenbank wird in folgendem Pfad gespeichert:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="696"/>
|
||||
<location filename="src/oraclewizard.cpp" line="770"/>
|
||||
<source>Save to a custom path (not recommended)</source>
|
||||
<translation>Speichere in benutzerdefiniertem Pfad (nicht empfohlen)</translation>
|
||||
</message>
|
||||
@@ -276,7 +246,7 @@
|
||||
<context>
|
||||
<name>OracleImporter</name>
|
||||
<message>
|
||||
<location filename="src/oracleimporter.cpp" line="541"/>
|
||||
<location filename="src/oracleimporter.cpp" line="466"/>
|
||||
<source>Dummy set containing tokens</source>
|
||||
<translation>Platzhalter Edition mit Spielsteinen</translation>
|
||||
</message>
|
||||
@@ -284,7 +254,7 @@
|
||||
<context>
|
||||
<name>OracleWizard</name>
|
||||
<message>
|
||||
<location filename="src/oraclewizard.cpp" line="70"/>
|
||||
<location filename="src/oraclewizard.cpp" line="106"/>
|
||||
<source>Oracle Importer</source>
|
||||
<translation>Oracle Importer</translation>
|
||||
</message>
|
||||
@@ -292,22 +262,22 @@
|
||||
<context>
|
||||
<name>OutroPage</name>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="136"/>
|
||||
<location filename="src/oraclewizard.cpp" line="224"/>
|
||||
<source>Finished</source>
|
||||
<translation>Fertig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="137"/>
|
||||
<location filename="src/oraclewizard.cpp" line="225"/>
|
||||
<source>The wizard has finished.</source>
|
||||
<translation>Der Wizard ist fertig.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="138"/>
|
||||
<location filename="src/oraclewizard.cpp" line="226"/>
|
||||
<source>You can now start using Cockatrice with the newly updated cards.</source>
|
||||
<translation>Sie können nun Cockatrice mit den aktuellen Karten verwenden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="139"/>
|
||||
<location filename="src/oraclewizard.cpp" line="227"/>
|
||||
<source>If the card databases don't reload automatically, restart the Cockatrice client.</source>
|
||||
<translation>Falls die Datenbanken nicht automatisch neu geladen werden, starten Sie bitte Cockatrice neu.</translation>
|
||||
</message>
|
||||
@@ -315,73 +285,73 @@
|
||||
<context>
|
||||
<name>SaveSetsPage</name>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="563"/>
|
||||
<location filename="src/pages.cpp" line="638"/>
|
||||
<location filename="src/oraclewizard.cpp" line="646"/>
|
||||
<location filename="src/oraclewizard.cpp" line="720"/>
|
||||
<source>Error</source>
|
||||
<translation>Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="563"/>
|
||||
<location filename="src/oraclewizard.cpp" line="646"/>
|
||||
<source>No set has been imported.</source>
|
||||
<translation>Es wurden keine Editionen importiert.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="574"/>
|
||||
<location filename="src/oraclewizard.cpp" line="656"/>
|
||||
<source>Sets imported</source>
|
||||
<translation>Editionen wurden importiert</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="576"/>
|
||||
<location filename="src/oraclewizard.cpp" line="658"/>
|
||||
<source>A cockatrice database file of %1 MB has been downloaded.</source>
|
||||
<translation>Eine Cockatrice-Datenbankdatei der Größe %1 MB wurde heruntergeladen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="579"/>
|
||||
<location filename="src/oraclewizard.cpp" line="661"/>
|
||||
<source>The following sets have been found:</source>
|
||||
<translation>Die folgenden Sets wurden gefunden:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="582"/>
|
||||
<location filename="src/oraclewizard.cpp" line="664"/>
|
||||
<source>Press "Save" to store the imported cards in the Cockatrice database.</source>
|
||||
<translation>Drücken Sie "Speichern", um die importierten Karten in der Datenbank zu speichern.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="583"/>
|
||||
<location filename="src/oraclewizard.cpp" line="665"/>
|
||||
<source>The card database will be saved at the following location:</source>
|
||||
<translation>Die Kartendatenbank wird in folgendem Pfad gespeichert:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="585"/>
|
||||
<location filename="src/oraclewizard.cpp" line="667"/>
|
||||
<source>Save to a custom path (not recommended)</source>
|
||||
<translation>Speichere in benutzerdefiniertem Pfad (nicht empfohlen)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="587"/>
|
||||
<location filename="src/oraclewizard.cpp" line="669"/>
|
||||
<source>&Save</source>
|
||||
<translation>&Speichern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="593"/>
|
||||
<location filename="src/oraclewizard.cpp" line="675"/>
|
||||
<source>Import finished: %1 cards.</source>
|
||||
<translation>Importieren abgeschlossen: %1 Karten.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="596"/>
|
||||
<location filename="src/oraclewizard.cpp" line="678"/>
|
||||
<source>%1: %2 cards imported</source>
|
||||
<translation>%1: %2 Karten importiert.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="605"/>
|
||||
<location filename="src/oraclewizard.cpp" line="687"/>
|
||||
<source>Save card database</source>
|
||||
<translation>Kartendatenbank speichern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="606"/>
|
||||
<location filename="src/oraclewizard.cpp" line="688"/>
|
||||
<source>XML; card database (*.xml)</source>
|
||||
<translation>XML; Kartendatenbank (*.xml)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pages.cpp" line="638"/>
|
||||
<location filename="src/oraclewizard.cpp" line="720"/>
|
||||
<source>The file could not be saved to %1</source>
|
||||
<translation>Die Datei konnte nicht gespeichert werden:
|
||||
%1 </translation>
|
||||
@@ -390,56 +360,34 @@
|
||||
<context>
|
||||
<name>SimpleDownloadFilePage</name>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="72"/>
|
||||
<source>Load %1 file</source>
|
||||
<translation>Lade %1 Datei</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="82"/>
|
||||
<source>%1 file (%1)</source>
|
||||
<translation>%1 Datei (%1)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="111"/>
|
||||
<location filename="src/pagetemplates.cpp" line="129"/>
|
||||
<location filename="src/pagetemplates.cpp" line="134"/>
|
||||
<location filename="src/pagetemplates.cpp" line="168"/>
|
||||
<location filename="src/pagetemplates.cpp" line="224"/>
|
||||
<location filename="src/pagetemplates.cpp" line="73"/>
|
||||
<location filename="src/pagetemplates.cpp" line="113"/>
|
||||
<location filename="src/pagetemplates.cpp" line="169"/>
|
||||
<source>Error</source>
|
||||
<translation>Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="111"/>
|
||||
<location filename="src/pagetemplates.cpp" line="73"/>
|
||||
<source>The provided URL is not valid: </source>
|
||||
<translation>Die bereitgestellte URL ist nicht gültig:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="115"/>
|
||||
<location filename="src/pagetemplates.cpp" line="77"/>
|
||||
<source>Downloading (0MB)</source>
|
||||
<translation>Herunterladen (0MB)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="129"/>
|
||||
<source>Please choose a file.</source>
|
||||
<translation>Bitte wähle eine Datei aus.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="134"/>
|
||||
<source>Cannot open file '%1'.</source>
|
||||
<translation>Datei '%1' kann nicht geöffnet werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="159"/>
|
||||
<location filename="src/pagetemplates.cpp" line="104"/>
|
||||
<source>Downloading (%1MB)</source>
|
||||
<translation>Herunterladen (%1MB)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="168"/>
|
||||
<location filename="src/pagetemplates.cpp" line="113"/>
|
||||
<source>Network error: %1.</source>
|
||||
<translation>Netzwerkfehler: %1.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="src/pagetemplates.cpp" line="224"/>
|
||||
<location filename="src/pagetemplates.cpp" line="169"/>
|
||||
<source>The file could not be saved to %1</source>
|
||||
<translation>Die Datei konnte nicht in %1 gespeichert werden</translation>
|
||||
</message>
|
||||
@@ -588,7 +536,7 @@
|
||||
<context>
|
||||
<name>i18n</name>
|
||||
<message>
|
||||
<location filename="src/oraclewizard.cpp" line="22"/>
|
||||
<location filename="src/oraclewizard.cpp" line="58"/>
|
||||
<source>English</source>
|
||||
<translation>Deutsch (German)</translation>
|
||||
</message>
|
||||
|
||||
56
webclient/package-lock.json
generated
56
webclient/package-lock.json
generated
@@ -29,7 +29,7 @@
|
||||
"react-final-form-listeners": "^1.0.3",
|
||||
"react-i18next": "^12.0.0",
|
||||
"react-redux": "^8.0.4",
|
||||
"react-router-dom": "^6.2.2",
|
||||
"react-router-dom": "^6.30.3",
|
||||
"react-scripts": "5.0.1",
|
||||
"react-virtualized-auto-sizer": "^1.0.6",
|
||||
"react-window": "^1.8.6",
|
||||
@@ -4233,11 +4233,11 @@
|
||||
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
|
||||
},
|
||||
"node_modules/@remix-run/router": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.2.tgz",
|
||||
"integrity": "sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ==",
|
||||
"version": "1.23.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz",
|
||||
"integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/plugin-babel": {
|
||||
@@ -17113,29 +17113,29 @@
|
||||
}
|
||||
},
|
||||
"node_modules/react-router": {
|
||||
"version": "6.4.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.2.tgz",
|
||||
"integrity": "sha512-Rb0BAX9KHhVzT1OKhMvCDMw776aTYM0DtkxqUBP8dNBom3mPXlfNs76JNGK8wKJ1IZEY1+WGj+cvZxHVk/GiKw==",
|
||||
"version": "6.30.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz",
|
||||
"integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.0.2"
|
||||
"@remix-run/router": "1.23.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8"
|
||||
}
|
||||
},
|
||||
"node_modules/react-router-dom": {
|
||||
"version": "6.4.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.2.tgz",
|
||||
"integrity": "sha512-yM1kjoTkpfjgczPrcyWrp+OuQMyB1WleICiiGfstnQYo/S8hPEEnVjr/RdmlH6yKK4Tnj1UGXFSa7uwAtmDoLQ==",
|
||||
"version": "6.30.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz",
|
||||
"integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.0.2",
|
||||
"react-router": "6.4.2"
|
||||
"@remix-run/router": "1.23.2",
|
||||
"react-router": "6.30.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
"node": ">=14.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8",
|
||||
@@ -23141,9 +23141,9 @@
|
||||
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
|
||||
},
|
||||
"@remix-run/router": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.2.tgz",
|
||||
"integrity": "sha512-GRSOFhJzjGN+d4sKHTMSvNeUPoZiDHWmRnXfzaxrqe7dE/Nzlc8BiMSJdLDESZlndM7jIUrZ/F4yWqVYlI0rwQ=="
|
||||
"version": "1.23.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz",
|
||||
"integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w=="
|
||||
},
|
||||
"@rollup/plugin-babel": {
|
||||
"version": "5.3.1",
|
||||
@@ -32382,20 +32382,20 @@
|
||||
"integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
|
||||
},
|
||||
"react-router": {
|
||||
"version": "6.4.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.2.tgz",
|
||||
"integrity": "sha512-Rb0BAX9KHhVzT1OKhMvCDMw776aTYM0DtkxqUBP8dNBom3mPXlfNs76JNGK8wKJ1IZEY1+WGj+cvZxHVk/GiKw==",
|
||||
"version": "6.30.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz",
|
||||
"integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==",
|
||||
"requires": {
|
||||
"@remix-run/router": "1.0.2"
|
||||
"@remix-run/router": "1.23.2"
|
||||
}
|
||||
},
|
||||
"react-router-dom": {
|
||||
"version": "6.4.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.2.tgz",
|
||||
"integrity": "sha512-yM1kjoTkpfjgczPrcyWrp+OuQMyB1WleICiiGfstnQYo/S8hPEEnVjr/RdmlH6yKK4Tnj1UGXFSa7uwAtmDoLQ==",
|
||||
"version": "6.30.3",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz",
|
||||
"integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==",
|
||||
"requires": {
|
||||
"@remix-run/router": "1.0.2",
|
||||
"react-router": "6.4.2"
|
||||
"@remix-run/router": "1.23.2",
|
||||
"react-router": "6.30.3"
|
||||
}
|
||||
},
|
||||
"react-scripts": {
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"react-final-form-listeners": "^1.0.3",
|
||||
"react-i18next": "^12.0.0",
|
||||
"react-redux": "^8.0.4",
|
||||
"react-router-dom": "^6.2.2",
|
||||
"react-router-dom": "^6.30.3",
|
||||
"react-scripts": "5.0.1",
|
||||
"react-virtualized-auto-sizer": "^1.0.6",
|
||||
"react-window": "^1.8.6",
|
||||
|
||||
Reference in New Issue
Block a user