🔧 Enable mode indication for setProgressBar

This commit enables setting a mode for the setProgressBar method.
Old behavior is kept intact, usage is entirely optional.
This commit is contained in:
Felix Rieseberg 2016-08-08 15:44:48 -07:00
parent 5eeadb0ad4
commit 73c91dae9e
11 changed files with 72 additions and 20 deletions

View file

@ -584,8 +584,12 @@ void Window::SetFocusable(bool focusable) {
return window_->SetFocusable(focusable);
}
void Window::SetProgressBar(double progress) {
window_->SetProgressBar(progress);
void Window::SetProgressBar(double progress, mate::Arguments* args) {
mate::Dictionary options;
std::string mode;
args->GetNext(&options) && options.Get("mode", &mode);
window_->SetProgressBar(progress, mode);
}
void Window::SetOverlayIcon(const gfx::Image& overlay,

View file

@ -155,7 +155,7 @@ class Window : public mate::TrackableObject<Window>,
void SetIgnoreMouseEvents(bool ignore);
void SetContentProtection(bool enable);
void SetFocusable(bool focusable);
void SetProgressBar(double progress);
void SetProgressBar(double progress, mate::Arguments* args);
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description);
bool SetThumbarButtons(mate::Arguments* args);

View file

@ -143,7 +143,8 @@ class NativeWindow : public base::SupportsUserData,
virtual gfx::AcceleratedWidget GetAcceleratedWidget() = 0;
// Taskbar/Dock APIs.
virtual void SetProgressBar(double progress) = 0;
virtual void SetProgressBar(double progress,
const std::string& mode) = 0;
virtual void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description) = 0;

View file

@ -83,7 +83,7 @@ class NativeWindowMac : public NativeWindow {
void SetParentWindow(NativeWindow* parent) override;
gfx::NativeWindow GetNativeWindow() override;
gfx::AcceleratedWidget GetAcceleratedWidget() override;
void SetProgressBar(double progress) override;
void SetProgressBar(double progress, const std::string& mode) override;
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description) override;

View file

@ -973,7 +973,7 @@ gfx::AcceleratedWidget NativeWindowMac::GetAcceleratedWidget() {
return inspectable_web_contents()->GetView()->GetNativeView();
}
void NativeWindowMac::SetProgressBar(double progress) {
void NativeWindowMac::SetProgressBar(double progress, const std::string& mode) {
NSDockTile* dock_tile = [NSApp dockTile];
// For the first time API invoked, we need to create a ContentView in DockTile.

View file

@ -904,9 +904,10 @@ gfx::NativeWindow NativeWindowViews::GetNativeWindow() {
return window_->GetNativeWindow();
}
void NativeWindowViews::SetProgressBar(double progress) {
void NativeWindowViews::SetProgressBar(
double progress, const std::string& mode) {
#if defined(OS_WIN)
taskbar_host_.SetProgressBar(GetAcceleratedWidget(), progress);
taskbar_host_.SetProgressBar(GetAcceleratedWidget(), progress, mode);
#elif defined(USE_X11)
if (unity::IsRunning()) {
unity::SetProgressFraction(progress);

View file

@ -104,7 +104,7 @@ class NativeWindowViews : public NativeWindow,
gfx::NativeWindow GetNativeWindow() override;
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description) override;
void SetProgressBar(double value) override;
void SetProgressBar(double value, const std::string& mode) override;
void SetAutoHideMenuBar(bool auto_hide) override;
bool IsMenuBarAutoHide() override;
void SetMenuBarVisibility(bool visible) override;

View file

@ -117,18 +117,40 @@ bool TaskbarHost::SetThumbarButtons(
return SUCCEEDED(r);
}
bool TaskbarHost::SetProgressBar(HWND window, double value) {
bool TaskbarHost::SetProgressBar(
HWND window, double value, const std::string& mode) {
if (!InitializeTaskbar())
return false;
HRESULT r;
if (value > 1.0)
r = taskbar_->SetProgressState(window, TBPF_INDETERMINATE);
else if (value < 0)
r = taskbar_->SetProgressState(window, TBPF_NOPROGRESS);
else
r = taskbar_->SetProgressValue(window, static_cast<int>(value * 100), 100);
return SUCCEEDED(r);
HRESULT barR;
HRESULT stateR;
if (value > 1.0 || mode == "indeterminate") {
barR = taskbar_->SetProgressState(window, TBPF_INDETERMINATE);
} else if (value < 0 || mode == "none") {
barR = taskbar_->SetProgressState(window, TBPF_NOPROGRESS);
} else {
// Unless SetProgressState set a blocking state (TBPF_ERROR, TBPF_PAUSED)
// for the window, a call to SetProgressValue assumes the TBPF_NORMAL
// state even if it is not explicitly set.
// SetProgressValue overrides and clears the TBPF_INDETERMINATE state.
if (mode == "error") {
stateR = taskbar_->SetProgressState(window, TBPF_ERROR);
} else if (mode == "paused") {
stateR = taskbar_->SetProgressState(window, TBPF_PAUSED);
} else {
stateR = taskbar_->SetProgressState(window, TBPF_NORMAL);
}
if (SUCCEEDED(stateR)) {
int val = static_cast<int>(value * 100);
barR = taskbar_->SetProgressValue(window, val, 100);
} else {
return SUCCEEDED(stateR);
}
}
return SUCCEEDED(barR);
}
bool TaskbarHost::SetOverlayIcon(

View file

@ -35,7 +35,7 @@ class TaskbarHost {
HWND window, const std::vector<ThumbarButton>& buttons);
// Set the progress state in taskbar.
bool SetProgressBar(HWND window, double value);
bool SetProgressBar(HWND window, double value, const std::string& mode);
// Set the overlay icon in taskbar.
bool SetOverlayIcon(

View file

@ -956,9 +956,11 @@ Same as `webContents.reload`.
Sets the `menu` as the window's menu bar, setting it to `null` will remove the
menu bar.
#### `win.setProgressBar(progress)`
#### `win.setProgressBar(progress[, options])`
* `progress` Double
* `options` Object (optional)
* `mode` String _Windows_ - Mode for the progres bar (`none`, `normal`, `indeterminate`, `error`, or `paused`)
Sets progress value in progress bar. Valid range is [0, 1.0].
@ -969,6 +971,10 @@ On Linux platform, only supports Unity desktop environment, you need to specify
the `*.desktop` file name to `desktopName` field in `package.json`. By default,
it will assume `app.getName().desktop`.
On Windows, a mode can be passed. Accepted values are `none`, `normal`,
`indeterminate`, `error`, and `paused`. If you call `setProgressBar` without a
mode set (but with a value within the valid range), `normal` will be assumed.
#### `win.setOverlayIcon(overlay, description)` _Windows_
* `overlay` [NativeImage](native-image.md) - the icon to display on the bottom

View file

@ -391,6 +391,24 @@ describe('browser-window module', function () {
w.setProgressBar(-1)
})
})
it('sets the progress using "paused" mode', function () {
assert.doesNotThrow(function () {
w.setProgressBar(0.5, {mode: 'paused'})
})
})
it('sets the progress using "error" mode', function () {
assert.doesNotThrow(function () {
w.setProgressBar(0.5, {mode: 'error'})
})
})
it('sets the progress using "normal" mode', function () {
assert.doesNotThrow(function () {
w.setProgressBar(0.5, {mode: 'normal'})
})
})
})
describe('BrowserWindow.fromId(id)', function () {