File indexing completed on 2024-04-28 05:40:47

0001 /*
0002     SPDX-FileCopyrightText: 2011 Vishesh Yadav <vishesh3y@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "ignorewidget.h"
0008 #include "../hgwrapper.h"
0009 
0010 #include <QListWidget>
0011 #include <QVBoxLayout>
0012 #include <QHBoxLayout>
0013 #include <QInputDialog>
0014 #include <QString>
0015 #include <QFile>
0016 #include <QList>
0017 #include <QTextStream>
0018 #include <QPushButton>
0019 #include <QUrl>
0020 #include <KLocalizedString>
0021 #include <KMessageBox>
0022 
0023 HgIgnoreWidget::HgIgnoreWidget(QWidget *parent) :
0024     QWidget(parent)
0025 {
0026     setupUI();
0027     loadConfig();
0028 }
0029 
0030 void HgIgnoreWidget::setupUI()
0031 {
0032     QVBoxLayout *sideBar = new QVBoxLayout;
0033     m_addFiles = new QPushButton(xi18nc("@label:button", "Add Files"));
0034     m_addPattern = new QPushButton(xi18nc("@label:button", "Add Pattern"));
0035     m_editEntry = new QPushButton(xi18nc("@label:button", "Edit Entry"));
0036     m_removeEntries = new QPushButton(xi18nc("@label:button", "Remove Entries"));
0037     sideBar->addWidget(m_addFiles);
0038     sideBar->addWidget(m_addPattern);
0039     sideBar->addWidget(m_editEntry);
0040     sideBar->addWidget(m_removeEntries);
0041     sideBar->addStretch();
0042 
0043     m_ignoreTable = new QListWidget;
0044     m_untrackedList = new QListWidget;
0045     setupUntrackedList();
0046 
0047     m_ignoreTable->setSelectionMode(QListWidget::ExtendedSelection);
0048     m_untrackedList->setSelectionMode(QListWidget::ExtendedSelection);
0049 
0050     QHBoxLayout *mainLayout = new QHBoxLayout;
0051     mainLayout->addWidget(m_untrackedList);
0052     mainLayout->addWidget(m_ignoreTable);
0053     mainLayout->addLayout(sideBar);
0054     setLayout(mainLayout);
0055 
0056     connect(m_addFiles, SIGNAL(clicked()), this, SLOT(slotAddFiles()));
0057     connect(m_removeEntries, SIGNAL(clicked()), this, SLOT(slotRemoveEntries()));
0058     connect(m_addPattern, SIGNAL(clicked()), this, SLOT(slotAddPattern()));
0059     connect(m_editEntry, SIGNAL(clicked()), this, SLOT(slotEditEntry()));
0060 }
0061 
0062 void HgIgnoreWidget::setupUntrackedList()
0063 {
0064     HgWrapper *hgw = HgWrapper::instance();
0065     QStringList args;
0066     args << QStringLiteral("--unknown");
0067     QString output;
0068     hgw->executeCommand(QStringLiteral("status"), args, output);
0069     
0070     const QStringList result = output.split(QLatin1Char('\n'), Qt::SkipEmptyParts);
0071     for (const QString &file : result) {
0072         m_untrackedList->addItem(file.mid(2));
0073     }
0074 }
0075 
0076 void HgIgnoreWidget::loadConfig()
0077 {
0078     QFile file(HgWrapper::instance()->getBaseDir() + QLatin1String("/.hgignore"));
0079     if (!file.open(QFile::ReadOnly)) {
0080         return;
0081     }
0082     
0083     QTextStream fileStream(&file);
0084 
0085     do {
0086         QString buffer;
0087         buffer = fileStream.readLine();
0088         if (!buffer.isEmpty()) {
0089             m_ignoreTable->addItem(buffer);
0090         }
0091     } while (!fileStream.atEnd());
0092 
0093     file.close();
0094 }
0095 
0096 void HgIgnoreWidget::saveConfig()
0097 {
0098     QFile file(HgWrapper::instance()->getBaseDir() + QLatin1String("/.hgignore"));
0099     if (!file.open(QFile::WriteOnly | QFile::Truncate)) {
0100         return;
0101     }
0102     
0103     QTextStream fileStream(&file);
0104     int count = m_ignoreTable->count();
0105     for (int i=0; i<count; i++) {
0106         QListWidgetItem *item = m_ignoreTable->item(i);
0107         fileStream << item->text() << QLatin1String("\n");
0108     }
0109 
0110     file.close();
0111 }
0112 
0113 void HgIgnoreWidget::slotAddFiles()
0114 {
0115     const QList<QListWidgetItem*> selectedItems = m_untrackedList->selectedItems();
0116     for (QListWidgetItem *item : selectedItems) {
0117         m_ignoreTable->addItem(item->text());
0118         m_untrackedList->takeItem(m_untrackedList->row(item));
0119     }
0120 }
0121 
0122 void HgIgnoreWidget::slotAddPattern()
0123 {
0124     bool ok;
0125     QString input = QInputDialog::getText(this, 
0126                         xi18nc("@title:dialog", "Add Pattern"),
0127                         QString(),
0128                         QLineEdit::Normal,
0129                         QString(),
0130                         &ok);
0131     if (ok && !input.isEmpty()) {
0132         m_ignoreTable->addItem(input);
0133     }
0134 }
0135 
0136 void HgIgnoreWidget::slotRemoveEntries()
0137 {
0138     const QList<QListWidgetItem*> selectedItems = m_ignoreTable->selectedItems();
0139     for (QListWidgetItem *item : selectedItems) {
0140         m_ignoreTable->takeItem(m_ignoreTable->row(item));
0141     }
0142 }
0143 void HgIgnoreWidget::slotEditEntry()
0144 {
0145     if (m_ignoreTable->currentItem() == nullptr) {
0146         KMessageBox::error(this, xi18nc("@message:error",
0147                     "No entry selected for edit!"));
0148         return;
0149     }
0150 
0151     bool ok;
0152     QString input = QInputDialog::getText(this, 
0153                         xi18nc("@title:dialog", "Edit Pattern"),
0154                         QString(),
0155                         QLineEdit::Normal,
0156                         m_ignoreTable->currentItem()->text(),
0157                         &ok);
0158     if (ok && !input.isEmpty()) {
0159         m_ignoreTable->currentItem()->setText(input);
0160     }
0161 }
0162 
0163 
0164 
0165 
0166 #include "moc_ignorewidget.cpp"