/**************************************************************************** ** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the Qt Designer of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the files LICENSE.GPL2 and LICENSE.GPL3 ** included in the packaging of this file. Alternatively you may (at ** your option) use any later version of the GNU General Public ** License if such license has been publicly approved by Trolltech ASA ** (or its successors, if any) and the KDE Free Qt Foundation. In ** addition, as a special exception, Trolltech gives you certain ** additional rights. These rights are described in the Trolltech GPL ** Exception version 1.1, which can be found at ** http://www.trolltech.com/products/qt/gplexception/ and in the file ** GPL_EXCEPTION.txt in this package. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. If ** you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** In addition, as a special exception, Trolltech, as the sole ** copyright holder for Qt Designer, grants users of the Qt/Eclipse ** Integration plug-in the right for the Qt/Eclipse Integration to ** link to functionality provided by Qt Designer and its related ** libraries. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not expressly ** granted herein. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ****************************************************************************/ /* TRANSLATOR qdesigner_internal::GraphicsPropertyEditor */ #include "graphicspropertyeditor.h" #include <findicondialog_p.h> #include <iconloader_p.h> #include <QtDesigner/QDesignerFormEditorInterface> #include <QtDesigner/QDesignerFormWindowManagerInterface> #include <QtDesigner/QDesignerIconCacheInterface> #include <QtGui/QComboBox> #include <QtGui/QToolButton> #include <QtGui/QHBoxLayout> namespace qdesigner_internal { GraphicsPropertyEditor::~GraphicsPropertyEditor() { } void GraphicsPropertyEditor::init() { QHBoxLayout *layout = new QHBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); m_combo = new QComboBox(this); m_combo->setFrame(0); m_combo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); m_combo->setEditable(false); layout->addWidget(m_combo); m_button = new QToolButton(this); m_button->setIcon(createIconSet(QLatin1String("fileopen.png"))); m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); m_button->setFixedWidth(20); layout->addWidget(m_button); connect(m_button, SIGNAL(clicked()), this, SLOT(showDialog())); connect(m_combo, SIGNAL(activated(int)), this, SLOT(comboActivated(int))); populateCombo(); } void GraphicsPropertyEditor::comboActivated(int idx) { if (m_mode == Icon) { setIcon(qvariant_cast<QIcon>(m_combo->itemData(idx))); } else { setPixmap(qvariant_cast<QPixmap>(m_combo->itemData(idx))); } } int GraphicsPropertyEditor::indexOfIcon(const QIcon &icon) { if (m_mode == Pixmap) return -1; if (icon.isNull()) return 0; for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QIcon>(m_combo->itemData(i)).serialNumber() == icon.serialNumber()) return i; } populateCombo(); for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QIcon>(m_combo->itemData(i)).serialNumber() == icon.serialNumber()) return i; } return -1; } int GraphicsPropertyEditor::indexOfPixmap(const QPixmap &pixmap) { if (m_mode == Icon) return -1; if (pixmap.isNull()) return 0; for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QPixmap>(m_combo->itemData(i)).serialNumber() == pixmap.serialNumber()) return i; } populateCombo(); for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QPixmap>(m_combo->itemData(i)).serialNumber() == pixmap.serialNumber()) return i; } return -1; } void GraphicsPropertyEditor::populateCombo() { QDesignerFormWindowInterface *form = m_core->formWindowManager()->activeFormWindow(); if (form == 0) return; const QStringList qrc_list = form->resourceFiles(); m_combo->clear(); static const QString noIcon = tr("<no icon>"); static const QString noPixmap = tr("<no pixmap>"); QDesignerIconCacheInterface *cache = m_core->iconCache(); if (m_mode == Icon) { m_combo->addItem(noIcon); const QList<QIcon> icon_list = cache->iconList(); foreach (QIcon icon, icon_list) { const QString qrc_path = cache->iconToQrcPath(icon); if (!qrc_path.isEmpty() && !qrc_list.contains(qrc_path)) continue; m_combo->addItem(icon, QFileInfo(cache->iconToFilePath(icon)).fileName(), QVariant(icon)); } } else { m_combo->addItem(noPixmap); const QList<QPixmap> pixmap_list = cache->pixmapList(); foreach (QPixmap pixmap, pixmap_list) { const QString qrc_path = cache->iconToQrcPath(pixmap); if (!qrc_path.isEmpty() && !qrc_list.contains(qrc_path)) continue; m_combo->addItem(QIcon(pixmap), QFileInfo(cache->pixmapToFilePath(pixmap)).fileName(), QVariant(pixmap)); } } const bool blocked = m_combo->blockSignals(true); m_combo->setCurrentIndex(0); m_combo->blockSignals(blocked); } GraphicsPropertyEditor::GraphicsPropertyEditor(QDesignerFormEditorInterface *core, const QIcon &pm, QWidget *parent) : QWidget(parent), m_mode(Icon), m_core(core) { init(); setIcon(pm); } GraphicsPropertyEditor::GraphicsPropertyEditor(QDesignerFormEditorInterface *core, const QPixmap &pm, QWidget *parent) : QWidget(parent), m_mode(Pixmap), m_core(core) { init(); setPixmap(pm); } void GraphicsPropertyEditor::showDialog() { QDesignerFormWindowInterface *form = m_core->formWindowManager()->activeFormWindow(); if (form == 0) return; QString file_path; QString qrc_path; if (m_mode == Icon && !m_icon.isNull()) { file_path = m_core->iconCache()->iconToFilePath(m_icon); qrc_path = m_core->iconCache()->iconToQrcPath(m_icon); } else if (!m_pixmap.isNull()) { file_path = m_core->iconCache()->pixmapToFilePath(m_pixmap); qrc_path = m_core->iconCache()->pixmapToQrcPath(m_pixmap); } FindIconDialog dialog(form, 0); dialog.setPaths(qrc_path, file_path); if (dialog.exec()) { file_path = dialog.filePath(); qrc_path = dialog.qrcPath(); if (!file_path.isEmpty()) { populateCombo(); if (m_mode == Icon) { const QIcon icon = m_core->iconCache()->nameToIcon(file_path, qrc_path); populateCombo(); setIcon(icon); } else { const QPixmap pixmap = m_core->iconCache()->nameToPixmap(file_path, qrc_path); populateCombo(); setPixmap(pixmap); } } } } void GraphicsPropertyEditor::setIcon(const QIcon &pm) { if (m_mode == Pixmap) return; if (pm.isNull() && m_icon.isNull()) return; if (pm.serialNumber() == m_icon.serialNumber()) return; m_icon = pm; const bool blocked = m_combo->blockSignals(true); m_combo->setCurrentIndex(indexOfIcon(m_icon)); m_combo->blockSignals(blocked); emit iconChanged(m_icon); } void GraphicsPropertyEditor::setPixmap(const QPixmap &pm) { if (m_mode == Icon) return; if (pm.isNull() && m_pixmap.isNull()) return; if (pm.serialNumber() == m_pixmap.serialNumber()) return; m_pixmap = pm; const bool blocked = m_combo->blockSignals(true); m_combo->setCurrentIndex(indexOfPixmap(m_pixmap)); m_combo->blockSignals(blocked); emit pixmapChanged(m_pixmap); } IconProperty::IconProperty(QDesignerFormEditorInterface *core, const QIcon &value, const QString &name) : AbstractProperty<QIcon>(value, name), m_core(core) { } void IconProperty::setValue(const QVariant &value) { m_value = qvariant_cast<QIcon>(value); } QString IconProperty::toString() const { const QString path = m_core->iconCache()->iconToFilePath(m_value); return QFileInfo(path).fileName(); } QVariant IconProperty::decoration() const { if (m_value.isNull()) return qVariantFromValue(emptyIcon()); return qVariantFromValue(m_value); } QWidget *IconProperty::createEditor(QWidget *parent, const QObject *target, const char *receiver) const { GraphicsPropertyEditor *editor = new GraphicsPropertyEditor(m_core, m_value, parent); QObject::connect(editor, SIGNAL(iconChanged(QIcon)), target, receiver); return editor; } void IconProperty::updateEditorContents(QWidget *editor) { if (GraphicsPropertyEditor *ed = qobject_cast<GraphicsPropertyEditor*>(editor)) { ed->setIcon(m_value); } } void IconProperty::updateValue(QWidget *editor) { if (GraphicsPropertyEditor *ed = qobject_cast<GraphicsPropertyEditor*>(editor)) { const QIcon newValue = ed->icon(); if (newValue.serialNumber() != m_value.serialNumber()) { m_value = newValue; setChanged(true); } } } PixmapProperty::PixmapProperty(QDesignerFormEditorInterface *core, const QPixmap &pixmap, const QString &name) : AbstractProperty<QPixmap>(pixmap, name), m_core(core) { } void PixmapProperty::setValue(const QVariant &value) { m_value = qvariant_cast<QPixmap>(value); } QString PixmapProperty::toString() const { const QString path = m_core->iconCache()->pixmapToFilePath(m_value); return QFileInfo(path).fileName(); } QVariant PixmapProperty::decoration() const { if (m_value.isNull()) return qVariantFromValue(emptyIcon()); return qVariantFromValue(QIcon(m_value)); } QWidget *PixmapProperty::createEditor(QWidget *parent, const QObject *target, const char *receiver) const { GraphicsPropertyEditor *editor = new GraphicsPropertyEditor(m_core, m_value, parent); QObject::connect(editor, SIGNAL(pixmapChanged(QPixmap)), target, receiver); return editor; } void PixmapProperty::updateEditorContents(QWidget *editor) { if (GraphicsPropertyEditor *ed = qobject_cast<GraphicsPropertyEditor*>(editor)) { ed->setPixmap(m_value); } } void PixmapProperty::updateValue(QWidget *editor) { if (GraphicsPropertyEditor *ed = qobject_cast<GraphicsPropertyEditor*>(editor)) { QPixmap newValue = ed->pixmap(); if (newValue.serialNumber() != m_value.serialNumber()) { m_value = newValue; setChanged(true); } } } }