|
|
|
12-18-2019, 04:23 AM
|
#641
|
Human being with feelings
Join Date: Jan 2010
Location: Fjugesta, Sweden
Posts: 813
|
Lokasenna GUI v2 - how to make a progressbar with slider
Hi there all LGUIv2-users!
I am trying to make a progress bar of a slider for my Practice Coach-script
and I have sort of managed to do it BUT there is one issue. When I start
script everything is correct - slider starts in zero position and is rising
to max position and when max is reached the slider resets to zero. And now
ladies and gentlemens the problem arise! Next time the loop is run the slider
starts at a minus-position outside of the slider! I cant figure out where the
negative numbers come from....
Code:
GUI.New("Slider1", "Slider", {
z = 11,
x = 8,
y = 8,
w = 200,
caption = "",
min = 10,
max =0,
defaults = {0},
inc = 1,
dir = "v",
font_a = 3,
font_b = 4,
col_txt = "txt",
col_fill = "elm_fill",
bg = "wnd_bg",
show_handles = false,
show_values = false,
cap_x = 0,
cap_y = 0
})
--other code.......
function startButton ()
if buttonEnabled then
startTime = reaper.time_precise()
endTime = startTime + practiceTime[i]
setBPM()
countDownTimer()
GUI.elms.Start_Cont_Button.caption = "...."
reaper.Main_OnCommandEx( 40630, 0, 0 )
reaper.OnPlayButton()
buttonEnabled = false
i = i + 1
stepsLeft = stepsLeft - 1
GUI.Val("StepsLeft_Label", "Steps left: " .. stepsLeft)
else
--...nothing should happen - button is disabled
end
end
function countDownTimer()
if (reaper.time_precise() <= endTime) then
reaper.defer(countDownTimer)
progress = (endTime - reaper.time_precise())
GUI.Val("Slider1", progress )
else
reaper.OnStopButton()
GUI.Val("Slider1", 10 )
buttonEnabled = true
if i <= 8 then
notFinished = true
GUI.elms.Start_Cont_Button.caption = "Continue"
GUI.elms.Start_Cont_Button:redraw()
else
notFinished = false
GUI.elms.Start_Cont_Button.caption = "Start"
GUI.elms.Start_Cont_Button:redraw()
stepsLeft = 8
GUI.Val("StepsLeft_Label", "Steps left: " .. stepsLeft)
i = 1
end
if autoContinue and notFinished then
autoContMB = GUI.Val("AutoContMB")
pauseTime = autoContMB * 5
startTime2 = endTime
endTime2 = startTime2 + pauseTime
countDownTimer2()
end
end
end
function countDownTimer2 ()
if (reaper.time_precise() <= endTime2) then
reaper.defer(countDownTimer2)
else
startButton()
end
end
I am testing this on my developer computer with Linux and the latest LGUIv2 and Reaper 6.0.
I am not sure my solution is the best one - if you have another approach
to a progressbar with LGUIv2 I love to hear from you!
Regards
Thomas
|
|
|
12-18-2019, 04:48 AM
|
#642
|
Human being with feelings
Join Date: Aug 2011
Posts: 522
|
Thanks again!
I have found another problem with this approach. Would like your opinion please. Everytime a user selects a preset, the UI changes reflecting each slider, button values. Good.
Because the menubox preset selector is inside the main loop, everytime i try to change a parameter after loading a preset the UI automatically updates to the preset data, reading it from the Extsate and applying it to the elemetns continuously...which makes it impossible to edit any preset XD
So, if i want to keep it simple with just the menubox, is there a way to call a function from the loop but only once? Ideally updating the GUI with the preset data should happen only when the menubox selector changes, not on every loop.
This is probably a basic loop misunderstanding so excuse me if the answer is too obvious. :blush:
|
|
|
12-18-2019, 09:49 AM
|
#643
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by tompad
Hi there all LGUIv2-users!
I am trying to make a progress bar of a slider for my Practice Coach-script
and I have sort of managed to do it BUT there is one issue. When I start
script everything is correct - slider starts in zero position and is rising
to max position and when max is reached the slider resets to zero. And now
ladies and gentlemens the problem arise! Next time the loop is run the slider
starts at a minus-position outside of the slider! I cant figure out where the
negative numbers come from....
|
Can't say for sure without the rest of the code, but my guess would be this:
Code:
progress = (endTime - reaper.time_precise())
GUI.Val("Slider1", progress )
The Slider's val method expects a multiple of [i]inc/i] within its range - 0 to 10, in this case. I'm not sure what happens if you give it something like 5.125, but even assuming it does the right thing there you're still passing in the time difference rather than a value from 0 to 10. Try:
Code:
local progress = endTime - reaper.time_precise()
local length = endTime - startTime
local progress = math.floor(progress / length * GUI.elms.Slider1.steps)
GUI.Val("Slider1", progress )
Quote:
I am not sure my solution is the best one - if you have another approach to a progressbar with LGUIv2 I love to hear from you!
|
You could simplify things by just using a Frame and overriding its draw method to draw a progress bar using a percentage of its full width. Then you wouldn't have to worry about slider steps, range, etc.
|
|
|
12-18-2019, 09:58 AM
|
#644
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by reapero
Because the menubox preset selector is inside the main loop
|
I'm confused; why is the preset selector in your main loop? You should just have to attach your handler to the menubox so it's run every time the user chooses a preset. Something like:
Code:
local function updateOtherElements()
...
end
function GUI.elms.myMenuBox:onmouseup()
GUI.Menubox.onmouseup(self)
updateOtherElements()
end
function GUI.elms.myMenuBox.onmouseup()
GUI.Menubox.onwheel(self)
updateOtherElements()
end
Quote:
So, if i want to keep it simple with just the menubox, is there a way to call a function from the loop but only once? Ideally updating the GUI with the preset data should happen only when the menubox selector changes, not on every loop.
|
If you do need to have it in the main loop, for whatever reason, then something like this will do the trick:
Code:
local presetWasChanged = false
function GUI.elms.myMenuBox:onmouseup()
GUI.Menubox.onmouseup(self)
presetWasChanged = true
end
function GUI.elms.myMenuBox.onmouseup()
GUI.Menubox.onwheel(self)
presetWasChanged = true
end
local function mainLoop()
if presetWasChanged then
-- Update the other elements
presetWasChanged = false
else
-- Do something else
end
reaper.defer(mainLoop)
end
mainLoop()
|
|
|
12-18-2019, 10:17 AM
|
#645
|
Human being with feelings
Join Date: Aug 2011
Posts: 522
|
Quote:
Originally Posted by Lokasenna
I'm confused; why is the preset selector in your main loop? You should just have to attach your handler to the menubox so it's run every time the user chooses a preset. Something like:
[code]local function updateOtherElements()
...
|
Allright, i completely did it wrong then. I didnt connect any onmouseup() to anything and since i only got a static value from the menubox (the one when the script initializes) i thought the way to get it was to put it inside the main loop.
I think i got confused by not seeing those methods in the wiki subpage for the menubox class:
https://github.com/jalovatt/Lokasenna_GUI/wiki/2.00-Menubox
I guess those are inherited from other classes. Would adding this info there make sense or is it just common sense i failed to understand? Maybe its already explained somewhere?
Thanks!
|
|
|
12-18-2019, 10:39 AM
|
#647
|
Human being with feelings
Join Date: Aug 2011
Posts: 522
|
Sure. Looking forward to it!
|
|
|
12-20-2019, 04:53 AM
|
#648
|
Human being with feelings
Join Date: Aug 2011
Posts: 522
|
I cant set a checkbox to false using:
Code:
GUI.Val("My_checkbox",false)
Setting it to true works though. Bug maybe?
|
|
|
12-20-2019, 09:50 AM
|
#649
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
What version of the library are you using? It is a bug, but one that I added a fix for a month ago. (v2.16.10)
Here's the code; it's entirely possible I made a logic error:
Code:
if newval ~= nil then
if type(newval) == "table" then
for k, v in pairs(newval) do
self.optsel[tonumber(k)] = v
end
self:redraw()
elseif type(newval) == "boolean" and #self.optarray == 1 then
self.optsel[1] = newval
self:redraw()
end
else
...
|
|
|
12-20-2019, 02:50 PM
|
#650
|
Human being with feelings
Join Date: Sep 2019
Posts: 1,146
|
Through ReaTrak i finally have discovered the possibility of making custom toolbars and drop-down menus with this great Lokasenna's library.
My question is if there's a way to define in the code line breaks for menu items with long names.
|
|
|
12-20-2019, 03:01 PM
|
#651
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Nope. Reaper uses native popup menus on Mac and Windows, and a pretend-native one on Linux, and none of those allow multiline items as far as I've ever seen.
In other news, v3 of the library will add a module specifically for making dealing with menus less of a hassle; no more parsing the string yourself, filtering out separators, etc.
|
|
|
12-20-2019, 03:06 PM
|
#652
|
Human being with feelings
Join Date: Sep 2019
Posts: 1,146
|
I see, thank you
|
|
|
12-22-2019, 02:42 AM
|
#653
|
Human being with feelings
Join Date: Jan 2010
Location: Fjugesta, Sweden
Posts: 813
|
Quote:
Originally Posted by Lokasenna
The Slider's val method expects a multiple of [i]inc/i] within its range - 0 to 10, in this case. I'm not sure what happens if you give it something like 5.125, but even assuming it does the right thing there you're still passing in the time difference rather than a value from 0 to 10. Try:
Code:
local progress = endTime - reaper.time_precise()
local length = endTime - startTime
local progress = math.floor(progress / length * GUI.elms.Slider1.steps)
GUI.Val("Slider1", progress )
|
Absolutly brilliant!! That did it!
Quote:
You could simplify things by just using a Frame and overriding its draw method to draw a progress bar using a percentage of its full width. Then you wouldn't have to worry about slider steps, range, etc.
|
I looked a bit on Frame but found that Slider looked better so Slider it be :-)
Thanks Lokasenna! Excellent solutions as always.
I wish you a Merry Christmas and a Happy New Year! Salut!
|
|
|
12-23-2019, 04:05 AM
|
#654
|
Human being with feelings
Join Date: Aug 2011
Posts: 522
|
Quote:
Originally Posted by Lokasenna
What version of the library are you using? It is a bug, but one that I added a fix for a month ago. (v2.16.10)
|
I must be on the latest one since i update Reapack quite often but..how do i check which exact version i have? At the first comments of the Core.lua file it says "Lokasenna_GUI 2.9 Core functionality"
Inspecting the file "Class - Options.lua" here i can see the snippet of code you just posted as it is though, no errors, yet i still cant set a single option checklist to false using GUI.Val.
EDIT: ok, I can see i have 2.16.10 in the Browse packages window of Reapack
Last edited by reapero; 12-23-2019 at 04:36 AM.
|
|
|
12-27-2019, 10:39 AM
|
#655
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Whoops; the bug fix only worked if you set the value directly using GUI.elms.my_checklist:val(false). Updating now.
|
|
|
12-28-2019, 01:09 PM
|
#656
|
Human being with feelings
Join Date: Sep 2019
Posts: 1,146
|
Maybe my question is not specific for the GUI library and applies to general scripting techniques, but since it's inspired by my experience with the Menubar element i'll dare to ask here
Is there a way, preferably simple, since i'm coding illiterate, to force the drop-down menu to stay on after a menu item has been clicked?
|
|
|
12-28-2019, 02:58 PM
|
#657
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Nope.
The dropdown menu is completely handled by Reaper; scripts just tell it where the labels, folders, separators, etc are. Scripts are also paused until the user picks something.
|
|
|
12-28-2019, 03:44 PM
|
#658
|
Human being with feelings
Join Date: Sep 2019
Posts: 1,146
|
OK, thank you for the info
|
|
|
01-09-2020, 07:26 AM
|
#660
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by MusoBob
|
I don't know C++ either.
|
|
|
01-11-2020, 04:46 AM
|
#661
|
Human being with feelings
Join Date: Sep 2008
Location: Sweden
Posts: 7,432
|
Strange behavior on resize...
Maybe I am doing something wrong, but I get very strange behavior on resize.
First of all, I have to click one of the text boxes before getting any response to the resize. But then, after having clicked on, after resize some strange frame is painted on the non-focused text box.
This code
Code:
-- Standard code for loading the library removed
GUI.name = SCRIPT_NAME
GUI.x, GUI.y, GUI.w, GUI.h = ORIG_X, ORIG_Y, ORIG_W, ORIG_H
GUI.anchor, GUI.corner = "screen", "TL"
GUI.New("txted_text", "TextEditor", 1, 10, 10, ORIG_W-20, (ORIG_H-20)/2, "Select an item\nor two\nor three\nor everything\n\nin the list\nand click the button!")
GUI.New("texted2", "TextEditor", 1, 10, 20+(ORIG_H-20)/2, ORIG_W-20, (ORIG_H-20)/2, "Another text editor...")
function resize()
GUI.elms.txted_text.w = GUI.cur_w - 20
GUI.elms.texted2.w = GUI.cur_w - 20
end -- resize()
GUI.onresize = resize
GUI.Init()
GUI.Main()
This is v 2.16.11
__________________
// MVHMF
I never always did the right thing, but all I did wasn't wrong...
|
|
|
01-12-2020, 09:03 AM
|
#662
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
When you resize the elements you also need to reinitialize them. Should just be:
Code:
function resize()
GUI.elms.txted_text.w = GUI.cur_w - 20
GUI.elms.texted2.w = GUI.cur_w - 20
GUI.elms.txted_text:init()
GUI.elms.texted2:init()
end
For most of the elements, when they're initialized they take a graphics buffer and draw their various parts to it. In the text editor's case, it draws its frame and then, right next to it, the same thing with the green "active" highlight.
When the GUI tells it to draw itself, it copies the appropriate area from that buffer. What you're seeing is it copying based on the new width but the source image was drawn at the original size, so it ends up taking some of the highlighted one as well.
Edit: You'll need to :redraw() both elements as well, I think, to have it updated right away.
Last edited by Lokasenna; 01-12-2020 at 09:08 AM.
|
|
|
01-13-2020, 08:54 PM
|
#663
|
Human being with feelings
Join Date: Sep 2018
Location: China
Posts: 565
|
Is there any way to refresh the menubox option?
For example, the origin option is "A,B,C". Now if I change it to "A,B,C,D,E", how can I change the GUI of menubox without re-runing?
|
|
|
01-14-2020, 07:25 AM
|
#664
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by dsyrock
Is there any way to refresh the menubox option?
For example, the origin option is "A,B,C". Now if I change it to "A,B,C,D,E", how can I change the GUI of menubox without re-runing?
|
Should be:
Code:
myMenubox.optarray = {"A", "B", "C", "D", "E"}
|
|
|
01-19-2020, 05:01 PM
|
#665
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
After slogging through documentation for a couple of months, I've come to the conclusion that it would be best to make v3 available for people to start testing in the meantime.
So...
"Lokasenna_Scythe library v3" is now available on ReaPack!!
Or you can clone the repository yourself and run the install script (it's in /library) from there.
Repository: https://github.com/jalovatt/scythe
Documentation (work in progress): https://jalovatt.github.io/scythe/
I'm working on docs for all of the element classes at the moment, after which I'll start moving over a bunch of content from the v2 wiki.
Last edited by Lokasenna; 01-20-2020 at 09:18 AM.
|
|
|
01-20-2020, 12:43 AM
|
#666
|
Human being with feelings
Join Date: May 2015
Location: Québec, Canada
Posts: 4,968
|
Quote:
Originally Posted by Lokasenna
Note: For the moment it's marked as a pre-release, so in ReaPack -> Manage repositories -> Options you'll have to check 'Enable pre-releases globally".
|
In addition to that, the Scythe packages can alternatively be installed from the package browser (in case enabling all pre-releases globally via the bleeding edge mode option is not desired). Doing so enables pre-release updates only for those two packages until their next stable version.
Last edited by cfillion; 01-20-2020 at 12:51 AM.
|
|
|
01-20-2020, 01:56 AM
|
#667
|
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 9,900
|
Thx for the release and well done !
One error in demo script:
Script: Scythe_Example - Working with Images.lua
error:
Code:
image.lua:31: Couldn't load image: C:\Users\USER\AppData\Roaming\REAPER\Scripts\ReaTeam Scripts\Lokasenna_Scythe library v3\development\examples\Working with Images/guybrush small.png
Also, not sure what Script: Scythe_Test Runner.lua is supposed to do but I think there is wrong path somewhere
Code:
Running tests...
Failed to load test file:
C:\Users\Anymord\AppData\Roaming\REAPER\Scripts\ReaTeam Scripts\Lokasenna_Scythe library v3\development\testing\
...
Side note,
In the text list demo script
Quote:
It was the day my grandmother exploded.
|
Quote:
They shoot the white girl first.
|
What an odd choice of quotes ! ^^
|
|
|
01-20-2020, 09:19 AM
|
#668
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by cfillion
In addition to that, the Scythe packages can alternatively be installed from the package browser (in case enabling all pre-releases globally via the bleeding edge mode option is not desired). Doing so enables pre-release updates only for those two packages until their next stable version.
|
Ah, thank you.
|
|
|
01-20-2020, 09:23 AM
|
#669
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by X-Raym
Thx for the release and well done !
One error in demo script:
Script: Scythe_Example - Working with Images.lua
|
Oops, fixing. I copied some "get all of the files" code from a separate script and forgot that it was filtering for only Lua files. :/
Quote:
Also, not sure what Script: Scythe_Test Runner.lua is supposed to do but I think there is wrong path somewhere
|
You need to load a test file - use the button on the right. There's an example in /development/testing, and tests for the public modules in /development/testing/public.
Making a note to have it default to the example file though.
Quote:
Side note,
In the text list demo script
...
What an odd choice of quotes ! ^^
|
They're the opening paragraphs from a random set of famous novels. I guess people dying is a great way to start your book.
|
|
|
02-09-2020, 03:27 PM
|
#670
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Update: v3.0.0 has been released on ReaPack. Yay!
I'll make a separate thread for it when I get a chance, but you can have a look at the documentation at https://jalovatt.github.io/scythe.
|
|
|
02-09-2020, 03:51 PM
|
#671
|
Human being with feelings
Join Date: Sep 2014
Posts: 2,643
|
Thanks for 3 will check it out !
Quote:
Originally Posted by Lokasenna
I don't know C++ either.
|
Hopefully they will implement some GUI elements now
https://discourse.ardour.org/t/is-op...s-really-want/
|
|
|
02-09-2020, 04:17 PM
|
#672
|
Human being with feelings
Join Date: Apr 2013
Location: France
Posts: 9,900
|
This website documentation is very welcome !
|
|
|
02-09-2020, 05:09 PM
|
#673
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
Quote:
Originally Posted by X-Raym
This website documentation is very welcome !
|
Nobody ever seemed to find the wiki for v2, and this gives me way more control over everything.
|
|
|
02-21-2020, 08:39 AM
|
#674
|
Human being with feelings
Join Date: Sep 2019
Location: Berlin
Posts: 62
|
hidpi fuzziness
Hello,
Thanks for your amazing work on this library. I thought about rolling my own GUI work but realised quickly that is not a simple task. I'm using your lib now and its incredibly helpful. I was wondering are the widgets meant to accomodate high resolution screens as my retina MBP draws quite fuzzy. Perhaps I'm missing something with how the GUI is initialised or perhaps I can be pointed in the right direction for fixing this.
Again, I don't meant to say this to undermine the hard work - i'm blown away!
|
|
|
02-21-2020, 09:14 AM
|
#675
|
Human being with feelings
Join Date: Sep 2008
Location: Calgary, AB, Canada
Posts: 6,551
|
There's no high-DPI support at the moment - everything is drawn in regular old pixels, and nothing is scaled on larger screens.
It's one of the top items on my to-do list though.
|
|
|
02-27-2020, 10:31 AM
|
#676
|
Human being with feelings
Join Date: Mar 2019
Posts: 428
|
Awesome work on the new documentation, looks really nice!
I have found a bug while playing around, buttons seem to get stuck if you spam click them: https://streamable.com/1ewm1
|
|
|
03-09-2020, 07:14 AM
|
#677
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,458
|
I have created this simple slider using the GUI Builder:
Code:
-- Script generated by Lokasenna's GUI Builder
local lib_path = reaper.GetExtState("Lokasenna_GUI", "lib_path_v2")
if not lib_path or lib_path == "" then
reaper.MB("Couldn't load the Lokasenna_GUI library. Please install 'Lokasenna's GUI library v2 for Lua', available on ReaPack, then run the 'Set Lokasenna_GUI v2 library path.lua' script in your Action List.", "Whoops!", 0)
return
end
loadfile(lib_path .. "Core.lua")()
GUI.req("Classes/Class - Slider.lua")()
-- If any of the requested libraries weren't found, abort the script.
if missing_lib then return 0 end
GUI.name = "Test Contrast"
GUI.x, GUI.y, GUI.w, GUI.h = 0, 0, 288, 76
GUI.anchor, GUI.corner = "screen", "C"
GUI.New("Contrast", "Slider", {
z = 11,
x = 16,
y = 32,
w = 255,
caption = "Contrast",
min = -127,
max = 127,
defaults = {127},
inc = 1,
dir = "h",
font_a = 2,
font_b = 3,
col_txt = "txt",
col_fill = "elm_fill",
bg = "wnd_bg",
show_handles = true,
show_values = true,
cap_x = 0,
cap_y = 0
})
GUI.Init()
GUI.Main()
Before this code I have created a function with one argument. What should be add to the script code so that the following happens? :
- if user moves the slider, and only when the mouse button is released, then the current value of the slider is compared to the value when the mouse button was pressed, and if they are different, only then the function is run taking as an argument the current slider value.
Thanks!
Last edited by amagalma; 03-11-2020 at 05:38 PM.
|
|
|
03-11-2020, 05:48 PM
|
#678
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,458
|
Using V2.x...
When I programmatically set an item selected in a ListBox:
Code:
GUI.Val("my_listbox", 4)
the correct item (fourth) gets selected. But when I try to get the value, it is still the previous one:
Code:
function FUNC()
Sel = GUI.Val("my_listbox")
end
GUI.func = FUNC
Sel is still the previous value (1), while it should be 4. It changes only when I click an item.
I hope you understand what I mean... Why is that? Is it a bug or am I doing something wrong?
Last edited by amagalma; 03-12-2020 at 04:19 PM.
|
|
|
03-12-2020, 01:53 AM
|
#679
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,458
|
I had to do this so that I always get the correct value:
Code:
function FUNC()
-- get selected item
for k in pairs(GUI.elms.my_listbox.retval) do
if GUI.elms.my_listbox.retval[k] then
selected = k
end
end
end
GUI.func = FUNC
Is this the right way? Or could it be done better?
Last edited by amagalma; 03-12-2020 at 04:19 PM.
|
|
|
03-12-2020, 04:18 PM
|
#680
|
Human being with feelings
Join Date: Apr 2011
Posts: 3,458
|
You can ignore my questions as I found solutions
|
|
|
Thread Tools |
|
Display Modes |
Linear Mode
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
All times are GMT -7. The time now is 04:18 AM.
|