File indexing completed on 2025-03-09 05:20:55

0001 /*
0002     This file is part of the Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2009 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #ifndef KASTEN_MULTIVIEWAREAS_P_HPP
0010 #define KASTEN_MULTIVIEWAREAS_P_HPP
0011 
0012 // lib
0013 #include "abstractgroupedviews_p.hpp"
0014 #include "multiviewareas.hpp"
0015 #include "tabbedviews.hpp"
0016 // Qt
0017 #include <QSplitter>
0018 // Std
0019 #include <utility>
0020 
0021 class QDragMoveEvent;
0022 class QDropEvent;
0023 
0024 namespace Kasten {
0025 
0026 class TabbedViews;
0027 
0028 class MultiViewAreasPrivate : public AbstractGroupedViewsPrivate
0029 {
0030 public:
0031     explicit MultiViewAreasPrivate(MultiViewAreas* parent);
0032 
0033     ~MultiViewAreasPrivate() override;
0034 
0035 public:
0036     void init();
0037 
0038 public: // AbstractViewArea API
0039     void setFocus();
0040     QWidget* widget() const;
0041     bool hasFocus() const;
0042 
0043 public: // AbstractGroupedViews API
0044     void addViews(const QVector<AbstractView*>& views);
0045     void removeViews(const QVector<AbstractView*>& views);
0046     void setViewFocus(AbstractView* view);
0047 
0048     QVector<AbstractView*> viewList() const;
0049     int viewCount() const;
0050     AbstractView* viewFocus() const;
0051 
0052 public: // If::ToolInlineViewable API
0053     void setCurrentToolInlineView(AbstractToolInlineView* view);
0054     AbstractToolInlineView* currentToolInlineView() const;
0055 
0056 public: // If::ViewAreaSplitable API
0057     AbstractViewArea* splitViewArea(AbstractViewArea* viewArea, Qt::Orientation orientation);
0058     void closeViewArea(AbstractViewArea* viewArea);
0059     void setViewAreaFocus(AbstractViewArea* viewArea);
0060     AbstractViewArea* viewAreaFocus() const;
0061     int viewAreasCount() const;
0062 
0063 private:
0064     int indexOf(AbstractView* view) const;
0065 
0066 private:  // slots
0067     void onViewsRemoved();
0068     void onViewAreaFocusChanged(bool hasFocus);
0069     void onContextMenuRequested(AbstractView* view, QPoint pos);
0070 
0071 private:
0072     Q_DECLARE_PUBLIC(MultiViewAreas)
0073 
0074 private:
0075     QVector<TabbedViews*> mViewAreaList;
0076     QSplitter* mMainSplitter;
0077 
0078     TabbedViews* mCurrentViewArea = nullptr;
0079     TabbedViews* mCurrentInlineToolViewArea = nullptr;
0080 };
0081 
0082 inline QWidget* MultiViewAreasPrivate::widget()                 const { return mMainSplitter; }
0083 inline bool MultiViewAreasPrivate::hasFocus()                   const { return mCurrentViewArea->hasFocus(); }
0084 inline AbstractView* MultiViewAreasPrivate::viewFocus()         const { return mCurrentViewArea->viewFocus(); }
0085 inline AbstractViewArea* MultiViewAreasPrivate::viewAreaFocus() const { return mCurrentViewArea; }
0086 inline int MultiViewAreasPrivate::viewAreasCount()              const { return mViewAreaList.size(); }
0087 
0088 inline QVector<AbstractView*> MultiViewAreasPrivate::viewList() const
0089 {
0090     QVector<AbstractView*> result;
0091 
0092     result.reserve(mViewAreaList.size());
0093     for (const TabbedViews* viewArea : mViewAreaList) {
0094         result.append(viewArea->viewList());
0095     }
0096 
0097     return result;
0098 }
0099 
0100 inline int MultiViewAreasPrivate::viewCount() const
0101 {
0102     int result = 0;
0103 
0104     for (const TabbedViews* viewArea : mViewAreaList) {
0105         result += viewArea->viewCount();
0106     }
0107 
0108     return result;
0109 }
0110 
0111 inline int MultiViewAreasPrivate::indexOf(AbstractView* view) const
0112 {
0113     int result = -1;
0114 
0115     int globalBaseIndex = 0;
0116     for (const TabbedViews* viewArea : mViewAreaList) {
0117         const int localIndexOf = viewArea->indexOf(view);
0118         if (localIndexOf != -1) {
0119             result = globalBaseIndex + localIndexOf;
0120             break;
0121         }
0122         globalBaseIndex += viewArea->viewCount();
0123     }
0124 
0125     return result;
0126 }
0127 
0128 inline void MultiViewAreasPrivate::setFocus()
0129 {
0130     mCurrentViewArea->setFocus();
0131 }
0132 
0133 inline void MultiViewAreasPrivate::addViews(const QVector<AbstractView*>& views)
0134 {
0135     Q_Q(MultiViewAreas);
0136 
0137     mCurrentViewArea->addViews(views);
0138 
0139     Q_EMIT q->added(views);
0140 }
0141 
0142 inline void MultiViewAreasPrivate::removeViews(const QVector<AbstractView*>& views)
0143 {
0144     Q_Q(MultiViewAreas);
0145 
0146     // TODO: possible to just send the views of the given area?
0147     for (TabbedViews* viewArea : std::as_const(mViewAreaList)) {
0148         viewArea->removeViews(views);
0149     }
0150 
0151     // TODO: above might trigger removal of areas before, is this a problem?
0152     Q_EMIT q->removing(views);
0153 }
0154 
0155 inline void MultiViewAreasPrivate::setCurrentToolInlineView(AbstractToolInlineView* view)
0156 {
0157     if (mCurrentInlineToolViewArea && mCurrentInlineToolViewArea != mCurrentViewArea) {
0158         mCurrentInlineToolViewArea->setCurrentToolInlineView(nullptr);
0159     }
0160 
0161     mCurrentInlineToolViewArea = mCurrentViewArea;
0162 
0163     mCurrentViewArea->setCurrentToolInlineView(view);
0164 }
0165 
0166 inline AbstractToolInlineView* MultiViewAreasPrivate::currentToolInlineView() const
0167 {
0168     return mCurrentInlineToolViewArea->currentToolInlineView();
0169 }
0170 
0171 inline void MultiViewAreasPrivate::setViewFocus(AbstractView* view)
0172 {
0173     // TODO: makes this more efficient!
0174     for (TabbedViews* viewArea : std::as_const(mViewAreaList)) {
0175         const int localIndex = viewArea->indexOf(view);
0176         if (localIndex != -1) {
0177             viewArea->setViewFocus(view);
0178             break;
0179         }
0180     }
0181 }
0182 
0183 // TODO: this method could be removed, as it is the same as _viewArea->setFocus(), or?
0184 inline void MultiViewAreasPrivate::setViewAreaFocus(AbstractViewArea* _viewArea)
0185 {
0186     auto* viewArea = static_cast<TabbedViews*>(_viewArea);
0187     if (viewArea == mCurrentViewArea) {
0188         return;
0189     }
0190 
0191     if (mViewAreaList.contains(viewArea)) {
0192         viewArea->setFocus();
0193     }
0194 }
0195 
0196 inline void MultiViewAreasPrivate::closeViewArea(AbstractViewArea* _viewArea)
0197 {
0198     Q_Q(MultiViewAreas);
0199 
0200     auto* viewArea = static_cast<TabbedViews*>(_viewArea);
0201 
0202     const QVector<AbstractView*> views = viewArea->viewList();
0203 
0204     Q_EMIT q->closeRequest(views);
0205 }
0206 
0207 }
0208 
0209 #endif