Skip to content

Commit b52648a

Browse files
committed
new UI for array-style settings
1 parent 01ab3ad commit b52648a

1 file changed

Lines changed: 53 additions & 0 deletions

File tree

ui/settingsview.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
#pragma once
22

33
#include <QtCore/QAbstractItemModel>
4+
#include <QtCore/QHash>
45
#include <QtCore/QItemSelection>
56
#include <QtCore/QModelIndex>
7+
#include <QtCore/QPointer>
68
#include <QtCore/QRegularExpression>
79
#include <QtCore/QSize>
810
#include <QtCore/QSortFilterProxyModel>
11+
#include <QtCore/QStringList>
912
#include <QtCore/QTimer>
1013
#include <QtCore/QVariant>
1114
#include <QtGui/QMouseEvent>
@@ -19,6 +22,7 @@
1922
#include <QtWidgets/QStyledItemDelegate>
2023
#include <QtWidgets/QTableWidget>
2124
#include <QtWidgets/QTreeView>
25+
#include <QtWidgets/QVBoxLayout>
2226

2327
#include <map>
2428
#include <optional>
@@ -30,6 +34,7 @@
3034
#include "render.h"
3135
#include "menus.h"
3236
#include "clickablelabel.h"
37+
#include "theme.h"
3338

3439
/*!
3540
@@ -145,6 +150,50 @@ class BINARYNINJAUIAPI SettingsOutlineProxyModel : public QSortFilterProxyModel
145150
};
146151

147152

153+
/*!
154+
\ingroup settingsview
155+
156+
Editor widget for array-of-string settings. Renders one editable row per item
157+
plus a top row for adding new entries. Used by SettingsEditor in place of the
158+
raw JSON QLineEdit for settings whose value is a list of strings.
159+
*/
160+
class BINARYNINJAUIAPI ArrayStringSettingEditor : public QWidget
161+
{
162+
Q_OBJECT
163+
164+
private:
165+
QStringList m_enumValues;
166+
bool m_readOnly = false;
167+
QVBoxLayout* m_rowLayout = nullptr;
168+
QWidget* m_addRowWidget = nullptr;
169+
QLineEdit* m_addLineEdit = nullptr;
170+
QComboBox* m_addComboBox = nullptr;
171+
CustomStyleFlatToolButton* m_addButton = nullptr;
172+
std::vector<QWidget*> m_rows;
173+
174+
QLineEdit* addRowInputField() const;
175+
void clearRows();
176+
QString currentAddText() const;
177+
void appendRow(const QString& text);
178+
179+
private Q_SLOTS:
180+
void onAddClicked();
181+
void onRowEditingFinished();
182+
void onRowRemoveClicked();
183+
184+
public:
185+
ArrayStringSettingEditor(QWidget* parent, const QStringList& enumValues, bool readOnly);
186+
187+
void setValues(const QStringList& values);
188+
QStringList values() const;
189+
void clearAddText();
190+
191+
Q_SIGNALS:
192+
void changed();
193+
void geometryChanged();
194+
};
195+
196+
148197
/*!
149198
\ingroup settingsview
150199
*/
@@ -176,6 +225,7 @@ class BINARYNINJAUIAPI SettingsEditor : public QWidget
176225
QSpinBox* m_spinBox = nullptr;
177226
QComboBox* m_comboBox = nullptr;
178227
QTableWidget* m_objectTable = nullptr;
228+
ArrayStringSettingEditor* m_stringListEditor = nullptr;
179229
std::set<QString> m_validComboSelections;
180230
std::vector<std::pair<std::string, Json::ValueType>> m_objectTableColumns;
181231
Json::StreamWriterBuilder m_builder;
@@ -219,6 +269,8 @@ class BINARYNINJAUIAPI SettingsEditor : public QWidget
219269
void updateDoubleNumberSetting(double value);
220270
void updateIntNumberSetting(int value);
221271
void updateObjectSetting();
272+
void updateStringListSetting();
273+
void onStringListGeometryChanged();
222274
void addArraySetting(const QString& text);
223275
void resetSetting();
224276
void resetAllSettings(BNSettingsScope scope);
@@ -268,6 +320,7 @@ class BINARYNINJAUIAPI SettingsDelegate : public QStyledItemDelegate
268320
QPersistentModelIndex m_scrollAnchorIdx;
269321
int m_scrollAnchorOffset = 0;
270322
bool m_resizing = false;
323+
mutable QHash<QPersistentModelIndex, QPointer<SettingsEditor>> m_settingEditors;
271324

272325
QTreeView* m_treeView;
273326
std::function<void(const QModelIndex& index)> m_hoverAction = nullptr;

0 commit comments

Comments
 (0)