/*************************************************************************** * Copyright (C) 2013-2016 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "toolbareditor.h" #include "ui_toolbareditor.h" ToolBarEditor::ToolBarEditor(QWidget *parent) : QDialog(parent), m_ui(new Ui::ToolBarEditor) { m_ui->setupUi(this); m_ui->upToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowUp)); m_ui->downToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowDown)); m_ui->addToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowRight)); m_ui->removeToolButton->setIcon(qApp->style()->standardIcon(QStyle::SP_ArrowLeft)); connect(m_ui->actionsListWidget->model(), SIGNAL(rowsAboutToBeRemoved(const QModelIndex &,int,int)), SLOT(onRowsAboutToBeRemoved(const QModelIndex &, int, int))); connect(m_ui->activeActionsListWidget->model(), SIGNAL(rowsAboutToBeRemoved(const QModelIndex &,int,int)), SLOT(onRowsAboutToBeRemoved(const QModelIndex &, int, int))); m_toolBarInfoList = ActionManager::instance()->readToolBarSettings(); m_previousIndex = -1; populateActionList(); } ToolBarEditor::~ToolBarEditor() { delete m_ui; } void ToolBarEditor::accept() { on_toolbarNameComboBox_activated(m_ui->toolbarNameComboBox->currentIndex()); ActionManager::instance()->writeToolBarSettings(m_toolBarInfoList); QDialog::accept(); } void ToolBarEditor::populateActionList(bool reset) { m_ui->toolbarNameComboBox->clear(); m_ui->actionsListWidget->clear(); m_ui->activeActionsListWidget->clear(); if(reset) { m_toolBarInfoList.clear(); m_toolBarInfoList.append(ActionManager::instance()->defaultToolBar()); m_previousIndex = -1; } QStringList actionNames; for(const ActionManager::ToolBarInfo &info : qAsConst(m_toolBarInfoList)) { actionNames << info.actionNames; m_ui->toolbarNameComboBox->addItem(info.title); } for(int id = ActionManager::PLAY; id <= ActionManager::UI_QUICK_SEARCH; ++id) { QAction *action = ACTION(id); if(!action || actionNames.contains(action->objectName())) continue; if(!qobject_cast(action) && action->icon().isNull()) continue; QListWidgetItem *item = new QListWidgetItem(); item->setIcon(action->icon()); item->setText(action->text().replace("&", "")); item->setData(Qt::UserRole, action->objectName()); m_ui->actionsListWidget->addItem(item); } m_ui->actionsListWidget->addItem(createExtraItem("-- " + tr("Separator") + " --", "separator")); on_toolbarNameComboBox_activated(m_ui->toolbarNameComboBox->currentIndex()); } QListWidgetItem *ToolBarEditor::createExtraItem(const QString &name, const QString &shortName, const QIcon &icon) { QListWidgetItem *item = new QListWidgetItem(); item->setText(name); item->setData(Qt::UserRole, shortName); item->setIcon(icon); return item; } void ToolBarEditor::on_addToolButton_clicked() { int index = m_ui->toolbarNameComboBox->currentIndex(); if(index < 0) return; int row = m_ui->actionsListWidget->currentRow(); if(row > -1) { QListWidgetItem *item = m_ui->actionsListWidget->takeItem(row); m_ui->activeActionsListWidget->addItem(item); } } void ToolBarEditor::on_removeToolButton_clicked() { int index = m_ui->toolbarNameComboBox->currentIndex(); if(index < 0) return; int row = m_ui->activeActionsListWidget->currentRow(); if(row > -1) { QListWidgetItem *item = m_ui->activeActionsListWidget->takeItem(row); m_ui->actionsListWidget->addItem(item); } } void ToolBarEditor::on_upToolButton_clicked() { int index = m_ui->toolbarNameComboBox->currentIndex(); if(index < 0) return; int row = m_ui->activeActionsListWidget->currentRow(); if(row > 0) { QListWidgetItem *item = m_ui->activeActionsListWidget->takeItem(row); m_ui->activeActionsListWidget->insertItem(row - 1, item); m_ui->activeActionsListWidget->setCurrentItem(item); } } void ToolBarEditor::on_downToolButton_clicked() { int index = m_ui->toolbarNameComboBox->currentIndex(); if(index < 0) return; int row = m_ui->activeActionsListWidget->currentRow(); if(row > -1 && row < m_ui->activeActionsListWidget->count()) { QListWidgetItem *item = m_ui->activeActionsListWidget->takeItem(row); m_ui->activeActionsListWidget->insertItem(row + 1, item); m_ui->activeActionsListWidget->setCurrentItem(item); } } void ToolBarEditor::on_resetPushButton_clicked() { populateActionList(true); } void ToolBarEditor::on_toolbarNameComboBox_activated(int index) { if(m_previousIndex >= 0 && m_previousIndex < m_toolBarInfoList.count()) { m_toolBarInfoList[m_previousIndex].actionNames.clear(); for(int i = 0; i < m_ui->activeActionsListWidget->count(); ++i) { QListWidgetItem *item = m_ui->activeActionsListWidget->item(i); m_toolBarInfoList[m_previousIndex].actionNames << item->data(Qt::UserRole).toString(); } } m_ui->activeActionsListWidget->clear(); m_previousIndex = index; if(index < 0) return; ActionManager::ToolBarInfo info = m_toolBarInfoList.at(index); for(const QString &name : qAsConst(info.actionNames)) { if(name == "separator") { m_ui->activeActionsListWidget->addItem(createExtraItem("-- " + tr("Separator") + " --", name)); continue; } QAction *action = ActionManager::instance()->findChild(name); if(action) { QListWidgetItem *item = new QListWidgetItem(); item->setIcon(action->icon()); item->setText(action->text().replace("&", "")); item->setData(Qt::UserRole, action->objectName()); m_ui->activeActionsListWidget->addItem(item); } } } void ToolBarEditor::onRowsAboutToBeRemoved(const QModelIndex &, int start, int) { if(sender() == m_ui->actionsListWidget->model()) { //recreate separator QListWidgetItem *item = m_ui->actionsListWidget->item(start); if(item && item->data(Qt::UserRole).toString() == "separator") m_ui->actionsListWidget->addItem(item->clone()); } else if(sender() == m_ui->activeActionsListWidget->model()) { //remove separator QListWidgetItem *item = m_ui->activeActionsListWidget->item(start); if(item && item->data(Qt::UserRole).toString() == "separator") { for(int i = 0; i < m_ui->actionsListWidget->count(); ++i) { if(m_ui->actionsListWidget->item(i)->data(Qt::UserRole).toString() == "separator") { m_ui->actionsListWidget->model()->blockSignals(true); delete m_ui->actionsListWidget->takeItem(i); m_ui->actionsListWidget->model()->blockSignals(false); break; } } } } } void ToolBarEditor::on_createButton_clicked() { ActionManager::ToolBarInfo info; int i = 0; //generate unique toolbar name QString title = tr("Toolbar"); while (m_ui->toolbarNameComboBox->findText(title) >= 0) title = tr("Toolbar %1").arg(++i); info.title = title; info.uid = QUuid::createUuid().toString(); m_toolBarInfoList.append(info); m_ui->toolbarNameComboBox->addItem(info.title); } void ToolBarEditor::on_renameButton_clicked() { int index = m_ui->toolbarNameComboBox->currentIndex(); if(index >= 0) { QString title = m_toolBarInfoList[index].title; title = QInputDialog::getText(this, tr("Rename Toolbar"), tr("Toolbar name:"), QLineEdit::Normal, title); if(!title.isEmpty()) { m_toolBarInfoList[index].title = title; m_ui->toolbarNameComboBox->setItemText(index, title); } } } void ToolBarEditor::on_removeButton_clicked() { if(m_ui->toolbarNameComboBox->count() == 1) return; int index = m_ui->toolbarNameComboBox->currentIndex(); if(index >= 0) { m_ui->toolbarNameComboBox->removeItem(index); m_toolBarInfoList.removeAt(index); } populateActionList(); }