diff options
Diffstat (limited to '')
| -rw-r--r-- | src/yuzu/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | src/yuzu/applets/controller.cpp | 20 | ||||
| -rw-r--r-- | src/yuzu/applets/controller.h | 8 | ||||
| -rw-r--r-- | src/yuzu/applets/controller.ui | 4 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_dialog.cpp | 37 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_dialog.h | 38 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player.cpp | 5 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_profile_dialog.cpp | 36 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_profile_dialog.h | 39 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_profile_dialog.ui (renamed from src/yuzu/configuration/configure_input_dialog.ui) | 24 |
10 files changed, 117 insertions, 100 deletions
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index bf1fae9fa..b16b54032 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt | |||
| @@ -68,12 +68,12 @@ add_executable(yuzu | |||
| 68 | configuration/configure_input_advanced.cpp | 68 | configuration/configure_input_advanced.cpp |
| 69 | configuration/configure_input_advanced.h | 69 | configuration/configure_input_advanced.h |
| 70 | configuration/configure_input_advanced.ui | 70 | configuration/configure_input_advanced.ui |
| 71 | configuration/configure_input_dialog.cpp | ||
| 72 | configuration/configure_input_dialog.h | ||
| 73 | configuration/configure_input_dialog.ui | ||
| 74 | configuration/configure_input_player.cpp | 71 | configuration/configure_input_player.cpp |
| 75 | configuration/configure_input_player.h | 72 | configuration/configure_input_player.h |
| 76 | configuration/configure_input_player.ui | 73 | configuration/configure_input_player.ui |
| 74 | configuration/configure_input_profile_dialog.cpp | ||
| 75 | configuration/configure_input_profile_dialog.h | ||
| 76 | configuration/configure_input_profile_dialog.ui | ||
| 77 | configuration/configure_motion_touch.cpp | 77 | configuration/configure_motion_touch.cpp |
| 78 | configuration/configure_motion_touch.h | 78 | configuration/configure_motion_touch.h |
| 79 | configuration/configure_motion_touch.ui | 79 | configuration/configure_motion_touch.ui |
diff --git a/src/yuzu/applets/controller.cpp b/src/yuzu/applets/controller.cpp index 552cb7204..5112d48d2 100644 --- a/src/yuzu/applets/controller.cpp +++ b/src/yuzu/applets/controller.cpp | |||
| @@ -13,8 +13,10 @@ | |||
| 13 | #include "core/hle/service/sm/sm.h" | 13 | #include "core/hle/service/sm/sm.h" |
| 14 | #include "ui_controller.h" | 14 | #include "ui_controller.h" |
| 15 | #include "yuzu/applets/controller.h" | 15 | #include "yuzu/applets/controller.h" |
| 16 | #include "yuzu/configuration/configure_input_dialog.h" | 16 | #include "yuzu/configuration/configure_input.h" |
| 17 | #include "yuzu/configuration/configure_input_profile_dialog.h" | ||
| 17 | #include "yuzu/configuration/configure_vibration.h" | 18 | #include "yuzu/configuration/configure_vibration.h" |
| 19 | #include "yuzu/configuration/input_profiles.h" | ||
| 18 | #include "yuzu/main.h" | 20 | #include "yuzu/main.h" |
| 19 | 21 | ||
| 20 | namespace { | 22 | namespace { |
| @@ -109,7 +111,8 @@ QtControllerSelectorDialog::QtControllerSelectorDialog( | |||
| 109 | QWidget* parent, Core::Frontend::ControllerParameters parameters_, | 111 | QWidget* parent, Core::Frontend::ControllerParameters parameters_, |
| 110 | InputCommon::InputSubsystem* input_subsystem_) | 112 | InputCommon::InputSubsystem* input_subsystem_) |
| 111 | : QDialog(parent), ui(std::make_unique<Ui::QtControllerSelectorDialog>()), | 113 | : QDialog(parent), ui(std::make_unique<Ui::QtControllerSelectorDialog>()), |
| 112 | parameters(std::move(parameters_)), input_subsystem(input_subsystem_) { | 114 | parameters(std::move(parameters_)), input_subsystem{input_subsystem_}, |
| 115 | input_profiles(std::make_unique<InputProfiles>()) { | ||
| 113 | ui->setupUi(this); | 116 | ui->setupUi(this); |
| 114 | 117 | ||
| 115 | player_widgets = { | 118 | player_widgets = { |
| @@ -230,7 +233,7 @@ QtControllerSelectorDialog::QtControllerSelectorDialog( | |||
| 230 | &QtControllerSelectorDialog::CallConfigureVibrationDialog); | 233 | &QtControllerSelectorDialog::CallConfigureVibrationDialog); |
| 231 | 234 | ||
| 232 | connect(ui->inputConfigButton, &QPushButton::clicked, this, | 235 | connect(ui->inputConfigButton, &QPushButton::clicked, this, |
| 233 | &QtControllerSelectorDialog::CallConfigureInputDialog); | 236 | &QtControllerSelectorDialog::CallConfigureInputProfileDialog); |
| 234 | 237 | ||
| 235 | connect(ui->buttonBox, &QDialogButtonBox::accepted, this, | 238 | connect(ui->buttonBox, &QDialogButtonBox::accepted, this, |
| 236 | &QtControllerSelectorDialog::ApplyConfiguration); | 239 | &QtControllerSelectorDialog::ApplyConfiguration); |
| @@ -299,20 +302,13 @@ void QtControllerSelectorDialog::CallConfigureVibrationDialog() { | |||
| 299 | } | 302 | } |
| 300 | } | 303 | } |
| 301 | 304 | ||
| 302 | void QtControllerSelectorDialog::CallConfigureInputDialog() { | 305 | void QtControllerSelectorDialog::CallConfigureInputProfileDialog() { |
| 303 | const auto max_supported_players = parameters.enable_single_mode ? 1 : parameters.max_players; | 306 | ConfigureInputProfileDialog dialog(this, input_subsystem, input_profiles.get()); |
| 304 | |||
| 305 | ConfigureInputDialog dialog(this, max_supported_players, input_subsystem); | ||
| 306 | 307 | ||
| 307 | dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | | 308 | dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | |
| 308 | Qt::WindowSystemMenuHint); | 309 | Qt::WindowSystemMenuHint); |
| 309 | dialog.setWindowModality(Qt::WindowModal); | 310 | dialog.setWindowModality(Qt::WindowModal); |
| 310 | dialog.exec(); | 311 | dialog.exec(); |
| 311 | |||
| 312 | dialog.ApplyConfiguration(); | ||
| 313 | |||
| 314 | LoadConfiguration(); | ||
| 315 | CheckIfParametersMet(); | ||
| 316 | } | 312 | } |
| 317 | 313 | ||
| 318 | bool QtControllerSelectorDialog::CheckIfParametersMet() { | 314 | bool QtControllerSelectorDialog::CheckIfParametersMet() { |
diff --git a/src/yuzu/applets/controller.h b/src/yuzu/applets/controller.h index a2ce03c8f..4344e1dd0 100644 --- a/src/yuzu/applets/controller.h +++ b/src/yuzu/applets/controller.h | |||
| @@ -16,6 +16,8 @@ class QDialogButtonBox; | |||
| 16 | class QGroupBox; | 16 | class QGroupBox; |
| 17 | class QLabel; | 17 | class QLabel; |
| 18 | 18 | ||
| 19 | class InputProfiles; | ||
| 20 | |||
| 19 | namespace InputCommon { | 21 | namespace InputCommon { |
| 20 | class InputSubsystem; | 22 | class InputSubsystem; |
| 21 | } | 23 | } |
| @@ -45,8 +47,8 @@ private: | |||
| 45 | // Initializes the "Configure Vibration" Dialog. | 47 | // Initializes the "Configure Vibration" Dialog. |
| 46 | void CallConfigureVibrationDialog(); | 48 | void CallConfigureVibrationDialog(); |
| 47 | 49 | ||
| 48 | // Initializes the "Configure Input" Dialog. | 50 | // Initializes the "Create Input Profile" Dialog. |
| 49 | void CallConfigureInputDialog(); | 51 | void CallConfigureInputProfileDialog(); |
| 50 | 52 | ||
| 51 | // Checks the current configuration against the given parameters. | 53 | // Checks the current configuration against the given parameters. |
| 52 | // This sets and returns the value of parameters_met. | 54 | // This sets and returns the value of parameters_met. |
| @@ -83,6 +85,8 @@ private: | |||
| 83 | 85 | ||
| 84 | InputCommon::InputSubsystem* input_subsystem; | 86 | InputCommon::InputSubsystem* input_subsystem; |
| 85 | 87 | ||
| 88 | std::unique_ptr<InputProfiles> input_profiles; | ||
| 89 | |||
| 86 | // This is true if and only if all parameters are met. Otherwise, this is false. | 90 | // This is true if and only if all parameters are met. Otherwise, this is false. |
| 87 | // This determines whether the "OK" button can be clicked to exit the applet. | 91 | // This determines whether the "OK" button can be clicked to exit the applet. |
| 88 | bool parameters_met{false}; | 92 | bool parameters_met{false}; |
diff --git a/src/yuzu/applets/controller.ui b/src/yuzu/applets/controller.ui index 8e571ba8f..c8cb6bcf3 100644 --- a/src/yuzu/applets/controller.ui +++ b/src/yuzu/applets/controller.ui | |||
| @@ -2402,7 +2402,7 @@ | |||
| 2402 | <item> | 2402 | <item> |
| 2403 | <widget class="QGroupBox" name="inputConfigGroup"> | 2403 | <widget class="QGroupBox" name="inputConfigGroup"> |
| 2404 | <property name="title"> | 2404 | <property name="title"> |
| 2405 | <string>Input Config</string> | 2405 | <string>Profiles</string> |
| 2406 | </property> | 2406 | </property> |
| 2407 | <layout class="QHBoxLayout" name="horizontalLayout_7"> | 2407 | <layout class="QHBoxLayout" name="horizontalLayout_7"> |
| 2408 | <property name="leftMargin"> | 2408 | <property name="leftMargin"> |
| @@ -2429,7 +2429,7 @@ | |||
| 2429 | <string notr="true">min-width: 68px;</string> | 2429 | <string notr="true">min-width: 68px;</string> |
| 2430 | </property> | 2430 | </property> |
| 2431 | <property name="text"> | 2431 | <property name="text"> |
| 2432 | <string>Open</string> | 2432 | <string>Create</string> |
| 2433 | </property> | 2433 | </property> |
| 2434 | </widget> | 2434 | </widget> |
| 2435 | </item> | 2435 | </item> |
diff --git a/src/yuzu/configuration/configure_input_dialog.cpp b/src/yuzu/configuration/configure_input_dialog.cpp deleted file mode 100644 index 1866003c2..000000000 --- a/src/yuzu/configuration/configure_input_dialog.cpp +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "ui_configure_input_dialog.h" | ||
| 6 | #include "yuzu/configuration/configure_input_dialog.h" | ||
| 7 | |||
| 8 | ConfigureInputDialog::ConfigureInputDialog(QWidget* parent, std::size_t max_players, | ||
| 9 | InputCommon::InputSubsystem* input_subsystem) | ||
| 10 | : QDialog(parent), ui(std::make_unique<Ui::ConfigureInputDialog>()), | ||
| 11 | input_widget(new ConfigureInput(this)) { | ||
| 12 | ui->setupUi(this); | ||
| 13 | |||
| 14 | input_widget->Initialize(input_subsystem, max_players); | ||
| 15 | |||
| 16 | ui->inputLayout->addWidget(input_widget); | ||
| 17 | |||
| 18 | RetranslateUI(); | ||
| 19 | } | ||
| 20 | |||
| 21 | ConfigureInputDialog::~ConfigureInputDialog() = default; | ||
| 22 | |||
| 23 | void ConfigureInputDialog::ApplyConfiguration() { | ||
| 24 | input_widget->ApplyConfiguration(); | ||
| 25 | } | ||
| 26 | |||
| 27 | void ConfigureInputDialog::changeEvent(QEvent* event) { | ||
| 28 | if (event->type() == QEvent::LanguageChange) { | ||
| 29 | RetranslateUI(); | ||
| 30 | } | ||
| 31 | |||
| 32 | QDialog::changeEvent(event); | ||
| 33 | } | ||
| 34 | |||
| 35 | void ConfigureInputDialog::RetranslateUI() { | ||
| 36 | ui->retranslateUi(this); | ||
| 37 | } | ||
diff --git a/src/yuzu/configuration/configure_input_dialog.h b/src/yuzu/configuration/configure_input_dialog.h deleted file mode 100644 index d1bd865f9..000000000 --- a/src/yuzu/configuration/configure_input_dialog.h +++ /dev/null | |||
| @@ -1,38 +0,0 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <memory> | ||
| 8 | #include <QDialog> | ||
| 9 | #include "yuzu/configuration/configure_input.h" | ||
| 10 | |||
| 11 | class QPushButton; | ||
| 12 | |||
| 13 | namespace InputCommon { | ||
| 14 | class InputSubsystem; | ||
| 15 | } | ||
| 16 | |||
| 17 | namespace Ui { | ||
| 18 | class ConfigureInputDialog; | ||
| 19 | } | ||
| 20 | |||
| 21 | class ConfigureInputDialog : public QDialog { | ||
| 22 | Q_OBJECT | ||
| 23 | |||
| 24 | public: | ||
| 25 | explicit ConfigureInputDialog(QWidget* parent, std::size_t max_players, | ||
| 26 | InputCommon::InputSubsystem* input_subsystem); | ||
| 27 | ~ConfigureInputDialog() override; | ||
| 28 | |||
| 29 | void ApplyConfiguration(); | ||
| 30 | |||
| 31 | private: | ||
| 32 | void changeEvent(QEvent* event) override; | ||
| 33 | void RetranslateUI(); | ||
| 34 | |||
| 35 | std::unique_ptr<Ui::ConfigureInputDialog> ui; | ||
| 36 | |||
| 37 | ConfigureInput* input_widget; | ||
| 38 | }; | ||
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 1ee4725ef..4ed704793 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp | |||
| @@ -459,11 +459,14 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i | |||
| 459 | }); | 459 | }); |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | if (debug || player_index == 9) { | ||
| 463 | ui->groupConnectedController->setCheckable(false); | ||
| 464 | } | ||
| 465 | |||
| 462 | // The Debug Controller can only choose the Pro Controller. | 466 | // The Debug Controller can only choose the Pro Controller. |
| 463 | if (debug) { | 467 | if (debug) { |
| 464 | ui->buttonScreenshot->setEnabled(false); | 468 | ui->buttonScreenshot->setEnabled(false); |
| 465 | ui->buttonHome->setEnabled(false); | 469 | ui->buttonHome->setEnabled(false); |
| 466 | ui->groupConnectedController->setCheckable(false); | ||
| 467 | QStringList debug_controller_types = { | 470 | QStringList debug_controller_types = { |
| 468 | tr("Pro Controller"), | 471 | tr("Pro Controller"), |
| 469 | }; | 472 | }; |
diff --git a/src/yuzu/configuration/configure_input_profile_dialog.cpp b/src/yuzu/configuration/configure_input_profile_dialog.cpp new file mode 100644 index 000000000..818399b47 --- /dev/null +++ b/src/yuzu/configuration/configure_input_profile_dialog.cpp | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "ui_configure_input_profile_dialog.h" | ||
| 6 | #include "yuzu/configuration/configure_input_profile_dialog.h" | ||
| 7 | |||
| 8 | ConfigureInputProfileDialog::ConfigureInputProfileDialog( | ||
| 9 | QWidget* parent, InputCommon::InputSubsystem* input_subsystem, InputProfiles* profiles) | ||
| 10 | : QDialog(parent), ui(std::make_unique<Ui::ConfigureInputProfileDialog>()), | ||
| 11 | profile_widget(new ConfigureInputPlayer(this, 9, nullptr, input_subsystem, profiles, false)) { | ||
| 12 | ui->setupUi(this); | ||
| 13 | |||
| 14 | ui->controllerLayout->addWidget(profile_widget); | ||
| 15 | |||
| 16 | connect(ui->clear_all_button, &QPushButton::clicked, this, | ||
| 17 | [this] { profile_widget->ClearAll(); }); | ||
| 18 | connect(ui->restore_defaults_button, &QPushButton::clicked, this, | ||
| 19 | [this] { profile_widget->RestoreDefaults(); }); | ||
| 20 | |||
| 21 | RetranslateUI(); | ||
| 22 | } | ||
| 23 | |||
| 24 | ConfigureInputProfileDialog::~ConfigureInputProfileDialog() = default; | ||
| 25 | |||
| 26 | void ConfigureInputProfileDialog::changeEvent(QEvent* event) { | ||
| 27 | if (event->type() == QEvent::LanguageChange) { | ||
| 28 | RetranslateUI(); | ||
| 29 | } | ||
| 30 | |||
| 31 | QDialog::changeEvent(event); | ||
| 32 | } | ||
| 33 | |||
| 34 | void ConfigureInputProfileDialog::RetranslateUI() { | ||
| 35 | ui->retranslateUi(this); | ||
| 36 | } | ||
diff --git a/src/yuzu/configuration/configure_input_profile_dialog.h b/src/yuzu/configuration/configure_input_profile_dialog.h new file mode 100644 index 000000000..d4a3973d9 --- /dev/null +++ b/src/yuzu/configuration/configure_input_profile_dialog.h | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | // Copyright 2020 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <memory> | ||
| 8 | #include <QDialog> | ||
| 9 | #include "yuzu/configuration/configure_input_player.h" | ||
| 10 | |||
| 11 | class QPushButton; | ||
| 12 | |||
| 13 | class InputProfiles; | ||
| 14 | |||
| 15 | namespace InputCommon { | ||
| 16 | class InputSubsystem; | ||
| 17 | } | ||
| 18 | |||
| 19 | namespace Ui { | ||
| 20 | class ConfigureInputProfileDialog; | ||
| 21 | } | ||
| 22 | |||
| 23 | class ConfigureInputProfileDialog : public QDialog { | ||
| 24 | Q_OBJECT | ||
| 25 | |||
| 26 | public: | ||
| 27 | explicit ConfigureInputProfileDialog(QWidget* parent, | ||
| 28 | InputCommon::InputSubsystem* input_subsystem, | ||
| 29 | InputProfiles* profiles); | ||
| 30 | ~ConfigureInputProfileDialog() override; | ||
| 31 | |||
| 32 | private: | ||
| 33 | void changeEvent(QEvent* event) override; | ||
| 34 | void RetranslateUI(); | ||
| 35 | |||
| 36 | std::unique_ptr<Ui::ConfigureInputProfileDialog> ui; | ||
| 37 | |||
| 38 | ConfigureInputPlayer* profile_widget; | ||
| 39 | }; | ||
diff --git a/src/yuzu/configuration/configure_input_dialog.ui b/src/yuzu/configuration/configure_input_profile_dialog.ui index b92ddb200..726cf6905 100644 --- a/src/yuzu/configuration/configure_input_dialog.ui +++ b/src/yuzu/configuration/configure_input_profile_dialog.ui | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | <ui version="4.0"> | 2 | <ui version="4.0"> |
| 3 | <class>ConfigureInputDialog</class> | 3 | <class>ConfigureInputProfileDialog</class> |
| 4 | <widget class="QDialog" name="ConfigureInputDialog"> | 4 | <widget class="QDialog" name="ConfigureInputProfileDialog"> |
| 5 | <property name="geometry"> | 5 | <property name="geometry"> |
| 6 | <rect> | 6 | <rect> |
| 7 | <x>0</x> | 7 | <x>0</x> |
| @@ -11,7 +11,7 @@ | |||
| 11 | </rect> | 11 | </rect> |
| 12 | </property> | 12 | </property> |
| 13 | <property name="windowTitle"> | 13 | <property name="windowTitle"> |
| 14 | <string>Configure Input</string> | 14 | <string>Create Input Profile</string> |
| 15 | </property> | 15 | </property> |
| 16 | <layout class="QVBoxLayout" name="verticalLayout"> | 16 | <layout class="QVBoxLayout" name="verticalLayout"> |
| 17 | <property name="spacing"> | 17 | <property name="spacing"> |
| @@ -30,11 +30,25 @@ | |||
| 30 | <number>9</number> | 30 | <number>9</number> |
| 31 | </property> | 31 | </property> |
| 32 | <item> | 32 | <item> |
| 33 | <layout class="QHBoxLayout" name="inputLayout"/> | 33 | <layout class="QHBoxLayout" name="controllerLayout"/> |
| 34 | </item> | 34 | </item> |
| 35 | <item> | 35 | <item> |
| 36 | <layout class="QHBoxLayout" name="horizontalLayout"> | 36 | <layout class="QHBoxLayout" name="horizontalLayout"> |
| 37 | <item> | 37 | <item> |
| 38 | <widget class="QPushButton" name="clear_all_button"> | ||
| 39 | <property name="text"> | ||
| 40 | <string>Clear</string> | ||
| 41 | </property> | ||
| 42 | </widget> | ||
| 43 | </item> | ||
| 44 | <item> | ||
| 45 | <widget class="QPushButton" name="restore_defaults_button"> | ||
| 46 | <property name="text"> | ||
| 47 | <string>Defaults</string> | ||
| 48 | </property> | ||
| 49 | </widget> | ||
| 50 | </item> | ||
| 51 | <item> | ||
| 38 | <widget class="QDialogButtonBox" name="buttonBox"> | 52 | <widget class="QDialogButtonBox" name="buttonBox"> |
| 39 | <property name="standardButtons"> | 53 | <property name="standardButtons"> |
| 40 | <set>QDialogButtonBox::Ok</set> | 54 | <set>QDialogButtonBox::Ok</set> |
| @@ -50,7 +64,7 @@ | |||
| 50 | <connection> | 64 | <connection> |
| 51 | <sender>buttonBox</sender> | 65 | <sender>buttonBox</sender> |
| 52 | <signal>accepted()</signal> | 66 | <signal>accepted()</signal> |
| 53 | <receiver>ConfigureInputDialog</receiver> | 67 | <receiver>ConfigureInputProfileDialog</receiver> |
| 54 | <slot>accept()</slot> | 68 | <slot>accept()</slot> |
| 55 | </connection> | 69 | </connection> |
| 56 | </connections> | 70 | </connections> |