Skip to content

Instantly share code, notes, and snippets.

@mkrautz
Created September 15, 2012 14:48
Show Gist options
  • Save mkrautz/3728324 to your computer and use it in GitHub Desktop.
Save mkrautz/3728324 to your computer and use it in GitHub Desktop.
commit f1d52ab9775cefedacf7195f809d05e18e0b1a45
Author: Mikkel Krautz <mikkel@krautz.dk>
Date: Sat Sep 15 16:46:50 2012 +0200
Mumble: move the manual plugin into the Mumble binary.
diff --git a/plugins/manual/manual.cpp b/plugins/manual/manual.cpp
index d5f8ca1..764cdef 100644
--- a/plugins/manual/manual.cpp
+++ b/plugins/manual/manual.cpp
@@ -28,20 +28,9 @@
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#define _USE_MATH_DEFINES
-
-#include <QtCore/QtCore>
-#include <QtGui/QtGui>
-#include <QMessageBox>
-#include <QPointer>
-#include <math.h>
-#include <float.h>
-#include "manual.h"
-#include "ui_manual.h"
-
-#ifdef Q_OS_UNIX
+#ifdef UNIX
#define __cdecl
-typedef WId HWND;
+typedef unsigned long HWND;
#define DLL_PUBLIC __attribute__((visibility("default")))
#else
#define DLL_PUBLIC __declspec(dllexport)
@@ -49,255 +38,12 @@ typedef WId HWND;
#include "../mumble_plugin.h"
-static QPointer<Manual> mDlg = NULL;
-static bool bLinkable = false;
-static bool bActive = true;
-
-static int iAzimuth = 0;
-static int iElevation = 0;
-
-static struct {
- float avatar_pos[3];
- float avatar_front[3];
- float avatar_top[3];
- float camera_pos[3];
- float camera_front[3];
- float camera_top[3];
- std::string context;
- std::wstring identity;
-} my = {{0,0,0}, {0,0,0}, {0,0,0},
- {0,0,0}, {0,0,0}, {0,0,0},
- std::string(), std::wstring()
-};
-
-
-Manual::Manual(QWidget *p) : QDialog(p) {
- setupUi(this);
-
- qgvPosition->viewport()->installEventFilter(this);
- qgvPosition->scale(1.0f, 1.0f);
- qgsScene = new QGraphicsScene(QRectF(-5.0f, -5.0f, 10.0f, 10.0f), this);
- qgiPosition = qgsScene->addEllipse(QRectF(-0.5f, -0.5f, 1.0f, 1.0f), QPen(Qt::black), QBrush(Qt::red));
-
- qgvPosition->setScene(qgsScene);
- qgvPosition->fitInView(-5.0f, -5.0f, 10.0f, 10.0f, Qt::KeepAspectRatio);
-
- qdsbX->setRange(-FLT_MAX, FLT_MAX);
- qdsbY->setRange(-FLT_MAX, FLT_MAX);
- qdsbZ->setRange(-FLT_MAX, FLT_MAX);
-
- qdsbX->setValue(my.avatar_pos[0]);
- qdsbY->setValue(my.avatar_pos[1]);
- qdsbZ->setValue(my.avatar_pos[2]);
-
- qpbActivated->setChecked(bActive);
- qpbLinked->setChecked(bLinkable);
-
- qsbAzimuth->setValue(iAzimuth);
- qsbElevation->setValue(iElevation);
- updateTopAndFront(iAzimuth, iElevation);
-}
-
-bool Manual::eventFilter(QObject *obj, QEvent *evt) {
- if ((evt->type() == QEvent::MouseButtonPress) || (evt->type() == QEvent::MouseMove)) {
- QMouseEvent *qme = dynamic_cast<QMouseEvent *>(evt);
- if (qme) {
- if (qme->buttons() & Qt::LeftButton) {
- QPointF qpf = qgvPosition->mapToScene(qme->pos());
- qdsbX->setValue(-qpf.x());
- qdsbZ->setValue(-qpf.y());
- qgiPosition->setPos(qpf);
- }
- }
- }
- return QDialog::eventFilter(obj, evt);
-}
-
-void Manual::changeEvent(QEvent *e) {
- QDialog::changeEvent(e);
- switch (e->type()) {
- case QEvent::LanguageChange:
- retranslateUi(this);
- break;
- default:
- break;
- }
-}
-
-void Manual::on_qpbUnhinge_pressed() {
- qpbUnhinge->setEnabled(false);
- mDlg->setParent(NULL);
- mDlg->show();
-}
-
-void Manual::on_qpbLinked_clicked(bool b) {
- bLinkable = b;
-}
-
-void Manual::on_qpbActivated_clicked(bool b) {
- bActive = b;
-}
-
-void Manual::on_qdsbX_valueChanged(double d) {
- my.avatar_pos[0] = my.camera_pos[0] = static_cast<float>(d);
- qgiPosition->setPos(-my.avatar_pos[0], -my.avatar_pos[2]);
-}
-
-void Manual::on_qdsbY_valueChanged(double d) {
- my.avatar_pos[1] = my.camera_pos[1] = static_cast<float>(d);
-}
-
-void Manual::on_qdsbZ_valueChanged(double d) {
- my.avatar_pos[2] = my.camera_pos[2] = static_cast<float>(d);
- qgiPosition->setPos(-my.avatar_pos[0], -my.avatar_pos[2]);
-}
-
-void Manual::on_qsbAzimuth_valueChanged(int i) {
- if (i > 180)
- qdAzimuth->setValue(-360 + i);
- else
- qdAzimuth->setValue(i);
-
- updateTopAndFront(i, qsbElevation->value());
-}
-
-void Manual::on_qsbElevation_valueChanged(int i) {
- qdElevation->setValue(90 - i);
- updateTopAndFront(qsbAzimuth->value(), i);
-}
-
-void Manual::on_qdAzimuth_valueChanged(int i) {
- if (i < 0)
- qsbAzimuth->setValue(360 + i);
- else
- qsbAzimuth->setValue(i);
-}
-
-void Manual::on_qdElevation_valueChanged(int i) {
- if (i < -90)
- qdElevation->setValue(180);
- else if (i < 0)
- qdElevation->setValue(0);
- else
- qsbElevation->setValue(90 - i);
-}
-
-void Manual::on_qleContext_editingFinished() {
- my.context = qleContext->text().toStdString();
-}
-
-void Manual::on_qleIdentity_editingFinished() {
- my.identity = qleIdentity->text().toStdWString();
-}
-
-void Manual::on_buttonBox_clicked(QAbstractButton *button) {
- if (buttonBox->buttonRole(button) == buttonBox->ResetRole) {
- qpbLinked->setChecked(false);
- qpbActivated->setChecked(true);
-
- bLinkable = false;
- bActive = true;
-
- qdsbX->setValue(0);
- qdsbY->setValue(0);
- qdsbZ->setValue(0);
-
- qleContext->clear();
- qleIdentity->clear();
-
- qsbElevation->setValue(0);
- qsbAzimuth->setValue(0);
- }
-}
-
-void Manual::updateTopAndFront(int azimuth, int elevation) {
- iAzimuth = azimuth;
- iElevation = elevation;
-
- double azim = azimuth * M_PI / 180.;
- double elev = elevation * M_PI / 180.;
-
- my.avatar_front[0] = static_cast<float>(cos(elev) * sin(azim));
- my.avatar_front[1] = static_cast<float>(sin(elev));
- my.avatar_front[2] = static_cast<float>(cos(elev) * cos(azim));
-
- my.avatar_top[0] = static_cast<float>(-sin(elev) * sin(azim));
- my.avatar_top[1] = static_cast<float>(cos(elev));
- my.avatar_top[2] = static_cast<float>(-sin(elev) * cos(azim));
-
- memcpy(my.camera_top, my.avatar_top, sizeof(float) * 3);
- memcpy(my.camera_front, my.avatar_front, sizeof(float) * 3);
-}
-
-static int trylock() {
- return bLinkable;
-}
-
-static void unlock() {
- if (mDlg) {
- mDlg->qpbLinked->setChecked(false);
- }
- bLinkable = false;
-}
-
-static void config(HWND h) {
- if (mDlg) {
- mDlg->setParent(QWidget::find(h), Qt::Dialog);
- mDlg->qpbUnhinge->setEnabled(true);
- } else {
- mDlg = new Manual(QWidget::find(h));
- }
-
- mDlg->show();
-}
-
-static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) {
- if (!bLinkable)
- return false;
-
- if (!bActive) {
- memset(avatar_pos, 0, sizeof(float)*3);
- memset(camera_pos, 0, sizeof(float)*3);
- return true;
- }
+extern "C" {
- memcpy(avatar_pos, my.avatar_pos, sizeof(float)*3);
- memcpy(avatar_front, my.avatar_front, sizeof(float)*3);
- memcpy(avatar_top, my.avatar_top, sizeof(float)*3);
+extern MumblePlugin *builtinManualPlugin();
- memcpy(camera_pos, my.camera_pos, sizeof(float)*3);
- memcpy(camera_front, my.camera_front, sizeof(float)*3);
- memcpy(camera_top, my.camera_top, sizeof(float)*3);
-
- context.assign(my.context);
- identity.assign(my.identity);
-
- return true;
+DLL_PUBLIC MumblePlugin *getMumblePlugin() {
+ return builtinManualPlugin();
}
-static const std::wstring longdesc() {
- return std::wstring(L"This is the manual placement plugin. It allows you to place yourself manually.");
-}
-
-static std::wstring description(L"Manual placement plugin");
-static std::wstring shortname(L"Manual placement");
-
-static void about(WId h) {
- QMessageBox::about(QWidget::find(h), QString::fromStdWString(description), QString::fromStdWString(longdesc()));
-}
-
-static MumblePlugin manual = {
- MUMBLE_PLUGIN_MAGIC,
- description,
- shortname,
- about,
- config,
- trylock,
- unlock,
- longdesc,
- fetch
-};
-
-extern "C" DLL_PUBLIC MumblePlugin *getMumblePlugin() {
- return &manual;
-}
+} // extern "C"
diff --git a/plugins/manual/manual.h b/plugins/manual/manual.h
deleted file mode 100644
index 611abf4..0000000
--- a/plugins/manual/manual.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef MANUAL_H
-#define MANUAL_H
-
-#include <QDialog>
-#include <QGraphicsItem>
-#include <QGraphicsScene>
-#include "ui_manual.h"
-
-class Manual : public QDialog, public Ui::Manual {
- Q_OBJECT
- public:
- Manual(QWidget *parent = 0);
-
- public slots:
- void on_qpbUnhinge_pressed();
- void on_qpbLinked_clicked(bool);
- void on_qpbActivated_clicked(bool);
- void on_qdsbX_valueChanged(double);
- void on_qdsbY_valueChanged(double);
- void on_qdsbZ_valueChanged(double);
- void on_qsbAzimuth_valueChanged(int);
- void on_qsbElevation_valueChanged(int);
- void on_qdAzimuth_valueChanged(int);
- void on_qdElevation_valueChanged(int);
- void on_qleContext_editingFinished();
- void on_qleIdentity_editingFinished();
- void on_buttonBox_clicked(QAbstractButton *);
- protected:
- QGraphicsScene *qgsScene;
- QGraphicsItem *qgiPosition;
-
- bool eventFilter(QObject *, QEvent *);
- void changeEvent(QEvent *e);
- void updateTopAndFront(int orientation, int azimut);
-};
-
-#endif // MANUAL_H
diff --git a/plugins/manual/manual.pro b/plugins/manual/manual.pro
index 191622e..0c7337b 100644
--- a/plugins/manual/manual.pro
+++ b/plugins/manual/manual.pro
@@ -1,7 +1,8 @@
include(../plugins.pri)
TARGET = manual
-HEADERS = manual.h
SOURCES = manual.cpp
-CONFIG += qt
-FORMS += manual.ui
+
+unix {
+ DEFINES += UNIX
+}
\ No newline at end of file
diff --git a/src/mumble/ManualPlugin.cpp b/src/mumble/ManualPlugin.cpp
new file mode 100644
index 0000000..07064c6
--- /dev/null
+++ b/src/mumble/ManualPlugin.cpp
@@ -0,0 +1,303 @@
+/* Copyright (C) 2009-2012, Stefan Hacker <dD0t@users.sourceforge.net>
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ - Neither the name of the Mumble Developers nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#define _USE_MATH_DEFINES
+
+#include <QtCore/QtCore>
+#include <QtGui/QtGui>
+#include <QMessageBox>
+#include <QPointer>
+#include <math.h>
+#include <float.h>
+#include "ManualPlugin.h"
+#include "ui_ManualPlugin.h"
+
+#ifdef Q_OS_UNIX
+#define __cdecl
+typedef WId HWND;
+#define DLL_PUBLIC __attribute__((visibility("default")))
+#else
+#define DLL_PUBLIC __declspec(dllexport)
+#endif
+
+#include "../../plugins/mumble_plugin.h"
+
+static QPointer<Manual> mDlg = NULL;
+static bool bLinkable = false;
+static bool bActive = true;
+
+static int iAzimuth = 0;
+static int iElevation = 0;
+
+static struct {
+ float avatar_pos[3];
+ float avatar_front[3];
+ float avatar_top[3];
+ float camera_pos[3];
+ float camera_front[3];
+ float camera_top[3];
+ std::string context;
+ std::wstring identity;
+} my = {{0,0,0}, {0,0,0}, {0,0,0},
+ {0,0,0}, {0,0,0}, {0,0,0},
+ std::string(), std::wstring()
+};
+
+
+Manual::Manual(QWidget *p) : QDialog(p) {
+ setupUi(this);
+
+ qgvPosition->viewport()->installEventFilter(this);
+ qgvPosition->scale(1.0f, 1.0f);
+ qgsScene = new QGraphicsScene(QRectF(-5.0f, -5.0f, 10.0f, 10.0f), this);
+ qgiPosition = qgsScene->addEllipse(QRectF(-0.5f, -0.5f, 1.0f, 1.0f), QPen(Qt::black), QBrush(Qt::red));
+
+ qgvPosition->setScene(qgsScene);
+ qgvPosition->fitInView(-5.0f, -5.0f, 10.0f, 10.0f, Qt::KeepAspectRatio);
+
+ qdsbX->setRange(-FLT_MAX, FLT_MAX);
+ qdsbY->setRange(-FLT_MAX, FLT_MAX);
+ qdsbZ->setRange(-FLT_MAX, FLT_MAX);
+
+ qdsbX->setValue(my.avatar_pos[0]);
+ qdsbY->setValue(my.avatar_pos[1]);
+ qdsbZ->setValue(my.avatar_pos[2]);
+
+ qpbActivated->setChecked(bActive);
+ qpbLinked->setChecked(bLinkable);
+
+ qsbAzimuth->setValue(iAzimuth);
+ qsbElevation->setValue(iElevation);
+ updateTopAndFront(iAzimuth, iElevation);
+}
+
+bool Manual::eventFilter(QObject *obj, QEvent *evt) {
+ if ((evt->type() == QEvent::MouseButtonPress) || (evt->type() == QEvent::MouseMove)) {
+ QMouseEvent *qme = dynamic_cast<QMouseEvent *>(evt);
+ if (qme) {
+ if (qme->buttons() & Qt::LeftButton) {
+ QPointF qpf = qgvPosition->mapToScene(qme->pos());
+ qdsbX->setValue(-qpf.x());
+ qdsbZ->setValue(-qpf.y());
+ qgiPosition->setPos(qpf);
+ }
+ }
+ }
+ return QDialog::eventFilter(obj, evt);
+}
+
+void Manual::changeEvent(QEvent *e) {
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+void Manual::on_qpbUnhinge_pressed() {
+ qpbUnhinge->setEnabled(false);
+ mDlg->setParent(NULL);
+ mDlg->show();
+}
+
+void Manual::on_qpbLinked_clicked(bool b) {
+ bLinkable = b;
+}
+
+void Manual::on_qpbActivated_clicked(bool b) {
+ bActive = b;
+}
+
+void Manual::on_qdsbX_valueChanged(double d) {
+ my.avatar_pos[0] = my.camera_pos[0] = static_cast<float>(d);
+ qgiPosition->setPos(-my.avatar_pos[0], -my.avatar_pos[2]);
+}
+
+void Manual::on_qdsbY_valueChanged(double d) {
+ my.avatar_pos[1] = my.camera_pos[1] = static_cast<float>(d);
+}
+
+void Manual::on_qdsbZ_valueChanged(double d) {
+ my.avatar_pos[2] = my.camera_pos[2] = static_cast<float>(d);
+ qgiPosition->setPos(-my.avatar_pos[0], -my.avatar_pos[2]);
+}
+
+void Manual::on_qsbAzimuth_valueChanged(int i) {
+ if (i > 180)
+ qdAzimuth->setValue(-360 + i);
+ else
+ qdAzimuth->setValue(i);
+
+ updateTopAndFront(i, qsbElevation->value());
+}
+
+void Manual::on_qsbElevation_valueChanged(int i) {
+ qdElevation->setValue(90 - i);
+ updateTopAndFront(qsbAzimuth->value(), i);
+}
+
+void Manual::on_qdAzimuth_valueChanged(int i) {
+ if (i < 0)
+ qsbAzimuth->setValue(360 + i);
+ else
+ qsbAzimuth->setValue(i);
+}
+
+void Manual::on_qdElevation_valueChanged(int i) {
+ if (i < -90)
+ qdElevation->setValue(180);
+ else if (i < 0)
+ qdElevation->setValue(0);
+ else
+ qsbElevation->setValue(90 - i);
+}
+
+void Manual::on_qleContext_editingFinished() {
+ my.context = qleContext->text().toStdString();
+}
+
+void Manual::on_qleIdentity_editingFinished() {
+ my.identity = qleIdentity->text().toStdWString();
+}
+
+void Manual::on_buttonBox_clicked(QAbstractButton *button) {
+ if (buttonBox->buttonRole(button) == buttonBox->ResetRole) {
+ qpbLinked->setChecked(false);
+ qpbActivated->setChecked(true);
+
+ bLinkable = false;
+ bActive = true;
+
+ qdsbX->setValue(0);
+ qdsbY->setValue(0);
+ qdsbZ->setValue(0);
+
+ qleContext->clear();
+ qleIdentity->clear();
+
+ qsbElevation->setValue(0);
+ qsbAzimuth->setValue(0);
+ }
+}
+
+void Manual::updateTopAndFront(int azimuth, int elevation) {
+ iAzimuth = azimuth;
+ iElevation = elevation;
+
+ double azim = azimuth * M_PI / 180.;
+ double elev = elevation * M_PI / 180.;
+
+ my.avatar_front[0] = static_cast<float>(cos(elev) * sin(azim));
+ my.avatar_front[1] = static_cast<float>(sin(elev));
+ my.avatar_front[2] = static_cast<float>(cos(elev) * cos(azim));
+
+ my.avatar_top[0] = static_cast<float>(-sin(elev) * sin(azim));
+ my.avatar_top[1] = static_cast<float>(cos(elev));
+ my.avatar_top[2] = static_cast<float>(-sin(elev) * cos(azim));
+
+ memcpy(my.camera_top, my.avatar_top, sizeof(float) * 3);
+ memcpy(my.camera_front, my.avatar_front, sizeof(float) * 3);
+}
+
+static int trylock() {
+ return bLinkable;
+}
+
+static void unlock() {
+ if (mDlg) {
+ mDlg->qpbLinked->setChecked(false);
+ }
+ bLinkable = false;
+}
+
+static void config(HWND h) {
+ if (mDlg) {
+ mDlg->setParent(QWidget::find(h), Qt::Dialog);
+ mDlg->qpbUnhinge->setEnabled(true);
+ } else {
+ mDlg = new Manual(QWidget::find(h));
+ }
+
+ mDlg->show();
+}
+
+static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) {
+ if (!bLinkable)
+ return false;
+
+ if (!bActive) {
+ memset(avatar_pos, 0, sizeof(float)*3);
+ memset(camera_pos, 0, sizeof(float)*3);
+ return true;
+ }
+
+ memcpy(avatar_pos, my.avatar_pos, sizeof(float)*3);
+ memcpy(avatar_front, my.avatar_front, sizeof(float)*3);
+ memcpy(avatar_top, my.avatar_top, sizeof(float)*3);
+
+ memcpy(camera_pos, my.camera_pos, sizeof(float)*3);
+ memcpy(camera_front, my.camera_front, sizeof(float)*3);
+ memcpy(camera_top, my.camera_top, sizeof(float)*3);
+
+ context.assign(my.context);
+ identity.assign(my.identity);
+
+ return true;
+}
+
+static const std::wstring longdesc() {
+ return std::wstring(L"This is the manual placement plugin. It allows you to place yourself manually.");
+}
+
+static std::wstring description(L"Manual placement plugin");
+static std::wstring shortname(L"Manual placement");
+
+static void about(WId h) {
+ QMessageBox::about(QWidget::find(h), QString::fromStdWString(description), QString::fromStdWString(longdesc()));
+}
+
+static MumblePlugin manual = {
+ MUMBLE_PLUGIN_MAGIC,
+ description,
+ shortname,
+ about,
+ config,
+ trylock,
+ unlock,
+ longdesc,
+ fetch
+};
+
+extern "C" DLL_PUBLIC MumblePlugin *builtinManualPlugin() {
+ return &manual;
+}
\ No newline at end of file
diff --git a/src/mumble/ManualPlugin.h b/src/mumble/ManualPlugin.h
new file mode 100644
index 0000000..1f8ed50
--- /dev/null
+++ b/src/mumble/ManualPlugin.h
@@ -0,0 +1,37 @@
+#ifndef MANUAL_H
+#define MANUAL_H
+
+#include <QDialog>
+#include <QGraphicsItem>
+#include <QGraphicsScene>
+#include "ui_ManualPlugin.h"
+
+class Manual : public QDialog, public Ui::Manual {
+ Q_OBJECT
+ public:
+ Manual(QWidget *parent = 0);
+
+ public slots:
+ void on_qpbUnhinge_pressed();
+ void on_qpbLinked_clicked(bool);
+ void on_qpbActivated_clicked(bool);
+ void on_qdsbX_valueChanged(double);
+ void on_qdsbY_valueChanged(double);
+ void on_qdsbZ_valueChanged(double);
+ void on_qsbAzimuth_valueChanged(int);
+ void on_qsbElevation_valueChanged(int);
+ void on_qdAzimuth_valueChanged(int);
+ void on_qdElevation_valueChanged(int);
+ void on_qleContext_editingFinished();
+ void on_qleIdentity_editingFinished();
+ void on_buttonBox_clicked(QAbstractButton *);
+ protected:
+ QGraphicsScene *qgsScene;
+ QGraphicsItem *qgiPosition;
+
+ bool eventFilter(QObject *, QEvent *);
+ void changeEvent(QEvent *e);
+ void updateTopAndFront(int orientation, int azimut);
+};
+
+#endif // MANUAL_H
diff --git a/src/mumble/ManualPlugin.ui b/src/mumble/ManualPlugin.ui
new file mode 100644
index 0000000..d431f94
--- /dev/null
+++ b/src/mumble/ManualPlugin.ui
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Manual</class>
+ <widget class="QDialog" name="Manual">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>631</width>
+ <height>436</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Manual Mumble Positional Audio</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="qhlHorizontal" stretch="0,0">
+ <item>
+ <widget class="QGroupBox" name="qgbPosition">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>2</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Position</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,0">
+ <item>
+ <widget class="QGraphicsView" name="qgvPosition">
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="horizontalScrollBarPolicy">
+ <enum>Qt::ScrollBarAlwaysOff</enum>
+ </property>
+ <property name="backgroundBrush">
+ <brush brushstyle="NoBrush">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </property>
+ <property name="foregroundBrush">
+ <brush brushstyle="NoBrush">
+ <color alpha="255">
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </property>
+ <property name="interactive">
+ <bool>true</bool>
+ </property>
+ <property name="sceneRect">
+ <rectf>
+ <x>-50.000000000000000</x>
+ <y>-50.000000000000000</y>
+ <width>100.000000000000000</width>
+ <height>100.000000000000000</height>
+ </rectf>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="0">
+ <widget class="QLabel" name="qlX">
+ <property name="text">
+ <string>X</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="qlY">
+ <property name="text">
+ <string>Y</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="qlZ">
+ <property name="text">
+ <string>Z</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QDoubleSpinBox" name="qdsbX">
+ <property name="prefix">
+ <string/>
+ </property>
+ <property name="suffix">
+ <string>m</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QDoubleSpinBox" name="qdsbY">
+ <property name="suffix">
+ <string>m</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QDoubleSpinBox" name="qdsbZ">
+ <property name="suffix">
+ <string>m</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="qhlVertical">
+ <item>
+ <widget class="QGroupBox" name="qgbHeading">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Heading</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="qlAzimuth">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Azimuth</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QDial" name="qdAzimuth">
+ <property name="minimum">
+ <number>-180</number>
+ </property>
+ <property name="maximum">
+ <number>180</number>
+ </property>
+ <property name="pageStep">
+ <number>30</number>
+ </property>
+ <property name="wrapping">
+ <bool>true</bool>
+ </property>
+ <property name="notchTarget">
+ <double>6.000000000000000</double>
+ </property>
+ <property name="notchesVisible">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="qlElevation">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Elevation</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QDial" name="qdElevation">
+ <property name="minimum">
+ <number>-180</number>
+ </property>
+ <property name="maximum">
+ <number>180</number>
+ </property>
+ <property name="pageStep">
+ <number>30</number>
+ </property>
+ <property name="value">
+ <number>90</number>
+ </property>
+ <property name="sliderPosition">
+ <number>90</number>
+ </property>
+ <property name="wrapping">
+ <bool>true</bool>
+ </property>
+ <property name="notchTarget">
+ <double>6.000000000000000</double>
+ </property>
+ <property name="notchesVisible">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QSpinBox" name="qsbAzimuth">
+ <property name="suffix">
+ <string>°</string>
+ </property>
+ <property name="maximum">
+ <number>360</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="qsbElevation">
+ <property name="suffix">
+ <string>°</string>
+ </property>
+ <property name="minimum">
+ <number>-90</number>
+ </property>
+ <property name="maximum">
+ <number>90</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="qgbMeta">
+ <property name="title">
+ <string>Meta data</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="qleContext"/>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="qlContext">
+ <property name="text">
+ <string>Context</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="qlIdentity">
+ <property name="text">
+ <string>Identity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="qpbContext">
+ <property name="text">
+ <string>Set</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="qpbIdentity">
+ <property name="text">
+ <string>Set</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="qleIdentity"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="qgbState">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>State</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="qpbLinked">
+ <property name="text">
+ <string>Linked</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="qpbActivated">
+ <property name="text">
+ <string>Activated</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="qpbUnhinge">
+ <property name="text">
+ <string>Unhinge</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close|QDialogButtonBox::Reset</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>Manual</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>Manual</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src/mumble/mumble.pro b/src/mumble/mumble.pro
index 02d2383..918a068 100644
--- a/src/mumble/mumble.pro
+++ b/src/mumble/mumble.pro
@@ -4,16 +4,22 @@ DEFINES *= MUMBLE
TEMPLATE = app
QT *= network sql xml svg
TARGET = mumble
-HEADERS *= BanEditor.h ACLEditor.h ConfigWidget.h Log.h AudioConfigDialog.h AudioStats.h AudioInput.h AudioOutput.h AudioOutputSample.h AudioOutputSpeech.h AudioOutputUser.h CELTCodec.h CustomElements.h MainWindow.h ServerHandler.h About.h ConnectDialog.h GlobalShortcut.h TextToSpeech.h Settings.h Database.h VersionCheck.h Global.h UserModel.h Audio.h ConfigDialog.h Plugins.h PTTButtonWidget.h LookConfig.h Overlay.h OverlayText.h SharedMemory.h AudioWizard.h ViewCert.h TextMessage.h NetworkConfig.h LCD.h Usage.h Cert.h ClientUser.h UserEdit.h Tokens.h UserView.h RichTextEditor.h UserInformation.h FileEngine.h SocketRPC.h VoiceRecorder.h VoiceRecorderDialog.h WebFetch.h ../SignalCurry.h
-SOURCES *= BanEditor.cpp ACLEditor.cpp ConfigWidget.cpp Log.cpp AudioConfigDialog.cpp AudioStats.cpp AudioInput.cpp AudioOutput.cpp AudioOutputSample.cpp AudioOutputSpeech.cpp AudioOutputUser.cpp main.cpp CELTCodec.cpp CustomElements.cpp MainWindow.cpp ServerHandler.cpp About.cpp ConnectDialog.cpp Settings.cpp Database.cpp VersionCheck.cpp Global.cpp UserModel.cpp Audio.cpp ConfigDialog.cpp Plugins.cpp PTTButtonWidget.cpp LookConfig.cpp OverlayClient.cpp OverlayConfig.cpp OverlayEditor.cpp OverlayEditorScene.cpp OverlayUser.cpp OverlayUserGroup.cpp Overlay.cpp OverlayText.cpp SharedMemory.cpp AudioWizard.cpp ViewCert.cpp Messages.cpp TextMessage.cpp GlobalShortcut.cpp NetworkConfig.cpp LCD.cpp Usage.cpp Cert.cpp ClientUser.cpp UserEdit.cpp Tokens.cpp UserView.cpp RichTextEditor.cpp UserInformation.cpp FileEngine.cpp SocketRPC.cpp VoiceRecorder.cpp VoiceRecorderDialog.cpp WebFetch.cpp
+HEADERS *= BanEditor.h ACLEditor.h ConfigWidget.h Log.h AudioConfigDialog.h AudioStats.h AudioInput.h AudioOutput.h AudioOutputSample.h AudioOutputSpeech.h AudioOutputUser.h CELTCodec.h CustomElements.h MainWindow.h ServerHandler.h About.h ConnectDialog.h GlobalShortcut.h TextToSpeech.h Settings.h Database.h VersionCheck.h Global.h UserModel.h Audio.h ConfigDialog.h Plugins.h PTTButtonWidget.h LookConfig.h Overlay.h OverlayText.h SharedMemory.h AudioWizard.h ViewCert.h TextMessage.h NetworkConfig.h LCD.h Usage.h Cert.h ClientUser.h UserEdit.h Tokens.h UserView.h RichTextEditor.h UserInformation.h FileEngine.h SocketRPC.h VoiceRecorder.h VoiceRecorderDialog.h WebFetch.h ../SignalCurry.h ManualPlugin.h
+SOURCES *= BanEditor.cpp ACLEditor.cpp ConfigWidget.cpp Log.cpp AudioConfigDialog.cpp AudioStats.cpp AudioInput.cpp AudioOutput.cpp AudioOutputSample.cpp AudioOutputSpeech.cpp AudioOutputUser.cpp main.cpp CELTCodec.cpp CustomElements.cpp MainWindow.cpp ServerHandler.cpp About.cpp ConnectDialog.cpp Settings.cpp Database.cpp VersionCheck.cpp Global.cpp UserModel.cpp Audio.cpp ConfigDialog.cpp Plugins.cpp PTTButtonWidget.cpp LookConfig.cpp OverlayClient.cpp OverlayConfig.cpp OverlayEditor.cpp OverlayEditorScene.cpp OverlayUser.cpp OverlayUserGroup.cpp Overlay.cpp OverlayText.cpp SharedMemory.cpp AudioWizard.cpp ViewCert.cpp Messages.cpp TextMessage.cpp GlobalShortcut.cpp NetworkConfig.cpp LCD.cpp Usage.cpp Cert.cpp ClientUser.cpp UserEdit.cpp Tokens.cpp UserView.cpp RichTextEditor.cpp UserInformation.cpp FileEngine.cpp SocketRPC.cpp VoiceRecorder.cpp VoiceRecorderDialog.cpp WebFetch.cpp ManualPlugin.cpp
SOURCES *= smallft.cpp
DIST *= ../../icons/mumble.ico licenses.h smallft.h ../../icons/mumble.xpm murmur_pch.h mumble.plist
RESOURCES *= mumble.qrc mumble_flags.qrc
-FORMS *= ConfigDialog.ui MainWindow.ui ConnectDialog.ui ConnectDialogEdit.ui BanEditor.ui ACLEditor.ui Plugins.ui PTTButtonWidget.ui Overlay.ui OverlayEditor.ui LookConfig.ui AudioInput.ui AudioOutput.ui Log.ui TextMessage.ui AudioStats.ui NetworkConfig.ui LCD.ui GlobalShortcut.ui GlobalShortcutTarget.ui Cert.ui UserEdit.ui AudioWizard.ui Tokens.ui RichTextEditor.ui RichTextEditorLink.ui UserInformation.ui VoiceRecorderDialog.ui
+FORMS *= ConfigDialog.ui MainWindow.ui ConnectDialog.ui ConnectDialogEdit.ui BanEditor.ui ACLEditor.ui Plugins.ui PTTButtonWidget.ui Overlay.ui OverlayEditor.ui LookConfig.ui AudioInput.ui AudioOutput.ui Log.ui TextMessage.ui AudioStats.ui NetworkConfig.ui LCD.ui GlobalShortcut.ui GlobalShortcutTarget.ui Cert.ui UserEdit.ui AudioWizard.ui Tokens.ui RichTextEditor.ui RichTextEditorLink.ui UserInformation.ui VoiceRecorderDialog.ui ManualPlugin.ui
TRANSLATIONS = mumble_en.ts mumble_es.ts mumble_de.ts mumble_fr.ts mumble_pl.ts mumble_ru.ts mumble_cs.ts mumble_it.ts mumble_ja.ts mumble_pt_BR.ts mumble_zh_CN.ts mumble_zh_TW.ts mumble_da.ts mumble_he.ts mumble_sv.ts mumble_tr.ts
PRECOMPILED_HEADER = mumble_pch.hpp
INCLUDEPATH *= ../bonjour
+CONFIG(static) {
+ macx {
+ LIBS *= -Wl,-exported_symbol,_builtinManualPlugin
+ }
+}
+
isEmpty(QMAKE_LRELEASE) {
QMAKE_QMAKE_BASE = $$basename(QMAKE_QMAKE)
QMAKE_LRELEASE = $$dirname(QMAKE_QMAKE)/$$replace(QMAKE_QMAKE_BASE,qmake,lrelease)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment