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"