Integrate MIDI settings with the Media preflet.

More or less working.
This commit is contained in:
Stefano Ceccherini
2014-09-28 18:23:56 +02:00
parent dad7e9177d
commit db5b5dfa14
12 changed files with 348 additions and 191 deletions
+1
View File
@@ -15,6 +15,7 @@ Preference Media :
MediaListItem.cpp
MediaViews.cpp
MediaWindow.cpp
MidiSettingsView.cpp
: media be localestub [ TargetLibsupc++ ]
: media.rdef
;
+108
View File
@@ -21,6 +21,7 @@
#include "MediaIcons.h"
#include "MediaWindow.h"
#include "MidiSettingsView.h"
#define kITEM_MARGIN 1
@@ -307,6 +308,13 @@ NodeListItem::Comparator::Visit(AudioMixerListItem* item)
}
void
NodeListItem::Comparator::Visit(MidiListItem* item)
{
result = GREATER_THAN;
}
// #pragma mark - DeviceListItem
@@ -371,6 +379,13 @@ DeviceListItem::Comparator::Visit(AudioMixerListItem* item)
}
void
DeviceListItem::Comparator::Visit(MidiListItem* item)
{
result = LESS_THAN;
}
void
DeviceListItem::SetRenderParameters(Renderer& renderer)
{
@@ -454,8 +469,101 @@ AudioMixerListItem::Comparator::Visit(AudioMixerListItem* item)
}
void
AudioMixerListItem::Comparator::Visit(MidiListItem* item)
{
result = GREATER_THAN;
}
void
AudioMixerListItem::SetRenderParameters(Renderer& renderer)
{
renderer.AddIcon(&Icons()->mixerIcon);
}
// #pragma mark - MidiListItem
MidiListItem::MidiListItem(const char* title)
:
MediaListItem(),
fTitle(title)
{
}
void
MidiListItem::AlterWindow(MediaWindow* window)
{
window->SelectMidiSettings(fTitle);
}
const char*
MidiListItem::Label()
{
return "MIDI";
}
void
MidiListItem::Accept(MediaListItem::Visitor& visitor)
{
visitor.Visit(this);
}
int
MidiListItem::CompareWith(MediaListItem* item)
{
Comparator comparator(this);
item->Accept(comparator);
return comparator.result;
}
MidiListItem::Comparator::Comparator(MidiListItem* compareOthersTo)
:
result(0),
fTarget(compareOthersTo)
{
}
void
MidiListItem::Comparator::Visit(NodeListItem* item)
{
result = GREATER_THAN;
}
void
MidiListItem::Comparator::Visit(DeviceListItem* item)
{
result = GREATER_THAN;
if (item->Type() == AUDIO_TYPE)
result = LESS_THAN;
}
void
MidiListItem::Comparator::Visit(AudioMixerListItem* item)
{
result = LESS_THAN;
}
void
MidiListItem::Comparator::Visit(MidiListItem* item)
{
result = 0;
}
void
MidiListItem::SetRenderParameters(Renderer& renderer)
{
// TODO: Create a nice icon
renderer.AddIcon(&Icons()->mixerIcon);
}
+38
View File
@@ -27,6 +27,7 @@ class MediaWindow;
class AudioMixerListItem;
class DeviceListItem;
class MidiListItem;
class NodeListItem;
@@ -55,6 +56,7 @@ public:
virtual void Visit(AudioMixerListItem* item) = 0;
virtual void Visit(DeviceListItem* item) = 0;
virtual void Visit(NodeListItem* item) = 0;
virtual void Visit(MidiListItem* item) = 0;
};
virtual void Accept(Visitor& visitor) = 0;
@@ -100,6 +102,7 @@ public:
virtual void Visit(NodeListItem* item);
virtual void Visit(DeviceListItem* item);
virtual void Visit(AudioMixerListItem* item);
virtual void Visit(MidiListItem* item);
int result;
// -1 : < item; 0 : == item; 1 : > item
@@ -137,6 +140,7 @@ public:
virtual void Visit(NodeListItem* item);
virtual void Visit(DeviceListItem* item);
virtual void Visit(AudioMixerListItem* item);
virtual void Visit(MidiListItem* item);
int result;
// -1 : < item; 0 : == item; 1 : > item
@@ -169,6 +173,7 @@ public:
virtual void Visit(NodeListItem* item);
virtual void Visit(DeviceListItem* item);
virtual void Visit(AudioMixerListItem* item);
virtual void Visit(MidiListItem* item);
int result;
// -1 : < item; 0 : == item; 1 : > item
@@ -185,4 +190,37 @@ private:
const char* fTitle;
};
class MidiListItem : public MediaListItem {
public:
MidiListItem(const char* title);
virtual void AlterWindow(MediaWindow* window);
virtual const char* Label();
virtual void Accept(MediaListItem::Visitor& visitor);
struct Comparator : public MediaListItem::Visitor {
Comparator(MidiListItem* compareOthersTo);
virtual void Visit(NodeListItem* item);
virtual void Visit(DeviceListItem* item);
virtual void Visit(AudioMixerListItem* item);
virtual void Visit(MidiListItem* item);
int result;
// -1 : < item; 0 : == item; 1 : > item
private:
MidiListItem* fTarget;
};
// -1 : < item; 0 : == item; 1 : > item
virtual int CompareWith(MediaListItem* item);
private:
virtual void SetRenderParameters(Renderer& renderer);
const char* fTitle;
};
#endif /* __MEDIALISTITEM_H__ */
+16 -2
View File
@@ -36,7 +36,7 @@
#include <TextView.h>
#include "MediaIcons.h"
#include "MidiSettingsView.h"
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Media Window"
@@ -60,7 +60,7 @@ public:
virtual void Visit(AudioMixerListItem*){}
virtual void Visit(DeviceListItem*){}
virtual void Visit(MidiListItem*){}
virtual void Visit(NodeListItem* item)
{
item->Accept(fComparator);
@@ -233,6 +233,14 @@ MediaWindow::SelectAudioMixer(const char* title)
}
void
MediaWindow::SelectMidiSettings(const char* title)
{
fContentLayout->SetVisibleItem(fContentLayout->IndexOfView(fMidiView));
fTitleView->SetLabel(title);
}
void
MediaWindow::UpdateInputListItem(MediaListItem::media_type type,
const dormant_node_info* node)
@@ -371,6 +379,9 @@ MediaWindow::_InitWindow()
fVideoView = new VideoSettingsView();
fContentLayout->AddView(fVideoView);
fMidiView = new MidiSettingsView();
fContentLayout->AddView(fMidiView);
// Layout all views
BLayoutBuilder::Group<>(this, B_HORIZONTAL)
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
@@ -455,6 +466,9 @@ MediaWindow::_InitMedia(bool first)
MediaListItem::AUDIO_TYPE);
fListView->AddItem(audio);
MidiListItem* midi = new MidiListItem(B_TRANSLATE("MIDI Settings"));
fListView->AddItem(midi);
MediaListItem* video = new DeviceListItem(B_TRANSLATE("Video settings"),
MediaListItem::VIDEO_TYPE);
fListView->AddItem(video);
+3 -1
View File
@@ -29,7 +29,7 @@
class BCardLayout;
class BSeparatorView;
class MidiSettingsView;
class MediaWindow : public BWindow {
public:
@@ -43,6 +43,7 @@ public:
void SelectAudioSettings(const char* title);
void SelectVideoSettings(const char* title);
void SelectAudioMixer(const char* title);
void SelectMidiSettings(const char* title);
// methods to be called by SettingsViews...
void UpdateInputListItem(
@@ -99,6 +100,7 @@ private:
BCardLayout* fContentLayout;
AudioSettingsView* fAudioView;
VideoSettingsView* fVideoView;
MidiSettingsView* fMidiView;
SmartNode fCurrentNode;
BParameterWeb* fParamWeb;
+177
View File
@@ -0,0 +1,177 @@
/*
* Copyright 2014, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "MidiSettingsView.h"
#include <Box.h>
#include <Catalog.h>
#include <Directory.h>
#include <Entry.h>
#include <FindDirectory.h>
#include <GridView.h>
#include <LayoutBuilder.h>
#include <ListView.h>
#include <Locale.h>
#include <Node.h>
#include <NodeInfo.h>
#include <Path.h>
#include <ScrollView.h>
#include <stdio.h>
#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Midi View"
#define SETTINGS_FILE "midi"
const static uint32 kSelectSoundFont = 'SeSf';
MidiSettingsView::MidiSettingsView()
:
SettingsView()
{
BBox* defaultsBox = new BBox("SoundFont");
defaultsBox->SetLabel(B_TRANSLATE("SoundFont"));
BGridView* defaultsGridView = new BGridView();
fListView = new BListView(B_SINGLE_SELECTION_LIST);
fListView->SetSelectionMessage(new BMessage(kSelectSoundFont));
BScrollView *scrollView = new BScrollView("ScrollView", fListView,
0, false, true);
BLayoutBuilder::Grid<>(defaultsGridView)
.SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING)
.Add(scrollView, 0, 0);
defaultsBox->AddChild(defaultsGridView);
BLayoutBuilder::Group<>(this)
.SetInsets(0, 0, 0, 0)
.Add(defaultsBox)
.AddGlue();
}
/* virtual */
void
MidiSettingsView::AttachedToWindow()
{
SettingsView::AttachedToWindow();
fListView->SetTarget(this);
_RetrieveSoftSynthList();
_LoadSettings();
}
/* virtual */
void
MidiSettingsView::MessageReceived(BMessage* message)
{
switch (message->what) {
case kSelectSoundFont:
_SaveSettings();
break;
default:
SettingsView::MessageReceived(message);
break;
}
}
void
MidiSettingsView::_RetrieveSoftSynthList()
{
char **paths = NULL;
size_t pathCount = 0;
status_t status = find_paths(B_FIND_PATH_DATA_DIRECTORY, "synth",
&paths, &pathCount);
if (status != B_OK)
return;
fListView->MakeEmpty();
for (size_t i = 0; i < pathCount; i++) {
BDirectory directory(paths[i]);
BEntry entry;
if (directory.InitCheck() != B_OK)
continue;
while (directory.GetNextEntry(&entry) == B_OK) {
// TODO: Get rid of this as soon as we update
// the SoundFont package not to create the link
// anymore
if (!strcmp(entry.Name(), "big_synth.sy"))
continue;
BNode node(&entry);
BNodeInfo nodeInfo(&node);
char mimeType[B_MIME_TYPE_LENGTH];
// TODO: For some reason this doesn't work
if (nodeInfo.GetType(mimeType) == B_OK
/*&& !strcmp(mimeType, "audio/x-soundfont")*/) {
BPath fullPath = paths[i];
fullPath.Append(entry.Name());
fListView->AddItem(new BStringItem(fullPath.Path()));
}
}
}
}
void
MidiSettingsView::_LoadSettings()
{
// TODO: Duplicated code between here
// and BSoftSynth::LoadDefaultInstruments
char buffer[512];
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
path.Append(SETTINGS_FILE);
BFile file(path.Path(), B_READ_ONLY);
if (file.InitCheck() == B_OK)
file.Read(buffer, sizeof(buffer));
}
char soundFont[512];
sscanf(buffer, "# Midi Settings\n soundfont = %s\n",
soundFont);
for (int32 i = 0; i < fListView->CountItems(); i++) {
BStringItem* item = (BStringItem*)fListView->ItemAt(i);
if (!strcmp(item->Text(), soundFont)) {
fListView->Select(i);
break;
}
}
}
void
MidiSettingsView::_SaveSettings()
{
int32 selection = fListView->CurrentSelection();
if (selection < 0)
return;
BStringItem* item = (BStringItem*)fListView->ItemAt(selection);
if (item == NULL)
return;
char buffer[512];
snprintf(buffer, 512, "# Midi Settings\n soundfont = %s\n",
item->Text());
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) {
path.Append(SETTINGS_FILE);
BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE);
if (file.InitCheck() == B_OK)
file.Write(buffer, strlen(buffer));
}
}
@@ -7,20 +7,21 @@
#define MIDIVIEW_H_
#include <GroupView.h>
#include "MediaViews.h"
class BButton;
class BListView;
class MidiView : public BGroupView {
class MidiSettingsView : public SettingsView {
public:
MidiView();
MidiSettingsView();
virtual void AttachedToWindow();
virtual void MessageReceived(BMessage* message);
private:
void _RetrieveSoftSynthList();
void _LoadSettings();
void _SaveSettings();
BButton* fImportButton;
BListView* fListView;
};
-8
View File
@@ -1,8 +0,0 @@
SubDir HAIKU_TOP src preferences midi ;
Preference Midi :
MidiApp.cpp
MidiView.cpp
MidiWindow.cpp
: midi be localestub [ TargetLibsupc++ ]
;
-39
View File
@@ -1,39 +0,0 @@
/*
* Copyright 2014, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <Application.h>
#include "MidiWindow.h"
class MidiApp : public BApplication {
public:
MidiApp();
virtual void ReadyToRun();
};
int main()
{
MidiApp app;
app.Run();
return 0;
}
MidiApp::MidiApp()
:
BApplication("application/x-vnd.MidiPreflet")
{
}
/* virtual */
void
MidiApp::ReadyToRun()
{
(new MidiWindow())->Show();
}
-93
View File
@@ -1,93 +0,0 @@
/*
* Copyright 2014, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "MidiView.h"
#include <Box.h>
#include <Button.h>
#include <Directory.h>
#include <Entry.h>
#include <FindDirectory.h>
#include <GridView.h>
#include <LayoutBuilder.h>
#include <ListView.h>
#include <stdio.h>
const static uint32 kImportSoundFont = 'ImSf';
MidiView::MidiView()
:
BGroupView(B_VERTICAL, B_USE_DEFAULT_SPACING)
{
BBox* defaultsBox = new BBox("defaults");
defaultsBox->SetLabel("Defaults");
BGridView* defaultsGridView = new BGridView();
fListView = new BListView(B_SINGLE_SELECTION_LIST);
fImportButton = new BButton("Import SoundFont",
new BMessage(kImportSoundFont));
BLayoutBuilder::Grid<>(defaultsGridView)
.SetInsets(B_USE_DEFAULT_SPACING, 0, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING)
.Add(fListView, 0, 0)
.Add(fImportButton, 0, 1);
defaultsBox->AddChild(defaultsGridView);
BLayoutBuilder::Group<>(this)
.SetInsets(0, 0, 0, 0)
.Add(defaultsBox)
.AddGlue();
}
/* virtual */
void
MidiView::AttachedToWindow()
{
fImportButton->SetTarget(this);
_RetrieveSoftSynthList();
}
/* virtual */
void
MidiView::MessageReceived(BMessage* message)
{
switch (message->what) {
case kImportSoundFont:
break;
default:
BGroupView::MessageReceived(message);
break;
}
}
void
MidiView::_RetrieveSoftSynthList()
{
char **paths = NULL;
size_t pathCount = 0;
status_t status = find_paths(B_FIND_PATH_DATA_DIRECTORY, "synth",
&paths, &pathCount);
if (status != B_OK)
return;
fListView->MakeEmpty();
for (size_t i = 0; i < pathCount; i++) {
BDirectory directory(paths[i]);
BEntry entry;
if (directory.InitCheck() != B_OK)
continue;
while (directory.GetNextEntry(&entry) == B_OK) {
fListView->AddItem(new BStringItem(entry.Name()));
}
}
}
-25
View File
@@ -1,25 +0,0 @@
/*
* Copyright 2014, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include "MidiWindow.h"
#include <LayoutBuilder.h>
#include "MidiView.h"
MidiWindow::MidiWindow()
:
BWindow(BRect(40, 40, 260, 260), "Midi Preferences",
B_TITLED_WINDOW, B_SUPPORTS_LAYOUT)
{
fMidiView = new MidiView();
BLayoutBuilder::Group<>(this, B_HORIZONTAL)
.SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING,
B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING)
.Add(fMidiView, 0.0f);
}
-19
View File
@@ -1,19 +0,0 @@
/*
* Copyright 2014, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef MIDIWINDOW_H_
#define MIDIWINDOW_H_
#include <Window.h>
class MidiView;
class MidiWindow : public BWindow {
public:
MidiWindow();
private:
MidiView* fMidiView;
};
#endif /* MIDIWINDOW_H_ */