Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add CBA_fnc_progressBar #912

Merged
merged 19 commits into from
Apr 29, 2018
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions addons/ui/CfgFunctions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class CfgFunctions {
file = QUOTE(PATHTOF(flexiMenu\fnc_openMenuByDef.sqf));
};
PATHTO_FNC(addPauseMenuOption);
PATHTO_FNC(progressBar);
};
};
};
30 changes: 30 additions & 0 deletions addons/ui/CfgUIGrids.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class CfgUIGrids {
class IGUI {
class Presets {
class Arma3 {
class Variables {
GVAR(grid)[] = {
{
1 * GUI_GRID_CENTER_W + GUI_GRID_CENTER_X,
0 * GUI_GRID_CENTER_H + GUI_GRID_CENTER_Y,
38 * GUI_GRID_CENTER_W,
1 * GUI_GRID_CENTER_H
},
0.5 * GUI_GRID_CENTER_W,
0.5 * GUI_GRID_CENTER_H
};
};
};
};

class Variables {
class GVAR(grid) {
displayName = CSTRING(ProgressBarPositionName);
description = CSTRING(ProgressBarPositionDescription);
preview = "#(argb,8,8,3)color(0,0,0,1)";
saveToProfile[] = {0,1,2,3};
canResize = 1;
};
};
};
};
50 changes: 50 additions & 0 deletions addons/ui/RscTitles.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
class RscText;
class RscProgress;

class GVAR(ProgressBar) {
onLoad = uiNamespace setVariable ['GVAR(ProgressBar)', _this select 0];
idd = -1;
controls[] = {"Background", "TitleBackground", "ProgressBar", "TitleText"};

class Background: RscText {
x = "safezoneXAbs";
y = "safezoneY";
w = "safezoneWAbs";
h = "safezoneH";
};

class TitleBackground: RscText {
style = ST_CENTER;
sizeEx = 1 * GUI_GRID_CENTER_H;
colorBackground[] = {0,0,0,0.5};
x = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),X)', 0];
y = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),Y)', 0];
w = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),W)', 0];
h = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),H)', 0];
};

class TitleText: TitleBackground {
idc = IDC_PROGRESSBAR_TITLE;
colorBackground[] = {0,0,0,0};
colorText[] = {1,1,1,1};
};

class ProgressBar: RscProgress {
idc = IDC_PROGRESSBAR_BAR;
colorFrame[] = {0,0,0,0.5};
colorBar[] = GUI_BCG_COLOR;
texture = "#(argb,8,8,3)color(1,1,1,0.7)";
x = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),X)', 0];
y = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),Y)', 0];
w = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),W)', 0];
h = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),H)', 0];
};
};

class RscTitles {
class GVAR(ProgressBar): GVAR(ProgressBar) {
duration = 1e+011;
fadeIn = 0;
fadeOut = 0;
};
};
4 changes: 3 additions & 1 deletion addons/ui/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgFunctions.hpp"

#include "RscTitles.hpp"
#include "CfgUIGrids.hpp"

