From 6d1ad866728e4cf4732270b785dc0d1e777d148e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Felix=20Paul=20K=C3=BChne?= Date: Sat, 26 Dec 2009 15:36:11 +0100 Subject: [PATCH] osx dialog provider: implemented the progress bar dialog --- modules/gui/macosx_dialog_provider/Modules.am | 4 +- .../macosx_dialog_provider/VLCProgressPanel.h | 46 ++++++ .../macosx_dialog_provider/VLCProgressPanel.m | 139 ++++++++++++++++++ .../macosx_dialog_provider/dialogProvider.m | 96 ++++++++++-- 4 files changed, 274 insertions(+), 11 deletions(-) create mode 100644 modules/gui/macosx_dialog_provider/VLCProgressPanel.h create mode 100644 modules/gui/macosx_dialog_provider/VLCProgressPanel.m diff --git a/modules/gui/macosx_dialog_provider/Modules.am b/modules/gui/macosx_dialog_provider/Modules.am index d7d6c7d35e..e274b0a676 100644 --- a/modules/gui/macosx_dialog_provider/Modules.am +++ b/modules/gui/macosx_dialog_provider/Modules.am @@ -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 diff --git a/modules/gui/macosx_dialog_provider/VLCProgressPanel.h b/modules/gui/macosx_dialog_provider/VLCProgressPanel.h new file mode 100644 index 0000000000..725f2ce5ce --- /dev/null +++ b/modules/gui/macosx_dialog_provider/VLCProgressPanel.h @@ -0,0 +1,46 @@ +/***************************************************************************** + * VLCProgressPanel.h: A Generic Progress Indicator Panel created for VLC + ***************************************************************************** + * Copyright (C) 2009-2010 the VideoLAN team + * $Id$ + * + * Authors: Felix Paul Kühne + * + * 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 + + +@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 diff --git a/modules/gui/macosx_dialog_provider/VLCProgressPanel.m b/modules/gui/macosx_dialog_provider/VLCProgressPanel.m new file mode 100644 index 0000000000..07c4e4a079 --- /dev/null +++ b/modules/gui/macosx_dialog_provider/VLCProgressPanel.m @@ -0,0 +1,139 @@ +/***************************************************************************** + * VLCProgressPanel.m: A Generic Progress Indicator Panel created for VLC + ***************************************************************************** + * Copyright (C) 2009-2010 the VideoLAN team + * $Id$ + * + * Authors: Felix Paul Kühne + * + * 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 diff --git a/modules/gui/macosx_dialog_provider/dialogProvider.m b/modules/gui/macosx_dialog_provider/dialogProvider.m index 26be3461fe..95d058bd96 100644 --- a/modules/gui/macosx_dialog_provider/dialogProvider.m +++ b/modules/gui/macosx_dialog_provider/dialogProvider.m @@ -38,6 +38,7 @@ #import #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; +} + -- 2.39.2