child like behaviour for the widget

This commit is contained in:
Mohammed Nafees 2014-04-08 23:38:49 +05:30
parent 136b91feb5
commit ba7c696786
10 changed files with 210 additions and 49 deletions

View file

@ -4,22 +4,22 @@
<context>
<name>Application</name>
<message>
<location filename="src/Application.cpp" line="1397"/>
<location filename="src/Application.cpp" line="1400"/>
<source>Export Voxels</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/Application.cpp" line="1398"/>
<location filename="src/Application.cpp" line="1401"/>
<source>Sparse Voxel Octree Files (*.svo)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/Application.cpp" line="3730"/>
<location filename="src/Application.cpp" line="3749"/>
<source>Open Script</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="src/Application.cpp" line="3731"/>
<location filename="src/Application.cpp" line="3750"/>
<source>JavaScript Files (*.js)</source>
<translation type="unfinished"></translation>
</message>
@ -162,51 +162,51 @@
<name>RunningScriptsWidget</name>
<message>
<location filename="ui/runningScriptsWidget.ui" line="14"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="138"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="140"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="39"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="139"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="141"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-size:18pt;&quot;&gt;Running Scripts&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="63"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="140"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="142"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Currently running&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="88"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="141"/>
<location filename="ui/runningScriptsWidget.ui" line="89"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="143"/>
<source>Reload all</source>
<oldsource>Reload All</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="114"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="142"/>
<location filename="ui/runningScriptsWidget.ui" line="116"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="144"/>
<source>Stop all</source>
<oldsource>Stop All</oldsource>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="135"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="143"/>
<location filename="ui/runningScriptsWidget.ui" line="137"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="145"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Recently loaded&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="152"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="144"/>
<location filename="ui/runningScriptsWidget.ui" line="154"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="146"/>
<source>(click a script or use the 1-9 keys to load and run it)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ui/runningScriptsWidget.ui" line="200"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="146"/>
<location filename="ui/runningScriptsWidget.ui" line="202"/>
<location filename="../build/interface/ui_runningScriptsWidget.h" line="148"/>
<source>There are no scripts currently running.</source>
<translation type="unfinished"></translation>
</message>

View file

