8 std::string_view ParamName,
bool IsOptional, std::string_view IconResourcePath,
const std::vector<DynExp::ItemIDType>& Values)
9 : QDialog(parent, Qt::Dialog | Qt::WindowTitleHint),
10 ItemIDsWithLabels(std::move(ItemIDsWithLabels)), ParamName(ParamName), Optional(IsOptional),
11 ItemIcon(IconResourcePath.data()), Values(Values)
15 setWindowTitle(QString(
"Select items - ") +
ParamName.data());
17 connect(
ui.LWAvailable, &QListWidget::itemChanged, [
this](QListWidgetItem*) { ui.LWAvailable->sortItems(); });
22 const auto SelectionFilter = [
this](
bool SelectionState,
const auto& IDLabelPair) {
23 return (std::find_if(
Values.cbegin(),
Values.cend(), [&IDLabelPair = std::as_const(IDLabelPair)](
const auto ID) {
24 return IDLabelPair.second == ID;
25 }) ==
Values.cend()) != SelectionState;
28 const auto SelectedFilter = [&SelectionFilter](
const auto& IDLabelPair) {
return SelectionFilter(
true, IDLabelPair); };
29 const auto NotSelectedFilter = [&SelectionFilter](
const auto& IDLabelPair) {
return SelectionFilter(
false, IDLabelPair); };
31 const auto AddListWidgetItem = [
this](
const decltype(
ItemIDsWithLabels)::value_type& Item, QListWidget* List) {
32 auto ListItem =
new QListWidgetItem(QString::fromStdString(Item.first), List);
34 ListItem->setToolTip(
"ID " + QString::number(Item.second));
35 ListItem->setData(Qt::UserRole, QVariant::fromValue(Item.second));
38 ui.LWAvailable->clear();
39 for (
const auto& Item :
ItemIDsWithLabels | std::views::filter(NotSelectedFilter))
40 AddListWidgetItem(Item,
ui.LWAvailable);
45 SelectedItems.push_back(Item);
47 std::sort(SelectedItems.begin(), SelectedItems.end(), [&
Values = std::as_const(
Values)](
const auto& a,
const auto& b) {
48 const auto ItA = std::find(Values.cbegin(), Values.cend(), a.second);
49 const auto ItB = std::find(Values.cbegin(), Values.cend(), b.second);
51 return ItA == Values.cend() || ItB == Values.cend() || ItA - Values.cbegin() < ItB - Values.cbegin();
54 ui.LWSelected->clear();
55 for (
const auto& Item : SelectedItems)
56 AddListWidgetItem(Item,
ui.LWSelected);
89 auto SelectedItems =
ui.LWSelected->selectedItems();
90 std::sort(SelectedItems.begin(), SelectedItems.end(), [
this](
const auto& a,
const auto& b) {
91 return ui.LWSelected->row(a) < ui.LWSelected->row(b);
94 for (
auto Item : SelectedItems)
96 const auto Row =
ui.LWSelected->row(Item);
100 ui.LWSelected->insertItem(Row - 1,
ui.LWSelected->takeItem(Row));
101 Item->setSelected(
true);
107 auto SelectedItems =
ui.LWSelected->selectedItems();
108 std::sort(SelectedItems.begin(), SelectedItems.end(), [
this](
const auto& a,
const auto& b) {
109 return ui.LWSelected->row(a) > ui.LWSelected->row(b);
112 for (
auto Item : SelectedItems)
114 const auto Row =
ui.LWSelected->row(Item);
115 if (Row >=
ui.LWSelected->count() - 1)
118 ui.LWSelected->insertItem(Row + 1,
ui.LWSelected->takeItem(Row));
119 Item->setSelected(
true);
ChoiceListDialog(QWidget *parent, Util::TextValueListType< IndexType > &&ItemIDsWithLabels, std::string_view ParamName, bool IsOptional, std::string_view IconResourcePath, const std::vector< DynExp::ItemIDType > &Values)