From bc5e0ba7d8776b2274e149ebe771b37c0bf19631 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Tue, 4 Feb 2020 09:32:15 +0100 Subject: [PATCH] Fixed some README.md markdown issues and added donate button --- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++------- doc/donate.png | Bin 0 -> 14069 bytes 2 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 doc/donate.png diff --git a/README.md b/README.md index 76d7f9a..9426be9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# Advanced Docking System for Qt +# Advanced Docking System for Qt + [![Build Status](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System.svg?branch=master)](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System) [![Build status](https://ci.appveyor.com/api/projects/status/qcfb3cy932jw9mpy/branch/master?svg=true)](https://ci.appveyor.com/project/githubuser0xFFFF/qt-advanced-docking-system/branch/master) [![License: LGPL v2.1](https://img.shields.io/badge/License-LGPL%20v2.1-blue.svg)](gnu-lgpl-v2.1.md) @@ -20,18 +21,36 @@ code quality, readibility and to fix all issues from the issue tracker of his docking system project. ## Features + ### Overview -- [Docking everywhere - no central widget](#docking-everywhere---no-central-widget) -- [Docking inside floating windows](#docking-inside-floating-windows) -- [Grouped dragging](#grouped-dragging) -- [Perspectives for fast switching of the complete main window layout](#perspectives-for-fast-switching-of-the-complete-main-window-layout) -- [Opaque and non-opaque splitter resizing](#opaque-and-non-opaque-splitter-resizing) -- [Opaque and non-opaque undocking](#opaque-and-non-opaque-undocking) -- [Tab-menu for easy handling of many tabbed dock widgets](#tab-menu-for-easy-handling-of-many-tabbed-dock-widgets) -- [Many different ways to detach dock widgets](#many-different-ways-to-detach-dock-widgets) -- [Supports deletion of dynamically created dock widgets](#supports-deletion-of-dynamically-created-dock-widgets) + +- [Advanced Docking System for Qt](#advanced-docking-system-for-qt) + - [Features](#features) + - [Overview](#overview) + - [Docking everywhere - no central widget](#docking-everywhere---no-central-widget) + - [Docking inside floating windows](#docking-inside-floating-windows) + - [Grouped dragging](#grouped-dragging) + - [Perspectives for fast switching of the complete main window layout](#perspectives-for-fast-switching-of-the-complete-main-window-layout) + - [Opaque and non-opaque splitter resizing](#opaque-and-non-opaque-splitter-resizing) + - [Opaque and non-opaque undocking](#opaque-and-non-opaque-undocking) + - [Tab-menu for easy handling of many tabbed dock widgets](#tab-menu-for-easy-handling-of-many-tabbed-dock-widgets) + - [Many different ways to detach dock widgets](#many-different-ways-to-detach-dock-widgets) + - [Supports deletion of dynamically created dock widgets](#supports-deletion-of-dynamically-created-dock-widgets) + - [Tested Compatible Environments](#tested-compatible-environments) + - [Windows](#windows) + - [macOS](#macos) + - [Linux](#linux) + - [Build](#build) + - [Getting started / Example](#getting-started--example) + - [Developers](#developers) + - [License information](#license-information) + - [Alternative Docking System Implementations](#alternative-docking-system-implementations) + - [KDDockWidgets](#kddockwidgets) + - [QtitanDocking](#qtitandocking) + - [Donation](#donation) ### Docking everywhere - no central widget + There is no central widget like in the Qt docking system. 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. @@ -41,6 +60,7 @@ free to dock almost everywhere. ![Dropping widgets](doc/preview-dragndrop_dark.png) ### Docking inside floating windows + There is no difference between the main window and a floating window. Docking into floating windows is supported. @@ -49,6 +69,7 @@ into floating windows is supported. ![Docking inside floating windows](doc/floating-widget-dragndrop_dark.png) ### Grouped dragging + When dragging the titlebar of a dock, all the tabs that are tabbed with it are going to be dragged. So you can move complete groups of tabbed widgets into a floating widget or from one dock area to another one. @@ -58,6 +79,7 @@ a floating widget or from one dock area to another one. ![Grouped dragging](doc/grouped-dragging_dark.png) ### Perspectives for fast switching of the complete main window layout + A perspective defines the set and layout of dock windows in the main window. You can save the current layout of the dockmanager into a named perspective to make your own custom perspective. Later you can simply @@ -69,6 +91,7 @@ main window layout. ![Perspective](doc/perspectives_dark.png) ### Opaque and non-opaque splitter resizing + The advanced docking system uses standard QSplitters as resize separators and thus supports opaque and non-opaque resizing functionality of QSplitter. In some rare cases, for very complex widgets or on slow machines resizing via separator on the fly may cause flicking and glaring of rendered content inside a widget. The global dock manager flag `OpaqueSplitterResize` configures the resizing behaviour of the splitters. If this flag is set, then widgets are resized dynamically (opaquely) while interactively moving the splitters. ![Opaque resizing](doc/opaque_resizing.gif) @@ -78,6 +101,7 @@ If this flag is cleared, the widget resizing is deferred until the mouse button ![Non-opaque resizing](doc/non_opaque_resizing.gif) ### Opaque and non-opaque undocking + By default, opaque undocking is active. That means, as soon as you drag a dock widget or a dock area with a number of dock widgets it will be undocked and moved into a floating widget and then the floating widget will be dragged around. That means undocking will take place immediatelly. You can compare this with opaque splitter resizing. If the flag `OpaqueUndocking` is cleared, then non-opaque undocking is active. In this mode, undocking is more like a standard drag and drop operation. That means, the dragged dock widget or dock area is not undocked immediatelly. Instead, a drag preview widget is created and dragged around to indicate the future position of the dock widget or dock area. The actual dock operation is only executed when the mouse button is released. That makes it possible, to cancel an active drag operation with the escape key. The drag preview widget can be configured by a number of global dock manager flags: @@ -88,26 +112,33 @@ The drag preview widget can be configured by a number of global dock manager fla The best way to test non-opaque undocking is to set the standard flags: `CDockManager::setConfigFlags(CDockManager::DefaultNonOpaqueConfig)`. ### Tab-menu for easy handling of many tabbed dock widgets + Tabs are a good way to quickly switch between dockwidgets in a dockarea. However, if the number of dockwidgets in a dockarea is too large, this may affect the usability of the tab bar. To keep track in this situation, you can use the tab menu. The menu allows you to quickly select the dockwidget you want to activate from a drop down menu. ![Tab menu](doc/tab_menu.gif) ### Many different ways to detach dock widgets + You can detach dock widgets and also dock areas in the following ways: + - by dragging the dock widget tab or the dock area title bar - by double clicking the tab or title bar - by using the detach menu entry from the tab and title bar drop down menu ### Supports deletion of dynamically created dock widgets + Normally clicking the close button of a dock widget will just hide the widget and the user can show it again using the toggleView() action of the dock widget. This is meant for user interfaces with a static amount of widgets. But the advanced docking system also supports dynamic dock widgets that will get deleted on close. If you set the dock widget flag `DockWidgetDeleteOnClose` for a certain dock widget, then it will be deleted as soon as you close this dock widget. This enables the implementation of user interfaces with dynamically created editors, like in word processing applications or source code development tools. ## Tested Compatible Environments + ### Windows + Windows 10 [![Build status](https://ci.appveyor.com/api/projects/status/qcfb3cy932jw9mpy/branch/master?svg=true)](https://ci.appveyor.com/project/githubuser0xFFFF/qt-advanced-docking-system/branch/master) The library was developed on and for Windows. It is used in a commercial Windows application and is therefore constantly tested. ### macOS + macOS [![Build Status](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System.svg?branch=master)](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System) The application can be compiled for macOS. A user reported, that the library works on macOS. If have not tested it. @@ -115,6 +146,7 @@ The application can be compiled for macOS. A user reported, that the library wor ![Advanced Docking on macOS](doc/macos.png) ### Linux + Ubuntu [![Build Status](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System.svg?branch=master)](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System) [![Build status](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/workflows/linux-builds/badge.svg)](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds) @@ -127,10 +159,12 @@ and with **Ubuntu 19.10** ![Advanced Docking on Ubuntu Linux](doc/linux_ubuntu_1910.png) ## Build + Open the `ads.pro` with QtCreator and start the build, that's it. You can run the demo project and test it yourself. ## Getting started / Example + The following example shows the minimum code required to use the advanced Qt docking system. *MainWindow.h* @@ -158,7 +192,9 @@ private: ads::CDockManager* m_DockManager; }; ``` + *MainWindow.cpp* + ```cpp #include "MainWindow.h" #include "ui_MainWindow.h" @@ -202,17 +238,22 @@ MainWindow::~MainWindow() ``` ## Developers + - Uwe Kindler, Project Maintainer - Manuel Freiholz ## License information + [![License: LGPL v2.1](https://img.shields.io/badge/License-LGPL%20v2.1-blue.svg)](gnu-lgpl-v2.1.md) This project uses the [LGPLv2.1 license](gnu-lgpl-v2.1.md) + ## Alternative Docking System Implementations + If this Qt Advanced Docking System does not fit to your needs you may consider some of the alternative docking system solutions for Qt. ### KDDockWidgets + This is an advanced docking framework for Qt from [KDAB](https://www.kdab.com/). The interesting thing is, that they separated GUI code from logic, so they can easily provide a QtQuick backend in the future. - [Blog post about KDDockWidgets](https://www.kdab.com/kddockwidgets/) @@ -220,6 +261,15 @@ This is an advanced docking framework for Qt from [KDAB](https://www.kdab.com/). ### QtitanDocking + This is a commercial component from [Developer Machines](https://www.devmachines.com/) for Qt Framework that allows to create a Microsoft like dockable user interface. They also offer a lot of other interesting and useful components for Qt. - [Product page](https://www.devmachines.com/qtitandocking-overview.html) + +## Donation + +If this project help you reduce time to develop, you can give me a cup of coffee :wink:. + + + Donate with PayPal + diff --git a/doc/donate.png b/doc/donate.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0b0abd54ea4e69f5924abad73d92903bb77dc0 GIT binary patch literal 14069 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 literal 0 HcmV?d00001