File indexing completed on 2024-04-28 03:51:21
0001 /*. 0002 SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "worldbrowser.h" 0008 0009 #include "worldmodel.h" 0010 #include <stepcore/world.h> 0011 0012 #include <QApplication> 0013 #include <QContextMenuEvent> 0014 #include <QHeaderView> 0015 #include <QKeyEvent> 0016 #include <QMenu> 0017 #include <QTreeView> 0018 0019 #include <KLocalizedString> 0020 0021 class WorldBrowserView: public QTreeView 0022 { 0023 public: 0024 WorldBrowserView(QWidget* parent = nullptr); 0025 void reset() override; 0026 0027 protected: 0028 void changeEvent(QEvent* event) override; 0029 void drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const override; 0030 void keyPressEvent(QKeyEvent* e) override; 0031 void contextMenuEvent(QContextMenuEvent* event) override; 0032 WorldModel* worldModel() { return static_cast<WorldModel*>(model()); } 0033 const int _windowsDecoSize; 0034 bool _macStyle; 0035 }; 0036 0037 WorldBrowserView::WorldBrowserView(QWidget* parent) 0038 : QTreeView(parent), _windowsDecoSize(9) 0039 { 0040 _macStyle = QApplication::style()->inherits("QMacStyle"); 0041 } 0042 0043 void WorldBrowserView::changeEvent(QEvent* event) 0044 { 0045 if(event->type() == QEvent::StyleChange) 0046 _macStyle = QApplication::style()->inherits("QMacStyle"); 0047 } 0048 0049 WorldBrowser::WorldBrowser(WorldModel* worldModel, QWidget* parent) 0050 : QDockWidget(i18nc("Object list", "World"), parent) 0051 { 0052 _worldBrowserView = new WorldBrowserView(this); 0053 _worldBrowserView->header()->hide(); 0054 _worldBrowserView->setAllColumnsShowFocus(true); 0055 _worldBrowserView->setRootIsDecorated(false); 0056 _worldBrowserView->setModel(worldModel); 0057 _worldBrowserView->setSelectionModel(worldModel->selectionModel()); 0058 _worldBrowserView->setSelectionMode(QAbstractItemView::ExtendedSelection); // XXX 0059 setWidget(_worldBrowserView); 0060 } 0061 0062 void WorldBrowserView::reset() 0063 { 0064 QTreeView::reset(); 0065 expand(worldModel()->worldIndex()); 0066 } 0067 0068 void WorldBrowserView::keyPressEvent(QKeyEvent* e) 0069 { 0070 if(e->matches(QKeySequence::Delete)) { 0071 worldModel()->deleteSelectedItems(); 0072 e->accept(); 0073 } else QTreeView::keyPressEvent(e); 0074 } 0075 0076 void WorldBrowserView::contextMenuEvent(QContextMenuEvent* event) 0077 { 0078 QModelIndex index = indexAt(event->pos()); 0079 if(!index.isValid()) return; 0080 0081 event->accept(); 0082 QMenu* menu = worldModel()->createContextMenu(index); 0083 menu->exec(event->globalPos()); 0084 delete menu; 0085 } 0086 0087 void WorldBrowserView::drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const 0088 { 0089 // Inspired by qt-designer code in src/components/propertyeditor/qpropertyeditor.cpp 0090 if(!index.parent().isValid()) return; 0091 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0092 QStyleOptionViewItem opt; 0093 initViewItemOption(&opt); 0094 #else 0095 QStyleOptionViewItem opt = viewOptions(); 0096 #endif 0097 0098 if(model()->hasChildren(index)) { 0099 opt.state |= QStyle::State_Children; 0100 0101 QRect primitive(rect.left() + rect.width() - indentation(), rect.top(), 0102 indentation(), rect.height()); 0103 0104 if (!_macStyle) { 0105 primitive.moveLeft(primitive.left() + (primitive.width() - _windowsDecoSize)/2); 0106 primitive.moveTop(primitive.top() + (primitive.height() - _windowsDecoSize)/2); 0107 primitive.setWidth(_windowsDecoSize); 0108 primitive.setHeight(_windowsDecoSize); 0109 } 0110 0111 opt.rect = primitive; 0112 0113 if(isExpanded(index)) opt.state |= QStyle::State_Open; 0114 style()->drawPrimitive(QStyle::PE_IndicatorBranch, &opt, painter, this); 0115 } 0116 } 0117 0118 #include "moc_worldbrowser.cpp"