diff --git a/src/duckstation-qt/memorycardeditordialog.cpp b/src/duckstation-qt/memorycardeditordialog.cpp
index 71c8db808..731de6288 100644
--- a/src/duckstation-qt/memorycardeditordialog.cpp
+++ b/src/duckstation-qt/memorycardeditordialog.cpp
@@ -77,6 +77,8 @@ void MemoryCardEditorDialog::connectUi()
[this](int index) { loadCardFromComboBox(&m_card_b, index); });
connect(m_ui.newCardA, &QPushButton::clicked, [this]() { newCard(&m_card_a); });
connect(m_ui.newCardB, &QPushButton::clicked, [this]() { newCard(&m_card_b); });
+ connect(m_ui.openCardA, &QPushButton::clicked, [this]() { openCard(&m_card_a); });
+ connect(m_ui.openCardB, &QPushButton::clicked, [this]() { openCard(&m_card_b); });
connect(m_ui.saveCardA, &QPushButton::clicked, [this]() { saveCard(&m_card_a); });
connect(m_ui.saveCardB, &QPushButton::clicked, [this]() { saveCard(&m_card_b); });
connect(m_ui.importCardA, &QPushButton::clicked, [this]() { importCard(&m_card_a); });
@@ -258,6 +260,35 @@ void MemoryCardEditorDialog::newCard(Card* card)
saveCard(card);
}
+void MemoryCardEditorDialog::openCard(Card* card)
+{
+ promptForSave(card);
+
+ QString filename =
+ QFileDialog::getOpenFileName(this, tr("Select Memory Card"), QString(), tr(MEMORY_CARD_IMAGE_FILTER));
+ if (filename.isEmpty())
+ return;
+
+ if (!MemoryCardImage::LoadFromFile(&card->data, filename.toUtf8().constData()))
+ {
+ QMessageBox::critical(this, tr("Error"), tr("Failed to load memory card image."));
+ return;
+ }
+
+ {
+ // add to combo box
+ QFileInfo file(filename);
+ QSignalBlocker sb(card->path_cb);
+ card->path_cb->addItem(file.baseName(), QVariant(filename));
+ card->path_cb->setCurrentIndex(card->path_cb->count() - 1);
+ }
+
+ card->filename = filename.toStdString();
+ updateCardTable(card);
+ updateCardBlocksFree(card);
+ updateButtonState();
+}
+
void MemoryCardEditorDialog::saveCard(Card* card)
{
if (card->filename.empty())
diff --git a/src/duckstation-qt/memorycardeditordialog.h b/src/duckstation-qt/memorycardeditordialog.h
index d51cb7ea3..d2b239f2c 100644
--- a/src/duckstation-qt/memorycardeditordialog.h
+++ b/src/duckstation-qt/memorycardeditordialog.h
@@ -52,6 +52,7 @@ private:
void updateCardBlocksFree(Card* card);
void setCardDirty(Card* card);
void newCard(Card* card);
+ void openCard(Card* card);
void saveCard(Card* card);
void promptForSave(Card* card);
void importCard(Card* card);
diff --git a/src/duckstation-qt/memorycardeditordialog.ui b/src/duckstation-qt/memorycardeditordialog.ui
index d09e2e945..c79527c81 100644
--- a/src/duckstation-qt/memorycardeditordialog.ui
+++ b/src/duckstation-qt/memorycardeditordialog.ui
@@ -57,7 +57,7 @@
-
-
+
-
@@ -73,10 +73,25 @@
-
-
+
New...
+
+
+ :/icons/document-new.png:/icons/document-new.png
+
+
+
+ -
+
+
+ Open...
+
+
+
+ :/icons/document-open.png:/icons/document-open.png
+
@@ -164,7 +179,7 @@
-
-
+
-
@@ -176,10 +191,25 @@
-
-
+
New...
+
+
+ :/icons/document-new.png:/icons/document-new.png
+
+
+
+ -
+
+
+ Open...
+
+
+
+ :/icons/document-open.png:/icons/document-open.png
+
@@ -285,6 +315,8 @@
-
+
+
+
diff --git a/src/duckstation-qt/resources/icons/document-new.png b/src/duckstation-qt/resources/icons/document-new.png
new file mode 100644
index 000000000..b735f96a4
Binary files /dev/null and b/src/duckstation-qt/resources/icons/document-new.png differ
diff --git a/src/duckstation-qt/resources/icons/document-new@2x.png b/src/duckstation-qt/resources/icons/document-new@2x.png
new file mode 100644
index 000000000..5447108f1
Binary files /dev/null and b/src/duckstation-qt/resources/icons/document-new@2x.png differ
diff --git a/src/duckstation-qt/resources/resources.qrc b/src/duckstation-qt/resources/resources.qrc
index 3c23c6016..19dd9559f 100644
--- a/src/duckstation-qt/resources/resources.qrc
+++ b/src/duckstation-qt/resources/resources.qrc
@@ -35,6 +35,8 @@
icons/debug-step-into.png
icons/debug-step-out.png
icons/debug-step-over.png
+ icons/document-new.png
+ icons/document-new@2x.png
icons/document-open.png
icons/document-open@2x.png
icons/document-save.png