4 #include "moc_ChoiceListDialog.cpp"
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);
63 auto SelectedItems =
ui.LWAvailable->selectedItems();
64 ui.LWAvailable->clearSelection();
65 ui.LWSelected->clearSelection();
67 for (
auto Item : SelectedItems)
69 ui.LWSelected->addItem(
ui.LWAvailable->takeItem(
ui.LWAvailable->row(Item)));
70 Item->setSelected(
true);
76 auto SelectedItems =
ui.LWSelected->selectedItems();
77 ui.LWAvailable->clearSelection();
78 ui.LWSelected->clearSelection();
80 for (
auto Item : SelectedItems)
82 ui.LWAvailable->addItem(
ui.LWSelected->takeItem(
ui.LWSelected->row(Item)));
83 Item->setSelected(
true);
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);
127 QMessageBox::warning(
this,
"DynExp - Parameter empty",
128 QString(
"The parameter \"") +
GetParamName().data() +
"\" must not be empty. Please assign at least one item.");
133 for (
Util::return_of_t<decltype(&QListWidget::count)> i = 0; i <
ui.LWSelected->count(); ++i)
134 Values.push_back(
ui.LWSelected->item(i)->data(Qt::UserRole).value<decltype(
Values)::value_type>());
Implements a dialog with a list of available items on the left and a list of selected items on the ri...
std::vector< DynExp::ItemIDType > Values
std::string_view GetParamName() const
virtual void showEvent(QShowEvent *event) override
void OnRemoveItemClicked()
bool IsOptional() const noexcept
virtual void reject() override
const std::string ParamName
const Util::TextValueListType< IndexType > ItemIDsWithLabels
ChoiceListDialog(QWidget *parent, Util::TextValueListType< IndexType > &&ItemIDsWithLabels, std::string_view ParamName, bool IsOptional, std::string_view IconResourcePath, const std::vector< DynExp::ItemIDType > &Values)
void OnMoveItemUpClicked()
virtual void accept() override
void OnMoveItemDownClicked()
typename member_fn_ptr_traits< CallableT >::return_type return_of_t
Alias for the return type of a member function callable of type CallableT.
std::vector< std::pair< TextType, ValueType > > TextValueListType
Type of a list containing key-value pairs where key is a text of type Util::TextType.
Accumulates include statements to provide a precompiled header.