ui: set lists readonly in QtDirectoryListBox

This commit is contained in:
Eberhard Graether
2018-01-08 12:38:30 +01:00
parent 1d636d6591
commit 5bd37772fe
3 changed files with 85 additions and 10 deletions
+4
View File
@@ -31,6 +31,10 @@ QtListItemWidget #field {
margin-left: 5px;
}
QtListItemWidget #field:disabled {
color: grey;
}
#bar {
border-top: 1px solid lightgray;
}
+73 -7
View File
@@ -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<FilePath> QtDirectoryListBox::getList()
return list;
}
void QtDirectoryListBox::setList(const std::vector<FilePath>& list)
void QtDirectoryListBox::setList(const std::vector<FilePath>& list, bool readOnly)
{
std::vector<std::string> strList;
for (const FilePath& path : list)
{
strList.push_back(path.str());
}
setStringList(strList);
setStringList(strList, readOnly);
}
std::vector<std::string> QtDirectoryListBox::getStringList()
@@ -256,7 +280,7 @@ std::vector<std::string> QtDirectoryListBox::getStringList()
return list;
}
void QtDirectoryListBox::setStringList(const std::vector<std::string>& list)
void QtDirectoryListBox::setStringList(const std::vector<std::string>& list, bool readOnly)
{
clear();
@@ -265,7 +289,8 @@ void QtDirectoryListBox::setStringList(const std::vector<std::string>& 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<std::string>& 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<QtTextEditDialog>(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<std::string> list;
for (int i = 0; i < m_list->count(); ++i)
{
QtListItemWidget* widget = dynamic_cast<QtListItemWidget*>(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<std::string> readOnlyLines;
for (int i = 0; i < m_list->count(); ++i)
{
QtListItemWidget* widget = dynamic_cast<QtListItemWidget*>(m_list->itemWidget(m_list->item(i)));
if (widget->readOnly())
{
readOnlyLines.push_back(widget->getText().toStdString());
}
}
std::vector<std::string> 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);
}
+8 -3
View File
@@ -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<FilePath> getList();
void setList(const std::vector<FilePath>& list);
void setList(const std::vector<FilePath>& list, bool readOnly = false);
std::vector<std::string> getStringList();
void setStringList(const std::vector<std::string>& list);
void setStringList(const std::vector<std::string>& list, bool readOnly = false);
void addListBoxItemWithText(const QString& text);
QtListItemWidget* addListBoxItemWithText(const QString& text);
void selectItem(QListWidgetItem* item);