findicondialog.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 598 行 · 第 1/2 页

CPP
598
字号
/******************************************************************************** Copyright (C) 1992-2007 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 version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  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 gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** 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.**** 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.******************************************************************************/#include "resourcefile_p.h"#include "findicondialog_p.h"#include "ui_findicondialog.h"#include "resourceeditor_p.h"#include <QtDesigner/abstractformwindow.h>#include <QtDesigner/abstractformeditor.h>#include <QtDesigner/abstractformwindowmanager.h>#include <QtDesigner/abstractresourcebrowser.h>#include <QtDesigner/abstractlanguage.h>#include <QtDesigner/qextensionmanager.h>#ifdef Q_OS_WIN#include <Windows.h>#endif#include <QtCore/QFileInfo>#include <QtCore/QDir>#include <QtCore/QMetaObject>#include <QtCore/QSettings>#include <QtCore/qdebug.h>#include <QtGui/QFileDialog>#include <QtGui/QHeaderView>#include <QtGui/QImageReader>#include <QtGui/QLabel>#include <QtGui/QComboBox>#include <QtGui/QLineEdit>#include <QtGui/QPushButton>#include <QtCore/QSignalMapper>namespace qdesigner_internal {QStringList extensionList(){    static QStringList extension_list;    if (extension_list.isEmpty()) {        const QList<QByteArray> _extension_list = QImageReader::supportedImageFormats();        foreach (const QByteArray &ext, _extension_list) {            QString filter = QLatin1String("*.");            filter +=  QString::fromAscii(ext);            extension_list.append(filter);        }    }    return extension_list;}bool FindIconDialog::isIconValid(const QString &file) const{    if (!qrcPath().isEmpty())        return m_resource_editor->isIcon(qrcPath(), file);    const bool enabled = !file.isEmpty();    if (enabled) {        const QStringList ext_list = extensionList();        foreach (QString ext, ext_list) {            if (file.endsWith(ext.remove(0, 2), Qt::CaseInsensitive)) {                return true;            }        }    }    return false;}    enum {  g_file_item_id, g_dir_item_id };    static const char* FindDialogDirSettingsKey="FindIconDialog/RecentDirectories";QListWidgetItem *createListWidgetItem(const QIcon &icon, const QString &text, int item_id, QListWidget *parent){    QListWidgetItem *result = new QListWidgetItem(icon, text, parent);    const QSize s = parent->iconSize();    result->setSizeHint(QSize(s.width()*3, s.height()*2));    result->setData(Qt::UserRole, item_id);    return result;}bool dirItem(QListWidgetItem *item){    const QVariant v = item->data(Qt::UserRole);    if (!v.canConvert(QVariant::Int))        return false;    return v.toInt() == g_dir_item_id;}}namespace qdesigner_internal {FindIconDialog::FindIconDialog(QDesignerFormWindowInterface *form, QWidget *parent)    : QDialog(parent),      ui(new Ui::FindIconDialog),      m_form (form),      m_view_dir(QDir::temp()),      m_resource_editor(0),      m_language_editor(0){    ui->setupUi(this);    setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);    const QSize icon_size(24, 24);    ui->m_icon_view->setViewMode(QListWidget::IconMode);    ui->m_icon_view->setMovement(QListWidget::Static);    ui->m_icon_view->setResizeMode(QListWidget::Adjust);    ui->m_icon_view->setIconSize(icon_size);    ui->m_icon_view->setTextElideMode(Qt::ElideRight);    ui->m_file_input->setMinimumContentsLength(40);    ui->m_file_input->setSizeAdjustPolicy(QComboBox::AdjustToMinimumContentsLength);    QSettings settings;    const QStringList recent_dir_list = settings.value(QLatin1String(FindDialogDirSettingsKey)).toStringList();    foreach (const QString &dir, recent_dir_list)        ui->m_file_input->addItem(dir);    ui->m_widget_stack->widget(FileBox)->layout()->setMargin(0);    QWidget *page = ui->m_widget_stack->widget(ResourceBox);    QVBoxLayout *layout = new QVBoxLayout(page);    layout->setMargin(0);    m_resource_editor = new ResourceEditor(form->core(), false, page);    disconnect(form->core()->formWindowManager(),                SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),                m_resource_editor, SLOT(setActiveForm(QDesignerFormWindowInterface*)));    m_resource_editor->setActiveForm(form);    layout->addWidget(m_resource_editor);    m_resource_editor->layout()->setMargin(0);    QDesignerFormEditorInterface *core = form->core();    if (QDesignerLanguageExtension *lang = qt_extension<QDesignerLanguageExtension*>(core->extensionManager(), core)) {        m_language_editor = lang->createResourceBrowser(ui->m_widget_stack);        connect(m_language_editor, SIGNAL( currentPathChanged(const QString&)),                 this,SLOT(itemChanged(const QString&)));        connect(m_language_editor, SIGNAL( pathActivated(const QString&)),                 this,SLOT(itemActivated(const QString&)));        ui->m_widget_stack->addWidget(m_language_editor);    }    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);    // Set up switching of modes    QSignalMapper *mapper = new QSignalMapper(this);    mapper->setMapping(ui->m_specify_file_input, FileBox);    mapper->setMapping(ui->m_specify_resource_input, m_language_editor ? LanguageBox : ResourceBox);    connect(mapper, SIGNAL(mapped(int)), this, SLOT(setActiveBox(int)));    connect(ui->m_specify_file_input, SIGNAL(clicked()), mapper, SLOT(map()));    connect(ui->m_specify_resource_input, SIGNAL(clicked()), mapper, SLOT(map()));    connect(ui->m_icon_view, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),            this, SLOT(currentItemChanged(QListWidgetItem*)));    connect(ui->m_icon_view, SIGNAL(itemActivated(QListWidgetItem*)),            this, SLOT(itemActivated(QListWidgetItem*)));    connect(ui->m_cd_up_button, SIGNAL(clicked()), this, SLOT(cdUp()));    connect(ui->m_file_input->lineEdit(), SIGNAL(textEdited(QString)), this, SLOT(setFile(QString)));    connect(ui->m_file_input, SIGNAL(currentIndexChanged(QString)), this, SLOT(setFile(QString)));    connect(m_resource_editor, SIGNAL(fileActivated(QString, QString)),            this, SLOT(itemActivated(QString, QString)));    connect(m_resource_editor, SIGNAL(currentFileChanged(QString, QString)),            this, SLOT(itemChanged(QString, QString)));#ifdef Q_OS_WIN    isRoot = false;        QSettings myComputer(QLatin1String("HKEY_CLASSES_ROOT\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"), QSettings::NativeFormat);    rootDir = myComputer.value(QString(QLatin1Char('.'))).toString();#endif    updateButtons();}void FindIconDialog::accept(){    if (activeBox() == FileBox && !filePath().isEmpty()) {        QStringList recent_dir_list;        const QString new_path = m_view_dir.path();        recent_dir_list.append(new_path);        for (int i = 0; i < 15 && i < ui->m_file_input->count(); ++i) {            const QString path = ui->m_file_input->itemText(i);            if (path != new_path)                recent_dir_list.append(path);        }        QSettings settings;        settings.setValue(QLatin1String(FindDialogDirSettingsKey), recent_dir_list);    }    if (activeBox() == ResourceBox) {        setDefaultQrcPath(qrcPath());    } else if (activeBox() == LanguageBox) {        setDefaultLanguagePath(filePath());    } else {        setDefaultFilePath(QFileInfo(filePath()).absolutePath());    }    setPreviousInputBox(activeBox());    QDialog::accept();}void FindIconDialog::cdUp(){    QDir dir = m_view_dir;#ifdef Q_OS_WIN    if (dir.cdUp() && !isRoot) {        setFile(dir.canonicalPath());    } else if (!isRoot)        setFile(rootDir);#else    if (dir.cdUp())        setFile(dir.path());#endif      updateButtons();}void FindIconDialog::itemActivated(const QString&, const QString &file_name){    if (activeBox() != ResourceBox)        return;    if (isIconValid(file_name))        accept();    updateButtons();}void FindIconDialog::itemActivated(QListWidgetItem *item){    if (!item || activeBox() != FileBox)        return;    const QString file = item->text();    const QString path = m_view_dir.filePath(file);    if (dirItem(item)) {#ifdef Q_OS_WIN        isRoot = false;#endif        QMetaObject::invokeMethod(this, "setFile", Qt::QueuedConnection, Q_ARG(QString, path));    } else        accept();    updateButtons();}void FindIconDialog::itemChanged(const QString &qrc_path, const QString &file_name){    if (activeBox() != ResourceBox)        return;    m_resource_data.file = file_name;    m_resource_data.qrc = qrc_path;    updateButtons();}void FindIconDialog::currentItemChanged(QListWidgetItem *item){    if (activeBox() != FileBox)        return;    if (item == 0)        return;    const QString path = m_view_dir.filePath(item->text());    ui->m_file_input->lineEdit()->setText(path);    if (dirItem(item))        m_file_data.file.clear();    else

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?