Skip to content

Commit 604ec05

Browse files
committed
Open URL or filename: relative filenames are based on DB path and refactor
When opening a relative filename from "Edit DB Cell" or Table Browser the relative paths are interpreted from the DB file location. This allows portability of DB and linked files to a new location. Refactoring so the open URL code is centralised in MainWindow and a status message is displayed with error or opening notification. See issue #1597
1 parent 34c1553 commit 604ec05

6 files changed

Lines changed: 23 additions & 14 deletions

File tree

src/EditDialog.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include <QPainter>
2020
#include <QClipboard>
2121
#include <QTextDocument>
22-
#include <QDesktopServices>
2322
#include <QMenu>
2423

2524
#include <Qsci/qsciscintilla.h>
@@ -78,22 +77,16 @@ EditDialog::EditDialog(QWidget* parent)
7877
});
7978

8079
connect(ui->actionOpenInApp, &QAction::triggered, this, [&]() {
81-
QUrl url;
8280
switch (dataSource) {
8381
case SciBuffer:
84-
url.setUrl(sciEdit->text(), QUrl::TolerantMode);
82+
emit requestUrlOrFileOpen(sciEdit->text());
8583
break;
8684
case QtBuffer:
87-
url.setUrl(ui->qtEdit->toPlainText(), QUrl::TolerantMode);;
85+
emit requestUrlOrFileOpen(ui->qtEdit->toPlainText());
8886
break;
8987
default:
9088
return;
9189
}
92-
if(url.isValid())
93-
QDesktopServices::openUrl(url);
94-
else
95-
QMessageBox::warning(this, QApplication::applicationName(),
96-
tr("Content is not a valid URL or filename: %1").arg(url.errorString()));
9790
});
9891

9992
mustIndentAndCompact = Settings::getValue("databrowser", "indent_compact").toBool();

src/EditDialog.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ private slots:
5151

5252
signals:
5353
void recordTextUpdated(const QPersistentModelIndex& idx, const QByteArray& bArrdata, bool isBlob);
54+
void requestUrlOrFileOpen(const QString& urlString);
5455

5556
private:
5657
Ui::EditDialog* ui;

src/ExtendedTableWidget.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
#include <QCompleter>
2525
#include <QComboBox>
2626
#include <QShortcut>
27-
#include <QDesktopServices>
2827

2928
#include <limits>
3029

@@ -912,10 +911,7 @@ void ExtendedTableWidget::cellClicked(const QModelIndex& index)
912911
// TODO: Qt is doing a contiguous selection when Control+Click is pressed. It should be disabled, but at least moving the
913912
// current index gives better result.
914913
setCurrentIndex(index);
915-
916-
QUrl url (model()->data(index, Qt::EditRole).toString(), QUrl::TolerantMode);
917-
if(url.isValid())
918-
QDesktopServices::openUrl(url);
914+
emit requestUrlOrFileOpen(model()->data(index, Qt::EditRole).toString());
919915
}
920916
}
921917
}

src/ExtendedTableWidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public slots:
7575
void selectedRowsToBeDeleted();
7676
void editCondFormats(int column);
7777
void currentIndexChanged(const QModelIndex &current, const QModelIndex &previous);
78+
void requestUrlOrFileOpen(const QString& urlString);
7879

7980
private:
8081
void copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL);

src/MainWindow.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ void MainWindow::init()
400400

401401
// Connect some more signals and slots
402402
connect(editDock, &EditDialog::recordTextUpdated, this, &MainWindow::updateRecordText);
403+
connect(editDock, &EditDialog::requestUrlOrFileOpen, this, &MainWindow::openUrlOrFile);
403404
connect(ui->dbTreeWidget->selectionModel(), &QItemSelectionModel::currentChanged, this, &MainWindow::changeTreeSelection);
404405
connect(ui->dockEdit, &QDockWidget::visibilityChanged, this, &MainWindow::toggleEditDock);
405406
connect(m_remoteDb, SIGNAL(openFile(QString)), this, SLOT(fileOpen(QString)));
@@ -749,6 +750,9 @@ void MainWindow::attachPlot(ExtendedTableWidget* tableWidget, SqliteTableModel*
749750
// Connect plot selection to the current table results widget.
750751
connect(plotDock, SIGNAL(pointsSelected(int,int)), tableWidget, SLOT(selectTableLines(int, int)));
751752
connect(tableWidget, &ExtendedTableWidget::destroyed, plotDock, &PlotDock::resetPlot);
753+
// Disconnect requestUrlOrFileOpen in order to make sure that there is only one connection. Otherwise we can open it several times.
754+
disconnect(tableWidget, &ExtendedTableWidget::requestUrlOrFileOpen, this, &MainWindow::openUrlOrFile);
755+
connect(tableWidget, &ExtendedTableWidget::requestUrlOrFileOpen, this, &MainWindow::openUrlOrFile);
752756
}
753757
}
754758

@@ -3326,3 +3330,16 @@ void MainWindow::showContextMenuSqlTabBar(const QPoint& pos)
33263330
menuTabs->addAction(actionClose);
33273331
menuTabs->exec(ui->tabSqlAreas->mapToGlobal(pos));
33283332
}
3333+
3334+
void MainWindow::openUrlOrFile(const QString& urlString)
3335+
{
3336+
QUrl url = QUrl::fromUserInput(urlString, QFileInfo(db.currentFile()).path(), QUrl::AssumeLocalFile);
3337+
if(url.isValid()) {
3338+
if(QDesktopServices::openUrl(url))
3339+
showStatusMessage5s(tr("Opening '%1'...").arg(url.toDisplayString()));
3340+
else
3341+
showStatusMessage5s(tr("There was an error opening '%1'...").arg(url.toDisplayString()));
3342+
3343+
} else
3344+
showStatusMessage5s(tr("Value is not a valid URL or filename: %1").arg(url.errorString()));
3345+
}

src/MainWindow.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ private slots:
204204
void saveSqlFile(int tabIndex);
205205
void saveAll();
206206
void showContextMenuSqlTabBar(const QPoint& pos);
207+
void openUrlOrFile(const QString& urlString);
207208
};
208209

209210
#endif

0 commit comments

Comments
 (0)