diff --git a/include/wx/qt/window.h b/include/wx/qt/window.h index 3a07aed4c4..90065c928e 100644 --- a/include/wx/qt/window.h +++ b/include/wx/qt/window.h @@ -15,9 +15,8 @@ class QShortcut; template < class T > class QList; class QWidget; -class QScrollWindow; -class QAbstractScrollArea; class QScrollArea; +class QScrollBar; class QPicture; class QPainter; @@ -215,12 +214,11 @@ private: void Init(); QScrollArea *m_qtContainer; - wxScrollBar *m_horzScrollBar; - wxScrollBar *m_vertScrollBar; - void QtOnScrollBarEvent( wxScrollEvent& event ); - - wxScrollBar *QtGetScrollBar( int orientation ) const; - wxScrollBar *QtSetScrollBar( int orientation, wxScrollBar *scrollBar=NULL ); + QScrollBar *m_horzScrollBar; + QScrollBar *m_vertScrollBar; + + QScrollBar *QtGetScrollBar( int orientation ) const; + QScrollBar *QtSetScrollBar( int orientation, QScrollBar *scrollBar=NULL ); bool QtSetBackgroundStyle(); diff --git a/src/qt/window.cpp b/src/qt/window.cpp index 5aa1241f7f..1fb5f111f5 100644 --- a/src/qt/window.cpp +++ b/src/qt/window.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -68,6 +69,69 @@ wxQtScrollArea::wxQtScrollArea( wxWindowQt *parent, wxWindowQt *handler ) { } +class wxQtInternalScrollBar : public wxQtEventSignalHandler< QScrollBar, wxWindowQt > +{ +public: + wxQtInternalScrollBar(wxWindowQt *parent, wxWindowQt *handler ); + void actionTriggered( int action ); + void sliderReleased(); + void valueChanged( int position ); +}; + +wxQtInternalScrollBar::wxQtInternalScrollBar( wxWindowQt *parent, wxWindowQt *handler ) + : wxQtEventSignalHandler< QScrollBar, wxWindowQt >( parent, handler ) +{ + connect( this, &QScrollBar::actionTriggered, this, &wxQtInternalScrollBar::actionTriggered ); + connect( this, &QScrollBar::sliderReleased, this, &wxQtInternalScrollBar::sliderReleased ); +} + + +void wxQtInternalScrollBar::actionTriggered( int action ) +{ + wxEventType eventType = wxEVT_NULL; + switch( action ) + { + case QAbstractSlider::SliderSingleStepAdd: + eventType = wxEVT_SCROLLWIN_LINEDOWN; + break; + case QAbstractSlider::SliderSingleStepSub: + eventType = wxEVT_SCROLLWIN_LINEUP; + break; + case QAbstractSlider::SliderPageStepAdd: + eventType = wxEVT_SCROLLWIN_PAGEDOWN; + break; + case QAbstractSlider::SliderPageStepSub: + eventType = wxEVT_SCROLLWIN_PAGEUP; + break; + case QAbstractSlider::SliderToMinimum: + eventType = wxEVT_SCROLLWIN_TOP; + break; + case QAbstractSlider::SliderToMaximum: + eventType = wxEVT_SCROLLWIN_BOTTOM; + break; + case QAbstractSlider::SliderMove: + eventType = wxEVT_SCROLLWIN_THUMBTRACK; + break; + default: + return; + } + + if ( GetHandler() ) + { + wxScrollWinEvent e( eventType, sliderPosition(), wxQtConvertOrientation( orientation() ) ); + EmitEvent( e ); + } +} + +void wxQtInternalScrollBar::sliderReleased() +{ + if ( GetHandler() ) + { + wxScrollWinEvent e( wxEVT_SCROLLWIN_THUMBRELEASE, sliderPosition(), wxQtConvertOrientation( orientation() ) ); + EmitEvent( e ); + } +} + #if wxUSE_ACCEL || defined( Q_MOC_RUN ) class wxQtShortcutHandler : public QObject, public wxQtSignalHandler< wxWindowQt > { @@ -490,11 +554,9 @@ void wxWindowQt::DoGetTextExtent(const wxString& string, int *x, int *y, int *de /* Returns a scrollbar for the given orientation, or NULL if the scrollbar * has not been previously created and create is false */ -wxScrollBar *wxWindowQt::QtGetScrollBar( int orientation ) const +QScrollBar *wxWindowQt::QtGetScrollBar( int orientation ) const { - wxCHECK_MSG( CanScroll( orientation ), NULL, "Window can't scroll in that orientation" ); - - wxScrollBar *scrollBar = NULL; + QScrollBar *scrollBar = NULL; if ( orientation == wxHORIZONTAL ) scrollBar = m_horzScrollBar; @@ -506,7 +568,7 @@ wxScrollBar *wxWindowQt::QtGetScrollBar( int orientation ) const /* Returns a new scrollbar for the given orientation, or set the scrollbar * passed as parameter */ -wxScrollBar *wxWindowQt::QtSetScrollBar( int orientation, wxScrollBar *scrollBar ) +QScrollBar *wxWindowQt::QtSetScrollBar( int orientation, QScrollBar *scrollBar ) { QScrollArea *scrollArea = QtGetScrollBarsContainer(); wxCHECK_MSG( scrollArea, NULL, "Window without scrolling area" ); @@ -514,30 +576,19 @@ wxScrollBar *wxWindowQt::QtSetScrollBar( int orientation, wxScrollBar *scrollBar // Create a new scrollbar if needed if ( !scrollBar ) { - scrollBar = new wxScrollBar( const_cast< wxWindowQt* >( this ), wxID_ANY, - wxDefaultPosition, wxDefaultSize, - orientation == wxHORIZONTAL ? wxSB_HORIZONTAL : wxSB_VERTICAL); - - // Connect scrollbar events to this window - scrollBar->Bind( wxEVT_SCROLL_LINEUP, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_LINEDOWN, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_PAGEUP, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_PAGEDOWN, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_TOP, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_BOTTOM, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_THUMBTRACK, &wxWindowQt::QtOnScrollBarEvent, this ); - scrollBar->Bind( wxEVT_SCROLL_THUMBRELEASE, &wxWindowQt::QtOnScrollBarEvent, this ); + scrollBar = new wxQtInternalScrollBar(this, this); + scrollBar->setOrientation( orientation == wxHORIZONTAL ? Qt::Horizontal : Qt::Vertical ); } // Let Qt handle layout if ( orientation == wxHORIZONTAL ) { - scrollArea->setHorizontalScrollBar( scrollBar->GetQScrollBar() ); + scrollArea->setHorizontalScrollBar( scrollBar ); m_horzScrollBar = scrollBar; } else { - scrollArea->setVerticalScrollBar( scrollBar->GetQScrollBar() ); + scrollArea->setVerticalScrollBar( scrollBar ); m_vertScrollBar = scrollBar; } return scrollBar; @@ -546,10 +597,8 @@ wxScrollBar *wxWindowQt::QtSetScrollBar( int orientation, wxScrollBar *scrollBar void wxWindowQt::SetScrollbar( int orientation, int pos, int thumbvisible, int range, bool refresh ) { - wxCHECK_RET( CanScroll( orientation ), "Window can't scroll in that orientation" ); - //If not exist, create the scrollbar - wxScrollBar *scrollBar = QtGetScrollBar( orientation ); + QScrollBar *scrollBar = QtGetScrollBar( orientation ); if ( scrollBar == NULL ) scrollBar = QtSetScrollBar( orientation ); @@ -557,79 +606,53 @@ void wxWindowQt::SetScrollbar( int orientation, int pos, int thumbvisible, int r // scrollBar == NULL and it is not a problem if ( scrollBar ) { - scrollBar->SetScrollbar( pos, thumbvisible, range, thumbvisible, refresh ); - if ( HasFlag( wxALWAYS_SHOW_SB ) && ( range == 0 ) ) + scrollBar->setRange( 0, range - thumbvisible ); + scrollBar->setPageStep( thumbvisible ); + scrollBar->blockSignals( true ); + scrollBar->setValue(pos); + scrollBar->blockSignals( false ); + scrollBar->show(); + + if ( HasFlag(wxALWAYS_SHOW_SB) && (range == 0) ) { // Disable instead of hide - scrollBar->GetHandle()->show(); - scrollBar->GetHandle()->setEnabled( false ); + scrollBar->setEnabled( false ); } else - scrollBar->GetHandle()->setEnabled( true ); + scrollBar->setEnabled( true ); } + } void wxWindowQt::SetScrollPos( int orientation, int pos, bool WXUNUSED( refresh )) { - wxScrollBar *scrollBar = QtGetScrollBar( orientation ); + QScrollBar *scrollBar = QtGetScrollBar( orientation ); if ( scrollBar ) - scrollBar->SetThumbPosition( pos ); + scrollBar->setValue( pos ); } int wxWindowQt::GetScrollPos( int orientation ) const { - wxScrollBar *scrollBar = QtGetScrollBar( orientation ); + QScrollBar *scrollBar = QtGetScrollBar( orientation ); wxCHECK_MSG( scrollBar, 0, "Invalid scrollbar" ); - return scrollBar->GetThumbPosition(); + return scrollBar->value(); } int wxWindowQt::GetScrollThumb( int orientation ) const { - wxScrollBar *scrollBar = QtGetScrollBar( orientation ); + QScrollBar *scrollBar = QtGetScrollBar( orientation ); wxCHECK_MSG( scrollBar, 0, "Invalid scrollbar" ); - return scrollBar->GetThumbSize(); + return scrollBar->pageStep(); } int wxWindowQt::GetScrollRange( int orientation ) const { - wxScrollBar *scrollBar = QtGetScrollBar( orientation ); + QScrollBar *scrollBar = QtGetScrollBar( orientation ); wxCHECK_MSG( scrollBar, 0, "Invalid scrollbar" ); - return scrollBar->GetRange(); -} - -// Handle event from scrollbars -void wxWindowQt::QtOnScrollBarEvent( wxScrollEvent& event ) -{ - wxEventType windowEventType = 0; - - // Map the scroll bar event to the corresponding scroll window event: - - wxEventType scrollBarEventType = event.GetEventType(); - if ( scrollBarEventType == wxEVT_SCROLL_TOP ) - windowEventType = wxEVT_SCROLLWIN_TOP; - else if ( scrollBarEventType == wxEVT_SCROLL_BOTTOM ) - windowEventType = wxEVT_SCROLLWIN_BOTTOM; - else if ( scrollBarEventType == wxEVT_SCROLL_PAGEUP ) - windowEventType = wxEVT_SCROLLWIN_PAGEUP; - else if ( scrollBarEventType == wxEVT_SCROLL_PAGEDOWN ) - windowEventType = wxEVT_SCROLLWIN_PAGEDOWN; - else if ( scrollBarEventType == wxEVT_SCROLL_LINEUP ) - windowEventType = wxEVT_SCROLLWIN_LINEUP; - else if ( scrollBarEventType == wxEVT_SCROLL_LINEDOWN ) - windowEventType = wxEVT_SCROLLWIN_LINEDOWN; - else if ( scrollBarEventType == wxEVT_SCROLL_THUMBTRACK ) - windowEventType = wxEVT_SCROLLWIN_THUMBTRACK; - else if ( scrollBarEventType == wxEVT_SCROLL_THUMBRELEASE ) - windowEventType = wxEVT_SCROLLWIN_THUMBRELEASE; - - if ( windowEventType != 0 ) - { - wxScrollWinEvent e( windowEventType, event.GetPosition(), event.GetOrientation() ); - ProcessWindowEvent( e ); - } + return scrollBar->maximum(); } // scroll window to the specified position