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"