diff --git a/src/define.h b/src/define.h index 03325981940dbe0a8c5ed7b65ce6f473c04e7ebf..6f119d8b4e598a8b9092e22a597d56bad2d33307 100644 --- a/src/define.h +++ b/src/define.h @@ -1,8 +1,6 @@ #ifndef DEFINE_H #define DEFINE_H - - #define INI_FORMATTING_SEC_NAME "Formatting" #define INI_FORMATTING_EOL_NAME "Formatting/EOL" #define INI_FORMATTING_LINE_NAME "Formatting/LINE_FORMATTING" @@ -15,6 +13,8 @@ #define INI_OTHER_IGNORE_COMMENT_NAME "Others/IGNORE_COMMENT" #define INI_OTHER_IGNORE_COMMA_NAME "Others/IGNORE_TRAILING_COMMA" +#define INI_OTHER_USE_TABLE_VIEW_NAME "Others/USE_TABLE_VIEW" + enum class LineEnding { AUTO, @@ -56,6 +56,7 @@ struct Setting bool bFollowCurrentTab = false; bool bAutoFormat = false; ParseOptions parseOptions{}; + bool useTableView = true; }; -#endif // DEFINE_H +#endif // DEFINE_H diff --git a/src/jsonviewsettings.cpp b/src/jsonviewsettings.cpp index ab805124a21c79d7f719b7a56a5a46029ac4446f..cfa2d549547364fecc67b44b821a7e83a23aa7ca 100644 --- a/src/jsonviewsettings.cpp +++ b/src/jsonviewsettings.cpp @@ -40,6 +40,9 @@ void JsonViewSettings::slot_ConfirmClicked() configSetting_->setValue(INI_FORMATTING_EOL_NAME, getLineEnding()); configSetting_->setValue(INI_FORMATTING_LINE_NAME, getLineFormatting()); + //! use table view or not + configSetting_->setValue(INI_OTHER_USE_TABLE_VIEW_NAME, getJsonViewUseTableView()); + //! other settings for PlugSettings pluginSetting_.bFollowCurrentTab = ui->cb_follow_current_tab->isChecked(); pluginSetting_.bAutoFormat = ui->cb_auto_format_when_opened->isChecked(); @@ -51,6 +54,9 @@ void JsonViewSettings::slot_ConfirmClicked() pluginSetting_.lineEnding = static_cast(getLineEnding()); pluginSetting_.lineFormat = static_cast(getLineFormatting()); + //! use table view or not + pluginSetting_.useTableView = getJsonViewUseTableView(); + this->hide(); } @@ -115,6 +121,13 @@ void JsonViewSettings::init(const QString &pluginPath) } pluginSetting_.parseOptions.bIgnoreTrailingComma = configSetting_->value(INI_OTHER_IGNORE_COMMA_NAME).toBool(); ui->cb_ignore_trailing_comma->setChecked(pluginSetting_.parseOptions.bIgnoreTrailingComma); + + if (!configSetting_->contains(INI_OTHER_USE_TABLE_VIEW_NAME)) + { + configSetting_->setValue(INI_OTHER_USE_TABLE_VIEW_NAME, 1); + } + pluginSetting_.useTableView = configSetting_->value(INI_OTHER_USE_TABLE_VIEW_NAME).toBool(); + ui->cb_use_table_view->setChecked(pluginSetting_.useTableView); } void JsonViewSettings::setIndentation(int var) @@ -309,3 +322,7 @@ int JsonViewSettings::getLineFormatting() const return (int)LineFormat::DEFAULT; } +int JsonViewSettings::getJsonViewUseTableView() const +{ + return ui->cb_use_table_view->isChecked(); +} diff --git a/src/jsonviewsettings.h b/src/jsonviewsettings.h index 9468e5e363caae7804f00c8bb69600db75fa3d8c..0d5dd86d3251d604c00aa9c1c1f12688d3e549d7 100644 --- a/src/jsonviewsettings.h +++ b/src/jsonviewsettings.h @@ -42,6 +42,7 @@ private: [[nodiscard]] int getIndentation() const; [[nodiscard]] int getLineEnding() const; [[nodiscard]] int getLineFormatting() const; + [[nodiscard]] int getJsonViewUseTableView() const; void initConnection(); diff --git a/src/jsonviewsettings.ui b/src/jsonviewsettings.ui index 16aeafb120f13de8b28a262e13b839c0cd55e877..f749ab67c787ae369de22ed64b3f1cb0ea17f512 100644 --- a/src/jsonviewsettings.ui +++ b/src/jsonviewsettings.ui @@ -252,6 +252,19 @@ + + + + 20 + 140 + 241 + 16 + + + + Json tree use TableView + + diff --git a/src/nddjsonplugin.cpp b/src/nddjsonplugin.cpp index 868b4e7ba3082f5310f262d35af8b97450553f21..37b44dd1136769db8d6681de8a257e0f15ebcda5 100644 --- a/src/nddjsonplugin.cpp +++ b/src/nddjsonplugin.cpp @@ -48,6 +48,8 @@ NDDJsonPlugin::NDDJsonPlugin(QWidget *mainWidget, const QString &pluginPath, Qsc auto mainWindow = dynamic_cast(mainWidget); mainWindow->addDockWidget(Qt::LeftDockWidgetArea, dockWidget_); + + jsonModel_->setTableViewOrTreeView(jsonViewSettings_->getPluginSetting().useTableView); } void NDDJsonPlugin::getJsonViewMenu(QMenu *menu) { @@ -243,38 +245,37 @@ void NDDJsonPlugin::validateJson() } void NDDJsonPlugin::findNode(const QString &str) { - bool isStartSelected = false; auto selected = treeView_->currentIndex(); - if (!selected.isValid()) + if (searchNode(selected, str)) { - isStartSelected = true; - selected = jsonModel_->index(0, 0); + return; } - auto match = jsonModel_->match(selected, Qt::DisplayRole, QVariant::fromValue("*" + str + "*"), 2, - Qt::MatchContains | Qt::MatchRecursive | Qt::MatchRegExp | Qt::MatchWrap); - if (!match.isEmpty()) + while (true) { - treeView_->setExpanded(match.first(), true); - treeView_->setCurrentIndex(match.first()); - } - else - { - if (!isStartSelected) + auto parent = selected.parent(); + if (!parent.isValid()) { - match = jsonModel_->match(jsonModel_->index(0, 0), Qt::DisplayRole, QVariant::fromValue("*" + str + "*"), 2, - Qt::MatchContains | Qt::MatchRecursive | Qt::MatchRegExp | Qt::MatchWrap); - if (!match.isEmpty()) - { - treeView_->setExpanded(match.first(), true); - treeView_->setCurrentIndex(match.first()); - } - else - { - showMessage("Warning", QString("Cannot found with %1").arg(str).toStdString(), 1); - } + break; } else + { + selected = parent; + } + } + + if (!selected.isValid()) + { + selected = jsonModel_->index(0, 0); + } + else + { + selected = selected.siblingAtRow(selected.row() + 1); + } + + if (!searchNode(selected, str)) + { + if (!searchNode(jsonModel_->index(0, 0), str)) { showMessage("Warning", QString("Cannot found with %1").arg(str).toStdString(), 1); } @@ -290,3 +291,27 @@ void NDDJsonPlugin::setScintilla(const std::function &cb) scintillaEditor_ = new ScintillaEditor(cb); } +bool NDDJsonPlugin::searchNode(QModelIndex index, const QString &str) +{ + auto match = jsonModel_->match(index, Qt::DisplayRole, QVariant::fromValue("*" + str + "*"), -1, + Qt::MatchContains | Qt::MatchRecursive | Qt::MatchRegExp); + + if (!match.isEmpty()) + { + if (match.first() == treeView_->currentIndex()) + { + match.removeFirst(); + } + if (!match.isEmpty()) + { + treeView_->setExpanded(match.first(), true); + treeView_->setCurrentIndex(match.first()); + + return true; + } + + return false; + } + + return false; +} diff --git a/src/nddjsonplugin.h b/src/nddjsonplugin.h index e3609136ffa2c34053e2a45cdbbff1059e797143..333b350d716005c2a9be88c1150cd5e0cf9fcace 100644 --- a/src/nddjsonplugin.h +++ b/src/nddjsonplugin.h @@ -43,6 +43,7 @@ private: void refreshTableJson(); void validateJson(); void findNode(const QString &str); + bool searchNode(QModelIndex index, const QString& str); private: JsonViewSettings *jsonViewSettings_; diff --git a/src/qjsonmodel.cpp b/src/qjsonmodel.cpp index af08d1c6f3c04b671efd31f64fab3060ea2fccad..64af499dc67c5f825554f140ba0cf23b08123168 100644 --- a/src/qjsonmodel.cpp +++ b/src/qjsonmodel.cpp @@ -293,11 +293,29 @@ QVariant QJsonModel::data(const QModelIndex &index, int role) const auto *item = static_cast(index.internalPointer()); if (role == Qt::DisplayRole) { - if (index.column() == 0) - return QString("%1").arg(item->key()); + if (!isTableView_) { + if (item->type() == QJsonValue::Array) { + if (item->childCount() != 0) { + return QString("%1: [%2]").arg(item->key()).arg(item->childCount()); + } else { + return item->key() + ": " + item->value().toString(); + } + } else if (item->type() == QJsonValue::Object) { + if (item->childCount() != 0) { + return QString("%1: {%2}").arg(item->key()).arg(item->childCount()); + } else { + return item->key() + ": " + item->value().toString(); + } + } else { + return item->key() + ": " + item->value().toString(); + } + } else { + if (index.column() == 0) + return QString("%1").arg(item->key()); - if (index.column() == 1) - return item->value(); + if (index.column() == 1) + return item->value(); + } } else if (Qt::EditRole == role) { if (index.column() == 1) return item->value(); @@ -326,8 +344,15 @@ QVariant QJsonModel::headerData(int section, Qt::Orientation orientation, int ro if (role != Qt::DisplayRole) return {}; - if (orientation == Qt::Horizontal) - return mHeaders.value(section); + if (orientation == Qt::Horizontal) { + if (isTableView_) + { + return mHeaders.value(section); + } + else { + return "JSON"; + } + } else return {}; } @@ -382,7 +407,11 @@ int QJsonModel::rowCount(const QModelIndex &parent) const int QJsonModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent) - return 2; + if (isTableView_) { + return 2; + } else { + return 1; + } } Qt::ItemFlags QJsonModel::flags(const QModelIndex &index) const diff --git a/src/qjsonmodel.h b/src/qjsonmodel.h index ecdcc129f079a3a04b069e1db54740de6d520fd6..631ac20c564bc398069135488283f48d1ee8b0ab 100644 --- a/src/qjsonmodel.h +++ b/src/qjsonmodel.h @@ -289,10 +289,15 @@ public: void objectContentToJson(QJsonObject jsonObject, QByteArray &json, int indent, bool compact); void valueToJson(QJsonValue jsonValue, QByteArray &json, int indent, bool compact); +public: + void setTableViewOrTreeView(bool isTable = false) { isTableView_ = isTable; } + private: QJsonValue genJson(QJsonTreeItem *) const; QJsonTreeItem *mRootItem = nullptr; QStringList mHeaders; + + bool isTableView_ = false; }; #endif // QJSONMODEL_H