Skip to content

Commit

Permalink
Merge pull request #912 from CBATeam/progressBar
Browse files Browse the repository at this point in the history
add CBA_fnc_progressBar
  • Loading branch information
Killswitch00 committed Apr 29, 2018
2 parents 48d4a26 + b2f09ed commit b982e79
Show file tree
Hide file tree
Showing 8 changed files with 262 additions and 1 deletion.
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;
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>
_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];

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

0 comments on commit b982e79

Please sign in to comment.