Don't release NSProgressIndicator too soon, we need to be able to keep it to use it later, so move "release" from wxAppProgressDockIcon ctor to its dtor. OTOH, remove an extraneous "retain" to fix memory leak of wxAppProgressDockIcon. Finally, show the indicator, if it had been hidden, when Pulse() is called for consistency with SetProgress(). Closes https://github.com/wxWidgets/wxWidgets/pull/1150
125 lines
2.9 KiB
Plaintext
125 lines
2.9 KiB
Plaintext
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/osx/cocoa/appprogress.mm
|
|
// Purpose: wxAppProgressIndicator OSX implemenation
|
|
// Author: Tobias Taschner
|
|
// Created: 2014-10-22
|
|
// Copyright: (c) 2014 wxWidgets development team
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wx/appprogress.h"
|
|
#include "wx/osx/private.h"
|
|
|
|
@interface wxAppProgressDockIcon : NSObject
|
|
{
|
|
NSProgressIndicator* m_progIndicator;
|
|
NSDockTile* m_dockTile;
|
|
}
|
|
|
|
- (id)init;
|
|
|
|
- (void)setProgress: (double)value;
|
|
|
|
@end
|
|
|
|
@implementation wxAppProgressDockIcon
|
|
|
|
- (id)init
|
|
{
|
|
if (self = [super init])
|
|
{
|
|
m_dockTile = [NSApplication sharedApplication].dockTile;
|
|
NSImageView* iv = [[NSImageView alloc] init];
|
|
[iv setImage:[NSApplication sharedApplication].applicationIconImage];
|
|
[m_dockTile setContentView:iv];
|
|
[iv release];
|
|
|
|
m_progIndicator = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0.0f, 16.0f, m_dockTile.size.width, 24.)];
|
|
m_progIndicator.style = NSProgressIndicatorBarStyle;
|
|
[m_progIndicator setIndeterminate:NO];
|
|
[iv addSubview:m_progIndicator];
|
|
|
|
[m_progIndicator setBezeled:YES];
|
|
[m_progIndicator setMinValue:0];
|
|
[m_progIndicator setMaxValue:1];
|
|
[self setProgress:0.0];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[m_progIndicator release];
|
|
[super dealloc];
|
|
}
|
|
|
|
- (void)setProgress: (double)value
|
|
{
|
|
[m_progIndicator setHidden:NO];
|
|
[m_progIndicator setIndeterminate:NO];
|
|
[m_progIndicator setDoubleValue:value];
|
|
|
|
[m_dockTile display];
|
|
}
|
|
|
|
- (void)setIndeterminate: (bool)indeterminate
|
|
{
|
|
[m_progIndicator setHidden:NO];
|
|
[m_progIndicator setIndeterminate:indeterminate];
|
|
|
|
[m_dockTile display];
|
|
}
|
|
|
|
- (void)reset
|
|
{
|
|
[m_progIndicator setHidden:YES];
|
|
|
|
[m_dockTile display];
|
|
}
|
|
|
|
@end
|
|
|
|
wxAppProgressIndicator::wxAppProgressIndicator(wxWindow* WXUNUSED(parent), int maxValue ):
|
|
m_maxValue(maxValue)
|
|
{
|
|
wxAppProgressDockIcon* dockIcon = [[wxAppProgressDockIcon alloc] init];
|
|
|
|
m_dockIcon = dockIcon;
|
|
}
|
|
|
|
wxAppProgressIndicator::~wxAppProgressIndicator()
|
|
{
|
|
Reset();
|
|
|
|
NSObject* obj = (NSObject*) m_dockIcon;
|
|
[obj release];
|
|
}
|
|
|
|
bool wxAppProgressIndicator::IsAvailable() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void wxAppProgressIndicator::SetValue(int value)
|
|
{
|
|
wxAppProgressDockIcon* dockIcon = (wxAppProgressDockIcon*) m_dockIcon;
|
|
[dockIcon setProgress:(double)value / (double)m_maxValue];
|
|
}
|
|
|
|
void wxAppProgressIndicator::SetRange(int range)
|
|
{
|
|
m_maxValue = range;
|
|
}
|
|
|
|
void wxAppProgressIndicator::Pulse()
|
|
{
|
|
wxAppProgressDockIcon* dockIcon = (wxAppProgressDockIcon*) m_dockIcon;
|
|
[dockIcon setIndeterminate:true];
|
|
}
|
|
|
|
void wxAppProgressIndicator::Reset()
|
|
{
|
|
wxAppProgressDockIcon* dockIcon = (wxAppProgressDockIcon*) m_dockIcon;
|
|
[dockIcon reset];
|
|
}
|