File indexing completed on 2025-04-27 03:58:31

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2005-03-22
0007  * Description : a widget to manage sidebar in GUI - Multi-tab bar frame implementation.
0008  *
0009  * SPDX-FileCopyrightText: 2005-2006 by Joern Ahrens <joern dot ahrens at kdemail dot net>
0010  * SPDX-FileCopyrightText: 2006-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  * SPDX-FileCopyrightText: 2008-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
0012  * SPDX-FileCopyrightText: 2001-2003 by Joseph Wenninger <jowenn at kde dot org>
0013  *
0014  * SPDX-License-Identifier: GPL-2.0-or-later
0015  *
0016  * ============================================================ */
0017 
0018 #include "sidebar_p.h"
0019 
0020 namespace Digikam
0021 {
0022 
0023 DMultiTabBarFrame::DMultiTabBarFrame(QWidget* const parent, Qt::Edge pos)
0024     : QFrame(parent),
0025       d     (new Private)
0026 {
0027     d->position = pos;
0028 
0029     if ((pos == Qt::LeftEdge) || (pos == Qt::RightEdge))
0030     {
0031         d->mainLayout = new QVBoxLayout(this);
0032     }
0033     else
0034     {
0035         d->mainLayout = new QHBoxLayout(this);
0036     }
0037 
0038     d->mainLayout->setContentsMargins(QMargins());
0039     d->mainLayout->setSpacing(0);
0040     d->mainLayout->addStretch();
0041     setFrameStyle(NoFrame);
0042     setBackgroundRole(QPalette::Window);
0043 }
0044 
0045 DMultiTabBarFrame::~DMultiTabBarFrame()
0046 {
0047     qDeleteAll(d->tabs);
0048     d->tabs.clear();
0049     delete d;
0050 }
0051 
0052 void DMultiTabBarFrame::setStyle(DMultiTabBar::TextStyle style)
0053 {
0054     d->style = style;
0055 
0056     for (int i = 0 ; i < d->tabs.count() ; ++i)
0057     {
0058         d->tabs.at(i)->setStyle(d->style);
0059     }
0060 
0061     updateGeometry();
0062 }
0063 
0064 void DMultiTabBarFrame::contentsMousePressEvent(QMouseEvent* e)
0065 {
0066     e->ignore();
0067 }
0068 
0069 void DMultiTabBarFrame::mousePressEvent(QMouseEvent* e)
0070 {
0071     e->ignore();
0072 }
0073 
0074 DMultiTabBarTab* DMultiTabBarFrame::tab(int id) const
0075 {
0076     QListIterator<DMultiTabBarTab*> it(d->tabs);
0077 
0078     while (it.hasNext())
0079     {
0080         DMultiTabBarTab* const tab = it.next();
0081 
0082         if (tab->id() == id)
0083         {
0084             return tab;
0085         }
0086     }
0087 
0088     return nullptr;
0089 }
0090 
0091 void DMultiTabBarFrame::appendTab(const QIcon& pic, int id, const QString& text)
0092 {
0093     DMultiTabBarTab* const tab = new DMultiTabBarTab(pic, text, id, this, d->position, d->style);
0094     d->tabs.append(tab);
0095 
0096     // Insert before the stretch.
0097 
0098     d->mainLayout->insertWidget(d->tabs.size()-1, tab);
0099     tab->show();
0100 }
0101 
0102 void DMultiTabBarFrame::removeTab(int id)
0103 {
0104     for (int pos = 0 ; pos < d->tabs.count() ; ++pos)
0105     {
0106         if (d->tabs.at(pos)->id() == id)
0107         {
0108             // remove & delete the tab
0109 
0110             delete d->tabs.takeAt(pos);
0111             break;
0112         }
0113     }
0114 }
0115 
0116 void DMultiTabBarFrame::setPosition(Qt::Edge pos)
0117 {
0118     d->position = pos;
0119 
0120     for (int i = 0 ; i < d->tabs.count() ; ++i)
0121     {
0122         d->tabs.at(i)->setPosition(d->position);
0123     }
0124 
0125     updateGeometry();
0126 }
0127 
0128 QList<DMultiTabBarTab*>* DMultiTabBarFrame::tabs()
0129 {
0130     return &d->tabs;
0131 }
0132 
0133 } // namespace Digikam