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 18 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;
};
};
};
};
57 changes: 57 additions & 0 deletions addons/ui/RscTitles.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
class RscText;
class RscProgress;
class RscMapControl;

class RscTitles {
class GVAR(ProgressBar) {
onLoad = uiNamespace setVariable ['GVAR(ProgressBar)', _this select 0];
idd = -1;
duration = 1e+11;
fadeIn = 0;
fadeOut = 0;

controls[] = {"Background", "TitleBackground", "ProgressBar", "TitleText", "Script"};

class Background: RscText {
colorBackground[] = {0,0,0,0};
x = "safezoneXAbs";
y = "safezoneY";
w = "safezoneWAbs";
h = "safezoneH";
};

class TitleBackground: RscText {
idc = IDC_PROGRESSBAR_BACKGROUND;
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 Script: RscMapControl {
idc = IDC_PROGRESSBAR_SCRIPT
Copy link
Contributor

Choose a reason for hiding this comment

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

File x\cba\addons\ui\RscTitles.hpp, line 51: '/RscTitles/cba_ui_ProgressBar/Script.idc': Missing ';' at the end of line

w = 0;
h = 0;
};
};
};
7 changes: 7 additions & 0 deletions addons/ui/XEH_preClientInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,10 @@
LOG(MSG_INIT);

call COMPILE_FILE(flexiMenu\init);

// recreate after loading a savegame
addMissionEventHandler ["Loaded", {
if (!isNil QGVAR(ProgressBarParams)) then {
QGVAR(ProgressBar) cutRsc [QGVAR(ProgressBar), "PLAIN"];
};
}];
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
149 changes: 149 additions & 0 deletions addons/ui/fnc_progressBar.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
/* ----------------------------------------------------------------------------
Function: CBA_fnc_progressBar

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

Parameters:
_title - Title of the progress bar <STRING>
_totalTime - Time for the progress bar to complete <NUMBER>
_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

_onSuccess - Script to execute if the progress bar completed <CODE>
_onFailure - Script to execute if the progress bar was aborted prematurely
(optional, default: {}) <CODE>
_arguments - Arguments passed to the scripts (optional, default: []) <ANY>
_blockMouse - Block mouse input (optional, default: true) <BOOLEAN>
_blockKeys - Block keyboard input
requires _blockMouse to be set to true (optional, default: true) <BOOLEAN>
_allowClose - Allow ESC key to abort the progress bar
requires _blockMouse to be set to true (optional, default: true) <BOOLEAN>

Arguments:
_this:
#0 - same as _arguments <ANY>
#1 - true: success, false: failure <BOOLEAN>
#2 - elapsed time, not more than _totalTime <NUMBER>
#3 - total time, same as _totalTime <NUMBER>

Returns:
Nothing

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

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

// no progress bar without interface
if (!hasInterface) exitWith {};

// execute in unscheduled environment
if (canSuspend) exitWith {
[CBA_fnc_progressBar, _this] call CBA_fnc_directCall;
};

// arguments
params [
["_title", "", [""]],
["_totalTime", 0, [0]],
["_condition", {}, [{true}]],
["_onSuccess", {}, [{}]],
["_onFailure", {}, [{}]],
["_arguments", []],
["_blockMouse", true, [false]],
["_blockKeys", true, [false]],
["_allowClose", true, [false]]
];

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

// show progress bar and set title
QGVAR(ProgressBar) cutRsc [QGVAR(ProgressBar), "PLAIN"];
private _display = uiNamespace getVariable QGVAR(ProgressBar);

private _ctrlTitle = _display displayCtrl IDC_PROGRESSBAR_TITLE;
_ctrlTitle ctrlSetText _title;

// run failure code on previous progress bar
if (!isNil QGVAR(ProgressBarParams)) then {
GVAR(ProgressBarParams) params ["_arguments", "", "", "_onFailure", "_startTime", "_totalTime"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;

[_onFailure, [_arguments, false, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;
};

GVAR(ProgressBarParams) = [_arguments, _condition, _onSuccess, _onFailure, CBA_missionTime, _totalTime, _blockMouse, _blockKeys, _allowClose];
Copy link
Contributor

Choose a reason for hiding this comment

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

Not that it really matters, but you could set these on the display itself and that way it get's cleaned up automatically

Copy link
Contributor Author

@commy2 commy2 Apr 26, 2018

Choose a reason for hiding this comment

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

The display dies when saving and loading a savegame.
If I use a global instead, which is serialized properly, I can create a new loading bar with the same parameters once the game is loaded:
https://github.com/CBATeam/CBA_A3/pull/912/files#diff-8ff25e6d6abfb5db687c39f11a07e5b4R7

Only thing that doesn't work is the block input display, but I just assume that this only ever happens to mouse enabled progress bars, since only then you can use Esc to open the menu to save.


// update bar, check condition, execute success or failure scripts
private _ctrlScript = _display displayCtrl IDC_PROGRESSBAR_SCRIPT;
_ctrlScript ctrlAddEventHandler ["Draw", {
params ["_ctrlScript"];
private _display = ctrlParent _ctrlScript;

GVAR(ProgressBarParams) params ["_arguments", "_condition", "_onSuccess", "_onFailure", "_startTime", "_totalTime"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;

private _continue = [[_arguments, true, _elapsedTime, _totalTime], _condition] call {
private ["_ctrlScript", "_display", "_arguments", "_condition", "_onSuccess", "_onFailure", "_startTime", "_totalTime", "_elapsedTime"];
_this#0 call _this#1;
};

private _blockInputDisplay = uiNamespace getVariable [QGVAR(BlockInputDisplay), displayNull];

if (!_continue) exitWith {
GVAR(ProgressBarParams) = nil;
{QGVAR(ProgressBar) cutText ["", "PLAIN"]} call CBA_fnc_execNextFrame; // game would crash if display is killed from Draw event
_blockInputDisplay closeDisplay 0;
[_onFailure, [_arguments, false, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;
};

if (_elapsedTime >= _totalTime) exitWith {
GVAR(ProgressBarParams) = nil;
{QGVAR(ProgressBar) cutText ["", "PLAIN"]} call CBA_fnc_execNextFrame; // game would crash if display is killed from Draw event
_blockInputDisplay closeDisplay 0;
[_onSuccess, [_arguments, true, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;
};

private _ctrlBar = _display displayCtrl IDC_PROGRESSBAR_BAR;
_ctrlBar progressSetPosition (_elapsedTime / _totalTime);
}];

// block input while the bar is shown
private _blockInputDisplay = uiNamespace getVariable [QGVAR(BlockInputDisplay), displayNull];
_blockInputDisplay closeDisplay 0;

if (_blockMouse) then {
private _mission = uiNamespace getVariable "RscDisplayMission";
_blockInputDisplay = _mission createDisplay "RscDisplayEmpty";
uiNamespace setVariable [QGVAR(BlockInputDisplay), _blockInputDisplay];

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

GVAR(ProgressBarParams) params ["_arguments", "", "", "_onFailure", "_startTime", "_totalTime", "_blockMouse", "_blockKeys", "_allowClose"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;

if (_key isEqualTo DIK_ESCAPE) then {
if (_allowClose) then {
GVAR(ProgressBarParams) = nil;
QGVAR(ProgressBar) cutText ["", "PLAIN"];
_blockInputDisplay closeDisplay 0;
[_onFailure, [_arguments, false, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;

_blockKeys = false;
} else {
_blockKeys = true;
};
};

_blockKeys
}];
};

nil
7 changes: 7 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,14 @@
#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_PROGRESSBAR_SCRIPT 12

#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>