File indexing completed on 2024-05-12 04:38:23

0001 /*
0002     SPDX-FileCopyrightText: David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "workingsettoolbutton.h"
0008 
0009 #include <QContextMenuEvent>
0010 
0011 #include <sublime/mainwindow.h>
0012 #include <sublime/area.h>
0013 
0014 #include "core.h"
0015 #include "mainwindow.h"
0016 #include "workingset.h"
0017 #include "workingsetcontroller.h"
0018 #include "workingsethelpers.h"
0019 #include "documentcontroller.h"
0020 
0021 #include <interfaces/idocumentcontroller.h>
0022 #include <util/activetooltip.h>
0023 
0024 using namespace KDevelop;
0025 
0026 WorkingSetToolButton::WorkingSetToolButton(QWidget* parent, WorkingSet* set)
0027     : QToolButton(parent), m_set(set), m_toolTipEnabled(true)
0028 {
0029     setFocusPolicy(Qt::NoFocus);
0030     setWorkingSet(set);
0031     setAutoRaise(true);
0032 
0033     connect(this, &WorkingSetToolButton::clicked, this, &WorkingSetToolButton::buttonTriggered);
0034 }
0035 
0036 WorkingSet* WorkingSetToolButton::workingSet() const
0037 {
0038     return m_set;
0039 }
0040 
0041 void WorkingSetToolButton::setWorkingSet(WorkingSet* set)
0042 {
0043     m_set = set;
0044 
0045     setIcon(set ? set->icon() : QIcon());
0046 }
0047 
0048 void WorkingSetToolButton::contextMenuEvent(QContextMenuEvent* ev)
0049 {
0050     showTooltip(ev->globalPos());
0051 
0052     ev->accept();
0053 }
0054 
0055 void WorkingSetToolButton::intersectSet()
0056 {
0057     Q_ASSERT(m_set);
0058 
0059     m_set->setPersistent(true);
0060 
0061     filterViews(Core::self()->workingSetControllerInternal()->workingSet(mainWindow()->area()->workingSet())->fileSet() & m_set->fileSet());
0062 }
0063 
0064 void WorkingSetToolButton::subtractSet()
0065 {
0066     Q_ASSERT(m_set);
0067 
0068     m_set->setPersistent(true);
0069 
0070     filterViews(Core::self()->workingSetControllerInternal()->workingSet(mainWindow()->area()->workingSet())->fileSet() - m_set->fileSet());
0071 }
0072 
0073 void WorkingSetToolButton::mergeSet()
0074 {
0075     Q_ASSERT(m_set);
0076 
0077     const QSet<QString> loadFiles = m_set->fileSet() - Core::self()->workingSetControllerInternal()->workingSet(mainWindow()->area()->workingSet())->fileSet();
0078     for (const QString& file : loadFiles) {
0079         Core::self()->documentController()->openDocument(QUrl::fromUserInput(file));
0080     }
0081 }
0082 
0083 void WorkingSetToolButton::duplicateSet()
0084 {
0085     Q_ASSERT(m_set);
0086 
0087     if(!Core::self()->documentControllerInternal()->saveAllDocumentsForWindow(mainWindow(), KDevelop::IDocument::Default, true))
0088         return;
0089     WorkingSet* set = Core::self()->workingSetControllerInternal()->newWorkingSet(QStringLiteral("clone"));
0090     set->setPersistent(true);
0091     set->saveFromArea(mainWindow()->area());
0092     mainWindow()->area()->setWorkingSet(set->id());
0093 }
0094 
0095 void WorkingSetToolButton::loadSet()
0096 {
0097     Q_ASSERT(m_set);
0098 
0099     m_set->setPersistent(true);
0100 
0101     if(!Core::self()->documentControllerInternal()->saveAllDocumentsForWindow(mainWindow(), KDevelop::IDocument::Default, true))
0102         return;
0103     mainWindow()->area()->setWorkingSet(QString(m_set->id()));
0104 }
0105 
0106 void WorkingSetToolButton::closeSet()
0107 {
0108     Q_ASSERT(m_set);
0109 
0110     m_set->setPersistent(true);
0111     m_set->saveFromArea(mainWindow()->area());
0112 
0113     if(!Core::self()->documentControllerInternal()->saveAllDocumentsForWindow(mainWindow(), KDevelop::IDocument::Default, true))
0114         return;
0115     mainWindow()->area()->setWorkingSet(QString());
0116 }
0117 
0118 bool WorkingSetToolButton::event(QEvent* e)
0119 {
0120     if(m_toolTipEnabled && e->type() == QEvent::ToolTip) {
0121         auto* helpEvent = static_cast<QHelpEvent*>(e);
0122         showTooltip(helpEvent->globalPos());
0123         e->accept();
0124         return true;
0125     }
0126 
0127     return QToolButton::event(e);
0128 }
0129 
0130 void WorkingSetToolButton::showTooltip(const QPoint& globalPos)
0131 {
0132     Q_ASSERT(m_set);
0133     static WorkingSetToolButton* oldTooltipButton;
0134 
0135     WorkingSetController* controller = Core::self()->workingSetControllerInternal();
0136 
0137     if(controller->tooltip() && oldTooltipButton == this)
0138         return;
0139 
0140     oldTooltipButton = this;
0141 
0142     controller->showToolTip(m_set, globalPos + QPoint(10, 20));
0143 
0144     QRect extended(parentWidget()->mapToGlobal(geometry().topLeft()),
0145                     parentWidget()->mapToGlobal(geometry().bottomRight()));
0146     controller->tooltip()->setHandleRect(extended);
0147 }
0148 
0149 void WorkingSetToolButton::buttonTriggered()
0150 {
0151     Q_ASSERT(m_set);
0152 
0153     if(mainWindow()->area()->workingSet() == m_set->id()) {
0154         showTooltip(QCursor::pos());
0155     }else{
0156         //Only close the working-set if the file was saved before
0157         if(!Core::self()->documentControllerInternal()->saveAllDocumentsForWindow(mainWindow(), KDevelop::IDocument::Default, true))
0158             return;
0159         m_set->setPersistent(true);
0160         mainWindow()->area()->setWorkingSet(m_set->id());
0161     }
0162 }
0163 
0164 #include "moc_workingsettoolbutton.cpp"