resourceeditor.cpp

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

CPP
981
字号
    m_qrc_combo->insertItem(0, QIcon(), tr("<no resource files>"), QVariant(COMBO_EMPTY_DATA));    m_qrc_combo->setCurrentIndex(0);}void ResourceEditor::removeEmptyComboItem(){    if (m_qrc_combo->count() == 0)        return;    const QVariant v = m_qrc_combo->itemData(0);    if (v.type() != QVariant::Int || v.toInt() != COMBO_EMPTY_DATA)        return;    m_qrc_combo->removeItem(0);}int ResourceEditor::qrcCount() const{    return m_qrc_stack->count();}QTreeView *ResourceEditor::view(int i) const{    if (i >= qrcCount() || i < 0)        return 0;    return qobject_cast<QTreeView*>(m_qrc_stack->widget(i));}ResourceModel *ResourceEditor::model(int i) const{    if (i >= qrcCount() || i < 0)        return 0;    return qobject_cast<ResourceModel*>(view(i)->model());}QTreeView *ResourceEditor::currentView() const{    const int idx = currentIndex();    if (idx == -1)        return 0;    return view(idx);}ResourceModel *ResourceEditor::currentModel() const{    const int idx = currentIndex();    if (idx == -1)        return 0;    return model(idx);}void ResourceEditor::getCurrentItem(QString &prefix, QString &file){    prefix.clear();    file.clear();    QTreeView *view = currentView();    if (view == 0)        return;    ResourceModel *model = currentModel();    if (model == 0)        return;    model->getItem(view->currentIndex(), prefix, file);}void ResourceEditor::addPrefix(){    QTreeView *view = currentView();    if (view == 0)        return;    ResourceModel *model = currentModel();    if (model == 0)        return;    const QModelIndex idx = model->addNewPrefix();    view->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);    model->save();    updateUi();}void ResourceEditor::addFiles(){    QTreeView *view = currentView();    if (view == 0)        return;    ResourceModel *model = currentModel();    if (model == 0)        return;    const QStringList file_list = QFileDialog::getOpenFileNames(this, tr("Open file"),                                                            model->lastResourceOpenDirectory(),                                                            tr("All files (*)"));    if (file_list.isEmpty())        return;    const QModelIndex idx = model->addFiles(view->currentIndex(), file_list);    if (idx.isValid()) {        view->setExpanded(model->prefixIndex(view->currentIndex()), true);        view->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);    }    model->save();    updateUi();}void ResourceEditor::deleteItem(){    QTreeView *view = currentView();    if (view == 0)        return;    ResourceModel *model = currentModel();    if (model == 0)        return;    const QModelIndex cur_idx = view->currentIndex();    if (!cur_idx.isValid())        return;    const QModelIndex idx = model->deleteItem(cur_idx);    if (idx.isValid()) {        const QModelIndex pref_idx = model->prefixIndex(idx);        if (pref_idx != idx)            view->setExpanded(pref_idx, true);        view->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);    }    model->save();    updateUi();}void ResourceEditor::updateUi(){    QString prefix, file;    getCurrentItem(prefix, file);    m_add_button->setEnabled(currentModel() != 0);    m_remove_button->setEnabled(!prefix.isEmpty());    m_add_files_button->setEnabled(!prefix.isEmpty());    m_remove_qrc_button->setEnabled(currentModel() != 0);    QString name;    if (m_form != 0)        name = QFileInfo(m_form->fileName()).fileName();    QString suffix = name.isEmpty() ? tr("Resource Editor") : tr("Resource Editor: %1").arg(name);    QWidget* widget = 0;    if (m_form != 0)        widget = m_form->core()->topLevel();    if (widget && (widget->objectName() == QLatin1String("MDIWindow"))) {        QDockWidget* dockWidget = qFindChild<QDockWidget*>(widget, (parentWidget()->objectName() + QLatin1String("_dock")));        if(dockWidget)            dockWidget->setWindowTitle(suffix);    }    else if ((widget = parentWidget()) != 0 && widget->isWindow())        widget->setWindowTitle(suffix);    else        setWindowTitle(suffix);}int ResourceEditor::currentIndex() const{    return m_qrc_stack->currentIndex();}void ResourceEditor::setCurrentIndex(int i){    const QVariant v = m_qrc_combo->itemData(i);    if (v.type() == QVariant::Int) {        switch (v.toInt()) {            case COMBO_EMPTY_DATA: {                    bool blocked = m_qrc_combo->blockSignals(true);                    m_qrc_combo->setCurrentIndex(i);                    m_qrc_combo->blockSignals(blocked);                }                break;            case COMBO_OPEN_DATA:                openView();                break;            case COMBO_NEW_DATA:                newView();                break;            default:                break;        }    } else {        const bool blocked = m_qrc_combo->blockSignals(true);        m_qrc_combo->setCurrentIndex(i);        m_qrc_combo->blockSignals(blocked);        m_qrc_stack->setCurrentIndex(i);    }    QAbstractItemView *view = currentView();    if (view != 0)        itemChanged(view->currentIndex());    updateUi();}void ResourceEditor::updateQrcStack(){    if (m_ignore_update)        return;    m_qrc_combo->clear();    while (m_qrc_stack->count() > 0) {        QWidget *w = m_qrc_stack->widget(0);        m_qrc_stack->removeWidget(w);        delete w;    }    bool empty_list = true;    QStringList qrc_file_list;    if (m_form != 0) {        qrc_file_list = m_form->resourceFiles();        foreach (QString qrc_file, qrc_file_list) {            if (QFile::exists(qrc_file)) {                addView(qrc_file);                empty_list = false;            }        }    }    m_qrc_combo->addItem(QIcon(), tr("New..."), QVariant(COMBO_NEW_DATA));    m_qrc_combo->addItem(QIcon(), tr("Open..."), QVariant(COMBO_OPEN_DATA));    if (empty_list)        insertEmptyComboItem();    updateUi();}QString ResourceEditor::qrcName(const QString &path) const{    if (m_form == 0 || path.isEmpty())        return tr("Untitled");    return m_form->absoluteDir().relativeFilePath(path);}void ResourceEditor::updateQrcPaths(){    for (int i = 0; i < m_qrc_stack->count(); ++i) {        ResourceModel *model = this->model(i);        m_qrc_combo->setItemText(i, QDir(model->fileName()).absolutePath());    }    updateUi();}void ResourceEditor::addView(const QString &qrc_file){    const int idx = qrcCount();    QTreeView *view = new QrcView;    view->setDragEnabled(m_dragEnabled);    ResourceModel *model = g_model_cache()->model(qrc_file);    if (model == 0)        return;    removeEmptyComboItem();    view->setModel(model);    m_qrc_combo->insertItem(idx, model->fileName());    m_qrc_stack->addWidget(view);    connect(view->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),            this, SLOT(updateUi()));    connect(view, SIGNAL(activated(QModelIndex)), this, SLOT(itemActivated(QModelIndex)));    connect(view->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)),            this, SLOT(itemChanged(QModelIndex)));    setCurrentIndex(idx);    m_ignore_update = true;    if (m_form && !qrc_file.isEmpty())        m_form->addResourceFile(qrc_file);    m_ignore_update = false;    updateUi();}void ResourceEditor::setCurrentFile(const QString &_qrc_path, const QString &file_path){    const QDir form_dir = m_form->absoluteDir();    const QString qrc_path = form_dir.relativeFilePath(_qrc_path);    for (int i = 0; i < m_qrc_stack->count(); ++i) {        ResourceModel *resourceModel = model(i);        if (qrc_path == form_dir.relativeFilePath(resourceModel->fileName())) {            setCurrentIndex(i);            const QModelIndex index = resourceModel->getIndex(file_path);            view(i)->setCurrentIndex(index);            break;        }    }    updateUi();}void ResourceEditor::itemChanged(const QModelIndex &index){    QString file_name, qrc_path;    if (ResourceModel *model = currentModel()) {        QString prefix, file;        model->getItem(index, prefix, file);        if (!file.isEmpty()) {            file_name = ResourceModel::resourcePath(prefix, file);            qrc_path = m_form->absoluteDir().absoluteFilePath(model->fileName());        }    }    emit currentFileChanged(qrc_path, file_name);}void ResourceEditor::itemActivated(const QModelIndex &index){    ResourceModel *model = currentModel();    if (!model)        return;    QString prefix, file;    model->getItem(index, prefix, file);    if (file.isEmpty())        return;    const QString file_name = ResourceModel::resourcePath(prefix, file);    const QString qrc_path = m_form->absoluteDir().absoluteFilePath(model->fileName());    emit fileActivated(qrc_path, file_name);}static void ensureSuffix(QString &file_name){    const QString suffix = QLatin1String("qrc");    if (QFileInfo(file_name).suffix() != suffix) {        file_name += QLatin1Char('.');        file_name += suffix;    }}void ResourceEditor::saveCurrentView(){    ResourceModel *model = currentModel();    if (model == 0)        return;    if (model->fileName().isEmpty()) {        QString file_name = QFileDialog::getSaveFileName(this, tr("Save resource file"),                                                            m_form->absoluteDir().absolutePath(),                                                            tr("Resource files (*.qrc)"));        if (file_name.isEmpty())            return;        ensureSuffix(file_name);        model->setFileName(file_name);        m_ignore_update = true;        m_form->addResourceFile(file_name);        m_ignore_update = false;        QString s = QFileInfo(file_name).fileName();        bool blocked = m_qrc_combo->blockSignals(true);        m_qrc_combo->setItemText(currentIndex(), model->fileName());        m_qrc_combo->setCurrentIndex(-1);        m_qrc_combo->setCurrentIndex(currentIndex());        m_qrc_combo->blockSignals(blocked);    }    model->save();    updateUi();}int ResourceEditor::indexOfView(QTreeView *view){    for (int i = 0; i < m_qrc_stack->count(); ++i) {        if (view == m_qrc_stack->widget(i))            return i;    }    return -1;}void ResourceEditor::removeCurrentView(){    QTreeView *view = currentView();    if (view == 0)        return;    ResourceModel *model = currentModel();    if (model == 0)        return;    QString file_name = model->fileName();    int idx = indexOfView(view);    if (idx == -1)        return;    m_qrc_combo->removeItem(idx);    m_qrc_stack->removeWidget(view);    delete view;    disconnect(model, SIGNAL(dirtyChanged(bool)), this, SLOT(updateUi()));    m_ignore_update = true;    if (m_form != 0 && !file_name.isEmpty())        m_form->removeResourceFile(file_name);    m_ignore_update = false;    if (qrcCount() == 0) {        insertEmptyComboItem();    } else {        if (idx < qrcCount())            setCurrentIndex(idx);        else if (idx > 0)            setCurrentIndex(idx - 1);    }    updateUi();}void ResourceEditor::reloadCurrentView(){    ResourceModel *model = currentModel();    if (model == 0)        return;    model->reload();    updateUi();}void ResourceEditor::newView(){    QString file_name = QFileDialog::getSaveFileName(this, tr("New resource file"),                                                        m_form->absoluteDir().absolutePath(),                                                        tr("Resource files (*.qrc)"));    if (file_name.isEmpty()) {        setCurrentIndex(m_qrc_stack->count() == 0 ? 0 : m_qrc_stack->currentIndex());        return;    }    ensureSuffix(file_name);    ResourceFile rf(file_name);    rf.save();    addView(file_name);}void ResourceEditor::openView(){    QString file_name = QFileDialog::getOpenFileName(this, tr("Open resource file"),                                                        m_form->absoluteDir().absolutePath(),                                                        tr("Resource files (*.qrc)"));    if (file_name.isEmpty()) {        setCurrentIndex(m_qrc_stack->count() == 0 ? 0 : m_qrc_stack->currentIndex());        return;    }    addView(file_name);}void ResourceEditor::setActiveForm(QDesignerFormWindowInterface *form){    if (form == m_form)        return;    if (m_form != 0) {        disconnect(m_form, SIGNAL(fileNameChanged(QString)),                    this, SLOT(updateQrcPaths()));        disconnect(m_form, SIGNAL(resourceFilesChanged()),                    this, SLOT(updateQrcStack()));    }    m_form = form;    updateQrcStack();    if (m_form != 0) {        connect(m_form, SIGNAL(fileNameChanged(QString)),                    this, SLOT(updateQrcPaths()));        connect(m_form, SIGNAL(resourceFilesChanged()),                    this, SLOT(updateQrcStack()));    }    setEnabled(m_form != 0);}} // namespace qdesigner_internal#include "resourceeditor.moc"

⌨️ 快捷键说明

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