9 std::string_view ParamName,
bool IsOptional, std::string_view IconResourcePath,
const std::vector<DynExp::ItemIDType>& Values)
10 : QDialog(parent, Qt::Dialog | Qt::WindowTitleHint),
12 ItemIDsWithLabels(std::move(ItemIDsWithLabels)), ParamName(ParamName), Optional(IsOptional),
13 ItemIcon(IconResourcePath.data()), Values(Values)
17 setWindowTitle(QString(
"Select items - ") +
ParamName.data());
19 connect(
ui->LWAvailable, &QListWidget::itemChanged, [
this](QListWidgetItem*) { ui->LWAvailable->sortItems(); });
24 const auto SelectionFilter = [
this](
bool SelectionState,
const auto& IDLabelPair) {
25 return (std::find_if(
Values.cbegin(),
Values.cend(), [&IDLabelPair = std::as_const(IDLabelPair)](
const auto ID) {
26 return IDLabelPair.second == ID;
27 }) ==
Values.cend()) != SelectionState;
30 const auto SelectedFilter = [&SelectionFilter](
const auto& IDLabelPair) {
return SelectionFilter(
true, IDLabelPair); };
31 const auto NotSelectedFilter = [&SelectionFilter](
const auto& IDLabelPair) {
return SelectionFilter(
false, IDLabelPair); };
33 const auto AddListWidgetItem = [
this](
const decltype(
ItemIDsWithLabels)::value_type& Item, QListWidget* List) {
34 auto ListItem =
new QListWidgetItem(QString::fromStdString(Item.first), List);
36 ListItem->setToolTip(
"ID " + QString::number(Item.second));
37 ListItem->setData(Qt::UserRole, QVariant::fromValue(Item.second));
40 ui->LWAvailable->clear();
41 for (
const auto& Item :
ItemIDsWithLabels | std::views::filter(NotSelectedFilter))
42 AddListWidgetItem(Item,
ui->LWAvailable);
47 SelectedItems.push_back(Item);
49 std::sort(SelectedItems.begin(), SelectedItems.end(), [&
Values = std::as_const(
Values)](
const auto& a,
const auto& b) {
50 const auto ItA = std::find(Values.cbegin(), Values.cend(), a.second);
51 const auto ItB = std::find(Values.cbegin(), Values.cend(), b.second);
53 return ItA == Values.cend() || ItB == Values.cend() || ItA - Values.cbegin() < ItB - Values.cbegin();
56 ui->LWSelected->clear();
57 for (
const auto& Item : SelectedItems)
58 AddListWidgetItem(Item,
ui->LWSelected);
91 auto SelectedItems =
ui->LWSelected->selectedItems();
92 std::sort(SelectedItems.begin(), SelectedItems.end(), [
this](
const auto& a,
const auto& b) {
93 return ui->LWSelected->row(a) < ui->LWSelected->row(b);
96 for (
auto Item : SelectedItems)
98 const auto Row =
ui->LWSelected->row(Item);
102 ui->LWSelected->insertItem(Row - 1,
ui->LWSelected->takeItem(Row));
103 Item->setSelected(
true);
109 auto SelectedItems =
ui->LWSelected->selectedItems();
110 std::sort(SelectedItems.begin(), SelectedItems.end(), [
this](
const auto& a,
const auto& b) {
111 return ui->LWSelected->row(a) > ui->LWSelected->row(b);
114 for (
auto Item : SelectedItems)
116 const auto Row =
ui->LWSelected->row(Item);
117 if (Row >=
ui->LWSelected->count() - 1)
120 ui->LWSelected->insertItem(Row + 1,
ui->LWSelected->takeItem(Row));
121 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)