Commit 6d1ad866 authored by Felix Paul Kühne's avatar Felix Paul Kühne
Browse files

osx dialog provider: implemented the progress bar dialog

parent e6f3057f
......@@ -5,8 +5,10 @@ LIBTOOL=@LIBTOOL@ --tag=CC
SOURCES_macosx_dialog_provider = \
VLCLoginPanel.m \
VLCProgressPanel.m \
dialogProvider.m \
$(NULL)
noinst_HEADERS = \
VLCLoginPanel.h
VLCLoginPanel.h \
VLCProgressPanel.h
/*****************************************************************************
* VLCProgressPanel.h: A Generic Progress Indicator Panel created for VLC
*****************************************************************************
* Copyright (C) 2009-2010 the VideoLAN team
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
@interface VLCProgressPanel : NSPanel {
BOOL _isCancelled;
IBOutlet NSProgressIndicator * _progressBar;
IBOutlet NSTextField *_titleField;
IBOutlet NSTextField *_messageField;
IBOutlet NSButton *_cancelButton;
IBOutlet NSImageView *_iconView;
}
- (void)createContentView;
- setDialogTitle:(NSString *)title;
- setDialogMessage:(NSString *)message;
- setCancelButtonLabel:(NSString *)cancelLabel;
- setProgressAsDouble:(double)value;
- (BOOL)isCancelled;
- (IBAction)cancelDialog:(id)sender;
@end
/*****************************************************************************
* VLCProgressPanel.m: A Generic Progress Indicator Panel created for VLC
*****************************************************************************
* Copyright (C) 2009-2010 the VideoLAN team
* $Id$
*
* Authors: Felix Paul Kühne <fkuehne at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCProgressPanel.h"
@implementation VLCProgressPanel
- (id)init
{
NSRect windowRect;
windowRect.size.height = 182;
windowRect.size.width = 520;
windowRect.origin.x = windowRect.origin.y = 0;
return [super initWithContentRect:windowRect
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:YES];
}
- (void)createContentView
{
NSRect s_rc = [self frame];
id ourContentView = [self contentView];
s_rc.origin.x = 398;
s_rc.origin.y = 28;
s_rc.size.height = 32;
s_rc.size.width = 108;
_cancelButton = [[NSButton alloc] initWithFrame:s_rc];
[_cancelButton setButtonType:NSMomentaryLightButton];
[_cancelButton setTitle:@"Cancel"];
[_cancelButton setBezelStyle:NSRoundedBezelStyle];
[_cancelButton setBordered:YES];
[_cancelButton setTarget:self];
[_cancelButton setAction:@selector(cancelDialog:)];
[ourContentView addSubview:_cancelButton];
s_rc.origin.x = 89;
s_rc.origin.y = 153;
s_rc.size.height = 17;
s_rc.size.width = 414;
_titleField = [[NSTextField alloc] initWithFrame:s_rc];
[_titleField setFont:[NSFont boldSystemFontOfSize:0]];
[_titleField setBezeled:NO];
[_titleField setEditable:NO];
[_titleField setSelectable:YES];
[_titleField setDrawsBackground:NO];
[ourContentView addSubview:_titleField];
s_rc.origin.x = 89;
s_rc.origin.y = 116;
s_rc.size.height = 42;
s_rc.size.width = 414;
_messageField = [[NSTextField alloc] initWithFrame:s_rc];
[_messageField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
[_messageField setBezeled:NO];
[_messageField setEditable:NO];
[_messageField setSelectable:YES];
[_messageField setDrawsBackground:NO];
[ourContentView addSubview:_messageField];
s_rc.origin.x = 90;
s_rc.origin.y = 66;
s_rc.size.height = 20;
s_rc.size.width = 412;
_progressBar = [[NSProgressIndicator alloc] initWithFrame:s_rc];
[_progressBar setMaxValue:1000.0];
[_progressBar setUsesThreadedAnimation:YES];
[_progressBar setStyle:NSProgressIndicatorBarStyle];
[_progressBar setDisplayedWhenStopped:YES];
[_progressBar setControlSize:NSRegularControlSize];
[_progressBar setIndeterminate:NO];
[ourContentView addSubview:_progressBar];
[_progressBar startAnimation:nil];
s_rc.origin.x = 20;
s_rc.origin.y = 110;
s_rc.size.height = s_rc.size.width = 64;
_iconView = [[NSImageView alloc] initWithFrame:s_rc];
[_iconView setImage:[NSImage imageNamed:@"NSApplicationIcon"]];
[_iconView setEditable:NO];
[_iconView setAllowsCutCopyPaste:NO];
[ourContentView addSubview:_iconView];
}
- setDialogTitle:(NSString *)title
{
[_titleField setStringValue:title];
[self setTitle:title];
}
- setDialogMessage:(NSString *)message
{
[_messageField setStringValue:message];
}
- setCancelButtonLabel:(NSString *)cancelLabel
{
[_cancelButton setTitle:cancelLabel];
}
- setProgressAsDouble:(double)value
{
[_progressBar setDoubleValue:value];
}
- (BOOL)isCancelled
{
return _isCancelled;
}
- (IBAction)cancelDialog:(id)sender
{
_isCancelled = YES;
}
@end
......@@ -38,6 +38,7 @@
#import <Cocoa/Cocoa.h>
#import "VLCLoginPanel.h"
#import "VLCProgressPanel.h"
/*****************************************************************************
* Prototypes
......@@ -50,9 +51,16 @@ static int DisplayError(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void
static int DisplayCritical(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * );
static int DisplayQuestion(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * );
static int DisplayLogin(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * );
static int DisplayProgressPanelAction(vlc_object_t *,const char *,vlc_value_t,vlc_value_t,void * );
static void updateProgressPanel (void *, const char *, float);
static bool checkProgressPanel (void *);
static void destroyProgressPanel (void *);
struct intf_sys_t
{
VLCProgressPanel *currentProgressBarPanel;
vlc_mutex_t lock;
vlc_cond_t wait;
};
......@@ -106,8 +114,8 @@ static void Run( intf_thread_t *p_intf )
var_AddCallback(p_intf,"dialog-login",DisplayLogin,p_intf);
var_Create(p_intf,"dialog-question",VLC_VAR_ADDRESS);
var_AddCallback(p_intf,"dialog-question",DisplayQuestion,p_intf);
// var_Create(p_intf,"dialog-progress-bar",VLC_VAR_ADDRESS);
// var_AddCallback(p_intf,"dialog-progress-bar",DisplayProgressPanelAction,p_intf);
var_Create(p_intf,"dialog-progress-bar",VLC_VAR_ADDRESS);
var_AddCallback(p_intf,"dialog-progress-bar",DisplayProgressPanelAction,p_intf);
dialog_Register(p_intf);
msg_Dbg(p_intf,"Mac OS X dialog provider initialised");
......@@ -124,7 +132,7 @@ static void Run( intf_thread_t *p_intf )
var_DelCallback(p_intf,"dialog-critical",DisplayCritical,p_intf);
var_DelCallback(p_intf,"dialog-login",DisplayLogin,p_intf);
var_DelCallback(p_intf,"dialog-question",DisplayQuestion,p_intf);
// var_DelCallback(p_intf,"dialog-progress-bar",DisplayProgressPanelAction,p_intf);
var_DelCallback(p_intf,"dialog-progress-bar",DisplayProgressPanelAction,p_intf);
}
/*****************************************************************************
* CloseIntf: destroy interface
......@@ -149,6 +157,7 @@ static int DisplayError(vlc_object_t *p_this, const char *type, vlc_value_t prev
[NSString stringWithUTF8String:p_dialog->message],
@"OK", nil, nil);
[o_pool release];
return VLC_SUCCESS;
}
static int DisplayCritical(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data)
......@@ -159,6 +168,7 @@ static int DisplayCritical(vlc_object_t *p_this, const char *type, vlc_value_t p
[NSString stringWithUTF8String:p_dialog->message],
@"OK", nil, nil);
[o_pool release];
return VLC_SUCCESS;
}
static int DisplayQuestion(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data)
......@@ -191,6 +201,7 @@ static int DisplayQuestion(vlc_object_t *p_this, const char *type, vlc_value_t p
if (i_returnValue == NSAlertOtherReturn)
p_dialog->answer = 3;
[o_pool release];
return VLC_SUCCESS;
}
static int DisplayLogin(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data)
......@@ -203,16 +214,81 @@ static int DisplayLogin(vlc_object_t *p_this, const char *type, vlc_value_t prev
[thePanel setDialogTitle:[NSString stringWithUTF8String:p_dialog->title]];
[thePanel setDialogMessage:[NSString stringWithUTF8String:p_dialog->message]];
[thePanel center];
i_returnValue = [NSApp runModalForWindow: thePanel];
i_returnValue = [NSApp runModalForWindow:thePanel];
[thePanel close];
if( i_returnValue )
{
if (i_returnValue) {
*p_dialog->username = strdup( [[thePanel userName] UTF8String] );
*p_dialog->password = strdup( [[thePanel password] UTF8String] );
}
else
{
} else
*p_dialog->username = *p_dialog->password = NULL;
}
[o_pool release];
return VLC_SUCCESS;
}
static int DisplayProgressPanelAction(vlc_object_t *p_this, const char *type, vlc_value_t previous, vlc_value_t value, void *data)
{
NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
dialog_progress_bar_t * p_dialog = (dialog_progress_bar_t *)value.p_address;
intf_thread_t *p_intf = (intf_thread_t*) p_this;
intf_sys_t *p_sys = p_intf->p_sys;
if(p_sys->currentProgressBarPanel)
[p_sys->currentProgressBarPanel release];
p_sys->currentProgressBarPanel = [[VLCProgressPanel alloc] init];
[p_sys->currentProgressBarPanel createContentView];
if (p_dialog->title)
[p_sys->currentProgressBarPanel setDialogTitle:[NSString stringWithUTF8String:p_dialog->title]];
if (p_dialog->message)
[p_sys->currentProgressBarPanel setDialogMessage:[NSString stringWithUTF8String:p_dialog->message]];
if (p_dialog->cancel)
[p_sys->currentProgressBarPanel setCancelButtonLabel:[NSString stringWithUTF8String:p_dialog->cancel]];
[p_sys->currentProgressBarPanel center];
[p_sys->currentProgressBarPanel makeKeyAndOrderFront:nil];
p_dialog->pf_update = updateProgressPanel;
p_dialog->pf_check = checkProgressPanel;
p_dialog->pf_destroy = destroyProgressPanel;
p_dialog->p_sys = p_intf->p_sys;
[o_pool release];
return VLC_SUCCESS;
}
void updateProgressPanel (void *priv, const char *text, float value)
{
NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
intf_sys_t *p_sys = (intf_sys_t *)priv;
if (text)
[p_sys->currentProgressBarPanel setDialogMessage:[NSString stringWithUTF8String:text]];
else
[p_sys->currentProgressBarPanel setDialogMessage:@""];
[p_sys->currentProgressBarPanel setProgressAsDouble:(double)(value * 1000.)];
[o_pool release];
}
void destroyProgressPanel (void *priv)
{
NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
intf_sys_t *p_sys = (intf_sys_t *)priv;
[p_sys->currentProgressBarPanel close];
[p_sys->currentProgressBarPanel release];
[o_pool release];
}
bool checkProgressPanel (void *priv)
{
NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
intf_sys_t *p_sys = (intf_sys_t *)priv;
BOOL b_returned;
b_returned = [p_sys->currentProgressBarPanel isCancelled];
[o_pool release];
return b_returned;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment