File indexing completed on 2024-04-28 17:06:05

0001 /*
0002     SPDX-FileCopyrightText: 2004 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "profilemanager.h"
0009 
0010 // QtGui
0011 #include <QCursor>
0012 // QtWidgets
0013 #include <QInputDialog>
0014 #include <QMenu>
0015 
0016 #include <KConfigCore/KSharedConfig>
0017 #include <KI18n/KLocalizedString>
0018 
0019 #include "../icon.h"
0020 #include "../krglobal.h"
0021 
0022 ProfileManager::ProfileManager(const QString &profileType, QWidget *parent)
0023     : QPushButton(parent)
0024 {
0025     setText("");
0026     setIcon(Icon("user-identity"));
0027     setFixedWidth(16 + 15);
0028     setToolTip(i18n("Profiles"));
0029 
0030     this->profileType = profileType;
0031 
0032     connect(this, &ProfileManager::clicked, this, &ProfileManager::profilePopup);
0033 
0034     KConfigGroup group(krConfig, "Private");
0035     profileList = group.readEntry(profileType, QStringList());
0036 }
0037 
0038 void ProfileManager::profilePopup()
0039 {
0040     // profile menu identifiers
0041 #define ADD_NEW_ENTRY_ID 1000
0042 #define LOAD_ENTRY_ID 2000
0043 #define REMOVE_ENTRY_ID 3000
0044 #define OVERWRITE_ENTRY_ID 4000
0045 
0046     // create the menu
0047     QMenu popup, removePopup, overwritePopup;
0048     popup.setTitle(i18n("Profiles"));
0049 
0050     for (int i = 0; i != profileList.count(); i++) {
0051         KConfigGroup group(krConfig, profileType + " - " + profileList[i]);
0052         QString name = group.readEntry("Name");
0053         popup.addAction(name)->setData(QVariant((int)(LOAD_ENTRY_ID + i)));
0054         removePopup.addAction(name)->setData(QVariant((int)(REMOVE_ENTRY_ID + i)));
0055         overwritePopup.addAction(name)->setData(QVariant((int)(OVERWRITE_ENTRY_ID + i)));
0056     }
0057 
0058     popup.addSeparator();
0059 
0060     if (profileList.count()) {
0061         popup.addMenu(&removePopup)->setText(i18n("Remove entry"));
0062         popup.addMenu(&overwritePopup)->setText(i18n("Overwrite entry"));
0063     }
0064 
0065     popup.addAction(i18n("Add new entry"))->setData(QVariant((int)(ADD_NEW_ENTRY_ID)));
0066 
0067     int result = 0;
0068     QAction *res = popup.exec(QCursor::pos());
0069     if (res && res->data().canConvert<int>())
0070         result = res->data().toInt();
0071 
0072     // check out the user's selection
0073     if (result == ADD_NEW_ENTRY_ID)
0074         newProfile();
0075     else if (result >= LOAD_ENTRY_ID && result < LOAD_ENTRY_ID + profileList.count()) {
0076         emit loadFromProfile(profileType + " - " + profileList[result - LOAD_ENTRY_ID]);
0077     } else if (result >= REMOVE_ENTRY_ID && result < REMOVE_ENTRY_ID + profileList.count()) {
0078         krConfig->deleteGroup(profileType + " - " + profileList[result - REMOVE_ENTRY_ID]);
0079         profileList.removeAll(profileList[result - REMOVE_ENTRY_ID]);
0080 
0081         KConfigGroup group(krConfig, "Private");
0082         group.writeEntry(profileType, profileList);
0083         krConfig->sync();
0084     } else if (result >= OVERWRITE_ENTRY_ID && result < OVERWRITE_ENTRY_ID + profileList.count()) {
0085         emit saveToProfile(profileType + " - " + profileList[result - OVERWRITE_ENTRY_ID]);
0086     }
0087 }
0088 
0089 void ProfileManager::newProfile(const QString &defaultName)
0090 {
0091     QString profile = QInputDialog::getText(this, i18n("Krusader::ProfileManager"), i18n("Enter the profile name:"), QLineEdit::Normal, defaultName);
0092     if (!profile.isEmpty()) {
0093         int profileNum = 1;
0094         while (profileList.contains(QString("%1").arg(profileNum)))
0095             profileNum++;
0096 
0097         QString profileString = QString("%1").arg(profileNum);
0098         QString profileName = profileType + " - " + profileString;
0099         profileList.append(QString("%1").arg(profileString));
0100 
0101         KConfigGroup group(krConfig, "Private");
0102         group.writeEntry(profileType, profileList);
0103 
0104         KConfigGroup pg(krConfig, profileName);
0105         pg.writeEntry("Name", profile);
0106         emit saveToProfile(profileName);
0107         krConfig->sync();
0108     }
0109 }
0110 
0111 void ProfileManager::deleteProfile(const QString &name)
0112 {
0113     for (int i = 0; i != profileList.count(); i++) {
0114         KConfigGroup group(krConfig, profileType + " - " + profileList[i]);
0115         QString currentName = group.readEntry("Name");
0116 
0117         if (name == currentName) {
0118             krConfig->deleteGroup(profileType + " - " + profileList[i]);
0119             profileList.removeAll(profileList[i]);
0120 
0121             KConfigGroup pg(krConfig, "Private");
0122             pg.writeEntry(profileType, profileList);
0123             krConfig->sync();
0124             return;
0125         }
0126     }
0127 }
0128 
0129 void ProfileManager::overwriteProfile(const QString &name)
0130 {
0131     for (int i = 0; i != profileList.count(); i++) {
0132         KConfigGroup group(krConfig, profileType + " - " + profileList[i]);
0133         QString currentName = group.readEntry("Name");
0134 
0135         if (name == currentName) {
0136             emit saveToProfile(profileType + " - " + profileList[i]);
0137             return;
0138         }
0139     }
0140 }
0141 
0142 bool ProfileManager::loadProfile(const QString &name)
0143 {
0144     for (int i = 0; i != profileList.count(); i++) {
0145         KConfigGroup group(krConfig, profileType + " - " + profileList[i]);
0146         QString currentName = group.readEntry("Name");
0147 
0148         if (name == currentName) {
0149             emit loadFromProfile(profileType + " - " + profileList[i]);
0150             return true;
0151         }
0152     }
0153     return false;
0154 }
0155 
0156 QStringList ProfileManager::availableProfiles(const QString &profileType)
0157 {
0158     KConfigGroup group(krConfig, "Private");
0159     QStringList profiles = group.readEntry(profileType, QStringList());
0160     QStringList profileNames;
0161 
0162     for (int i = 0; i != profiles.count(); i++) {
0163         KConfigGroup pg(krConfig, profileType + " - " + profiles[i]);
0164         profileNames.append(pg.readEntry("Name"));
0165     }
0166 
0167     return profileNames;
0168 }