| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /****************************************************************************
- **
- ** Copyright (C) 2020 Uwe Kindler
- ** Contact: https://www.qt.io/licensing/
- **
- ** This file is part of Qt Creator.
- **
- ** Commercial License Usage
- ** Licensees holding valid commercial Qt licenses may use this file in
- ** accordance with the commercial license agreement provided with the
- ** Software or, alternatively, in accordance with the terms contained in
- ** a written agreement between you and The Qt Company. For licensing terms
- ** and conditions see https://www.qt.io/terms-conditions. For further
- ** information use the contact form at https://www.qt.io/contact-us.
- **
- ** GNU General Public License Usage
- ** Alternatively, this file may be used under the terms of the GNU
- ** General Public License version 3 as published by the Free Software
- ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
- ** included in the packaging of this file. Please review the following
- ** information to ensure the GNU General Public License requirements will
- ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
- **
- ****************************************************************************/
- #include "floatingwidgettitlebar.h"
- #include "ads_globals.h"
- #include "elidinglabel.h"
- #include "floatingdockcontainer.h"
- #include <QHBoxLayout>
- #include <QMouseEvent>
- #include <QPixmap>
- #include <QPushButton>
- #include <QStyle>
- #include <QToolButton>
- #include <iostream>
- namespace ADS {
- using TabLabelType = ElidingLabel;
- using tCloseButton = QPushButton;
- /**
- * @brief Private data class of public interface CFloatingWidgetTitleBar
- */
- struct FloatingWidgetTitleBarPrivate
- {
- FloatingWidgetTitleBar *q; ///< public interface class
- QLabel *m_iconLabel = nullptr;
- TabLabelType *m_titleLabel;
- tCloseButton *m_closeButton = nullptr;
- FloatingDockContainer *m_floatingWidget = nullptr;
- eDragState m_dragState = DraggingInactive;
- FloatingWidgetTitleBarPrivate(FloatingWidgetTitleBar *parent)
- : q(parent)
- {}
- /**
- * Creates the complete layout including all controls
- */
- void createLayout();
- };
- void FloatingWidgetTitleBarPrivate::createLayout()
- {
- m_titleLabel = new TabLabelType();
- m_titleLabel->setElideMode(Qt::ElideRight);
- m_titleLabel->setText("DockWidget->windowTitle()");
- m_titleLabel->setObjectName("floatingTitleLabel");
- m_titleLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
- m_closeButton = new tCloseButton();
- m_closeButton->setObjectName("floatingTitleCloseButton");
- m_closeButton->setFlat(true);
- // The standard icons do does not look good on high DPI screens
- QIcon closeIcon;
- QPixmap normalPixmap = q->style()->standardPixmap(QStyle::SP_TitleBarCloseButton,
- nullptr,
- m_closeButton);
- closeIcon.addPixmap(normalPixmap, QIcon::Normal);
- closeIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
- m_closeButton->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarCloseButton));
- m_closeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
- m_closeButton->setVisible(true);
- m_closeButton->setFocusPolicy(Qt::NoFocus);
- q->connect(m_closeButton, &QPushButton::clicked, q, &FloatingWidgetTitleBar::closeRequested);
- QFontMetrics fontMetrics(m_titleLabel->font());
- int spacing = qRound(fontMetrics.height() / 4.0);
- // Fill the layout
- QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight);
- layout->setContentsMargins(6, 0, 0, 0);
- layout->setSpacing(0);
- q->setLayout(layout);
- layout->addWidget(m_titleLabel, 1);
- layout->addSpacing(spacing);
- layout->addWidget(m_closeButton);
- layout->setAlignment(Qt::AlignCenter);
- m_titleLabel->setVisible(true);
- }
- FloatingWidgetTitleBar::FloatingWidgetTitleBar(FloatingDockContainer *parent)
- : QWidget(parent)
- , d(new FloatingWidgetTitleBarPrivate(this))
- {
- d->m_floatingWidget = parent;
- d->createLayout();
- }
- FloatingWidgetTitleBar::~FloatingWidgetTitleBar()
- {
- delete d;
- }
- void FloatingWidgetTitleBar::mousePressEvent(QMouseEvent *event)
- {
- if (event->button() == Qt::LeftButton) {
- d->m_dragState = DraggingFloatingWidget;
- d->m_floatingWidget->startDragging(event->pos(), d->m_floatingWidget->size(), this);
- return;
- }
- Super::mousePressEvent(event);
- }
- void FloatingWidgetTitleBar::mouseReleaseEvent(QMouseEvent *event)
- {
- d->m_dragState = DraggingInactive;
- if (d->m_floatingWidget) {
- d->m_floatingWidget->finishDragging();
- }
- Super::mouseReleaseEvent(event);
- }
- void FloatingWidgetTitleBar::mouseMoveEvent(QMouseEvent *event)
- {
- if (!(event->buttons() & Qt::LeftButton) || DraggingInactive == d->m_dragState) {
- d->m_dragState = DraggingInactive;
- Super::mouseMoveEvent(event);
- return;
- }
- // move floating window
- if (DraggingFloatingWidget == d->m_dragState) {
- d->m_floatingWidget->moveFloating();
- Super::mouseMoveEvent(event);
- return;
- }
- Super::mouseMoveEvent(event);
- }
- void FloatingWidgetTitleBar::enableCloseButton(bool enable)
- {
- d->m_closeButton->setEnabled(enable);
- }
- void FloatingWidgetTitleBar::setTitle(const QString &text)
- {
- d->m_titleLabel->setText(text);
- }
- } // namespace ADS
|