diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2021-08-21 14:15:43 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2021-08-21 14:15:43 +0200 |
commit | dae6a98f826f78bda7511ba6de4c8b813353501e (patch) | |
tree | 7c531774f9d4b5865393190e8ae1527b86e63bd6 /proto-ft | |
parent | b615cc6d60beede9cb76b143007a7a1720846c5c (diff) |
proto/freetrack: implement more dll location controls
Diffstat (limited to 'proto-ft')
-rw-r--r-- | proto-ft/ftnoir_ftcontrols.ui | 183 | ||||
-rw-r--r-- | proto-ft/ftnoir_protocol_ft.cpp | 73 | ||||
-rw-r--r-- | proto-ft/ftnoir_protocol_ft.h | 16 | ||||
-rw-r--r-- | proto-ft/ftnoir_protocol_ft_dialog.cpp | 26 | ||||
-rw-r--r-- | proto-ft/lang/nl_NL.ts | 36 | ||||
-rw-r--r-- | proto-ft/lang/ru_RU.ts | 36 | ||||
-rw-r--r-- | proto-ft/lang/stub.ts | 36 | ||||
-rw-r--r-- | proto-ft/lang/zh_CN.ts | 36 |
8 files changed, 333 insertions, 109 deletions
diff --git a/proto-ft/ftnoir_ftcontrols.ui b/proto-ft/ftnoir_ftcontrols.ui index 0d142d09..90c9db46 100644 --- a/proto-ft/ftnoir_ftcontrols.ui +++ b/proto-ft/ftnoir_ftcontrols.ui @@ -12,22 +12,10 @@ <rect> <x>0</x> <y>0</y> - <width>508</width> - <height>232</height> + <width>533</width> + <height>326</height> </rect> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>0</width> - <height>0</height> - </size> - </property> <property name="windowTitle"> <string>freetrack protocol settings</string> </property> @@ -42,6 +30,13 @@ <bool>false</bool> </property> <layout class="QGridLayout" name="gridLayout_2"> + <item row="5" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> <item row="0" column="0"> <widget class="QGroupBox" name="groupBox_3"> <property name="sizePolicy"> @@ -95,64 +90,138 @@ </layout> </widget> </item> - <item row="1" column="0"> + <item row="1" column="0" rowspan="2"> <widget class="QGroupBox" name="groupBox_4"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> <property name="title"> - <string>Repair NPClient location</string> + <string>Library location</string> </property> <property name="alignment"> <set>Qt::AlignJustify|Qt::AlignTop</set> </property> - <property name="flat"> - <bool>false</bool> - </property> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <property name="spacing"> - <number>9</number> - </property> - <item> - <widget class="QPushButton" name="bntLocateNPClient"> - <property name="text"> - <string>Locate DLL</string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_10"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Replace the registry entry if you want to use other software with the NPClient protocol and it doesn't work automatically. + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QWidget" name="widget" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QPushButton" name="bntLocateNPClient"> + <property name="text"> + <string>Locate DLL</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label_10"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Replace the registry entry if you want to use other software with the NPClient protocol and it doesn't work automatically. Starting tracking will again overwrite the DLL locations.</string> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="1" column="0"> + <widget class="QWidget" name="widget" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="spacing"> + <number>6</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="enable_custom_location"> + <property name="toolTip"> + <string>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</string> + </property> + <property name="text"> + <string>Custom location</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="custom_location"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="set_custom_location"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Browse...</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="2" column="0"> + <widget class="QWidget" name="widget_2" native="true"> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <property name="spacing"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QCheckBox" name="ephemeral_registry_entry"> + <property name="toolTip"> + <string>This is useful when you're only evaluating opentrack, and haven't yet decided to use it all the time.</string> + </property> + <property name="text"> + <string>Clear location when tracking is stopped</string> + </property> + </widget> + </item> + </layout> </widget> </item> </layout> </widget> </item> - <item row="2" column="0"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> </layout> </widget> + <tabstops> + <tabstop>cbxSelectInterface</tabstop> + <tabstop>bntLocateNPClient</tabstop> + <tabstop>enable_custom_location</tabstop> + <tabstop>custom_location</tabstop> + <tabstop>set_custom_location</tabstop> + <tabstop>ephemeral_registry_entry</tabstop> + </tabstops> <resources> <include location="ft-protocol.qrc"/> <include location="ft-protocol.qrc"/> diff --git a/proto-ft/ftnoir_protocol_ft.cpp b/proto-ft/ftnoir_protocol_ft.cpp index c6259593..9613f4a8 100644 --- a/proto-ft/ftnoir_protocol_ft.cpp +++ b/proto-ft/ftnoir_protocol_ft.cpp @@ -10,6 +10,7 @@ #include "ftnoir_protocol_ft.h" #include "csv/csv.h" +#include <QDir> #include <cstddef> #include <cmath> @@ -17,7 +18,15 @@ freetrack::~freetrack() { - dummyTrackIR.close(); + //dummyTrackIR.kill(); dummyTrackIR.waitForFinished(); + if (s.ephemeral_library_location) + { + QSettings settings_ft("Freetrack", "FreetrackClient"); + QSettings settings_npclient("NaturalPoint", "NATURALPOINT\\NPClient Location"); + + settings_ft.setValue("Path", ""); + settings_npclient.setValue("Path", ""); + } } static_assert(sizeof(LONG) == sizeof(std::int32_t)); @@ -133,7 +142,7 @@ void freetrack::start_dummy() { dummyTrackIR.start(); } -void freetrack::set_protocols(bool ft, bool npclient) +module_status freetrack::set_protocols() { static const QString program_dir = OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH; @@ -141,15 +150,39 @@ void freetrack::set_protocols(bool ft, bool npclient) QSettings settings_ft("Freetrack", "FreetrackClient"); QSettings settings_npclient("NaturalPoint", "NATURALPOINT\\NPClient Location"); - if (ft) - settings_ft.setValue("Path", program_dir); - else - settings_ft.setValue("Path", ""); + QString location = *s.custom_location_pathname; + const auto selection = *s.used_interface; + + bool use_freetrack = ~selection & settings::enable_freetrack, + use_npclient = ~selection & settings::enable_npclient; - if (npclient) - settings_npclient.setValue("Path", program_dir); + if (!s.use_custom_location || s.custom_location_pathname->isEmpty() || !QDir{s.custom_location_pathname}.exists()) + location = program_dir; else - settings_npclient.setValue("Path", ""); + { + bool copy = true; + + if (use_npclient && !QFile{location + "/NPClient.dll"}.exists()) + copy &= QFile::copy(program_dir + "/NPClient.dll", location + "/NPClient.dll"); + if (use_npclient && !QFile{location + "/NPClient64.dll"}.exists()) + copy &= QFile::copy(program_dir + "/NPClient64.dll", location + "/NPClient64.dll"); + if (use_freetrack && !QFile{location + "/freetrackclient.dll"}.exists()) + copy &= QFile::copy(program_dir + "/freetrackclient.dll", location + "/freetrackclient.dll"); + if (use_freetrack && !QFile{location + "/freetrackclient64.dll"}.exists()) + copy &= QFile::copy(program_dir + "/freetrackclient64.dll", location + "/freetrackclient64.dll"); + + if (!copy) + return {tr("Can't copy library to selected custom location '%1'").arg(s.custom_location_pathname)}; + } + + if (!location.endsWith('/')) + location += '/'; + location.replace('\\', '/'); + + settings_ft.setValue("Path", use_freetrack ? location : ""); + settings_npclient.setValue("Path", use_npclient ? location : ""); + + return {}; } module_status freetrack::initialize() @@ -157,24 +190,8 @@ module_status freetrack::initialize() if (!shm.success()) return error(tr("Can't load freetrack memory mapping")); - bool use_ft = false, use_npclient = false; - - switch (s.intUsedInterface) { - case 0: - use_ft = true; - use_npclient = true; - break; - case 1: - use_ft = true; - break; - case 2: - use_npclient = true; - break; - default: - break; - } - - set_protocols(use_ft, use_npclient); + if (auto ret = set_protocols(); !ret.is_ok()) + return ret; pMemData->data.DataID = 1; pMemData->data.CamWidth = 100; @@ -195,7 +212,7 @@ module_status freetrack::initialize() store(pMemData->table_ints[k], 0); // more games need the dummy executable than previously thought - if (use_npclient) + if (~s.used_interface & settings::enable_npclient) start_dummy(); return status_ok(); diff --git a/proto-ft/ftnoir_protocol_ft.h b/proto-ft/ftnoir_protocol_ft.h index a59796dd..4b7ab89e 100644 --- a/proto-ft/ftnoir_protocol_ft.h +++ b/proto-ft/ftnoir_protocol_ft.h @@ -27,11 +27,12 @@ using namespace options; struct settings : opts { - value<int> intUsedInterface; - settings() : - opts("proto-freetrack"), - intUsedInterface(b, "used-interfaces", 0) - {} + enum enable_status { enable_both, enable_freetrack, enable_npclient, }; + value<int> used_interface{b, "used-interfaces", (int)enable_both}; + value<bool> ephemeral_library_location{b, "ephemeral-library-location", false}; + value<bool> use_custom_location{b, "use-custom-location", false}; + value<QString> custom_location_pathname{b, "custom-library-location", {}}; + settings() : opts("proto-freetrack") {} }; class freetrack : TR, public IProtocol @@ -58,7 +59,9 @@ private: void start_dummy(); public: - static void set_protocols(bool ft, bool npclient); + enum class status { starting, stopping }; + [[nodiscard]] module_status set_protocols(); + void clear_protocols(); }; class FTControls: public IProtocolDialog @@ -75,6 +78,7 @@ private slots: void selectDLL(); void doOK(); void doCancel(); + void set_custom_location(); }; class freetrackDll : public Metadata diff --git a/proto-ft/ftnoir_protocol_ft_dialog.cpp b/proto-ft/ftnoir_protocol_ft_dialog.cpp index 58077b87..9686ee92 100644 --- a/proto-ft/ftnoir_protocol_ft_dialog.cpp +++ b/proto-ft/ftnoir_protocol_ft_dialog.cpp @@ -22,7 +22,17 @@ FTControls::FTControls() connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); connect(ui.bntLocateNPClient, SIGNAL(clicked()), this, SLOT(selectDLL())); - tie_setting(s.intUsedInterface, ui.cbxSelectInterface); + const settings::enable_status cbx[] = { + settings::enable_both, + settings::enable_freetrack, + settings::enable_npclient, + }; + tie_setting(s.used_interface, ui.cbxSelectInterface); + tie_setting(s.ephemeral_library_location, ui.ephemeral_registry_entry); + tie_setting(s.custom_location_pathname, ui.custom_location); + tie_setting(s.use_custom_location, ui.enable_custom_location); + + connect(ui.set_custom_location, &QAbstractButton::clicked, this, &FTControls::set_custom_location); } void FTControls::doOK() @@ -50,4 +60,16 @@ void FTControls::selectDLL() node.setValue("Path", dllname.dir().path()); } } - +void FTControls::set_custom_location() +{ + static const auto program_directory = OPENTRACK_BASE_PATH + OPENTRACK_LIBRARY_PATH; + auto previous_location = *s.custom_location_pathname; + if (!s.use_custom_location || previous_location.isEmpty() || !QDir{previous_location}.exists()) + previous_location = program_directory; + auto dir = QFileDialog::getExistingDirectory(this, tr("Select library location"), previous_location); + if (dir.isEmpty() || !QDir{dir}.exists()) + dir = QString{}; + else + ui.enable_custom_location->setEnabled(true); + ui.custom_location->setText(dir); +} diff --git a/proto-ft/lang/nl_NL.ts b/proto-ft/lang/nl_NL.ts index ec4f58da..f8408198 100644 --- a/proto-ft/lang/nl_NL.ts +++ b/proto-ft/lang/nl_NL.ts @@ -11,6 +11,10 @@ <source>Dll file (*.dll);;All Files (*)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Select library location</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UICFTControls</name> @@ -27,10 +31,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Repair NPClient location</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Locate DLL</source> <translation type="unfinished"></translation> </message> @@ -52,6 +52,30 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Use TrackIR, disable freetrack</source> <translation type="unfinished"></translation> </message> + <message> + <source>Library location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Custom location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is useful when you're only evaluating opentrack, and haven't yet decided to use it all the time.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear location when tracking is stopped</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrack</name> @@ -63,6 +87,10 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Can't load freetrack memory mapping</source> <translation type="unfinished"></translation> </message> + <message> + <source>Can't copy library to selected custom location '%1'</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrackDll</name> diff --git a/proto-ft/lang/ru_RU.ts b/proto-ft/lang/ru_RU.ts index c793ae6b..c934e0f7 100644 --- a/proto-ft/lang/ru_RU.ts +++ b/proto-ft/lang/ru_RU.ts @@ -11,6 +11,10 @@ <source>Dll file (*.dll);;All Files (*)</source> <translation></translation> </message> + <message> + <source>Select library location</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UICFTControls</name> @@ -27,10 +31,6 @@ <translation>Отключите один из протоколов в случае, если при включении обоих интерфейсов игра не корректно определяет их.</translation> </message> <message> - <source>Repair NPClient location</source> - <translation>Решение проблем с расположением NPClient'а </translation> - </message> - <message> <source>Locate DLL</source> <translation>Укажите DLL</translation> </message> @@ -54,6 +54,30 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Use TrackIR, disable freetrack</source> <translation type="unfinished"></translation> </message> + <message> + <source>Library location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Custom location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is useful when you're only evaluating opentrack, and haven't yet decided to use it all the time.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear location when tracking is stopped</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrack</name> @@ -65,6 +89,10 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Can't load freetrack memory mapping</source> <translation type="unfinished"></translation> </message> + <message> + <source>Can't copy library to selected custom location '%1'</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrackDll</name> diff --git a/proto-ft/lang/stub.ts b/proto-ft/lang/stub.ts index 635844a5..e15244b9 100644 --- a/proto-ft/lang/stub.ts +++ b/proto-ft/lang/stub.ts @@ -11,6 +11,10 @@ <source>Dll file (*.dll);;All Files (*)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Select library location</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UICFTControls</name> @@ -27,10 +31,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Repair NPClient location</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Locate DLL</source> <translation type="unfinished"></translation> </message> @@ -52,6 +52,30 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Use TrackIR, disable freetrack</source> <translation type="unfinished"></translation> </message> + <message> + <source>Library location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Custom location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is useful when you're only evaluating opentrack, and haven't yet decided to use it all the time.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear location when tracking is stopped</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrack</name> @@ -63,6 +87,10 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Can't load freetrack memory mapping</source> <translation type="unfinished"></translation> </message> + <message> + <source>Can't copy library to selected custom location '%1'</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrackDll</name> diff --git a/proto-ft/lang/zh_CN.ts b/proto-ft/lang/zh_CN.ts index 442a1aa1..2425f48b 100644 --- a/proto-ft/lang/zh_CN.ts +++ b/proto-ft/lang/zh_CN.ts @@ -11,6 +11,10 @@ <source>Dll file (*.dll);;All Files (*)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Select library location</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UICFTControls</name> @@ -19,10 +23,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Repair NPClient location</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Locate DLL</source> <translation type="unfinished"></translation> </message> @@ -52,6 +52,30 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Use TrackIR, disable freetrack</source> <translation type="unfinished"></translation> </message> + <message> + <source>Library location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Custom location</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Browse...</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>This is useful when you're only evaluating opentrack, and haven't yet decided to use it all the time.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Clear location when tracking is stopped</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Useful for titles like Elite: Dangerous that require the library to reside in a specified location. Use this to avoid relocating your opentrack installation.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrack</name> @@ -63,6 +87,10 @@ Starting tracking will again overwrite the DLL locations.</source> <source>Can't load freetrack memory mapping</source> <translation type="unfinished"></translation> </message> + <message> + <source>Can't copy library to selected custom location '%1'</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>freetrackDll</name> |