// // RunningScriptsWidget.cpp // interface/src/ui // // Created by Mohammed Nafees on 03/28/2014. // Updated by Ryan Huffman on 05/13/2014. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "ui_runningScriptsWidget.h" #include "RunningScriptsWidget.h" #include #include #include #include #include #include "Application.h" #include "Menu.h" #include "ScriptsModel.h" RunningScriptsWidget::RunningScriptsWidget(QWidget* parent) : FramelessDialog(parent, 0, POSITION_LEFT), ui(new Ui::RunningScriptsWidget), _signalMapper(this), _proxyModel(this), _scriptsModel(this) { ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose, false); setAllowResize(false); ui->hideWidgetButton->setIcon(QIcon(Application::resourcesPath() + "images/close.svg")); ui->reloadAllButton->setIcon(QIcon(Application::resourcesPath() + "images/reload.svg")); ui->stopAllButton->setIcon(QIcon(Application::resourcesPath() + "images/stop.svg")); ui->loadScriptButton->setIcon(QIcon(Application::resourcesPath() + "images/plus-white.svg")); ui->recentlyLoadedScriptsArea->hide(); ui->filterLineEdit->installEventFilter(this); connect(&_proxyModel, &QSortFilterProxyModel::modelReset, this, &RunningScriptsWidget::selectFirstInList); _proxyModel.setSourceModel(&_scriptsModel); _proxyModel.sort(0, Qt::AscendingOrder); _proxyModel.setDynamicSortFilter(true); ui->scriptListView->setModel(&_proxyModel); connect(ui->filterLineEdit, &QLineEdit::textChanged, this, &RunningScriptsWidget::updateFileFilter); connect(ui->scriptListView, &QListView::doubleClicked, this, &RunningScriptsWidget::loadScriptFromList); _recentlyLoadedScriptsTable = new ScriptsTableWidget(ui->recentlyLoadedScriptsTableWidget); _recentlyLoadedScriptsTable->setColumnCount(1); _recentlyLoadedScriptsTable->setColumnWidth(0, 265); connect(ui->hideWidgetButton, &QPushButton::clicked, Application::getInstance(), &Application::toggleRunningScriptsWidget); connect(ui->reloadAllButton, &QPushButton::clicked, Application::getInstance(), &Application::reloadAllScripts); connect(ui->stopAllButton, &QPushButton::clicked, this, &RunningScriptsWidget::allScriptsStopped); connect(ui->loadScriptButton, &QPushButton::clicked, Application::getInstance(), &Application::loadDialog); connect(&_signalMapper, SIGNAL(mapped(QString)), Application::getInstance(), SLOT(stopScript(const QString&))); } RunningScriptsWidget::~RunningScriptsWidget() { delete ui; } void RunningScriptsWidget::updateFileFilter(const QString& filter) { QRegExp regex("^.*" + QRegExp::escape(filter) + ".*$", Qt::CaseInsensitive); _proxyModel.setFilterRegExp(regex); selectFirstInList(); } void RunningScriptsWidget::loadScriptFromList(const QModelIndex& index) { QVariant scriptFile = _proxyModel.data(index, ScriptsModel::ScriptPath); Application::getInstance()->loadScript(scriptFile.toString(), false, false); } void RunningScriptsWidget::loadSelectedScript() { QModelIndex selectedIndex = ui->scriptListView->currentIndex(); if (selectedIndex.isValid()) { loadScriptFromList(selectedIndex); } } void RunningScriptsWidget::setBoundary(const QRect& rect) { _boundary = rect; } void RunningScriptsWidget::setRunningScripts(const QStringList& list) { setUpdatesEnabled(false); QLayoutItem* widget; while ((widget = ui->scrollAreaWidgetContents->layout()->takeAt(0)) != NULL) { delete widget->widget(); delete widget; } const int CLOSE_ICON_HEIGHT = 12; for (int i = 0; i < list.size(); i++) { QWidget* row = new QWidget(ui->scrollAreaWidgetContents); row->setLayout(new QHBoxLayout(row)); QUrl url = QUrl(list.at(i)); QLabel* name = new QLabel(url.fileName(), row); QPushButton* closeButton = new QPushButton(row); closeButton->setFlat(true); closeButton->setIcon( QIcon(QPixmap(Application::resourcesPath() + "images/kill-script.svg").scaledToHeight(CLOSE_ICON_HEIGHT))); closeButton->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred)); closeButton->setStyleSheet("border: 0;"); closeButton->setCursor(Qt::PointingHandCursor); connect(closeButton, SIGNAL(clicked()), &_signalMapper, SLOT(map())); _signalMapper.setMapping(closeButton, url.toString()); row->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); row->layout()->setContentsMargins(4, 4, 4, 4); row->layout()->setSpacing(0); row->layout()->addWidget(name); row->layout()->addWidget(closeButton); row->setToolTip(url.toString()); QFrame* line = new QFrame(row); line->setFrameShape(QFrame::HLine); line->setStyleSheet("color: #E1E1E1; margin-left: 6px; margin-right: 6px;"); ui->scrollAreaWidgetContents->layout()->addWidget(row); ui->scrollAreaWidgetContents->layout()->addWidget(line); } ui->noRunningScriptsLabel->setVisible(list.isEmpty()); ui->reloadAllButton->setVisible(!list.isEmpty()); ui->stopAllButton->setVisible(!list.isEmpty()); ui->scrollAreaWidgetContents->updateGeometry(); setUpdatesEnabled(true); Application::processEvents(); repaint(); } void RunningScriptsWidget::showEvent(QShowEvent* event) { if (!event->spontaneous()) { ui->filterLineEdit->setFocus(); } FramelessDialog::showEvent(event); } void RunningScriptsWidget::selectFirstInList() { if (_proxyModel.rowCount() > 0) { ui->scriptListView->setCurrentIndex(_proxyModel.index(0, 0)); } } bool RunningScriptsWidget::eventFilter(QObject* sender, QEvent* event) { if (sender == ui->filterLineEdit) { if (event->type() != QEvent::KeyPress) { return false; } QKeyEvent* keyEvent = static_cast(event); if (keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) { QModelIndex selectedIndex = ui->scriptListView->currentIndex(); if (selectedIndex.isValid()) { loadScriptFromList(selectedIndex); } event->accept(); return true; } return false; } return FramelessDialog::eventFilter(sender, event); } void RunningScriptsWidget::keyPressEvent(QKeyEvent *keyEvent) { if (keyEvent->key() == Qt::Key_Escape) { return; } else { FramelessDialog::keyPressEvent(keyEvent); } } void RunningScriptsWidget::scriptStopped(const QString& scriptName) { // _recentlyLoadedScripts.prepend(scriptName); } void RunningScriptsWidget::allScriptsStopped() { Application::getInstance()->stopAllScripts(); }