Merge pull request #2363 from Cacodemon345/dndsupp
qt: Add Drag And Drop support for removable media icons
This commit is contained in:
@@ -361,7 +361,11 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
|||||||
connect((ClickableLabel*)d->cassette.label.get(), &ClickableLabel::clicked, [](QPoint pos) {
|
connect((ClickableLabel*)d->cassette.label.get(), &ClickableLabel::clicked, [](QPoint pos) {
|
||||||
MediaMenu::ptr->cassetteMenu->popup(pos - QPoint(0, MediaMenu::ptr->cassetteMenu->sizeHint().height()));
|
MediaMenu::ptr->cassetteMenu->popup(pos - QPoint(0, MediaMenu::ptr->cassetteMenu->sizeHint().height()));
|
||||||
});
|
});
|
||||||
|
connect((ClickableLabel*)d->cassette.label.get(), &ClickableLabel::dropped, [](QString str) {
|
||||||
|
MediaMenu::ptr->cassetteMount(str, false);
|
||||||
|
});
|
||||||
d->cassette.label->setToolTip(MediaMenu::ptr->cassetteMenu->title());
|
d->cassette.label->setToolTip(MediaMenu::ptr->cassetteMenu->title());
|
||||||
|
d->cassette.label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->cassette.label.get());
|
sbar->addWidget(d->cassette.label.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,7 +376,11 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
|||||||
connect((ClickableLabel*)d->cartridge[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
connect((ClickableLabel*)d->cartridge[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||||
MediaMenu::ptr->cartridgeMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cartridgeMenus[i]->sizeHint().height()));
|
MediaMenu::ptr->cartridgeMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cartridgeMenus[i]->sizeHint().height()));
|
||||||
});
|
});
|
||||||
|
connect((ClickableLabel*)d->cartridge[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
||||||
|
MediaMenu::ptr->cartridgeMount(i, str);
|
||||||
|
});
|
||||||
d->cartridge[i].label->setToolTip(MediaMenu::ptr->cartridgeMenus[i]->title());
|
d->cartridge[i].label->setToolTip(MediaMenu::ptr->cartridgeMenus[i]->title());
|
||||||
|
d->cartridge[i].label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->cartridge[i].label.get());
|
sbar->addWidget(d->cartridge[i].label.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -392,7 +400,11 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
|||||||
connect((ClickableLabel*)d->fdd[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
connect((ClickableLabel*)d->fdd[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||||
MediaMenu::ptr->floppyMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->floppyMenus[i]->sizeHint().height()));
|
MediaMenu::ptr->floppyMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->floppyMenus[i]->sizeHint().height()));
|
||||||
});
|
});
|
||||||
|
connect((ClickableLabel*)d->fdd[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
||||||
|
MediaMenu::ptr->floppyMount(i, str, false);
|
||||||
|
});
|
||||||
d->fdd[i].label->setToolTip(MediaMenu::ptr->floppyMenus[i]->title());
|
d->fdd[i].label->setToolTip(MediaMenu::ptr->floppyMenus[i]->title());
|
||||||
|
d->fdd[i].label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->fdd[i].label.get());
|
sbar->addWidget(d->fdd[i].label.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -403,7 +415,11 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
|||||||
connect((ClickableLabel*)d->cdrom[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
connect((ClickableLabel*)d->cdrom[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||||
MediaMenu::ptr->cdromMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cdromMenus[i]->sizeHint().height()));
|
MediaMenu::ptr->cdromMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->cdromMenus[i]->sizeHint().height()));
|
||||||
});
|
});
|
||||||
|
connect((ClickableLabel*)d->cdrom[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
||||||
|
MediaMenu::ptr->cdromMount(i, str);
|
||||||
|
});
|
||||||
d->cdrom[i].label->setToolTip(MediaMenu::ptr->cdromMenus[i]->title());
|
d->cdrom[i].label->setToolTip(MediaMenu::ptr->cdromMenus[i]->title());
|
||||||
|
d->cdrom[i].label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->cdrom[i].label.get());
|
sbar->addWidget(d->cdrom[i].label.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -414,7 +430,11 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
|||||||
connect((ClickableLabel*)d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
connect((ClickableLabel*)d->zip[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||||
MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height()));
|
MediaMenu::ptr->zipMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->zipMenus[i]->sizeHint().height()));
|
||||||
});
|
});
|
||||||
|
connect((ClickableLabel*)d->zip[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
||||||
|
MediaMenu::ptr->zipMount(i, str, false);
|
||||||
|
});
|
||||||
d->zip[i].label->setToolTip(MediaMenu::ptr->zipMenus[i]->title());
|
d->zip[i].label->setToolTip(MediaMenu::ptr->zipMenus[i]->title());
|
||||||
|
d->zip[i].label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->zip[i].label.get());
|
sbar->addWidget(d->zip[i].label.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -425,7 +445,11 @@ void MachineStatus::refresh(QStatusBar* sbar) {
|
|||||||
connect((ClickableLabel*)d->mo[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
connect((ClickableLabel*)d->mo[i].label.get(), &ClickableLabel::clicked, [i](QPoint pos) {
|
||||||
MediaMenu::ptr->moMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->moMenus[i]->sizeHint().height()));
|
MediaMenu::ptr->moMenus[i]->popup(pos - QPoint(0, MediaMenu::ptr->moMenus[i]->sizeHint().height()));
|
||||||
});
|
});
|
||||||
|
connect((ClickableLabel*)d->mo[i].label.get(), &ClickableLabel::dropped, [i](QString str) {
|
||||||
|
MediaMenu::ptr->moMount(i, str, false);
|
||||||
|
});
|
||||||
d->mo[i].label->setToolTip(MediaMenu::ptr->moMenus[i]->title());
|
d->mo[i].label->setToolTip(MediaMenu::ptr->moMenus[i]->title());
|
||||||
|
d->mo[i].label->setAcceptDrops(true);
|
||||||
sbar->addWidget(d->mo[i].label.get());
|
sbar->addWidget(d->mo[i].label.get());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -4,6 +4,7 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
|
#include <QMimeData>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@@ -19,10 +20,35 @@ class ClickableLabel : public QLabel {
|
|||||||
signals:
|
signals:
|
||||||
void clicked(QPoint);
|
void clicked(QPoint);
|
||||||
void doubleClicked(QPoint);
|
void doubleClicked(QPoint);
|
||||||
|
void dropped(QString);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QMouseEvent* event) override { emit clicked(event->globalPos()); }
|
void mousePressEvent(QMouseEvent* event) override { emit clicked(event->globalPos()); }
|
||||||
void mouseDoubleClickEvent(QMouseEvent* event) override { emit doubleClicked(event->globalPos()); }
|
void mouseDoubleClickEvent(QMouseEvent* event) override { emit doubleClicked(event->globalPos()); }
|
||||||
|
void dragEnterEvent(QDragEnterEvent* event) override
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasUrls() && event->mimeData()->urls().size() == 1) {
|
||||||
|
event->setDropAction(Qt::CopyAction);
|
||||||
|
event->acceptProposedAction();
|
||||||
|
}
|
||||||
|
else event->ignore();
|
||||||
|
}
|
||||||
|
void dragMoveEvent(QDragMoveEvent* event) override
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasUrls() && event->mimeData()->urls().size() == 1) {
|
||||||
|
event->setDropAction(Qt::CopyAction);
|
||||||
|
event->acceptProposedAction();
|
||||||
|
}
|
||||||
|
else event->ignore();
|
||||||
|
}
|
||||||
|
void dropEvent(QDropEvent* event) override
|
||||||
|
{
|
||||||
|
if (event->dropAction() == Qt::CopyAction)
|
||||||
|
{
|
||||||
|
emit dropped(event->mimeData()->urls()[0].toLocalFile());
|
||||||
|
}
|
||||||
|
else event->ignore();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class MachineStatus : public QObject
|
class MachineStatus : public QObject
|
||||||
|
@@ -230,6 +230,18 @@ void MediaMenu::cassetteUpdateMenu() {
|
|||||||
cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(), (name.isEmpty() ? tr("(empty)") : name).toUtf8().constData()));
|
cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(), (name.isEmpty() ? tr("(empty)") : name).toUtf8().constData()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MediaMenu::cartridgeMount(int i, const QString &filename)
|
||||||
|
{
|
||||||
|
cart_close(i);
|
||||||
|
QByteArray filenameBytes = filename.toUtf8();
|
||||||
|
cart_load(i, filenameBytes.data());
|
||||||
|
|
||||||
|
ui_sb_update_icon_state(SB_CARTRIDGE | i, filename.isEmpty() ? 1 : 0);
|
||||||
|
cartridgeUpdateMenu(i);
|
||||||
|
ui_sb_update_tip(SB_CARTRIDGE | i);
|
||||||
|
config_save();
|
||||||
|
}
|
||||||
|
|
||||||
void MediaMenu::cartridgeSelectImage(int i) {
|
void MediaMenu::cartridgeSelectImage(int i) {
|
||||||
auto filename = QFileDialog::getOpenFileName(
|
auto filename = QFileDialog::getOpenFileName(
|
||||||
parentWidget,
|
parentWidget,
|
||||||
@@ -243,14 +255,7 @@ void MediaMenu::cartridgeSelectImage(int i) {
|
|||||||
if (filename.isEmpty()) {
|
if (filename.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cart_close(i);
|
cartridgeMount(i, filename);
|
||||||
QByteArray filenameBytes = filename.toUtf8();
|
|
||||||
cart_load(i, filenameBytes.data());
|
|
||||||
|
|
||||||
ui_sb_update_icon_state(SB_CARTRIDGE | i, filename.isEmpty() ? 1 : 0);
|
|
||||||
cartridgeUpdateMenu(i);
|
|
||||||
ui_sb_update_tip(SB_CARTRIDGE | i);
|
|
||||||
config_save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaMenu::cartridgeEject(int i) {
|
void MediaMenu::cartridgeEject(int i) {
|
||||||
@@ -361,22 +366,8 @@ void MediaMenu::cdromMute(int i) {
|
|||||||
sound_cd_thread_reset();
|
sound_cd_thread_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MediaMenu::cdromMount(int i) {
|
void MediaMenu::cdromMount(int i, const QString &filename)
|
||||||
QString dir;
|
{
|
||||||
QFileInfo fi(cdrom[i].image_path);
|
|
||||||
|
|
||||||
auto filename = QFileDialog::getOpenFileName(
|
|
||||||
parentWidget,
|
|
||||||
QString(),
|
|
||||||
QString(),
|
|
||||||
tr("CD-ROM images") %
|
|
||||||
util::DlgFilter({ "iso","cue" }) %
|
|
||||||
tr("All files") %
|
|
||||||
util::DlgFilter({ "*" }, true));
|
|
||||||
|
|
||||||
if (filename.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QByteArray fn = filename.toUtf8().data();
|
QByteArray fn = filename.toUtf8().data();
|
||||||
|
|
||||||
cdrom[i].prev_host_drive = cdrom[i].host_drive;
|
cdrom[i].prev_host_drive = cdrom[i].host_drive;
|
||||||
@@ -401,6 +392,26 @@ void MediaMenu::cdromMount(int i) {
|
|||||||
config_save();
|
config_save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MediaMenu::cdromMount(int i) {
|
||||||
|
QString dir;
|
||||||
|
QFileInfo fi(cdrom[i].image_path);
|
||||||
|
|
||||||
|
auto filename = QFileDialog::getOpenFileName(
|
||||||
|
parentWidget,
|
||||||
|
QString(),
|
||||||
|
QString(),
|
||||||
|
tr("CD-ROM images") %
|
||||||
|
util::DlgFilter({ "iso","cue" }) %
|
||||||
|
tr("All files") %
|
||||||
|
util::DlgFilter({ "*" }, true));
|
||||||
|
|
||||||
|
if (filename.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cdromMount(i, filename);
|
||||||
|
}
|
||||||
|
|
||||||
void MediaMenu::cdromEject(int i) {
|
void MediaMenu::cdromEject(int i) {
|
||||||
cdrom_eject(i);
|
cdrom_eject(i);
|
||||||
cdromUpdateMenu(i);
|
cdromUpdateMenu(i);
|
||||||
|
@@ -25,6 +25,7 @@ public:
|
|||||||
void cassetteUpdateMenu();
|
void cassetteUpdateMenu();
|
||||||
|
|
||||||
void cartridgeSelectImage(int i);
|
void cartridgeSelectImage(int i);
|
||||||
|
void cartridgeMount(int i, const QString& filename);
|
||||||
void cartridgeEject(int i);
|
void cartridgeEject(int i);
|
||||||
void cartridgeUpdateMenu(int i);
|
void cartridgeUpdateMenu(int i);
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ public:
|
|||||||
|
|
||||||
void cdromMute(int i);
|
void cdromMute(int i);
|
||||||
void cdromMount(int i);
|
void cdromMount(int i);
|
||||||
|
void cdromMount(int i, const QString& filename);
|
||||||
void cdromEject(int i);
|
void cdromEject(int i);
|
||||||
void cdromReload(int i);
|
void cdromReload(int i);
|
||||||
void cdromUpdateMenu(int i);
|
void cdromUpdateMenu(int i);
|
||||||
|
Reference in New Issue
Block a user