aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/debugger/debuggersourcepathmappingwidget.cpp
diff options
context:
space:
mode:
authorhjk <[email protected]>2021-03-05 12:48:26 +0100
committerhjk <[email protected]>2021-03-09 12:40:12 +0000
commit641604429a6e400324e60294f338e4eee5cb4631 (patch)
treea4c1706608d86a9f6372b18f2b2963539dafcac8 /src/plugins/debugger/debuggersourcepathmappingwidget.cpp
parentcb55af8e55b47fd5fae1a3bc9fe3ed9a1d2686ba (diff)
Debugger: Use an aspect for the source path mapping
More in line with the other settings. Change-Id: I86494f1955120cddda7d2f2eec8ba0fdbfd99585 Reviewed-by: David Schulz <[email protected]>
Diffstat (limited to 'src/plugins/debugger/debuggersourcepathmappingwidget.cpp')
-rw-r--r--src/plugins/debugger/debuggersourcepathmappingwidget.cpp167
1 files changed, 152 insertions, 15 deletions
diff --git a/src/plugins/debugger/debuggersourcepathmappingwidget.cpp b/src/plugins/debugger/debuggersourcepathmappingwidget.cpp
index d73fd47dac4..2dc1ea932b1 100644
--- a/src/plugins/debugger/debuggersourcepathmappingwidget.cpp
+++ b/src/plugins/debugger/debuggersourcepathmappingwidget.cpp
@@ -24,33 +24,74 @@
****************************************************************************/
#include "debuggersourcepathmappingwidget.h"
+
+#include "debuggeractions.h"
#include "debuggerengine.h"
#include <utils/buildablehelperlibrary.h>
#include <utils/fancylineedit.h>
#include <utils/hostosinfo.h>
+#include <utils/layoutbuilder.h>
#include <utils/pathchooser.h>
#include <utils/qtcassert.h>
#include <utils/synchronousprocess.h>
#include <utils/variablechooser.h>
-#include <QStandardItemModel>
-#include <QTreeView>
-#include <QLineEdit>
-#include <QPushButton>
-#include <QFormLayout>
#include <QFileDialog>
+#include <QFormLayout>
+#include <QGroupBox>
#include <QLabel>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QSettings>
+#include <QStandardItemModel>
+#include <QTreeView>
using namespace Utils;
-enum { SourceColumn, TargetColumn, ColumnCount };
-
namespace Debugger {
namespace Internal {
+class SourcePathMappingModel;
+
+enum { SourceColumn, TargetColumn, ColumnCount };
+
using Mapping = QPair<QString, QString>;
-using SourcePathMap = DebuggerSourcePathMappingWidget::SourcePathMap;
+
+class DebuggerSourcePathMappingWidget : public QGroupBox
+{
+ Q_DECLARE_TR_FUNCTIONS(Debugger::Internal::DebuggerSourcePathMappingWidget)
+
+public:
+ DebuggerSourcePathMappingWidget();
+
+ SourcePathMap sourcePathMap() const;
+ void setSourcePathMap(const SourcePathMap &);
+
+private:
+ void slotAdd();
+ void slotAddQt();
+ void slotRemove();
+ void slotCurrentRowChanged(const QModelIndex &,const QModelIndex &);
+ void slotEditSourceFieldChanged();
+ void slotEditTargetFieldChanged();
+
+ void resizeColumns();
+ void updateEnabled();
+ QString editSourceField() const;
+ QString editTargetField() const;
+ void setEditFieldMapping(const QPair<QString, QString> &m);
+ int currentRow() const;
+ void setCurrentRow(int r);
+
+ SourcePathMappingModel *m_model;
+ QTreeView *m_treeView;
+ QPushButton *m_addButton;
+ QPushButton *m_addQtButton;
+ QPushButton *m_removeButton;
+ QLineEdit *m_sourceLineEdit;
+ Utils::PathChooser *m_targetChooser;
+};
// Qt's various build paths for unpatched versions.
QStringList qtBuildPaths()
@@ -198,8 +239,7 @@ void SourcePathMappingModel::setTarget(int row, const QString &t)
Path mappings to be applied using source path substitution in GDB.
*/
-DebuggerSourcePathMappingWidget::DebuggerSourcePathMappingWidget(QWidget *parent) :
- QGroupBox(parent),
+DebuggerSourcePathMappingWidget::DebuggerSourcePathMappingWidget() :
m_model(new SourcePathMappingModel(this)),
m_treeView(new QTreeView(this)),
m_addButton(new QPushButton(tr("Add"), this)),
@@ -431,11 +471,8 @@ static QString findQtInstallPath(const FilePath &qmakePath)
return QString();
}
-/* Merge settings for an installed Qt (unless another setting
- * is already in the map. */
-DebuggerSourcePathMappingWidget::SourcePathMap
- DebuggerSourcePathMappingWidget::mergePlatformQtPath(const DebuggerRunParameters &sp,
- const SourcePathMap &in)
+/* Merge settings for an installed Qt (unless another setting is already in the map. */
+SourcePathMap mergePlatformQtPath(const DebuggerRunParameters &sp, const SourcePathMap &in)
{
const FilePath qmake = BuildableHelperLibrary::findSystemQt(sp.inferior.environment);
// FIXME: Get this from the profile?
@@ -456,5 +493,105 @@ DebuggerSourcePathMappingWidget::SourcePathMap
return rc;
}
+//
+// SourcePathMapAspect
+//
+
+class SourcePathMapAspectPrivate
+{
+public:
+ QPointer<DebuggerSourcePathMappingWidget> m_widget;
+};
+
+
+SourcePathMapAspect::SourcePathMapAspect()
+ : d(new SourcePathMapAspectPrivate)
+{
+}
+
+SourcePathMapAspect::~SourcePathMapAspect()
+{
+ delete d;
+}
+
+void SourcePathMapAspect::fromMap(const QVariantMap &)
+{
+ QTC_CHECK(false); // This is only used via read/writeSettings
+}
+
+void SourcePathMapAspect::toMap(QVariantMap &) const
+{
+ QTC_CHECK(false);
+}
+
+void SourcePathMapAspect::addToLayout(LayoutBuilder &builder)
+{
+ QTC_CHECK(!d->m_widget);
+ d->m_widget = createSubWidget<DebuggerSourcePathMappingWidget>();
+ d->m_widget->setSourcePathMap(value());
+ builder.addRow(d->m_widget.data());
+}
+
+QVariant SourcePathMapAspect::volatileValue() const
+{
+ QTC_CHECK(!isAutoApply());
+ QTC_ASSERT(d->m_widget, return {});
+ return QVariant::fromValue(d->m_widget->sourcePathMap());
+}
+
+void SourcePathMapAspect::setVolatileValue(const QVariant &val)
+{
+ QTC_CHECK(!isAutoApply());
+ if (d->m_widget)
+ d->m_widget->setSourcePathMap(val.value<SourcePathMap>());
+}
+
+const char sourcePathMappingArrayNameC[] = "SourcePathMappings";
+const char sourcePathMappingSourceKeyC[] = "Source";
+const char sourcePathMappingTargetKeyC[] = "Target";
+
+SourcePathMap SourcePathMapAspect::value() const
+{
+ return BaseAspect::value().value<SourcePathMap>();
+}
+
+void SourcePathMapAspect::writeSettings(QSettings *s) const
+{
+ const SourcePathMap sourcePathMap = value();
+ s->beginWriteArray(sourcePathMappingArrayNameC);
+ if (!sourcePathMap.isEmpty()) {
+ const QString sourcePathMappingSourceKey(sourcePathMappingSourceKeyC);
+ const QString sourcePathMappingTargetKey(sourcePathMappingTargetKeyC);
+ int i = 0;
+ for (auto it = sourcePathMap.constBegin(), cend = sourcePathMap.constEnd();
+ it != cend;
+ ++it, ++i) {
+ s->setArrayIndex(i);
+ s->setValue(sourcePathMappingSourceKey, it.key());
+ s->setValue(sourcePathMappingTargetKey, it.value());
+ }
+ }
+ s->endArray();
+}
+
+void SourcePathMapAspect::readSettings(const QSettings *settings)
+{
+ // Eeks. But legitimate, this operates on ICore::settings();
+ QSettings *s = const_cast<QSettings *>(settings);
+ SourcePathMap sourcePathMap;
+ if (const int count = s->beginReadArray(sourcePathMappingArrayNameC)) {
+ const QString sourcePathMappingSourceKey(sourcePathMappingSourceKeyC);
+ const QString sourcePathMappingTargetKey(sourcePathMappingTargetKeyC);
+ for (int i = 0; i < count; ++i) {
+ s->setArrayIndex(i);
+ const QString key = s->value(sourcePathMappingSourceKey).toString();
+ const QString value = s->value(sourcePathMappingTargetKey).toString();
+ sourcePathMap.insert(key, value);
+ }
+ }
+ s->endArray();
+ setValue(QVariant::fromValue(sourcePathMap));
+}
+
} // namespace Internal
} // namespace Debugger