File indexing completed on 2024-04-28 05:49:07

0001 /* This file is part of the KDE project
0002 
0003    SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "kateprojectconfigpage.h"
0007 #include "kateprojectplugin.h"
0008 
0009 #include <KLocalizedString>
0010 #include <KUrlRequester>
0011 #include <QCheckBox>
0012 #include <QComboBox>
0013 #include <QGroupBox>
0014 #include <QLabel>
0015 #include <QVBoxLayout>
0016 
0017 KateProjectConfigPage::KateProjectConfigPage(QWidget *parent, KateProjectPlugin *plugin)
0018     : KTextEditor::ConfigPage(parent)
0019     , m_plugin(plugin)
0020 {
0021     QVBoxLayout *layout = new QVBoxLayout(this);
0022 
0023     QVBoxLayout *vbox = new QVBoxLayout;
0024     QGroupBox *group = new QGroupBox(i18nc("Groupbox title", "Autoload Repositories"), this);
0025     group->setWhatsThis(
0026         i18n("Project plugin is able to autoload repository working copies when "
0027              "there is no .kateproject file defined yet."));
0028 
0029     m_cbAutoGit = new QCheckBox(i18n("&Git"), this);
0030     vbox->addWidget(m_cbAutoGit);
0031 
0032     m_cbAutoSubversion = new QCheckBox(i18n("&Subversion"), this);
0033     vbox->addWidget(m_cbAutoSubversion);
0034     m_cbAutoMercurial = new QCheckBox(i18n("&Mercurial"), this);
0035     vbox->addWidget(m_cbAutoMercurial);
0036     m_cbAutoFossil = new QCheckBox(i18n("&Fossil"), this);
0037     vbox->addWidget(m_cbAutoFossil);
0038 
0039     vbox->addStretch(1);
0040     group->setLayout(vbox);
0041 
0042     layout->addWidget(group);
0043 
0044     vbox = new QVBoxLayout();
0045     group = new QGroupBox(i18nc("Groupbox title", "Session Behavior"), this);
0046     group->setWhatsThis(i18n("Session settings for projects"));
0047     m_cbSessionRestoreOpenProjects = new QCheckBox(i18n("Restore Open Projects"), this);
0048     vbox->addWidget(m_cbSessionRestoreOpenProjects);
0049     vbox->addStretch(1);
0050     group->setLayout(vbox);
0051     layout->addWidget(group);
0052 
0053     vbox = new QVBoxLayout();
0054     group = new QGroupBox(i18nc("Groupbox title", "Project Index"), this);
0055     group->setWhatsThis(i18n("Project ctags index settings"));
0056     m_cbIndexEnabled = new QCheckBox(i18n("Enable indexing"), this);
0057     vbox->addWidget(m_cbIndexEnabled);
0058     auto label = new QLabel(this);
0059     label->setText(i18n("Directory for index files"));
0060     vbox->addWidget(label);
0061     m_indexPath = new KUrlRequester(this);
0062     m_indexPath->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
0063     m_indexPath->setToolTip(i18n("The system temporary directory is used if not specified, which may overflow for very large repositories"));
0064     vbox->addWidget(m_indexPath);
0065     vbox->addStretch(1);
0066     group->setLayout(vbox);
0067     layout->addWidget(group);
0068 
0069     vbox = new QVBoxLayout;
0070     group = new QGroupBox(i18nc("Groupbox title", "Cross-Project Functionality"), this);
0071     group->setWhatsThis(i18n("Project plugin is able to perform some operations across multiple projects"));
0072     m_cbMultiProjectCompletion = new QCheckBox(i18n("Cross-Project Completion"), this);
0073     vbox->addWidget(m_cbMultiProjectCompletion);
0074     m_cbMultiProjectGoto = new QCheckBox(i18n("Cross-Project Goto Symbol"), this);
0075     vbox->addWidget(m_cbMultiProjectGoto);
0076     vbox->addStretch(1);
0077     group->setLayout(vbox);
0078     layout->addWidget(group);
0079 
0080     /** Git specific **/
0081     vbox = new QVBoxLayout;
0082     group = new QGroupBox(i18nc("Groupbox title", "Git"), this);
0083 
0084     auto hbox = new QHBoxLayout;
0085     label = new QLabel(i18n("Single click action in the git status view"), this);
0086     m_cmbSingleClick = new QComboBox(this);
0087     m_cmbSingleClick->addItem(i18n("No Action"));
0088     m_cmbSingleClick->addItem(i18n("Show Diff"));
0089     m_cmbSingleClick->addItem(i18n("Open file"));
0090     m_cmbSingleClick->addItem(i18n("Stage / Unstage"));
0091     label->setBuddy(m_cmbSingleClick);
0092     hbox->addWidget(label);
0093     hbox->addWidget(m_cmbSingleClick);
0094     vbox->addLayout(hbox);
0095 
0096     hbox = new QHBoxLayout;
0097     label = new QLabel(i18n("Double click action in the git status view"), this);
0098     m_cmbDoubleClick = new QComboBox(this);
0099     m_cmbDoubleClick->addItem(i18n("No Action"));
0100     m_cmbDoubleClick->addItem(i18n("Show Diff"));
0101     m_cmbDoubleClick->addItem(i18n("Open file"));
0102     m_cmbDoubleClick->addItem(i18n("Stage / Unstage"));
0103     label->setBuddy(m_cmbDoubleClick);
0104     hbox->addWidget(label);
0105     hbox->addWidget(m_cmbDoubleClick);
0106     vbox->addLayout(hbox);
0107 
0108     vbox->addStretch(1);
0109     group->setLayout(vbox);
0110     layout->addWidget(group);
0111 
0112     layout->insertStretch(-1, 10);
0113 
0114     connect(m_cbAutoGit, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0115     connect(m_cbAutoSubversion, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0116     connect(m_cbAutoMercurial, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0117     connect(m_cbAutoFossil, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0118     connect(m_cbSessionRestoreOpenProjects, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0119     connect(m_cbIndexEnabled, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0120     connect(m_indexPath, &KUrlRequester::textChanged, this, &KateProjectConfigPage::slotMyChanged);
0121     connect(m_indexPath, &KUrlRequester::urlSelected, this, &KateProjectConfigPage::slotMyChanged);
0122     connect(m_cbMultiProjectCompletion, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0123     connect(m_cbMultiProjectGoto, &QCheckBox::stateChanged, this, &KateProjectConfigPage::slotMyChanged);
0124 
0125     connect(m_cmbSingleClick, QOverload<int>::of(&QComboBox::activated), this, &KateProjectConfigPage::slotMyChanged);
0126     connect(m_cmbDoubleClick, QOverload<int>::of(&QComboBox::activated), this, &KateProjectConfigPage::slotMyChanged);
0127 
0128     reset();
0129 }
0130 
0131 QString KateProjectConfigPage::name() const
0132 {
0133     return i18n("Projects");
0134 }
0135 
0136 QString KateProjectConfigPage::fullName() const
0137 {
0138     return i18nc("Groupbox title", "Projects Properties");
0139 }
0140 
0141 QIcon KateProjectConfigPage::icon() const
0142 {
0143     return QIcon::fromTheme(QLatin1String("project-open"), QIcon::fromTheme(QLatin1String("view-list-tree")));
0144 }
0145 
0146 void KateProjectConfigPage::apply()
0147 {
0148     if (!m_changed) {
0149         return;
0150     }
0151 
0152     m_changed = false;
0153 
0154     m_plugin->setAutoRepository(m_cbAutoGit->checkState() == Qt::Checked,
0155                                 m_cbAutoSubversion->checkState() == Qt::Checked,
0156                                 m_cbAutoMercurial->checkState() == Qt::Checked,
0157                                 m_cbAutoFossil->checkState() == Qt::Checked);
0158     m_plugin->setIndex(m_cbIndexEnabled->checkState() == Qt::Checked, m_indexPath->url());
0159     m_plugin->setMultiProject(m_cbMultiProjectCompletion->checkState() == Qt::Checked, m_cbMultiProjectGoto->checkState() == Qt::Checked);
0160 
0161     m_plugin->setSingleClickAction((ClickAction)m_cmbSingleClick->currentIndex());
0162     m_plugin->setDoubleClickAction((ClickAction)m_cmbDoubleClick->currentIndex());
0163 
0164     m_plugin->setRestoreProjectsForSession(m_cbSessionRestoreOpenProjects->isChecked());
0165 }
0166 
0167 void KateProjectConfigPage::reset()
0168 {
0169     m_cbAutoGit->setCheckState(m_plugin->autoGit() ? Qt::Checked : Qt::Unchecked);
0170     m_cbAutoSubversion->setCheckState(m_plugin->autoSubversion() ? Qt::Checked : Qt::Unchecked);
0171     m_cbAutoMercurial->setCheckState(m_plugin->autoMercurial() ? Qt::Checked : Qt::Unchecked);
0172     m_cbAutoFossil->setCheckState(m_plugin->autoFossil() ? Qt::Checked : Qt::Unchecked);
0173     m_cbIndexEnabled->setCheckState(m_plugin->getIndexEnabled() ? Qt::Checked : Qt::Unchecked);
0174     m_indexPath->setUrl(m_plugin->getIndexDirectory());
0175     m_cbMultiProjectCompletion->setCheckState(m_plugin->multiProjectCompletion() ? Qt::Checked : Qt::Unchecked);
0176     m_cbMultiProjectGoto->setCheckState(m_plugin->multiProjectGoto() ? Qt::Checked : Qt::Unchecked);
0177 
0178     m_cmbSingleClick->setCurrentIndex((int)m_plugin->singleClickAcion());
0179     m_cmbDoubleClick->setCurrentIndex((int)m_plugin->doubleClickAcion());
0180 
0181     m_cbSessionRestoreOpenProjects->setCheckState(m_plugin->restoreProjectsForSession() ? Qt::Checked : Qt::Unchecked);
0182 
0183     m_changed = false;
0184 }
0185 
0186 void KateProjectConfigPage::defaults()
0187 {
0188     reset();
0189 }
0190 
0191 void KateProjectConfigPage::slotMyChanged()
0192 {
0193     m_changed = true;
0194     Q_EMIT changed();
0195 }
0196 
0197 #include "moc_kateprojectconfigpage.cpp"