diff --git a/bin/app/data/gui/window/listbox.css b/bin/app/data/gui/window/listbox.css index e231c44c..a1ca786b 100644 --- a/bin/app/data/gui/window/listbox.css +++ b/bin/app/data/gui/window/listbox.css @@ -31,6 +31,10 @@ QtListItemWidget #field { margin-left: 5px; } +QtListItemWidget #field:disabled { + color: grey; +} + #bar { border-top: 1px solid lightgray; } diff --git a/src/lib_gui/qt/element/QtDirectoryListBox.cpp b/src/lib_gui/qt/element/QtDirectoryListBox.cpp index cbe693d2..24a54f1f 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.cpp +++ b/src/lib_gui/qt/element/QtDirectoryListBox.cpp @@ -16,6 +16,7 @@ QtListItemWidget::QtListItemWidget(QtDirectoryListBox* list, QListWidgetItem* it : QWidget(parent) , m_list(list) , m_item(item) + , m_readOnly(false) { QBoxLayout* layout = new QHBoxLayout(); layout->setSpacing(3); @@ -69,6 +70,29 @@ void QtListItemWidget::setText(QString text) m_data->setText(text); } +bool QtListItemWidget::readOnly() const +{ + return m_readOnly; +} + +void QtListItemWidget::setReadOnly(bool readOnly) +{ + m_readOnly = readOnly; + + if (readOnly) + { + m_item->setFlags(m_item->flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsEnabled)); + } + else + { + m_item->setFlags(m_item->flags() | ~(Qt::ItemIsSelectable | Qt::ItemIsEnabled)); + } + + m_data->setReadOnly(readOnly); + m_data->setEnabled(!readOnly); + m_button->setEnabled(!readOnly); +} + void QtListItemWidget::setFocus() { m_data->setFocus(Qt::OtherFocusReason); @@ -235,14 +259,14 @@ std::vector QtDirectoryListBox::getList() return list; } -void QtDirectoryListBox::setList(const std::vector& list) +void QtDirectoryListBox::setList(const std::vector& list, bool readOnly) { std::vector strList; for (const FilePath& path : list) { strList.push_back(path.str()); } - setStringList(strList); + setStringList(strList, readOnly); } std::vector QtDirectoryListBox::getStringList() @@ -256,7 +280,7 @@ std::vector QtDirectoryListBox::getStringList() return list; } -void QtDirectoryListBox::setStringList(const std::vector& list) +void QtDirectoryListBox::setStringList(const std::vector& list, bool readOnly) { clear(); @@ -265,7 +289,8 @@ void QtDirectoryListBox::setStringList(const std::vector& list) for (const std::string& str : list) { - addListBoxItemWithText(QString::fromStdString(str)); + QtListItemWidget* itemWidget = addListBoxItemWithText(QString::fromStdString(str)); + itemWidget->setReadOnly(readOnly); } m_relativeRootDirectory = root; @@ -273,10 +298,11 @@ void QtDirectoryListBox::setStringList(const std::vector& list) QTimer::singleShot(1, this, &QtDirectoryListBox::resize); } -void QtDirectoryListBox::addListBoxItemWithText(const QString& text) +QtListItemWidget* QtDirectoryListBox::addListBoxItemWithText(const QString& text) { QtListItemWidget* widget = addListBoxItem(); widget->setText(text); + return widget; } void QtDirectoryListBox::selectItem(QListWidgetItem* item) @@ -372,7 +398,17 @@ void QtDirectoryListBox::showEditDialog() m_editDialog = std::make_shared(m_listName, "Edit the list in plain text. Each line is one item."); m_editDialog->setup(); - m_editDialog->setText(utility::join(getStringList(), "\n")); + std::vector list; + for (int i = 0; i < m_list->count(); ++i) + { + QtListItemWidget* widget = dynamic_cast(m_list->itemWidget(m_list->item(i))); + if (!widget->readOnly()) + { + list.push_back(widget->getText().toStdString()); + } + } + + m_editDialog->setText(utility::join(list, "\n")); connect(m_editDialog.get(), &QtTextEditDialog::canceled, this, &QtDirectoryListBox::canceledEditDialog); connect(m_editDialog.get(), &QtTextEditDialog::finished, this, &QtDirectoryListBox::savedEditDialog); @@ -392,6 +428,16 @@ void QtDirectoryListBox::canceledEditDialog() void QtDirectoryListBox::savedEditDialog() { + std::vector readOnlyLines; + for (int i = 0; i < m_list->count(); ++i) + { + QtListItemWidget* widget = dynamic_cast(m_list->itemWidget(m_list->item(i))); + if (widget->readOnly()) + { + readOnlyLines.push_back(widget->getText().toStdString()); + } + } + std::vector lines = utility::splitToVector(m_editDialog->getText(), "\n"); for (size_t i = 0; i < lines.size(); i++) { @@ -403,7 +449,27 @@ void QtDirectoryListBox::savedEditDialog() i--; } } - setStringList(lines); + + clear(); + + FilePath root = m_relativeRootDirectory; + m_relativeRootDirectory = FilePath(); + + for (const std::string& str : readOnlyLines) + { + QtListItemWidget* itemWidget = addListBoxItemWithText(QString::fromStdString(str)); + itemWidget->setReadOnly(true); + } + + for (const std::string& str : lines) + { + QtListItemWidget* itemWidget = addListBoxItemWithText(QString::fromStdString(str)); + itemWidget->setReadOnly(false); + } + + m_relativeRootDirectory = root; canceledEditDialog(); + + QTimer::singleShot(1, this, &QtDirectoryListBox::resize); } diff --git a/src/lib_gui/qt/element/QtDirectoryListBox.h b/src/lib_gui/qt/element/QtDirectoryListBox.h index 47f95a40..9f9eae43 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.h +++ b/src/lib_gui/qt/element/QtDirectoryListBox.h @@ -25,6 +25,9 @@ public: QString getText(); void setText(QString text); + bool readOnly() const; + void setReadOnly(bool readOnly); + public slots: void setFocus(); @@ -38,6 +41,8 @@ private: QtDirectoryListBox* m_list; QListWidgetItem* m_item; + + bool m_readOnly; }; @@ -54,12 +59,12 @@ public: void clear(); std::vector getList(); - void setList(const std::vector& list); + void setList(const std::vector& list, bool readOnly = false); std::vector getStringList(); - void setStringList(const std::vector& list); + void setStringList(const std::vector& list, bool readOnly = false); - void addListBoxItemWithText(const QString& text); + QtListItemWidget* addListBoxItemWithText(const QString& text); void selectItem(QListWidgetItem* item);