Compute scrollbar extent using alternate props
This computation is close enough, and removes the need for private headers.
This commit is contained in:
parent
0da17d895c
commit
ee48fddd5e
6 changed files with 9 additions and 142 deletions
|
@ -342,28 +342,6 @@ if (USE_DBUS)
|
||||||
else()
|
else()
|
||||||
endif (USE_DBUS)
|
endif (USE_DBUS)
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
|
|
||||||
function(check_private_headers_exist module private_includes_var)
|
|
||||||
message(STATUS "Checking whether private include directories for module ${module} exist")
|
|
||||||
foreach(_dir ${private_includes_var})
|
|
||||||
if(NOT EXISTS "${_dir}")
|
|
||||||
message(FATAL_ERROR "The private include directory ${_dir} for module ${module} do not exist! Please make sure your Qt5 installation contains private headers.\nThe required directories:\n ${private_includes_var}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
function(check_private_header_exists _file _dirs)
|
|
||||||
set(_found FALSE)
|
|
||||||
foreach(_dir ${_dirs})
|
|
||||||
if(EXISTS "${_dir}/${_file}")
|
|
||||||
set(_found TRUE)
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
if(NOT _found)
|
|
||||||
message(FATAL_ERROR "The private include file ${_file} was not found in directory ${_dirs}! Please make sure your Qt5 installation contains private headers.")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
## Qt5 setup setup
|
## Qt5 setup setup
|
||||||
if (ENABLE_QT)
|
if (ENABLE_QT)
|
||||||
|
@ -373,23 +351,6 @@ if (ENABLE_QT)
|
||||||
message(STATUS "Will enable Qt launcher GUI")
|
message(STATUS "Will enable Qt launcher GUI")
|
||||||
message(STATUS " Qt5Widgets version: ${Qt5Widgets_VERSION_STRING}")
|
message(STATUS " Qt5Widgets version: ${Qt5Widgets_VERSION_STRING}")
|
||||||
message(STATUS " Qt5Widgets include dir: ${Qt5Widgets_INCLUDE_DIRS}")
|
message(STATUS " Qt5Widgets include dir: ${Qt5Widgets_INCLUDE_DIRS}")
|
||||||
|
|
||||||
# copied from KDAB's GammaRay CMakeLists.txt
|
|
||||||
# Sanity checking, we need private includes for the following modules
|
|
||||||
|
|
||||||
check_private_headers_exist("Qt5Gui" "${Qt5Gui_PRIVATE_INCLUDE_DIRS}")
|
|
||||||
|
|
||||||
#HACK: CMake with broken Qt5Quick_PRIVATE_INCLUDE_DIRS
|
|
||||||
if (NOT "${Qt5Quick_PRIVATE_INCLUDE_DIRS}" MATCHES "/QtQuick/")
|
|
||||||
string(REPLACE "/QtCore" "/QtQuick" replaceme "${Qt5Core_PRIVATE_INCLUDE_DIRS}")
|
|
||||||
list(APPEND Qt5Quick_PRIVATE_INCLUDE_DIRS ${Qt5Qml_PRIVATE_INCLUDE_DIRS})
|
|
||||||
list(APPEND Qt5Quick_PRIVATE_INCLUDE_DIRS ${replaceme})
|
|
||||||
list(REMOVE_DUPLICATES Qt5Quick_PRIVATE_INCLUDE_DIRS)
|
|
||||||
endif()
|
|
||||||
check_private_header_exists("private/qquickitem_p.h" "${Qt5Quick_PRIVATE_INCLUDE_DIRS}")
|
|
||||||
|
|
||||||
message(STATUS " Qt5Quick private include dir: ${Qt5Quick_PRIVATE_INCLUDE_DIRS}")
|
|
||||||
|
|
||||||
set(HAVE_QT 1)
|
set(HAVE_QT 1)
|
||||||
else()
|
else()
|
||||||
# don't try to build FGQCanvas if Qt wasn't found correctly
|
# don't try to build FGQCanvas if Qt wasn't found correctly
|
||||||
|
|
|
@ -148,15 +148,13 @@ if (HAVE_QT)
|
||||||
PreviewImageItem.hxx
|
PreviewImageItem.hxx
|
||||||
ThumbnailImageItem.cxx
|
ThumbnailImageItem.cxx
|
||||||
ThumbnailImageItem.hxx
|
ThumbnailImageItem.hxx
|
||||||
FlickableExtentQuery.cxx
|
|
||||||
FlickableExtentQuery.hxx
|
|
||||||
PopupWindowTracker.cxx
|
PopupWindowTracker.cxx
|
||||||
PopupWindowTracker.hxx
|
PopupWindowTracker.hxx
|
||||||
)
|
)
|
||||||
|
|
||||||
set_property(TARGET fgqmlui PROPERTY AUTOMOC ON)
|
set_property(TARGET fgqmlui PROPERTY AUTOMOC ON)
|
||||||
target_link_libraries(fgqmlui Qt5::Quick Qt5::Network Qt5::Qml SimGearCore)
|
target_link_libraries(fgqmlui Qt5::Quick Qt5::Network Qt5::Qml SimGearCore)
|
||||||
target_include_directories(fgqmlui PRIVATE ${PROJECT_BINARY_DIR}/src/GUI ${Qt5Quick_PRIVATE_INCLUDE_DIRS})
|
target_include_directories(fgqmlui PRIVATE ${PROJECT_BINARY_DIR}/src/GUI)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
#include "FlickableExtentQuery.hxx"
|
|
||||||
|
|
||||||
#include <QtQuick/private/qquickflickable_p.h>
|
|
||||||
|
|
||||||
class FriendFlickable : public QQuickFlickable
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class FlickableExtentQuery;
|
|
||||||
};
|
|
||||||
|
|
||||||
FlickableExtentQuery::FlickableExtentQuery(QObject *parent) : QObject(parent)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
qreal FlickableExtentQuery::verticalExtent() const
|
|
||||||
{
|
|
||||||
QQuickFlickable* flick = qobject_cast<QQuickFlickable*>(m_flickable);
|
|
||||||
if (!flick) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FriendFlickable* ff = static_cast<FriendFlickable*>(flick);
|
|
||||||
qreal extent = -ff->maxYExtent() + ff->minYExtent();
|
|
||||||
return extent;
|
|
||||||
}
|
|
||||||
|
|
||||||
qreal FlickableExtentQuery::minYExtent() const
|
|
||||||
{
|
|
||||||
QQuickFlickable* flick = qobject_cast<QQuickFlickable*>(m_flickable);
|
|
||||||
if (!flick) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FriendFlickable* ff = static_cast<FriendFlickable*>(flick);
|
|
||||||
return ff->minYExtent();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FlickableExtentQuery::setFlickable(QQuickItem *flickable)
|
|
||||||
{
|
|
||||||
if (m_flickable == flickable)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_flickable = flickable;
|
|
||||||
emit flickableChanged(m_flickable);
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
#ifndef FLICKABLEEXTENTQUERY_HXX
|
|
||||||
#define FLICKABLEEXTENTQUERY_HXX
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QQuickItem>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief FlickableExtentQuery exists to expose some unfortunately private
|
|
||||||
* information from a Flickable, to mimic what QQC2 Scrollbar does internlly.
|
|
||||||
*/
|
|
||||||
class FlickableExtentQuery : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
Q_PROPERTY(QQuickItem* flickable READ flickable WRITE setFlickable NOTIFY flickableChanged)
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit FlickableExtentQuery(QObject *parent = nullptr);
|
|
||||||
|
|
||||||
QQuickItem* flickable() const
|
|
||||||
{
|
|
||||||
return m_flickable;
|
|
||||||
}
|
|
||||||
|
|
||||||
Q_INVOKABLE qreal verticalExtent() const;
|
|
||||||
|
|
||||||
Q_INVOKABLE qreal minYExtent() const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
void flickableChanged(QQuickItem* flickable);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
|
|
||||||
void setFlickable(QQuickItem* flickable);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QQuickItem* m_flickable = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FLICKABLEEXTENTQUERY_HXX
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include "RecentLocationsModel.hxx"
|
#include "RecentLocationsModel.hxx"
|
||||||
#include "ThumbnailImageItem.hxx"
|
#include "ThumbnailImageItem.hxx"
|
||||||
#include "PreviewImageItem.hxx"
|
#include "PreviewImageItem.hxx"
|
||||||
#include "FlickableExtentQuery.hxx"
|
|
||||||
#include "MPServersModel.h"
|
#include "MPServersModel.h"
|
||||||
#include "AircraftSearchFilterModel.hxx"
|
#include "AircraftSearchFilterModel.hxx"
|
||||||
#include "DefaultAircraftLocator.hxx"
|
#include "DefaultAircraftLocator.hxx"
|
||||||
|
@ -101,7 +100,6 @@ void LauncherController::initQML()
|
||||||
qmlRegisterUncreatableType<MPServersModel>("FlightGear.Launcher", 1, 0, "MPServers", "Singleton API");
|
qmlRegisterUncreatableType<MPServersModel>("FlightGear.Launcher", 1, 0, "MPServers", "Singleton API");
|
||||||
|
|
||||||
qmlRegisterType<FileDialogWrapper>("FlightGear.Launcher", 1, 0, "FileDialog");
|
qmlRegisterType<FileDialogWrapper>("FlightGear.Launcher", 1, 0, "FileDialog");
|
||||||
qmlRegisterType<FlickableExtentQuery>("FlightGear.Launcher", 1, 0, "FlickableExtentQuery");
|
|
||||||
qmlRegisterType<QmlAircraftInfo>("FlightGear.Launcher", 1, 0, "AircraftInfo");
|
qmlRegisterType<QmlAircraftInfo>("FlightGear.Launcher", 1, 0, "AircraftInfo");
|
||||||
qmlRegisterType<PopupWindowTracker>("FlightGear.Launcher", 1, 0, "PopupWindowTracker");
|
qmlRegisterType<PopupWindowTracker>("FlightGear.Launcher", 1, 0, "PopupWindowTracker");
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import QtQuick 2.4
|
import QtQuick 2.4
|
||||||
import FlightGear.Launcher 1.0
|
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
|
@ -8,7 +7,6 @@ Item
|
||||||
implicitWidth: 14
|
implicitWidth: 14
|
||||||
|
|
||||||
property Flickable flickable: parent
|
property Flickable flickable: parent
|
||||||
|
|
||||||
readonly property real heightRatio: flickable ? flickable.visibleArea.heightRatio : 0
|
readonly property real heightRatio: flickable ? flickable.visibleArea.heightRatio : 0
|
||||||
|
|
||||||
readonly property int barSize: Math.max(height * heightRatio, width * 3);
|
readonly property int barSize: Math.max(height * heightRatio, width * 3);
|
||||||
|
@ -24,9 +22,10 @@ Item
|
||||||
return visArea.yPosition / (1.0 - visArea.heightRatio);
|
return visArea.yPosition / (1.0 - visArea.heightRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
FlickableExtentQuery {
|
function verticalExtent()
|
||||||
id: extentQuery
|
{
|
||||||
flickable: root.flickable
|
var f = root.flickable;
|
||||||
|
return (f.height / f.visibleArea.heightRatio) - f.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
@ -35,8 +34,7 @@ Item
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
onClicked: {
|
onClicked: {
|
||||||
var clickPos = (mouse.y / height)
|
var clickPos = (mouse.y / height)
|
||||||
var cy = clickPos * extentQuery.verticalExtent() - extentQuery.minYExtent();
|
flickable.contentY = clickPos * verticalExtent();
|
||||||
flickable.contentY = cy;
|
|
||||||
}
|
}
|
||||||
visible: root.enabled
|
visible: root.enabled
|
||||||
}
|
}
|
||||||
|
@ -76,10 +74,9 @@ Item
|
||||||
|
|
||||||
onMouseYChanged: {
|
onMouseYChanged: {
|
||||||
var position = (thumb.y / root.scrollRange)
|
var position = (thumb.y / root.scrollRange)
|
||||||
var cy = position * extentQuery.verticalExtent() - extentQuery.minYExtent();
|
flickable.contentY = position * verticalExtent();
|
||||||
flickable.contentY = cy;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // of track item
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue