Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • videolan/vlc
  • chouquette/vlc
  • bakiewicz.marek122/vlc
  • devnexen/vlc
  • rohanrajpal/vlc
  • blurrrb/vlc
  • gsoc/gsoc2019/darkapex/vlc
  • b1ue/vlc
  • fkuehne/vlc
  • magsoft/vlc
  • chub/vlc
  • cramiro9/vlc
  • robUx4/vlc
  • rom1v/vlc
  • akshayaky/vlc
  • tmk907/vlc
  • akymaster/vlc
  • govind.sharma/vlc
  • psilokos/vlc
  • xjbeta/vlc
  • jahan/vlc
  • 1480c1/vlc
  • amanchande/vlc
  • aaqib/vlc
  • rist/vlc
  • apol/vlc
  • mindfreeze/vlc
  • alexandre-janniaux/vlc
  • sandsmark/vlc
  • jagannatharjun/vlc
  • gsoc/gsoc2020/matiaslgonzalez/vlc
  • gsoc/gsoc2020/jagannatharjun/vlc
  • mstorsjo/vlc
  • gsoc/gsoc2020/vedenta/vlc
  • gsoc/gsoc2020/arnav-ishaan/vlc
  • gsoc/gsoc2020/andreduong/vlc
  • fuzun/vlc
  • gsoc/gsoc2020/vatsin/vlc
  • gsoc/gsoc2020/sagid/vlc
  • yaron/vlc
  • Phoenix/vlc
  • Garf/vlc
  • ePiratWorkarounds/vlc
  • tguillem/vlc
  • jnqnfe/vlc
  • mdc/vlc
  • Vedaa/vlc
  • rasa/vlc
  • quink/vlc
  • yealo/vlc
  • aleksey_ak/vlc
  • ePirat/vlc
  • ilya.yanok/vlc
  • asenat/vlc
  • m/vlc
  • bunjee/vlc
  • BLumia/vlc
  • sagudev/vlc
  • hamedmonji30/vlc
  • nullgemm/vlc
  • DivyamAhuja/vlc
  • thesamesam/vlc
  • dag7/vlc
  • snehil101/vlc
  • haasn/vlc
  • jbk/vlc
  • ValZapod/vlc
  • mfkl/vlc
  • WangChuan/vlc
  • core1024/vlc
  • GhostVaibhav/vlc
  • dfuhrmann/vlc
  • davide.prade/vlc
  • tmatth/vlc
  • Courmisch/vlc
  • zouya/vlc
  • hpi/vlc
  • EwoutH/vlc
  • aleung27/vlc
  • hengwu0/vlc
  • saladin/vlc
  • ashuio/vlc
  • richselwood/vlc
  • verma16Ayush/vlc
  • chemicalflash/vlc
  • PoignardAzur/vlc
  • huangjieNT/vlc
  • Blake-Haydon/vlc
  • AnuthaDev/vlc
  • gsoc/gsoc2021/mpd/vlc
  • nicolas_lequec/vlc
  • sambassaly/vlc
  • thresh/vlc
  • bonniegong/vlc
  • myaashish/vlc
  • stavros.vagionitis/vlc
  • ileoo/vlc
  • louis-santucci/vlc
  • cchristiansen/vlc
  • sabyasachi07/vlc
  • AbduAmeen/vlc
  • ashishb0410/vlc
  • urbanhusky/vlc
  • davidepietrasanta/vlc
  • riksleutelstad/vlc
  • jeremyVignelles/vlc
  • komh/vlc
  • iamjithinjohn/vlc
  • JohannesKauffmann/vlc2
  • kunglao/vlc
  • natzberg/vlc
  • jill/vlc
  • cwendling/vlc
  • adufou/vlc
  • ErwanAirone/vlc
  • HasinduDilshan10/vlc
  • vagrantc/vlc
  • rafiv/macos-bigsur-icon
  • Aymeriic/vlc
  • saranshg20/vlc
  • metzlove24/vlc
  • linkfanel/vlc
  • Ds886/vlc
  • metehan-arslan/vlc
  • Skantes/vlc
  • kgsandundananjaya96/vlc
  • mitchcapper/vlc
  • advaitgupta/vlc
  • StefanBruens/vlc
  • ratajs/vlc
  • T.M.F.B.3761/vlc
  • m222059/vlc
  • casemerrick/vlc
  • joshuaword2alt/vlc
  • sjwaddy/vlc
  • dima/vlc
  • Ybalrid/vlc
  • umxprime/vlc
  • eschmidt/vlc
  • vannieuwenhuysenmichelle/vlc
  • badcf00d/vlc
  • wesinator/vlc
  • louis/vlc
  • xqq/vlc
  • EmperorYP7/vlc
  • NicoLiam/vlc
  • loveleen/vlc
  • rofferom/vlc
  • rbultje/vlc
  • TheUnamed/vlc
  • pratiksharma341/vlc
  • Saurab17/vlc
  • purist.coder/vlc
  • Shuicheng/vlc
  • mdrrubel292/vlc
  • silverbleu00/vlc
  • metif12/vlc
  • asher-m/vlc
  • jeffk/vlc
  • Brandonbr1/vlc
  • beautyyuyanli/vlc
  • rego21/vlc
  • muyangren907/vlc
  • collectionbylawrencejason/vlc
  • evelez/vlc
  • GSMgeeth/vlc
  • Oneric/vlc
  • TJ5/vlc
  • XuanTung95/vlc
  • darrenjenny21/vlc
  • Trenly/vlc
  • RockyTDR/vlc
  • mjakubowski/vlc
  • caprica/vlc
  • ForteFrankie/vlc
  • seannamiller19/vlc
  • junlon2006/vlc
  • kiwiren6666/vlc
  • iuseiphonexs/vlc
  • fenngtun/vlc
  • Rajdutt999/vlc
  • typx/vlc
  • leon.vitanos/vlc
  • robertogarci0938/vlc
  • gsoc/gsoc2022/luc65r/vlc-mpd
  • skeller/vlc
  • MCJack123/vlc
  • luc65r/vlc-mpd
  • popov895/vlc
  • claucambra/vlc
  • brad/vlc
  • matthewmurua88/vlc
  • Tomas8874/vlc
  • philenotfound/vlc
  • makita-do3/vlc
  • LZXCorp/vlc
  • mar0x/vlc
  • senojetkennedy0102/vlc
  • shaneb243/vlc
  • ahmadbader/vlc
  • rajduttcse26/vlc-audio-filters
  • Juniorzito8415/vlc
  • achernyakov/vlc
  • lucasjetgroup/vlc
  • pupdoggy666/vlc
  • gmde9363/vlc
  • alexnwayne/vlc
  • bahareebrahimi781/vlc
  • hamad633666/vlc
  • umghof3112/vlc
  • joe0199771874/vlc
  • Octocats66666666/vlc
  • jjm_223/vlc
  • btech10110.19/vlc
  • sunnykfc028/vlc-audio-filters
  • loic/vlc
  • nguyenminhducmx1/vlc
  • JanekKrueger/vlc
  • bstubbington2/vlc
  • rcombs/vlc
  • Ordissimo/vlc
  • king7532/vlc
  • noobsauce101/vlc
  • schong0525/vlc
  • myQwil/vlc
  • apisbg91/vlc
  • geeboy0101017/vlc
  • kim.faughey/vlc
  • nurupo/vlc
  • yyusea/vlc
  • 0711235879.khco/vlc
  • ialo/vlc
  • iloveyeye2/vlc
  • gdtdftdqtd/vlc
  • leandroconsiglio/vlc
  • AndyHTML2012/vlc
  • ncz/vlc
  • lucenticus/vlc
  • knr1931/vlc
  • kjoonlee/vlc
  • chandrakant100/vlc-qt
  • johge42/vlc
  • polter/vlc
  • hexchain/vlc
  • Tushwrld/vlc
  • mztea928/vlc
  • jbelloncastro/vlc
  • alvinhochun/vlc
  • ghostpiratecrow/vlc
  • ujjwaltwitx/vlc
  • alexsonarin06/vlc
  • adrianbon76/vlc
  • altsod/vlc
  • damien.lucas44/vlc
  • dmytrivtaisa/vlc
  • utk202/vlc
  • aaxhrj/vlc
  • thomas.hermes/vlc
  • structurenewworldorder/vlc
  • slomo/vlc
  • wantlamy/vlc
  • musc.o3cminc/vlc
  • thebarshablog/vlc
  • kerrick/vlc
  • kratos142518/vlc
  • leogps/vlc
  • vacantron/vlc
  • luna_koly/vlc
  • Ratio2/vlc
  • anuoshemohammad/vlc
  • apsun/vlc
  • aaa1115910/vlc
  • alimotmoyo/vlc
  • Ambossmann/vlc
  • Sam-LearnsToCode/vlc
  • Chilledheart/vlc
  • Labnann/vlc
  • ktcoooot1/vlc
  • mohit-marathe/vlc
  • johnddx/vlc
  • manstabuk/vlc
  • Omar-ahmed314/vlc
  • vineethkm/vlc
  • 9Enemi86/vlc
  • radoslav.m.panteleev/vlc
  • ashishami2002/vlc
  • Corbax/vlc
  • firnasahmed/vlc
  • pelayarmalam4/vlc
  • c0ff330k/vlc
  • shikhindahikar/vlc
  • l342723951/vlc
  • christianschwandner/vlc
  • douniwan5788/vlc
  • 7damian7/vlc
  • ferdnyc/vlc
  • f.ales1/vlc
  • pandagby/vlc
  • BaaBaa/vlc
  • jewe37/vlc
  • w00drow/vlc
  • russelltg/vlc
  • ironicallygod/vlc
  • soumyaDghosh/vlc
  • linzihao1999/vlc
  • deyayush6/vlc
  • mibi88/vlc
  • newabdallah10/vlc
  • jhorbincolombia/vlc
  • rimvihaqueshupto/vlc
  • andrewkhon98/vlc
  • fab78/vlc
  • lapaz17/vlc
  • amanna13/vlc
  • mdakram28/vlc
  • 07jw1980/vlc
  • sohamgupta/vlc
  • Eson-Jia1/vlc
  • Sumou/vlc
  • vikram-kangotra/vlc
  • chalice191/vlc
  • olivercalder/vlc
  • aaasg4001/vlc
  • zipdox/vlc
  • kwizart/vlc
  • Dragon-S/vlc
  • jdemeule/vlc
  • gabriel_lt/vlc
  • locutusofborg/vlc
  • sammirata/vlc-librist
  • another/vlc
  • Benjamin_Loison/vlc
  • ahmedmoselhi/vlc
  • petergaal/vlc
  • huynhsontung/vlc
  • dariusmihut/vlc
  • tvermaashutosh/vlc
  • buti/vlc
  • Niram7777/vlc
  • rohan-here/vlc
  • balaji-sivasakthi/vlc
  • rlindner81/vlc
  • Kakadus/vlc
  • djain/vlc
  • ABBurmeister/vlc
  • craighuggins/vlc
  • orbea/vlc
  • maxos/vlc
  • aakarshmj/vlc
  • kblaschke/vlc
  • ankitm/vlc
  • advait-0/vlc
  • mohak2003/vlc
  • yselkowitz/vlc
  • AZM999/vlc-azm
  • andrey.turkin/vlc
  • Disha-Baghel/vlc
  • nowrep/vlc
  • Apeng/vlc
  • Choucroute_melba/vlc
  • autra/vlc
  • eclipseo/vlc
  • fhuber/vlc
  • olafhering/vlc
  • sdasda7777/vlc
  • 1div0/vlc
  • skosnits/vlc-extended-playlist-support
  • dnicolson/vlc
  • Timshel/vlc
  • octopols/vlc
  • MangalK/vlc
  • nima64/vlc
  • misawai/vlc
  • Alexander-Wilms/vlc
  • Maxime2/vlc-fork-for-visualizer
  • ww/vlc
  • jeske/vlc
  • sgross-emlix/vlc
  • morenonatural/vlc
  • freakingLovesVLC/vlc
  • borisgolovnev/vlc
  • mpromonet/vlc
  • diogo.simao-marques/vlc
  • masstock/vlc
  • pratikpatel8982/vlc
  • hugok79/vlc
  • longervision/vlc
  • abhiudaysurya/vlc
  • rishabhgarg/vlc
  • tumic/vlc
  • cart/vlc
  • shubham442/vlc
  • Aditya692005/vlc
  • sammirata/vlc4
  • syrykh/vlc
  • Vvorcun/macos-new-icon
  • AyaanshC/vlc
  • nasso/vlc
  • Quark/vlc
  • sebastinas/vlc
  • rhstone/vlc
  • talregev/vlc
  • Managor/vlc
403 results
Show changes
Commits on Source (10)
Showing
with 516 additions and 26 deletions
......@@ -243,6 +243,8 @@ libqt_plugin_la_SOURCES = \
gui/qt/util/navigation_history.cpp gui/qt/util/navigation_history.hpp \
gui/qt/util/item_key_event_filter.cpp \
gui/qt/util/item_key_event_filter.hpp \
gui/qt/util/flickable_scroll_handler.cpp \
gui/qt/util/flickable_scroll_handler.hpp \
gui/qt/util/qt_dirs.cpp gui/qt/util/qt_dirs.hpp \
gui/qt/util/qvlcapp.hpp \
gui/qt/util/proxycolumnmodel.hpp \
......@@ -420,6 +422,7 @@ nodist_libqt_plugin_la_SOURCES = \
gui/qt/util/navigation_history.moc.cpp \
gui/qt/util/item_key_event_filter.moc.cpp \
gui/qt/util/mouse_event_filter.moc.cpp \
gui/qt/util/flickable_scroll_handler.moc.cpp \
gui/qt/util/qvlcapp.moc.cpp \
gui/qt/util/renderer_manager.moc.cpp \
gui/qt/util/selectable_list_model.moc.cpp \
......@@ -843,6 +846,8 @@ libqt_plugin_la_QML = \
gui/qt/style/qmldir \
gui/qt/util/qml/Helpers.js \
gui/qt/util/qml/SelectableDelegateModel.qml \
gui/qt/util/qml/MultipleBinding.qml \
gui/qt/util/qml/FlickableScrollHandler.qml \
gui/qt/widgets/qml/ActionButtonOverlay.qml \
gui/qt/widgets/qml/ActionButtonPrimary.qml \
gui/qt/widgets/qml/BannerTabButton.qml \
......
......@@ -22,6 +22,7 @@ import QtQml.Models 2.11
import org.videolan.vlc 0.1
import "qrc:///style/"
import "qrc:///util/" as Util
ListView {
id: playerBtnDND
......@@ -33,9 +34,6 @@ ListView {
currentIndex: -1
highlightFollowsCurrentItem: false
boundsBehavior: Flickable.StopAtBounds
boundsMovement: Flickable.StopAtBounds
property bool containsDrag: footerItem.dropVisible
property alias scrollBar: scrollBar
......@@ -94,6 +92,15 @@ ListView {
}
}
MouseEventFilter {
target: playerBtnDND
}
Util.FlickableScrollHandler {
fallbackScroll: true
enabled: true
}
MouseArea {
anchors.fill: parent
......@@ -101,21 +108,6 @@ ListView {
z: -1
cursorShape: root.dragActive ? Qt.DragMoveCursor : Qt.ArrowCursor
onWheel: {
// scrolling based on angleDelta.x is handled by the listview itself
var y = wheel.angleDelta.y
if (y > 0) {
scrollBar.decrease()
wheel.accepted = true
} else if (y < 0) {
scrollBar.increase()
wheel.accepted = true
} else {
wheel.accepted = false
}
}
}
footer: Item {
......
......@@ -25,8 +25,11 @@ import org.videolan.vlc 0.1
import "qrc:///player/"
import "qrc:///style/"
import "qrc:///widgets/" as Widgets
import "qrc:///util/" as Util
GridView {
id: root
clip: true
ScrollBar.vertical: ScrollBar { policy: ScrollBar.AlwaysOn }
......@@ -38,11 +41,14 @@ GridView {
cellWidth: VLCStyle.cover_small
cellHeight: cellWidth
boundsBehavior: Flickable.StopAtBounds
boundsMovement: Flickable.StopAtBounds
property alias removeInfoRectVisible: removeInfoRect.visible
MouseEventFilter {
target: root
}
Util.FlickableScrollHandler { }
DropArea {
id: dropArea
anchors.fill: parent
......
......@@ -294,6 +294,8 @@ void MainCtx::loadPrefs(const bool callSignals)
#if QT_CLIENT_SIDE_DECORATION_AVAILABLE
loadFromVLCOption(m_windowTitlebar, "qt-titlebar" , &MainCtx::useClientSideDecorationChanged);
#endif
loadFromVLCOption(m_smoothScroll, "qt-smooth-scrolling", &MainCtx::smoothScrollChanged);
}
void MainCtx::loadFromSettingsImpl(const bool callSignals)
......
......@@ -172,6 +172,7 @@ class MainCtx : public QObject
Q_PROPERTY(bool hasAcrylicSurface READ hasAcrylicSurface NOTIFY hasAcrylicSurfaceChanged FINAL)
Q_PROPERTY(PlaylistPtr mainPlaylist READ getMainPlaylist CONSTANT FINAL)
Q_PROPERTY(vlc::playlist::PlaylistControllerModel* mainPlaylistController READ getMainPlaylistController CONSTANT FINAL)
Q_PROPERTY(bool smoothScroll READ smoothScroll NOTIFY smoothScrollChanged FINAL)
// This Property only works if hasAcrylicSurface is set
Q_PROPERTY(bool acrylicActive READ acrylicActive WRITE setAcrylicActive NOTIFY acrylicActiveChanged FINAL)
......@@ -190,6 +191,7 @@ public:
inline qt_intf_t* getIntf() const { return p_intf; }
inline PlaylistPtr getMainPlaylist() const { return PlaylistPtr(p_intf->p_playlist); }
inline vlc::playlist::PlaylistControllerModel* getMainPlaylistController() const { return p_intf->p_mainPlaylistController; }
bool smoothScroll() const { return m_smoothScroll; };
QSystemTrayIcon *getSysTray() { return sysTray; }
QMenu *getSysTrayMenu() { return systrayMenu.get(); }
......@@ -314,6 +316,8 @@ protected:
bool m_hasAcrylicSurface = false;
bool m_acrylicActive = false;
bool m_smoothScroll = true;
public slots:
void toggleUpdateSystrayMenu();
void showUpdateSystrayMenu();
......@@ -385,6 +389,8 @@ signals:
void acrylicActiveChanged();
void smoothScrollChanged();
private:
void loadPrefs(bool callSignals);
void loadFromSettingsImpl(bool callSignals);
......
......@@ -37,6 +37,7 @@
#include "util/navigation_history.hpp"
#include "util/qmlinputitem.hpp"
#include "util/mouse_event_filter.hpp"
#include "util/flickable_scroll_handler.hpp"
#include "dialogs/help/aboutmodel.hpp"
#include "dialogs/dialogs_provider.hpp"
......@@ -272,6 +273,7 @@ void MainUI::registerQMLTypes()
qmlRegisterType<ItemKeyEventFilter>( uri, versionMajor, versionMinor, "KeyEventFilter" );
qmlRegisterType<MouseEventFilter>( uri, versionMajor, versionMinor, "MouseEventFilter" );
qmlRegisterType<FlickableScrollHandler>( uri, versionMajor, versionMinor, "FlickableScrollHandler" );
qmlRegisterUncreatableType<ControlbarProfileModel>(uri, versionMajor, versionMinor, "ControlbarProfileModel", "");
qmlRegisterUncreatableType<ControlbarProfile>(uri, versionMajor, versionMinor, "ControlbarProfile", "");
......
......@@ -246,6 +246,9 @@ static void ShowDialog ( intf_thread_t *, int, int, intf_dialog_args_t * );
#define QT_COMPOSITOR_TEXT N_("Select Qt video intergration backend")
#define QT_COMPOSITOR_LONGTEXT N_("Select Qt video intergration backend. Use with care, the interface may not start if an incompatible compositor is selected")
#define SMOOTH_SCROLLING_TEXT N_( "Use smooth scrolling in Flickable based views" )
#define SMOOTH_SCROLLING_LONGTEXT N_( "Deactivating this option will disable smooth scrolling in Flickable based views (such as the Playqueue)" )
static const int i_notification_list[] =
{ NOTIFICATION_NEVER, NOTIFICATION_MINIMIZED, NOTIFICATION_ALWAYS };
......@@ -403,6 +406,8 @@ vlc_module_begin ()
AUTORAISE_ON_PLAYBACK_LONGTEXT )
change_integer_list( i_raise_list, psz_raise_list_text )
add_bool( "qt-smooth-scrolling", true, SMOOTH_SCROLLING_TEXT, SMOOTH_SCROLLING_LONGTEXT )
cannot_unload_broken_library()
add_submodule ()
......
/*****************************************************************************
* Copyright (C) 2021 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* ( at your option ) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include "flickable_scroll_handler.hpp"
#include <QApplication>
#include <QStyleHints>
#include <QtQml>
#include <QQmlProperty>
#define OVERRIDE_SCROLLBAR_STEPSIZE true
#define PAGE_SCROLL_SHIFT_OR_CTRL true
FlickableScrollHandler::FlickableScrollHandler(QObject *parent)
: QObject(parent)
{
connect(this, &FlickableScrollHandler::scaleFactorChanged, this, [this]() {
m_effectiveScaleFactor = QApplication::styleHints()->wheelScrollLines() * 20 * m_scaleFactor;
emit effectiveScaleFactorChanged();
});
setScaleFactor(1.0);
QMetaObject::invokeMethod(this, &FlickableScrollHandler::init, Qt::QueuedConnection);
}
FlickableScrollHandler::~FlickableScrollHandler()
{
detach();
}
void FlickableScrollHandler::init()
{
assert(parent());
m_target = qobject_cast<QQuickItem*>(parent());
if (!m_target || !m_target->inherits("QQuickFlickable"))
{
qmlWarning(this) << "Parent is not QQuickFlickable!";
return;
}
const auto qCtx = qmlContext(m_target);
assert(qCtx);
m_propertyContentX = QQmlProperty(m_target, "contentX", qCtx);
m_propertyContentY = QQmlProperty(m_target, "contentY", qCtx);
m_propertyContentHeight = QQmlProperty(m_target, "contentHeight", qCtx);
m_propertyContentWidth = QQmlProperty(m_target, "contentWidth", qCtx);
m_propertyHeight = QQmlProperty(m_target, "height", qCtx);
m_propertyWidth = QQmlProperty(m_target, "width", qCtx);
m_scrollBarV.scrollBar = QQmlProperty(m_target, "ScrollBar.vertical", qCtx);
m_scrollBarH.scrollBar = QQmlProperty(m_target, "ScrollBar.horizontal", qCtx);
adjustScrollBarV();
adjustScrollBarH();
m_scrollBarV.scrollBar.connectNotifySignal(this, SLOT(adjustScrollBarV()));
m_scrollBarH.scrollBar.connectNotifySignal(this, SLOT(adjustScrollBarH()));
if (enabled())
attach();
emit initialized();
}
bool FlickableScrollHandler::eventFilter(QObject *watched, QEvent *event)
{
assert (event);
assert (watched == m_target);
if (event->type() != QEvent::Wheel)
return QObject::eventFilter(watched, event);
const auto wheel = static_cast<QWheelEvent *>(event);
struct {
QPoint delta;
enum class Type {
Pixel,
Degree
} type;
} ev;
using Type = decltype(ev)::Type;
if (!wheel->pixelDelta().isNull() && (wheel->pixelDelta().manhattanLength() % 120))
{
ev.delta = wheel->pixelDelta();
ev.type = Type::Pixel;
}
else if (!wheel->angleDelta().isNull())
{
ev.delta = wheel->angleDelta() / 8 / 15;
ev.type = Type::Degree;
}
else
return false;
if (wheel->inverted())
{
ev.delta = -ev.delta;
}
const auto handler = [this, wheel, ev](Qt::Orientation orientation, bool fallback = false) {
const auto vertical = (orientation == Qt::Vertical);
const auto handler = [this, vertical](qreal delta, Type type) {
const auto contentSize = vertical ? m_propertyContentHeight.read().toReal()
: m_propertyContentWidth.read().toReal();
const auto pos = vertical ? m_propertyContentY.read().toReal()
: m_propertyContentX.read().toReal();
const auto size = vertical ? m_propertyHeight.read().toReal()
: m_propertyWidth.read().toReal();
if (contentSize < size || pos >= contentSize)
return false;
const auto& scrollBar = vertical ? m_scrollBarV : m_scrollBarH;
if (scrollBar.valid())
{
// Attached ScrollBar is available, use it to scroll
#if !OVERRIDE_SCROLLBAR_STEPSIZE
const auto _stepSize = scrollBar.stepSize.read().toReal();
#endif
qreal newStepSize = delta;
if (type == Type::Degree)
newStepSize *= (m_effectiveScaleFactor / contentSize);
else
newStepSize *= (1.0 / contentSize);
scrollBar.stepSize.write(qBound<qreal>(0, qAbs(newStepSize), 1));
if (newStepSize > 0)
scrollBar.decreaseMethod.invoke(scrollBar.item);
else
scrollBar.increaseMethod.invoke(scrollBar.item);
#if !OVERRIDE_SCROLLBAR_STEPSIZE
scrollBar.stepSize.write(_stepSize);
#endif
}
else
{
qreal newPos = pos;
if (type == Type::Degree)
newPos -= (m_effectiveScaleFactor * delta);
else
newPos -= delta;
newPos = qBound<qreal>(0, newPos, contentSize - size);
if (vertical)
m_propertyContentY.write(newPos);
else
m_propertyContentX.write(newPos);
}
return (vertical ? (!qFuzzyCompare(m_propertyContentY.read().toReal(), pos))
: (!qFuzzyCompare(m_propertyContentX.read().toReal(), pos)));
};
const bool _vertical = (fallback ? !vertical : vertical);
qreal _delta = _vertical ? ev.delta.y() : ev.delta.x();
auto _type = ev.type;
#if PAGE_SCROLL_SHIFT_OR_CTRL
if (_delta != 0 && (wheel->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier)))
{
_type = Type::Pixel;
_delta = (_vertical ? m_propertyHeight.read().toReal()
: m_propertyWidth.read().toReal()) * (_delta > 0 ? 1 : -1);
}
#endif
if (_delta != 0 && handler(_delta, _type))
{
wheel->accept();
return true;
}
return false;
};
bool rV = handler(Qt::Vertical);
bool rH = handler(Qt::Horizontal);
if (m_fallbackScroll && (rV == false && rH == false))
{
if (ev.delta.y() != 0)
rH = handler(Qt::Horizontal, true);
else if (ev.delta.x() != 0)
rV = handler(Qt::Vertical, true);
}
return (rV || rH) || QObject::eventFilter(watched, event);
}
void FlickableScrollHandler::attach()
{
if (m_target)
{
m_target->installEventFilter(this);
}
}
void FlickableScrollHandler::detach()
{
if (m_target)
{
m_target->removeEventFilter(this);
}
}
void FlickableScrollHandler::adjustScrollBar(ScrollBar& scrollBar)
{
const auto item = scrollBar.scrollBar.read().value<QQuickItem *>();
scrollBar.item = item;
if (item)
{
scrollBar.stepSize = QQmlProperty(item, "stepSize", qmlContext(item));
scrollBar.decreaseMethod = item->metaObject()->method(item->metaObject()->indexOfMethod("decrease()"));
scrollBar.increaseMethod = item->metaObject()->method(item->metaObject()->indexOfMethod("increase()"));
}
}
qreal FlickableScrollHandler::scaleFactor() const
{
return m_scaleFactor;
}
void FlickableScrollHandler::setScaleFactor(qreal newScaleFactor)
{
if (qFuzzyCompare(m_scaleFactor, newScaleFactor))
return;
m_scaleFactor = newScaleFactor;
emit scaleFactorChanged();
}
bool FlickableScrollHandler::enabled() const
{
return m_enabled;
}
void FlickableScrollHandler::setEnabled(bool newEnabled)
{
if (m_enabled == newEnabled)
return;
if (newEnabled)
attach();
else
detach();
m_enabled = newEnabled;
emit enabledChanged();
}
void FlickableScrollHandler::adjustScrollBarV()
{
adjustScrollBar(m_scrollBarV);
}
void FlickableScrollHandler::adjustScrollBarH()
{
adjustScrollBar(m_scrollBarH);
}
qreal FlickableScrollHandler::effectiveScaleFactor() const
{
return m_effectiveScaleFactor;
}
/*****************************************************************************
* Copyright (C) 2021 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* ( at your option ) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef FLICKABLE_SCROLL_HANDLER_HPP
#define FLICKABLE_SCROLL_HANDLER_HPP
#include <QObject>
#include <QQmlProperty>
#include <QPointer>
#include <QQuickItem>
class FlickableScrollHandler : public QObject
{
Q_OBJECT
Q_PROPERTY(QObject* parent READ parent NOTIFY initialized FINAL)
Q_PROPERTY(qreal scaleFactor READ scaleFactor WRITE setScaleFactor NOTIFY scaleFactorChanged FINAL)
Q_PROPERTY(qreal effectiveScaleFactor READ effectiveScaleFactor NOTIFY effectiveScaleFactorChanged FINAL)
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged FINAL)
Q_PROPERTY(bool fallbackScroll MEMBER m_fallbackScroll NOTIFY fallbackScrollChanged FINAL)
public:
explicit FlickableScrollHandler(QObject *parent = nullptr);
~FlickableScrollHandler();
qreal scaleFactor() const;
qreal effectiveScaleFactor() const;
bool enabled() const;
void setScaleFactor(qreal newScaleFactor);
void setEnabled(bool newEnabled);
signals:
void initialized();
void scaleFactorChanged();
void enabledChanged();
void effectiveScaleFactorChanged();
void fallbackScrollChanged();
private slots:
void init();
void adjustScrollBarV();
void adjustScrollBarH();
private:
void attach();
void detach();
bool eventFilter(QObject *watched, QEvent *event) override;
private:
QPointer<QQuickItem> m_target = nullptr;
qreal m_scaleFactor;
qreal m_effectiveScaleFactor;
bool m_enabled = true;
bool m_fallbackScroll = false;
QQmlProperty m_propertyContentX, m_propertyContentY;
QQmlProperty m_propertyContentHeight, m_propertyContentWidth;
QQmlProperty m_propertyHeight, m_propertyWidth;
struct ScrollBar {
QQmlProperty scrollBar;
QQmlProperty stepSize;
QMetaMethod increaseMethod;
QMetaMethod decreaseMethod;
QQuickItem* item = nullptr;
bool valid() const { return item != nullptr; };
} m_scrollBarV, m_scrollBarH;
void adjustScrollBar(ScrollBar& scrollBar);
};
#endif // FLICKABLE_SCROLL_HANDLER_HPP
/*****************************************************************************
* Copyright (C) 2021 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* ( at your option ) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
import QtQml 2.11
import org.videolan.vlc 0.1 as VLC
VLC.FlickableScrollHandler {
id: handler
scaleFactor: VLC.MainCtx.intfScaleFactor
enabled: !VLC.MainCtx.smoothScroll
readonly property QtObject _behaviorAdjuster: MultipleBinding {
target: handler.parent
when: !handler.enabled
model: [
{property: "flickDeceleration", value: 3500} /* TODO: Workaround Qt <6.2 */,
{property: "boundsBehavior", value: 0 /* Flickable.StopAtBounds */},
{property: "boundsMovement", value: 0 /* Flickable.StopAtBounds */}
]
}
}
/*****************************************************************************
* Copyright (C) 2021 VLC authors and VideoLAN
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* ( at your option ) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
import QtQml 2.11
QtObject {
id: root
property alias model: instantiator.model
property alias enabled: instantiator.active
property alias asynchronous: instantiator.asynchronous
property QtObject target: null
property bool when
property bool delayed: false
readonly property QtObject _instantiator: Instantiator {
id: instantiator
delegate: Binding {
target: modelData.target ? modelData.target
: root.target
when: modelData.when !== undefined ? modelData.when
: root.when
property: modelData.property
value: modelData.value
delayed: modelData.delayed !== undefined ? modelData.delayed
: root.delayed
}
}
}
......@@ -26,6 +26,8 @@
<file alias="wait4.svg">pixmaps/util/wait4.svg</file>
<file alias="SelectableDelegateModel.qml">util/qml/SelectableDelegateModel.qml</file>
<file alias="Helpers.js">util/qml/Helpers.js</file>
<file alias="MultipleBinding.qml">util/qml/MultipleBinding.qml</file>
<file alias="FlickableScrollHandler.qml">util/qml/FlickableScrollHandler.qml</file>
</qresource>
<qresource prefix="/toolbar">
<file alias="faster.svg">pixmaps/faster.svg</file>
......
......@@ -21,6 +21,7 @@ import org.videolan.vlc 0.1
import "qrc:///style/"
import "qrc:///util/Helpers.js" as Helpers
import "qrc:///util/" as Util
FocusScope {
id: root
......@@ -562,8 +563,6 @@ FocusScope {
id: flickable
flickableDirection: Flickable.VerticalFlick
boundsBehavior: Flickable.StopAtBounds
boundsMovement :Flickable.StopAtBounds
ScrollBar.vertical: ScrollBar {
id: flickableScrollBar
......@@ -589,6 +588,8 @@ FocusScope {
}
}
}
Util.FlickableScrollHandler { }
Loader {
id: headerItemLoader
......
......@@ -20,6 +20,8 @@ import QtQuick.Controls 2.4
import org.videolan.vlc 0.1
import "qrc:///util/" as Util
FocusScope {
id: gridview_id
......@@ -72,6 +74,8 @@ FocusScope {
property int _colCount: Math.floor(width / cellWidth)
Util.FlickableScrollHandler { }
Keys.onPressed: {
var newIndex = -1
if (KeyHelper.matchRight(event)) {
......
......@@ -21,6 +21,7 @@ import org.videolan.vlc 0.1
import "qrc:///style/"
import "qrc:///util/Helpers.js" as Helpers
import "qrc:///util/" as Util
FocusScope {
id: listview_id
......@@ -218,9 +219,6 @@ FocusScope {
section.criteria: ViewSection.FullString
section.delegate: sectionHeading
boundsBehavior: Flickable.StopAtBounds
boundsMovement: Flickable.StopAtBounds
MouseEventFilter {
target: view
......@@ -244,6 +242,8 @@ FocusScope {
// NOTE: We always want a valid 'currentIndex' by default.
onCountChanged: if (count && currentIndex === -1) currentIndex = 0
Util.FlickableScrollHandler { }
Keys.onPressed: {
var newIndex = -1
......