- Joined
- Apr 8, 2011
- Messages
- 88
JASS:
library Sliders initializer Init requires GUI, Main
define {
private MAX_SLIDERS = 100
private MAX_BORDERS = 50
private KNOB_HUMAN_ID = 'B01S'
private KNOB_ORC_ID = 'B01T'
private KNOB_ELF_ID = 'B01K'
private KNOB_UNDEAD_ID = 'B01U'
private SLIDER_BORDER = 'B01Q'
private SLIDER_BORDER_END = 'B01R'
private SLIDER_BUTTON_DOWN = 'B01V'
private SLIDER_BUTTON_UP = 'B01W'
}
enum (knob) { NULL_KNOB, HUMAN_KNOB, ORC_KNOB, ELF_KNOB, UNDEAD_KNOB }
// globals
//========================================================
int SlidersCount = 0
bool array Slider_IsShowed[MAX_SLIDERS]
real array Slider_Value[MAX_SLIDERS][3]
real array Slider_StartCoords[MAX_SLIDERS][3]
real array Slider_Length[MAX_SLIDERS]
real array Slider_ScaleMod[MAX_SLIDERS][2]
real array Slider_StepByTrack[MAX_SLIDERS]
int array Slider_Variation[MAX_SLIDERS]
int array Slider_TrackableCount[MAX_SLIDERS]
destructable array Slider_Button[MAX_SLIDERS][2]
destructable array Slider_Knob[MAX_SLIDERS]
destructable array Slider_Borders[MAX_SLIDERS][MAX_BORDERS]
trackable array Slider_ButtonTrackable[MAX_SLIDERS][2]
trackable array Slider_Trackable[MAX_SLIDERS][MAX_BORDERS]
texttag array Slider_Text[MAX_SLIDERS]
real array Slider_TextSize[MAX_SLIDERS]
bool array Slider_TextType[MAX_SLIDERS]
//========================================================
int last_TriggeredSlider = 0
private trigger ButtonClicked = CreateTrigger(), SliderClicked = CreateTrigger()
//========================================================
private real GetPosition(real a, real b, real c){
real x = c - a, y = b - a, B
B = y / 100.
return (x / B) * 0.01
}
public int GetBySliderTrackable(trackable clicked_trackable){
int current_slider = 0, index
while(current_slider++ < SlidersCount) {
index = 0
while (index++ < MAX_BORDERS) {
if (Slider_Trackable[current_slider][index] == clicked_trackable and Slider_IsShowed[current_slider]) { return current_slider }
}
}
return 0
}
public int GetByButtonTrackable(trackable clicked_trackable){
int current_slider = 0
while(current_slider++ < SlidersCount) {
if ((Slider_ButtonTrackable[current_slider][1] == clicked_trackable or Slider_ButtonTrackable[current_slider][2] == clicked_trackable) and Slider_IsShowed[current_slider])
{ return current_slider }
}
return 0
}
public void Show(int slider){
int c = 1
if Slider_IsShowed[slider]{
Slider_IsShowed[slider] = false
ShowDestructable(Slider_Button[slider][1], false)
ShowDestructable(Slider_Button[slider][2], false)
ShowDestructable(Slider_Knob[slider], false)
SetTextTagVisibility(Slider_Text[slider], false)
while (Slider_Borders[slider][c] != null) { ShowDestructable(Slider_Borders[slider][c], false); c++ }
}
else {
Slider_IsShowed[slider] = true
ShowDestructable(Slider_Button[slider][1], true)
ShowDestructable(Slider_Button[slider][2], true)
ShowDestructable(Slider_Knob[slider], true)
SetTextTagVisibility(Slider_Text[slider], true)
while (Slider_Borders[slider][c] != null) { ShowDestructable(Slider_Borders[slider][c], true); c++ }
}
}
private void ButtonClickedAct(){
int slider = GetByButtonTrackable(GetTriggeringTrackable())
real pos
if Slider_IsShowed[slider] {
StartSound(GUI_ClickSound)
// min =>
if (Slider_ButtonTrackable[slider][1] == GetTriggeringTrackable() and Slider_Value[slider][3] > Slider_Value[slider][1]) {
Slider_Value[slider][3]--
if Slider_Value[slider][3] < Slider_Value[slider][1] { Slider_Value[slider][3] = Slider_Value[slider][1] }
elseif Slider_Value[slider][3] > Slider_Value[slider][2] { Slider_Value[slider][3] = Slider_Value[slider][2] }
// min
if Slider_Value[slider][3] == Slider_Value[slider][1] {
pos = 0.
}
// =>
else {
if Slider_Value[slider][1] > 0 {
//msg(R2S(GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])))
pos = Slider_Length[slider] * GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])
}
else {
pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
//if pos < Slider_StartCoords[slider][1] { pos = 0. }
//elseif pos > (Slider_StartCoords[slider][1] + Slider_Length[slider]) { pos = Slider_Length[slider] }
}
}
// text
if Slider_Text[slider] != null {
if Slider_TextType[slider] {
SetTextTagText(Slider_Text[slider], R2S(Slider_Value[slider][3]), (Slider_TextSize[slider] * 0.023) / 10.)
}
else {
SetTextTagText(Slider_Text[slider], I2S(R2I(Slider_Value[slider][3])), (Slider_TextSize[slider] * 0.023) / 10.)
}
}
RemoveDestructable(Slider_Knob[slider])
Slider_Knob[slider] = CreateDestructable(Slider_Variation[slider], Slider_StartCoords[slider][1] + pos, Slider_StartCoords[slider][3], 0., Slider_ScaleMod[SlidersCount][1] - 0.1, 0)
}
// <= max
elseif (Slider_ButtonTrackable[slider][2] == GetTriggeringTrackable() and Slider_Value[slider][3] < Slider_Value[slider][2]) {
Slider_Value[slider][3]++
// max
if Slider_Value[slider][3] == Slider_Value[slider][2] {
pos = Slider_Length[slider]
}
// <=
else {
if Slider_Value[slider][1] > 0 {
//msg(R2S(GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])))
pos = Slider_Length[slider] * GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])
}
else {
pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
}
}
// text
if Slider_Text[slider] != null {
if Slider_TextType[slider] {
SetTextTagText(Slider_Text[slider], R2S(Slider_Value[slider][3]), (Slider_TextSize[slider] * 0.023) / 10.)
}
else {
SetTextTagText(Slider_Text[slider], I2S(R2I(Slider_Value[slider][3])), (Slider_TextSize[slider] * 0.023) / 10.)
}
}
RemoveDestructable(Slider_Knob[slider])
Slider_Knob[slider] = CreateDestructable(Slider_Variation[slider], Slider_StartCoords[slider][1] + pos, Slider_StartCoords[slider][3], 0., Slider_ScaleMod[SlidersCount][1] - 0.1, 0)
}
}
}
private void SliderClickedAct(){
int slider = GetBySliderTrackable(GetTriggeringTrackable()), track_number = LoadInteger(hash, H2I(GetTriggeringTrackable()), 0) - 1
real pos
if Slider_IsShowed[slider] {
StartSound(GUI_ClickSound)
RemoveDestructable(Slider_Knob[slider])
Slider_Value[slider][3] = Slider_Value[slider][1] + (Slider_StepByTrack[slider] * I2R(track_number))
//if Slider_Value[slider][3] < Slider_Value[slider][1] { Slider_Value[slider][3] = Slider_Value[slider][1] }
//elseif Slider_Value[slider][3] > Slider_Value[slider][2] { Slider_Value[slider][3] = Slider_Value[slider][2] }
// min
if track_number == 0 {
Slider_Value[slider][3] = Slider_Value[slider][1]
pos = 0.
}
// max
elseif track_number == Slider_TrackableCount[slider] {
Slider_Value[slider][3] = Slider_Value[slider][2]
pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
}
// min <=> max
else {
if Slider_Value[slider][1] > 0 {
pos = Slider_Length[slider] * GetPosition(Slider_Value[slider][1], Slider_Value[slider][2], Slider_Value[slider][3])
}
else {
pos = Slider_Length[slider] * (Slider_Value[slider][3] / Slider_Value[slider][2])
}
}
// text
if Slider_Text[slider] != null {
if Slider_TextType[slider] {
SetTextTagText(Slider_Text[slider], R2S(Slider_Value[slider][3]), (Slider_TextSize[slider] * 0.023) / 10.)
}
else {
SetTextTagText(Slider_Text[slider], I2S(R2I(Slider_Value[slider][3])), (Slider_TextSize[slider] * 0.023) / 10.)
}
}
Slider_Knob[slider] = CreateDestructable(Slider_Variation[slider], Slider_StartCoords[slider][1] + pos, Slider_StartCoords[slider][3], 0., Slider_ScaleMod[slider][1] - 0.1, 0)
}
}
public void SetMinMaxCurrentValue(int slider_id, int min, int max, int current){
real pos
Slider_Value[slider_id][1] = min
Slider_Value[slider_id][2] = max
Slider_Value[slider_id][3] = current
// start position is min
if Slider_Value[slider_id][3] == Slider_Value[slider_id][1]
{ pos = 0. }
// start position is max
elseif Slider_Value[slider_id][3] == Slider_Value[slider_id][2]
{ pos = Slider_Length[slider_id] }
// start position is min <=> max
else {
if Slider_Value[slider_id][1] > 0 {
pos = Slider_Length[slider_id] * GetPosition(Slider_Value[slider_id][1], Slider_Value[slider_id][2], Slider_Value[slider_id][3])
}
else {
pos = Slider_Length[slider_id] * (Slider_Value[slider_id][3] / Slider_Value[slider_id][2])
}
}
Slider_Knob[slider_id] = CreateDestructable(Slider_Variation[slider_id], Slider_StartCoords[slider_id][1] + pos, Slider_StartCoords[slider_id][3], 0., Slider_ScaleMod[slider_id][1] - 0.1, 0)
if Slider_TrackableCount[slider_id] < max {
Slider_StepByTrack[slider_id] = (Slider_Value[slider_id][2] - Slider_Value[slider_id][1]) / I2R(Slider_TrackableCount[slider_id])
}
else {
Slider_StepByTrack[slider_id] = I2R(max) / I2R(Slider_TrackableCount[slider_id])
}
}
public int AddByX_EX(real start_x, real flat_y, int length, real scale, int variation){
real x
int index = 3, current_trackables = 0, current_length = 0
SlidersCount++
Slider_IsShowed[SlidersCount] = true
Slider_ScaleMod[SlidersCount][1] = scale
Slider_ScaleMod[SlidersCount][2] = (30. * scale)
Slider_StartCoords[SlidersCount][1] = start_x + (60. * scale)
Slider_StartCoords[SlidersCount][3] = flat_y
Slider_Text[SlidersCount] = null
Slider_TextType[SlidersCount] = false
Slider_Length[SlidersCount] = 0.
x = Slider_StartCoords[SlidersCount][1]
// button down
Slider_ButtonTrackable[SlidersCount][1] = CreateTrackable("war3mapImported\\GUI_Slider_Button_Trackable.mdx", start_x - (20. * scale), flat_y, 0.)
TriggerRegisterTrackableHitEvent(ButtonClicked, Slider_ButtonTrackable[SlidersCount][1])
Slider_Button[SlidersCount][1] = CreateDestructable(SLIDER_BUTTON_DOWN, start_x, flat_y, 270., scale - 0.2, 0)
// slider edge
Slider_Borders[SlidersCount][1] = CreateDestructable(SLIDER_BORDER_END, Slider_StartCoords[SlidersCount][1] - (12. * scale), flat_y, 180., scale, 0)
// borders
while (current_length <= length) {
Slider_Borders[SlidersCount][index] = CreateDestructable(SLIDER_BORDER, x, flat_y, 0., scale, 0)
x += Slider_ScaleMod[SlidersCount][2]
Slider_Length[SlidersCount] += Slider_ScaleMod[SlidersCount][2]
current_length++
index++
}
Slider_StartCoords[SlidersCount][2] = x
x = x + (60. * scale)
// end border
Slider_Borders[SlidersCount][index] = CreateDestructable(SLIDER_BORDER, Slider_StartCoords[SlidersCount][2], flat_y, 0., scale, 0)
Slider_Borders[SlidersCount][2] = CreateDestructable(SLIDER_BORDER_END, Slider_StartCoords[SlidersCount][2] + (12. * scale), flat_y, 0., scale, 0)
// button up
Slider_ButtonTrackable[SlidersCount][2] = CreateTrackable("war3mapImported\\GUI_Slider_Button_Trackable.mdx", x + (30. * scale), flat_y, 0.)
TriggerRegisterTrackableHitEvent(ButtonClicked, Slider_ButtonTrackable[SlidersCount][2])
Slider_Button[SlidersCount][2] = CreateDestructable(SLIDER_BUTTON_UP, x, flat_y, 270., scale - 0.2, 0)
// border trackables
Slider_TrackableCount[SlidersCount] = R2I(Slider_Length[SlidersCount] / 15.) + 1
x = Slider_StartCoords[SlidersCount][1]
while(current_trackables++ <= Slider_TrackableCount[SlidersCount]){
Slider_Trackable[SlidersCount][current_trackables] = CreateTrackable("war3mapImported\\GUI_Slider_Base_Trackable.mdx", x, flat_y, 0.)
TriggerRegisterTrackableHitEvent(SliderClicked, Slider_Trackable[SlidersCount][current_trackables])
SaveInteger(hash, H2I(Slider_Trackable[SlidersCount][current_trackables]), 0, current_trackables)
x += 15.2
}
// knob
if variation == HUMAN_KNOB { Slider_Variation[SlidersCount] = KNOB_HUMAN_ID }
elseif variation == ORC_KNOB { Slider_Variation[SlidersCount] = KNOB_ORC_ID }
elseif variation == ELF_KNOB { Slider_Variation[SlidersCount] = KNOB_ELF_ID }
elseif variation == UNDEAD_KNOB { Slider_Variation[SlidersCount] = KNOB_UNDEAD_ID }
return SlidersCount
}
private void Init(){
TriggerAddAction(ButtonClicked, function ButtonClickedAct)
TriggerAddAction(SliderClicked, function SliderClickedAct)
}
endlibrary