97{
98 try {
102
103
105 title_label_.setFont(juce::Font {36.F, juce::Font::bold});
108 addToLayout(&
title_label_, anchorMidLeft, anchorMidRight);
110
111
116
117
120 connection_label_.setColour(juce::Label::backgroundColourId, juce::Colours::red);
125
126
127 load_button_.setBounds(kFirstButtonX, kTopButtonY, kButtonWidth, kStandardHeight);
128 addToLayout(&
load_button_, anchorMidLeft, anchorMidRight);
132 if (juce::NativeMessageBox::showYesNoBox(juce::AlertWindow::WarningIcon,
133 juce::translate("MIDI2LR profiles"),
134 juce::translate("Profile changed. Do you want to save your changes? If you "
135 "continue without saving, your changes will be lost."))) {
137 }
138 }
140 const auto directory_saved {profile_directory.exists()};
141 if (!directory_saved) [[unlikely]] {
142 profile_directory = juce::File::getSpecialLocation(juce::File::userDocumentsDirectory);
143 }
144 juce::FileChooser chooser {
145 juce::translate("Open profile"), profile_directory, "*.xml", true};
146 if (chooser.browseForFileToOpen()) {
147 if (const auto parsed {juce::parseXML(chooser.getResult())}) {
148 const auto new_profile {chooser.getResult()};
150 new_profile.getFullPathName().toStdString()));
152 juce::NotificationType::dontSendNotification);
156 if (!directory_saved) [[unlikely]] {
158 new_profile.getParentDirectory().getFullPathName());
159 }
160 }
161 else {
162 rsj::Log(fmt::format(FMT_STRING(
"Unable to load profile {}."),
163 chooser.getResult().getFullPathName().toStdString()));
164 }
165 }
166 };
167
168
169 save_button_.setBounds(kSecondButtonX, kTopButtonY, kButtonWidth, kStandardHeight);
170 addToLayout(&
save_button_, anchorMidLeft, anchorMidRight);
173
174
175 settings_button_.setBounds(kThirdButtonX, kTopButtonY, kButtonWidth, kStandardHeight);
179 juce::DialogWindow::LaunchOptions dialog_options;
180 dialog_options.dialogTitle = juce::translate("Settings");
181
183 component->Init();
184 dialog_options.content.setOwned(component.release());
185 dialog_options.content->setSize(400, 300);
188 };
189
190
192 command_table_.setBounds(kMainLeft, kCommandTableY, kFullWidth, kCommandTableHeight);
195
196
203
204
206 command_label_.setBounds(kCommandLabelX, kCommandLabelY, kLabelWidth, kStandardHeight);
209
210
211 remove_row_button_.setBounds(kFirstButtonX, kBottomButtonY, kButtonWidth, kStandardHeight);
218 }
219 };
220
221
222 rescan_button_.setBounds(kSecondButtonX, kBottomButtonY, kButtonWidth, kStandardHeight);
226
229
231 };
232
233
234 disconnect_button_.setBounds(kThirdButtonX, kBottomButtonY, kButtonWidth, kStandardHeight);
242 }
243 else {
246 }
247 };
248
249
251 kStandardHeight);
257 };
258
259
262 const auto default_profile {juce::File(filename.data())};
263 if (const auto parsed {juce::parseXML(default_profile)}) {
266 }
267 }
268 else {
271 else {
273 }
274 }
275
276
277 activateLayout();
278 }
279 catch (const std::exception& e) {
281 throw;
282 }
283}
void SendingRestart()
Definition LR_IPC_Out.cpp:77
void SendingStop()
Definition LR_IPC_Out.cpp:93
void AddCallback(_In_ T *const object, _In_ void(T::*const mf)(bool, bool))
Definition LR_IPC_Out.h:51
void SendCommand(std::string &&command) const
Definition LR_IPC_Out.cpp:67
juce::TextButton rescan_button_
Definition MainComponent.h:85
void SaveProfile() const
Definition MainComponent.cpp:285
void ProfileChanged(juce::XmlElement *xml_element, const juce::String &file_name)
Definition MainComponent.cpp:362
juce::Label version_label_
Definition MainComponent.h:74
juce::TextButton settings_button_
Definition MainComponent.h:87
juce::TextButton remove_row_button_
Definition MainComponent.h:83
std::unique_ptr< juce::DialogWindow > settings_dialog_
Definition MainComponent.h:95
juce::Label connection_label_
Definition MainComponent.h:70
void LrIpcOutCallback(bool, bool)
Definition MainComponent.cpp:340
juce::TextButton save_button_
Definition MainComponent.h:86
juce::DropShadowEffect title_shadow_
Definition MainComponent.h:68
juce::TextButton load_button_
Definition MainComponent.h:82
void MidiCmdCallback(rsj::MidiMessage mm)
Definition MainComponent.cpp:309
juce::Label title_label_
Definition MainComponent.h:72
juce::TextButton remove_unassigned_button_
Definition MainComponent.h:84
juce::TextButton disconnect_button_
Definition MainComponent.h:81
void AddCallback(_In_ T *const object, _In_ void(T::*const mf)(rsj::MidiMessage))
Definition MIDIReceiver.h:49
void RescanDevices()
Definition MIDIReceiver.cpp:66
void RescanDevices()
Definition MIDISender.cpp:114
bool ProfileUnsaved() const
Definition Profile.h:139
void RemoveUnassignedMessages()
Definition Profile.cpp:187
void RemoveAllRows()
Definition Profile.cpp:137
void FromXml(const juce::XmlElement *root)
Definition Profile.cpp:35
void SwitchToProfile(int profile_index)
Definition ProfileManager.cpp:57
void AddCallback(_In_ T *const object, _In_ void(T::*const mf)(juce::XmlElement *, const juce::String &))
Definition ProfileManager.h:49
juce::String GetDefaultProfile() const noexcept
Definition SettingsManager.h:42
juce::String GetProfileDirectory() const noexcept
Definition SettingsManager.h:57
void SetProfileDirectory(const juce::String &profile_directory)
Definition SettingsManager.h:81
std::string AppDataFilePath(const std::string &file_name)
void Log(const juce::String &info, const std::source_location &location=std::source_location::current()) noexcept
Definition Misc.cpp:131