Compare commits
44 Commits
4.2.1
...
improved_t
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
224676836d | ||
|
|
f2378636e2 | ||
|
|
509b2356d1 | ||
|
|
30b802bd10 | ||
|
|
e857421fdf | ||
|
|
8dcdc8fad2 | ||
|
|
f964ce2c68 | ||
|
|
eb9b439d11 | ||
|
|
a13ed7e4d6 | ||
|
|
8cfa5c8e0e | ||
|
|
2878559ee6 | ||
|
|
6ff39bccf8 | ||
|
|
952131a1e9 | ||
|
|
5edbcc1970 | ||
|
|
04f6d9168e | ||
|
|
cea1327dac | ||
|
|
1c41cbff82 | ||
|
|
06e8451fc0 | ||
|
|
3ff6918b1f | ||
|
|
ac3af4c6cd | ||
|
|
41bb861417 | ||
|
|
6e63418798 | ||
|
|
65781b7cac | ||
|
|
d7e6c613c6 | ||
|
|
8da0713bf0 | ||
|
|
08da925fde | ||
|
|
fb58c435ef | ||
|
|
6bf593ef4b | ||
|
|
6b3b7750cb | ||
|
|
541db8e214 | ||
|
|
644c828f00 | ||
|
|
ed6636ae26 | ||
|
|
1a543e946d | ||
|
|
9bdefd6055 | ||
|
|
8fd691968c | ||
|
|
7abc698d09 | ||
|
|
5b23248fb8 | ||
|
|
46a5cee9c9 | ||
|
|
6c2c9888be | ||
|
|
44ff9e9956 | ||
|
|
f848df74c3 | ||
|
|
6c98c29855 | ||
|
|
c34d479d5c | ||
|
|
a7a97e6978 |
146
.clang-format
Normal file
146
.clang-format
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
---
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveMacros: None
|
||||||
|
AlignConsecutiveAssignments: None
|
||||||
|
AlignConsecutiveDeclarations: None
|
||||||
|
AlignEscapedNewlines: Right
|
||||||
|
AlignOperands: Align
|
||||||
|
AlignTrailingComments: true
|
||||||
|
|
||||||
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: InlineOnly
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLambdasOnASingleLine: Inline
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: Yes
|
||||||
|
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: true
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: Always
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: true
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
AfterExternBlock: true
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
SplitEmptyNamespace: false
|
||||||
|
|
||||||
|
BreakBeforeBinaryOperators: NonAssignment
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakBeforeTernaryOperators: false
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakInheritanceList: AfterColon
|
||||||
|
BreakStringLiterals: true
|
||||||
|
|
||||||
|
ColumnLimit: 82
|
||||||
|
CommentPragmas: '^(!.*|@c)'
|
||||||
|
|
||||||
|
CompactNamespaces: false
|
||||||
|
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
|
||||||
|
FixNamespaceComments: true
|
||||||
|
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<windows(\.h)?>' # windows headers
|
||||||
|
Priority: -1
|
||||||
|
- Regex: '^<labbcan[[:alnum:]._/]+' # labbcan headers
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<diag[[:alnum:]._/]+' # usl headers
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<usl[[:alnum:]._/]+' # usl headers
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<qt5compat[[:alnum:]._/]+' # qtlabb headers
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<qtcoreaddons[[:alnum:]._/]+' # qtlabb headers
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<qtlabb[[:alnum:]._/]+' # qtlabb headers
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '<Q[[:alnum:].]+>' # Qt headers
|
||||||
|
Priority: 3
|
||||||
|
- Regex: '^<sila_cpp[[:alnum:]._/]+' # sila_cpp headers
|
||||||
|
Priority: 4
|
||||||
|
- Regex: '<[[:alnum:]._/]+\.h>' # other headers
|
||||||
|
Priority: 5
|
||||||
|
- Regex: '<[[:alnum:]._/]+>' # system headers
|
||||||
|
Priority: 6
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 7
|
||||||
|
|
||||||
|
IncludeIsMainRegex: '(_p)?$'
|
||||||
|
|
||||||
|
IndentCaseBlocks: false
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
|
||||||
|
NamespaceIndentation: None
|
||||||
|
|
||||||
|
PenaltyBreakAssignment: 20
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 15
|
||||||
|
PenaltyBreakComment: 10
|
||||||
|
PenaltyBreakFirstLessLess: 5
|
||||||
|
# PenaltyBreakOpenParenthesis: 30
|
||||||
|
PenaltyBreakString: 150
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 100
|
||||||
|
PenaltyIndentedWhitespace: 0
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 150
|
||||||
|
|
||||||
|
PointerAlignment: Left
|
||||||
|
ReflowComments: true
|
||||||
|
|
||||||
|
SortIncludes: CaseSensitive
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInAngles: Never
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
|
||||||
|
Standard: c++17
|
||||||
|
|
||||||
|
StatementMacros: [ 'Q_UNUSED', 'PIMPL_D', 'PIMPL_Q', 'OD_ENTRY', 'OD_ENTRY_PROCIMG' ]
|
||||||
|
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -9,7 +9,7 @@ ui_*
|
|||||||
Makefile
|
Makefile
|
||||||
*.dll
|
*.dll
|
||||||
*.a
|
*.a
|
||||||
build-*
|
build*
|
||||||
|
|
||||||
# IDEs
|
# IDEs
|
||||||
.idea
|
.idea
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
if (POLICY CMP0091)
|
if (POLICY CMP0091)
|
||||||
cmake_policy(SET CMP0091 NEW)
|
cmake_policy(SET CMP0091 NEW)
|
||||||
endif (POLICY CMP0091)
|
endif (POLICY CMP0091)
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ The application can be compiled for macOS. A user reported, that the library wor
|
|||||||
[](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System)
|
[](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System)
|
||||||
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
||||||
|
|
||||||
Unfortunately, there is no such thing as a Linux operating system. Linux is a heterogeneous environment with a variety of different distributions. So it is not possible to support "Linux" like this is possible for Windows. It is only possible to support and test a small subset of Linux distributions. The library can be compiled for and has been developed and tested with the some Linux distributions. Depending on the used window manager or compositor, dock widgets
|
Unfortunately, there is no such thing as a Linux operating system. Linux is a heterogeneous environment with a variety of different distributions. So it is not possible to support "Linux" like it is possible for Windows. It is only possible to support and test a small subset of Linux distributions. The library can be compiled for and has been developed and tested with some Linux distributions. Depending on the used window manager or compositor, dock widgets
|
||||||
with native title bars are supported or not. If native title bars are not supported,
|
with native title bars are supported or not. If native title bars are not supported,
|
||||||
the library switches to `QWidget` based title bars.
|
the library switches to `QWidget` based title bars.
|
||||||
|
|
||||||
|
|||||||
@@ -75,18 +75,17 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "DockManager.h"
|
|
||||||
#include "DockWidget.h"
|
|
||||||
#include "DockAreaWidget.h"
|
|
||||||
#include "DockAreaTitleBar.h"
|
|
||||||
#include "DockAreaTabBar.h"
|
#include "DockAreaTabBar.h"
|
||||||
#include "FloatingDockContainer.h"
|
#include "DockAreaTitleBar.h"
|
||||||
|
#include "DockAreaWidget.h"
|
||||||
#include "DockComponentsFactory.h"
|
#include "DockComponentsFactory.h"
|
||||||
#include "StatusDialog.h"
|
#include "DockManager.h"
|
||||||
#include "DockSplitter.h"
|
#include "DockSplitter.h"
|
||||||
|
#include "DockWidget.h"
|
||||||
|
#include "FloatingDockContainer.h"
|
||||||
#include "ImageViewer.h"
|
#include "ImageViewer.h"
|
||||||
|
#include "MyDockAreaTitleBar.h"
|
||||||
|
#include "StatusDialog.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a random number from 0 to highest - 1
|
* Returns a random number from 0 to highest - 1
|
||||||
@@ -147,7 +146,7 @@ public:
|
|||||||
using Super = ads::CDockComponentsFactory;
|
using Super = ads::CDockComponentsFactory;
|
||||||
ads::CDockAreaTitleBar* createDockAreaTitleBar(ads::CDockAreaWidget* DockArea) const override
|
ads::CDockAreaTitleBar* createDockAreaTitleBar(ads::CDockAreaWidget* DockArea) const override
|
||||||
{
|
{
|
||||||
auto TitleBar = new ads::CDockAreaTitleBar(DockArea);
|
auto TitleBar = new MyDockAreaTitleBar(DockArea);
|
||||||
auto CustomButton = new QToolButton(DockArea);
|
auto CustomButton = new QToolButton(DockArea);
|
||||||
CustomButton->setToolTip(QObject::tr("Help"));
|
CustomButton->setToolTip(QObject::tr("Help"));
|
||||||
CustomButton->setIcon(svgIcon(":/adsdemo/images/help_outline.svg"));
|
CustomButton->setIcon(svgIcon(":/adsdemo/images/help_outline.svg"));
|
||||||
@@ -592,19 +591,29 @@ void MainWindowPrivate::createActions()
|
|||||||
ui.toolBar->addAction(ui.actionRestoreState);
|
ui.toolBar->addAction(ui.actionRestoreState);
|
||||||
ui.actionRestoreState->setIcon(svgIcon(":/adsdemo/images/restore.svg"));
|
ui.actionRestoreState->setIcon(svgIcon(":/adsdemo/images/restore.svg"));
|
||||||
|
|
||||||
SavePerspectiveAction = new QAction("Create Perspective", _this);
|
ui.toolBar->addSeparator();
|
||||||
SavePerspectiveAction->setIcon(svgIcon(":/adsdemo/images/picture_in_picture.svg"));
|
|
||||||
_this->connect(SavePerspectiveAction, SIGNAL(triggered()), SLOT(savePerspective()));
|
QAction* a = ui.toolBar->addAction("Lock Workspace");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/lock_outline.svg"));
|
||||||
|
a->setCheckable(true);
|
||||||
|
a->setChecked(false);
|
||||||
|
QObject::connect(a, &QAction::triggered, _this, &CMainWindow::lockWorkspace);
|
||||||
|
|
||||||
PerspectiveListAction = new QWidgetAction(_this);
|
PerspectiveListAction = new QWidgetAction(_this);
|
||||||
PerspectiveComboBox = new QComboBox(_this);
|
PerspectiveComboBox = new QComboBox(_this);
|
||||||
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||||
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
||||||
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
|
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
|
||||||
ui.toolBar->addSeparator();
|
|
||||||
ui.toolBar->addAction(PerspectiveListAction);
|
ui.toolBar->addAction(PerspectiveListAction);
|
||||||
|
|
||||||
|
a = SavePerspectiveAction = ui.toolBar->addAction("Create Perspective");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/picture_in_picture.svg"));
|
||||||
|
QObject::connect(a, &QAction::triggered, _this, &CMainWindow::savePerspective);
|
||||||
ui.toolBar->addAction(SavePerspectiveAction);
|
ui.toolBar->addAction(SavePerspectiveAction);
|
||||||
|
|
||||||
QAction* a = ui.toolBar->addAction("Create Floating Editor");
|
ui.toolBar->addSeparator();
|
||||||
|
|
||||||
|
a = ui.toolBar->addAction("Create Floating Editor");
|
||||||
a->setProperty("Floating", true);
|
a->setProperty("Floating", true);
|
||||||
a->setToolTip("Creates floating dynamic dockable editor windows that are deleted on close");
|
a->setToolTip("Creates floating dynamic dockable editor windows that are deleted on close");
|
||||||
a->setIcon(svgIcon(":/adsdemo/images/note_add.svg"));
|
a->setIcon(svgIcon(":/adsdemo/images/note_add.svg"));
|
||||||
@@ -626,6 +635,7 @@ void MainWindowPrivate::createActions()
|
|||||||
_this->connect(a, SIGNAL(triggered()), SLOT(createEditor()));
|
_this->connect(a, SIGNAL(triggered()), SLOT(createEditor()));
|
||||||
ui.menuTests->addAction(a);
|
ui.menuTests->addAction(a);
|
||||||
|
|
||||||
|
ui.toolBar->addSeparator();
|
||||||
a = ui.toolBar->addAction("Create Floating Table");
|
a = ui.toolBar->addAction("Create Floating Table");
|
||||||
a->setToolTip("Creates floating dynamic dockable table with millions of entries");
|
a->setToolTip("Creates floating dynamic dockable table with millions of entries");
|
||||||
a->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
|
a->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
|
||||||
@@ -1030,3 +1040,17 @@ void CMainWindow::createImageViewer()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::lockWorkspace(bool Value)
|
||||||
|
{
|
||||||
|
if (Value)
|
||||||
|
{
|
||||||
|
d->DockManager->lockDockWidgetFeaturesGlobally();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->DockManager->lockDockWidgetFeaturesGlobally(ads::CDockWidget::NoDockWidgetFeatures);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ private slots:
|
|||||||
void toggleDockWidgetWindowTitle();
|
void toggleDockWidgetWindowTitle();
|
||||||
void applyVsStyle();
|
void applyVsStyle();
|
||||||
void createImageViewer();
|
void createImageViewer();
|
||||||
|
void lockWorkspace(bool Value);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|||||||
34
demo/MyDockAreaTitleBar.h
Normal file
34
demo/MyDockAreaTitleBar.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// Created by fuga on 08 nov 2024.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef QTADS_MYDOCKAREATITLEBAR_H
|
||||||
|
#define QTADS_MYDOCKAREATITLEBAR_H
|
||||||
|
|
||||||
|
#include <DockAreaTitleBar.h>
|
||||||
|
|
||||||
|
class MyDockAreaTitleBar : public ads::CDockAreaTitleBar {
|
||||||
|
public:
|
||||||
|
explicit MyDockAreaTitleBar(ads::CDockAreaWidget* parent)
|
||||||
|
: CDockAreaTitleBar(parent)
|
||||||
|
{}
|
||||||
|
|
||||||
|
QMenu* buildContextMenu(QMenu*) override
|
||||||
|
{
|
||||||
|
auto menu = ads::CDockAreaTitleBar::buildContextMenu(nullptr);
|
||||||
|
menu->addSeparator();
|
||||||
|
auto action = menu->addAction(tr("Format HardDrive"));
|
||||||
|
|
||||||
|
connect(action, &QAction::triggered, this, [this](){
|
||||||
|
QMessageBox msgBox;
|
||||||
|
msgBox.setText("No, just kidding");
|
||||||
|
msgBox.setStandardButtons(QMessageBox::Abort);
|
||||||
|
msgBox.setDefaultButton(QMessageBox::Abort);
|
||||||
|
msgBox.exec();
|
||||||
|
});
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // QTADS_MYDOCKAREATITLEBAR_H
|
||||||
@@ -36,5 +36,8 @@
|
|||||||
<file>images/panorama.svg</file>
|
<file>images/panorama.svg</file>
|
||||||
<file>images/ads_icon2.svg</file>
|
<file>images/ads_icon2.svg</file>
|
||||||
<file>images/font_download.svg</file>
|
<file>images/font_download.svg</file>
|
||||||
|
<file>images/lock_outline.svg</file>
|
||||||
|
<file>images/lock.svg</file>
|
||||||
|
<file>images/lock_open.svg</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
6
demo/images/lock.svg
Normal file
6
demo/images/lock.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>lock icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M853.33,426.67v426.66c0,46.93 -38.4,85.34 -85.33,85.34h-512c-46.93,0 -85.33,-38.41 -85.33,-85.34v-426.66c0,-46.93 38.4,-85.34 85.33,-85.34h42.67v-85.33c0,-117.76 95.57,-213.33 213.33,-213.33c117.76,0 213.33,95.57 213.33,213.33v85.33h42.67c46.93,0 85.33,38.41 85.33,85.34zM644.27,256c0,-72.96 -59.31,-132.27 -132.27,-132.27c-72.96,0 -132.27,59.31 -132.27,132.27v85.33h264.54zM597.33,640c0,-46.93 -38.4,-85.33 -85.33,-85.33c-46.93,0 -85.33,38.4 -85.33,85.33c0,46.93 38.4,85.33 85.33,85.33c46.93,0 85.33,-38.4 85.33,-85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 932 B |
6
demo/images/lock_open.svg
Normal file
6
demo/images/lock_open.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>lock_open icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M853.33,426.67v426.66c0,46.93 -38.4,85.34 -85.33,85.34h-512c-46.93,0 -85.33,-38.41 -85.33,-85.34v-426.66c0,-46.93 38.4,-85.34 85.33,-85.34h388.27v-85.33c0,-72.96 -59.31,-132.27 -132.27,-132.27c-72.96,0 -132.27,59.31 -132.27,132.27h-81.06c0,-117.76 95.57,-213.33 213.33,-213.33c117.76,0 213.33,95.57 213.33,213.33v85.33h42.67c46.93,0 85.33,38.41 85.33,85.34zM768,426.67h-512v426.66h512zM426.67,640c0,-46.93 38.4,-85.33 85.33,-85.33c46.93,0 85.33,38.4 85.33,85.33c0,46.93 -38.4,85.33 -85.33,85.33c-46.93,0 -85.33,-38.4 -85.33,-85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 948 B |
6
demo/images/lock_outline.svg
Normal file
6
demo/images/lock_outline.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>lock_outline icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M853.33,426.67v426.66c0,46.93 -38.4,85.34 -85.33,85.34h-512c-46.93,0 -85.33,-38.41 -85.33,-85.34v-426.66c0,-46.93 38.4,-85.34 85.33,-85.34h42.67v-85.33c0,-117.76 95.57,-213.33 213.33,-213.33c117.76,0 213.33,95.57 213.33,213.33v85.33h42.67c46.93,0 85.33,38.41 85.33,85.34zM768,426.67h-512v426.66h512zM379.73,341.33h264.54v-85.33c0,-72.96 -59.31,-132.27 -132.27,-132.27c-72.96,0 -132.27,59.31 -132.27,132.27zM426.67,640c0,-46.93 38.4,-85.33 85.33,-85.33c46.93,0 85.33,38.4 85.33,85.33c0,46.93 -38.4,85.33 -85.33,85.33c-46.93,0 -85.33,-38.4 -85.33,-85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 972 B |
@@ -12,10 +12,10 @@ styles as much as possible.
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
### Docking everywhere - no central widget
|
### Docking everywhere - with or without a central widget
|
||||||
|
|
||||||
There is no central widget like in the Qt docking system. You can dock on every
|
The Advanced Docking System works with or without a central widget.
|
||||||
border of the main window or you can dock into each dock area - so you are
|
You can dock on every border of the main window or you can dock into each dock area - so you are
|
||||||
free to dock almost everywhere.
|
free to dock almost everywhere.
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
BIN
doc/cfg_flag_AutoHideOpenOnDragHover.gif
Normal file
BIN
doc/cfg_flag_AutoHideOpenOnDragHover.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 269 KiB |
@@ -49,6 +49,7 @@
|
|||||||
- [`AutoHideCloseButtonCollapsesDock`](#autohideclosebuttoncollapsesdock)
|
- [`AutoHideCloseButtonCollapsesDock`](#autohideclosebuttoncollapsesdock)
|
||||||
- [`AutoHideHasCloseButton`](#autohidehasclosebutton)
|
- [`AutoHideHasCloseButton`](#autohidehasclosebutton)
|
||||||
- [`AutoHideHasMinimizeButton`](#autohidehasminimizebutton)
|
- [`AutoHideHasMinimizeButton`](#autohidehasminimizebutton)
|
||||||
|
- [`AutoHideOpenOnDragHover`](#autohideopenondraghover)
|
||||||
- [DockWidget Feature Flags](#dockwidget-feature-flags)
|
- [DockWidget Feature Flags](#dockwidget-feature-flags)
|
||||||
- [`DockWidgetClosable`](#dockwidgetclosable)
|
- [`DockWidgetClosable`](#dockwidgetclosable)
|
||||||
- [`DockWidgetMovable`](#dockwidgetmovable)
|
- [`DockWidgetMovable`](#dockwidgetmovable)
|
||||||
@@ -150,7 +151,7 @@ This ie enabled by default to minimize the size of the saved data.
|
|||||||
|
|
||||||
### `TabCloseButtonIsToolButton`
|
### `TabCloseButtonIsToolButton`
|
||||||
|
|
||||||
If enabled the tab close buttons will be `QToolButtons` instead of `QPushButtons` -
|
If enabled the tab close buttons will be `QToolButtons` instead of `QPushButtons` -
|
||||||
disabled by default. Normally the default configuration should be ok but if your
|
disabled by default. Normally the default configuration should be ok but if your
|
||||||
application requires `QToolButtons` instead of `QPushButtons` for styling reasons
|
application requires `QToolButtons` instead of `QPushButtons` for styling reasons
|
||||||
or for any other reasons, then you can enable this flag.
|
or for any other reasons, then you can enable this flag.
|
||||||
@@ -181,7 +182,7 @@ constant, that means, if enabled, the tabs need more space.
|
|||||||
|
|
||||||
### `DragPreviewIsDynamic`
|
### `DragPreviewIsDynamic`
|
||||||
|
|
||||||
If non-opaque undocking is enabled, this flag defines the behavior of the drag
|
If non-opaque undocking is enabled, this flag defines the behavior of the drag
|
||||||
preview window. If this flag is enabled, then it will give the user the
|
preview window. If this flag is enabled, then it will give the user the
|
||||||
impression, that the floating drag preview is dynamically adjusted to the drop
|
impression, that the floating drag preview is dynamically adjusted to the drop
|
||||||
area. In order to give the perfect impression, you should disable the flags
|
area. In order to give the perfect impression, you should disable the flags
|
||||||
@@ -197,7 +198,7 @@ CDockManager::setConfigFlag(CDockManager::DragPreviewHasWindowFrame, false);
|
|||||||
|
|
||||||
### `DragPreviewShowsContentPixmap`
|
### `DragPreviewShowsContentPixmap`
|
||||||
|
|
||||||
If non-opaque undocking is enabled, the created drag preview window shows a
|
If non-opaque undocking is enabled, the created drag preview window shows a
|
||||||
copy of the content of the dock widget / dock are that is dragged, if this
|
copy of the content of the dock widget / dock are that is dragged, if this
|
||||||
flag is enabled (default).
|
flag is enabled (default).
|
||||||
|
|
||||||
@@ -210,7 +211,7 @@ like window without any content.
|
|||||||
|
|
||||||
### `DragPreviewHasWindowFrame`
|
### `DragPreviewHasWindowFrame`
|
||||||
|
|
||||||
If non-opaque undocking is enabled, then this flag configures if the drag
|
If non-opaque undocking is enabled, then this flag configures if the drag
|
||||||
preview is frameless (default) or looks like a real window. If it is enabled,
|
preview is frameless (default) or looks like a real window. If it is enabled,
|
||||||
then the drag preview is a transparent window with a system window frame.
|
then the drag preview is a transparent window with a system window frame.
|
||||||
|
|
||||||
@@ -303,8 +304,9 @@ or to close it via the close button.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
The Advanced Docking System is meant for applications without a static central
|
Unless a central widget explicitly has been set with setCentralWidget, the
|
||||||
widget and normally does not know anything about a central static widget.
|
Advanced Docking System is without a static central widget and it wouldn't know
|
||||||
|
about a central static widget.
|
||||||
Therefore this flag is disabled by default and a central single dock widget
|
Therefore this flag is disabled by default and a central single dock widget
|
||||||
still has a titlebar to drag it out of the main window.
|
still has a titlebar to drag it out of the main window.
|
||||||
|
|
||||||
@@ -377,7 +379,7 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar
|
|||||||
|
|
||||||
If you have a content widget that does not support focussing for some reason
|
If you have a content widget that does not support focussing for some reason
|
||||||
(like `QVTKOpenGLStereoWidget` from the [VTK library](https://github.com/Kitware/VTK)),
|
(like `QVTKOpenGLStereoWidget` from the [VTK library](https://github.com/Kitware/VTK)),
|
||||||
then you can manually switch the focus by reacting on mouse events. The
|
then you can manually switch the focus by reacting on mouse events. The
|
||||||
following code shows, how to install en event filter on the `QVTKOpenGLStereoWidget`
|
following code shows, how to install en event filter on the `QVTKOpenGLStereoWidget`
|
||||||
to properly switch the focus on `QEvent::MouseButtonPress`:
|
to properly switch the focus on `QEvent::MouseButtonPress`:
|
||||||
|
|
||||||
@@ -421,7 +423,7 @@ bool CMainWindow::eventFilter(QObject *watched, QEvent *event)
|
|||||||
### `EqualSplitOnInsertion`
|
### `EqualSplitOnInsertion`
|
||||||
|
|
||||||
This flag configures how the space is distributed if a new dock widget is
|
This flag configures how the space is distributed if a new dock widget is
|
||||||
inserted into an existing dock area. The flag is disabled by default. If 3
|
inserted into an existing dock area. The flag is disabled by default. If 3
|
||||||
dock widgets are inserted with the following code
|
dock widgets are inserted with the following code
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
@@ -432,7 +434,7 @@ then this is the result, if the flag is disabled:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
If the flag is enabled, then the space is equally distributed to all widgets
|
If the flag is enabled, then the space is equally distributed to all widgets
|
||||||
in a splitter:
|
in a splitter:
|
||||||
|
|
||||||

|

|
||||||
@@ -500,7 +502,7 @@ for active tabs. Inactive tabs only show their icon:
|
|||||||
|
|
||||||
The Advanced Docking System supports "Auto-Hide" functionality for **all**
|
The Advanced Docking System supports "Auto-Hide" functionality for **all**
|
||||||
dock containers. The "Auto Hide" feature allows to display more information
|
dock containers. The "Auto Hide" feature allows to display more information
|
||||||
using less screen space by hiding or showing windows pinned to one of the
|
using less screen space by hiding or showing windows pinned to one of the
|
||||||
four dock container borders.
|
four dock container borders.
|
||||||
|
|
||||||
Enabling this feature adds a button with a pin icon to each dock area.
|
Enabling this feature adds a button with a pin icon to each dock area.
|
||||||
@@ -562,7 +564,7 @@ That means, you can drag them to a different border or sidebar:
|
|||||||
|
|
||||||
### Auto-Hide Tab Sorting
|
### Auto-Hide Tab Sorting
|
||||||
|
|
||||||
You can drag Auto-Hide tabs to a new position in the current sidebar
|
You can drag Auto-Hide tabs to a new position in the current sidebar
|
||||||
to sort them:
|
to sort them:
|
||||||
|
|
||||||

|

|
||||||
@@ -631,7 +633,7 @@ the other Auto-Hide flags will be evaluated.
|
|||||||
|
|
||||||
### `DockAreaHasAutoHideButton`
|
### `DockAreaHasAutoHideButton`
|
||||||
|
|
||||||
If this flag is set (default), then each dock area has a pin button in the title
|
If this flag is set (default), then each dock area has a pin button in the title
|
||||||
bar to toggle Auto-Hide state.
|
bar to toggle Auto-Hide state.
|
||||||
|
|
||||||

|

|
||||||
@@ -675,7 +677,7 @@ works if this feature is enabled.
|
|||||||
Some users don't understand the distinction between closing an auto hide dock and
|
Some users don't understand the distinction between closing an auto hide dock and
|
||||||
collapsing an auto hide dock. This may lead to situations where they press the
|
collapsing an auto hide dock. This may lead to situations where they press the
|
||||||
close button (losing the side tab widget) instead of simply clicking outside
|
close button (losing the side tab widget) instead of simply clicking outside
|
||||||
the auto hide dock (collapsing the dock).
|
the auto hide dock (collapsing the dock).
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -703,6 +705,15 @@ If this flag is set (disabled by default), then each auto hide widget has a mini
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
### `AutoHideOpenOnDragHover`
|
||||||
|
|
||||||
|
If this flag is set (disabled by default), then holding a dragging cursor hover an auto-hide collapsed dock's tab will open said dock:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Said dock must be set to accept drops to hide when cursor leaves its scope. See `AutoHideDragNDropExample` for more details.
|
||||||
|
|
||||||
## DockWidget Feature Flags
|
## DockWidget Feature Flags
|
||||||
|
|
||||||
### `DockWidgetClosable`
|
### `DockWidgetClosable`
|
||||||
|
|||||||
@@ -6,5 +6,6 @@ add_subdirectory(sidebar)
|
|||||||
add_subdirectory(deleteonclose)
|
add_subdirectory(deleteonclose)
|
||||||
add_subdirectory(centralwidget)
|
add_subdirectory(centralwidget)
|
||||||
add_subdirectory(autohide)
|
add_subdirectory(autohide)
|
||||||
|
add_subdirectory(autohidedragndrop)
|
||||||
add_subdirectory(emptydockarea)
|
add_subdirectory(emptydockarea)
|
||||||
add_subdirectory(dockindock)
|
add_subdirectory(dockindock)
|
||||||
|
|||||||
29
examples/autohidedragndrop/CMakeLists.txt
Normal file
29
examples/autohidedragndrop/CMakeLists.txt
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
project(ads_example_autohide_dragndrop VERSION ${VERSION_SHORT})
|
||||||
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||||
|
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
add_executable(AutoHideDragNDropExample WIN32
|
||||||
|
main.cpp
|
||||||
|
mainwindow.cpp
|
||||||
|
mainwindow.ui
|
||||||
|
droppableitem.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(AutoHideDragNDropExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||||
|
target_link_libraries(AutoHideDragNDropExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking)
|
||||||
|
target_link_libraries(AutoHideDragNDropExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||||
|
Qt${QT_VERSION_MAJOR}::Gui
|
||||||
|
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||||
|
set_target_properties(AutoHideDragNDropExample PROPERTIES
|
||||||
|
AUTOMOC ON
|
||||||
|
AUTORCC ON
|
||||||
|
AUTOUIC ON
|
||||||
|
CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
CXX_EXTENSIONS OFF
|
||||||
|
VERSION ${VERSION_SHORT}
|
||||||
|
EXPORT_NAME "Qt Advanced Docking System Auto Hide With Drag N Drop Example"
|
||||||
|
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
|
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
|
||||||
|
)
|
||||||
36
examples/autohidedragndrop/autohidedragndrop.pro
Normal file
36
examples/autohidedragndrop/autohidedragndrop.pro
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
ADS_OUT_ROOT = $${OUT_PWD}/../..
|
||||||
|
|
||||||
|
QT += core gui widgets
|
||||||
|
|
||||||
|
TARGET = AutoHideDragNDropExample
|
||||||
|
DESTDIR = $${ADS_OUT_ROOT}/lib
|
||||||
|
TEMPLATE = app
|
||||||
|
CONFIG += c++14
|
||||||
|
CONFIG += debug_and_release
|
||||||
|
adsBuildStatic {
|
||||||
|
DEFINES += ADS_STATIC
|
||||||
|
}
|
||||||
|
|
||||||
|
# The following define makes your compiler emit warnings if you use
|
||||||
|
# any Qt feature that has been marked deprecated (the exact warnings
|
||||||
|
# depend on your compiler). Please consult the documentation of the
|
||||||
|
# deprecated API in order to know how to port your code away from it.
|
||||||
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
mainwindow.cpp \
|
||||||
|
droppableitem.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
mainwindow.h \
|
||||||
|
droppableitem.h
|
||||||
|
|
||||||
|
FORMS += \
|
||||||
|
mainwindow.ui
|
||||||
|
|
||||||
|
LIBS += -L$${ADS_OUT_ROOT}/lib
|
||||||
|
include(../../ads.pri)
|
||||||
|
INCLUDEPATH += ../../src
|
||||||
|
DEPENDPATH += ../../src
|
||||||
|
|
||||||
38
examples/autohidedragndrop/droppableitem.cpp
Normal file
38
examples/autohidedragndrop/droppableitem.cpp
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#include "droppableitem.h"
|
||||||
|
|
||||||
|
#include <QDragEnterEvent>
|
||||||
|
#include <QDragLeaveEvent>
|
||||||
|
#include <QDropEvent>
|
||||||
|
#include <QMimeData>
|
||||||
|
#include <qsizepolicy.h>
|
||||||
|
|
||||||
|
DroppableItem::DroppableItem(const QString& text, QWidget* parent)
|
||||||
|
: QPushButton(text, parent)
|
||||||
|
{
|
||||||
|
setAcceptDrops(true);
|
||||||
|
setSizePolicy(QSizePolicy::Policy::Expanding, QSizePolicy::Policy::Expanding);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DroppableItem::dragEnterEvent(QDragEnterEvent* event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasText())
|
||||||
|
{
|
||||||
|
event->acceptProposedAction();
|
||||||
|
setCursor(Qt::DragMoveCursor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DroppableItem::dragLeaveEvent(QDragLeaveEvent* event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
unsetCursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DroppableItem::dropEvent(QDropEvent* event)
|
||||||
|
{
|
||||||
|
if (event->mimeData()->hasText())
|
||||||
|
{
|
||||||
|
event->acceptProposedAction();
|
||||||
|
setText(event->mimeData()->text());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
examples/autohidedragndrop/droppableitem.h
Normal file
19
examples/autohidedragndrop/droppableitem.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#include <QObject>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
class QDragEnterEvent;
|
||||||
|
class QDragLeaveEvent;
|
||||||
|
class QDropEvent;
|
||||||
|
|
||||||
|
class DroppableItem : public QPushButton
|
||||||
|
{
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DroppableItem(const QString& text = QString(), QWidget* parent = nullptr);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void dragEnterEvent(QDragEnterEvent* event) override;
|
||||||
|
void dragLeaveEvent(QDragLeaveEvent* event) override;
|
||||||
|
void dropEvent(QDropEvent* event) override;
|
||||||
|
};
|
||||||
10
examples/autohidedragndrop/main.cpp
Normal file
10
examples/autohidedragndrop/main.cpp
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#include <mainwindow.h>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
CMainWindow w;
|
||||||
|
w.show();
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
84
examples/autohidedragndrop/main.py
Normal file
84
examples/autohidedragndrop/main.py
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from PyQt5 import uic
|
||||||
|
from PyQt5.QtCore import Qt, QTimer, QDir, QSignalBlocker
|
||||||
|
from PyQt5.QtGui import QCloseEvent, QIcon
|
||||||
|
from PyQt5.QtWidgets import (QApplication, QLabel, QCalendarWidget, QFrame, QTreeView,
|
||||||
|
QTableWidget, QFileSystemModel, QPlainTextEdit, QToolBar,
|
||||||
|
QWidgetAction, QComboBox, QAction, QSizePolicy, QInputDialog)
|
||||||
|
|
||||||
|
import PyQtAds as QtAds
|
||||||
|
|
||||||
|
UI_FILE = os.path.join(os.path.dirname(__file__), 'mainwindow.ui')
|
||||||
|
MainWindowUI, MainWindowBase = uic.loadUiType(UI_FILE)
|
||||||
|
|
||||||
|
class MainWindow(MainWindowUI, MainWindowBase):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
self.setupUi(self)
|
||||||
|
|
||||||
|
QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.OpaqueSplitterResize, True)
|
||||||
|
QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.XmlCompressionEnabled, False)
|
||||||
|
QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FocusHighlighting, True)
|
||||||
|
QtAds.CDockManager.setAutoHideConfigFlag(QtAds.CDockManager.AutoHideOpenOnDragHover, True);
|
||||||
|
self.dock_manager = QtAds.CDockManager(self)
|
||||||
|
|
||||||
|
# Set central widget
|
||||||
|
text_edit = QPlainTextEdit()
|
||||||
|
text_edit.setPlaceholderText("This is the central editor. Enter your text here.")
|
||||||
|
central_dock_widget = QtAds.CDockWidget("CentralWidget")
|
||||||
|
central_dock_widget.setWidget(text_edit)
|
||||||
|
central_dock_area = self.dock_manager.setCentralWidget(central_dock_widget)
|
||||||
|
central_dock_area.setAllowedAreas(QtAds.DockWidgetArea.OuterDockAreas)
|
||||||
|
|
||||||
|
|
||||||
|
droppable_item = DroppableItem("Drop text here.")
|
||||||
|
drop_dock_widget = QtAds.CDockWidget("Tab")
|
||||||
|
drop_dock_widget.setWidget(droppable_item)
|
||||||
|
drop_dock_widget.setMinimumSizeHintMode(QtAds.CDockWidget.MinimumSizeHintFromDockWidget)
|
||||||
|
drop_dock_widget.setMinimumSize(200, 150)
|
||||||
|
drop_dock_widget.setAcceptDrops(True)
|
||||||
|
drop_area = self.dock_manager.addDockWidget(QtAds.DockWidgetArea.LeftDockWidgetArea, drop_dock_widget)
|
||||||
|
drop_area.setAcceptDrops(True)
|
||||||
|
self.menuView.addAction(drop_dock_widget.toggleViewAction())
|
||||||
|
|
||||||
|
self.create_perspective_ui()
|
||||||
|
|
||||||
|
def create_perspective_ui(self):
|
||||||
|
save_perspective_action = QAction("Create Perspective", self)
|
||||||
|
save_perspective_action.triggered.connect(self.save_perspective)
|
||||||
|
perspective_list_action = QWidgetAction(self)
|
||||||
|
self.perspective_combobox = QComboBox(self)
|
||||||
|
self.perspective_combobox.setSizeAdjustPolicy(QComboBox.AdjustToContents)
|
||||||
|
self.perspective_combobox.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
|
||||||
|
self.perspective_combobox.activated[str].connect(self.dock_manager.openPerspective)
|
||||||
|
perspective_list_action.setDefaultWidget(self.perspective_combobox)
|
||||||
|
self.toolBar.addSeparator()
|
||||||
|
self.toolBar.addAction(perspective_list_action)
|
||||||
|
self.toolBar.addAction(save_perspective_action)
|
||||||
|
|
||||||
|
def save_perspective(self):
|
||||||
|
perspective_name, ok = QInputDialog.getText(self, "Save Perspective", "Enter Unique name:")
|
||||||
|
if not ok or not perspective_name:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.dock_manager.addPerspective(perspective_name)
|
||||||
|
blocker = QSignalBlocker(self.perspective_combobox)
|
||||||
|
self.perspective_combobox.clear()
|
||||||
|
self.perspective_combobox.addItems(self.dock_manager.perspectiveNames())
|
||||||
|
self.perspective_combobox.setCurrentText(perspective_name)
|
||||||
|
|
||||||
|
def closeEvent(self, event: QCloseEvent):
|
||||||
|
self.dock_manager.deleteLater()
|
||||||
|
super().closeEvent(event)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
|
w = MainWindow()
|
||||||
|
w.show()
|
||||||
|
app.exec_()
|
||||||
131
examples/autohidedragndrop/mainwindow.cpp
Normal file
131
examples/autohidedragndrop/mainwindow.cpp
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
#include "droppableitem.h"
|
||||||
|
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
#include <QWidgetAction>
|
||||||
|
#include <QFileSystemModel>
|
||||||
|
#include <QTableWidget>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QInputDialog>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QPlainTextEdit>
|
||||||
|
#include <QToolBar>
|
||||||
|
|
||||||
|
#include "AutoHideDockContainer.h"
|
||||||
|
#include "DockAreaWidget.h"
|
||||||
|
#include "DockAreaTitleBar.h"
|
||||||
|
|
||||||
|
using namespace ads;
|
||||||
|
|
||||||
|
CMainWindow::CMainWindow(QWidget *parent)
|
||||||
|
: QMainWindow(parent)
|
||||||
|
, ui(new Ui::CMainWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
CDockManager::setConfigFlag(CDockManager::OpaqueSplitterResize, true);
|
||||||
|
CDockManager::setConfigFlag(CDockManager::XmlCompressionEnabled, false);
|
||||||
|
CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true);
|
||||||
|
CDockManager::setAutoHideConfigFlags(CDockManager::DefaultAutoHideConfig);
|
||||||
|
CDockManager::setAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover, true);
|
||||||
|
CDockManager::setConfigParam(CDockManager::AutoHideOpenOnDragHoverDelay_ms, 500);
|
||||||
|
DockManager = new CDockManager(this);
|
||||||
|
|
||||||
|
// Set central widget
|
||||||
|
QPlainTextEdit* w = new QPlainTextEdit();
|
||||||
|
w->setPlaceholderText("This is the central editor. Enter your text here.");
|
||||||
|
CDockWidget* CentralDockWidget = new CDockWidget("CentralWidget");
|
||||||
|
CentralDockWidget->setWidget(w);
|
||||||
|
auto* CentralDockArea = DockManager->setCentralWidget(CentralDockWidget);
|
||||||
|
CentralDockArea->setAllowedAreas(DockWidgetArea::OuterDockAreas);
|
||||||
|
|
||||||
|
{
|
||||||
|
DroppableItem* droppableItem = new DroppableItem("Drop text here.");
|
||||||
|
CDockWidget* dropDockWidget = new CDockWidget("Tab 1");
|
||||||
|
dropDockWidget->setWidget(droppableItem);
|
||||||
|
dropDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||||
|
dropDockWidget->setMinimumSize(200,150);
|
||||||
|
dropDockWidget->setAcceptDrops(true);
|
||||||
|
const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::SideBarLeft, dropDockWidget);
|
||||||
|
autoHideContainer->setSize(480);
|
||||||
|
autoHideContainer->setAcceptDrops(true);
|
||||||
|
ui->menuView->addAction(dropDockWidget->toggleViewAction());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
DroppableItem* droppableItem = new DroppableItem("Drop text here.");
|
||||||
|
CDockWidget* dropDockWidget = new CDockWidget("Tab 2");
|
||||||
|
dropDockWidget->setWidget(droppableItem);
|
||||||
|
dropDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||||
|
dropDockWidget->setMinimumSize(200,150);
|
||||||
|
dropDockWidget->setAcceptDrops(true);
|
||||||
|
const auto autoHideContainer = DockManager->addAutoHideDockWidget(SideBarLocation::SideBarRight, dropDockWidget);
|
||||||
|
autoHideContainer->setSize(480);
|
||||||
|
autoHideContainer->setAcceptDrops(true);
|
||||||
|
ui->menuView->addAction(dropDockWidget->toggleViewAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableWidget* propertiesTable = new QTableWidget();
|
||||||
|
propertiesTable->setColumnCount(3);
|
||||||
|
propertiesTable->setRowCount(10);
|
||||||
|
CDockWidget* PropertiesDockWidget = new CDockWidget("Properties");
|
||||||
|
PropertiesDockWidget->setWidget(propertiesTable);
|
||||||
|
PropertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget);
|
||||||
|
PropertiesDockWidget->resize(250, 150);
|
||||||
|
PropertiesDockWidget->setMinimumSize(200,150);
|
||||||
|
DockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, PropertiesDockWidget, CentralDockArea);
|
||||||
|
ui->menuView->addAction(PropertiesDockWidget->toggleViewAction());
|
||||||
|
|
||||||
|
createPerspectiveUi();
|
||||||
|
}
|
||||||
|
|
||||||
|
CMainWindow::~CMainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CMainWindow::createPerspectiveUi()
|
||||||
|
{
|
||||||
|
SavePerspectiveAction = new QAction("Create Perspective", this);
|
||||||
|
connect(SavePerspectiveAction, SIGNAL(triggered()), SLOT(savePerspective()));
|
||||||
|
PerspectiveListAction = new QWidgetAction(this);
|
||||||
|
PerspectiveComboBox = new QComboBox(this);
|
||||||
|
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||||
|
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||||
|
connect(PerspectiveComboBox, SIGNAL(currentTextChanged(const QString&)),
|
||||||
|
DockManager, SLOT(openPerspective(const QString&)));
|
||||||
|
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
|
||||||
|
ui->toolBar->addSeparator();
|
||||||
|
ui->toolBar->addAction(PerspectiveListAction);
|
||||||
|
ui->toolBar->addAction(SavePerspectiveAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CMainWindow::savePerspective()
|
||||||
|
{
|
||||||
|
QString PerspectiveName = QInputDialog::getText(this, "Save Perspective", "Enter unique name:");
|
||||||
|
if (PerspectiveName.isEmpty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DockManager->addPerspective(PerspectiveName);
|
||||||
|
QSignalBlocker Blocker(PerspectiveComboBox);
|
||||||
|
PerspectiveComboBox->clear();
|
||||||
|
PerspectiveComboBox->addItems(DockManager->perspectiveNames());
|
||||||
|
PerspectiveComboBox->setCurrentText(PerspectiveName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::closeEvent(QCloseEvent* event)
|
||||||
|
{
|
||||||
|
// Delete dock manager here to delete all floating widgets. This ensures
|
||||||
|
// that all top level windows of the dock manager are properly closed
|
||||||
|
DockManager->deleteLater();
|
||||||
|
QMainWindow::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
43
examples/autohidedragndrop/mainwindow.h
Normal file
43
examples/autohidedragndrop/mainwindow.h
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QWidgetAction>
|
||||||
|
|
||||||
|
#include "DockManager.h"
|
||||||
|
#include "DockAreaWidget.h"
|
||||||
|
#include "DockWidget.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
namespace Ui { class CMainWindow; }
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class CMainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
CMainWindow(QWidget *parent = nullptr);
|
||||||
|
~CMainWindow();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QAction* SavePerspectiveAction = nullptr;
|
||||||
|
QWidgetAction* PerspectiveListAction = nullptr;
|
||||||
|
QComboBox* PerspectiveComboBox = nullptr;
|
||||||
|
|
||||||
|
Ui::CMainWindow *ui;
|
||||||
|
|
||||||
|
ads::CDockManager* DockManager;
|
||||||
|
ads::CDockAreaWidget* StatusDockArea;
|
||||||
|
ads::CDockWidget* TimelineDockWidget;
|
||||||
|
|
||||||
|
void createPerspectiveUi();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void savePerspective();
|
||||||
|
};
|
||||||
|
#endif // MAINWINDOW_H
|
||||||
47
examples/autohidedragndrop/mainwindow.ui
Normal file
47
examples/autohidedragndrop/mainwindow.ui
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>CMainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="CMainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1284</width>
|
||||||
|
<height>757</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>MainWindow</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget"/>
|
||||||
|
<widget class="QMenuBar" name="menubar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1284</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<widget class="QMenu" name="menuView">
|
||||||
|
<property name="title">
|
||||||
|
<string>View</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<addaction name="menuView"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QToolBar" name="toolBar">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>toolBar</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="toolBarArea">
|
||||||
|
<enum>TopToolBarArea</enum>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolBarBreak">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
28
examples/configflags/CMakeLists.txt
Normal file
28
examples/configflags/CMakeLists.txt
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.5)
|
||||||
|
project(ads_example_centralwidget VERSION ${VERSION_SHORT})
|
||||||
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||||
|
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets REQUIRED)
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
add_executable(configFlagsExample WIN32
|
||||||
|
main.cpp
|
||||||
|
mainwindow.cpp
|
||||||
|
mainwindow.ui
|
||||||
|
)
|
||||||
|
target_include_directories(CentralWidgetExample PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../../src")
|
||||||
|
target_link_libraries(CentralWidgetExample PRIVATE qt${QT_VERSION_MAJOR}advanceddocking)
|
||||||
|
target_link_libraries(CentralWidgetExample PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||||
|
Qt${QT_VERSION_MAJOR}::Gui
|
||||||
|
Qt${QT_VERSION_MAJOR}::Widgets)
|
||||||
|
set_target_properties(CentralWidgetExample PROPERTIES
|
||||||
|
AUTOMOC ON
|
||||||
|
AUTORCC ON
|
||||||
|
AUTOUIC ON
|
||||||
|
CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
CXX_EXTENSIONS OFF
|
||||||
|
VERSION ${VERSION_SHORT}
|
||||||
|
EXPORT_NAME "Qt Advanced Docking System Central Widget Example"
|
||||||
|
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
|
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
|
||||||
|
)
|
||||||
34
examples/configflags/configflags.pro
Normal file
34
examples/configflags/configflags.pro
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
ADS_OUT_ROOT = $${OUT_PWD}/../..
|
||||||
|
|
||||||
|
QT += core gui widgets
|
||||||
|
|
||||||
|
TARGET = ConfigFlagsExample
|
||||||
|
DESTDIR = $${ADS_OUT_ROOT}/lib
|
||||||
|
TEMPLATE = app
|
||||||
|
CONFIG += c++14
|
||||||
|
CONFIG += debug_and_release
|
||||||
|
adsBuildStatic {
|
||||||
|
DEFINES += ADS_STATIC
|
||||||
|
}
|
||||||
|
|
||||||
|
# The following define makes your compiler emit warnings if you use
|
||||||
|
# any Qt feature that has been marked deprecated (the exact warnings
|
||||||
|
# depend on your compiler). Please consult the documentation of the
|
||||||
|
# deprecated API in order to know how to port your code away from it.
|
||||||
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
mainwindow.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
mainwindow.h
|
||||||
|
|
||||||
|
FORMS += \
|
||||||
|
mainwindow.ui
|
||||||
|
|
||||||
|
LIBS += -L$${ADS_OUT_ROOT}/lib
|
||||||
|
include(../../ads.pri)
|
||||||
|
INCLUDEPATH += ../../src
|
||||||
|
DEPENDPATH += ../../src
|
||||||
|
|
||||||
10
examples/configflags/main.cpp
Normal file
10
examples/configflags/main.cpp
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#include <mainwindow.h>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
CMainWindow w;
|
||||||
|
w.show();
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
65
examples/configflags/mainwindow.cpp
Normal file
65
examples/configflags/mainwindow.cpp
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QToolBar>
|
||||||
|
|
||||||
|
#include "DockAreaWidget.h"
|
||||||
|
#include "DockAreaTitleBar.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace ads;
|
||||||
|
|
||||||
|
|
||||||
|
CMainWindow::CMainWindow(QWidget *parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
ui(new Ui::CMainWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
// Add the toolbar
|
||||||
|
auto toolbar_ = addToolBar("Top Toolbar");
|
||||||
|
|
||||||
|
// Create the dock manager
|
||||||
|
ads::CDockManager::setConfigFlags(ads::CDockManager::DefaultOpaqueConfig);
|
||||||
|
ads::CDockManager::setConfigFlag(ads::CDockManager::DockAreaHasCloseButton,
|
||||||
|
false);
|
||||||
|
ads::CDockManager::setConfigFlag(ads::CDockManager::DockAreaHasUndockButton,
|
||||||
|
false);
|
||||||
|
ads::CDockManager::setConfigFlag(
|
||||||
|
ads::CDockManager::DockAreaHasTabsMenuButton, false);
|
||||||
|
auto DockManager = new ads::CDockManager(this);
|
||||||
|
|
||||||
|
// Create a dockable widget
|
||||||
|
QLabel *l1 = new QLabel();
|
||||||
|
l1->setWordWrap(true);
|
||||||
|
l1->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||||
|
l1->setText("Docking widget 1");
|
||||||
|
ads::CDockWidget *dockWidget1 = new ads::CDockWidget("Dock 1");
|
||||||
|
dockWidget1->setWidget(l1);
|
||||||
|
DockManager->addDockWidget(ads::LeftDockWidgetArea, dockWidget1);
|
||||||
|
|
||||||
|
QLabel *l2 = new QLabel();
|
||||||
|
l2->setWordWrap(true);
|
||||||
|
l2->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||||
|
l2->setText("Docking widget 2");
|
||||||
|
ads::CDockWidget *dockWidget2 = new ads::CDockWidget("Dock 2");
|
||||||
|
dockWidget2->setWidget(l2);
|
||||||
|
DockManager->addDockWidget(ads::RightDockWidgetArea, dockWidget2);
|
||||||
|
|
||||||
|
// Add menu actions
|
||||||
|
ui->menuView->addAction(dockWidget1->toggleViewAction());
|
||||||
|
ui->menuView->addAction(dockWidget2->toggleViewAction());
|
||||||
|
toolbar_->addAction(dockWidget1->toggleViewAction());
|
||||||
|
toolbar_->addAction(dockWidget2->toggleViewAction());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CMainWindow::~CMainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
27
examples/configflags/mainwindow.h
Normal file
27
examples/configflags/mainwindow.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QWidgetAction>
|
||||||
|
|
||||||
|
#include "DockManager.h"
|
||||||
|
#include "DockAreaWidget.h"
|
||||||
|
#include "DockWidget.h"
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
namespace Ui { class CMainWindow; }
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
class CMainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
CMainWindow(QWidget *parent = nullptr);
|
||||||
|
~CMainWindow();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::CMainWindow *ui;
|
||||||
|
};
|
||||||
|
#endif // MAINWINDOW_H
|
||||||
47
examples/configflags/mainwindow.ui
Normal file
47
examples/configflags/mainwindow.ui
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>CMainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="CMainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1284</width>
|
||||||
|
<height>757</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>MainWindow</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget"/>
|
||||||
|
<widget class="QMenuBar" name="menubar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1284</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<widget class="QMenu" name="menuView">
|
||||||
|
<property name="title">
|
||||||
|
<string>View</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<addaction name="menuView"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QToolBar" name="toolBar">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>toolBar</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="toolBarArea">
|
||||||
|
<enum>TopToolBarArea</enum>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolBarBreak">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include "../../examples/simple/MainWindow.h"
|
#include "mainframe.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ TEMPLATE = subdirs
|
|||||||
|
|
||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
autohide \
|
autohide \
|
||||||
|
autohidedragndrop \
|
||||||
centralwidget \
|
centralwidget \
|
||||||
simple \
|
simple \
|
||||||
hideshow \
|
hideshow \
|
||||||
sidebar \
|
sidebar \
|
||||||
deleteonclose \
|
deleteonclose \
|
||||||
emptydockarea \
|
emptydockarea \
|
||||||
dockindock
|
dockindock \
|
||||||
|
configflags
|
||||||
|
|||||||
@@ -12,10 +12,14 @@ class CTitleBarButton : QToolButton
|
|||||||
%End
|
%End
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CTitleBarButton(bool visible = true, QWidget* parent /TransferThis/ = Q_NULLPTR );
|
CTitleBarButton(bool ShowInTitleBar, bool HideWhenDisabled, TitleBarButton ButtonId,
|
||||||
|
QWidget* /TransferThis/ = Q_NULLPTR );
|
||||||
virtual void setVisible(bool);
|
virtual void setVisible(bool);
|
||||||
void setShowInTitleBar(bool);
|
void setShowInTitleBar(bool);
|
||||||
|
|
||||||
|
TitleBarButton buttonId() const;
|
||||||
|
ads::CDockAreaTitleBar* titleBar() const;
|
||||||
|
bool isInAutoHideArea() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool event(QEvent *ev);
|
bool event(QEvent *ev);
|
||||||
@@ -44,13 +48,15 @@ public:
|
|||||||
ads::CDockAreaTabBar* tabBar() const;
|
ads::CDockAreaTabBar* tabBar() const;
|
||||||
ads::CTitleBarButton* button(ads::TitleBarButton which) const;
|
ads::CTitleBarButton* button(ads::TitleBarButton which) const;
|
||||||
ads::CElidingLabel* autoHideTitleLabel() const;
|
ads::CElidingLabel* autoHideTitleLabel() const;
|
||||||
|
ads::CDockAreaWidget* dockAreaWidget() const;
|
||||||
void updateDockWidgetActionsButtons();
|
void updateDockWidgetActionsButtons();
|
||||||
virtual void setVisible(bool Visible);
|
virtual void setVisible(bool Visible);
|
||||||
void insertWidget(int index, QWidget *widget /Transfer/ );
|
void insertWidget(int index, QWidget *widget /Transfer/ );
|
||||||
int indexOf(QWidget *widget) const;
|
int indexOf(QWidget *widget) const;
|
||||||
QString titleBarButtonToolTip(ads::TitleBarButton Button) const;
|
QString titleBarButtonToolTip(ads::TitleBarButton Button) const;
|
||||||
void setAreaFloating();
|
void setAreaFloating();
|
||||||
|
void showAutoHideControls(bool Show);
|
||||||
|
bool isAutoHide() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void tabBarClicked(int index);
|
void tabBarClicked(int index);
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ public:
|
|||||||
ads::CDockManager* dockManager() const;
|
ads::CDockManager* dockManager() const;
|
||||||
ads::CDockContainerWidget* dockContainer() const;
|
ads::CDockContainerWidget* dockContainer() const;
|
||||||
ads::CAutoHideDockContainer* autoHideDockContainer() const;
|
ads::CAutoHideDockContainer* autoHideDockContainer() const;
|
||||||
|
ads::CDockSplitter* parentSplitter() const;
|
||||||
bool isAutoHide() const;
|
bool isAutoHide() const;
|
||||||
void setAutoHideDockContainer(CAutoHideDockContainer*);
|
void setAutoHideDockContainer(CAutoHideDockContainer*);
|
||||||
virtual QSize minimumSizeHint() const;
|
virtual QSize minimumSizeHint() const;
|
||||||
|
|||||||
@@ -20,13 +20,14 @@ class CDockContainerWidget : QFrame
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool event(QEvent *e);
|
virtual bool event(QEvent *e);
|
||||||
QSplitter* rootSplitter() const;
|
ads::CDockSplitter* rootSplitter() const;
|
||||||
ads::CAutoHideDockContainer* createAndSetupAutoHideContainer(ads::SideBarLocation area, ads::CDockWidget* DockWidget /Transfer/, int TabIndex = -1);
|
ads::CAutoHideDockContainer* createAndSetupAutoHideContainer(ads::SideBarLocation area, ads::CDockWidget* DockWidget /Transfer/, int TabIndex = -1);
|
||||||
void createRootSplitter();
|
void createRootSplitter();
|
||||||
void dropFloatingWidget(ads::CFloatingDockContainer* FloatingWidget, const QPoint& TargetPos);
|
void dropFloatingWidget(ads::CFloatingDockContainer* FloatingWidget, const QPoint& TargetPos);
|
||||||
void dropWidget(QWidget* Widget, DockWidgetArea DropArea, CDockAreaWidget* TargetAreaWidget, int TabIndex = -1);
|
void dropWidget(QWidget* Widget, DockWidgetArea DropArea, CDockAreaWidget* TargetAreaWidget, int TabIndex = -1);
|
||||||
void addDockArea(ads::CDockAreaWidget* DockAreaWidget /Transfer/, ads::DockWidgetArea area = ads::CenterDockWidgetArea);
|
void addDockArea(ads::CDockAreaWidget* DockAreaWidget /Transfer/, ads::DockWidgetArea area = ads::CenterDockWidgetArea);
|
||||||
void removeDockArea(ads::CDockAreaWidget* area /TransferBack/);
|
void removeDockArea(ads::CDockAreaWidget* area /TransferBack/);
|
||||||
|
/*QList<QPointer<ads::CDockAreaWidget>> removeAllDockAreas();*/
|
||||||
void saveState(QXmlStreamWriter& Stream) const;
|
void saveState(QXmlStreamWriter& Stream) const;
|
||||||
bool restoreState(CDockingStateReader& Stream, bool Testing);
|
bool restoreState(CDockingStateReader& Stream, bool Testing);
|
||||||
ads::CDockAreaWidget* lastAddedDockAreaWidget(ads::DockWidgetArea area) const;
|
ads::CDockAreaWidget* lastAddedDockAreaWidget(ads::DockWidgetArea area) const;
|
||||||
|
|||||||
@@ -172,6 +172,8 @@ public:
|
|||||||
FloatingContainerForceNativeTitleBar,
|
FloatingContainerForceNativeTitleBar,
|
||||||
FloatingContainerForceQWidgetTitleBar,
|
FloatingContainerForceQWidgetTitleBar,
|
||||||
MiddleMouseButtonClosesTab,
|
MiddleMouseButtonClosesTab,
|
||||||
|
DisableTabTextEliding,
|
||||||
|
ShowTabTextOnlyForActiveTab,
|
||||||
DefaultDockAreaButtons,
|
DefaultDockAreaButtons,
|
||||||
DefaultBaseConfig,
|
DefaultBaseConfig,
|
||||||
DefaultOpaqueConfig,
|
DefaultOpaqueConfig,
|
||||||
@@ -188,6 +190,8 @@ public:
|
|||||||
AutoHideSideBarsIconOnly,
|
AutoHideSideBarsIconOnly,
|
||||||
AutoHideShowOnMouseOver,
|
AutoHideShowOnMouseOver,
|
||||||
AutoHideCloseButtonCollapsesDock,
|
AutoHideCloseButtonCollapsesDock,
|
||||||
|
AutoHideHasCloseButton,
|
||||||
|
AutoHideHasMinimizeButton,
|
||||||
DefaultAutoHideConfig,
|
DefaultAutoHideConfig,
|
||||||
};
|
};
|
||||||
typedef QFlags<ads::CDockManager::eAutoHideFlag> AutoHideFlags;
|
typedef QFlags<ads::CDockManager::eAutoHideFlag> AutoHideFlags;
|
||||||
@@ -245,6 +249,12 @@ public:
|
|||||||
void setSplitterSizes(ads::CDockAreaWidget *ContainedArea, const QList<int>& sizes);
|
void setSplitterSizes(ads::CDockAreaWidget *ContainedArea, const QList<int>& sizes);
|
||||||
static void setFloatingContainersTitle(const QString& Title);
|
static void setFloatingContainersTitle(const QString& Title);
|
||||||
static QString floatingContainersTitle();
|
static QString floatingContainersTitle();
|
||||||
|
void setDockWidgetToolBarStyle(Qt::ToolButtonStyle Style, ads::CDockWidget::eState State);
|
||||||
|
Qt::ToolButtonStyle dockWidgetToolBarStyle(ads::CDockWidget::eState State) const;
|
||||||
|
void setDockWidgetToolBarIconSize(const QSize& IconSize, ads::CDockWidget::eState State);
|
||||||
|
QSize dockWidgetToolBarIconSize(ads::CDockWidget::eState State) const;
|
||||||
|
ads::CDockWidget::DockWidgetFeatures globallyLockedDockWidgetFeatures() const;
|
||||||
|
void lockDockWidgetFeaturesGlobally(ads::CDockWidget::DockWidgetFeatures Features = ads::CDockWidget::GloballyLockableFeatures);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void endLeavingMinimizedState();
|
void endLeavingMinimizedState();
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ public:
|
|||||||
DefaultDockWidgetFeatures,
|
DefaultDockWidgetFeatures,
|
||||||
AllDockWidgetFeatures,
|
AllDockWidgetFeatures,
|
||||||
DockWidgetAlwaysCloseAndDelete,
|
DockWidgetAlwaysCloseAndDelete,
|
||||||
|
GloballyLockableFeatures,
|
||||||
NoDockWidgetFeatures
|
NoDockWidgetFeatures
|
||||||
};
|
};
|
||||||
typedef QFlags<ads::CDockWidget::DockWidgetFeature> DockWidgetFeatures;
|
typedef QFlags<ads::CDockWidget::DockWidgetFeature> DockWidgetFeatures;
|
||||||
@@ -49,6 +50,12 @@ public:
|
|||||||
StateDocked,
|
StateDocked,
|
||||||
StateFloating
|
StateFloating
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum eToolBarStyleSource
|
||||||
|
{
|
||||||
|
ToolBarStyleFromDockManager,
|
||||||
|
ToolBarStyleFromDockWidget
|
||||||
|
};
|
||||||
|
|
||||||
enum eInsertMode
|
enum eInsertMode
|
||||||
{
|
{
|
||||||
@@ -72,7 +79,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
CDockWidget(const QString &title, QWidget* parent /TransferThis/ = 0);
|
CDockWidget(const QString &title, QWidget* parent /TransferThis/ = Q_NULLPTR);
|
||||||
virtual ~CDockWidget();
|
virtual ~CDockWidget();
|
||||||
virtual QSize minimumSizeHint() const;
|
virtual QSize minimumSizeHint() const;
|
||||||
void setWidget(QWidget* widget /Transfer/, ads::CDockWidget::eInsertMode InsertMode = AutoScrollArea);
|
void setWidget(QWidget* widget /Transfer/, ads::CDockWidget::eInsertMode InsertMode = AutoScrollArea);
|
||||||
@@ -82,6 +89,7 @@ public:
|
|||||||
void setFeatures(ads::CDockWidget::DockWidgetFeatures features);
|
void setFeatures(ads::CDockWidget::DockWidgetFeatures features);
|
||||||
void setFeature(ads::CDockWidget::DockWidgetFeature flag, bool on);
|
void setFeature(ads::CDockWidget::DockWidgetFeature flag, bool on);
|
||||||
ads::CDockWidget::DockWidgetFeatures features() const;
|
ads::CDockWidget::DockWidgetFeatures features() const;
|
||||||
|
void notifyFeaturesChanged();
|
||||||
ads::CDockManager* dockManager() const;
|
ads::CDockManager* dockManager() const;
|
||||||
ads::CDockContainerWidget* dockContainer() const;
|
ads::CDockContainerWidget* dockContainer() const;
|
||||||
ads::CFloatingDockContainer* floatingDockContainer() const;
|
ads::CFloatingDockContainer* floatingDockContainer() const;
|
||||||
@@ -95,6 +103,7 @@ public:
|
|||||||
bool isInFloatingContainer() const;
|
bool isInFloatingContainer() const;
|
||||||
bool isClosed() const;
|
bool isClosed() const;
|
||||||
QAction* toggleViewAction() const;
|
QAction* toggleViewAction() const;
|
||||||
|
void setToggleViewAction(QAction* action);
|
||||||
void setToggleViewActionMode(ads::CDockWidget::eToggleViewActionMode Mode);
|
void setToggleViewActionMode(ads::CDockWidget::eToggleViewActionMode Mode);
|
||||||
void setMinimumSizeHintMode(ads::CDockWidget::eMinimumSizeHintMode Mode);
|
void setMinimumSizeHintMode(ads::CDockWidget::eMinimumSizeHintMode Mode);
|
||||||
ads::CDockWidget::eMinimumSizeHintMode minimumSizeHintMode() const;
|
ads::CDockWidget::eMinimumSizeHintMode minimumSizeHintMode() const;
|
||||||
@@ -104,6 +113,8 @@ public:
|
|||||||
QToolBar* toolBar() const;
|
QToolBar* toolBar() const;
|
||||||
QToolBar* createDefaultToolBar();
|
QToolBar* createDefaultToolBar();
|
||||||
void setToolBar(QToolBar* ToolBar /Transfer/ );
|
void setToolBar(QToolBar* ToolBar /Transfer/ );
|
||||||
|
void setToolBarStyleSource(ads::CDockWidget::eToolBarStyleSource Source);
|
||||||
|
ads::CDockWidget::eToolBarStyleSource toolBarStyleSource() const;
|
||||||
void setToolBarStyle(Qt::ToolButtonStyle Style, ads::CDockWidget::eState State);
|
void setToolBarStyle(Qt::ToolButtonStyle Style, ads::CDockWidget::eState State);
|
||||||
Qt::ToolButtonStyle toolBarStyle(ads::CDockWidget::eState State) const;
|
Qt::ToolButtonStyle toolBarStyle(ads::CDockWidget::eState State) const;
|
||||||
void setToolBarIconSize(const QSize& IconSize, ads::CDockWidget::eState State);
|
void setToolBarIconSize(const QSize& IconSize, ads::CDockWidget::eState State);
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ protected:
|
|||||||
virtual void mouseDoubleClickEvent( QMouseEvent *ev );
|
virtual void mouseDoubleClickEvent( QMouseEvent *ev );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CElidingLabel(QWidget* parent /TransferThis/ = 0, Qt::WindowFlags f = 0);
|
CElidingLabel(QWidget* parent /TransferThis/ = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags ());
|
||||||
CElidingLabel(const QString& text, QWidget* parent /TransferThis/ = 0, Qt::WindowFlags f = 0);
|
CElidingLabel(const QString& text, QWidget* parent /TransferThis/ = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags ());
|
||||||
virtual ~CElidingLabel();
|
virtual ~CElidingLabel();
|
||||||
Qt::TextElideMode elideMode() const;
|
Qt::TextElideMode elideMode() const;
|
||||||
void setElideMode(Qt::TextElideMode mode);
|
void setElideMode(Qt::TextElideMode mode);
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ protected:
|
|||||||
void startDragging(const QPoint& DragStartMousePos, const QSize& Size,
|
void startDragging(const QPoint& DragStartMousePos, const QSize& Size,
|
||||||
QWidget* MouseEventHandler);
|
QWidget* MouseEventHandler);
|
||||||
virtual void finishDragging();
|
virtual void finishDragging();
|
||||||
|
void deleteContent();
|
||||||
void initFloatingGeometry(const QPoint& DragStartMousePos, const QSize& Size);
|
void initFloatingGeometry(const QPoint& DragStartMousePos, const QSize& Size);
|
||||||
void moveFloating();
|
void moveFloating();
|
||||||
bool restoreState(ads::CDockingStateReader& Stream, bool Testing);
|
bool restoreState(ads::CDockingStateReader& Stream, bool Testing);
|
||||||
@@ -82,6 +83,7 @@ public:
|
|||||||
bool hasTopLevelDockWidget() const;
|
bool hasTopLevelDockWidget() const;
|
||||||
ads::CDockWidget* topLevelDockWidget() const;
|
ads::CDockWidget* topLevelDockWidget() const;
|
||||||
QList<ads::CDockWidget*> dockWidgets() const;
|
QList<ads::CDockWidget*> dockWidgets() const;
|
||||||
|
void finishDropOperation();
|
||||||
|
|
||||||
%If (WS_X11)
|
%If (WS_X11)
|
||||||
void onMaximizeRequest();
|
void onMaximizeRequest();
|
||||||
|
|||||||
@@ -73,7 +73,8 @@ namespace ads
|
|||||||
TitleBarButtonTabsMenu,
|
TitleBarButtonTabsMenu,
|
||||||
TitleBarButtonUndock,
|
TitleBarButtonUndock,
|
||||||
TitleBarButtonClose,
|
TitleBarButtonClose,
|
||||||
TitleBarButtonAutoHide
|
TitleBarButtonAutoHide,
|
||||||
|
TitleBarButtonMinimize
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eDragState
|
enum eDragState
|
||||||
|
|||||||
@@ -657,6 +657,14 @@ bool CAutoHideDockContainer::event(QEvent* event)
|
|||||||
return Super::event(event);
|
return Super::event(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideDockContainer::dragLeaveEvent(QDragLeaveEvent*)
|
||||||
|
{
|
||||||
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover))
|
||||||
|
{
|
||||||
|
collapseView(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
Qt::Orientation CAutoHideDockContainer::orientation() const
|
Qt::Orientation CAutoHideDockContainer::orientation() const
|
||||||
@@ -709,4 +717,3 @@ int CAutoHideDockContainer::tabIndex() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <QSplitter>
|
#include <QSplitter>
|
||||||
#include "AutoHideTab.h"
|
#include "AutoHideTab.h"
|
||||||
|
|
||||||
class QXmlStreamWriter;
|
QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter)
|
||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
@@ -65,6 +65,7 @@ protected:
|
|||||||
virtual void resizeEvent(QResizeEvent* event) override;
|
virtual void resizeEvent(QResizeEvent* event) override;
|
||||||
virtual void leaveEvent(QEvent *event) override;
|
virtual void leaveEvent(QEvent *event) override;
|
||||||
virtual bool event(QEvent* event) override;
|
virtual bool event(QEvent* event) override;
|
||||||
|
virtual void dragLeaveEvent(QDragLeaveEvent* ev) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the size considering the size limits and the resize margins
|
* Updates the size considering the size limits and the resize margins
|
||||||
@@ -139,7 +140,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves the contents to the parent container widget
|
* Moves the contents to the parent container widget
|
||||||
* Used before removing this Auto Hide dock container
|
* Used before removing this Auto Hide dock container
|
||||||
*/
|
*/
|
||||||
void moveContentsToParent();
|
void moveContentsToParent();
|
||||||
|
|
||||||
|
|||||||
@@ -414,7 +414,14 @@ void CAutoHideSideBar::saveState(QXmlStreamWriter& s) const
|
|||||||
QSize CAutoHideSideBar::minimumSizeHint() const
|
QSize CAutoHideSideBar::minimumSizeHint() const
|
||||||
{
|
{
|
||||||
QSize Size = sizeHint();
|
QSize Size = sizeHint();
|
||||||
Size.setWidth(10);
|
if (d->isHorizontal())
|
||||||
|
{
|
||||||
|
Size.setWidth(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Size.setHeight(0);
|
||||||
|
}
|
||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#include "ads_globals.h"
|
#include "ads_globals.h"
|
||||||
#include "AutoHideTab.h"
|
#include "AutoHideTab.h"
|
||||||
|
|
||||||
class QXmlStreamWriter;
|
QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter)
|
||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QElapsedTimer>
|
#include <QElapsedTimer>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
#include "AutoHideDockContainer.h"
|
#include "AutoHideDockContainer.h"
|
||||||
#include "AutoHideSideBar.h"
|
#include "AutoHideSideBar.h"
|
||||||
@@ -41,10 +43,10 @@
|
|||||||
#include "DockWidget.h"
|
#include "DockWidget.h"
|
||||||
#include "FloatingDragPreview.h"
|
#include "FloatingDragPreview.h"
|
||||||
#include "DockOverlay.h"
|
#include "DockOverlay.h"
|
||||||
|
#include "ads_globals.h"
|
||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
static const char* const LocationProperty = "Location";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data class of CDockWidgetTab class (pimpl)
|
* Private data class of CDockWidgetTab class (pimpl)
|
||||||
@@ -56,6 +58,7 @@ struct AutoHideTabPrivate
|
|||||||
CAutoHideSideBar* SideBar = nullptr;
|
CAutoHideSideBar* SideBar = nullptr;
|
||||||
Qt::Orientation Orientation{Qt::Vertical};
|
Qt::Orientation Orientation{Qt::Vertical};
|
||||||
QElapsedTimer TimeSinceHoverMousePress;
|
QElapsedTimer TimeSinceHoverMousePress;
|
||||||
|
QTimer DragOverTimer;
|
||||||
bool MousePressed = false;
|
bool MousePressed = false;
|
||||||
eDragState DragState = DraggingInactive;
|
eDragState DragState = DraggingInactive;
|
||||||
QPoint GlobalDragStartMousePosition;
|
QPoint GlobalDragStartMousePosition;
|
||||||
@@ -102,7 +105,7 @@ struct AutoHideTabPrivate
|
|||||||
QMenu* Menu)
|
QMenu* Menu)
|
||||||
{
|
{
|
||||||
auto Action = Menu->addAction(Title);
|
auto Action = Menu->addAction(Title);
|
||||||
Action->setProperty("Location", Location);
|
Action->setProperty(internal::LocationProperty, Location);
|
||||||
QObject::connect(Action, &QAction::triggered, _this, &CAutoHideTab::onAutoHideToActionClicked);
|
QObject::connect(Action, &QAction::triggered, _this, &CAutoHideTab::onAutoHideToActionClicked);
|
||||||
Action->setEnabled(Location != _this->sideBarLocation());
|
Action->setEnabled(Location != _this->sideBarLocation());
|
||||||
return Action;
|
return Action;
|
||||||
@@ -174,7 +177,7 @@ void AutoHideTabPrivate::updateOrientation()
|
|||||||
bool AutoHideTabPrivate::startFloating(eDragState DraggingState)
|
bool AutoHideTabPrivate::startFloating(eDragState DraggingState)
|
||||||
{
|
{
|
||||||
auto DockArea = DockWidget->dockAreaWidget();
|
auto DockArea = DockWidget->dockAreaWidget();
|
||||||
ADS_PRINT("isFloating " << dockContainer->isFloating());
|
ADS_PRINT("isFloating " << dockContainer()->isFloating());
|
||||||
|
|
||||||
ADS_PRINT("startFloating");
|
ADS_PRINT("startFloating");
|
||||||
DragState = DraggingState;
|
DragState = DraggingState;
|
||||||
@@ -253,6 +256,14 @@ CAutoHideTab::CAutoHideTab(QWidget* parent) :
|
|||||||
{
|
{
|
||||||
setAttribute(Qt::WA_NoMousePropagation);
|
setAttribute(Qt::WA_NoMousePropagation);
|
||||||
setFocusPolicy(Qt::NoFocus);
|
setFocusPolicy(Qt::NoFocus);
|
||||||
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover)) {
|
||||||
|
setAcceptDrops(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
d->DragOverTimer.setInterval(CDockManager::configParam(
|
||||||
|
CDockManager::AutoHideOpenOnDragHoverDelay_ms, 500).toInt());
|
||||||
|
d->DragOverTimer.setSingleShot(true);
|
||||||
|
connect(&d->DragOverTimer, &QTimer::timeout, this, &CAutoHideTab::onDragHoverDelayExpired);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -356,7 +367,6 @@ bool CAutoHideTab::event(QEvent* event)
|
|||||||
case QEvent::Leave:
|
case QEvent::Leave:
|
||||||
d->forwardEventToDockContainer(event);
|
d->forwardEventToDockContainer(event);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -419,7 +429,7 @@ void CAutoHideTab::unpinDockWidget()
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
void CAutoHideTab::onAutoHideToActionClicked()
|
void CAutoHideTab::onAutoHideToActionClicked()
|
||||||
{
|
{
|
||||||
int Location = sender()->property(LocationProperty).toInt();
|
int Location = sender()->property(internal::LocationProperty).toInt();
|
||||||
d->DockWidget->setAutoHide(true, (SideBarLocation)Location);
|
d->DockWidget->setAutoHide(true, (SideBarLocation)Location);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,48 +504,74 @@ void CAutoHideTab::mouseReleaseEvent(QMouseEvent* ev)
|
|||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CAutoHideTab::mouseMoveEvent(QMouseEvent* ev)
|
void CAutoHideTab::mouseMoveEvent(QMouseEvent *ev)
|
||||||
{
|
{
|
||||||
if (!(ev->buttons() & Qt::LeftButton) || d->isDraggingState(DraggingInactive))
|
if (!(ev->buttons() & Qt::LeftButton)
|
||||||
{
|
|| d->isDraggingState(DraggingInactive))
|
||||||
d->DragState = DraggingInactive;
|
|
||||||
Super::mouseMoveEvent(ev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// move floating window
|
|
||||||
if (d->isDraggingState(DraggingFloatingWidget))
|
|
||||||
{
|
|
||||||
d->FloatingWidget->moveFloating();
|
|
||||||
Super::mouseMoveEvent(ev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// move tab
|
|
||||||
if (d->isDraggingState(DraggingTab))
|
|
||||||
{
|
|
||||||
// Moving the tab is always allowed because it does not mean moving the
|
|
||||||
// dock widget around
|
|
||||||
//d->moveTab(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto MappedPos = mapToParent(ev->pos());
|
|
||||||
bool MouseOutsideBar = (MappedPos.x() < 0) || (MappedPos.x() > parentWidget()->rect().right());
|
|
||||||
// Maybe a fixed drag distance is better here ?
|
|
||||||
int DragDistanceY = qAbs(d->GlobalDragStartMousePosition.y() - internal::globalPositionOf(ev).y());
|
|
||||||
if (DragDistanceY >= CDockManager::startDragDistance() || MouseOutsideBar)
|
|
||||||
{
|
{
|
||||||
// Floating is only allowed for widgets that are floatable
|
d->DragState = DraggingInactive;
|
||||||
// We can create the drag preview if the widget is movable.
|
Super::mouseMoveEvent(ev);
|
||||||
auto Features = d->DockWidget->features();
|
return;
|
||||||
if (Features.testFlag(CDockWidget::DockWidgetFloatable) || (Features.testFlag(CDockWidget::DockWidgetMovable)))
|
|
||||||
{
|
|
||||||
d->startFloating();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Super::mouseMoveEvent(ev);
|
// move floating window
|
||||||
|
if (d->isDraggingState(DraggingFloatingWidget))
|
||||||
|
{
|
||||||
|
d->FloatingWidget->moveFloating();
|
||||||
|
Super::mouseMoveEvent(ev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// move tab
|
||||||
|
if (d->isDraggingState(DraggingTab))
|
||||||
|
{
|
||||||
|
// Moving the tab is always allowed because it does not mean moving the
|
||||||
|
// dock widget around
|
||||||
|
//d->moveTab(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto MappedPos = mapToParent(ev->pos());
|
||||||
|
bool MouseOutsideBar = (MappedPos.x() < 0)
|
||||||
|
|| (MappedPos.x() > parentWidget()->rect().right());
|
||||||
|
// Maybe a fixed drag distance is better here ?
|
||||||
|
int DragDistanceY = qAbs(
|
||||||
|
d->GlobalDragStartMousePosition.y()
|
||||||
|
- internal::globalPositionOf(ev).y());
|
||||||
|
if (DragDistanceY >= CDockManager::startDragDistance() || MouseOutsideBar)
|
||||||
|
{
|
||||||
|
// Floating is only allowed for widgets that are floatable
|
||||||
|
// We can create the drag preview if the widget is movable.
|
||||||
|
auto Features = d->DockWidget->features();
|
||||||
|
if (Features.testFlag(CDockWidget::DockWidgetFloatable)
|
||||||
|
|| (Features.testFlag(CDockWidget::DockWidgetMovable)))
|
||||||
|
{
|
||||||
|
d->startFloating();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Super::mouseMoveEvent(ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideTab::dragEnterEvent(QDragEnterEvent *ev)
|
||||||
|
{
|
||||||
|
Q_UNUSED(ev);
|
||||||
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover))
|
||||||
|
{
|
||||||
|
d->DragOverTimer.start();
|
||||||
|
ev->accept();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideTab::dragLeaveEvent(QDragLeaveEvent *ev)
|
||||||
|
{
|
||||||
|
Q_UNUSED(ev);
|
||||||
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideOpenOnDragHover))
|
||||||
|
{
|
||||||
|
d->DragOverTimer.stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -545,7 +581,6 @@ void CAutoHideTab::requestCloseDockWidget()
|
|||||||
d->DockWidget->requestCloseDockWidget();
|
d->DockWidget->requestCloseDockWidget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
int CAutoHideTab::tabIndex() const
|
int CAutoHideTab::tabIndex() const
|
||||||
{
|
{
|
||||||
@@ -558,4 +593,28 @@ int CAutoHideTab::tabIndex() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CAutoHideTab::onDragHoverDelayExpired()
|
||||||
|
{
|
||||||
|
static const char* const PropertyId = "ActiveDragOverAutoHideContainer";
|
||||||
|
|
||||||
|
// First we check if there is an active auto hide container that is visible
|
||||||
|
// In this case, we collapse it before we open the new one
|
||||||
|
auto v = d->DockWidget->dockManager()->property(PropertyId);
|
||||||
|
if (v.isValid())
|
||||||
|
{
|
||||||
|
auto ActiveAutoHideContainer = v.value<QPointer<CAutoHideDockContainer>>();
|
||||||
|
if (ActiveAutoHideContainer)
|
||||||
|
{
|
||||||
|
ActiveAutoHideContainer->collapseView(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto AutoHideContainer = d->DockWidget->autoHideDockContainer();
|
||||||
|
AutoHideContainer->collapseView(false);
|
||||||
|
d->DockWidget->dockManager()->setProperty(PropertyId,
|
||||||
|
QVariant::fromValue(QPointer<CAutoHideDockContainer>(AutoHideContainer)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class ADS_EXPORT CAutoHideTab : public CPushButton
|
|||||||
Q_PROPERTY(bool activeTab READ isActiveTab)
|
Q_PROPERTY(bool activeTab READ isActiveTab)
|
||||||
Q_PROPERTY(bool iconOnly READ iconOnly)
|
Q_PROPERTY(bool iconOnly READ iconOnly)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AutoHideTabPrivate* d; ///< private data (pimpl)
|
AutoHideTabPrivate* d; ///< private data (pimpl)
|
||||||
friend struct AutoHideTabPrivate;
|
friend struct AutoHideTabPrivate;
|
||||||
friend class CDockWidget;
|
friend class CDockWidget;
|
||||||
@@ -67,6 +67,7 @@ private:
|
|||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void onAutoHideToActionClicked();
|
void onAutoHideToActionClicked();
|
||||||
|
void onDragHoverDelayExpired();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setSideBar(CAutoHideSideBar *SideTabBar);
|
void setSideBar(CAutoHideSideBar *SideTabBar);
|
||||||
@@ -76,6 +77,8 @@ protected:
|
|||||||
virtual void mousePressEvent(QMouseEvent* ev) override;
|
virtual void mousePressEvent(QMouseEvent* ev) override;
|
||||||
virtual void mouseReleaseEvent(QMouseEvent* ev) override;
|
virtual void mouseReleaseEvent(QMouseEvent* ev) override;
|
||||||
virtual void mouseMoveEvent(QMouseEvent* ev) override;
|
virtual void mouseMoveEvent(QMouseEvent* ev) override;
|
||||||
|
virtual void dragEnterEvent(QDragEnterEvent* ev) override;
|
||||||
|
virtual void dragLeaveEvent(QDragLeaveEvent* ev) override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using Super = CPushButton;
|
using Super = CPushButton;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.5)
|
cmake_minimum_required(VERSION 3.5)
|
||||||
project(QtAdvancedDockingSystem LANGUAGES CXX VERSION ${VERSION_SHORT})
|
project(QtAdvancedDockingSystem LANGUAGES CXX VERSION ${VERSION_SHORT})
|
||||||
|
include(GNUInstallDirs)
|
||||||
if (${QT_VERSION_MAJOR})
|
if (${QT_VERSION_MAJOR})
|
||||||
message(STATUS "Forced to use Qt version ${QT_VERSION_MAJOR}")
|
message(STATUS "Forced to use Qt version ${QT_VERSION_MAJOR}")
|
||||||
find_package(QT NAMES Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
|
find_package(QT NAMES Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
|
||||||
@@ -36,7 +37,7 @@ set(ads_SRCS
|
|||||||
AutoHideTab.cpp
|
AutoHideTab.cpp
|
||||||
AutoHideDockContainer.cpp
|
AutoHideDockContainer.cpp
|
||||||
PushButton.cpp
|
PushButton.cpp
|
||||||
ResizeHandle.cpp
|
ResizeHandle.cpp
|
||||||
ads.qrc
|
ads.qrc
|
||||||
)
|
)
|
||||||
set(ads_HEADERS
|
set(ads_HEADERS
|
||||||
@@ -62,7 +63,7 @@ set(ads_HEADERS
|
|||||||
AutoHideTab.h
|
AutoHideTab.h
|
||||||
AutoHideDockContainer.h
|
AutoHideDockContainer.h
|
||||||
PushButton.h
|
PushButton.h
|
||||||
ResizeHandle.h
|
ResizeHandle.h
|
||||||
)
|
)
|
||||||
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
|
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
|
||||||
if (UNIX AND NOT APPLE)
|
if (UNIX AND NOT APPLE)
|
||||||
@@ -120,7 +121,7 @@ write_basic_package_version_file(
|
|||||||
COMPATIBILITY SameMajorVersion
|
COMPATIBILITY SameMajorVersion
|
||||||
)
|
)
|
||||||
install(FILES ${ads_HEADERS}
|
install(FILES ${ads_HEADERS}
|
||||||
DESTINATION include/${library_name}
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${library_name}
|
||||||
COMPONENT headers
|
COMPONENT headers
|
||||||
)
|
)
|
||||||
install(FILES
|
install(FILES
|
||||||
@@ -131,25 +132,25 @@ install(FILES
|
|||||||
)
|
)
|
||||||
install(TARGETS ${library_name}
|
install(TARGETS ${library_name}
|
||||||
EXPORT adsTargets
|
EXPORT adsTargets
|
||||||
RUNTIME DESTINATION bin
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
LIBRARY DESTINATION lib
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION lib
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
INCLUDES DESTINATION include/${library_name}
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${library_name}
|
||||||
)
|
)
|
||||||
|
|
||||||
install(EXPORT adsTargets
|
install(EXPORT adsTargets
|
||||||
FILE adsTargets.cmake
|
FILE adsTargets.cmake
|
||||||
NAMESPACE ads::
|
NAMESPACE ads::
|
||||||
DESTINATION lib/cmake/${library_name}
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${library_name}
|
||||||
)
|
)
|
||||||
install(FILES qtadvanceddockingConfig.cmake RENAME ${library_name}Config.cmake
|
install(FILES qtadvanceddockingConfig.cmake RENAME ${library_name}Config.cmake
|
||||||
DESTINATION lib/cmake/${library_name}
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${library_name}
|
||||||
)
|
)
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${library_name}ConfigVersion.cmake"
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${library_name}ConfigVersion.cmake"
|
||||||
DESTINATION lib/cmake/${library_name}
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${library_name}
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(${library_name} PUBLIC
|
target_include_directories(${library_name} PUBLIC
|
||||||
$<INSTALL_INTERFACE:include>
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -111,8 +111,9 @@ void DockAreaTabBarPrivate::updateTabs()
|
|||||||
// Sometimes the synchronous calculation of the rectangular area fails
|
// Sometimes the synchronous calculation of the rectangular area fails
|
||||||
// Therefore we use QTimer::singleShot here to execute the call
|
// Therefore we use QTimer::singleShot here to execute the call
|
||||||
// within the event loop - see #520
|
// within the event loop - see #520
|
||||||
QTimer::singleShot(0, [&, TabWidget]{
|
QTimer::singleShot(0, _this, [&, TabWidget]
|
||||||
_this->ensureWidgetVisible(TabWidget);
|
{
|
||||||
|
_this->ensureWidgetVisible(TabWidget);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -160,15 +161,13 @@ CDockAreaTabBar::~CDockAreaTabBar()
|
|||||||
void CDockAreaTabBar::wheelEvent(QWheelEvent* Event)
|
void CDockAreaTabBar::wheelEvent(QWheelEvent* Event)
|
||||||
{
|
{
|
||||||
Event->accept();
|
Event->accept();
|
||||||
const int direction = Event->angleDelta().y();
|
int numPixels = Event->pixelDelta().y();
|
||||||
if (direction < 0)
|
if (!numPixels)
|
||||||
{
|
{
|
||||||
horizontalScrollBar()->setValue(horizontalScrollBar()->value() + 20);
|
numPixels = Event->angleDelta().y() / 5;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
horizontalScrollBar()->setValue(horizontalScrollBar()->value() - numPixels);
|
||||||
horizontalScrollBar()->setValue(horizontalScrollBar()->value() - 20);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -389,15 +388,18 @@ void CDockAreaTabBar::onTabWidgetMoved(const QPoint& GlobalPos)
|
|||||||
|
|
||||||
int fromIndex = d->TabsLayout->indexOf(MovingTab);
|
int fromIndex = d->TabsLayout->indexOf(MovingTab);
|
||||||
auto MousePos = mapFromGlobal(GlobalPos);
|
auto MousePos = mapFromGlobal(GlobalPos);
|
||||||
MousePos.rx() = qMax(d->firstTab()->geometry().left(), MousePos.x());
|
MousePos.rx() = qMax(0, MousePos.x());
|
||||||
MousePos.rx() = qMin(d->lastTab()->geometry().right(), MousePos.x());
|
MousePos.rx() = qMin(width(), MousePos.x());
|
||||||
int toIndex = -1;
|
int toIndex = -1;
|
||||||
// Find tab under mouse
|
// Find tab under mouse
|
||||||
for (int i = 0; i < count(); ++i)
|
for (int i = 0; i < count(); ++i)
|
||||||
{
|
{
|
||||||
CDockWidgetTab* DropTab = tab(i);
|
CDockWidgetTab* DropTab = tab(i);
|
||||||
|
auto TabGeometry = DropTab->geometry();
|
||||||
|
TabGeometry.setTopLeft(d->TabsContainerWidget->mapToParent(TabGeometry.topLeft()));
|
||||||
|
TabGeometry.setBottomRight(d->TabsContainerWidget->mapToParent(TabGeometry.bottomRight()));
|
||||||
if (DropTab == MovingTab || !DropTab->isVisibleTo(this)
|
if (DropTab == MovingTab || !DropTab->isVisibleTo(this)
|
||||||
|| !DropTab->geometry().contains(MousePos))
|
|| !TabGeometry.contains(MousePos))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -469,6 +471,15 @@ bool CDockAreaTabBar::eventFilter(QObject *watched, QEvent *event)
|
|||||||
updateGeometry();
|
updateGeometry();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// Manage wheel event
|
||||||
|
case QEvent::Wheel:
|
||||||
|
// Ignore wheel events if tab is currently dragged
|
||||||
|
if (Tab->dragState() == DraggingInactive)
|
||||||
|
{
|
||||||
|
wheelEvent((QWheelEvent* )event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -544,6 +555,13 @@ int CDockAreaTabBar::tabInsertIndexAt(const QPoint& Pos) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
bool CDockAreaTabBar::areTabsOverflowing() const
|
||||||
|
{
|
||||||
|
return d->TabsContainerWidget->width() > width();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ads
|
} // namespace ads
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -153,6 +153,12 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual QSize sizeHint() const override;
|
virtual QSize sizeHint() const override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function returns true, if the tabs need more space than the size
|
||||||
|
* of the tab bar.
|
||||||
|
*/
|
||||||
|
bool areTabsOverflowing() const;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
* This property sets the index of the tab bar's visible tab
|
* This property sets the index of the tab bar's visible tab
|
||||||
|
|||||||
@@ -60,7 +60,6 @@
|
|||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
static const char* const LocationProperty = "Location";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data class of CDockAreaTitleBar class (pimpl)
|
* Private data class of CDockAreaTitleBar class (pimpl)
|
||||||
@@ -159,7 +158,7 @@ struct DockAreaTitleBarPrivate
|
|||||||
QMenu* Menu)
|
QMenu* Menu)
|
||||||
{
|
{
|
||||||
auto Action = Menu->addAction(Title);
|
auto Action = Menu->addAction(Title);
|
||||||
Action->setProperty("Location", Location);
|
Action->setProperty(internal::LocationProperty, Location);
|
||||||
QObject::connect(Action, &QAction::triggered, _this, &CDockAreaTitleBar::onAutoHideToActionClicked);
|
QObject::connect(Action, &QAction::triggered, _this, &CDockAreaTitleBar::onAutoHideToActionClicked);
|
||||||
return Action;
|
return Action;
|
||||||
}
|
}
|
||||||
@@ -179,7 +178,8 @@ void DockAreaTitleBarPrivate::createButtons()
|
|||||||
QSizePolicy ButtonSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
|
QSizePolicy ButtonSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
|
||||||
|
|
||||||
// Tabs menu button
|
// Tabs menu button
|
||||||
TabsMenuButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasTabsMenuButton));
|
TabsMenuButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasTabsMenuButton),
|
||||||
|
false, TitleBarButtonTabsMenu);
|
||||||
TabsMenuButton->setObjectName("tabsMenuButton");
|
TabsMenuButton->setObjectName("tabsMenuButton");
|
||||||
TabsMenuButton->setAutoRaise(true);
|
TabsMenuButton->setAutoRaise(true);
|
||||||
TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
|
TabsMenuButton->setPopupMode(QToolButton::InstantPopup);
|
||||||
@@ -197,7 +197,8 @@ void DockAreaTitleBarPrivate::createButtons()
|
|||||||
SLOT(onTabsMenuActionTriggered(QAction*)));
|
SLOT(onTabsMenuActionTriggered(QAction*)));
|
||||||
|
|
||||||
// Undock button
|
// Undock button
|
||||||
UndockButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasUndockButton));
|
UndockButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasUndockButton),
|
||||||
|
true, TitleBarButtonUndock);
|
||||||
UndockButton->setObjectName("detachGroupButton");
|
UndockButton->setObjectName("detachGroupButton");
|
||||||
UndockButton->setAutoRaise(true);
|
UndockButton->setAutoRaise(true);
|
||||||
internal::setToolTip(UndockButton, QObject::tr("Detach Group"));
|
internal::setToolTip(UndockButton, QObject::tr("Detach Group"));
|
||||||
@@ -208,7 +209,8 @@ void DockAreaTitleBarPrivate::createButtons()
|
|||||||
|
|
||||||
// AutoHide Button
|
// AutoHide Button
|
||||||
const auto autoHideEnabled = testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled);
|
const auto autoHideEnabled = testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled);
|
||||||
AutoHideButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::DockAreaHasAutoHideButton) && autoHideEnabled);
|
AutoHideButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::DockAreaHasAutoHideButton) && autoHideEnabled,
|
||||||
|
true, TitleBarButtonAutoHide);
|
||||||
AutoHideButton->setObjectName("dockAreaAutoHideButton");
|
AutoHideButton->setObjectName("dockAreaAutoHideButton");
|
||||||
AutoHideButton->setAutoRaise(true);
|
AutoHideButton->setAutoRaise(true);
|
||||||
internal::setToolTip(AutoHideButton, _this->titleBarButtonToolTip(TitleBarButtonAutoHide));
|
internal::setToolTip(AutoHideButton, _this->titleBarButtonToolTip(TitleBarButtonAutoHide));
|
||||||
@@ -220,7 +222,8 @@ void DockAreaTitleBarPrivate::createButtons()
|
|||||||
_this->connect(AutoHideButton, SIGNAL(clicked()), SLOT(onAutoHideButtonClicked()));
|
_this->connect(AutoHideButton, SIGNAL(clicked()), SLOT(onAutoHideButtonClicked()));
|
||||||
|
|
||||||
// Minimize button
|
// Minimize button
|
||||||
MinimizeButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::AutoHideHasMinimizeButton));
|
MinimizeButton = new CTitleBarButton(testAutoHideConfigFlag(CDockManager::AutoHideHasMinimizeButton),
|
||||||
|
false, TitleBarButtonMinimize);
|
||||||
MinimizeButton->setObjectName("dockAreaMinimizeButton");
|
MinimizeButton->setObjectName("dockAreaMinimizeButton");
|
||||||
MinimizeButton->setAutoRaise(true);
|
MinimizeButton->setAutoRaise(true);
|
||||||
MinimizeButton->setVisible(false);
|
MinimizeButton->setVisible(false);
|
||||||
@@ -231,7 +234,8 @@ void DockAreaTitleBarPrivate::createButtons()
|
|||||||
_this->connect(MinimizeButton, SIGNAL(clicked()), SLOT(minimizeAutoHideContainer()));
|
_this->connect(MinimizeButton, SIGNAL(clicked()), SLOT(minimizeAutoHideContainer()));
|
||||||
|
|
||||||
// Close button
|
// Close button
|
||||||
CloseButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasCloseButton));
|
CloseButton = new CTitleBarButton(testConfigFlag(CDockManager::DockAreaHasCloseButton),
|
||||||
|
true, TitleBarButtonClose);
|
||||||
CloseButton->setObjectName("dockAreaCloseButton");
|
CloseButton->setObjectName("dockAreaCloseButton");
|
||||||
CloseButton->setAutoRaise(true);
|
CloseButton->setAutoRaise(true);
|
||||||
internal::setButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
|
internal::setButtonIcon(CloseButton, QStyle::SP_TitleBarCloseButton, ads::DockAreaCloseIcon);
|
||||||
@@ -373,27 +377,48 @@ CDockAreaTabBar* CDockAreaTitleBar::tabBar() const
|
|||||||
return d->TabBar;
|
return d->TabBar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CDockAreaTitleBar::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
Super::resizeEvent(event);
|
||||||
|
if (CDockManager::testConfigFlag(CDockManager::DockAreaDynamicTabsMenuButtonVisibility)
|
||||||
|
&& CDockManager::testConfigFlag(CDockManager::DisableTabTextEliding))
|
||||||
|
{
|
||||||
|
markTabsMenuOutdated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CDockAreaTitleBar::markTabsMenuOutdated()
|
void CDockAreaTitleBar::markTabsMenuOutdated()
|
||||||
{
|
{
|
||||||
if(DockAreaTitleBarPrivate::testConfigFlag(CDockManager::DockAreaDynamicTabsMenuButtonVisibility))
|
if (CDockManager::testConfigFlag(CDockManager::DockAreaDynamicTabsMenuButtonVisibility))
|
||||||
{
|
{
|
||||||
bool hasElidedTabTitle = false;
|
bool TabsMenuButtonVisible = false;
|
||||||
for (int i = 0; i < d->TabBar->count(); ++i)
|
if (CDockManager::testConfigFlag(CDockManager::DisableTabTextEliding))
|
||||||
{
|
{
|
||||||
if (!d->TabBar->isTabOpen(i))
|
TabsMenuButtonVisible = d->TabBar->areTabsOverflowing();
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
CDockWidgetTab* Tab = d->TabBar->tab(i);
|
|
||||||
if(Tab->isTitleElided())
|
|
||||||
{
|
|
||||||
hasElidedTabTitle = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
bool visible = (hasElidedTabTitle && (d->TabBar->count() > 1));
|
else
|
||||||
QMetaObject::invokeMethod(d->TabsMenuButton, "setVisible", Qt::QueuedConnection, Q_ARG(bool, visible));
|
{
|
||||||
|
bool hasElidedTabTitle = false;
|
||||||
|
for (int i = 0; i < d->TabBar->count(); ++i)
|
||||||
|
{
|
||||||
|
if (!d->TabBar->isTabOpen(i))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
CDockWidgetTab* Tab = d->TabBar->tab(i);
|
||||||
|
if(Tab->isTitleElided())
|
||||||
|
{
|
||||||
|
hasElidedTabTitle = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TabsMenuButtonVisible = (hasElidedTabTitle && (d->TabBar->count() > 1));
|
||||||
|
}
|
||||||
|
QMetaObject::invokeMethod(d->TabsMenuButton, "setVisible", Qt::QueuedConnection, Q_ARG(bool, TabsMenuButtonVisible));
|
||||||
}
|
}
|
||||||
d->MenuOutdated = true;
|
d->MenuOutdated = true;
|
||||||
}
|
}
|
||||||
@@ -510,7 +535,7 @@ void CDockAreaTitleBar::updateDockWidgetActionsButtons()
|
|||||||
int InsertIndex = indexOf(d->TabsMenuButton);
|
int InsertIndex = indexOf(d->TabsMenuButton);
|
||||||
for (auto Action : Actions)
|
for (auto Action : Actions)
|
||||||
{
|
{
|
||||||
auto Button = new CTitleBarButton(true, this);
|
auto Button = new CTitleBarButton(true, false, TitleBarButtonTabsMenu, this);
|
||||||
Button->setDefaultAction(Action);
|
Button->setDefaultAction(Action);
|
||||||
Button->setAutoRaise(true);
|
Button->setAutoRaise(true);
|
||||||
Button->setPopupMode(QToolButton::InstantPopup);
|
Button->setPopupMode(QToolButton::InstantPopup);
|
||||||
@@ -564,7 +589,7 @@ void CDockAreaTitleBar::onAutoHideDockAreaActionClicked()
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
void CDockAreaTitleBar::onAutoHideToActionClicked()
|
void CDockAreaTitleBar::onAutoHideToActionClicked()
|
||||||
{
|
{
|
||||||
int Location = sender()->property(LocationProperty).toInt();
|
int Location = sender()->property(internal::LocationProperty).toInt();
|
||||||
d->DockArea->toggleAutoHide((SideBarLocation)Location);
|
d->DockArea->toggleAutoHide((SideBarLocation)Location);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -740,24 +765,35 @@ void CDockAreaTitleBar::contextMenuEvent(QContextMenuEvent* ev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool isAutoHide = d->DockArea->isAutoHide();
|
auto Menu = buildContextMenu(nullptr);
|
||||||
|
Menu->exec(ev->globalPos());
|
||||||
|
delete Menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
QMenu* CDockAreaTitleBar::buildContextMenu(QMenu *Menu)
|
||||||
|
{
|
||||||
|
const bool isAutoHide = d->DockArea->isAutoHide();
|
||||||
const bool isTopLevelArea = d->DockArea->isTopLevelArea();
|
const bool isTopLevelArea = d->DockArea->isTopLevelArea();
|
||||||
QAction* Action;
|
QAction* Action;
|
||||||
QMenu Menu(this);
|
if (Menu == nullptr)
|
||||||
if (!isTopLevelArea)
|
{
|
||||||
|
Menu = new QMenu(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isTopLevelArea)
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(isAutoHide ? tr("Detach") : tr("Detach Group"),
|
Action = Menu->addAction(isAutoHide ? tr("Detach") : tr("Detach Group"),
|
||||||
this, SLOT(onUndockButtonClicked()));
|
this, SLOT(onUndockButtonClicked()));
|
||||||
Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetFloatable));
|
Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetFloatable));
|
||||||
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled))
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled))
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(isAutoHide ? tr("Unpin (Dock)") : tr("Pin Group"), this, SLOT(onAutoHideDockAreaActionClicked()));
|
Action = Menu->addAction(isAutoHide ? tr("Unpin (Dock)") : tr("Pin Group"), this, SLOT(onAutoHideDockAreaActionClicked()));
|
||||||
auto AreaIsPinnable = d->DockArea->features().testFlag(CDockWidget::DockWidgetPinnable);
|
auto AreaIsPinnable = d->DockArea->features().testFlag(CDockWidget::DockWidgetPinnable);
|
||||||
Action->setEnabled(AreaIsPinnable);
|
Action->setEnabled(AreaIsPinnable);
|
||||||
|
|
||||||
if (!isAutoHide)
|
if (!isAutoHide)
|
||||||
{
|
{
|
||||||
auto menu = Menu.addMenu(tr("Pin Group To..."));
|
auto menu = Menu->addMenu(tr("Pin Group To..."));
|
||||||
menu->setEnabled(AreaIsPinnable);
|
menu->setEnabled(AreaIsPinnable);
|
||||||
d->createAutoHideToAction(tr("Top"), SideBarTop, menu);
|
d->createAutoHideToAction(tr("Top"), SideBarTop, menu);
|
||||||
d->createAutoHideToAction(tr("Left"), SideBarLeft, menu);
|
d->createAutoHideToAction(tr("Left"), SideBarLeft, menu);
|
||||||
@@ -765,28 +801,27 @@ void CDockAreaTitleBar::contextMenuEvent(QContextMenuEvent* ev)
|
|||||||
d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu);
|
d->createAutoHideToAction(tr("Bottom"), SideBarBottom, menu);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Menu.addSeparator();
|
Menu->addSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isAutoHide)
|
if (isAutoHide)
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(tr("Minimize"), this, SLOT(minimizeAutoHideContainer()));
|
Action = Menu->addAction(tr("Minimize"), this, SLOT(minimizeAutoHideContainer()));
|
||||||
Action = Menu.addAction(tr("Close"), this, SLOT(onAutoHideCloseActionTriggered()));
|
Action = Menu->addAction(tr("Close"), this, SLOT(onAutoHideCloseActionTriggered()));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(isAutoHide ? tr("Close") : tr("Close Group"), this, SLOT(onCloseButtonClicked()));
|
Action = Menu->addAction(isAutoHide ? tr("Close") : tr("Close Group"), this, SLOT(onCloseButtonClicked()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetClosable));
|
Action->setEnabled(d->DockArea->features().testFlag(CDockWidget::DockWidgetClosable));
|
||||||
if (!isAutoHide && !isTopLevelArea)
|
if (!isAutoHide && !isTopLevelArea)
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(tr("Close Other Groups"), d->DockArea, SLOT(closeOtherAreas()));
|
Action = Menu->addAction(tr("Close Other Groups"), d->DockArea, SLOT(closeOtherAreas()));
|
||||||
}
|
}
|
||||||
Menu.exec(ev->globalPos());
|
return Menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CDockAreaTitleBar::insertWidget(int index, QWidget *widget)
|
void CDockAreaTitleBar::insertWidget(int index, QWidget *widget)
|
||||||
{
|
{
|
||||||
@@ -856,10 +891,25 @@ void CDockAreaTitleBar::showAutoHideControls(bool Show)
|
|||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CTitleBarButton::CTitleBarButton(bool showInTitleBar, QWidget* parent)
|
bool CDockAreaTitleBar::isAutoHide() const
|
||||||
|
{
|
||||||
|
return d->DockArea && d->DockArea->isAutoHide();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CDockAreaWidget* CDockAreaTitleBar::dockAreaWidget() const
|
||||||
|
{
|
||||||
|
return d->DockArea;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CTitleBarButton::CTitleBarButton(bool showInTitleBar, bool hideWhenDisabled, TitleBarButton ButtonId, QWidget* parent)
|
||||||
: tTitleBarButton(parent),
|
: tTitleBarButton(parent),
|
||||||
ShowInTitleBar(showInTitleBar),
|
ShowInTitleBar(showInTitleBar),
|
||||||
HideWhenDisabled(CDockManager::testConfigFlag(CDockManager::DockAreaHideDisabledButtons))
|
HideWhenDisabled(CDockManager::testConfigFlag(CDockManager::DockAreaHideDisabledButtons) && hideWhenDisabled),
|
||||||
|
TitleBarButtonId(ButtonId)
|
||||||
{
|
{
|
||||||
setFocusPolicy(Qt::NoFocus);
|
setFocusPolicy(Qt::NoFocus);
|
||||||
}
|
}
|
||||||
@@ -894,16 +944,47 @@ void CTitleBarButton::setShowInTitleBar(bool Show)
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
bool CTitleBarButton::event(QEvent *ev)
|
bool CTitleBarButton::event(QEvent *ev)
|
||||||
{
|
{
|
||||||
if (QEvent::EnabledChange == ev->type() && HideWhenDisabled)
|
if (QEvent::EnabledChange != ev->type() || !HideWhenDisabled || !ShowInTitleBar)
|
||||||
{
|
{
|
||||||
// force setVisible() call
|
return Super::event(ev);
|
||||||
// Calling setVisible() directly here doesn't work well when button is expected to be shown first time
|
|
||||||
QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection, Q_ARG(bool, isEnabled()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Show = true;
|
||||||
|
if (isInAutoHideArea())
|
||||||
|
{
|
||||||
|
switch (TitleBarButtonId)
|
||||||
|
{
|
||||||
|
case TitleBarButtonClose: Show = CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton); break;
|
||||||
|
case TitleBarButtonUndock: Show = false; break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// force setVisible() call - Calling setVisible() directly here doesn't
|
||||||
|
// work well when button is expected to be shown first time
|
||||||
|
QMetaObject::invokeMethod(this, "setVisible", Qt::QueuedConnection,
|
||||||
|
Q_ARG(bool, isEnabledTo(this->parentWidget()) & Show));
|
||||||
|
|
||||||
return Super::event(ev);
|
return Super::event(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CDockAreaTitleBar* CTitleBarButton::titleBar() const
|
||||||
|
{
|
||||||
|
return qobject_cast<CDockAreaTitleBar*>(parentWidget());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
bool CTitleBarButton::isInAutoHideArea() const
|
||||||
|
{
|
||||||
|
auto TitleBar = titleBar();
|
||||||
|
return TitleBar && TitleBar->isAutoHide();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CSpacerWidget::CSpacerWidget(QWidget* Parent /*= 0*/) : Super(Parent)
|
CSpacerWidget::CSpacerWidget(QWidget* Parent /*= 0*/) : Super(Parent)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class CDockAreaTabBar;
|
|||||||
class CDockAreaWidget;
|
class CDockAreaWidget;
|
||||||
struct DockAreaTitleBarPrivate;
|
struct DockAreaTitleBarPrivate;
|
||||||
class CElidingLabel;
|
class CElidingLabel;
|
||||||
|
class CDockAreaTitleBar;
|
||||||
|
|
||||||
using tTitleBarButton = QToolButton;
|
using tTitleBarButton = QToolButton;
|
||||||
|
|
||||||
@@ -59,10 +60,12 @@ class CTitleBarButton : public tTitleBarButton
|
|||||||
private:
|
private:
|
||||||
bool ShowInTitleBar = true;
|
bool ShowInTitleBar = true;
|
||||||
bool HideWhenDisabled = false;
|
bool HideWhenDisabled = false;
|
||||||
|
TitleBarButton TitleBarButtonId;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using Super = tTitleBarButton;
|
using Super = tTitleBarButton;
|
||||||
CTitleBarButton(bool ShowInTitleBar = true, QWidget* parent = nullptr);
|
CTitleBarButton(bool ShowInTitleBar, bool HideWhenDisabled, TitleBarButton ButtonId,
|
||||||
|
QWidget* parent = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adjust this visibility change request with our internal settings:
|
* Adjust this visibility change request with our internal settings:
|
||||||
@@ -74,6 +77,22 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setShowInTitleBar(bool Show);
|
void setShowInTitleBar(bool Show);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Identifier for the title bar button
|
||||||
|
*/
|
||||||
|
TitleBarButton buttonId() const {return TitleBarButtonId;}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the title bar that contains this button
|
||||||
|
*/
|
||||||
|
CDockAreaTitleBar* titleBar() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, if the button is in a title bar in an auto hide area
|
||||||
|
*/
|
||||||
|
bool isInAutoHideArea() const;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/**
|
/**
|
||||||
* Handle EnabledChanged signal to set button invisible if the configured
|
* Handle EnabledChanged signal to set button invisible if the configured
|
||||||
@@ -133,6 +152,11 @@ protected:
|
|||||||
*/
|
*/
|
||||||
virtual void contextMenuEvent(QContextMenuEvent *event) override;
|
virtual void contextMenuEvent(QContextMenuEvent *event) override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle resize events
|
||||||
|
*/
|
||||||
|
virtual void resizeEvent(QResizeEvent *event) override;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
* Call this slot to tell the title bar that it should update the tabs menu
|
* Call this slot to tell the title bar that it should update the tabs menu
|
||||||
@@ -169,6 +193,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
CElidingLabel* autoHideTitleLabel() const;
|
CElidingLabel* autoHideTitleLabel() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the dock area widget that contains this title bar
|
||||||
|
*/
|
||||||
|
CDockAreaWidget* dockAreaWidget() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the visibility of the dock widget actions in the title bar
|
* Updates the visibility of the dock widget actions in the title bar
|
||||||
*/
|
*/
|
||||||
@@ -215,6 +244,25 @@ public:
|
|||||||
*/
|
*/
|
||||||
void showAutoHideControls(bool Show);
|
void showAutoHideControls(bool Show);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, if the auto hide controls are visible
|
||||||
|
*/
|
||||||
|
bool isAutoHide() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills the provided menu with standard entries. If a nullptr is passed, a
|
||||||
|
* new menu is created and filled with standard entries.
|
||||||
|
* This function is called from the actual version of contextMenuEvent, but
|
||||||
|
* can be called from any code. Caller is responsible of deleting the created
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @param menu The QMenu to fill with standard entries. If nullptr, a new
|
||||||
|
* QMenu will be created.
|
||||||
|
* @return The filled QMenu, either the provided one or a newly created one if
|
||||||
|
* nullptr was passed.
|
||||||
|
*/
|
||||||
|
virtual QMenu *buildContextMenu(QMenu *);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
/**
|
/**
|
||||||
* This signal is emitted if a tab in the tab bar is clicked by the user
|
* This signal is emitted if a tab in the tab bar is clicked by the user
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ class CSpacerWidget : public QWidget
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
using Super = QWidget;
|
using Super = QWidget;
|
||||||
CSpacerWidget(QWidget* Parent = 0);
|
CSpacerWidget(QWidget* Parent = nullptr);
|
||||||
virtual QSize sizeHint() const override {return QSize(0, 0);}
|
virtual QSize sizeHint() const override {return QSize(0, 0);}
|
||||||
virtual QSize minimumSizeHint() const override {return QSize(0, 0);}
|
virtual QSize minimumSizeHint() const override {return QSize(0, 0);}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
|
|
||||||
#include <QStackedLayout>
|
#include <QStackedLayout>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include <QWheelEvent>
|
|
||||||
#include <QStyle>
|
#include <QStyle>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
@@ -81,7 +80,7 @@ class CDockAreaLayout
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
QBoxLayout* m_ParentLayout;
|
QBoxLayout* m_ParentLayout;
|
||||||
QList<QWidget*> m_Widgets;
|
QList<QPointer<QWidget>> m_Widgets;
|
||||||
int m_CurrentIndex = -1;
|
int m_CurrentIndex = -1;
|
||||||
QWidget* m_CurrentWidget = nullptr;
|
QWidget* m_CurrentWidget = nullptr;
|
||||||
|
|
||||||
@@ -370,10 +369,21 @@ void DockAreaWidgetPrivate::updateTitleBarButtonStates()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TitleBar->button(TitleBarButtonClose)->setEnabled(
|
if (_this->isAutoHide())
|
||||||
_this->features().testFlag(CDockWidget::DockWidgetClosable));
|
{
|
||||||
TitleBar->button(TitleBarButtonUndock)->setEnabled(
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton))
|
||||||
_this->features().testFlag(CDockWidget::DockWidgetFloatable));
|
{
|
||||||
|
TitleBar->button(TitleBarButtonClose)->setEnabled(
|
||||||
|
_this->features().testFlag(CDockWidget::DockWidgetClosable));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TitleBar->button(TitleBarButtonUndock)->setEnabled(
|
||||||
|
_this->features().testFlag(CDockWidget::DockWidgetFloatable));
|
||||||
|
TitleBar->button(TitleBarButtonClose)->setEnabled(
|
||||||
|
_this->features().testFlag(CDockWidget::DockWidgetClosable));
|
||||||
|
}
|
||||||
TitleBar->button(TitleBarButtonAutoHide)->setEnabled(
|
TitleBar->button(TitleBarButtonAutoHide)->setEnabled(
|
||||||
_this->features().testFlag(CDockWidget::DockWidgetPinnable));
|
_this->features().testFlag(CDockWidget::DockWidgetPinnable));
|
||||||
TitleBar->updateDockWidgetActionsButtons();
|
TitleBar->updateDockWidgetActionsButtons();
|
||||||
@@ -393,7 +403,7 @@ void DockAreaWidgetPrivate::updateTitleBarButtonVisibility(bool IsTopLevel)
|
|||||||
bool IsAutoHide = _this->isAutoHide();
|
bool IsAutoHide = _this->isAutoHide();
|
||||||
if (IsAutoHide)
|
if (IsAutoHide)
|
||||||
{
|
{
|
||||||
bool ShowCloseButton = CDockManager::autoHideConfigFlags().testFlag(CDockManager::AutoHideHasCloseButton);
|
bool ShowCloseButton = CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideHasCloseButton);
|
||||||
TitleBar->button(TitleBarButtonClose)->setVisible(ShowCloseButton);
|
TitleBar->button(TitleBarButtonClose)->setVisible(ShowCloseButton);
|
||||||
TitleBar->button(TitleBarButtonAutoHide)->setVisible(true);
|
TitleBar->button(TitleBarButtonAutoHide)->setVisible(true);
|
||||||
TitleBar->button(TitleBarButtonUndock)->setVisible(false);
|
TitleBar->button(TitleBarButtonUndock)->setVisible(false);
|
||||||
@@ -410,7 +420,8 @@ void DockAreaWidgetPrivate::updateTitleBarButtonVisibility(bool IsTopLevel)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
TitleBar->button(TitleBarButtonClose)->setVisible(true);
|
TitleBar->button(TitleBarButtonClose)->setVisible(true);
|
||||||
TitleBar->button(TitleBarButtonAutoHide)->setVisible(true);
|
bool ShowAutoHideButton = CDockManager::testAutoHideConfigFlag(CDockManager::DockAreaHasAutoHideButton);
|
||||||
|
TitleBar->button(TitleBarButtonAutoHide)->setVisible(ShowAutoHideButton);
|
||||||
TitleBar->button(TitleBarButtonUndock)->setVisible(true);
|
TitleBar->button(TitleBarButtonUndock)->setVisible(true);
|
||||||
TitleBar->button(TitleBarButtonTabsMenu)->setVisible(true);
|
TitleBar->button(TitleBarButtonTabsMenu)->setVisible(true);
|
||||||
}
|
}
|
||||||
@@ -756,7 +767,7 @@ int CDockAreaWidget::openDockWidgetsCount() const
|
|||||||
int Count = 0;
|
int Count = 0;
|
||||||
for (int i = 0; i < d->ContentsLayout->count(); ++i)
|
for (int i = 0; i < d->ContentsLayout->count(); ++i)
|
||||||
{
|
{
|
||||||
if (!dockWidget(i)->isClosed())
|
if (dockWidget(i) && !dockWidget(i)->isClosed())
|
||||||
{
|
{
|
||||||
++Count;
|
++Count;
|
||||||
}
|
}
|
||||||
@@ -772,7 +783,7 @@ QList<CDockWidget*> CDockAreaWidget::openedDockWidgets() const
|
|||||||
for (int i = 0; i < d->ContentsLayout->count(); ++i)
|
for (int i = 0; i < d->ContentsLayout->count(); ++i)
|
||||||
{
|
{
|
||||||
CDockWidget* DockWidget = dockWidget(i);
|
CDockWidget* DockWidget = dockWidget(i);
|
||||||
if (!DockWidget->isClosed())
|
if (DockWidget && !DockWidget->isClosed())
|
||||||
{
|
{
|
||||||
DockWidgetList.append(dockWidget(i));
|
DockWidgetList.append(dockWidget(i));
|
||||||
}
|
}
|
||||||
@@ -786,7 +797,7 @@ int CDockAreaWidget::indexOfFirstOpenDockWidget() const
|
|||||||
{
|
{
|
||||||
for (int i = 0; i < d->ContentsLayout->count(); ++i)
|
for (int i = 0; i < d->ContentsLayout->count(); ++i)
|
||||||
{
|
{
|
||||||
if (!dockWidget(i)->isClosed())
|
if (dockWidget(i) && !dockWidget(i)->isClosed())
|
||||||
{
|
{
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -809,7 +820,6 @@ CDockWidget* CDockAreaWidget::dockWidget(int Index) const
|
|||||||
return qobject_cast<CDockWidget*>(d->ContentsLayout->widget(Index));
|
return qobject_cast<CDockWidget*>(d->ContentsLayout->widget(Index));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CDockAreaWidget::reorderDockWidget(int fromIndex, int toIndex)
|
void CDockAreaWidget::reorderDockWidget(int fromIndex, int toIndex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter)
|
QT_FORWARD_DECLARE_CLASS(QXmlStreamWriter)
|
||||||
QT_FORWARD_DECLARE_CLASS(QAbstractButton)
|
QT_FORWARD_DECLARE_CLASS(QAbstractButton)
|
||||||
|
QT_FORWARD_DECLARE_CLASS(QMenu)
|
||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ public:
|
|||||||
CDockContainerWidget* _this;
|
CDockContainerWidget* _this;
|
||||||
QPointer<CDockManager> DockManager;
|
QPointer<CDockManager> DockManager;
|
||||||
unsigned int zOrderIndex = 0;
|
unsigned int zOrderIndex = 0;
|
||||||
QList<CDockAreaWidget*> DockAreas;
|
QList<QPointer<CDockAreaWidget>> DockAreas;
|
||||||
QList<CAutoHideDockContainer*> AutoHideWidgets;
|
QList<CAutoHideDockContainer*> AutoHideWidgets;
|
||||||
QMap<SideBarLocation, CAutoHideSideBar*> SideTabBarWidgets;
|
QMap<SideBarLocation, CAutoHideSideBar*> SideTabBarWidgets;
|
||||||
QGridLayout* Layout = nullptr;
|
QGridLayout* Layout = nullptr;
|
||||||
@@ -299,7 +299,11 @@ public:
|
|||||||
VisibleDockAreaCount = 0;
|
VisibleDockAreaCount = 0;
|
||||||
for (auto DockArea : DockAreas)
|
for (auto DockArea : DockAreas)
|
||||||
{
|
{
|
||||||
VisibleDockAreaCount += DockArea->isHidden() ? 0 : 1;
|
if (!DockArea)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
VisibleDockAreaCount += (DockArea->isHidden() ? 0 : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -924,7 +928,10 @@ void DockContainerWidgetPrivate::addDockAreasToList(const QList<CDockAreaWidget*
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
void DockContainerWidgetPrivate::appendDockAreas(const QList<CDockAreaWidget*> NewDockAreas)
|
void DockContainerWidgetPrivate::appendDockAreas(const QList<CDockAreaWidget*> NewDockAreas)
|
||||||
{
|
{
|
||||||
DockAreas.append(NewDockAreas);
|
for (auto *newDockArea : NewDockAreas)
|
||||||
|
{
|
||||||
|
DockAreas.append(newDockArea);
|
||||||
|
}
|
||||||
for (auto DockArea : NewDockAreas)
|
for (auto DockArea : NewDockAreas)
|
||||||
{
|
{
|
||||||
QObject::connect(DockArea,
|
QObject::connect(DockArea,
|
||||||
@@ -1636,12 +1643,21 @@ emitAndExit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
QList<QPointer<CDockAreaWidget>> CDockContainerWidget::removeAllDockAreas()
|
||||||
|
{
|
||||||
|
auto Result = d->DockAreas;
|
||||||
|
d->DockAreas.clear();
|
||||||
|
return Result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CDockAreaWidget* CDockContainerWidget::dockAreaAt(const QPoint& GlobalPos) const
|
CDockAreaWidget* CDockContainerWidget::dockAreaAt(const QPoint& GlobalPos) const
|
||||||
{
|
{
|
||||||
for (const auto& DockArea : d->DockAreas)
|
for (const auto& DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
if (DockArea->isVisible() && DockArea->rect().contains(DockArea->mapFromGlobal(GlobalPos)))
|
if (DockArea && DockArea->isVisible() && DockArea->rect().contains(DockArea->mapFromGlobal(GlobalPos)))
|
||||||
{
|
{
|
||||||
return DockArea;
|
return DockArea;
|
||||||
}
|
}
|
||||||
@@ -1678,7 +1694,7 @@ int CDockContainerWidget::visibleDockAreaCount() const
|
|||||||
int Result = 0;
|
int Result = 0;
|
||||||
for (auto DockArea : d->DockAreas)
|
for (auto DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
Result += DockArea->isHidden() ? 0 : 1;
|
Result += (!DockArea || DockArea->isHidden()) ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result;
|
return Result;
|
||||||
@@ -1749,7 +1765,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi
|
|||||||
if (Dropped)
|
if (Dropped)
|
||||||
{
|
{
|
||||||
// Fix https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/351
|
// Fix https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/351
|
||||||
FloatingWidget->hideAndDeleteLater();
|
FloatingWidget->finishDropOperation();
|
||||||
|
|
||||||
// If we dropped a floating widget with only one single dock widget, then we
|
// If we dropped a floating widget with only one single dock widget, then we
|
||||||
// drop a top level widget that changes from floating to docked now
|
// drop a top level widget that changes from floating to docked now
|
||||||
@@ -1802,7 +1818,7 @@ QList<CDockAreaWidget*> CDockContainerWidget::openedDockAreas() const
|
|||||||
QList<CDockAreaWidget*> Result;
|
QList<CDockAreaWidget*> Result;
|
||||||
for (auto DockArea : d->DockAreas)
|
for (auto DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
if (!DockArea->isHidden())
|
if (DockArea && !DockArea->isHidden())
|
||||||
{
|
{
|
||||||
Result.append(DockArea);
|
Result.append(DockArea);
|
||||||
}
|
}
|
||||||
@@ -1818,7 +1834,7 @@ QList<CDockWidget*> CDockContainerWidget::openedDockWidgets() const
|
|||||||
QList<CDockWidget*> DockWidgetList;
|
QList<CDockWidget*> DockWidgetList;
|
||||||
for (auto DockArea : d->DockAreas)
|
for (auto DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
if (!DockArea->isHidden())
|
if (DockArea && !DockArea->isHidden())
|
||||||
{
|
{
|
||||||
DockWidgetList.append(DockArea->openedDockWidgets());
|
DockWidgetList.append(DockArea->openedDockWidgets());
|
||||||
}
|
}
|
||||||
@@ -1833,7 +1849,7 @@ bool CDockContainerWidget::hasOpenDockAreas() const
|
|||||||
{
|
{
|
||||||
for (auto DockArea : d->DockAreas)
|
for (auto DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
if (!DockArea->isHidden())
|
if (DockArea && !DockArea->isHidden())
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -2056,8 +2072,12 @@ CDockAreaWidget* CDockContainerWidget::topLevelDockArea() const
|
|||||||
QList<CDockWidget*> CDockContainerWidget::dockWidgets() const
|
QList<CDockWidget*> CDockContainerWidget::dockWidgets() const
|
||||||
{
|
{
|
||||||
QList<CDockWidget*> Result;
|
QList<CDockWidget*> Result;
|
||||||
for (const auto DockArea : d->DockAreas)
|
for (const auto& DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
|
if (!DockArea)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Result.append(DockArea->dockWidgets());
|
Result.append(DockArea->dockWidgets());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2088,8 +2108,12 @@ void CDockContainerWidget::removeAutoHideWidget(CAutoHideDockContainer* Autohide
|
|||||||
CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const
|
CDockWidget::DockWidgetFeatures CDockContainerWidget::features() const
|
||||||
{
|
{
|
||||||
CDockWidget::DockWidgetFeatures Features(CDockWidget::AllDockWidgetFeatures);
|
CDockWidget::DockWidgetFeatures Features(CDockWidget::AllDockWidgetFeatures);
|
||||||
for (const auto DockArea : d->DockAreas)
|
for (const auto& DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
|
if (!DockArea)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
Features &= DockArea->features();
|
Features &= DockArea->features();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2107,9 +2131,9 @@ CFloatingDockContainer* CDockContainerWidget::floatingWidget() const
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
void CDockContainerWidget::closeOtherAreas(CDockAreaWidget* KeepOpenArea)
|
void CDockContainerWidget::closeOtherAreas(CDockAreaWidget* KeepOpenArea)
|
||||||
{
|
{
|
||||||
for (const auto DockArea : d->DockAreas)
|
for (const auto& DockArea : d->DockAreas)
|
||||||
{
|
{
|
||||||
if (DockArea == KeepOpenArea)
|
if (!DockArea || DockArea == KeepOpenArea)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,11 @@ protected:
|
|||||||
*/
|
*/
|
||||||
void removeDockArea(CDockAreaWidget* area);
|
void removeDockArea(CDockAreaWidget* area);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all dock areas and returns the list of removed dock areas
|
||||||
|
*/
|
||||||
|
QList<QPointer<CDockAreaWidget>> removeAllDockAreas();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the state into the given stream
|
* Saves the state into the given stream
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ DockFocusControllerPrivate::DockFocusControllerPrivate(
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget)
|
void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget)
|
||||||
{
|
{
|
||||||
|
if (!DockWidget) return;
|
||||||
if (!DockWidget->features().testFlag(CDockWidget::DockWidgetFocusable))
|
if (!DockWidget->features().testFlag(CDockWidget::DockWidgetFocusable))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QWindow>
|
#include <QWindow>
|
||||||
#include <QWindowStateChangeEvent>
|
#include <QWindowStateChangeEvent>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
#include "FloatingDockContainer.h"
|
#include "FloatingDockContainer.h"
|
||||||
#include "DockOverlay.h"
|
#include "DockOverlay.h"
|
||||||
@@ -94,6 +95,7 @@ enum eStateFileVersion
|
|||||||
|
|
||||||
static CDockManager::ConfigFlags StaticConfigFlags = CDockManager::DefaultNonOpaqueConfig;
|
static CDockManager::ConfigFlags StaticConfigFlags = CDockManager::DefaultNonOpaqueConfig;
|
||||||
static CDockManager::AutoHideFlags StaticAutoHideConfigFlags; // auto hide feature is disabled by default
|
static CDockManager::AutoHideFlags StaticAutoHideConfigFlags; // auto hide feature is disabled by default
|
||||||
|
static QVector<QVariant> StaticConfigParams(CDockManager::ConfigParamCount);
|
||||||
|
|
||||||
static QString FloatingContainersTitle;
|
static QString FloatingContainersTitle;
|
||||||
|
|
||||||
@@ -103,8 +105,8 @@ static QString FloatingContainersTitle;
|
|||||||
struct DockManagerPrivate
|
struct DockManagerPrivate
|
||||||
{
|
{
|
||||||
CDockManager* _this;
|
CDockManager* _this;
|
||||||
QList<CFloatingDockContainer*> FloatingWidgets;
|
QList<QPointer<CFloatingDockContainer>> FloatingWidgets;
|
||||||
QList<CFloatingDockContainer*> HiddenFloatingWidgets;
|
QList<QPointer<CFloatingDockContainer>> HiddenFloatingWidgets;
|
||||||
QList<CDockContainerWidget*> Containers;
|
QList<CDockContainerWidget*> Containers;
|
||||||
CDockOverlay* ContainerOverlay;
|
CDockOverlay* ContainerOverlay;
|
||||||
CDockOverlay* DockAreaOverlay;
|
CDockOverlay* DockAreaOverlay;
|
||||||
@@ -122,6 +124,7 @@ struct DockManagerPrivate
|
|||||||
Qt::ToolButtonStyle ToolBarStyleFloating = Qt::ToolButtonTextUnderIcon;
|
Qt::ToolButtonStyle ToolBarStyleFloating = Qt::ToolButtonTextUnderIcon;
|
||||||
QSize ToolBarIconSizeDocked = QSize(16, 16);
|
QSize ToolBarIconSizeDocked = QSize(16, 16);
|
||||||
QSize ToolBarIconSizeFloating = QSize(24, 24);
|
QSize ToolBarIconSizeFloating = QSize(24, 24);
|
||||||
|
CDockWidget::DockWidgetFeatures LockedDockWidgetFeatures;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private data constructor
|
* Private data constructor
|
||||||
@@ -153,7 +156,10 @@ struct DockManagerPrivate
|
|||||||
// Hide updates of floating widgets from user
|
// Hide updates of floating widgets from user
|
||||||
for (auto FloatingWidget : FloatingWidgets)
|
for (auto FloatingWidget : FloatingWidgets)
|
||||||
{
|
{
|
||||||
FloatingWidget->hide();
|
if (FloatingWidget)
|
||||||
|
{
|
||||||
|
FloatingWidget->hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,7 +339,8 @@ bool DockManagerPrivate::restoreStateFromXml(const QByteArray &state, int versi
|
|||||||
int FloatingWidgetIndex = DockContainerCount - 1;
|
int FloatingWidgetIndex = DockContainerCount - 1;
|
||||||
for (int i = FloatingWidgetIndex; i < FloatingWidgets.count(); ++i)
|
for (int i = FloatingWidgetIndex; i < FloatingWidgets.count(); ++i)
|
||||||
{
|
{
|
||||||
auto* floatingWidget = FloatingWidgets[i];
|
CFloatingDockContainer* floatingWidget = FloatingWidgets[i];
|
||||||
|
if (!floatingWidget) continue;
|
||||||
_this->removeDockContainer(floatingWidget->dockContainer());
|
_this->removeDockContainer(floatingWidget->dockContainer());
|
||||||
floatingWidget->deleteLater();
|
floatingWidget->deleteLater();
|
||||||
}
|
}
|
||||||
@@ -536,25 +543,41 @@ CDockManager::CDockManager(QWidget *parent) :
|
|||||||
CDockManager::~CDockManager()
|
CDockManager::~CDockManager()
|
||||||
{
|
{
|
||||||
// fix memory leaks, see https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/307
|
// fix memory leaks, see https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/307
|
||||||
std::vector<ads::CDockAreaWidget*> areas;
|
std::vector<QPointer<ads::CDockAreaWidget>> areas;
|
||||||
for ( int i = 0; i != dockAreaCount(); ++i )
|
for (int i = 0; i != dockAreaCount(); ++i)
|
||||||
{
|
{
|
||||||
areas.push_back( dockArea(i) );
|
areas.push_back( dockArea(i) );
|
||||||
}
|
}
|
||||||
for ( auto area : areas )
|
for ( auto area : areas )
|
||||||
{
|
{
|
||||||
for ( auto widget : area->dockWidgets() )
|
if (!area || area->dockManager() != this) continue;
|
||||||
delete widget;
|
|
||||||
|
|
||||||
delete area;
|
// QPointer delete safety - just in case some dock wigdet in destruction
|
||||||
}
|
// deletes another related/twin or child dock widget.
|
||||||
|
std::vector<QPointer<QWidget>> deleteWidgets;
|
||||||
|
for ( auto widget : area->dockWidgets() )
|
||||||
|
{
|
||||||
|
deleteWidgets.push_back(widget);
|
||||||
|
}
|
||||||
|
for ( auto ptrWdg : deleteWidgets)
|
||||||
|
{
|
||||||
|
delete ptrWdg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto FloatingWidgets = d->FloatingWidgets;
|
auto FloatingWidgets = d->FloatingWidgets;
|
||||||
for (auto FloatingWidget : FloatingWidgets)
|
for (auto FloatingWidget : FloatingWidgets)
|
||||||
{
|
{
|
||||||
|
FloatingWidget->deleteContent();
|
||||||
delete FloatingWidget;
|
delete FloatingWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete Dock Widgets before Areas so widgets can access them late (like dtor)
|
||||||
|
for ( auto area : areas )
|
||||||
|
{
|
||||||
|
delete area;
|
||||||
|
}
|
||||||
|
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +591,7 @@ bool CDockManager::eventFilter(QObject *obj, QEvent *e)
|
|||||||
// Window always on top of the MainWindow.
|
// Window always on top of the MainWindow.
|
||||||
if (e->type() == QEvent::WindowActivate)
|
if (e->type() == QEvent::WindowActivate)
|
||||||
{
|
{
|
||||||
for (auto _window : floatingWidgets())
|
for (auto _window : d->FloatingWidgets)
|
||||||
{
|
{
|
||||||
if (!_window->isVisible() || window()->isMinimized())
|
if (!_window->isVisible() || window()->isMinimized())
|
||||||
{
|
{
|
||||||
@@ -590,7 +613,7 @@ bool CDockManager::eventFilter(QObject *obj, QEvent *e)
|
|||||||
}
|
}
|
||||||
else if (e->type() == QEvent::WindowDeactivate)
|
else if (e->type() == QEvent::WindowDeactivate)
|
||||||
{
|
{
|
||||||
for (auto _window : floatingWidgets())
|
for (auto _window : d->FloatingWidgets)
|
||||||
{
|
{
|
||||||
if (!_window->isVisible() || window()->isMinimized())
|
if (!_window->isVisible() || window()->isMinimized())
|
||||||
{
|
{
|
||||||
@@ -613,7 +636,7 @@ bool CDockManager::eventFilter(QObject *obj, QEvent *e)
|
|||||||
// Sync minimize with MainWindow
|
// Sync minimize with MainWindow
|
||||||
if (e->type() == QEvent::WindowStateChange)
|
if (e->type() == QEvent::WindowStateChange)
|
||||||
{
|
{
|
||||||
for (auto _window : floatingWidgets())
|
for (auto _window : d->FloatingWidgets)
|
||||||
{
|
{
|
||||||
if (! _window->isVisible())
|
if (! _window->isVisible())
|
||||||
{
|
{
|
||||||
@@ -725,7 +748,12 @@ const QList<CDockContainerWidget*> CDockManager::dockContainers() const
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
const QList<CFloatingDockContainer*> CDockManager::floatingWidgets() const
|
const QList<CFloatingDockContainer*> CDockManager::floatingWidgets() const
|
||||||
{
|
{
|
||||||
return d->FloatingWidgets;
|
QList<CFloatingDockContainer*> res;
|
||||||
|
for (auto &fl : d->FloatingWidgets)
|
||||||
|
{
|
||||||
|
if (fl) res.append(fl);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1125,7 +1153,7 @@ QAction* CDockManager::addToggleViewActionToMenu(QAction* ToggleViewAction,
|
|||||||
bool AlphabeticallySorted = (MenuAlphabeticallySorted == d->MenuInsertionOrder);
|
bool AlphabeticallySorted = (MenuAlphabeticallySorted == d->MenuInsertionOrder);
|
||||||
if (!Group.isEmpty())
|
if (!Group.isEmpty())
|
||||||
{
|
{
|
||||||
QMenu* GroupMenu = d->ViewMenuGroups.value(Group, 0);
|
QMenu* GroupMenu = d->ViewMenuGroups.value(Group, nullptr);
|
||||||
if (!GroupMenu)
|
if (!GroupMenu)
|
||||||
{
|
{
|
||||||
GroupMenu = new QMenu(Group, this);
|
GroupMenu = new QMenu(Group, this);
|
||||||
@@ -1422,6 +1450,47 @@ QSize CDockManager::dockWidgetToolBarIconSize(CDockWidget::eState State) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CDockManager::lockDockWidgetFeaturesGlobally(CDockWidget::DockWidgetFeatures Value)
|
||||||
|
{
|
||||||
|
// Limit the features to CDockWidget::GloballyLockableFeatures
|
||||||
|
Value &= CDockWidget::GloballyLockableFeatures;
|
||||||
|
if (d->LockedDockWidgetFeatures == Value)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->LockedDockWidgetFeatures = Value;
|
||||||
|
// Call the notifyFeaturesChanged() function for all dock widgets to update
|
||||||
|
// the state of the close and detach buttons
|
||||||
|
for (auto DockWidget : d->DockWidgetsMap)
|
||||||
|
{
|
||||||
|
DockWidget->notifyFeaturesChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
CDockWidget::DockWidgetFeatures CDockManager::globallyLockedDockWidgetFeatures() const
|
||||||
|
{
|
||||||
|
return d->LockedDockWidgetFeatures;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CDockManager::setConfigParam(CDockManager::eConfigParam Param, QVariant Value)
|
||||||
|
{
|
||||||
|
StaticConfigParams[Param] = Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
QVariant CDockManager::configParam(eConfigParam Param, QVariant Default)
|
||||||
|
{
|
||||||
|
return StaticConfigParams[Param].isValid() ? StaticConfigParams[Param] : Default;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace ads
|
} // namespace ads
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ public:
|
|||||||
AutoHideCloseButtonCollapsesDock = 0x40, ///< Close button of an auto hide container collapses the dock instead of hiding it completely
|
AutoHideCloseButtonCollapsesDock = 0x40, ///< Close button of an auto hide container collapses the dock instead of hiding it completely
|
||||||
AutoHideHasCloseButton = 0x80, //< If the flag is set an auto hide title bar has a close button
|
AutoHideHasCloseButton = 0x80, //< If the flag is set an auto hide title bar has a close button
|
||||||
AutoHideHasMinimizeButton = 0x100, ///< if this flag is set, the auto hide title bar has a minimize button to collapse the dock widget
|
AutoHideHasMinimizeButton = 0x100, ///< if this flag is set, the auto hide title bar has a minimize button to collapse the dock widget
|
||||||
|
AutoHideOpenOnDragHover = 0x200, ///< if this flag is set, dragging hover the tab bar will open the dock
|
||||||
|
|
||||||
DefaultAutoHideConfig = AutoHideFeatureEnabled
|
DefaultAutoHideConfig = AutoHideFeatureEnabled
|
||||||
| DockAreaHasAutoHideButton
|
| DockAreaHasAutoHideButton
|
||||||
@@ -262,6 +263,15 @@ public:
|
|||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS(AutoHideFlags, eAutoHideFlag)
|
Q_DECLARE_FLAGS(AutoHideFlags, eAutoHideFlag)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global configuration parameters that you can set via setConfigParam()
|
||||||
|
*/
|
||||||
|
enum eConfigParam
|
||||||
|
{
|
||||||
|
AutoHideOpenOnDragHoverDelay_ms, ///< Delay in ms before the dock opens on drag hover if AutoHideOpenOnDragHover flag is set
|
||||||
|
ConfigParamCount // just a delimiter to count number of config params
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor.
|
* Default Constructor.
|
||||||
@@ -323,6 +333,17 @@ public:
|
|||||||
*/
|
*/
|
||||||
static bool testAutoHideConfigFlag(eAutoHideFlag Flag);
|
static bool testAutoHideConfigFlag(eAutoHideFlag Flag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value for the given config parameter
|
||||||
|
*/
|
||||||
|
static void setConfigParam(eConfigParam Param, QVariant Value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value for the given config parameter or the default value
|
||||||
|
* if the parameter is not set.
|
||||||
|
*/
|
||||||
|
static QVariant configParam(eConfigParam Param, QVariant Default);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the global icon provider.
|
* Returns the global icon provider.
|
||||||
* The icon provider enables the use of custom icons in case using
|
* The icon provider enables the use of custom icons in case using
|
||||||
@@ -660,6 +681,38 @@ public:
|
|||||||
*/
|
*/
|
||||||
QSize dockWidgetToolBarIconSize(CDockWidget::eState State) const;
|
QSize dockWidgetToolBarIconSize(CDockWidget::eState State) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all dock widget features that are globally locked by the dock
|
||||||
|
* manager.
|
||||||
|
* Globally locked features are removed from the features of all dock
|
||||||
|
* widgets.
|
||||||
|
*/
|
||||||
|
CDockWidget::DockWidgetFeatures globallyLockedDockWidgetFeatures() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Globally Lock features of all dock widgets to "freeze" the current
|
||||||
|
* workspace layout.
|
||||||
|
* For example, it is now possible to lock the workspace to avoid
|
||||||
|
* accidentally dragging a docked view. Locking wasn’t possible before.
|
||||||
|
* So, users had to manually dock it back to the desired place after
|
||||||
|
* each accidental undock.
|
||||||
|
* You can use a combination of the following feature flags:
|
||||||
|
* - CDockWidget::DockWidgetClosable
|
||||||
|
* - CDockWidget::DockWidgetMovable
|
||||||
|
* - CDockWidget::DockWidgetFloatable
|
||||||
|
* - CDockWidget::DockWidgetPinable
|
||||||
|
*
|
||||||
|
* To clear the locked features, you can use CDockWidget::NoDockWidgetFeatures
|
||||||
|
* The following code shows how to lock and unlock dock widget features
|
||||||
|
* globally.
|
||||||
|
*
|
||||||
|
* \code
|
||||||
|
* DockManager->lockDockWidgetFeaturesGlobally();
|
||||||
|
* DockManager->lockDockWidgetFeaturesGlobally(CDockWidget::NoDockWidgetFeatures);
|
||||||
|
* \code
|
||||||
|
*/
|
||||||
|
void lockDockWidgetFeaturesGlobally(CDockWidget::DockWidgetFeatures Features = CDockWidget::GloballyLockableFeatures);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
/**
|
/**
|
||||||
* Opens the perspective with the given name.
|
* Opens the perspective with the given name.
|
||||||
|
|||||||
@@ -80,8 +80,8 @@ struct DockWidgetPrivate
|
|||||||
QWidget* Widget = nullptr;
|
QWidget* Widget = nullptr;
|
||||||
CDockWidgetTab* TabWidget = nullptr;
|
CDockWidgetTab* TabWidget = nullptr;
|
||||||
CDockWidget::DockWidgetFeatures Features = CDockWidget::DefaultDockWidgetFeatures;
|
CDockWidget::DockWidgetFeatures Features = CDockWidget::DefaultDockWidgetFeatures;
|
||||||
CDockManager* DockManager = nullptr;
|
QPointer<CDockManager> DockManager;
|
||||||
CDockAreaWidget* DockArea = nullptr;
|
QPointer<CDockAreaWidget> DockArea;
|
||||||
QAction* ToggleViewAction = nullptr;
|
QAction* ToggleViewAction = nullptr;
|
||||||
bool Closed = false;
|
bool Closed = false;
|
||||||
QScrollArea* ScrollArea = nullptr;
|
QScrollArea* ScrollArea = nullptr;
|
||||||
@@ -271,7 +271,10 @@ void DockWidgetPrivate::closeAutoHideDockWidgetsIfNeeded()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DockContainer->openedDockWidgets().isEmpty())
|
// If the dock container is the dock manager, or if it is not empty, then we
|
||||||
|
// don't need to do anything
|
||||||
|
if ((DockContainer == _this->dockManager())
|
||||||
|
|| !DockContainer->openedDockWidgets().isEmpty())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -382,7 +385,7 @@ CDockWidget::CDockWidget(const QString &title, QWidget *parent) :
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
CDockWidget::~CDockWidget()
|
CDockWidget::~CDockWidget()
|
||||||
{
|
{
|
||||||
ADS_PRINT("~CDockWidget()");
|
ADS_PRINT("~CDockWidget(): " << this->windowTitle());
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,10 +514,19 @@ void CDockWidget::setFeatures(DockWidgetFeatures features)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
d->Features = features;
|
d->Features = features;
|
||||||
|
notifyFeaturesChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CDockWidget::notifyFeaturesChanged()
|
||||||
|
{
|
||||||
Q_EMIT featuresChanged(d->Features);
|
Q_EMIT featuresChanged(d->Features);
|
||||||
d->TabWidget->onDockWidgetFeaturesChanged();
|
d->TabWidget->onDockWidgetFeaturesChanged();
|
||||||
if(CDockAreaWidget* DockArea = dockAreaWidget())
|
if(CDockAreaWidget* DockArea = dockAreaWidget())
|
||||||
|
{
|
||||||
DockArea->onDockWidgetFeaturesChanged();
|
DockArea->onDockWidgetFeaturesChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -530,7 +542,14 @@ void CDockWidget::setFeature(DockWidgetFeature flag, bool on)
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
CDockWidget::DockWidgetFeatures CDockWidget::features() const
|
CDockWidget::DockWidgetFeatures CDockWidget::features() const
|
||||||
{
|
{
|
||||||
return d->Features;
|
if (d->DockManager)
|
||||||
|
{
|
||||||
|
return d->Features &~ d->DockManager->globallyLockedDockWidgetFeatures();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return d->Features;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -566,7 +585,7 @@ CDockContainerWidget* CDockWidget::dockContainer() const
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -165,6 +165,7 @@ public:
|
|||||||
DefaultDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable | DockWidgetFocusable | DockWidgetPinnable,
|
DefaultDockWidgetFeatures = DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable | DockWidgetFocusable | DockWidgetPinnable,
|
||||||
AllDockWidgetFeatures = DefaultDockWidgetFeatures | DockWidgetDeleteOnClose | CustomCloseHandling,
|
AllDockWidgetFeatures = DefaultDockWidgetFeatures | DockWidgetDeleteOnClose | CustomCloseHandling,
|
||||||
DockWidgetAlwaysCloseAndDelete = DockWidgetForceCloseWithArea | DockWidgetDeleteOnClose,
|
DockWidgetAlwaysCloseAndDelete = DockWidgetForceCloseWithArea | DockWidgetDeleteOnClose,
|
||||||
|
GloballyLockableFeatures = DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable | DockWidgetPinnable,
|
||||||
NoDockWidgetFeatures = 0x000
|
NoDockWidgetFeatures = 0x000
|
||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS(DockWidgetFeatures, DockWidgetFeature)
|
Q_DECLARE_FLAGS(DockWidgetFeatures, DockWidgetFeature)
|
||||||
@@ -256,7 +257,7 @@ public:
|
|||||||
* by calling setObjectName() after construction.
|
* by calling setObjectName() after construction.
|
||||||
* Use the layoutFlags to configure the layout of the dock widget.
|
* Use the layoutFlags to configure the layout of the dock widget.
|
||||||
*/
|
*/
|
||||||
CDockWidget(const QString &title, QWidget* parent = 0);
|
CDockWidget(const QString &title, QWidget* parent = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual Destructor
|
* Virtual Destructor
|
||||||
@@ -336,6 +337,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
DockWidgetFeatures features() const;
|
DockWidgetFeatures features() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Triggers notification of feature change signals and functions
|
||||||
|
*/
|
||||||
|
void notifyFeaturesChanged();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the dock manager that manages the dock widget or 0 if the widget
|
* Returns the dock manager that manages the dock widget or 0 if the widget
|
||||||
* has not been assigned to any dock manager yet
|
* has not been assigned to any dock manager yet
|
||||||
|
|||||||
@@ -56,7 +56,6 @@
|
|||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
static const char* const LocationProperty = "Location";
|
|
||||||
using tTabLabel = CElidingLabel;
|
using tTabLabel = CElidingLabel;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -225,7 +224,7 @@ struct DockWidgetTabPrivate
|
|||||||
QMenu* Menu)
|
QMenu* Menu)
|
||||||
{
|
{
|
||||||
auto Action = Menu->addAction(Title);
|
auto Action = Menu->addAction(Title);
|
||||||
Action->setProperty("Location", Location);
|
Action->setProperty(internal::LocationProperty, Location);
|
||||||
QObject::connect(Action, &QAction::triggered, _this, &CDockWidgetTab::onAutoHideToActionClicked);
|
QObject::connect(Action, &QAction::triggered, _this, &CDockWidgetTab::onAutoHideToActionClicked);
|
||||||
return Action;
|
return Action;
|
||||||
}
|
}
|
||||||
@@ -530,26 +529,34 @@ void CDockWidgetTab::contextMenuEvent(QContextMenuEvent* ev)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto Menu = buildContextMenu(nullptr);
|
||||||
d->saveDragStartMousePosition(ev->globalPos());
|
d->saveDragStartMousePosition(ev->globalPos());
|
||||||
|
Menu->exec(ev->globalPos());
|
||||||
|
}
|
||||||
|
|
||||||
|
QMenu* CDockWidgetTab::buildContextMenu(QMenu *Menu)
|
||||||
|
{
|
||||||
|
if (Menu == nullptr) {
|
||||||
|
Menu = new QMenu(this);
|
||||||
|
}
|
||||||
|
|
||||||
const bool isFloatable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetFloatable);
|
const bool isFloatable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetFloatable);
|
||||||
const bool isNotOnlyTabInContainer = !d->DockArea->dockContainer()->hasTopLevelDockWidget();
|
const bool isNotOnlyTabInContainer = !d->DockArea->dockContainer()->hasTopLevelDockWidget();
|
||||||
const bool isTopLevelArea = d->DockArea->isTopLevelArea();
|
const bool isTopLevelArea = d->DockArea->isTopLevelArea();
|
||||||
const bool isDetachable = isFloatable && isNotOnlyTabInContainer;
|
const bool isDetachable = isFloatable && isNotOnlyTabInContainer;
|
||||||
QAction* Action;
|
QAction* Action;
|
||||||
QMenu Menu(this);
|
|
||||||
|
|
||||||
if (!isTopLevelArea)
|
if (!isTopLevelArea)
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(tr("Detach"), this, SLOT(detachDockWidget()));
|
Action = Menu->addAction(tr("Detach"), this, SLOT(detachDockWidget()));
|
||||||
Action->setEnabled(isDetachable);
|
Action->setEnabled(isDetachable);
|
||||||
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled))
|
if (CDockManager::testAutoHideConfigFlag(CDockManager::AutoHideFeatureEnabled))
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(tr("Pin"), this, SLOT(autoHideDockWidget()));
|
Action = Menu->addAction(tr("Pin"), this, SLOT(autoHideDockWidget()));
|
||||||
auto IsPinnable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetPinnable);
|
auto IsPinnable = d->DockWidget->features().testFlag(CDockWidget::DockWidgetPinnable);
|
||||||
Action->setEnabled(IsPinnable);
|
Action->setEnabled(IsPinnable);
|
||||||
|
|
||||||
auto menu = Menu.addMenu(tr("Pin To..."));
|
auto menu = Menu->addMenu(tr("Pin To..."));
|
||||||
menu->setEnabled(IsPinnable);
|
menu->setEnabled(IsPinnable);
|
||||||
d->createAutoHideToAction(tr("Top"), SideBarTop, menu);
|
d->createAutoHideToAction(tr("Top"), SideBarTop, menu);
|
||||||
d->createAutoHideToAction(tr("Left"), SideBarLeft, menu);
|
d->createAutoHideToAction(tr("Left"), SideBarLeft, menu);
|
||||||
@@ -558,17 +565,16 @@ void CDockWidgetTab::contextMenuEvent(QContextMenuEvent* ev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Menu.addSeparator();
|
Menu->addSeparator();
|
||||||
Action = Menu.addAction(tr("Close"), this, SIGNAL(closeRequested()));
|
Action = Menu->addAction(tr("Close"), this, SIGNAL(closeRequested()));
|
||||||
Action->setEnabled(isClosable());
|
Action->setEnabled(isClosable());
|
||||||
if (d->DockArea->openDockWidgetsCount() > 1)
|
if (d->DockArea->openDockWidgetsCount() > 1)
|
||||||
{
|
{
|
||||||
Action = Menu.addAction(tr("Close Others"), this, SIGNAL(closeOtherTabsRequested()));
|
Action = Menu->addAction(tr("Close Others"), this, SIGNAL(closeOtherTabsRequested()));
|
||||||
}
|
}
|
||||||
Menu.exec(ev->globalPos());
|
|
||||||
|
return Menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
bool CDockWidgetTab::isActiveTab() const
|
bool CDockWidgetTab::isActiveTab() const
|
||||||
{
|
{
|
||||||
@@ -764,7 +770,7 @@ void CDockWidgetTab::autoHideDockWidget()
|
|||||||
//===========================================================================
|
//===========================================================================
|
||||||
void CDockWidgetTab::onAutoHideToActionClicked()
|
void CDockWidgetTab::onAutoHideToActionClicked()
|
||||||
{
|
{
|
||||||
int Location = sender()->property(LocationProperty).toInt();
|
int Location = sender()->property(internal::LocationProperty).toInt();
|
||||||
d->DockWidget->toggleAutoHide((SideBarLocation)Location);
|
d->DockWidget->toggleAutoHide((SideBarLocation)Location);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -790,6 +796,13 @@ bool CDockWidgetTab::event(QEvent *e)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
eDragState CDockWidgetTab::dragState() const
|
||||||
|
{
|
||||||
|
return d->DragState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CDockWidgetTab::onDockWidgetFeaturesChanged()
|
void CDockWidgetTab::onDockWidgetFeaturesChanged()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,6 +35,8 @@
|
|||||||
|
|
||||||
#include "ads_globals.h"
|
#include "ads_globals.h"
|
||||||
|
|
||||||
|
QT_FORWARD_DECLARE_CLASS(QMenu)
|
||||||
|
|
||||||
namespace ads
|
namespace ads
|
||||||
{
|
{
|
||||||
class CDockWidget;
|
class CDockWidget;
|
||||||
@@ -84,7 +86,7 @@ public:
|
|||||||
* param[in] DockWidget The dock widget this title bar belongs to
|
* param[in] DockWidget The dock widget this title bar belongs to
|
||||||
* param[in] parent The parent widget of this title bar
|
* param[in] parent The parent widget of this title bar
|
||||||
*/
|
*/
|
||||||
CDockWidgetTab(CDockWidget* DockWidget, QWidget* parent = 0);
|
CDockWidgetTab(CDockWidget* DockWidget, QWidget* parent = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual Destructor
|
* Virtual Destructor
|
||||||
@@ -178,6 +180,26 @@ public:
|
|||||||
*/
|
*/
|
||||||
void setIconSize(const QSize& Size);
|
void setIconSize(const QSize& Size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current drag state of this tab.
|
||||||
|
* Use this function to determine if the tab is currently being dragged
|
||||||
|
*/
|
||||||
|
eDragState dragState() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fills the provided menu with standard entries. If a nullptr is passed, a
|
||||||
|
* new menu is created and filled with standard entries.
|
||||||
|
* This function is called from the actual version of contextMenuEvent, but
|
||||||
|
* can be called from any code. Caller is responsible of deleting the created
|
||||||
|
* object.
|
||||||
|
*
|
||||||
|
* @param menu The QMenu to fill with standard entries. If nullptr, a new
|
||||||
|
* QMenu will be created.
|
||||||
|
* @return The filled QMenu, either the provided one or a newly created one if
|
||||||
|
* nullptr was passed.
|
||||||
|
*/
|
||||||
|
virtual QMenu *buildContextMenu(QMenu *);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
virtual void setVisible(bool visible) override;
|
virtual void setVisible(bool visible) override;
|
||||||
|
|
||||||
|
|||||||
@@ -58,8 +58,8 @@ protected:
|
|||||||
public:
|
public:
|
||||||
using Super = QLabel;
|
using Super = QLabel;
|
||||||
|
|
||||||
CElidingLabel(QWidget* parent = 0, Qt::WindowFlags f = Qt::WindowFlags ());
|
CElidingLabel(QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags ());
|
||||||
CElidingLabel(const QString& text, QWidget* parent = 0, Qt::WindowFlags f = Qt::WindowFlags ());
|
CElidingLabel(const QString& text, QWidget* parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags ());
|
||||||
virtual ~CElidingLabel();
|
virtual ~CElidingLabel();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -357,7 +357,7 @@ static const char* windowsMessageString(int MessageId)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static unsigned int zOrderCounter = 0;
|
static unsigned int zOrderCounterFloating = 0;
|
||||||
/**
|
/**
|
||||||
* Private data class of CFloatingDockContainer class (pimpl)
|
* Private data class of CFloatingDockContainer class (pimpl)
|
||||||
*/
|
*/
|
||||||
@@ -365,7 +365,7 @@ struct FloatingDockContainerPrivate
|
|||||||
{
|
{
|
||||||
CFloatingDockContainer *_this;
|
CFloatingDockContainer *_this;
|
||||||
CDockContainerWidget *DockContainer;
|
CDockContainerWidget *DockContainer;
|
||||||
unsigned int zOrderIndex = ++zOrderCounter;
|
unsigned int zOrderIndex = ++zOrderCounterFloating;
|
||||||
QPointer<CDockManager> DockManager;
|
QPointer<CDockManager> DockManager;
|
||||||
eDragState DraggingState = DraggingInactive;
|
eDragState DraggingState = DraggingInactive;
|
||||||
QPoint DragStartMousePosition;
|
QPoint DragStartMousePosition;
|
||||||
@@ -760,6 +760,7 @@ CFloatingDockContainer::CFloatingDockContainer(CDockWidget *DockWidget) :
|
|||||||
d->DockManager->notifyWidgetOrAreaRelocation(DockWidget);
|
d->DockManager->notifyWidgetOrAreaRelocation(DockWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CFloatingDockContainer::~CFloatingDockContainer()
|
CFloatingDockContainer::~CFloatingDockContainer()
|
||||||
{
|
{
|
||||||
@@ -771,6 +772,36 @@ CFloatingDockContainer::~CFloatingDockContainer()
|
|||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CFloatingDockContainer::deleteContent()
|
||||||
|
{
|
||||||
|
std::vector<QPointer<ads::CDockAreaWidget>> areas;
|
||||||
|
for (int i = 0; i != dockContainer()->dockAreaCount(); ++i)
|
||||||
|
{
|
||||||
|
areas.push_back( dockContainer()->dockArea(i) );
|
||||||
|
}
|
||||||
|
for (auto area : areas)
|
||||||
|
{
|
||||||
|
if (!area)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// QPointer delete safety - just in case some dock widget in destruction
|
||||||
|
// deletes another related/twin or child dock widget.
|
||||||
|
std::vector<QPointer<QWidget>> deleteWidgets;
|
||||||
|
for (auto widget : area->dockWidgets())
|
||||||
|
{
|
||||||
|
deleteWidgets.push_back(widget);
|
||||||
|
}
|
||||||
|
for (auto ptrWdg : deleteWidgets)
|
||||||
|
{
|
||||||
|
delete ptrWdg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
CDockContainerWidget* CFloatingDockContainer::dockContainer() const
|
CDockContainerWidget* CFloatingDockContainer::dockContainer() const
|
||||||
{
|
{
|
||||||
@@ -787,7 +818,7 @@ void CFloatingDockContainer::changeEvent(QEvent *event)
|
|||||||
if (isActiveWindow())
|
if (isActiveWindow())
|
||||||
{
|
{
|
||||||
ADS_PRINT("FloatingWidget::changeEvent QEvent::ActivationChange ");
|
ADS_PRINT("FloatingWidget::changeEvent QEvent::ActivationChange ");
|
||||||
d->zOrderIndex = ++zOrderCounter;
|
d->zOrderIndex = ++zOrderCounterFloating;
|
||||||
|
|
||||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
||||||
if (d->DraggingState == DraggingFloatingWidget)
|
if (d->DraggingState == DraggingFloatingWidget)
|
||||||
@@ -1142,7 +1173,7 @@ QList<CDockWidget*> CFloatingDockContainer::dockWidgets() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CFloatingDockContainer::hideAndDeleteLater()
|
void CFloatingDockContainer::finishDropOperation()
|
||||||
{
|
{
|
||||||
// Widget has been redocked, so it must be hidden right way (see
|
// Widget has been redocked, so it must be hidden right way (see
|
||||||
// https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/351)
|
// https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/351)
|
||||||
@@ -1150,6 +1181,11 @@ void CFloatingDockContainer::hideAndDeleteLater()
|
|||||||
// dock widgets that shall not be toggled hidden.
|
// dock widgets that shall not be toggled hidden.
|
||||||
d->AutoHideChildren = false;
|
d->AutoHideChildren = false;
|
||||||
hide();
|
hide();
|
||||||
|
// The floating widget will be deleted now. Ensure, that the destructor
|
||||||
|
// of the floating widget does not delete any dock areas that have been
|
||||||
|
// moved to a new container - simply remove all dock areas before deleting
|
||||||
|
// the floating widget
|
||||||
|
d->DockContainer->removeAllDockAreas();
|
||||||
deleteLater();
|
deleteLater();
|
||||||
if (d->DockManager)
|
if (d->DockManager)
|
||||||
{
|
{
|
||||||
@@ -1295,7 +1331,8 @@ void CFloatingDockContainer::onMaximizeRequest()
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
void CFloatingDockContainer::showNormal(bool fixGeometry)
|
void CFloatingDockContainer::showNormal(bool fixGeometry)
|
||||||
{
|
{
|
||||||
if (windowState() == Qt::WindowMaximized)
|
if ( (windowState() & Qt::WindowMaximized) != 0 ||
|
||||||
|
(windowState() & Qt::WindowFullScreen) != 0)
|
||||||
{
|
{
|
||||||
QRect oldNormal = normalGeometry();
|
QRect oldNormal = normalGeometry();
|
||||||
Super::showNormal();
|
Super::showNormal();
|
||||||
|
|||||||
@@ -131,21 +131,19 @@ protected:
|
|||||||
virtual void startFloating(const QPoint& DragStartMousePos, const QSize& Size,
|
virtual void startFloating(const QPoint& DragStartMousePos, const QSize& Size,
|
||||||
eDragState DragState, QWidget* MouseEventHandler) override;
|
eDragState DragState, QWidget* MouseEventHandler) override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Call this function to start dragging the floating widget
|
|
||||||
*/
|
|
||||||
void startDragging(const QPoint& DragStartMousePos, const QSize& Size,
|
|
||||||
QWidget* MouseEventHandler)
|
|
||||||
{
|
|
||||||
startFloating(DragStartMousePos, Size, DraggingFloatingWidget, MouseEventHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call this function if you explicitly want to signal that dragging has
|
* Call this function if you explicitly want to signal that dragging has
|
||||||
* finished
|
* finished
|
||||||
*/
|
*/
|
||||||
virtual void finishDragging() override;
|
virtual void finishDragging() override;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function deletes all dock widgets in it.
|
||||||
|
* This functions should be called only from dock manager in its
|
||||||
|
* destructor before deleting the floating widget
|
||||||
|
*/
|
||||||
|
void deleteContent();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call this function if you just want to initialize the position
|
* Call this function if you just want to initialize the position
|
||||||
* and size of the floating widget
|
* and size of the floating widget
|
||||||
@@ -229,6 +227,15 @@ public:
|
|||||||
*/
|
*/
|
||||||
CDockContainerWidget* dockContainer() const;
|
CDockContainerWidget* dockContainer() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call this function to start dragging the floating widget
|
||||||
|
*/
|
||||||
|
void startDragging(const QPoint& DragStartMousePos, const QSize& Size,
|
||||||
|
QWidget* MouseEventHandler)
|
||||||
|
{
|
||||||
|
startFloating(DragStartMousePos, Size, DraggingFloatingWidget, MouseEventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function returns true, if it can be closed.
|
* This function returns true, if it can be closed.
|
||||||
* It can be closed, if all dock widgets in all dock areas can be closed
|
* It can be closed, if all dock widgets in all dock areas can be closed
|
||||||
@@ -258,9 +265,9 @@ public:
|
|||||||
QList<CDockWidget*> dockWidgets() const;
|
QList<CDockWidget*> dockWidgets() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function hides the floating bar instantely and delete it later.
|
* This function hides the floating widget instantly and delete it later.
|
||||||
*/
|
*/
|
||||||
void hideAndDeleteLater();
|
void finishDropOperation();
|
||||||
|
|
||||||
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACOS)
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ xcb_atom_t xcb_get_atom(const char *name)
|
|||||||
}
|
}
|
||||||
xcb_connection_t *connection = x11_connection();
|
xcb_connection_t *connection = x11_connection();
|
||||||
xcb_intern_atom_cookie_t request = xcb_intern_atom(connection, 1, strlen(name), name);
|
xcb_intern_atom_cookie_t request = xcb_intern_atom(connection, 1, strlen(name), name);
|
||||||
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, request, NULL);
|
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, request, nullptr);
|
||||||
if (!reply)
|
if (!reply)
|
||||||
{
|
{
|
||||||
return XCB_ATOM_NONE;
|
return XCB_ATOM_NONE;
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ enum SideBarLocation
|
|||||||
SideBarBottom,
|
SideBarBottom,
|
||||||
SideBarNone
|
SideBarNone
|
||||||
};
|
};
|
||||||
Q_ENUMS(SideBarLocation);
|
Q_ENUMS(SideBarLocation)
|
||||||
|
|
||||||
|
|
||||||
namespace internal
|
namespace internal
|
||||||
@@ -167,6 +167,7 @@ static const bool RestoreTesting = true;
|
|||||||
static const bool Restore = false;
|
static const bool Restore = false;
|
||||||
static const char* const ClosedProperty = "close";
|
static const char* const ClosedProperty = "close";
|
||||||
static const char* const DirtyProperty = "dirty";
|
static const char* const DirtyProperty = "dirty";
|
||||||
|
static const char* const LocationProperty = "Location";
|
||||||
extern const int FloatingWidgetDragStartEvent;
|
extern const int FloatingWidgetDragStartEvent;
|
||||||
extern const int DockedWidgetDragStartEvent;
|
extern const int DockedWidgetDragStartEvent;
|
||||||
|
|
||||||
|
|||||||
@@ -137,11 +137,11 @@ CFloatingWidgetTitleBar::CFloatingWidgetTitleBar(CFloatingDockContainer *parent)
|
|||||||
d->FloatingWidget = parent;
|
d->FloatingWidget = parent;
|
||||||
d->createLayout();
|
d->createLayout();
|
||||||
|
|
||||||
auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, 0, d->MaximizeButton);
|
auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, nullptr, d->MaximizeButton);
|
||||||
d->NormalIcon.addPixmap(normalPixmap, QIcon::Normal);
|
d->NormalIcon.addPixmap(normalPixmap, QIcon::Normal);
|
||||||
d->NormalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
|
d->NormalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
|
||||||
|
|
||||||
auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, 0, d->MaximizeButton);
|
auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, nullptr, d->MaximizeButton);
|
||||||
d->MaximizeIcon.addPixmap(maxPixmap, QIcon::Normal);
|
d->MaximizeIcon.addPixmap(maxPixmap, QIcon::Normal);
|
||||||
d->MaximizeIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
|
d->MaximizeIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
|
||||||
setMaximizedIcon(d->Maximized);
|
setMaximizedIcon(d->Maximized);
|
||||||
|
|||||||
Reference in New Issue
Block a user