@ -30,7 +30,6 @@
#include <QImage>
#include <QInputDialog>
#include <QKeyEvent>
#include <QMainWindow>
#include <QMenuBar>
#include <QMouseEvent>
#include <QNetworkAccessManager>
@ -135,7 +134,7 @@ QString& Application::resourcesPath() {
Application::Application(int& argc, char** argv, timeval &startup_time) :
QApplication(argc, argv),
_window(new QMainWindow(desktop())),
_window(new MainWindow(desktop())),
_glWidget(new GLCanvas()),
_statsExpanded(false),
_nodeThread(new QThread(this)),
@ -172,7 +171,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_resetRecentMaxPacketsSoon(true),
_previousScriptLocation(),
_logger(new FileLogger(this)),
_runningScriptsWidget(new RunningScriptsWidget)
_runningScriptsWidget(new RunningScriptsWidget),
_runningScriptsWidgetWasVisible(false)
{
// read the ApplicationInfo.ini file for Name/Version/Domain information
QSettings applicationInfo(Application::resourcesPath() + "info/ApplicationInfo.ini", QSettings::IniFormat);
@ -335,7 +335,6 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
LocalVoxelsList::getInstance()->addPersistantTree(CLIPBOARD_TREE_NAME, &_clipboard);
_window->addDockWidget(Qt::NoDockWidgetArea, _runningScriptsWidget);
_runningScriptsWidget->hide();
_runningScriptsWidget->setRunningScripts(getRunningScripts());
connect(_runningScriptsWidget, &RunningScriptsWidget::stopScriptName, this, &Application::stopScript);
@ -352,6 +351,10 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
// do this as late as possible so that all required subsystems are inialized
loadScripts();
}
connect(_window, &MainWindow::windowGeometryChanged,
_runningScriptsWidget, &RunningScriptsWidget::setBoundary);
connect(_window, &MainWindow::windowShown, this, &Application::manageRunningScriptsWidgetVisibility);
}
Application::~Application() {
@ -622,7 +625,7 @@ void Application::resizeGL(int width, int height) {
updateProjectionMatrix();
glLoadIdentity();
if (_runningScriptsWidget->isVisible()) {
if (_runningScriptsWidget->toggleViewAction()->isChecked()) {
_runningScriptsWidget->setGeometry(_window->geometry().topLeft().x(),
_window->geometry().topLeft().y(),
_runningScriptsWidget->width(), _window->height());
@ -3630,19 +3633,33 @@ void Application::reloadAllScripts() {
}
}
void Application::manageRunningScriptsWidgetVisibility(bool shown)
{
if (_runningScriptsWidgetWasVisible && shown) {
_runningScriptsWidget->setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint |
Qt::WindowStaysOnTopHint);
_runningScriptsWidget->show();
} else {
_runningScriptsWidget->setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint);
_runningScriptsWidget->hide();
}
}
void Application::toggleRunningScriptsWidget()
{
if (!_runningScriptsWidget->toggleViewAction()->isChecked()) {
if (_runningScriptsWidget->toggleViewAction()->isChecked()) {
_runningScriptsWidget->toggleViewAction()->setChecked(false);
_runningScriptsWidget->hide();
_runningScriptsWidgetWasVisible = false;
} else {
_runningScriptsWidget->setBoundary(QRect(_window->geometry().topLeft(),
_window->size()));
_runningScriptsWidget->setGeometry(_window->geometry().topLeft().x(),
_window->geometry().topLeft().y(),
_runningScriptsWidget->width(), _window->height());
_runningScriptsWidget->toggleViewAction()->trigger();
_runningScriptsWidget->grabKeyboard();
_runningScriptsWidget->toggleViewAction()->setChecked(true);
_runningScriptsWidget->show();
} else {
_runningScriptsWidget->toggleViewAction()->trigger();
_runningScriptsWidget->releaseKeyboard();
_runningScriptsWidget->hide();
_runningScriptsWidgetWasVisible = true;
}
}

View file

@ -33,6 +33,7 @@
#include <ViewFrustum.h>
#include <VoxelEditPacketSender.h>
#include "MainWindow.h"
#include "Audio.h"
#include "BuckyBalls.h"
#include "Camera.h"
@ -78,7 +79,6 @@ class QAction;
class QActionGroup;
class QGLWidget;
class QKeyEvent;
class QMainWindow;
class QMouseEvent;
class QNetworkAccessManager;
class QSettings;
@ -127,6 +127,7 @@ public:
void keyReleaseEvent(QKeyEvent* event);
void focusOutEvent(QFocusEvent* event);
void focusInEvent(QFocusEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event);
@ -180,7 +181,7 @@ public:
QSettings* lockSettings() { _settingsMutex.lock(); return _settings; }
void unlockSettings() { _settingsMutex.unlock(); }
QMainWindow* getWindow() { return _window; }
MainWindow* getWindow() { return _window; }
NodeToOctreeSceneStats* getOcteeSceneStats() { return &_octreeServerSceneStats; }
void lockOctreeSceneStats() { _octreeSceneStatsLock.lockForRead(); }
void unlockOctreeSceneStats() { _octreeSceneStatsLock.unlock(); }
@ -290,6 +291,8 @@ private slots:
void parseVersionXml();
void manageRunningScriptsWidgetVisibility(bool shown);
private:
void resetCamerasOnResizeGL(Camera& camera, int width, int height);
void updateProjectionMatrix();
@ -353,7 +356,7 @@ private:
void displayRearMirrorTools();
QMainWindow* _window;
MainWindow* _window;
GLCanvas* _glWidget; // our GLCanvas has a couple extra features
bool _statsExpanded;
@ -502,6 +505,7 @@ private:
RunningScriptsWidget* _runningScriptsWidget;
QHash<QString, ScriptEngine*> _scriptEnginesHash;
bool _runningScriptsWidgetWasVisible;
};
#endif /* defined(__interface__Application__) */

View file

@ -21,8 +21,8 @@ GLCanvas::GLCanvas() : QGLWidget(QGLFormat(QGL::NoDepthBuffer)),
{
}
bool GLCanvas::isThrottleRendering() const {
return _throttleRendering || Application::getInstance()->getWindow()->isMinimized();
bool GLCanvas::isThrottleRendering() const {
return _throttleRendering || Application::getInstance()->getWindow()->isMinimized();
}
void GLCanvas::initializeGL() {
@ -31,7 +31,7 @@ void GLCanvas::initializeGL() {
setAcceptDrops(true);
connect(Application::getInstance(), SIGNAL(applicationStateChanged(Qt::ApplicationState)), this, SLOT(activeChanged(Qt::ApplicationState)));
connect(&_frameTimer, SIGNAL(timeout()), this, SLOT(throttleRender()));
// Note, we *DO NOT* want Qt to automatically swap buffers for us. This results in the "ringing" bug mentioned in WL#19514 when we're throttling the framerate.
setAutoBufferSwap(false);
}
@ -78,14 +78,14 @@ void GLCanvas::activeChanged(Qt::ApplicationState state) {
_frameTimer.stop();
_throttleRendering = false;
break;
case Qt::ApplicationSuspended:
case Qt::ApplicationHidden:
// If we're hidden or are about to suspend, don't render anything.
_throttleRendering = false;
_frameTimer.stop();
break;
default:
// Otherwise, throttle.
if (!_throttleRendering) {

View file

@ -19,31 +19,31 @@ public:
GLCanvas();
bool isThrottleRendering() const;
protected:
QTimer _frameTimer;
bool _throttleRendering;
int _idleRenderInterval;
virtual void initializeGL();
virtual void paintGL();
virtual void resizeGL(int width, int height);
virtual void keyPressEvent(QKeyEvent* event);
virtual void keyReleaseEvent(QKeyEvent* event);
virtual void focusOutEvent(QFocusEvent* event);
virtual void mouseMoveEvent(QMouseEvent* event);
virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event);
virtual bool event(QEvent* event);
virtual void wheelEvent(QWheelEvent* event);
virtual void dragEnterEvent(QDragEnterEvent *event);
virtual void dropEvent(QDropEvent* event);
private slots:
void activeChanged(Qt::ApplicationState state);
void throttleRender();

View file

@ -0,0 +1,64 @@
//
// MainWindow.cpp
// interface
//
// Created by Mohammed Nafees on 04/06/2014.
// Copyright (c) 2014 High Fidelity, Inc. All rights reserved.
#include "MainWindow.h"
#include <QEvent>
#include <QMoveEvent>
#include <QResizeEvent>
#include <QShowEvent>
#include <QHideEvent>
#include <QWindowStateChangeEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
}
void MainWindow::moveEvent(QMoveEvent *e)
{
emit windowGeometryChanged(QRect(e->pos(), size()));
}
void MainWindow::resizeEvent(QResizeEvent *e)
{
emit windowGeometryChanged(QRect(QPoint(x(), y()), e->size()));
}
void MainWindow::showEvent(QShowEvent *e)
{
if (e->spontaneous()) {
emit windowShown(true);
}
}
void MainWindow::hideEvent(QHideEvent *e)
{
if (e->spontaneous()) {
emit windowShown(false);
}
}
void MainWindow::changeEvent(QEvent *e)
{
if (e->type() == QEvent::WindowStateChange) {
QWindowStateChangeEvent *event = static_cast<QWindowStateChangeEvent*>(e);
if ((event->oldState() == Qt::WindowNoState ||
event->oldState() == Qt::WindowMaximized) &&
windowState() == Qt::WindowMinimized) {
emit windowShown(false);
} else {
emit windowShown(true);
}
} else if (e->type() == QEvent::ActivationChange) {
if (isActiveWindow()) {
emit windowShown(true);
} else {
emit windowShown(false);
}
}
}

View file

@ -0,0 +1,31 @@
//
// MainWindow.h
// interface
//
// Created by Mohammed Nafees on 04/06/2014.
// Copyright (c) 2014 High Fidelity, Inc. All rights reserved.
#ifndef __hifi__MainWindow__
#define __hifi__MainWindow__
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
signals:
void windowGeometryChanged(QRect geometry);
void windowShown(bool shown);
protected:
virtual void moveEvent(QMoveEvent *e);
virtual void resizeEvent(QResizeEvent *e);
virtual void showEvent(QShowEvent *e);
virtual void hideEvent(QHideEvent *e);
virtual void changeEvent(QEvent *e);
};
#endif /* defined(__hifi__MainWindow__) */

View file

@ -18,12 +18,13 @@
RunningScriptsWidget::RunningScriptsWidget(QDockWidget *parent) :
QDockWidget(parent),
ui(new Ui::RunningScriptsWidget)
ui(new Ui::RunningScriptsWidget),
_mousePressed(false),
_mousePosition(QPoint())
{
ui->setupUi(this);
// remove the title bar (see the Qt docs on setTitleBarWidget)
setTitleBarWidget(new QWidget());
setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint);
_runningScriptsTable = new ScriptsTableWidget(ui->runningScriptsTableWidget);
_runningScriptsTable->setColumnCount(2);
@ -50,6 +51,11 @@ RunningScriptsWidget::~RunningScriptsWidget()
delete ui;
}
void RunningScriptsWidget::setBoundary(const QRect &rect)
{
_boundary = rect;
}
void RunningScriptsWidget::setRunningScripts(const QStringList& list)
{
_runningScriptsTable->setRowCount(list.size());
@ -90,6 +96,36 @@ void RunningScriptsWidget::setRunningScripts(const QStringList& list)
createRecentlyLoadedScriptsTable();
}
void RunningScriptsWidget::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton) {
_mousePressed = true;
_mousePosition = e->pos();
} else {
_mousePressed = false;
_mousePosition = QPoint();
}
}
void RunningScriptsWidget::mouseMoveEvent(QMouseEvent *e)
{
if (_mousePressed) {
QPoint newPosition = mapToParent(e->pos() - _mousePosition);
if (newPosition.x() >= _boundary.x() &&
newPosition.x() <= (_boundary.width() - width())) {
move(newPosition.x(), _boundary.y());
}
}
}
void RunningScriptsWidget::mouseReleaseEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton) {
_mousePressed = false;
_mousePosition = QPoint();
}
}
void RunningScriptsWidget::keyPressEvent(QKeyEvent *e)
{
switch(e->key()) {

View file

@ -29,9 +29,15 @@ signals:
void stopScriptName(const QString& name);
protected:
virtual void mousePressEvent(QMouseEvent *e);
virtual void mouseMoveEvent(QMouseEvent *e);
virtual void mouseReleaseEvent(QMouseEvent *e);
virtual void keyPressEvent(QKeyEvent *e);
virtual void paintEvent(QPaintEvent *);
public slots:
void setBoundary(const QRect& rect);
private slots:
void stopScript(int row, int column);
void loadScript(int row, int column);
@ -43,6 +49,9 @@ private:
ScriptsTableWidget *_recentlyLoadedScriptsTable;
QStringList _recentlyLoadedScripts;
QString _lastStoppedScript;
QRect _boundary;
bool _mousePressed;
QPoint _mousePosition;
void createRecentlyLoadedScriptsTable();
};

View file

@ -19,7 +19,7 @@ ScriptsTableWidget::ScriptsTableWidget(QWidget *parent) :
setShowGrid(false);
setSelectionMode(QAbstractItemView::NoSelection);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setStyleSheet("QTableWidget { background: transparent; color: #333333; } QToolTip { color: #000000; background: #fdeba5; padding: 2px; }");
setStyleSheet("QTableWidget { background: transparent; color: #333333; } QToolTip { color: #000000; background: #f9f6e4; padding: 2px; }");
setToolTipDuration(200);
setWordWrap(true);
setGeometry(0, 0, parent->width(), parent->height());