| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- /****************************************************************************
- **
- ** Copyright (C) 2020 The Qt Company Ltd.
- ** Contact: https://www.qt.io/licensing/
- **
- ** This file is part of Qt Creator.
- **
- ** Commercial License Usage
- ** Licensees holding valid commercial Qt licenses may use this file in
- ** accordance with the commercial license agreement provided with the
- ** Software or, alternatively, in accordance with the terms contained in
- ** a written agreement between you and The Qt Company. For licensing terms
- ** and conditions see https://www.qt.io/terms-conditions. For further
- ** information use the contact form at https://www.qt.io/contact-us.
- **
- ** GNU Lesser General Public License Usage
- ** Alternatively, this file may be used under the terms of the GNU Lesser
- ** General Public License version 2.1 or (at your option) any later version.
- ** The licenses are as published by the Free Software Foundation
- ** and appearing in the file LICENSE.LGPLv21 included in the packaging
- ** of this file. Please review the following information to ensure
- ** the GNU Lesser General Public License version 2.1 requirements
- ** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
- **
- ** GNU General Public License Usage
- ** Alternatively, this file may be used under the terms of the GNU
- ** General Public License version 3 or (at your option) any later version
- ** approved by the KDE Free Qt Foundation. The licenses are as published by
- ** the Free Software Foundation and appearing in the file LICENSE.GPL3
- ** included in the packaging of this file. Please review the following
- ** information to ensure the GNU General Public License requirements will
- ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
- **
- ****************************************************************************/
- #include "workspacemodel.h"
- #include "dockmanager.h"
- #include "workspacedialog.h"
- #include <utils/algorithm.h>
- // #include <utils/fileutils.h>
- // #include <utils/stringutils.h>
- #include <QDir>
- #include <QFileInfo>
- namespace ADS {
- WorkspaceModel::WorkspaceModel(DockManager *manager, QObject *parent)
- : QAbstractTableModel(parent)
- , m_manager(manager)
- {
- m_sortedWorkspaces = m_manager->workspaces();
- connect(m_manager, &DockManager::workspaceLoaded, this, &WorkspaceModel::resetWorkspaces);
- }
- int WorkspaceModel::indexOfWorkspace(const QString &workspace)
- {
- return m_sortedWorkspaces.indexOf(workspace);
- }
- QString WorkspaceModel::workspaceAt(int row) const
- {
- return m_sortedWorkspaces.value(row, QString());
- }
- QVariant WorkspaceModel::headerData(int section, Qt::Orientation orientation, int role) const
- {
- QVariant result;
- if (orientation == Qt::Horizontal) {
- switch (role) {
- case Qt::DisplayRole:
- switch (section) {
- case 0:
- result = tr("Workspace");
- break;
- case 1:
- result = tr("Last Modified");
- break;
- } // switch (section)
- break;
- } // switch (role)
- }
- return result;
- }
- int WorkspaceModel::columnCount(const QModelIndex &) const
- {
- static int sectionCount = 0;
- if (sectionCount == 0) {
- // headers sections defining possible columns
- while (!headerData(sectionCount, Qt::Horizontal, Qt::DisplayRole).isNull())
- sectionCount++;
- }
- return sectionCount;
- }
- int WorkspaceModel::rowCount(const QModelIndex &) const
- {
- return m_sortedWorkspaces.count();
- }
- QStringList pathsToBaseNames(const QStringList &paths)
- {
- return Utils::transform(paths,
- [](const QString &path) { return QFileInfo(path).completeBaseName(); });
- }
- QStringList pathsWithTildeHomePath(const QStringList &paths)
- {
- QStringList result;
- std::transform(paths.begin(), paths.end(), std::back_inserter(result), [](const QString &path) {
- // 转换为本地分隔符格式
- QString nativePath = QDir::toNativeSeparators(path);
- // 获取用户主目录路径(使用本地分隔符)
- QString homePath = QDir::homePath();
- QString nativeHomePath = QDir::toNativeSeparators(homePath);
- // 检查路径是否以主目录开头
- if (nativePath.startsWith(nativeHomePath, Qt::CaseSensitive)) {
- // 替换主目录部分为波浪线(~)
- nativePath.replace(0, nativeHomePath.length(), "~");
- }
- return nativePath;
- });
- return result;
- }
- QVariant WorkspaceModel::data(const QModelIndex &index, int role) const
- {
- QVariant result;
- if (index.isValid()) {
- QString workspaceName = m_sortedWorkspaces.at(index.row());
- switch (role) {
- case Qt::DisplayRole:
- switch (index.column()) {
- case 0:
- result = workspaceName;
- break;
- case 1:
- result = m_manager->workspaceDateTime(workspaceName);
- break;
- } // switch (section)
- break;
- case Qt::FontRole: {
- QFont font;
- if (m_manager->isDefaultWorkspace(workspaceName))
- font.setItalic(true);
- else
- font.setItalic(false);
- if (m_manager->activeWorkspace() == workspaceName
- && !m_manager->isFactoryDefaultWorkspace(workspaceName))
- font.setBold(true);
- else
- font.setBold(false);
- result = font;
- } break;
- case DefaultWorkspaceRole:
- result = m_manager->isDefaultWorkspace(workspaceName);
- break;
- case LastWorkspaceRole:
- result = m_manager->lastWorkspace() == workspaceName;
- break;
- case ActiveWorkspaceRole:
- result = m_manager->activeWorkspace() == workspaceName;
- break;
- } // switch (role)
- }
- return result;
- }
- QHash<int, QByteArray> WorkspaceModel::roleNames() const
- {
- static QHash<int, QByteArray> extraRoles{{Qt::DisplayRole, "workspaceName"},
- {DefaultWorkspaceRole, "defaultWorkspace"},
- {LastWorkspaceRole, "activeWorkspace"},
- {ActiveWorkspaceRole, "lastWorkspace"}};
- return QAbstractTableModel::roleNames().unite(extraRoles);
- }
- void WorkspaceModel::sort(int column, Qt::SortOrder order)
- {
- beginResetModel();
- const auto cmp = [this, column, order](const QString &s1, const QString &s2) {
- bool isLess;
- if (column == 0)
- isLess = s1 < s2;
- else
- isLess = m_manager->workspaceDateTime(s1) < m_manager->workspaceDateTime(s2);
- if (order == Qt::DescendingOrder)
- isLess = !isLess;
- return isLess;
- };
- Utils::sort(m_sortedWorkspaces, cmp);
- endResetModel();
- }
- bool WorkspaceModel::isDefaultVirgin() const
- {
- return false; //m_manager->isFactoryDefaultWorkspace(); // TODO
- }
- void WorkspaceModel::resetWorkspaces()
- {
- beginResetModel();
- m_sortedWorkspaces = m_manager->workspaces();
- endResetModel();
- }
- void WorkspaceModel::newWorkspace(QWidget *parent)
- {
- WorkspaceNameInputDialog workspaceInputDialog(m_manager, parent);
- workspaceInputDialog.setWindowTitle(tr("New Workspace Name"));
- workspaceInputDialog.setActionText(tr("&Create"), tr("Create and &Open"));
- runWorkspaceNameInputDialog(&workspaceInputDialog, [this](const QString &newName) {
- m_manager->createWorkspace(newName);
- });
- }
- void WorkspaceModel::cloneWorkspace(QWidget *parent, const QString &workspace)
- {
- WorkspaceNameInputDialog workspaceInputDialog(m_manager, parent);
- workspaceInputDialog.setWindowTitle(tr("New Workspace Name"));
- workspaceInputDialog.setActionText(tr("&Clone"), tr("Clone and &Open"));
- workspaceInputDialog.setValue(workspace + " (2)");
- runWorkspaceNameInputDialog(&workspaceInputDialog, [this, workspace](const QString &newName) {
- m_manager->cloneWorkspace(workspace, newName);
- });
- }
- void WorkspaceModel::deleteWorkspaces(const QStringList &workspaces)
- {
- if (!m_manager->confirmWorkspaceDelete(workspaces))
- return;
- beginResetModel();
- m_manager->deleteWorkspaces(workspaces);
- endResetModel();
- }
- void WorkspaceModel::renameWorkspace(QWidget *parent, const QString &workspace)
- {
- WorkspaceNameInputDialog workspaceInputDialog(m_manager, parent);
- workspaceInputDialog.setWindowTitle(tr("Rename Workspace"));
- workspaceInputDialog.setActionText(tr("&Rename"), tr("Rename and &Open"));
- workspaceInputDialog.setValue(workspace);
- runWorkspaceNameInputDialog(&workspaceInputDialog, [this, workspace](const QString &newName) {
- m_manager->renameWorkspace(workspace, newName);
- });
- }
- void WorkspaceModel::switchToWorkspace(const QString &workspace)
- {
- m_manager->openWorkspace(workspace);
- emit workspaceSwitched();
- }
- void WorkspaceModel::runWorkspaceNameInputDialog(WorkspaceNameInputDialog *workspaceInputDialog,
- std::function<void(const QString &)> createWorkspace)
- {
- if (workspaceInputDialog->exec() == QDialog::Accepted) {
- QString newWorkspace = workspaceInputDialog->value();
- if (newWorkspace.isEmpty() || m_manager->workspaces().contains(newWorkspace))
- return;
- beginResetModel();
- createWorkspace(newWorkspace);
- m_sortedWorkspaces = m_manager->workspaces();
- endResetModel();
- if (workspaceInputDialog->isSwitchToRequested())
- switchToWorkspace(newWorkspace);
- emit workspaceCreated(newWorkspace);
- }
- }
- } // namespace ADS
|