#include "qt/element/QtDirectoryListBox.h" #include #include #include #include #include "qt/utility/utilityQt.h" QtListItemWidget::QtListItemWidget(QtDirectoryListBox* list, QListWidgetItem* item, QWidget *parent) : QWidget(parent) , m_list(list) , m_item(item) { QBoxLayout* layout = new QHBoxLayout(); layout->setSpacing(3); layout->setContentsMargins(0, 0, 0, 0); layout->setAlignment(Qt::AlignTop); m_data = new QtLineEdit(this); m_data->setAttribute(Qt::WA_MacShowFocusRect, 0); m_data->setObjectName("field"); m_button = new QPushButton("..."); m_button->setObjectName("button"); layout->addWidget(m_data); layout->addWidget(m_button); setLayout(layout); connect(m_button, SIGNAL(clicked()), this, SLOT(handleButtonPress())); connect(m_data, SIGNAL(focus()), this, SLOT(handleFocus())); } QString QtListItemWidget::getText() { return m_data->text(); } void QtListItemWidget::setText(QString text) { m_data->setText(text); } void QtListItemWidget::setFocus() { m_data->setFocus(Qt::OtherFocusReason); } void QtListItemWidget::handleButtonPress() { QFileDialog dialog(this); QListView *l = dialog.findChild("listView"); dialog.setFileMode(QFileDialog::Directory); if (l) { l->setSelectionMode(QAbstractItemView::SingleSelection); } QTreeView *t = dialog.findChild(); if (t) { t->setSelectionMode(QAbstractItemView::SingleSelection); } if (dialog.exec()) { QStringList list = dialog.selectedFiles(); for (int i = 0; i < list.size(); i++) { setText(list.at(i)); } } handleFocus(); } void QtListItemWidget::handleFocus() { m_list->selectItem(m_item); } QtDirectoryListBox::QtDirectoryListBox(QWidget *parent) :QFrame(parent) { QBoxLayout* layout = new QVBoxLayout(); layout->setSpacing(0); layout->setContentsMargins(0, 6, 0, 0); layout->setAlignment(Qt::AlignTop); m_list = new QListWidget(this); m_list->setObjectName("list"); m_list->setAttribute(Qt::WA_MacShowFocusRect, 0); setStyleSheet(utility::getStyleSheet("data/gui/setting_window/listbox.css").c_str()); layout->addWidget(m_list); QWidget* buttonContainer = new QWidget(this); buttonContainer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); buttonContainer->setObjectName("bar"); QHBoxLayout* innerLayout = new QHBoxLayout(); innerLayout->setContentsMargins(8, 4, 8, 3); innerLayout->setSpacing(0); m_addButton = new QPushButton("+", this); m_addButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_addButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_addButton->setObjectName("roundedButton"); innerLayout->addWidget(m_addButton); m_removeButton = new QPushButton("-", this); m_removeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_removeButton->setAttribute(Qt::WA_LayoutUsesWidgetRect); // fixes layouting on Mac m_removeButton->setObjectName("roundedButton"); innerLayout->addWidget(m_removeButton); QLabel* dropInfoText = new QLabel("Drop Files & Folders"); dropInfoText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); dropInfoText->setObjectName("dropInfo"); dropInfoText->setAlignment(Qt::AlignRight); innerLayout->addWidget(dropInfoText); buttonContainer->setLayout(innerLayout); layout->addWidget(buttonContainer); setLayout(layout); connect(m_addButton, SIGNAL(clicked()), this, SLOT(addListBoxItem())); connect(m_removeButton, SIGNAL(clicked()), this, SLOT(removeListBoxItem())); setAcceptDrops(true); resize(); } void QtDirectoryListBox::clear() { m_list->clear(); } void QtDirectoryListBox::dropEvent(QDropEvent *event) { QFileInfo fileInfo; foreach(QUrl url, event->mimeData()->urls()) { QtListItemWidget* widget = addListBoxItem(); widget->setText(url.toLocalFile()); } } std::vector QtDirectoryListBox::getList() { std::vector list; for (int i = 0; i < m_list->count(); ++i) { QtListItemWidget* widget = dynamic_cast(m_list->itemWidget(m_list->item(i))); list.push_back(widget->getText().toStdString()); } return list; } void QtDirectoryListBox::setList(const std::vector& list) { m_list->clear(); for (const FilePath& path : list) { QtListItemWidget* widget = addListBoxItem(); widget->setText(QString::fromStdString(path.str())); } } void QtDirectoryListBox::selectItem(QListWidgetItem* item) { for (int i = 0; i < m_list->count(); i++) { m_list->item(i)->setSelected(false); } item->setSelected(true); } void QtDirectoryListBox::resize() { int height = 25; if (m_list->count() > 0) { height += (m_list->itemWidget(m_list->item(0))->height() + 1) * m_list->count() + 8; } if (height < 150) { height = 150; } setMinimumHeight(height); } QtListItemWidget* QtDirectoryListBox::addListBoxItem() { QListWidgetItem *item = new QListWidgetItem(m_list); m_list->addItem(item); QtListItemWidget* widget = new QtListItemWidget(this, item); m_list->setItemWidget(item, widget); resize(); widget->setFocus(); return widget; } void QtDirectoryListBox::removeListBoxItem() { qDeleteAll(m_list->selectedItems()); resize(); } void QtDirectoryListBox::dragEnterEvent(QDragEnterEvent *event) { event->accept(); }