Skip to content
This repository was archived by the owner on Sep 27, 2024. It is now read-only.

Commit 703301c

Browse files
committed
Sort items in Tailoring window
It will display first groups, then values, and then rules. Each part will be sorted alphabetically according to items titles. Sorting improves orientation in large groups, eg. SELinux group. Fixes: RHBZ#1798739
1 parent 61eb34b commit 703301c

File tree

1 file changed

+46
-5
lines changed

1 file changed

+46
-5
lines changed

src/TailoringWindow.cpp

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,21 @@ void TailoringWindow::syncCollapsedItem(QTreeWidgetItem* item, QSet<QString>& us
717717
}
718718
}
719719

720+
static const char* _xccdf_item_description(struct xccdf_item* item)
721+
{
722+
struct oscap_text_iterator* title_it = xccdf_item_get_title(item);
723+
char* title = oscap_textlist_get_preferred_plaintext(title_it, NULL);
724+
oscap_text_iterator_free(title_it);
725+
return title ? title : "";
726+
}
727+
728+
static bool _xccdf_item_compare(struct xccdf_item* a, struct xccdf_item* b)
729+
{
730+
const char* a_title = _xccdf_item_description(a);
731+
const char* b_title = _xccdf_item_description(b);
732+
return (strcmp(a_title, b_title) < 0);
733+
}
734+
720735
void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_item* xccdfItem)
721736
{
722737
++mSynchronizeItemLock;
@@ -777,7 +792,9 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
777792

778793
typedef std::vector<struct xccdf_item*> XCCDFItemVector;
779794

780-
XCCDFItemVector itemsToAdd;
795+
XCCDFItemVector valuesToAdd;
796+
XCCDFItemVector groupsToAdd;
797+
XCCDFItemVector rulesToAdd;
781798

782799
// valuesIt contains Values
783800
struct xccdf_value_iterator* valuesIt = NULL;
@@ -803,7 +820,7 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
803820
while (xccdf_value_iterator_has_more(valuesIt))
804821
{
805822
struct xccdf_value* childItem = xccdf_value_iterator_next(valuesIt);
806-
itemsToAdd.push_back(xccdf_value_to_item(childItem));
823+
valuesToAdd.push_back(xccdf_value_to_item(childItem));
807824
}
808825
xccdf_value_iterator_free(valuesIt);
809826
}
@@ -813,14 +830,38 @@ void TailoringWindow::createTreeItem(QTreeWidgetItem* treeItem, struct xccdf_ite
813830
while (xccdf_item_iterator_has_more(itemsIt))
814831
{
815832
struct xccdf_item* childItem = xccdf_item_iterator_next(itemsIt);
816-
itemsToAdd.push_back(childItem);
833+
xccdf_type_t xccdfItemType = xccdf_item_get_type(childItem);
834+
switch (xccdfItemType)
835+
{
836+
case XCCDF_RULE:
837+
rulesToAdd.push_back(childItem);
838+
break;
839+
case XCCDF_GROUP:
840+
groupsToAdd.push_back(childItem);
841+
break;
842+
case XCCDF_VALUE:
843+
valuesToAdd.push_back(childItem);
844+
break;
845+
default:
846+
break;
847+
}
817848
}
818849
xccdf_item_iterator_free(itemsIt);
819850
}
820851

852+
std::sort(groupsToAdd.begin(), groupsToAdd.end(), _xccdf_item_compare);
853+
std::sort(valuesToAdd.begin(), valuesToAdd.end(), _xccdf_item_compare);
854+
std::sort(rulesToAdd.begin(), rulesToAdd.end(), _xccdf_item_compare);
855+
856+
/* Concatenate 3 vectors to 1 vector */
857+
XCCDFItemVector allObjectsToAdd;
858+
allObjectsToAdd.insert(allObjectsToAdd.end(), groupsToAdd.begin(), groupsToAdd.end());
859+
allObjectsToAdd.insert(allObjectsToAdd.end(), valuesToAdd.begin(), valuesToAdd.end());
860+
allObjectsToAdd.insert(allObjectsToAdd.end(), rulesToAdd.begin(), rulesToAdd.end());
861+
821862
unsigned int idx = 0;
822-
for (XCCDFItemVector::const_iterator it = itemsToAdd.begin();
823-
it != itemsToAdd.end(); ++it, ++idx)
863+
for (XCCDFItemVector::const_iterator it = allObjectsToAdd.begin();
864+
it != allObjectsToAdd.end(); ++it, ++idx)
824865
{
825866
struct xccdf_item* childXccdfItem = *it;
826867
QTreeWidgetItem* childTreeItem = 0;

0 commit comments

Comments
 (0)