diff --git a/kdevplatform/shell/configdialog.h b/kdevplatform/shell/configdialog.h --- a/kdevplatform/shell/configdialog.h +++ b/kdevplatform/shell/configdialog.h @@ -62,9 +62,10 @@ void insertConfigPage(ConfigPage* before, ConfigPage* page); /** - * Add a new sub config page - * @param parentPage the parent page - * @param page the page to add + * Add a new sub config page. New page will be placed before child page which name() is "bigger" + * (QString::localeAwareCompare()) than new one to keep ascending order. + * @param parentPage The parent page + * @param page The page to add */ void appendSubConfigPage(ConfigPage* parentPage, ConfigPage* page); @@ -77,6 +78,7 @@ private: KPageWidgetItem* itemForPage(ConfigPage* page) const; int checkForUnsavedChanges(KPageWidgetItem* current, KPageWidgetItem* before); + void insertConfigPage(KPageWidgetItem* beforeItem, ConfigPage* page); void applyChanges(ConfigPage* page); void removePagesForPlugin(IPlugin* plugin); void addConfigPageInternal(KPageWidgetItem* item, ConfigPage* page); diff --git a/kdevplatform/shell/configdialog.cpp b/kdevplatform/shell/configdialog.cpp --- a/kdevplatform/shell/configdialog.cpp +++ b/kdevplatform/shell/configdialog.cpp @@ -150,16 +150,38 @@ void ConfigDialog::insertConfigPage(ConfigPage* before, ConfigPage* page) { Q_ASSERT(before); - auto beforeItem = itemForPage(before); + insertConfigPage(itemForPage(before), page); +} + +void ConfigDialog::insertConfigPage(KPageWidgetItem* beforeItem, ConfigPage* page) +{ Q_ASSERT(beforeItem); addConfigPageInternal(insertPage(beforeItem, page, page->name()), page); } void ConfigDialog::appendSubConfigPage(ConfigPage* parentPage, ConfigPage* page) { - auto item = itemForPage(parentPage); - Q_ASSERT(item); - addConfigPageInternal(addSubPage(item, page, page->name()), page); + auto parentItem = itemForPage(parentPage); + Q_ASSERT(parentItem); + + auto model = static_cast(pageWidget()->model()); + Q_ASSERT(model); + + auto parentIndex = model->index(parentItem); + Q_ASSERT(parentIndex.isValid()); + + const int parentRowCount = model->rowCount(parentIndex); + for (int i = 0; i < parentRowCount; ++i) { + auto childItem = model->item(model->index(i, 0, parentIndex)); + Q_ASSERT(childItem); + + if (childItem->name().localeAwareCompare(page->name()) > 0) { + insertConfigPage(childItem, page); + return; + } + } + + addConfigPageInternal(addSubPage(parentItem, page, page->name()), page); } void ConfigDialog::addConfigPageInternal(KPageWidgetItem* item, ConfigPage* page)