Hide 'Exit fullscreen' button during scrolling (improves performance)
authorChristian Pulvermacher <pulvermacher@gmx.de>
Wed, 1 Feb 2012 22:34:22 +0000 (23:34 +0100)
committerChristian Pulvermacher <pulvermacher@gmx.de>
Wed, 1 Feb 2012 22:34:22 +0000 (23:34 +0100)
src/fullscreenexitbutton.h
src/mainwindow.cpp
src/scrollarea.h

index c968eb9..56dde25 100644 (file)
 **
 ** If you have questions regarding the use of this file, please contact
 ** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
+
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -42,8 +35,8 @@
 #ifndef FULLSCREENEXITBUTTON_H
 #define FULLSCREENEXITBUTTON_H
 
-#include <QtGui/qtoolbutton.h>
-#include <QtGui/qevent.h>
+#include <QToolButton>
+#include <QEvent>
 #include <QTimer>
 
 class FullScreenExitButton : public QToolButton
@@ -52,11 +45,13 @@ class FullScreenExitButton : public QToolButton
 public:
     inline explicit FullScreenExitButton(QWidget *parent);
 
+public slots:
+    inline void reenable();
 protected:
     inline bool eventFilter(QObject *obj, QEvent *ev);
 
 private:
-    QTimer timer;
+    QTimer hide_timer;
 };
 
 FullScreenExitButton::FullScreenExitButton(QWidget *parent)
@@ -85,9 +80,9 @@ FullScreenExitButton::FullScreenExitButton(QWidget *parent)
     setAutoFillBackground(true);
 
     // hide after 4s of inactivity
-    connect(&timer, SIGNAL(timeout()), this, SLOT(hide()));
-    timer.setInterval(4000);
-    timer.setSingleShot(true);
+    connect(&hide_timer, SIGNAL(timeout()), this, SLOT(hide()));
+    hide_timer.setInterval(4000);
+    hide_timer.setSingleShot(true);
 
     // install an event filter to listen for the parent's events
     parent->installEventFilter(this);
@@ -97,6 +92,8 @@ FullScreenExitButton::FullScreenExitButton(QWidget *parent)
 
 bool FullScreenExitButton::eventFilter(QObject *obj, QEvent *ev)
 {
+    if(!isEnabled())
+        return QToolButton::eventFilter(obj, ev);
     if (obj != parent())
         return QToolButton::eventFilter(obj, ev);
 
@@ -113,13 +110,13 @@ bool FullScreenExitButton::eventFilter(QObject *obj, QEvent *ev)
         setVisible(isFullScreen);
         if (isFullScreen)
             raise();
-        timer.start();
+        hide_timer.start();
         break;
         // fall through
     case QEvent::Resize:
         if (isVisible()) {
             move(parent->width() - width(), parent->height() - height());
-            timer.start();
+            hide_timer.start();
         }
         break;
     default:
@@ -129,4 +126,16 @@ bool FullScreenExitButton::eventFilter(QObject *obj, QEvent *ev)
     return QToolButton::eventFilter(obj, ev);
 }
 
+void FullScreenExitButton::reenable()
+{
+    setEnabled(true);
+
+    const QWidget *parent = parentWidget();
+    const bool isFullScreen = parent->windowState() & Qt::WindowFullScreen;
+    setVisible(isFullScreen);
+    if (isFullScreen)
+        raise();
+    hide_timer.start();
+}
+
 #endif
index 86970c6..07bcf51 100644 (file)
@@ -17,7 +17,6 @@
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    */
 #include "connectdialog.h"
-#include "fullscreenexitbutton.h"
 #include "keymenu.h"
 #include "mainwindow.h"
 #include "preferences.h"
@@ -40,7 +39,7 @@
 MainWindow::MainWindow(QString url, int quality, int listen_port, bool view_only):
     QMainWindow(0),
     vnc_view(0),
-    scroll_area(new ScrollArea(0)),
+    scroll_area(new ScrollArea(this)),
     input_toolbuttons(new QActionGroup(this)),
     key_menu(0)
 {
@@ -134,8 +133,7 @@ MainWindow::MainWindow(QString url, int quality, int listen_port, bool view_only
 
     setCentralWidget(scroll_area);
 
-    FullScreenExitButton* fullscreen_exit_button = new FullScreenExitButton(this);
-    connect(fullscreen_exit_button, SIGNAL(clicked()),
+    connect(scroll_area, SIGNAL(fullscreenButtonClicked()),
             this, SLOT(toggleFullscreen()));
 
     grabZoomKeys(true);
index fa59830..912a4c0 100644 (file)
@@ -19,6 +19,8 @@
 #ifndef SCROLLAREA_H
 #define SCROLLAREA_H
 
+#include "fullscreenexitbutton.h"
+
 #include <QScrollArea>
 #include <QLabel>
 #include <QTimer>
@@ -30,7 +32,8 @@ class ScrollArea : public QScrollArea
 public:
     explicit ScrollArea(QWidget *parent):
         QScrollArea(parent),
-        message(this)
+        message(this),
+        fullscreen_exit_button(parent) //owned by parent!
     {
         message.setVisible(false);
         message.setAlignment(Qt::AlignCenter);
@@ -44,10 +47,18 @@ public:
         message.setAutoFillBackground(true);
 
         message_timer.setSingleShot(true);
-        message_timer.setInterval(2500);
+        message_timer.setInterval(4000);
         connect(&message_timer, SIGNAL(timeout()),
                 &message, SLOT(hide()));
 
+        connect(&fullscreen_exit_button, SIGNAL(clicked()),
+            this, SIGNAL(fullscreenButtonClicked()));
+
+        button_reenable_timer.setSingleShot(true);
+        button_reenable_timer.setInterval(500);
+        connect(&button_reenable_timer, SIGNAL(timeout()),
+                &fullscreen_exit_button, SLOT(reenable()));
+
 #ifdef Q_WS_MAEMO_5
         // disable overshooting because it somehow causes repaint events for the whole widget (slow)
         QAbstractKineticScroller *scroller = property("kineticScroller").value<QAbstractKineticScroller *>();
@@ -65,6 +76,9 @@ public slots:
 
     //provided for convenience
     void showMessage(QString /*title*/, QString msg) { showMessage(msg); }
+
+signals:
+    void fullscreenButtonClicked();
 protected:
     virtual void resizeEvent(QResizeEvent* ev) {
         QScrollArea::resizeEvent(ev);
@@ -72,11 +86,18 @@ protected:
     }
     virtual void scrollContentsBy(int dx, int dy) {
         QScrollArea::scrollContentsBy(dx, dy);
-        if(widget())
-            message.hide(); //overlay-widget slows down scrolling
+        if(widget()) {
+            //overlay-widgets slow down scrolling
+            message.hide();
+            fullscreen_exit_button.hide();
+            fullscreen_exit_button.setEnabled(false);
+            button_reenable_timer.start();
+        }
     }
 private:
     QLabel message;
     QTimer message_timer;
+    FullScreenExitButton fullscreen_exit_button;
+    QTimer button_reenable_timer;
 };
 #endif