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