]> git.sesse.net Git - vlc/commitdiff
osx dialog provider: implemented the progress bar dialog
authorFelix Paul Kühne <fkuehne@videolan.org>
Sat, 26 Dec 2009 14:36:11 +0000 (15:36 +0100)
committerFelix Paul Kühne <fkuehne@videolan.org>
Sat, 26 Dec 2009 14:36:27 +0000 (15:36 +0100)
modules/gui/macosx_dialog_provider/Modules.am
modules/gui/macosx_dialog_provider/VLCProgressPanel.h [new file with mode: 0644]
modules/gui/macosx_dialog_provider/VLCProgressPanel.m [new file with mode: 0644]
modules/gui/macosx_dialog_provider/dialogProvider.m

index d7d6c7d35ed97a1e8eaeedc7ae1b9db1ecf318ea..e274b0a676b74e7002ed057a20a122c2f78c8317 100644 (file)
@@ -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 (file)
index 0000000..725f2ce
--- /dev/null
@@ -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 <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
diff --git a/modules/gui/macosx_dialog_provider/VLCProgressPanel.m b/modules/gui/macosx_dialog_provider/VLCProgressPanel.m
new file mode 100644 (file)
index 0000000..07c4e4a
--- /dev/null
@@ -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 <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
index 26be3461fe7ae612a4c7e8c9d1ef8e8987f6ea3b..95d058bd96d71a655883b0888dfc135ba53aeba1 100644 (file)
@@ -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;
+}
+