* Give some options for subtitle placement and size.
* Optimize subtitle drawing when subtitles are to be displayed at screen bottom versus video bottom, and the subtitle frame does not intersect the video. In that case we only need to draw it when it changes (or is to be removed). Fixed the dead-lock problem in a nicer way. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38841 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
12d6d539c9
commit
e65a6eb2e0
@ -932,6 +932,7 @@ MainWin::MessageReceived(BMessage* msg)
|
||||
float offset;
|
||||
if (msg->FindFloat("offset", &offset) == B_OK) {
|
||||
fControls->MoveBy(0, offset);
|
||||
fVideoView->SetSubTitleMaxBottom(fControls->Frame().top - 1);
|
||||
UpdateIfNeeded();
|
||||
snooze(15000);
|
||||
}
|
||||
@ -943,9 +944,12 @@ MainWin::MessageReceived(BMessage* msg)
|
||||
bool show;
|
||||
if (msg->FindFloat("offset", &offset) == B_OK
|
||||
&& msg->FindBool("show", &show) == B_OK) {
|
||||
if (show)
|
||||
if (show) {
|
||||
fControls->MoveTo(fControls->Frame().left, offset);
|
||||
else {
|
||||
fVideoView->SetSubTitleMaxBottom(offset - 1);
|
||||
} else {
|
||||
fVideoView->SetSubTitleMaxBottom(
|
||||
fVideoView->Bounds().bottom);
|
||||
fControls->RemoveSelf();
|
||||
fControls->MoveTo(fVideoView->Frame().left,
|
||||
fVideoView->Frame().bottom + 1);
|
||||
@ -1850,6 +1854,7 @@ MainWin::_ResizeVideoView(int x, int y, int width, int height)
|
||||
xOffset + renderWidth - 1, yOffset + renderHeight - 1);
|
||||
|
||||
fVideoView->SetVideoFrame(videoFrame);
|
||||
fVideoView->SetSubTitleMaxBottom(height - 1);
|
||||
}
|
||||
|
||||
|
||||
@ -1990,8 +1995,8 @@ MainWin::_ShowContextMenu(const BPoint& screenPoint)
|
||||
menu->AddItem(item = new BMenuItem(aspectSubMenu));
|
||||
item->SetEnabled(fHasVideo);
|
||||
|
||||
menu->AddItem(item = new BMenuItem("No interface",
|
||||
new BMessage(M_TOGGLE_NO_INTERFACE), 'B'));
|
||||
menu->AddItem(item = new BMenuItem("Hide interface",
|
||||
new BMessage(M_TOGGLE_NO_INTERFACE), 'H'));
|
||||
item->SetMarked(fNoInterface);
|
||||
item->SetEnabled(fHasVideo);
|
||||
|
||||
|
@ -18,6 +18,11 @@
|
||||
#include "SubtitleBitmap.h"
|
||||
|
||||
|
||||
enum {
|
||||
MSG_INVALIDATE = 'ivdt'
|
||||
};
|
||||
|
||||
|
||||
VideoView::VideoView(BRect frame, const char* name, uint32 resizeMask)
|
||||
:
|
||||
BView(frame, name, resizeMask, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE
|
||||
@ -27,9 +32,14 @@ VideoView::VideoView(BRect frame, const char* name, uint32 resizeMask)
|
||||
fIsPlaying(false),
|
||||
fIsFullscreen(false),
|
||||
fLastMouseMove(system_time()),
|
||||
fGlobalSettingsListener(this),
|
||||
|
||||
fSubtitleBitmap(new SubtitleBitmap),
|
||||
fHasSubtitle(false)
|
||||
fSubtitleFrame(),
|
||||
fSubtitleMaxButtom(Bounds().bottom),
|
||||
fHasSubtitle(false),
|
||||
fSubtitleChanged(false),
|
||||
|
||||
fGlobalSettingsListener(this)
|
||||
{
|
||||
SetViewColor(B_TRANSPARENT_COLOR);
|
||||
SetHighColor(0, 0, 0);
|
||||
@ -44,7 +54,7 @@ VideoView::VideoView(BRect frame, const char* name, uint32 resizeMask)
|
||||
Settings::Default()->AddListener(&fGlobalSettingsListener);
|
||||
_AdoptGlobalSettings();
|
||||
|
||||
//SetSubtitle("<b><i>This</i></b> is a <font color=\"#00ff00\">test</font>!"
|
||||
//SetSubTitle("<b><i>This</i></b> is a <font color=\"#00ff00\">test</font>!"
|
||||
// "\nWith a <i>short</i> line and a <b>long</b> line.");
|
||||
}
|
||||
|
||||
@ -74,6 +84,9 @@ VideoView::Draw(BRect updateRect)
|
||||
|
||||
if (outSideVideoRegion.CountRects() > 0)
|
||||
FillRegion(&outSideVideoRegion);
|
||||
|
||||
if (fHasSubtitle)
|
||||
_DrawSubtitle();
|
||||
}
|
||||
|
||||
|
||||
@ -87,6 +100,13 @@ VideoView::MessageReceived(BMessage* message)
|
||||
// the global settings instance...
|
||||
_AdoptGlobalSettings();
|
||||
break;
|
||||
case MSG_INVALIDATE:
|
||||
{
|
||||
BRect dirty;
|
||||
if (message->FindRect("dirty", &dirty) == B_OK)
|
||||
Invalidate(dirty);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BView::MessageReceived(message);
|
||||
}
|
||||
@ -185,9 +205,13 @@ VideoView::SetBitmap(const BBitmap* bitmap)
|
||||
SetViewColor(B_TRANSPARENT_COLOR);
|
||||
}
|
||||
if (!fOverlayMode) {
|
||||
if (fHasSubtitle)
|
||||
if (fSubtitleChanged) {
|
||||
_LayoutSubtitle();
|
||||
Invalidate(fVideoFrame | fSubtitleFrame);
|
||||
} else if (fHasSubtitle
|
||||
&& fVideoFrame.Intersects(fSubtitleFrame)) {
|
||||
Invalidate(fVideoFrame);
|
||||
else
|
||||
} else
|
||||
_DrawBitmap(bitmap);
|
||||
}
|
||||
|
||||
@ -286,27 +310,55 @@ VideoView::SetVideoFrame(const BRect& frame)
|
||||
fVideoFrame = frame;
|
||||
|
||||
fSubtitleBitmap->SetVideoBounds(fVideoFrame.OffsetToCopy(B_ORIGIN));
|
||||
_LayoutSubtitle();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
VideoView::SetSubTitle(const char* text)
|
||||
{
|
||||
BRect oldSubtitleFrame = fSubtitleFrame;
|
||||
|
||||
if (text == NULL || text[0] == '\0') {
|
||||
fHasSubtitle = false;
|
||||
fSubtitleChanged = true;
|
||||
} else {
|
||||
fHasSubtitle = true;
|
||||
fSubtitleBitmap->SetText(text);
|
||||
// If the subtitle frame still needs to be invalidated during
|
||||
// normal playback, make sure we don't unset the fSubtitleChanged
|
||||
// flag. It will be reset after drawing the subtitle once.
|
||||
fSubtitleChanged = fSubtitleBitmap->SetText(text) || fSubtitleChanged;
|
||||
if (fSubtitleChanged)
|
||||
_LayoutSubtitle();
|
||||
}
|
||||
// TODO: Make smarter and invalidate only previous subtitle bitmap
|
||||
// region. Fix locking, too...
|
||||
if (!fIsPlaying && LockLooperWithTimeout(1000) == B_OK) {
|
||||
Invalidate();
|
||||
UnlockLooper();
|
||||
|
||||
if (!fIsPlaying && Window() != NULL) {
|
||||
// If we are playing, the new subtitle will be displayed,
|
||||
// or the old one removed from screen, as soon as the next
|
||||
// frame is shown. Otherwise we need to invalidate manually.
|
||||
// But we are not in the window thread and we shall not lock
|
||||
// it or we may dead-locks.
|
||||
BMessage message(MSG_INVALIDATE);
|
||||
message.AddRect("dirty", oldSubtitleFrame | fSubtitleFrame);
|
||||
Window()->PostMessage(&message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
VideoView::SetSubTitleMaxBottom(float bottom)
|
||||
{
|
||||
if (bottom == fSubtitleMaxButtom)
|
||||
return;
|
||||
|
||||
fSubtitleMaxButtom = bottom;
|
||||
|
||||
BRect oldSubtitleFrame = fSubtitleFrame;
|
||||
_LayoutSubtitle();
|
||||
Invalidate(fSubtitleFrame | oldSubtitleFrame);
|
||||
}
|
||||
|
||||
|
||||
// #pragma mark -
|
||||
|
||||
|
||||
@ -316,18 +368,20 @@ VideoView::_DrawBitmap(const BBitmap* bitmap)
|
||||
SetDrawingMode(B_OP_COPY);
|
||||
uint32 options = fUseBilinearScaling ? B_FILTER_BITMAP_BILINEAR : 0;
|
||||
DrawBitmapAsync(bitmap, bitmap->Bounds(), fVideoFrame, options);
|
||||
}
|
||||
|
||||
if (fHasSubtitle) {
|
||||
SetDrawingMode(B_OP_ALPHA);
|
||||
SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
|
||||
|
||||
const BBitmap* subtitleBitmap = fSubtitleBitmap->Bitmap();
|
||||
BPoint offset;
|
||||
offset.x = (fVideoFrame.left + fVideoFrame.right
|
||||
- subtitleBitmap->Bounds().Width()) / 2;
|
||||
offset.y = fVideoFrame.bottom - subtitleBitmap->Bounds().Height();
|
||||
DrawBitmapAsync(subtitleBitmap, offset);
|
||||
}
|
||||
|
||||
void
|
||||
VideoView::_DrawSubtitle()
|
||||
{
|
||||
SetDrawingMode(B_OP_ALPHA);
|
||||
SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
|
||||
|
||||
DrawBitmapAsync(fSubtitleBitmap->Bitmap(), fSubtitleFrame.LeftTop());
|
||||
|
||||
// Unless the subtitle frame intersects the video frame, we don't have
|
||||
// to draw the subtitle again.
|
||||
fSubtitleChanged = false;
|
||||
}
|
||||
|
||||
|
||||
@ -340,8 +394,22 @@ VideoView::_AdoptGlobalSettings()
|
||||
fUseOverlays = settings.useOverlays;
|
||||
fUseBilinearScaling = settings.scaleBilinear;
|
||||
|
||||
if (!fIsPlaying && !fOverlayMode)
|
||||
Invalidate();
|
||||
switch (settings.subtitleSize) {
|
||||
case mpSettings::SUBTITLE_SIZE_SMALL:
|
||||
fSubtitleBitmap->SetCharsPerLine(45.0);
|
||||
break;
|
||||
case mpSettings::SUBTITLE_SIZE_MEDIUM:
|
||||
fSubtitleBitmap->SetCharsPerLine(36.0);
|
||||
break;
|
||||
case mpSettings::SUBTITLE_SIZE_LARGE:
|
||||
fSubtitleBitmap->SetCharsPerLine(32.0);
|
||||
break;
|
||||
}
|
||||
|
||||
fSubtitlePlacement = settings.subtitlePlacement;
|
||||
|
||||
_LayoutSubtitle();
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
|
||||
@ -353,3 +421,39 @@ VideoView::_SetOverlayMode(bool overlayMode)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
VideoView::_LayoutSubtitle()
|
||||
{
|
||||
if (!fHasSubtitle)
|
||||
return;
|
||||
|
||||
const BBitmap* subtitleBitmap = fSubtitleBitmap->Bitmap();
|
||||
if (subtitleBitmap == NULL)
|
||||
return;
|
||||
|
||||
fSubtitleFrame = subtitleBitmap->Bounds();
|
||||
|
||||
BPoint offset;
|
||||
offset.x = (fVideoFrame.left + fVideoFrame.right
|
||||
- fSubtitleFrame.Width()) / 2;
|
||||
switch (fSubtitlePlacement) {
|
||||
default:
|
||||
case mpSettings::SUBTITLE_PLACEMENT_BOTTOM_OF_VIDEO:
|
||||
offset.y = fVideoFrame.bottom - fSubtitleFrame.Height();
|
||||
break;
|
||||
case mpSettings::SUBTITLE_PLACEMENT_BOTTOM_OF_SCREEN:
|
||||
{
|
||||
// Center between video and screen bottom, if there is still
|
||||
// enough room.
|
||||
float centeredOffset = (fVideoFrame.bottom + fSubtitleMaxButtom
|
||||
- fSubtitleFrame.Height()) / 2;
|
||||
float maxOffset = fSubtitleMaxButtom - fSubtitleFrame.Height();
|
||||
offset.y = min_c(centeredOffset, maxOffset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
fSubtitleFrame.OffsetTo(offset);
|
||||
}
|
||||
|
||||
|
||||
|
@ -52,11 +52,14 @@ public:
|
||||
void SetVideoFrame(const BRect& frame);
|
||||
|
||||
void SetSubTitle(const char* text);
|
||||
void SetSubTitleMaxBottom(float bottom);
|
||||
|
||||
private:
|
||||
void _DrawBitmap(const BBitmap* bitmap);
|
||||
void _DrawSubtitle();
|
||||
void _AdoptGlobalSettings();
|
||||
void _SetOverlayMode(bool overlayMode);
|
||||
void _LayoutSubtitle();
|
||||
|
||||
private:
|
||||
BRect fVideoFrame;
|
||||
@ -67,12 +70,17 @@ private:
|
||||
bool fIsFullscreen;
|
||||
bigtime_t fLastMouseMove;
|
||||
|
||||
SubtitleBitmap* fSubtitleBitmap;
|
||||
BRect fSubtitleFrame;
|
||||
float fSubtitleMaxButtom;
|
||||
bool fHasSubtitle;
|
||||
bool fSubtitleChanged;
|
||||
|
||||
// Settings values:
|
||||
ListenerAdapter fGlobalSettingsListener;
|
||||
bool fUseOverlays;
|
||||
bool fUseBilinearScaling;
|
||||
|
||||
SubtitleBitmap* fSubtitleBitmap;
|
||||
bool fHasSubtitle;
|
||||
uint32 fSubtitlePlacement;
|
||||
};
|
||||
|
||||
#endif // VIDEO_VIEW_H
|
||||
|
@ -19,6 +19,7 @@ SubtitleBitmap::SubtitleBitmap()
|
||||
fBitmap(NULL),
|
||||
fTextView(new BTextView("offscreen text")),
|
||||
fShadowTextView(new BTextView("offscreen text shadow")),
|
||||
fCharsPerLine(36),
|
||||
fUseSoftShadow(true),
|
||||
fOverlayMode(false)
|
||||
{
|
||||
@ -42,15 +43,16 @@ SubtitleBitmap::~SubtitleBitmap()
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
bool
|
||||
SubtitleBitmap::SetText(const char* text)
|
||||
{
|
||||
if (text == fText)
|
||||
return;
|
||||
return false;
|
||||
|
||||
fText = text;
|
||||
|
||||
_GenerateBitmap();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -79,6 +81,19 @@ SubtitleBitmap::SetOverlayMode(bool overlayMode)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SubtitleBitmap::SetCharsPerLine(float charsPerLine)
|
||||
{
|
||||
if (charsPerLine == fCharsPerLine)
|
||||
return;
|
||||
|
||||
fCharsPerLine = charsPerLine;
|
||||
|
||||
fUseSoftShadow = true;
|
||||
_GenerateBitmap();
|
||||
}
|
||||
|
||||
|
||||
const BBitmap*
|
||||
SubtitleBitmap::Bitmap() const
|
||||
{
|
||||
@ -313,7 +328,7 @@ SubtitleBitmap::_InsertText(BRect& textRect, float& outlineRadius,
|
||||
bool overlayMode)
|
||||
{
|
||||
BFont font(be_plain_font);
|
||||
float fontSize = ceilf((fVideoBounds.Width() * 0.9) / 36);
|
||||
float fontSize = ceilf((fVideoBounds.Width() * 0.9) / fCharsPerLine);
|
||||
outlineRadius = ceilf(fontSize / 28.0);
|
||||
font.SetSize(fontSize);
|
||||
|
||||
|
@ -19,9 +19,10 @@ public:
|
||||
SubtitleBitmap();
|
||||
virtual ~SubtitleBitmap();
|
||||
|
||||
void SetText(const char* text);
|
||||
bool SetText(const char* text);
|
||||
void SetVideoBounds(BRect bounds);
|
||||
void SetOverlayMode(bool overlayMode);
|
||||
void SetCharsPerLine(float charsPerLine);
|
||||
|
||||
const BBitmap* Bitmap() const;
|
||||
|
||||
@ -37,6 +38,7 @@ private:
|
||||
BString fText;
|
||||
|
||||
BRect fVideoBounds;
|
||||
float fCharsPerLine;
|
||||
bool fUseSoftShadow;
|
||||
bool fOverlayMode;
|
||||
};
|
||||
|
@ -22,6 +22,8 @@ mpSettings::operator!=(const mpSettings& other) const
|
||||
|| useOverlays != other.useOverlays
|
||||
|| scaleBilinear != other.scaleBilinear
|
||||
|| scaleFullscreenControls != other.scaleFullscreenControls
|
||||
|| subtitleSize != other.subtitleSize
|
||||
|| subtitlePlacement != other.subtitlePlacement
|
||||
|| backgroundMovieVolumeMode != other.backgroundMovieVolumeMode
|
||||
|| filePanelFolder != other.filePanelFolder
|
||||
|| audioPlayerWindowFrame != other.audioPlayerWindowFrame;
|
||||
@ -29,8 +31,9 @@ mpSettings::operator!=(const mpSettings& other) const
|
||||
|
||||
|
||||
Settings::Settings(const char* filename)
|
||||
: BLocker("settings lock"),
|
||||
fSettingsMessage(B_USER_SETTINGS_DIRECTORY, filename)
|
||||
:
|
||||
BLocker("settings lock"),
|
||||
fSettingsMessage(B_USER_SETTINGS_DIRECTORY, filename)
|
||||
{
|
||||
// The settings are loaded from disk in the SettingsMessage constructor.
|
||||
}
|
||||
@ -54,6 +57,13 @@ Settings::LoadSettings(mpSettings& settings) const
|
||||
settings.scaleFullscreenControls
|
||||
= fSettingsMessage.GetValue("scaleFullscreenControls", true);
|
||||
|
||||
settings.subtitleSize
|
||||
= fSettingsMessage.GetValue("subtitleSize",
|
||||
(uint32)mpSettings::SUBTITLE_SIZE_MEDIUM);
|
||||
settings.subtitlePlacement
|
||||
= fSettingsMessage.GetValue("subtitlePlacement",
|
||||
(uint32)mpSettings::SUBTITLE_PLACEMENT_BOTTOM_OF_VIDEO);
|
||||
|
||||
settings.backgroundMovieVolumeMode
|
||||
= fSettingsMessage.GetValue("bgMovieVolumeMode",
|
||||
(uint32)mpSettings::BG_MOVIES_FULL_VOLUME);
|
||||
@ -86,6 +96,9 @@ Settings::SaveSettings(const mpSettings& settings)
|
||||
fSettingsMessage.SetValue("scaleFullscreenControls",
|
||||
settings.scaleFullscreenControls);
|
||||
|
||||
fSettingsMessage.SetValue("subtitleSize", settings.subtitleSize);
|
||||
fSettingsMessage.SetValue("subtitlePlacement", settings.subtitlePlacement);
|
||||
|
||||
fSettingsMessage.SetValue("bgMovieVolumeMode",
|
||||
settings.backgroundMovieVolumeMode);
|
||||
|
||||
|
@ -16,6 +16,21 @@
|
||||
#include "SettingsMessage.h"
|
||||
|
||||
struct mpSettings {
|
||||
enum {
|
||||
SUBTITLE_SIZE_SMALL = 0,
|
||||
SUBTITLE_SIZE_MEDIUM = 1,
|
||||
SUBTITLE_SIZE_LARGE = 2
|
||||
};
|
||||
enum {
|
||||
SUBTITLE_PLACEMENT_BOTTOM_OF_VIDEO = 0,
|
||||
SUBTITLE_PLACEMENT_BOTTOM_OF_SCREEN = 1
|
||||
};
|
||||
enum {
|
||||
BG_MOVIES_FULL_VOLUME = 0,
|
||||
BG_MOVIES_HALF_VLUME = 1,
|
||||
BG_MOVIES_MUTED = 2
|
||||
};
|
||||
|
||||
bool autostart;
|
||||
bool closeWhenDonePlayingMovie;
|
||||
bool closeWhenDonePlayingSound;
|
||||
@ -24,11 +39,8 @@ struct mpSettings {
|
||||
bool useOverlays;
|
||||
bool scaleBilinear;
|
||||
bool scaleFullscreenControls;
|
||||
enum {
|
||||
BG_MOVIES_FULL_VOLUME = 0,
|
||||
BG_MOVIES_HALF_VLUME = 1,
|
||||
BG_MOVIES_MUTED = 2
|
||||
};
|
||||
uint32 subtitleSize;
|
||||
uint32 subtitlePlacement;
|
||||
uint32 backgroundMovieVolumeMode;
|
||||
entry_ref filePanelFolder;
|
||||
|
||||
|
@ -6,7 +6,8 @@
|
||||
* Fredrik Modéen <fredrik@modeen.se>
|
||||
* Stephan Aßmus <superstippi@gmx.de>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "SettingsWindow.h"
|
||||
|
||||
#include <stdio.h>
|
||||
@ -16,36 +17,31 @@
|
||||
#include <CheckBox.h>
|
||||
#include <GridLayoutBuilder.h>
|
||||
#include <GroupLayoutBuilder.h>
|
||||
#include <OptionPopUp.h>
|
||||
#include <SpaceLayoutItem.h>
|
||||
#include <String.h>
|
||||
#include <StringView.h>
|
||||
#include <RadioButton.h>
|
||||
#include <View.h>
|
||||
|
||||
|
||||
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_SCALE_CONTROLS,
|
||||
M_START_FULL_VOLUME,
|
||||
M_START_HALF_VOLUME,
|
||||
M_START_MUTE_VOLUME,
|
||||
M_SETTINGS_CHANGED = 0x3000,
|
||||
|
||||
M_SETTINGS_SAVE,
|
||||
M_SETTINGS_CANCEL,
|
||||
M_SETTINGS_REVERT
|
||||
};
|
||||
|
||||
|
||||
#define SPACE 10
|
||||
#define SPACEING 7
|
||||
#define BUTTONHEIGHT 20
|
||||
|
||||
|
||||
SettingsWindow::SettingsWindow(BRect frame)
|
||||
: BWindow(frame, "MediaPlayer settings", B_FLOATING_WINDOW_LOOK,
|
||||
:
|
||||
BWindow(frame, "MediaPlayer settings", B_FLOATING_WINDOW_LOOK,
|
||||
B_FLOATING_APP_WINDOW_FEEL,
|
||||
B_ASYNCHRONOUS_CONTROLS | B_NOT_ZOOMABLE | B_NOT_RESIZABLE
|
||||
| B_AUTO_UPDATE_SIZE_LIMITS)
|
||||
@ -72,39 +68,52 @@ SettingsWindow::SettingsWindow(BRect frame)
|
||||
bgMoviesModeLabel->SetFont(be_bold_font);
|
||||
|
||||
fAutostartCB = new BCheckBox("chkboxAutostart",
|
||||
"Automatically start playing", new BMessage(M_AUTOSTART));
|
||||
"Automatically start playing", new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fCloseWindowMoviesCB = new BCheckBox("chkBoxCloseWindowMovies",
|
||||
"Close window when done playing movies",
|
||||
new BMessage(M_CLOSE_WINDOW_MOVIE));
|
||||
new BMessage(M_SETTINGS_CHANGED));
|
||||
fCloseWindowSoundsCB = new BCheckBox("chkBoxCloseWindowSounds",
|
||||
"Close window when done playing sounds",
|
||||
new BMessage(M_CLOSE_WINDOW_SOUNDS));
|
||||
new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fLoopMoviesCB = new BCheckBox("chkBoxLoopMovie",
|
||||
"Loop movies by default", new BMessage(M_LOOP_MOVIE));
|
||||
"Loop movies by default", new BMessage(M_SETTINGS_CHANGED));
|
||||
fLoopSoundsCB = new BCheckBox("chkBoxLoopSounds",
|
||||
"Loop sounds by default", new BMessage(M_LOOP_SOUND));
|
||||
"Loop sounds by default", new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fUseOverlaysCB = new BCheckBox("chkBoxUseOverlays",
|
||||
"Use hardware video overlays if available",
|
||||
new BMessage(M_USE_OVERLAYS));
|
||||
new BMessage(M_SETTINGS_CHANGED));
|
||||
fScaleBilinearCB = new BCheckBox("chkBoxScaleBilinear",
|
||||
"Scale movies smoothly (non-overlay mode)",
|
||||
new BMessage(M_SCALE_BILINEAR));
|
||||
new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fScaleFullscreenControlsCB = new BCheckBox("chkBoxScaleControls",
|
||||
"Scale controls in full-screen mode",
|
||||
new BMessage(M_SCALE_CONTROLS));
|
||||
new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fSubtitleSizeOP = new BOptionPopUp("subtitleSize",
|
||||
"Subtitle size", new BMessage(M_SETTINGS_CHANGED));
|
||||
fSubtitleSizeOP->AddOption("Small", mpSettings::SUBTITLE_SIZE_SMALL);
|
||||
fSubtitleSizeOP->AddOption("Medium", mpSettings::SUBTITLE_SIZE_MEDIUM);
|
||||
fSubtitleSizeOP->AddOption("Large", mpSettings::SUBTITLE_SIZE_LARGE);
|
||||
|
||||
fSubtitlePlacementOP = new BOptionPopUp("subtitlePlacement",
|
||||
"Subtitle placement", new BMessage(M_SETTINGS_CHANGED));
|
||||
fSubtitlePlacementOP->AddOption("Bottom of video",
|
||||
mpSettings::SUBTITLE_PLACEMENT_BOTTOM_OF_VIDEO);
|
||||
fSubtitlePlacementOP->AddOption("Bottom of screen",
|
||||
mpSettings::SUBTITLE_PLACEMENT_BOTTOM_OF_SCREEN);
|
||||
|
||||
fFullVolumeBGMoviesRB = new BRadioButton("rdbtnfullvolume",
|
||||
"Full volume", new BMessage(M_START_FULL_VOLUME));
|
||||
"Full volume", new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fHalfVolumeBGMoviesRB = new BRadioButton("rdbtnhalfvolume",
|
||||
"Low volume", new BMessage(M_START_HALF_VOLUME));
|
||||
"Low volume", new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fMutedVolumeBGMoviesRB = new BRadioButton("rdbtnfullvolume",
|
||||
"Muted", new BMessage(M_START_MUTE_VOLUME));
|
||||
"Muted", new BMessage(M_SETTINGS_CHANGED));
|
||||
|
||||
fRevertB = new BButton("revert", "Revert",
|
||||
new BMessage(M_SETTINGS_REVERT));
|
||||
@ -146,6 +155,8 @@ SettingsWindow::SettingsWindow(BRect frame)
|
||||
.Add(fUseOverlaysCB)
|
||||
.Add(fScaleBilinearCB)
|
||||
.Add(fScaleFullscreenControlsCB)
|
||||
.Add(fSubtitleSizeOP)
|
||||
.Add(fSubtitlePlacementOP)
|
||||
)
|
||||
)
|
||||
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
|
||||
@ -205,17 +216,7 @@ void
|
||||
SettingsWindow::MessageReceived(BMessage* message)
|
||||
{
|
||||
switch (message->what) {
|
||||
case M_AUTOSTART:
|
||||
case M_CLOSE_WINDOW_MOVIE:
|
||||
case M_CLOSE_WINDOW_SOUNDS:
|
||||
case M_LOOP_MOVIE:
|
||||
case M_LOOP_SOUND:
|
||||
case M_USE_OVERLAYS:
|
||||
case M_SCALE_BILINEAR:
|
||||
case M_SCALE_CONTROLS:
|
||||
case M_START_FULL_VOLUME:
|
||||
case M_START_HALF_VOLUME:
|
||||
case M_START_MUTE_VOLUME:
|
||||
case M_SETTINGS_CHANGED:
|
||||
ApplySettings();
|
||||
break;
|
||||
|
||||
@ -256,6 +257,9 @@ SettingsWindow::AdoptSettings()
|
||||
fScaleBilinearCB->SetValue(fSettings.scaleBilinear);
|
||||
fScaleFullscreenControlsCB->SetValue(fSettings.scaleFullscreenControls);
|
||||
|
||||
fSubtitleSizeOP->SetValue(fSettings.subtitleSize);
|
||||
fSubtitlePlacementOP->SetValue(fSettings.subtitlePlacement);
|
||||
|
||||
fFullVolumeBGMoviesRB->SetValue(fSettings.backgroundMovieVolumeMode
|
||||
== mpSettings::BG_MOVIES_FULL_VOLUME);
|
||||
fHalfVolumeBGMoviesRB->SetValue(fSettings.backgroundMovieVolumeMode
|
||||
@ -283,6 +287,9 @@ SettingsWindow::ApplySettings()
|
||||
fSettings.scaleFullscreenControls
|
||||
= fScaleFullscreenControlsCB->Value() == B_CONTROL_ON;
|
||||
|
||||
fSettings.subtitleSize = fSubtitleSizeOP->Value();
|
||||
fSettings.subtitlePlacement = fSubtitlePlacementOP->Value();
|
||||
|
||||
if (fFullVolumeBGMoviesRB->Value() == B_CONTROL_ON) {
|
||||
fSettings.backgroundMovieVolumeMode
|
||||
= mpSettings::BG_MOVIES_FULL_VOLUME;
|
||||
|
@ -5,16 +5,20 @@
|
||||
* Authors:
|
||||
* Fredrik Modéen <fredrik@modeen.se>
|
||||
*/
|
||||
|
||||
#ifndef _SETTINGS_WINDOW_H
|
||||
#define _SETTINGS_WINDOW_H
|
||||
#ifndef SETTINGS_WINDOW_H
|
||||
#define SETTINGS_WINDOW_H
|
||||
|
||||
|
||||
#include <Window.h>
|
||||
#include <CheckBox.h>
|
||||
#include <RadioButton.h>
|
||||
|
||||
#include "Settings.h"
|
||||
|
||||
|
||||
class BCheckBox;
|
||||
class BOptionPopUp;
|
||||
class BRadioButton;
|
||||
|
||||
|
||||
class SettingsWindow : public BWindow {
|
||||
public:
|
||||
SettingsWindow(BRect frame);
|
||||
@ -43,6 +47,9 @@ private:
|
||||
BCheckBox* fScaleBilinearCB;
|
||||
BCheckBox* fScaleFullscreenControlsCB;
|
||||
|
||||
BOptionPopUp* fSubtitleSizeOP;
|
||||
BOptionPopUp* fSubtitlePlacementOP;
|
||||
|
||||
BRadioButton* fFullVolumeBGMoviesRB;
|
||||
BRadioButton* fHalfVolumeBGMoviesRB;
|
||||
BRadioButton* fMutedVolumeBGMoviesRB;
|
||||
@ -50,4 +57,5 @@ private:
|
||||
BButton* fRevertB;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#endif // SETTINGS_WINDOW_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user