diff --git a/qbolt/mainwindow.cpp b/qbolt/mainwindow.cpp index 4d1117f..3e86245 100644 --- a/qbolt/mainwindow.cpp +++ b/qbolt/mainwindow.cpp @@ -35,6 +35,8 @@ MainWindow::~MainWindow() } static const int BdbPointerRole = Qt::UserRole + 1; +static const int BinaryDataRole = Qt::UserRole + 2; + #define SET_BDB(top, bdb) top->setData(0, BdbPointerRole, QVariant::fromValue(static_cast(bdb))) #define GET_BDB(top) static_cast( top->data(0, BdbPointerRole).value() ) @@ -86,6 +88,12 @@ void MainWindow::openDatabase(QString file, bool readOnly) ui->bucketTree->expandItem(top); } +static const QString getDisplayName(const QByteArray &qba) { + // FIXME the formatting isn't so great when control characters, etc. are used + // A C-style escape display, or the unicode-replacement-character would be preferable + return QString::fromUtf8(qba); +} + void MainWindow::refreshBucketTree(QTreeWidgetItem* itm) { QTreeWidgetItem *top = itm; @@ -108,7 +116,8 @@ void MainWindow::refreshBucketTree(QTreeWidgetItem* itm) error, [=](QByteArray qba){ QTreeWidgetItem *child = new QTreeWidgetItem(); - child->setText(0, QString::fromUtf8(qba)); + child->setText(0, getDisplayName(qba)); + child->setData(0, BinaryDataRole, qba); child->setIcon(0, QIcon(":/rsrc/table.png")); itm->addChild(child); @@ -257,7 +266,8 @@ void MainWindow::refreshData(BoltDB *bdb, QStringList browse) QString err; bool ok = bdb->listKeys(browse, err, [=](QByteArray name, int64_t dataLen) { auto *itm = new QTreeWidgetItem(); - itm->setText(0, QString::fromUtf8(name)); + itm->setText(0, getDisplayName(name)); + itm->setData(0, BinaryDataRole, name); itm->setText(1, QString("%1").arg(dataLen)); ui->bucketData->addTopLevelItem(itm); }); @@ -320,15 +330,15 @@ void MainWindow::on_bucketData_doubleClicked(const QModelIndex &index) // Get item key auto model = index.model(); - QString key = model->data(model->index(index.row(), 0), 0).toString(); + const QByteArray& key = model->data(model->index(index.row(), 0), BinaryDataRole).toByteArray(); // DB lookup bdb->getData( browse, - key.toUtf8(), + key, [=](QByteArray content) { - openEditor(bdb, browse, key.toUtf8(), content); + openEditor(bdb, browse, key, content); }, [=](QString error) { QMessageBox qmb; @@ -369,8 +379,16 @@ void MainWindow::on_actionDelete_bucket_triggered() GET_ITM_TOP_BROWSE_BDB; // Prompt for confirmation - QString bucketToDelete = itm->text(0); - if (QMessageBox::question(this, tr("Delete bucket"), tr("Are you sure you want to remove the bucket '%1'?").arg(bucketToDelete), QMessageBox::Yes, QMessageBox::Cancel) != QMessageBox::Yes) { + const QByteArray& bucketToDelete = itm->data(0, BinaryDataRole).toByteArray(); + if ( + QMessageBox::question( + this, + tr("Delete bucket"), + tr("Are you sure you want to remove the bucket '%1'?").arg(getDisplayName(bucketToDelete)), + QMessageBox::Yes, + QMessageBox::Cancel + ) != QMessageBox::Yes + ) { return; } @@ -381,7 +399,7 @@ void MainWindow::on_actionDelete_bucket_triggered() browse.pop_back(); QString err; - if (! bdb->deleteBucket(browse, bucketToDelete.toUtf8(), err)) { + if (! bdb->deleteBucket(browse, bucketToDelete, err)) { QMessageBox qmb; qmb.setText(tr("Error removing bucket: %1").arg(err)); qmb.exec();