I shouldn't push my luck too much, so I'm commiting these WIP changes:

* Removed unmaintained makefile.
* Renamed TPreferences to SettingsMessage, which better describes the beast.
* Renamed setter functions in SettingsMessage for more convenient use.
* Added getter functions which take a default value argument that is returned
  when there is no value for the given key.
* Cleanup in Settings.[h|cpp], made things simpler and more convenient. Removed
  redundant saving of the settings/message, which SettingsMessage already takes
  care of. Added a global instance of the application settings.
* Some cleanup in FileReadWrite and Playlist.
* Reimplemented the SettingsWindow with the new layout API, the old code is
  still in place for compiling for BeOS.
* Added two more check boxen for the overlay and bilinear scaling option I
  intend to add eventually.
* Refactored the rest of the code in SettingsWindow to use the new global
  settings instance and also support a Revert feature. All the new controls are
  only available in Haiku though.
* Enabled the Settings... menu entry in the Settings window for access to
  the SettingsWindow.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27154 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2008-08-22 15:28:59 +00:00
parent a0e3096f6a
commit 26e9cdb72c
14 changed files with 796 additions and 457 deletions
+2 -2
View File
@@ -84,13 +84,13 @@ Application MediaPlayer :
CommandStack.cpp
Event.cpp
EventQueue.cpp
FileReadWrite.cpp
Listener.cpp
ListenerAdapter.cpp
MessageEvent.cpp
Notifier.cpp
RWLocker.cpp
FileReadWrite.cpp
TPreferences.cpp
SettingsMessage.cpp
# .
Controller.cpp
+3 -3
View File
@@ -949,9 +949,9 @@ MainWin::_CreateMenu()
new BMessage(M_TOGGLE_NO_CONTROLS), 'C'));
fSettingsMenu->AddItem(new BMenuItem("Always on Top",
new BMessage(M_TOGGLE_ALWAYS_ON_TOP), 'T'));
// fSettingsMenu->AddSeparatorItem();
// fSettingsMenu->AddItem(new BMenuItem("Settings"B_UTF8_ELLIPSIS,
// new BMessage(M_SETTINGS), 'S'));
fSettingsMenu->AddSeparatorItem();
fSettingsMenu->AddItem(new BMenuItem("Settings"B_UTF8_ELLIPSIS,
new BMessage(M_SETTINGS), 'S'));
// fDebugMenu->AddItem(new BMenuItem("pixel aspect ratio 1.00000:1",
// new BMessage(M_ASPECT_100000_1)));
-59
View File
@@ -1,59 +0,0 @@
DEBUG = yes
#DEBUG = no
TARGET = HaikuMediaPlayer
SOURCES = Controller.cpp \
ControllerView.cpp \
DrawingTidbits.cpp \
SoundOutput.cpp \
TransportButton.cpp \
TransportControlGroup.cpp \
MainApp.cpp \
MainWin.cpp \
Playlist.cpp \
SeekSlider.cpp \
VideoNode.cpp \
VideoView.cpp \
VolumeSlider.cpp
CPPFLAGS = -Wall -Wno-multichar -Wmissing-prototypes -Wpointer-arith -Wcast-align -Wsign-compare
LDFLAGS = -lmedia -lbe -ltracker
ARCHIVES =
CC=g++
OBJECTS = $(patsubst %.cpp, obj/%.o, $(SOURCES))
ifeq ($(DEBUG), yes)
CPPFLAGS += -g -O0 -DDEBUG=1
LDFLAGS += -g
else
# Application crashed when O1 or higher
CPPFLAGS += -O0
endif
CPPFLAGS +=
all: $(TARGET)
obj:
@[ -d obj ] || mkdir obj > /dev/null 2>&1
#obj/%.o: %.cpp obj
obj/%.o: %.cpp
$(CC) -c $< $(INCLUDES) $(CPPFLAGS) -o $@
$(TARGET): $(OBJECTS)
$(CC) -o $@ $(LDFLAGS) $(OBJECTS) $(ARCHIVES)
chmod 0777 $@
run: $(TARGET)
./$(TARGET) &
clean:
rm -f ./$(TARGET)
rm -f ./obj/*.o
+1 -1
View File
@@ -263,7 +263,7 @@ Playlist::GetRefAt(int32 index, entry_ref* _ref) const
// #pragma mark -
// #pragma mark - navigation
void
+58 -74
View File
@@ -5,103 +5,87 @@
* Authors:
* Fredrik Modéen <fredrik@modeen.se>
*/
#include "Settings.h"
#include <stdio.h>
#include <Autolock.h>
#include <String.h>
#include <FindDirectory.h>
#include <File.h>
#include "TPreferences.h"
Settings::Settings(const char *filename)
: fTPreferences(TPreferences(B_USER_CONFIG_DIRECTORY, filename))
Settings::Settings(const char* filename)
: BLocker("settings lock"),
fSettingsMessage(B_USER_CONFIG_DIRECTORY, filename)
{
}
void
Settings::LoadSettings(mpSettings &settings)
Settings::LoadSettings(mpSettings& settings) const
{
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
return;
path.Append(SETTINGSFILENAME);
BFile settingsFile(path.Path(), B_READ_ONLY);
if (settingsFile.InitCheck() != B_OK) {
_SetDefault(settings);
return;
}
fTPreferences.Unflatten(&settingsFile);
memset(&settings, 0, sizeof(settings));
fTPreferences.FindInt8("autostart", (int8 *)&settings.autostart);
fTPreferences.FindInt8("closeWhenDonePlayingMovie",
(int8 *)&settings.closeWhenDonePlayingMovie);
fTPreferences.FindInt8("closeWhenDonePlayingSound",
(int8 *)&settings.closeWhenDonePlayingSound);
fTPreferences.FindInt8("loopMovie", (int8 *)&settings.loopMovie);
fTPreferences.FindInt8("loopSound", (int8 *)&settings.loopSound);
fTPreferences.FindInt8("fullVolume", (int8 *)&settings.fullVolume);
fTPreferences.FindInt8("halfVolume", (int8 *)&settings.halfVolume);
fTPreferences.FindInt8("mute", (int8 *)&settings.mute);
fTPreferences.Flatten(&settingsFile);
BAutolock _(const_cast<Settings*>(this));
settings.autostart = fSettingsMessage.GetValue("autostart", true);
settings.closeWhenDonePlayingMovie
= fSettingsMessage.GetValue("closeWhenDonePlayingMovie", false);
settings.closeWhenDonePlayingSound
= fSettingsMessage.GetValue("closeWhenDonePlayingSound", false);
settings.loopMovie = fSettingsMessage.GetValue("loopMovie", false);
settings.loopSound = fSettingsMessage.GetValue("loopSound", false);
settings.useOverlays = fSettingsMessage.GetValue("useOverlays", true);
settings.scaleBilinear = fSettingsMessage.GetValue("scaleBilinear", false);
settings.backgroundMovieVolumeMode
= fSettingsMessage.GetValue("bgMovieVolumeMode",
(uint32)mpSettings::BG_MOVIES_MUTED);
}
void
Settings::SaveSettings(const mpSettings &settings)
Settings::SaveSettings(const mpSettings& settings)
{
BPath path;
if (find_directory(B_USER_SETTINGS_DIRECTORY, &path, true) != B_OK)
return;
path.Append(SETTINGSFILENAME);
BFile settingsFile(path.Path(), B_READ_WRITE | B_CREATE_FILE);
fTPreferences.Unflatten(&settingsFile);
BAutolock _(this);
fTPreferences.SetInt8("autostart", settings.autostart);
fTPreferences.SetInt8("closeWhenDonePlayingMovie",
fSettingsMessage.SetValue("autostart", settings.autostart);
fSettingsMessage.SetValue("closeWhenDonePlayingMovie",
settings.closeWhenDonePlayingMovie);
fTPreferences.SetInt8("closeWhenDonePlayingSound",
fSettingsMessage.SetValue("closeWhenDonePlayingSound",
settings.closeWhenDonePlayingSound);
fTPreferences.SetInt8("loopMovie", settings.loopMovie);
fTPreferences.SetInt8("loopSound", settings.loopSound);
fTPreferences.SetInt8("fullVolume", settings.fullVolume);
fTPreferences.SetInt8("halfVolume", settings.halfVolume);
fTPreferences.SetInt8("mute", settings.mute);
settingsFile.SetSize(0);
settingsFile.Seek(0, SEEK_SET);
fSettingsMessage.SetValue("loopMovie", settings.loopMovie);
fSettingsMessage.SetValue("loopSound", settings.loopSound);
fTPreferences.Flatten(&settingsFile);
fSettingsMessage.SetValue("useOverlays", settings.useOverlays);
fSettingsMessage.SetValue("scaleBilinear", settings.scaleBilinear);
fSettingsMessage.SetValue("bgMovieVolumeMode",
settings.backgroundMovieVolumeMode);
// Save at this point, although saving is also done on destruction,
// this will make sure the settings are saved even when the player
// crashes.
fSettingsMessage.Save();
}
void
Settings::_SetDefault(mpSettings &settings)
// #pragma mark - static
/*static*/ Settings
Settings::sGlobalInstance;
/*static*/ mpSettings
Settings::CurrentSettings()
{
memset(&settings, 0, sizeof(settings));
settings.autostart = 0;
settings.closeWhenDonePlayingMovie = 0;
settings.closeWhenDonePlayingSound = 0;
settings.loopMovie = 0;
settings.loopSound = 0;
settings.fullVolume = 0;
settings.halfVolume = 0;
settings.mute = 1;
mpSettings settings;
sGlobalInstance.LoadSettings(settings);
return settings;
}
/*static*/ Settings*
Settings::Default()
{
return &sGlobalInstance;
}
+34 -21
View File
@@ -6,33 +6,46 @@
* Fredrik Modéen <fredrik@modeen.se>
*/
#ifndef __SETTINGS_H__
#define __SETTINGS_H__
#ifndef SETTINGS_H
#define SETTINGS_H
#include <Message.h>
#include <Path.h>
#include <Locker.h>
#include "TPreferences.h"
#include "SettingsMessage.h"
struct mpSettings {
int8
autostart, closeWhenDonePlayingMovie, closeWhenDonePlayingSound,
loopMovie, loopSound, fullVolume, halfVolume, mute;
bool autostart;
bool closeWhenDonePlayingMovie;
bool closeWhenDonePlayingSound;
bool loopMovie;
bool loopSound;
bool useOverlays;
bool scaleBilinear;
enum {
BG_MOVIES_FULL_VOLUME = 0,
BG_MOVIES_HALF_VLUME = 1,
BG_MOVIES_MUTED = 2
};
uint32 backgroundMovieVolumeMode;
};
#define SETTINGSFILENAME "MediaPlayerSettings"
#define SETTINGS_FILENAME "MediaPlayerSettings"
class Settings {
public:
Settings(const char *filename = SETTINGSFILENAME);
void LoadSettings(mpSettings &settings);
void SaveSettings(const mpSettings &settings);
private:
void _SetDefault(mpSettings &settings);
TPreferences fTPreferences;
class Settings : public BLocker {
public:
Settings(
const char* filename = SETTINGS_FILENAME);
void LoadSettings(mpSettings& settings) const;
void SaveSettings(const mpSettings& settings);
static mpSettings CurrentSettings();
static Settings* Default();
private:
SettingsMessage fSettingsMessage;
static Settings sGlobalInstance;
};
#endif // __SETTINGS_H__
#endif // SETTINGS_H
+240 -41
View File
@@ -18,17 +18,28 @@
#include <Button.h>
#include <String.h>
#ifdef __HAIKU__
# include <GridLayoutBuilder.h>
# include <GroupLayout.h>
# include <GroupLayoutBuilder.h>
# include <SpaceLayoutItem.h>
#endif
enum {
M_AUTOSTART = 0x3000,
M_CLOSE_WINDOW_MOVIE,
M_CLOSE_WINDOW_SOUNDS,
M_LOOP_MOVIE,
M_LOOP_SOUND,
M_USE_OVERLAYS,
M_SCALE_BILINEAR,
M_START_FULL_VOLUME,
M_START_HALF_VOLUME,
M_START_MUTE_VOLUME,
M_SETTINGS_SAVE,
M_SETTINGS_CANCEL,
M_SETTINGS_REVERT
};
#define SPACE 10
@@ -36,12 +47,137 @@ enum {
#define BUTTONHEIGHT 20
SettingsWindow::SettingsWindow(BRect frame)
: BWindow(frame, "Settings", B_MODAL_WINDOW, B_NOT_CLOSABLE | B_NOT_ZOOMABLE
| B_NOT_RESIZABLE)
: BWindow(frame, "MediaPlayer Settings", B_TITLED_WINDOW_LOOK,
B_NORMAL_WINDOW_FEEL,
B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE
#ifdef __HAIKU__
| B_AUTO_UPDATE_SIZE_LIMITS)
#else
)
#endif
{
fSettingsObj = new Settings();
fSettingsObj->LoadSettings(fSettings);
#ifdef __HAIKU__
BBox* settingsBox = new BBox(B_PLAIN_BORDER, NULL);
BGroupLayout* settingsLayout = new BGroupLayout(B_VERTICAL, 5);
settingsBox->SetLayout(settingsLayout);
BBox* buttonBox = new BBox(B_PLAIN_BORDER, NULL);
BGroupLayout* buttonLayout = new BGroupLayout(B_HORIZONTAL, 5);
buttonBox->SetLayout(buttonLayout);
BStringView* playModeLabel = new BStringView("stringViewPlayMode",
"Play mode");
BStringView* viewOptionsLabel = new BStringView("stringViewViewOpions",
"View options");
BStringView* bgMoviesModeLabel = new BStringView("stringViewPlayBackg",
"Play background movies at");
BAlignment alignment(B_ALIGN_LEFT, B_ALIGN_VERTICAL_CENTER);
playModeLabel->SetExplicitAlignment(alignment);
playModeLabel->SetFont(be_bold_font);
viewOptionsLabel->SetExplicitAlignment(alignment);
viewOptionsLabel->SetFont(be_bold_font);
bgMoviesModeLabel->SetExplicitAlignment(alignment);
bgMoviesModeLabel->SetFont(be_bold_font);
fAutostartCB = new BCheckBox("chkboxAutostart",
"Automatically start playing", new BMessage(M_AUTOSTART));
fCloseWindowMoviesCB = new BCheckBox("chkBoxCloseWindowMovies",
"Close window when done playing movies",
new BMessage(M_CLOSE_WINDOW_MOVIE));
fCloseWindowSoundsCB = new BCheckBox("chkBoxCloseWindowSounds",
"Close window when done playing sounds",
new BMessage(M_CLOSE_WINDOW_SOUNDS));
fLoopMoviesCB = new BCheckBox("chkBoxLoopMovie",
"Loop movies by default", new BMessage(M_LOOP_MOVIE));
fLoopSoundsCB = new BCheckBox("chkBoxLoopSounds",
"Loop sounds by default", new BMessage(M_LOOP_SOUND));
fUseOverlaysCB = new BCheckBox("chkBoxUseOverlays",
"Use hardware video overlays if available",
new BMessage(M_USE_OVERLAYS));
fScaleBilinearCB = new BCheckBox("chkBoxScaleBilinear",
"Scale movies smoothly (non-overlay mode)",
new BMessage(M_SCALE_BILINEAR));
fFullVolumeBGMoviesRB = new BRadioButton("rdbtnfullvolume",
"Full volume", new BMessage(M_START_FULL_VOLUME));
fHalfVolumeBGMoviesRB = new BRadioButton("rdbtnhalfvolume",
"Half volume", new BMessage(M_START_HALF_VOLUME));
fMutedVolumeBGMoviesRB = new BRadioButton("rdbtnfullvolume",
"Muted", new BMessage(M_START_MUTE_VOLUME));
BButton* revertButton = new BButton("revert", "Revert",
new BMessage(M_SETTINGS_REVERT));
BButton* cancelButton = new BButton("cancel", "Cancel",
new BMessage(M_SETTINGS_CANCEL));
BButton* okButton = new BButton("ok", "Ok",
new BMessage(M_SETTINGS_SAVE));
okButton->MakeDefault(true);
// Build the layout
SetLayout(new BGroupLayout(B_HORIZONTAL));
AddChild(BGroupLayoutBuilder(B_VERTICAL, 0)
.Add(BGroupLayoutBuilder(settingsLayout)
.Add(playModeLabel)
.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10))
.Add(BGroupLayoutBuilder(B_VERTICAL, 0)
.Add(fAutostartCB)
.Add(BGridLayoutBuilder(5, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10), 0, 0)
.Add(fCloseWindowMoviesCB, 1, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10), 0, 1)
.Add(fCloseWindowSoundsCB, 1, 1)
)
.Add(fLoopMoviesCB)
.Add(fLoopSoundsCB)
)
)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.Add(viewOptionsLabel)
.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10))
.Add(BGroupLayoutBuilder(B_VERTICAL, 0)
.Add(fUseOverlaysCB)
.Add(fScaleBilinearCB)
)
)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.Add(bgMoviesModeLabel)
.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
.Add(BSpaceLayoutItem::CreateHorizontalStrut(10))
.Add(BGroupLayoutBuilder(B_VERTICAL, 0)
.Add(fFullVolumeBGMoviesRB)
.Add(fHalfVolumeBGMoviesRB)
.Add(fMutedVolumeBGMoviesRB)
)
)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.SetInsets(5, 5, 15, 5)
)
.Add(BGroupLayoutBuilder(buttonLayout)
.Add(revertButton)
.AddGlue()
.Add(cancelButton)
.Add(okButton)
.SetInsets(5, 5, 5, 5)
)
);
#else
frame = Bounds();
BView* view = new BView(frame,"SettingsView",B_FOLLOW_ALL_SIDES,B_WILL_DRAW);
view->SetViewColor(216, 216, 216);
@@ -72,23 +208,23 @@ SettingsWindow::SettingsWindow(BRect frame)
bbox->AddChild(new BStringView(rect, "stringViewPlayMode", str.String()));
rect.OffsetBy(0, rect.Height());
bbox->AddChild(fChkboxAutostart = new BCheckBox(rect, "chkboxAutostart",
bbox->AddChild(fAutostartCB = new BCheckBox(rect, "chkboxAutostart",
"Automatically start playing", new BMessage(M_AUTOSTART)));
rect.OffsetBy(SPACE, rect.Height() + SPACEING);
bbox->AddChild(fChkBoxCloseWindowMovies = new BCheckBox(rect, "chkBoxCloseWindowMovies",
bbox->AddChild(fCloseWindowMoviesCB = new BCheckBox(rect, "chkBoxCloseWindowMovies",
"Close window when done playing movies", new BMessage(M_CLOSE_WINDOW_MOVIE)));
rect.OffsetBy(0, rect.Height() + SPACEING);
bbox->AddChild(fChkBoxCloseWindowSounds = new BCheckBox(rect, "chkBoxCloseWindowSounds",
bbox->AddChild(fCloseWindowSoundsCB = new BCheckBox(rect, "chkBoxCloseWindowSounds",
"Close window when done playing sounds", new BMessage(M_CLOSE_WINDOW_SOUNDS)));
rect.OffsetBy(-SPACE, rect.Height() + SPACEING);
bbox->AddChild(fChkBoxLoopMovie = new BCheckBox(rect, "chkBoxLoopMovie", "Loop movies by default",
bbox->AddChild(fLoopMoviesCB = new BCheckBox(rect, "chkBoxLoopMovie", "Loop movies by default",
new BMessage(M_LOOP_MOVIE)));
rect.OffsetBy(0, rect.Height() + SPACEING);
bbox->AddChild(fChkBoxLoopSounds = new BCheckBox(rect, "chkBoxLoopSounds", "Loop sounds by default",
bbox->AddChild(fLoopSoundsCB = new BCheckBox(rect, "chkBoxLoopSounds", "Loop sounds by default",
new BMessage(M_LOOP_SOUND)));
rect.OffsetBy(0, rect.Height() + SPACE + SPACEING);
@@ -96,24 +232,27 @@ SettingsWindow::SettingsWindow(BRect frame)
"Play backgrounds movies at:"));
rect.OffsetBy(SPACE, rect.Height() + SPACEING);
fRdbtnfullvolume = new BRadioButton(rect, "rdbtnfullvolume",
fFullVolumeBGMoviesRB = new BRadioButton(rect, "rdbtnfullvolume",
"Full Volume", new BMessage(M_START_FULL_VOLUME));
bbox->AddChild(fRdbtnfullvolume);
bbox->AddChild(fFullVolumeBGMoviesRB);
rect.OffsetBy(0, rect.Height() + SPACEING);
fRdbtnhalfvolume = new BRadioButton(rect, "rdbtnhalfvolume",
fHalfVolumeBGMoviesRB = new BRadioButton(rect, "rdbtnhalfvolume",
"Half Volume", new BMessage(M_START_HALF_VOLUME));
bbox->AddChild(fRdbtnhalfvolume);
bbox->AddChild(fHalfVolumeBGMoviesRB);
rect.OffsetBy(0, rect.Height() + SPACEING);
fRdbtnmutevolume = new BRadioButton(rect, "rdbtnfullvolume", "Muted",
fMutedVolumeBGMoviesRB = new BRadioButton(rect, "rdbtnfullvolume", "Muted",
new BMessage(M_START_MUTE_VOLUME));
bbox->AddChild(fRdbtnmutevolume);
SetSettings();
bbox->AddChild(fMutedVolumeBGMoviesRB);
view->AddChild(bbox);
AddChild(view);
#endif
// disable currently unsupported features
fLoopMoviesCB->SetEnabled(false);
fLoopSoundsCB->SetEnabled(false);
}
@@ -123,16 +262,13 @@ SettingsWindow::~SettingsWindow()
void
SettingsWindow::SetSettings()
SettingsWindow::Show()
{
fChkboxAutostart->SetValue(fSettings.autostart);
fChkBoxCloseWindowMovies->SetValue(fSettings.closeWhenDonePlayingMovie);
fChkBoxCloseWindowSounds->SetValue(fSettings.closeWhenDonePlayingSound);
fChkBoxLoopMovie->SetValue(fSettings.loopMovie);
fChkBoxLoopSounds->SetValue(fSettings.loopSound);
fRdbtnfullvolume->SetValue(fSettings.fullVolume);
fRdbtnhalfvolume->SetValue(fSettings.halfVolume);
fRdbtnmutevolume->SetValue(fSettings.mute);
Settings::Default()->LoadSettings(fLastSettings);
fSettings = fLastSettings;
AdoptSettings();
BWindow::Show();
}
@@ -153,30 +289,93 @@ SettingsWindow::MessageReceived(BMessage* message)
case M_CLOSE_WINDOW_SOUNDS:
case M_LOOP_MOVIE:
case M_LOOP_SOUND:
case M_USE_OVERLAYS:
case M_SCALE_BILINEAR:
case M_START_FULL_VOLUME:
case M_START_HALF_VOLUME:
case M_START_MUTE_VOLUME:
fSettings.autostart = fChkboxAutostart->Value();
fSettings.closeWhenDonePlayingMovie = fChkBoxCloseWindowMovies->Value();
fSettings.closeWhenDonePlayingSound = fChkBoxCloseWindowSounds->Value();
fSettings.loopMovie = fChkBoxLoopMovie->Value();
fSettings.loopSound = fChkBoxLoopSounds->Value();
fSettings.fullVolume = fRdbtnfullvolume->Value();
fSettings.halfVolume = fRdbtnhalfvolume->Value();
fSettings.mute = fRdbtnmutevolume->Value();
ApplySettings();
break;
case B_KEY_DOWN:
int32 index;
if(message->FindInt32("key", &index) == B_NO_ERROR)
if(index == 1)
PostMessage(B_QUIT_REQUESTED);
break;
case M_SETTINGS_SAVE:
fSettingsObj->SaveSettings(fSettings);
if (message->FindInt32("key", &index) == B_OK && index == 1)
PostMessage(B_QUIT_REQUESTED);
break;
case M_SETTINGS_REVERT:
Revert();
break;
case M_SETTINGS_CANCEL:
Revert();
// fall through
case M_SETTINGS_SAVE:
PostMessage(B_QUIT_REQUESTED);
break;
break;
default:
BWindow::MessageReceived(message);
break;
}
}
void
SettingsWindow::AdoptSettings()
{
fAutostartCB->SetValue(fSettings.autostart);
fCloseWindowMoviesCB->SetValue(fSettings.closeWhenDonePlayingMovie);
fCloseWindowSoundsCB->SetValue(fSettings.closeWhenDonePlayingSound);
fLoopMoviesCB->SetValue(fSettings.loopMovie);
fLoopSoundsCB->SetValue(fSettings.loopSound);
fUseOverlaysCB->SetValue(fSettings.useOverlays);
fScaleBilinearCB->SetValue(fSettings.scaleBilinear);
fFullVolumeBGMoviesRB->SetValue(fSettings.backgroundMovieVolumeMode
== mpSettings::BG_MOVIES_FULL_VOLUME);
fHalfVolumeBGMoviesRB->SetValue(fSettings.backgroundMovieVolumeMode
== mpSettings::BG_MOVIES_HALF_VLUME);
fMutedVolumeBGMoviesRB->SetValue(fSettings.backgroundMovieVolumeMode
== mpSettings::BG_MOVIES_MUTED);
}
void
SettingsWindow::ApplySettings()
{
fSettings.autostart = fAutostartCB->Value() == B_CONTROL_ON;
fSettings.closeWhenDonePlayingMovie
= fCloseWindowMoviesCB->Value() == B_CONTROL_ON;
fSettings.closeWhenDonePlayingSound
= fCloseWindowSoundsCB->Value() == B_CONTROL_ON;
fSettings.loopMovie = fLoopMoviesCB->Value() == B_CONTROL_ON;
fSettings.loopSound = fLoopSoundsCB->Value() == B_CONTROL_ON;
fSettings.useOverlays = fUseOverlaysCB->Value() == B_CONTROL_ON;
fSettings.scaleBilinear = fScaleBilinearCB->Value() == B_CONTROL_ON;
if (fFullVolumeBGMoviesRB->Value() == B_CONTROL_ON) {
fSettings.backgroundMovieVolumeMode
= mpSettings::BG_MOVIES_FULL_VOLUME;
} else if (fHalfVolumeBGMoviesRB->Value() == B_CONTROL_ON) {
fSettings.backgroundMovieVolumeMode
= mpSettings::BG_MOVIES_HALF_VLUME;
} else if (fMutedVolumeBGMoviesRB->Value() == B_CONTROL_ON) {
fSettings.backgroundMovieVolumeMode
= mpSettings::BG_MOVIES_MUTED;
}
Settings::Default()->SaveSettings(fSettings);
}
void
SettingsWindow::Revert()
{
fSettings = fLastSettings;
AdoptSettings();
Settings::Default()->SaveSettings(fSettings);
}
+28 -17
View File
@@ -16,24 +16,35 @@
#include "Settings.h"
class SettingsWindow : public BWindow {
public:
SettingsWindow(BRect frame);
virtual ~SettingsWindow();
void SetSettings();
virtual bool QuitRequested();
virtual void MessageReceived(BMessage* message);
private:
Settings* fSettingsObj;
mpSettings fSettings;
public:
SettingsWindow(BRect frame);
virtual ~SettingsWindow();
virtual void Show();
virtual bool QuitRequested();
virtual void MessageReceived(BMessage* message);
void AdoptSettings();
void ApplySettings();
void Revert();
bool IsRevertable();
private:
mpSettings fSettings;
mpSettings fLastSettings;
BCheckBox* fChkboxAutostart;
BCheckBox* fChkBoxCloseWindowMovies;
BCheckBox* fChkBoxCloseWindowSounds;
BCheckBox* fChkBoxLoopMovie;
BCheckBox* fChkBoxLoopSounds;
BRadioButton* fRdbtnfullvolume;
BRadioButton* fRdbtnhalfvolume;
BRadioButton* fRdbtnmutevolume;
BCheckBox* fAutostartCB;
BCheckBox* fCloseWindowMoviesCB;
BCheckBox* fCloseWindowSoundsCB;
BCheckBox* fLoopMoviesCB;
BCheckBox* fLoopSoundsCB;
BCheckBox* fUseOverlaysCB;
BCheckBox* fScaleBilinearCB;
BRadioButton* fFullVolumeBGMoviesRB;
BRadioButton* fHalfVolumeBGMoviesRB;
BRadioButton* fMutedVolumeBGMoviesRB;
};
#endif
+18 -14
View File
@@ -6,15 +6,17 @@
* Michael Pfeiffer <laplace@users.sourceforge.net>
* Fredrik Modéen <fredrik@modeen.se>
*/
#include "FileReadWrite.h"
#include <UTF8.h>
#include <Path.h>
FileReadWrite::FileReadWrite(BFile *file, int32 sourceEncoding)
FileReadWrite::FileReadWrite(BFile* file, int32 sourceEncoding)
: fFile(file),
fSourceEncoding(sourceEncoding)
fSourceEncoding(sourceEncoding),
fPositionInBuffer(0),
fAmtRead(0)
{}
@@ -26,27 +28,27 @@ FileReadWrite::SetEncoding(int32 sourceEncoding)
uint32
FileReadWrite::GetEncoding()
FileReadWrite::GetEncoding() const
{
return fSourceEncoding;
}
status_t
FileReadWrite::Write(const BString& contents)const
FileReadWrite::Write(const BString& contents) const
{
ssize_t sz = fFile->Write(contents.String(), contents.Length());
if (sz != contents.Length())
return sz < 0 ? sz : B_IO_ERROR;
else
return B_OK;
ssize_t written = fFile->Write(contents.String(), contents.Length());
if (written != contents.Length())
return written < 0 ? (status_t)written : B_IO_ERROR;
return B_OK;
}
bool
FileReadWrite::Next(BString& string)
{
// Fill up the buffer with the first chunk of code
// Fill up the buffer with the first chunk of data
if (fPositionInBuffer == 0)
fAmtRead = fFile->Read(&fBuffer, sizeof(fBuffer));
while (fAmtRead > 0) {
@@ -54,13 +56,15 @@ FileReadWrite::Next(BString& string)
// Return true if we hit a newline or the end of the file
if (fBuffer[fPositionInBuffer] == '\n') {
fPositionInBuffer++;
//Convert begin
// Convert begin
int32 state = 0;
int32 bufferLen = string.Length();
int32 destBufferLen = bufferLen;
char destination[destBufferLen];
if (fSourceEncoding)
convert_to_utf8(fSourceEncoding, string.String(), &bufferLen, destination, &destBufferLen, &state);
if (fSourceEncoding) {
convert_to_utf8(fSourceEncoding, string.String(),
&bufferLen, destination, &destBufferLen, &state);
}
string = destination;
return true;
}
+20 -19
View File
@@ -1,34 +1,35 @@
/*
* Copyright 2008, Haiku.
* Copyright 2008, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Michael Pfeiffer <laplace@users.sourceforge.net>
* Fredrik Modéen <fredrik@modeen.se>
*/
#ifndef _FILEREADRWITE_
#define _FILEREADRWITE_
#ifndef FILE_READ_WRITE_H
#define FILE_READ_WRITE_H
#include <stdio.h>
#include <File.h>
#include <String.h>
class FileReadWrite {
public:
// -1 defult encoding
FileReadWrite(BFile *file, int32 sourceEncoding = -1);
bool Next(BString& string);
status_t Write(const BString& contents)const;
void SetEncoding(int32 sourceEncoding);
uint32 GetEncoding();
private:
BFile* fFile;
int32 fSourceEncoding;
char fBuffer[4096];
off_t fPositionInBuffer;
ssize_t fAmtRead;
class FileReadWrite {
public:
FileReadWrite(BFile* file,
int32 sourceEncoding = -1);
// -1 means "default" encoding
bool Next(BString& string);
status_t Write(const BString& contents) const;
void SetEncoding(int32 sourceEncoding);
uint32 GetEncoding() const;
private:
BFile* fFile;
int32 fSourceEncoding;
char fBuffer[4096];
off_t fPositionInBuffer;
ssize_t fAmtRead;
};
#endif //_FILEREADRWITE_
#endif //FILE_READ_WRITE_H
@@ -0,0 +1,316 @@
/*
* Copyright 2008 Stephan Aßmus <superstippi@gmx.de>.
* Copyright 1998 Eric Shepherd.
* All rights reserved. Distributed under the terms of the Be Sample Code
* license.
*/
//! Be Newsletter Volume II, Issue 35; September 2, 1998 (Eric Shepherd)
#include "SettingsMessage.h"
#include <File.h>
#include <String.h>
SettingsMessage::SettingsMessage(directory_which directory,
const char* filename)
: BMessage('pref')
{
fStatus = find_directory(directory, &fPath);
if (fStatus == B_OK)
fStatus = fPath.Append(filename);
if (fStatus == B_OK)
fStatus = Load();
}
SettingsMessage::~SettingsMessage()
{
Save();
}
status_t
SettingsMessage::InitCheck() const
{
return fStatus;
}
status_t
SettingsMessage::Load()
{
BFile file(fPath.Path(), B_READ_ONLY);
status_t status = file.InitCheck();
if (status == B_OK)
status = Unflatten(&file);
return status;
}
status_t
SettingsMessage::Save() const
{
BFile file(fPath.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
status_t status = file.InitCheck();
if (status == B_OK)
status = Flatten(&file);
return status;
}
// #pragma mark -
status_t
SettingsMessage::SetValue(const char* name, bool value)
{
if (ReplaceBool(name, value) == B_OK)
return B_OK;
return AddBool(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, int8 value)
{
if (ReplaceInt8(name, value) == B_OK)
return B_OK;
return AddInt8(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, int16 value)
{
if (ReplaceInt16(name, value) == B_OK)
return B_OK;
return AddInt16(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, int32 value)
{
if (ReplaceInt32(name, value) == B_OK)
return B_OK;
return AddInt32(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, uint32 value)
{
if (ReplaceInt32(name, (int32)value) == B_OK)
return B_OK;
return AddInt32(name, (int32)value);
}
status_t
SettingsMessage::SetValue(const char* name, int64 value)
{
if (ReplaceInt64(name, value) == B_OK)
return B_OK;
return AddInt64(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, float value)
{
if (ReplaceFloat(name, value) == B_OK)
return B_OK;
return AddFloat(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, double value)
{
if (ReplaceDouble(name, value) == B_OK)
return B_OK;
return AddDouble(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, const char* value)
{
if (ReplaceString(name, value) == B_OK)
return B_OK;
return AddString(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, const BString& value)
{
return SetValue(name, value.String());
}
status_t
SettingsMessage::SetValue(const char* name, BPoint value)
{
if (ReplacePoint(name, value) == B_OK)
return B_OK;
return AddPoint(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, BRect value)
{
if (ReplaceRect(name, value) == B_OK)
return B_OK;
return AddRect(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, const BMessage* value)
{
if (ReplaceMessage(name, value) == B_OK)
return B_OK;
return AddMessage(name, value);
}
status_t
SettingsMessage::SetValue(const char* name, const BFlattenable* value)
{
if (ReplaceFlat(name, const_cast<BFlattenable*>(value)) == B_OK)
return B_OK;
return AddFlat(name, const_cast<BFlattenable*>(value));
}
// #pragma mark -
bool
SettingsMessage::GetValue(const char* name, bool defaultValue) const
{
bool value;
if (FindBool(name, &value) != B_OK)
return defaultValue;
return value;
}
int8
SettingsMessage::GetValue(const char* name, int8 defaultValue) const
{
int8 value;
if (FindInt8(name, &value) != B_OK)
return defaultValue;
return value;
}
int16
SettingsMessage::GetValue(const char* name, int16 defaultValue) const
{
int16 value;
if (FindInt16(name, &value) != B_OK)
return defaultValue;
return value;
}
int32
SettingsMessage::GetValue(const char* name, int32 defaultValue) const
{
int32 value;
if (FindInt32(name, &value) != B_OK)
return defaultValue;
return value;
}
uint32
SettingsMessage::GetValue(const char* name, uint32 defaultValue) const
{
int32 value;
if (FindInt32(name, &value) != B_OK)
return defaultValue;
return (uint32)value;
}
int64
SettingsMessage::GetValue(const char* name, int64 defaultValue) const
{
int64 value;
if (FindInt64(name, &value) != B_OK)
return defaultValue;
return value;
}
float
SettingsMessage::GetValue(const char* name, float defaultValue) const
{
float value;
if (FindFloat(name, &value) != B_OK)
return defaultValue;
return value;
}
double
SettingsMessage::GetValue(const char* name, double defaultValue) const
{
double value;
if (FindDouble(name, &value) != B_OK)
return defaultValue;
return value;
}
BString
SettingsMessage::GetValue(const char* name, const BString& defaultValue) const
{
BString value;
if (FindString(name, &value) != B_OK)
return defaultValue;
return value;
}
BPoint
SettingsMessage::GetValue(const char *name, BPoint defaultValue) const
{
BPoint value;
if (FindPoint(name, &value) != B_OK)
return defaultValue;
return value;
}
BRect
SettingsMessage::GetValue(const char* name, BRect defaultValue) const
{
BRect value;
if (FindRect(name, &value) != B_OK)
return defaultValue;
return value;
}
BMessage
SettingsMessage::GetValue(const char* name, const BMessage& defaultValue) const
{
BMessage value;
if (FindMessage(name, &value) != B_OK)
return defaultValue;
return value;
}
@@ -0,0 +1,76 @@
/*
* Copyright 2008 Stephan Aßmus <superstippi@gmx.de>.
* Copyright 1998 Eric Shepherd.
* All rights reserved. Distributed under the terms of the Be Sample Code
* license.
*/
#ifndef SETTINGS_MESSAGE_H
#define SETTINGS_MESSAGE_H
#include <FindDirectory.h>
#include <Message.h>
#include <Path.h>
class BString;
class SettingsMessage : public BMessage {
public:
SettingsMessage(directory_which directory,
const char* filename);
virtual ~SettingsMessage();
status_t InitCheck() const;
status_t Load();
status_t Save() const;
status_t SetValue(const char* name, bool value);
status_t SetValue(const char* name, int8 value);
status_t SetValue(const char* name, int16 value);
status_t SetValue(const char* name, int32 value);
status_t SetValue(const char* name, uint32 value);
status_t SetValue(const char* name, int64 value);
status_t SetValue(const char* name, float value);
status_t SetValue(const char* name, double value);
status_t SetValue(const char* name,
const char* value);
status_t SetValue(const char* name,
const BString& value);
status_t SetValue(const char *name, BPoint value);
status_t SetValue(const char* name, BRect value);
status_t SetValue(const char* name,
const BMessage* value);
status_t SetValue(const char* name,
const BFlattenable* value);
bool GetValue(const char* name,
bool defaultValue) const;
int8 GetValue(const char* name,
int8 defaultValue) const;
int16 GetValue(const char* name,
int16 defaultValue) const;
int32 GetValue(const char* name,
int32 defaultValue) const;
uint32 GetValue(const char* name,
uint32 defaultValue) const;
int64 GetValue(const char* name,
int64 defaultValue) const;
float GetValue(const char* name,
float defaultValue) const;
double GetValue(const char* name,
double defaultValue) const;
BString GetValue(const char* name,
const BString& defaultValue) const;
BPoint GetValue(const char *name,
BPoint defaultValue) const;
BRect GetValue(const char* name,
BRect defaultValue) const;
BMessage GetValue(const char* name,
const BMessage& defaultValue) const;
private:
BPath fPath;
status_t fStatus;
};
#endif // SETTINGS_MESSAGE_H
@@ -1,138 +0,0 @@
//Volume II, Issue 35; September 2, 1998 (Eric Shepherd)
#include "TPreferences.h"
#include <FindDirectory.h>
#include <File.h>
TPreferences::TPreferences(directory_which directory, const char *filename)
:BMessage('pref')
{
BFile file;
fStatus = find_directory(directory, &fPath);
if (fStatus != B_OK)
return;
fPath.Append(filename);
fStatus = file.SetTo(fPath.Path(), B_READ_ONLY);
if (fStatus == B_OK)
fStatus = Unflatten(&file);
}
TPreferences::~TPreferences()
{
BFile file;
if (file.SetTo(fPath.Path(), B_WRITE_ONLY | B_CREATE_FILE) == B_OK)
Flatten(&file);
}
status_t
TPreferences::SetBool(const char *name, bool b)
{
if (HasBool(name))
return ReplaceBool(name, 0, b);
return AddBool(name, b);
}
status_t
TPreferences::SetInt8(const char *name, int8 i)
{
if (HasInt8(name))
return ReplaceInt8(name, 0, i);
return AddInt8(name, i);
}
status_t
TPreferences::SetInt16(const char *name, int16 i)
{
if (HasInt16(name))
return ReplaceInt16(name, 0, i);
return AddInt16(name, i);
}
status_t
TPreferences::SetInt32(const char *name, int32 i)
{
if (HasInt32(name))
return ReplaceInt32(name, 0, i);
return AddInt32(name, i);
}
status_t
TPreferences::SetInt64(const char *name, int64 i)
{
if (HasInt64(name))
return ReplaceInt64(name, 0, i);
return AddInt64(name, i);
}
status_t
TPreferences::SetFloat(const char *name, float f)
{
if (HasFloat(name))
return ReplaceFloat(name, 0, f);
return AddFloat(name, f);
}
status_t
TPreferences::SetDouble(const char *name, double f)
{
if (HasDouble(name))
return ReplaceDouble(name, 0, f);
return AddDouble(name, f);
}
status_t
TPreferences::SetString(const char *name, const char *s)
{
if (HasString(name))
return ReplaceString(name, 0, s);
return AddString(name, s);
}
status_t
TPreferences::SetPoint(const char *name, BPoint p)
{
if (HasPoint(name))
return ReplacePoint(name, 0, p);
return AddPoint(name, p);
}
status_t
TPreferences::SetRect(const char *name, BRect r)
{
if (HasRect(name))
return ReplaceRect(name, 0, r);
return AddRect(name, r);
}
status_t
TPreferences::SetMessage(const char *name, const BMessage *message)
{
if (HasMessage(name))
return ReplaceMessage(name, 0, message);
return AddMessage(name, message);
}
status_t
TPreferences::SetFlat(const char *name, const BFlattenable *obj)
{
if (HasFlat(name, obj))
return ReplaceFlat(name, 0, (BFlattenable *) obj);
return AddFlat(name, (BFlattenable *) obj);
}
@@ -1,68 +0,0 @@
#ifndef __TPREFS_H__
#define __TPREFS_H__
//Volume II, Issue 35; September 2, 1998 (Eric Shepherd)
/*
Usage
TPreferences prefs("PrefsSample_prefs"); // Preferences
if (prefs.InitCheck() != B_OK) {
prefs.SetInt64("last_used", real_time_clock());
prefs.SetInt32("use_count", 0);
}
Then we call PrintToStream() to print out the contents of the TPreferences object:
prefs.PrintToStream();
Finally, we update the preferences:
int32 count;
if (prefs.FindInt32("use_count", &count) != B_OK) {
count = 0;
}
prefs.SetInt64("last_used", real_time_clock());
prefs.SetInt32("use_count", ++count);
*/
#include <Message.h>
#include <Path.h>
#include <FindDirectory.h>
class TPreferences : public BMessage {
public:
TPreferences(directory_which directory, const char* filename);
virtual ~TPreferences();
status_t InitCheck(void);
status_t SetBool(const char *name, bool b);
status_t SetInt8(const char *name, int8 i);
status_t SetInt16(const char *name, int16 i);
status_t SetInt32(const char *name, int32 i);
status_t SetInt64(const char *name, int64 i);
status_t SetFloat(const char *name, float f);
status_t SetDouble(const char *name, double d);
status_t SetString(const char *name,
const char *string);
status_t SetPoint(const char *name, BPoint p);
status_t SetRect(const char *name, BRect r);
status_t SetMessage(const char *name,
const BMessage *message);
status_t SetFlat(const char *name,
const BFlattenable *obj);
private:
BPath fPath;
status_t fStatus;
};
inline
status_t TPreferences::InitCheck(void)
{
return fStatus;
}
#if __POWERPC__
#pragma export off
#endif
#endif // __TPREFS_H__