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

0001 /*
0002     SPDX-FileCopyrightText: 2002 Shie Erlich <erlich@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2002 Rafi Yanai <yanai@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "kraddbookmarkdlg.h"
0010 #include "../icon.h"
0011 #include "../krglobal.h"
0012 #include "krbookmarkhandler.h"
0013 
0014 // QtWidgets
0015 #include <QDialogButtonBox>
0016 #include <QGridLayout>
0017 #include <QHeaderView>
0018 #include <QInputDialog>
0019 #include <QLabel>
0020 #include <QPushButton>
0021 
0022 #include <KI18n/KLocalizedString>
0023 
0024 KrAddBookmarkDlg::KrAddBookmarkDlg(QWidget *parent, const QUrl &url)
0025     : QDialog(parent)
0026 {
0027     setWindowModality(Qt::WindowModal);
0028     setWindowTitle(i18n("Add Bookmark"));
0029 
0030     auto *mainLayout = new QVBoxLayout;
0031     setLayout(mainLayout);
0032 
0033     auto *layout = new QGridLayout; // expanding
0034     // name and url
0035     QLabel *lb1 = new QLabel(i18n("Name:"), this);
0036     _name = new KLineEdit(this);
0037     _name->setText(url.toDisplayString()); // default name is the url
0038     _name->selectAll(); // make the text selected
0039     layout->addWidget(lb1, 0, 0);
0040     layout->addWidget(_name, 0, 1);
0041 
0042     QLabel *lb2 = new QLabel(i18n("URL:"), this);
0043     _url = new KLineEdit(this);
0044     layout->addWidget(lb2, 1, 0);
0045     layout->addWidget(_url, 1, 1);
0046     _url->setText(url.toDisplayString()); // set the url in the field
0047 
0048     // create in linedit and button
0049     QLabel *lb3 = new QLabel(i18n("Create in:"), this);
0050     _folder = new KLineEdit(this);
0051     layout->addWidget(lb3, 2, 0);
0052     layout->addWidget(_folder, 2, 1);
0053     _folder->setReadOnly(true);
0054 
0055     _createInBtn = new QToolButton(this);
0056     _createInBtn->setIcon(Icon("go-down"));
0057     _createInBtn->setCheckable(true);
0058     connect(_createInBtn, &QToolButton::toggled, this, &KrAddBookmarkDlg::toggleCreateIn);
0059     layout->addWidget(_createInBtn, 2, 2);
0060 
0061     mainLayout->addLayout(layout);
0062 
0063     detailsWidget = createInWidget();
0064     detailsWidget->setVisible(false);
0065     mainLayout->addWidget(detailsWidget);
0066 
0067     QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0068     mainLayout->addWidget(buttonBox);
0069 
0070     QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
0071     okButton->setDefault(true);
0072     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0073     newFolderButton = new QPushButton(i18n("New Folder"));
0074     buttonBox->addButton(newFolderButton, QDialogButtonBox::ActionRole);
0075     newFolderButton->setVisible(false); // hide it until _createIn is shown
0076     connect(newFolderButton, &QPushButton::clicked, this, &KrAddBookmarkDlg::newFolder);
0077 
0078     connect(buttonBox, &QDialogButtonBox::accepted, this, &KrAddBookmarkDlg::accept);
0079     connect(buttonBox, &QDialogButtonBox::rejected, this, &KrAddBookmarkDlg::reject);
0080 
0081     _name->setFocus();
0082     resize(sizeHint().width() * 2, sizeHint().height());
0083 }
0084 
0085 void KrAddBookmarkDlg::toggleCreateIn(bool show)
0086 {
0087     _createInBtn->setIcon(Icon(show ? "go-up" : "go-down"));
0088     newFolderButton->setVisible(show);
0089     detailsWidget->setVisible(show);
0090 }
0091 
0092 // creates the widget that lets you decide where to put the new bookmark
0093 QWidget *KrAddBookmarkDlg::createInWidget()
0094 {
0095     _createIn = new KrTreeWidget(this);
0096     _createIn->setHeaderLabel(i18n("Folders"));
0097     _createIn->header()->hide();
0098     _createIn->setRootIsDecorated(true);
0099     _createIn->setAlternatingRowColors(false); // disable alternate coloring
0100 
0101     auto *item = new QTreeWidgetItem(_createIn);
0102     item->setText(0, i18n("Bookmarks"));
0103     _createIn->expandItem(item);
0104     item->setSelected(true);
0105     _xr[item] = krBookMan->_root;
0106 
0107     populateCreateInWidget(krBookMan->_root, item);
0108     _createIn->setCurrentItem(item);
0109     slotSelectionChanged();
0110     connect(_createIn, &KrTreeWidget::itemSelectionChanged, this, &KrAddBookmarkDlg::slotSelectionChanged);
0111 
0112     return _createIn;
0113 }
0114 
0115 void KrAddBookmarkDlg::slotSelectionChanged()
0116 {
0117     QList<QTreeWidgetItem *> items = _createIn->selectedItems();
0118 
0119     if (items.count() > 0) {
0120         _folder->setText(_xr[items[0]]->text());
0121     }
0122 }
0123 
0124 void KrAddBookmarkDlg::populateCreateInWidget(KrBookmark *root, QTreeWidgetItem *parent)
0125 {
0126     QListIterator<KrBookmark *> it(root->children());
0127     while (it.hasNext()) {
0128         KrBookmark *bm = it.next();
0129         if (bm->isFolder()) {
0130             auto *item = new QTreeWidgetItem(parent);
0131             item->setText(0, bm->text());
0132             item->treeWidget()->expandItem(item);
0133             _xr[item] = bm;
0134             populateCreateInWidget(bm, item);
0135         }
0136     }
0137 }
0138 
0139 void KrAddBookmarkDlg::newFolder()
0140 {
0141     // get the name
0142     QString newFolder = QInputDialog::getText(this, i18n("New Folder"), i18n("Folder name:"));
0143     if (newFolder.isEmpty()) {
0144         return;
0145     }
0146 
0147     QList<QTreeWidgetItem *> items = _createIn->selectedItems();
0148     if (items.count() == 0)
0149         return;
0150 
0151     // add to the list in bookman
0152     KrBookmark *bm = new KrBookmark(newFolder);
0153 
0154     krBookMan->addBookmark(bm, _xr[items[0]]);
0155     // fix the gui
0156     auto *item = new QTreeWidgetItem(items[0]);
0157     item->setText(0, bm->text());
0158     _xr[item] = bm;
0159 
0160     _createIn->setCurrentItem(item);
0161     item->setSelected(true);
0162 }
0163 
0164 KrBookmark *KrAddBookmarkDlg::folder() const
0165 {
0166     QList<QTreeWidgetItem *> items = _createIn->selectedItems();
0167     if (items.count() == 0)
0168         return nullptr;
0169 
0170     return _xr[items[0]];
0171 }