//-----------------------------------------------------------------------------
// TODO: Delete these rsc/_flexiMenu_RscShortcutButton classes soon and transfer properties to menu classes, if any.
class RscText;
class RscShortcutButton;
class _flexiMenu_RscShortcutButton: RscShortcutButton {
class HitZone {
Expand Down
173 changes: 173 additions & 0 deletions addons/ui/fnc_progressBar.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
/* ----------------------------------------------------------------------------
Function: CBA_fnc_progressBar

Description:
Opens a progress bar. Closes the currently active progress bar.

Parameters:
_title - Title of the progress bar <STRING>
_condition - Execute every frame. If reports false, close the progress bar <CODE>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_title

_time - Time for the progress bar to complete
_onSuccess - Script to execute if the progress bar completed <CODE>
_onFailure - Script to execute if the progress bar was aborted prematurely <CODE>
_arguments - Arguments passed to the scripts (optional, default: []) <ANY>
_allowClose - Allow ESC key to abort the progress bar (optional, default: true) <BOOLEAN>
_blockInput - (optional, default: true) <BOOLEAN>

Arguments:
_this - same as _arguments <ANY>

Returns:
Nothing

Examples:
(begin example)
["progress bar", {true}, 5, {hint "done"}, {hint "aborted"}] call CBA_fnc_progressBar;
(end)

Author:
commy2
---------------------------------------------------------------------------- */
#include "script_component.hpp"

if (!hasInterface) exitWith {};

if (canSuspend) exitWith {
isNil (uiNamespace getVariable _fnc_scriptName);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's this bit all about?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Run the function unscheduled every time.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

@dedmen dedmen Apr 23, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe prefer fnc_directCall for clarity?
I'd usually push the performance argument.. But this is scheduled soooooo....

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I just hadn't see the uiNamespace stuff before, was curious as to how that worked

nil;
};

params [
["_title", "", [""]],
["_condition", {}, [{}, ""]],
["_time", 0, [0]],
["_onSuccess", {}, [{}, ""]],
["_onFailure", {}, [{}, ""]],
["_arguments", []],
["_allowClose", true, [false]],
["_blockInput", true, [false]]
];

if (isLocalized _title) then {
_title = localize _title;
};

if (_condition isEqualType "") then {
_condition = compile _condition;
};

if (_onSuccess isEqualType "") then {
_onSuccess = compile _onSuccess;
};

if (_onFailure isEqualType "") then {
_onFailure = compile _onFailure;
};

private _display = uiNamespace getVariable [QGVAR(ProgressBar), displayNull];

if (!isNull _display) then {
// run failure code on previous progress bar
private _arguments = _display getVariable QGVAR(arguments);
private _onFailure = _display getVariable QGVAR(onFailure);

// close display, execute on failure script
_display closeDisplay 0;

[_arguments, _onFailure] spawn {
isNil {
_this#0 call _this#1;
};
};
};

// create new progress bar
if (_blockInput) then {
_display = (uiNamespace getVariable "RscDisplayMission") createDisplay QGVAR(ProgressBar);
} else {
QGVAR(ProgressBar) cutRsc [QGVAR(ProgressBar), "PLAIN"];
_display = uiNamespace getVariable QGVAR(ProgressBar);
};
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

todo, MouseMoving, MouseHolding don't work for cutRsc.


_display displayAddEventHandler ["KeyDown", {
params ["_display", "_key", "_shift", "_control", "_alt"];

private _arguments = _display getVariable QGVAR(arguments);
private _onFailure = _display getVariable QGVAR(onFailure);
private _allowClose = _display getVariable QGVAR(allowClose);
private _blockInput = _display getVariable QGVAR(blockInput);

if (_allowClose && {_key isEqualTo DIK_ESCAPE}) then {
// close display, execute on failure script
_display closeDisplay 0;

[_arguments, _onFailure] spawn {
isNil {
_this#0 call _this#1;
};
};

_blockInput = true;
};

_blockInput
}];

private _fnc_check = {
params ["_display"];

private _arguments = _display getVariable QGVAR(arguments);
private _condition = _display getVariable QGVAR(condition);

private _continue = [_arguments, _condition] call {
private ["_display", "_arguments", "_condition"];
_this#0 call _this#1;
};

private _onSuccess = _display getVariable QGVAR(onSuccess);
private _onFailure = _display getVariable QGVAR(onFailure);

if (!_continue) exitWith {
// close display, execute on failure script
_display closeDisplay 0;

[_arguments, _onFailure] spawn {
isNil {
_this#0 call _this#1;
};
};
};

private _startTime = _display getVariable QGVAR(start);
private _duration = _display getVariable QGVAR(duration);
private _runTime = CBA_missionTime - _startTime;

if (_runTime > _duration) exitWith {
// close display, execute on success script
_display closeDisplay 0;

[_arguments, _onSuccess] spawn {
isNil {
_this#0 call _this#1;
};
};
};

private _ctrlBar = _display displayCtrl IDC_PROGRESSBAR_BAR;
_ctrlBar progressSetPosition (_runTime / _duration);
};

_display displayAddEventHandler ["MouseMoving", _fnc_check];
_display displayAddEventHandler ["MouseHolding", _fnc_check];

private _ctrlTitle = _display displayCtrl IDC_PROGRESSBAR_TITLE;
_ctrlTitle ctrlSetText _title;

_display setVariable [QGVAR(start), CBA_missionTime];
_display setVariable [QGVAR(duration), _time];
_display setVariable [QGVAR(arguments), _arguments];
_display setVariable [QGVAR(condition), _condition];
_display setVariable [QGVAR(onSuccess), _onSuccess];
_display setVariable [QGVAR(onFailure), _onFailure];
_display setVariable [QGVAR(allowClose), _allowClose];
_display setVariable [QGVAR(blockInput), _blockInput];
6 changes: 6 additions & 0 deletions addons/ui/script_component.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#define COMPONENT ui
#include "\x\cba\addons\main\script_mod.hpp"

//#define DEBUG_MODE_FULL
//#define DISABLE_COMPILE_CACHE
//#define DEBUG_ENABLED_UI

#ifdef DEBUG_ENABLED_UI
Expand All @@ -14,9 +16,13 @@
#include "\x\cba\addons\main\script_macros.hpp"

#include "\a3\ui_f\hpp\defineCommonGrids.inc"
#include "\a3\ui_f\hpp\defineCommonColors.inc"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"
#include "\a3\ui_f\hpp\defineResincl.inc"

#define IDC_PROGRESSBAR_TITLE 10
#define IDC_PROGRESSBAR_BAR 11

#define IDC_ADDON_CONTROLS 127303
#define IDC_ADDON_OPTIONS 127307

Expand Down
8 changes: 8 additions & 0 deletions addons/ui/stringtable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,13 @@
<Portuguese>Extensões de Base Comunitária - Interface ao Usuário</Portuguese>
<Russian>Community Base Addons - Пользовательский Интерфейс</Russian>
</Key>
<Key ID="STR_CBA_Ui_ProgressBarPositionName">
<English>Progress Bar</English>
<German>Fortschrittsanzeige</German>
</Key>
<Key ID="STR_CBA_Ui_ProgressBarPositionDescription">
<English>Position of the progress bar.</English>
<German>Position der Fortschrittsanzeige.</German>
</Key>
</Package>
</Project>