Assorted whitespace cleanup and typo fixes.
[haiku.git] / src / preferences / media / MidiSettingsView.cpp
blob5310a4d9ca484451db252689119d6481fd22a2fd
1 /*
2 * Copyright 2014, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
6 #include "MidiSettingsView.h"
8 #include <Box.h>
9 #include <Catalog.h>
10 #include <Directory.h>
11 #include <Entry.h>
12 #include <FindDirectory.h>
13 #include <GridView.h>
14 #include <LayoutBuilder.h>
15 #include <ListView.h>
16 #include <Locale.h>
17 #include <Node.h>
18 #include <NodeInfo.h>
19 #include <Path.h>
20 #include <PathFinder.h>
21 #include <ScrollView.h>
22 #include <StringList.h>
24 #include <stdio.h>
27 #undef B_TRANSLATION_CONTEXT
28 #define B_TRANSLATION_CONTEXT "Midi View"
30 #define SETTINGS_FILE "midi"
32 const static uint32 kSelectSoundFont = 'SeSf';
35 MidiSettingsView::MidiSettingsView()
37 SettingsView()
39 BBox* defaultsBox = new BBox("SoundFont");
40 defaultsBox->SetLabel(B_TRANSLATE("SoundFont"));
41 BGridView* defaultsGridView = new BGridView();
43 fListView = new BListView(B_SINGLE_SELECTION_LIST);
44 fListView->SetSelectionMessage(new BMessage(kSelectSoundFont));
46 BScrollView *scrollView = new BScrollView("ScrollView", fListView,
47 0, false, true);
48 BLayoutBuilder::Grid<>(defaultsGridView)
49 .SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING,
50 B_USE_DEFAULT_SPACING)
51 .Add(scrollView, 0, 0);
53 defaultsBox->AddChild(defaultsGridView);
55 BLayoutBuilder::Group<>(this)
56 .SetInsets(0, 0, 0, 0)
57 .Add(defaultsBox)
58 .AddGlue();
62 /* virtual */
63 void
64 MidiSettingsView::AttachedToWindow()
66 SettingsView::AttachedToWindow();
68 fListView->SetTarget(this);
69 _RetrieveSoftSynthList();
71 _LoadSettings();
75 /* virtual */
76 void
77 MidiSettingsView::MessageReceived(BMessage* message)
79 switch (message->what) {
80 case kSelectSoundFont:
81 _SaveSettings();
82 break;
84 default:
85 SettingsView::MessageReceived(message);
86 break;
91 void
92 MidiSettingsView::_RetrieveSoftSynthList()
94 BStringList paths;
95 status_t status = BPathFinder::FindPaths(B_FIND_PATH_DATA_DIRECTORY,
96 "synth", paths);
97 if (status != B_OK)
98 return;
100 fListView->MakeEmpty();
102 for (int32 i = 0; i < paths.CountStrings(); i++) {
103 BDirectory directory(paths.StringAt(i).String());
104 BEntry entry;
105 if (directory.InitCheck() != B_OK)
106 continue;
107 while (directory.GetNextEntry(&entry) == B_OK) {
108 BNode node(&entry);
109 BNodeInfo nodeInfo(&node);
110 char mimeType[B_MIME_TYPE_LENGTH];
111 // TODO: For some reason this doesn't work
112 if (nodeInfo.GetType(mimeType) == B_OK
113 /*&& !strcmp(mimeType, "audio/x-soundfont")*/) {
114 BPath fullPath = paths.StringAt(i).String();
115 fullPath.Append(entry.Name());
116 fListView->AddItem(new BStringItem(fullPath.Path()));
123 void
124 MidiSettingsView::_LoadSettings()
126 // TODO: Duplicated code between here
127 // and BSoftSynth::SetDefaultInstrumentsFile
128 char buffer[512];
129 BPath path;
130 if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
131 path.Append(SETTINGS_FILE);
132 BFile file(path.Path(), B_READ_ONLY);
133 if (file.InitCheck() == B_OK) {
134 file.Read(buffer, sizeof(buffer));
135 char soundFont[512];
136 sscanf(buffer, "# Midi Settings\n soundfont = %s\n",
137 soundFont);
139 for (int32 i = 0; i < fListView->CountItems(); i++) {
140 BStringItem* item = (BStringItem*)fListView->ItemAt(i);
141 if (!strcmp(item->Text(), soundFont)) {
142 fListView->Select(i);
143 break;
151 void
152 MidiSettingsView::_SaveSettings()
154 int32 selection = fListView->CurrentSelection();
155 if (selection < 0)
156 return;
158 BStringItem* item = (BStringItem*)fListView->ItemAt(selection);
159 if (item == NULL)
160 return;
162 char buffer[512];
163 snprintf(buffer, 512, "# Midi Settings\n soundfont = %s\n",
164 item->Text());
166 BPath path;
167 if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
168 path.Append(SETTINGS_FILE);
169 BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
170 if (file.InitCheck() == B_OK)
171 file.Write(buffer, strlen(buffer));