Compare commits
177 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
dbed09cb55 | ||
![]() |
9f3ebb0036 | ||
![]() |
ddb5e58057 | ||
![]() |
4e5707720b | ||
![]() |
e9628187f2 | ||
![]() |
c8f9cdd6fa | ||
![]() |
7cfa9c38e0 | ||
![]() |
7cc368305f | ||
![]() |
682694cc07 | ||
![]() |
12c4677912 | ||
![]() |
0e0ae6c083 | ||
![]() |
49d62b8225 | ||
![]() |
0909e186a1 | ||
![]() |
3557879361 | ||
![]() |
fa317c534d | ||
![]() |
119abec1cf | ||
![]() |
92beee10d3 | ||
![]() |
c110f32993 | ||
![]() |
a18970dceb | ||
![]() |
d3d3294277 | ||
![]() |
ef7f94ac76 | ||
![]() |
9fcc4c7355 | ||
![]() |
751cb0ca8b | ||
![]() |
3343919c92 | ||
![]() |
4eb7668922 | ||
![]() |
c706dc12fe | ||
![]() |
1f272b7aba | ||
![]() |
09d830d02e | ||
![]() |
d7429c201c | ||
![]() |
939e16c59a | ||
![]() |
fe585d27d8 | ||
![]() |
e9352fe811 | ||
![]() |
a52c938fef | ||
![]() |
153cf3e859 | ||
![]() |
6b46370d1a | ||
![]() |
c2ff89b2cf | ||
![]() |
2a57a5f7d0 | ||
![]() |
32d1ed5c6a | ||
![]() |
6d8d319557 | ||
![]() |
9e0ddb08e3 | ||
![]() |
74979ca16a | ||
![]() |
0c77179c46 | ||
![]() |
935b9e4cd6 | ||
![]() |
0f362f80e3 | ||
![]() |
0b5654f870 | ||
![]() |
4ec5048730 | ||
![]() |
6b8e810466 | ||
![]() |
9b3e0a324c | ||
![]() |
f7531383f3 | ||
![]() |
7724b8059d | ||
![]() |
2ada93db9c | ||
![]() |
d070711409 | ||
![]() |
5909634837 | ||
![]() |
07ac5c27ca | ||
![]() |
9f7aafac0b | ||
![]() |
12b3bd4ee0 | ||
![]() |
9e30c39035 | ||
![]() |
3dbcb1daee | ||
![]() |
a9d4fd5e1e | ||
![]() |
07f8e6fca9 | ||
![]() |
f0ed0bad13 | ||
![]() |
8fccc1eb63 | ||
![]() |
62d2a22ab8 | ||
![]() |
10438c21ff | ||
![]() |
ec99d35cee | ||
![]() |
85fe5867f3 | ||
![]() |
1a77473e13 | ||
![]() |
cc483fba5a | ||
![]() |
94686d3fe8 | ||
![]() |
468ac9cbd2 | ||
![]() |
9f8293a5a0 | ||
![]() |
ce9e443c60 | ||
![]() |
99b1ddf44c | ||
![]() |
c083d02bef | ||
![]() |
00253e46b3 | ||
![]() |
d2b7de3801 | ||
![]() |
adcf258551 | ||
![]() |
2df51622ba | ||
![]() |
a7d7667491 | ||
![]() |
0ad45d6826 | ||
![]() |
f23e70ff08 | ||
![]() |
b96be291bb | ||
![]() |
72b3403728 | ||
![]() |
b1964a1c10 | ||
![]() |
25fb3113fa | ||
![]() |
24acf8855f | ||
![]() |
06855dd1de | ||
![]() |
65d556ef4e | ||
![]() |
54b8e362d5 | ||
![]() |
45b41b88bd | ||
![]() |
1baad726ae | ||
![]() |
b19fb22146 | ||
![]() |
8dec9cd835 | ||
![]() |
50d3f83fce | ||
![]() |
41b2f9b911 | ||
![]() |
a02c091376 | ||
![]() |
01e6169cfb | ||
![]() |
1074b6b787 | ||
![]() |
d45fbcb10f | ||
![]() |
f334a03397 | ||
![]() |
3ce37dacbd | ||
![]() |
166eb7614f | ||
![]() |
8b3f3b11f0 | ||
![]() |
2d84fae2c8 | ||
![]() |
5204e3ac03 | ||
![]() |
547b18db9a | ||
![]() |
37f9d3e200 | ||
![]() |
4b24c78f0f | ||
![]() |
994f49b3c1 | ||
![]() |
79ee0e34ea | ||
![]() |
b295053662 | ||
![]() |
61059e66ec | ||
![]() |
f4de000646 | ||
![]() |
d20c263912 | ||
![]() |
07e40afa3d | ||
![]() |
8179915e06 | ||
![]() |
4f79a30689 | ||
![]() |
a58a3e90c8 | ||
![]() |
8d8f32b081 | ||
![]() |
9d866a3616 | ||
![]() |
0fbba70003 | ||
![]() |
598a7edf6b | ||
![]() |
b415b73b4a | ||
![]() |
b6d8ede854 | ||
![]() |
d64a682e74 | ||
![]() |
d080432e14 | ||
![]() |
8bd1293be7 | ||
![]() |
ce411ec871 | ||
![]() |
82a5989f5c | ||
![]() |
bb514d3acb | ||
![]() |
c96b717273 | ||
![]() |
d245b7fb29 | ||
![]() |
edde71fc09 | ||
![]() |
b7b8fdfd0c | ||
![]() |
8dc831088e | ||
![]() |
c07d448aac | ||
![]() |
57a330e589 | ||
![]() |
64437e4e1a | ||
![]() |
96f3bcb42b | ||
![]() |
c8b4566194 | ||
![]() |
d30ff220f6 | ||
![]() |
f0fbd4790f | ||
![]() |
cb1f28a3a3 | ||
![]() |
cc1e3c534e | ||
![]() |
f4f79f47bd | ||
![]() |
ff617c3fab | ||
![]() |
43524a9127 | ||
![]() |
48ff67dc06 | ||
![]() |
8bd154b604 | ||
![]() |
9da018fdff | ||
![]() |
4f4788c1c3 | ||
![]() |
d0d8c9a081 | ||
![]() |
f3b5adbf40 | ||
![]() |
38c9b6b0b2 | ||
![]() |
79be0eca73 | ||
![]() |
9bd02ca8ba | ||
![]() |
f12ecd8404 | ||
![]() |
53803b2218 | ||
![]() |
67c2453c82 | ||
![]() |
455000c02d | ||
![]() |
a2684cce7c | ||
![]() |
27ae54d7d6 | ||
![]() |
aec577a4b4 | ||
![]() |
6f467d5a1b | ||
![]() |
e6c9e78935 | ||
![]() |
3750a85c5f | ||
![]() |
03de13d618 | ||
![]() |
1588bc4cae | ||
![]() |
b718ae0423 | ||
![]() |
a8f540cf29 | ||
![]() |
e6a1fabdd3 | ||
![]() |
291960d159 | ||
![]() |
20b68c6a42 | ||
![]() |
e4ba805e00 | ||
![]() |
93be0f975f | ||
![]() |
cbfeef39bc | ||
![]() |
d7dfa2220e |
@@ -1,7 +1,8 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
project(otclient)
|
||||
|
||||
set(VERSION "0.6.5")
|
||||
set(VERSION "0.6.6")
|
||||
set(LIB_NAME "otc_framework")
|
||||
|
||||
option(FRAMEWORK_SOUND "Use SOUND " ON)
|
||||
option(FRAMEWORK_GRAPHICS "Use GRAPHICS " ON)
|
||||
@@ -35,11 +36,20 @@ endif()
|
||||
|
||||
add_definitions(-D"VERSION=\\"${VERSION}\\"")
|
||||
|
||||
# we want framework to be a library for faster compilation/linking
|
||||
if(USE_STATIC_LIBS)
|
||||
add_library(${LIB_NAME} ${framework_SOURCES})
|
||||
else()
|
||||
add_library(${LIB_NAME} SHARED ${framework_SOURCES})
|
||||
message(STATUS "Linking to shared ${LIB_NAME}, make sure you copy the DLL/SO/dylib with the executable!")
|
||||
endif()
|
||||
target_link_libraries(${LIB_NAME} ${framework_LIBRARIES})
|
||||
|
||||
# add client executable
|
||||
add_executable(${PROJECT_NAME} ${framework_SOURCES} ${client_SOURCES} ${executable_SOURCES})
|
||||
add_executable(${PROJECT_NAME} ${client_SOURCES} ${executable_SOURCES})
|
||||
|
||||
# target link libraries
|
||||
target_link_libraries(${PROJECT_NAME} ${framework_LIBRARIES})
|
||||
target_link_libraries(${PROJECT_NAME} ${LIB_NAME})
|
||||
|
||||
if(USE_PCH)
|
||||
include(cotire)
|
||||
@@ -51,7 +61,10 @@ endif()
|
||||
|
||||
# installation
|
||||
set(DATA_INSTALL_DIR share/${PROJECT_NAME})
|
||||
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
|
||||
install(TARGETS ${PROJECT_NAME} ${LIB_NAME}
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib
|
||||
ARCHIVE DESTINATION lib)
|
||||
install(FILES README.md BUGS LICENSE AUTHORS init.lua ${PROJECT_NAME}rc.lua DESTINATION ${DATA_INSTALL_DIR})
|
||||
install(DIRECTORY data modules DESTINATION ${DATA_INSTALL_DIR} PATTERN ".git" EXCLUDE)
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
[](http://travis-ci.org/edubart/otclient)
|
||||
[](http://travis-ci.org/edubart/otclient)
|
||||
### What is otclient?
|
||||
|
||||
Otclient is an alternative Tibia client for usage with otserv. It aims to be complete and flexible,
|
||||
@@ -10,13 +10,15 @@ Otclient is written in C++2011, the upcoming C++ standard and heavily scripted i
|
||||
|
||||
### Where do I download?
|
||||
|
||||
The latest commits compiled for Windows can be found here.
|
||||
* [Windows Builds](http://otland.net/threads/otclient-builds-windows.217977/)
|
||||
|
||||
Here is the latest v0.6.5 release compiled for both i686(32 bit) and x86_64(64 bit) machines, with OpenGL renderer.
|
||||
This release is compatible with protocols ranges from 7.60 up to 10.31.
|
||||
|
||||
* [For Windows](https://www.dropbox.com/sh/se1okacemoqzjve/XFqFoSKLCg/otclient-win-0.6.5.zip)
|
||||
* [For Linux](https://www.dropbox.com/sh/se1okacemoqzjve/xKJL7j6vEo/otclient-linux-0.6.5.tar.gz)
|
||||
|
||||
**NOTE:** You will need to download spr/dat files on your own and place them in `data/things/VER/` (i.e: `data/things/1031/Tibia.spr`)
|
||||
**NOTE:** You will need to download spr/dat files on your own and place them in `data/things/VERSION/` (i.e: `data/things/1041/Tibia.spr`)
|
||||
|
||||
Older releases can be downloaded from [here](https://www.dropbox.com/sh/se1okacemoqzjve/-oWK4YFm03)
|
||||
|
||||
|
BIN
data/images/game/npcicons/icon_chat.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
data/images/game/npcicons/icon_quest.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
data/images/game/npcicons/icon_trade.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
data/images/game/npcicons/icon_tradequest.png
Normal file
After Width: | Height: | Size: 795 B |
BIN
data/images/game/slots/purse.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
data/images/game/viplist/icons.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
data/images/game/viplist/vipcheckbox.png
Normal file
After Width: | Height: | Size: 349 B |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 409 B After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 409 B After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 281 B After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 470 B After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 548 B After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 457 B After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 241 B After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 197 B After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 646 B After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 673 B After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 696 B After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 415 B After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 197 B After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 18 KiB |
@@ -6,7 +6,7 @@ locale = {
|
||||
name = "es",
|
||||
charset = "cp1252",
|
||||
languageName = "Espa<EFBFBD>ol",
|
||||
|
||||
|
||||
translation = {
|
||||
["1a) Offensive Name"] = "1a) Nombre ofensivo",
|
||||
["1b) Invalid Name Format"] = "1b) Formato invalido para nombre",
|
||||
@@ -34,8 +34,8 @@ locale = {
|
||||
["Add"] = "A<EFBFBD>adir",
|
||||
["Add new VIP"] = "A<EFBFBD>adir nuevo VIP",
|
||||
["Addon 1"] = "Addon 1",
|
||||
["Addon 2"] = "Addon 1",
|
||||
["Addon 3"] = "Addon 1",
|
||||
["Addon 2"] = "Addon 2",
|
||||
["Addon 3"] = "Addon 3",
|
||||
["Add to VIP list"] = "A<EFBFBD>adir a lista VIP",
|
||||
["Adjust volume"] = "Ajustar volumen",
|
||||
["Alas! Brave adventurer, you have met a sad fate.\nBut do not despair, for the gods will bring you back\ninto this world in exchange for a small sacrifice\n\nSimply click on Ok to resume your journeys!"] = "<EFBFBD>Ay! Aventurero valiente, has conocido un triste destino. \nPero no se desespere, porque los dioses te llevar<61>n de vuelta \na este mundo a cambio de un peque<75>o sacrificio \n\nSimplemente haga clic en Aceptar para continuar con sus viajes!",
|
||||
@@ -154,7 +154,7 @@ locale = {
|
||||
["Hide spells for higher exp. levels"] = "Ocultar hechizos para niveles mas altos que tu experiencia.",
|
||||
["Hide spells for other vocations"] = "Ocultar hechizos que sean para otra vocaci<63>n",
|
||||
["Hit Points"] = "Puntos de vida",
|
||||
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Mantenga presionado el bot<6F>n derecho del rat<61>n para navegar\nDezplaze la rueda central del rat<61>n para ampliar\nbot<EFBFBD>n derecho del mouse para crear marcas del mapa",
|
||||
["Hold left mouse button to navigate\nScroll mouse middle button to zoom\nRight mouse button to create map marks"] = "Mantenga presionado el bot<6F>n derecho del rat<61>n para navegar\nDezplaze la rueda central del rat<61>n para ampliar\nbot<EFBFBD>n derecho del mouse para crear marcas del mapa",
|
||||
["Hotkeys"] = "Hotkeys",
|
||||
["If you shut down the program, your character might stay in the game.\nClick on 'Logout' to ensure that you character leaves the game properly.\nClick on 'Exit' if you want to exit the program without logging out your character."] = "Si se cierra el programa, tu personaje puede permanecer en el juego.\nHaga clic en 'Salir' para asegurarse de que personaje deja el juego correctamente.\nHaga click en 'Salir' si desea salir del programa sin tener que salir de tu personaje.",
|
||||
["Ignore"] = "Ignorar",
|
||||
@@ -374,5 +374,5 @@ locale = {
|
||||
["Don't stretch or shrink Game Window"] = "No estirar o encoger Ventana de Juego"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
modules.client_locales.installLocale(locale)
|
@@ -63,16 +63,16 @@ locale = {
|
||||
["Buy with backpack"] = "Kupuj z plecakami",
|
||||
["Cancel"] = "Anuluj",
|
||||
["Cannot login while already in game."] = "Nie mozna zalogowac gdy juz w grze",
|
||||
["Cap"] = false,
|
||||
["Cap"] = "Ladownosc",
|
||||
["Capacity"] = "Ladownosc",
|
||||
["Center"] = false,
|
||||
["Center"] = "Wysrodkuj",
|
||||
["Channels"] = "Kanaly",
|
||||
["Character List"] = "Lista postaci",
|
||||
["Classic control"] = "Klasyczne sterowaie",
|
||||
["Clear current message window"] = false,
|
||||
["Clear Messages"] = false,
|
||||
["Clear current message window"] = "Wyczysc bierzace okno",
|
||||
["Clear Messages"] = "Wyczysc wiadomosci",
|
||||
["Clear object"] = "Wyczysc obiekt",
|
||||
["Client needs update."] = false,
|
||||
["Client needs update."] = "Klient wymaga aktalizacji",
|
||||
["Close"] = "Zamknij",
|
||||
["Close this channel"] = "Zamknij kanal",
|
||||
["Club Fighting"] = "Walka obuchem",
|
||||
@@ -81,7 +81,7 @@ locale = {
|
||||
["Connecting to game server..."] = "Laczenie z serwerem gry...",
|
||||
["Connecting to login server..."] = "Laczenie z serwerem logowania...",
|
||||
["Console"] = "Konsola",
|
||||
["Cooldowns"] = false,
|
||||
["Cooldowns"] = "Czasy odnowienia",
|
||||
["Copy message"] = "Kopiuj wiadomosc",
|
||||
["Copy name"] = "Kopiuj imie",
|
||||
["Copy Name"] = "Kopiuj Imie",
|
||||
@@ -100,7 +100,7 @@ locale = {
|
||||
["Detail"] = "Szczegoly",
|
||||
["Details"] = "Szczegoly",
|
||||
["Disable Shared Experience"] = "Wylacz Dzielenie Doswiadczenia",
|
||||
["Dismount"] = false,
|
||||
["Dismount"] = "Zejdz z wierzchowca",
|
||||
["Display connection speed to the server (milliseconds)"] = "Wyswietl ping do serwera (ms)",
|
||||
["Distance Fighting"] = "Walka na odleglosc",
|
||||
["Don't stretch/shrink Game Window"] = "Nie rozszerzaj/zwezaj Okna Gry",
|
||||
@@ -109,7 +109,7 @@ locale = {
|
||||
["Edit Text"] = "Edytuj tekst",
|
||||
["Enable music"] = "Odtwarzaj muzyke",
|
||||
["Enable Shared Experience"] = "Wlacz dzielenie doswiadczenia",
|
||||
["Enable smart walking"] = false,
|
||||
["Enable smart walking"] = "Wlacz inteligentne chodzenie",
|
||||
["Enable vertical synchronization"] = "Wlacz synchronizacje pionowa",
|
||||
["Enable walk booster"] = false,
|
||||
["Enter Game"] = "Wejdz do gry",
|
||||
@@ -118,7 +118,7 @@ locale = {
|
||||
["Error"] = "Blad",
|
||||
["Excessive Unjustified Player Killing"] = "Nadmierne Nieusprawiedliwione Zabijanie Graczy",
|
||||
["Exclude from private chat"] = "Wyrzuc w prywatnej konwersacji",
|
||||
["Exit"] = false,
|
||||
["Exit"] = "Wyjdz",
|
||||
["Experience"] = "Doswiadczenie",
|
||||
["Filter list to match your level"] = "Wyswietl tylko odpowiednie dla mojego poziomu",
|
||||
["Filter list to match your vocation"] = "Wyswietl tylko odpowiednie dla mojej klasy",
|
||||
@@ -127,7 +127,7 @@ locale = {
|
||||
["Fist Fighting"] = "Walka wrecz",
|
||||
["Follow"] = "Podazaj",
|
||||
["Force Exit"] = "Wymus Zamkniecie",
|
||||
["For Your Information"] = false,
|
||||
["For Your Information"] = "Dla twojej informacji",
|
||||
["Free Account"] = "Darmowe Konto",
|
||||
["Fullscreen"] = "Pelen ekran",
|
||||
["Game"] = "Gra",
|
||||
@@ -136,9 +136,9 @@ locale = {
|
||||
["Graphics card driver not detected"] = "Nie wykryto karty graficznej",
|
||||
["Graphics Engine:"] = "Silnik graficzny:",
|
||||
["Head"] = "Glowa",
|
||||
["Healing"] = false,
|
||||
["Health Info"] = false,
|
||||
["Health Information"] = false,
|
||||
["Healing"] = "Leczenie",
|
||||
["Health Info"] = "Info o zyciu",
|
||||
["Health Information"] = "Informacje o zyciu",
|
||||
["Hide monsters"] = "Ukryj potwory",
|
||||
["Hide non-skull players"] = "Ukryj graczy bez skulla",
|
||||
["Hide Npcs"] = "Ukryj NPCe",
|
||||
@@ -183,16 +183,16 @@ locale = {
|
||||
["Magic Level"] = "Poziom Magiczny",
|
||||
["Make sure that your client uses\nthe correct game protocol version"] = "Upewnij sie, ze twoj klient\nuzywa wlasciwego protokolu gry.",
|
||||
["Mana"] = "Mana",
|
||||
["Manage hotkeys:"] = "Skonfiguruj hotkeye:",
|
||||
["Manage hotkeys:"] = "Zarzadzaj hotkeyami:",
|
||||
["Market"] = false,
|
||||
["Market Offers"] = false,
|
||||
["Market Offers"] = "Oferty",
|
||||
["Message of the day"] = "Wiadomosc dnia",
|
||||
["Message to "] = "Wiadomosc do ",
|
||||
["Message to %s"] = "Wiadomosc do %s",
|
||||
["Minimap"] = "Minimapa",
|
||||
["Module Manager"] = "Menedzer modulow",
|
||||
["Module name"] = "Nazwa modulu",
|
||||
["Mount"] = false,
|
||||
["Mount"] = "Wierzchowiec",
|
||||
["Move Stackable Item"] = "Przenies przedmiot",
|
||||
["Move up"] = "Przenies wyzej",
|
||||
["My Offers"] = "Moje Oferty",
|
||||
@@ -221,13 +221,13 @@ locale = {
|
||||
["Open new channel"] = "Otworz nowy kanal",
|
||||
["Options"] = "Opcje",
|
||||
["Overview"] = "Podsumowanie",
|
||||
["Pass Leadership to %s"] = "Przekaz przywodztwo %s",
|
||||
["Pass Leadership to %s"] = "Oddaj przywodztwo %s",
|
||||
["Password"] = "Haslo",
|
||||
["Piece Price:"] = false,
|
||||
["Piece Price:"] = "Cena jednego przedmiotu",
|
||||
["Please enter a character name:"] = "Podaj nazwe postaci:",
|
||||
["Please, press the key you wish to add onto your hotkeys manager"] = "Nacisnij klawisz, ktory chcesz dodac do menedzera skrotow klawiszowych",
|
||||
["Please Select"] = false,
|
||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = false,
|
||||
["Please Select"] = "Prosze wybrac",
|
||||
["Please use this dialog to only report bugs. Do not report rule violations here!"] = "Zglaszaj tylko bledy gry, nie lamanie zasad",
|
||||
["Please wait"] = "Prosze czekac",
|
||||
["Port"] = "Port",
|
||||
["Position:"] = "Pozycja:",
|
||||
@@ -237,21 +237,21 @@ locale = {
|
||||
["Primary"] = "Podstawowy",
|
||||
["Protocol"] = "Protokol",
|
||||
["Quest Log"] = "Dziennik Misji",
|
||||
["Randomize"] = false,
|
||||
["Randomize characters outfit"] = false,
|
||||
["Randomize"] = "Losuj",
|
||||
["Randomize characters outfit"] = "Ustaw losowy wyglad",
|
||||
["Reason:"] = "Powod:",
|
||||
["Refresh"] = "Odswiez",
|
||||
["Refresh Offers"] = "Odswiez Oferty",
|
||||
["Regeneration Time"] = "Czas Regeneracji",
|
||||
["Reject"] = "Odrzuc",
|
||||
["Reload All"] = "Przeladuj Wszystko",
|
||||
["Reload All"] = "Zaladuj ponownie wszystko",
|
||||
["Remember account and password when starts client"] = "Zapamietaj identyfikator konta oraz haslo",
|
||||
["Remember password"] = "Zapamietaj haslo",
|
||||
["Remove"] = "Usun",
|
||||
["Remove %s"] = "Usun %s",
|
||||
["Report Bug"] = "Zglos Blad",
|
||||
["Reserved for more functionality later."] = "Zarezerowane dla przyszlych funkcjonalnosci.",
|
||||
["Reset Market"] = false,
|
||||
["Reset Market"] = "Zaladuj market ponownie",
|
||||
["Revoke %s's Invitation"] = "Odmow na zaproszenie gracza %s",
|
||||
["Rotate"] = "Obroc",
|
||||
["Rule Violation"] = "Zlamanie Regul",
|
||||
@@ -275,7 +275,7 @@ locale = {
|
||||
["Shielding"] = "Obrona tarcza",
|
||||
["Show all items"] = "Pokaz wszystkie przedmioty",
|
||||
["Show connection ping"] = "Wyswietl ping",
|
||||
["Show Depot Only"] = false,
|
||||
["Show Depot Only"] = "Pokaz tylko przedmioty z depozytu",
|
||||
["Show event messages in console"] = "Pokaz wydarzenia w konsoli",
|
||||
["Show frame rate"] = "Pokaz FPS",
|
||||
["Show info messages in console"] = "Pokaz informacje w konsoli",
|
||||
@@ -288,17 +288,17 @@ locale = {
|
||||
["Show status messages in console"] = "Pokaz status w konsoli",
|
||||
["Show Text"] = "Pokaz Tekst",
|
||||
["Show timestamps in console"] = "Pokaz znaczniki czasu w konsoli",
|
||||
["Show your depot items only"] = false,
|
||||
["Show your depot items only"] = "Pokaz tylko przedmioty z depozytu",
|
||||
["Skills"] = "Umiejetnosci",
|
||||
["Soul"] = "Dusze",
|
||||
["Soul Points"] = "Punkty Duszy",
|
||||
["Special"] = false,
|
||||
["Soul Points"] = "Punktey Duszy",
|
||||
["Special"] = "Specialne",
|
||||
["Speed"] = "Predkosc",
|
||||
["Spell Cooldowns"] = false,
|
||||
["Spell Cooldowns"] = "Czas odnowienia czaru",
|
||||
["Spell List"] = "Lista Zaklec",
|
||||
["Stamina"] = "Wytrzymalosc",
|
||||
["Statement:"] = false,
|
||||
["Statement Report"] = false,
|
||||
["Statement:"] = "Wyrazenie",
|
||||
["Statement Report"] = "Reportuj wyrazenie",
|
||||
["Statistics"] = "Statystki",
|
||||
["Stop Attack"] = "Anuluj atak",
|
||||
["Stop Follow"] = "Przestan podazac",
|
||||
@@ -311,7 +311,7 @@ locale = {
|
||||
["Terminal"] = "Terminal",
|
||||
["There is no way."] = "Nie ma drogi.",
|
||||
["Title"] = "Tytul",
|
||||
["Total Price"] = "Cena sumaryczna",
|
||||
["Total Price"] = "Cena calosci",
|
||||
["Trade"] = "Handel",
|
||||
["Trade with ..."] = "Handluj z ...",
|
||||
["Trying to reconnect in %s seconds."] = "Ponowna proba laczenia za %s sekund.",
|
||||
@@ -320,15 +320,15 @@ locale = {
|
||||
["Unable to logout."] = "Nie mozna sie wylogowac.",
|
||||
["Unignore"] = "Anuluj Ignorowanie",
|
||||
["Unload"] = "Wylacz",
|
||||
["Update needed"] = false,
|
||||
["Update needed"] = "Wymagana aktualizacja",
|
||||
["Use"] = "Uzyj",
|
||||
["Use on target"] = "Uzyj na celu",
|
||||
["Use on yourself"] = "Uzyj na sobie",
|
||||
["Use with ..."] = "Uzyj z ...",
|
||||
["Version"] = "Wersja",
|
||||
["VIP List"] = "Lista VIP",
|
||||
["Voc."] = false,
|
||||
["Vocation"] = "Klasa",
|
||||
["Voc."] = "Profesja",
|
||||
["Vocation"] = "Profesja",
|
||||
["Waiting List"] = "Lista Oczekujacych",
|
||||
["Website"] = "Strona:",
|
||||
["Weight:"] = "Waga:",
|
||||
@@ -339,14 +339,14 @@ locale = {
|
||||
["You are burning"] = "Palisz sie",
|
||||
["You are cursed"] = "Jestes przeklety",
|
||||
["You are dazzled"] = "Jestes oslepiony",
|
||||
["You are dead."] = "Zginales marnie.",
|
||||
["You are dead."] = "Jestes martwy.",
|
||||
["You are dead"] = "Jestes martwy",
|
||||
["You are drowning"] = "Topisz sie",
|
||||
["You are drunk"] = "Caly swiat wiruje",
|
||||
["You are drunk"] = "Jestes pijany",
|
||||
["You are electrified"] = "Jestes porazony pradem",
|
||||
["You are freezing"] = "Marzniesz",
|
||||
["You are hasted"] = "Zapieprzasz",
|
||||
["You are hungry"] = "Burczy ci w brzuchu",
|
||||
["You are freezing"] = "Zamarzasz",
|
||||
["You are hasted"] = "Masz zwiekszona predkosc ruchu",
|
||||
["You are hungry"] = "Jestes glodny",
|
||||
["You are paralysed"] = "Jestes sparalizowany",
|
||||
["You are poisoned"] = "Jestes zatruty",
|
||||
["You are protected by a magic shield"] = "Jestes chroniony magiczna tarcza",
|
||||
@@ -363,52 +363,52 @@ locale = {
|
||||
["Your Capacity:"] = "Twoja Ladownosc:",
|
||||
["You read the following, written by \n%s\n"] = false,
|
||||
["You read the following, written on \n%s.\n"] = false,
|
||||
["Your Money:"] = false,
|
||||
["Enable dash walking"] = false,
|
||||
["Your Money:"] = "Twoje pieniadze",
|
||||
["Enable dash walking"] = "Wlacz szybsze chodzenie (dash walking)",
|
||||
["Will boost your walk on high speed characters"] = "Przyspieszy poruszanie sie postaci o wysokiej predkosci",
|
||||
["Display creature names"] = "Wyswietlaj nazwy potworow",
|
||||
["Display creature health bars"] = "Wyswietlaj paski zycia potworow",
|
||||
["Display text messages"] = "Wyswietlaj wiadomosci tekstowe",
|
||||
["Change language"] = "Zmien jezyk",
|
||||
["Enable lights"] = "Odblokuj oswietlenie",
|
||||
["Enable audio"] = "Odblokuj dzwiek",
|
||||
["Enable music sound"] = "Odblokuj muzyke",
|
||||
["Enable lights"] = "Wlacz oswietlenie",
|
||||
["Enable audio"] = "Wlacz dzwiek",
|
||||
["Enable music sound"] = "Wlacz muzyke",
|
||||
["Music volume: %d"] = "Glosnosc muzyki: %d",
|
||||
["Audio"] = "Dzwiek",
|
||||
["Server List"] = "Lista serwerow",
|
||||
["Server list"] = "Lista serwerow",
|
||||
["Client Version"] = "Wersja klienta",
|
||||
["Add new server"] = "Dodaj nowy serwer",
|
||||
["Select"] = "Wybierz",
|
||||
["New Server"] = "Nowy serwer",
|
||||
["Host"] = false,
|
||||
["Reset All"] = "Ustaw domyslne",
|
||||
["Disable chat mode, allow to walk using ASDW"] = "Zablokuj tryb rozmow, zezwol na poruszanie sie za pomoca klawiszy ADSW",
|
||||
["Name"] = "Imie",
|
||||
["Price"] = "Cena",
|
||||
["Your Money"] = "Twoje fundusze",
|
||||
["Weight"] = "Waga",
|
||||
["Your Capacity"] = "Twoj udzwig",
|
||||
["Search"] = "Szukaj",
|
||||
["Sell All"] = "Sprzedaj wszystko",
|
||||
["Statement"] = false,
|
||||
["Reason"] = "Powod",
|
||||
["Action"] = "Akcja",
|
||||
["Comment"] = "Komentarz",
|
||||
["Balance"] = false,
|
||||
["Offer Type"] = "Typ oferty",
|
||||
["Piece Price"] = false,
|
||||
["Find"] = "Szukaj",
|
||||
["Formula"] = "Formula",
|
||||
["Group"] = "Groupa",
|
||||
["Type"] = "Typ",
|
||||
["Cooldown"] = false,
|
||||
["Premium"] = false,
|
||||
["Any"] = "Dowolny",
|
||||
["Sorcerer"] = "Czarodziej",
|
||||
["Druid"] = false,
|
||||
["Paladin"] = "Paladyn",
|
||||
["Knight"] = "Rycerz"
|
||||
["Audio"] = "Dzwiek",
|
||||
["Server List"] = "Lista serwerow",
|
||||
["Server list"] = "Lista serwerow",
|
||||
["Client Version"] = "Wersja klienta",
|
||||
["Add new server"] = "Dodaj nowy serwer",
|
||||
["Select"] = "Wybierz",
|
||||
["New Server"] = "Nowy serwer",
|
||||
["Host"] = false,
|
||||
["Reset All"] = "Ustaw domyslne",
|
||||
["Disable chat mode, allow to walk using ASDW"] = "Zablokuj tryb rozmow, zezwol na poruszanie sie za pomoca klawiszy ADSW",
|
||||
["Name"] = "Imie",
|
||||
["Price"] = "Cena",
|
||||
["Your Money"] = "Twoje fundusze",
|
||||
["Weight"] = "Waga",
|
||||
["Your Capacity"] = "Twoj udzwig",
|
||||
["Search"] = "Szukaj",
|
||||
["Sell All"] = "Sprzedaj wszystko",
|
||||
["Statement"] = "Stanowisko",
|
||||
["Reason"] = "Powod",
|
||||
["Action"] = "Akcja",
|
||||
["Comment"] = "Komentarz",
|
||||
["Balance"] = "Stan konta",
|
||||
["Offer Type"] = "Typ oferty",
|
||||
["Piece Price"] = "Cena jednego",
|
||||
["Find"] = "Szukaj",
|
||||
["Formula"] = "Formula",
|
||||
["Group"] = "Groupa",
|
||||
["Type"] = "Typ",
|
||||
["Cooldown"] = "Czas odnowienia",
|
||||
["Premium"] = false,
|
||||
["Any"] = "Dowolny",
|
||||
["Sorcerer"] = "Czarodziej",
|
||||
["Druid"] = false,
|
||||
["Paladin"] = "Paladyn",
|
||||
["Knight"] = "Rycerz"
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,44 +1,45 @@
|
||||
Button < UIButton
|
||||
font: verdana-11px-antialised
|
||||
color: #f0ad4dff
|
||||
size: 106 22
|
||||
color: #dfdfdfff
|
||||
size: 106 23
|
||||
text-offset: 0 0
|
||||
image-source: /images/ui/button_rounded
|
||||
image-color: white
|
||||
image-clip: 0 0 20 20
|
||||
image-source: /images/ui/button
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 22 23
|
||||
image-border: 3
|
||||
padding: 5 10 5 10
|
||||
|
||||
$hover !disabled:
|
||||
image-clip: 0 20 20 20
|
||||
image-clip: 0 23 22 23
|
||||
|
||||
$pressed:
|
||||
image-clip: 0 40 20 20
|
||||
image-clip: 0 46 22 23
|
||||
text-offset: 1 1
|
||||
|
||||
$disabled:
|
||||
color: #f0ad4d88
|
||||
color: #dfdfdf88
|
||||
opacity: 0.8
|
||||
|
||||
TabButton < UIButton
|
||||
size: 20 20
|
||||
size: 22 23
|
||||
image-source: /images/ui/tabbutton_rounded
|
||||
image-color: white
|
||||
image-clip: 0 0 20 20
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 22 23
|
||||
image-border: 3
|
||||
icon-color: white
|
||||
color: #aaaaaa
|
||||
icon-color: #dfdfdf
|
||||
color: #dfdfdf
|
||||
|
||||
$hover !on:
|
||||
image-clip: 0 20 20 20
|
||||
color: white
|
||||
image-clip: 0 23 22 23
|
||||
color: #dfdfdf
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff66
|
||||
icon-color: #888888
|
||||
image-color: #dfdfdf66
|
||||
icon-color: #dfdfdf
|
||||
|
||||
$on:
|
||||
image-clip: 0 40 20 20
|
||||
color: #80c7f8
|
||||
image-clip: 0 46 22 23
|
||||
color: #dfdfdf
|
||||
|
||||
NextButton < UIButton
|
||||
size: 12 21
|
||||
@@ -52,7 +53,7 @@ NextButton < UIButton
|
||||
image-clip: 12 21 12 21
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff55
|
||||
image-color: #dfdfdf55
|
||||
|
||||
PreviousButton < UIButton
|
||||
size: 12 21
|
||||
@@ -66,18 +67,18 @@ PreviousButton < UIButton
|
||||
image-clip: 0 21 12 21
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff55
|
||||
image-color: #dfdfdf55
|
||||
|
||||
AddButton < UIButton
|
||||
size: 20 20
|
||||
image-source: /images/ui/icon_add
|
||||
image-color: #ffffffff
|
||||
image-color: #dfdfdfff
|
||||
|
||||
$hover !disabled:
|
||||
image-color: #ffffff99
|
||||
image-color: #dfdfdf99
|
||||
|
||||
$pressed:
|
||||
image-color: #ffffff44
|
||||
image-color: #dfdfdf44
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff55
|
||||
image-color: #dfdfdf55
|
||||
|
@@ -1,35 +1,35 @@
|
||||
CheckBox < UICheckBox
|
||||
size: 16 16
|
||||
text-align: left
|
||||
text-offset: 16 0
|
||||
color: #aaaaaa
|
||||
image-color: #ffffffff
|
||||
image-rect: 0 0 12 12
|
||||
image-offset: 0 2
|
||||
text-offset: 18 1
|
||||
color: #dfdfdf
|
||||
image-color: #dfdfdfff
|
||||
image-rect: 0 0 15 15
|
||||
image-source: /images/ui/checkbox
|
||||
|
||||
$hover !disabled:
|
||||
color: #cccccc
|
||||
color: #ffffff
|
||||
|
||||
$!checked:
|
||||
image-clip: 0 0 12 12
|
||||
image-clip: 0 0 15 15
|
||||
|
||||
$hover !checked:
|
||||
image-clip: 0 12 12 12
|
||||
image-clip: 0 15 15 15
|
||||
|
||||
$checked:
|
||||
image-clip: 0 24 12 12
|
||||
image-clip: 0 30 15 15
|
||||
|
||||
$hover checked:
|
||||
image-clip: 0 36 12 12
|
||||
image-clip: 0 45 15 15
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff88
|
||||
color: #aaaaaa88
|
||||
image-color: #dfdfdf88
|
||||
color: #dfdfdf88
|
||||
opacity: 0.8
|
||||
|
||||
ColorBox < UICheckBox
|
||||
size: 16 16
|
||||
image-color: #ffffffff
|
||||
image-color: #dfdfdfff
|
||||
image-source: /images/ui/colorbox
|
||||
|
||||
$checked:
|
||||
@@ -40,26 +40,25 @@ ColorBox < UICheckBox
|
||||
|
||||
ButtonBox < UICheckBox
|
||||
font: verdana-11px-antialised
|
||||
color: #ffffffff
|
||||
size: 106 22
|
||||
color: #dfdfdfff
|
||||
size: 106 23
|
||||
text-offset: 0 0
|
||||
text-align: center
|
||||
image-source: /images/ui/tabbutton_rounded
|
||||
image-color: white
|
||||
image-clip: 0 0 20 20
|
||||
image-source: /images/ui/button
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 22 23
|
||||
image-border: 3
|
||||
|
||||
$hover !disabled:
|
||||
image-clip: 0 20 20 20
|
||||
image-clip: 0 23 22 23
|
||||
|
||||
$checked:
|
||||
image-clip: 0 40 20 20
|
||||
color: #80c7f8
|
||||
image-clip: 0 46 22 23
|
||||
color: #dfdfdf
|
||||
|
||||
$disabled:
|
||||
color: #666666ff
|
||||
image-color: #ffffff88
|
||||
color: #dfdfdf88
|
||||
image-color: #dfdfdf88
|
||||
|
||||
ButtonBoxRounded < ButtonBox
|
||||
image-source: /images/ui/tabbutton_rounded
|
||||
image-border: 2
|
||||
image-source: /images/ui/button_rounded
|
@@ -1,62 +1,106 @@
|
||||
ComboBoxPopupMenuButton < UIButton
|
||||
height: 20
|
||||
ComboBoxPopupScrollMenuButton < UIButton
|
||||
height: 23
|
||||
font: verdana-11px-antialised
|
||||
text-align: left
|
||||
text-offset: 4 0
|
||||
color: #aaaaaa
|
||||
color: #dfdfdf
|
||||
background-color: alpha
|
||||
margin: 1
|
||||
|
||||
$hover !disabled:
|
||||
color: #ffffff
|
||||
background-color: #ffffff44
|
||||
color: #dfdfdf
|
||||
background-color: #355d89
|
||||
|
||||
$disabled:
|
||||
color: #555555
|
||||
color: #dfdfdf88
|
||||
|
||||
ComboBoxPopupScrollMenu < UIPopupScrollMenu
|
||||
image-source: /images/ui/combobox_square
|
||||
image-clip: 0 69 91 23
|
||||
image-border: 1
|
||||
|
||||
ComboBoxPopupMenuButton < UIButton
|
||||
height: 23
|
||||
font: verdana-11px-antialised
|
||||
text-align: left
|
||||
text-offset: 4 0
|
||||
color: #dfdfdf
|
||||
background-color: alpha
|
||||
margin: 1
|
||||
|
||||
$hover !disabled:
|
||||
color: #dfdfdf
|
||||
background-color: #355d89
|
||||
|
||||
$disabled:
|
||||
color: #dfdfdf88
|
||||
|
||||
ComboBoxPopupMenu < UIPopupMenu
|
||||
image-source: /images/ui/combobox_square
|
||||
image-clip: 0 60 89 20
|
||||
image-border-left: 1
|
||||
image-border-right: 1
|
||||
image-clip: 0 69 91 23
|
||||
image-border: 1
|
||||
|
||||
ComboBox < UIComboBox
|
||||
font: verdana-11px-antialised
|
||||
color: #aaaaaa
|
||||
size: 89 20
|
||||
color: #dfdfdf
|
||||
size: 91 23
|
||||
text-offset: 3 0
|
||||
text-align: left
|
||||
image-source: /images/ui/combobox_square
|
||||
image-border: 1
|
||||
image-border-right: 17
|
||||
image-clip: 0 0 89 20
|
||||
image-border: 3
|
||||
image-border-right: 19
|
||||
image-clip: 0 0 91 23
|
||||
|
||||
$hover !disabled:
|
||||
image-clip: 0 20 89 20
|
||||
image-clip: 0 23 91 23
|
||||
|
||||
$on:
|
||||
image-clip: 0 40 89 20
|
||||
image-clip: 0 46 91 23
|
||||
|
||||
ComboBoxRoundedPopupMenuButton < UIButton
|
||||
height: 20
|
||||
$disabled:
|
||||
color: #dfdfdf88
|
||||
opacity: 0.8
|
||||
|
||||
ComboBoxRoundedPopupScrollMenuButton < UIButton
|
||||
height: 23
|
||||
font: verdana-11px-antialised
|
||||
text-align: left
|
||||
text-offset: 4 0
|
||||
color: #aaaaaa
|
||||
color: #dfdfdf
|
||||
background-color: alpha
|
||||
|
||||
$hover !disabled:
|
||||
color: #ffffff
|
||||
background-color: #ffffff44
|
||||
background-color: #355d89
|
||||
|
||||
$disabled:
|
||||
color: #555555
|
||||
color: #dfdfdf88
|
||||
|
||||
ComboBoxRoundedPopupScrollMenu < UIPopupScrollMenu
|
||||
image-source: /images/ui/combobox_rounded
|
||||
image-clip: 0 69 91 23
|
||||
image-border: 3
|
||||
|
||||
ComboBoxRoundedPopupMenuButton < UIButton
|
||||
height: 23
|
||||
font: verdana-11px-antialised
|
||||
text-align: left
|
||||
text-offset: 4 0
|
||||
color: #dfdfdf
|
||||
background-color: alpha
|
||||
|
||||
$hover !disabled:
|
||||
color: #ffffff
|
||||
background-color: #355d89
|
||||
|
||||
$disabled:
|
||||
color: #dfdfdf88
|
||||
|
||||
ComboBoxRoundedPopupMenu < UIPopupMenu
|
||||
image-source: /images/ui/combobox_rounded
|
||||
image-clip: 0 60 89 20
|
||||
image-border-left: 1
|
||||
image-border-right: 1
|
||||
image-clip: 0 69 91 23
|
||||
image-border: 3
|
||||
|
||||
ComboBoxRounded < ComboBox
|
||||
image-source: /images/ui/combobox_rounded
|
||||
image-border: 2
|
||||
image-border: 3
|
||||
|
@@ -1,23 +1,23 @@
|
||||
Label < UILabel
|
||||
font: verdana-11px-antialised
|
||||
color: #bbbbbb
|
||||
color: #dfdfdf
|
||||
|
||||
$disabled:
|
||||
color: #bbbbbb88
|
||||
color: #dfdfdf88
|
||||
|
||||
FlatLabel < UILabel
|
||||
font: verdana-11px-antialised
|
||||
color: #aaaaaa
|
||||
color: #dfdfdf
|
||||
size: 86 20
|
||||
text-offset: 3 3
|
||||
image-source: /images/ui/panel_flat
|
||||
image-border: 1
|
||||
|
||||
$disabled:
|
||||
color: #aaaaaa88
|
||||
color: #dfdfdf88
|
||||
|
||||
MenuLabel < Label
|
||||
|
||||
GameLabel < UILabel
|
||||
font: verdana-11px-antialised
|
||||
color: #bbbbbb
|
||||
color: #dfdfdf
|
||||
|
@@ -1,19 +1,19 @@
|
||||
TextList < UIScrollArea
|
||||
layout: verticalBox
|
||||
border-width: 1
|
||||
border-color: #1d222b
|
||||
background-color: #222833
|
||||
border-color: #272727
|
||||
background-color: #636363
|
||||
padding: 1
|
||||
auto-focus: none
|
||||
|
||||
HorizontalList < UIScrollArea
|
||||
layout: horizontalBox
|
||||
border-width: 1
|
||||
border-color: #1d222b
|
||||
background-color: #222833
|
||||
border-color: #272727
|
||||
background-color: #636363
|
||||
|
||||
VerticalList < UIScrollArea
|
||||
layout: verticalBox
|
||||
border-width: 1
|
||||
border-color: #1d222b
|
||||
background-color: #222833
|
||||
border-color: #272727
|
||||
background-color: #636363
|
@@ -10,7 +10,6 @@ ScrollBarSlider < UIButton
|
||||
image-clip: 13 26 13 13
|
||||
$pressed:
|
||||
image-clip: 26 26 13 13
|
||||
image-color: #ffffff99
|
||||
$disabled:
|
||||
image-color: #ffffff66
|
||||
|
||||
|
@@ -1,13 +1,13 @@
|
||||
HorizontalSeparator < UIWidget
|
||||
image-source: /images/ui/separator_horizontal
|
||||
image-border-top: 2
|
||||
image-border: 1
|
||||
height: 2
|
||||
phantom: true
|
||||
focusable: false
|
||||
|
||||
VerticalSeparator < UIWidget
|
||||
image-source: /images/ui/separator_vertical
|
||||
image-border-left: 2
|
||||
image-border: 1
|
||||
width: 2
|
||||
phantom: true
|
||||
focusable: false
|
||||
|
@@ -1,15 +1,17 @@
|
||||
TextEdit < UITextEdit
|
||||
font: verdana-11px-antialised
|
||||
color: #aaaaaa
|
||||
size: 86 20
|
||||
text-offset: 0 3
|
||||
padding: 3
|
||||
color: #272727
|
||||
size: 86 22
|
||||
text-offset: 0 4
|
||||
opacity: 1
|
||||
padding: 4
|
||||
image-source: /images/ui/textedit
|
||||
image-border: 1
|
||||
selection-color: #111416
|
||||
selection-background-color: #999999
|
||||
selection-color: #272727
|
||||
selection-background-color: #cccccc
|
||||
$disabled:
|
||||
color: #aaaaaa88
|
||||
color: #27272788
|
||||
opacity: 0.5
|
||||
|
||||
PasswordTextEdit < TextEdit
|
||||
text-hidden: true
|
||||
|
@@ -2,20 +2,19 @@ Window < UIWindow
|
||||
font: verdana-11px-antialised
|
||||
size: 200 200
|
||||
opacity: 1
|
||||
color: white
|
||||
text-offset: 0 4
|
||||
color: #dfdfdf
|
||||
text-offset: 0 6
|
||||
text-align: top
|
||||
image-source: /images/ui/window
|
||||
image-border: 5
|
||||
image-border-top: 22
|
||||
opacity: 1
|
||||
padding-top: 30
|
||||
image-border: 6
|
||||
image-border-top: 27
|
||||
padding-top: 36
|
||||
padding-left: 16
|
||||
padding-right: 16
|
||||
padding-bottom: 16
|
||||
|
||||
$disabled:
|
||||
color: #aaaaaa88
|
||||
color: #dfdfdf88
|
||||
|
||||
$dragging:
|
||||
opacity: 0.8
|
||||
|
@@ -39,3 +39,45 @@ PopupMenu < UIPopupMenu
|
||||
image-source: /images/ui/menubox
|
||||
image-border: 3
|
||||
padding: 3
|
||||
|
||||
PopupScrollMenuButton < UIButton
|
||||
height: 18
|
||||
size: 0 21
|
||||
text-offset: 4 0
|
||||
text-align: left
|
||||
font: verdana-11px-antialised
|
||||
|
||||
color: #aaaaaa
|
||||
background-color: alpha
|
||||
|
||||
$hover !disabled:
|
||||
color: #ffffff
|
||||
background-color: #ffffff44
|
||||
image-clip: 0 40 20 20
|
||||
|
||||
$disabled:
|
||||
color: #555555
|
||||
|
||||
PopupScrollMenuShortcutLabel < Label
|
||||
font: verdana-11px-antialised
|
||||
text-align: right
|
||||
anchors.fill: parent
|
||||
margin-right: 2
|
||||
margin-left: 5
|
||||
|
||||
PopupScrollMenuSeparator < UIWidget
|
||||
margin-left: 2
|
||||
margin-right: 2
|
||||
margin-bottom: 1
|
||||
image-source: /images/ui/menubox
|
||||
image-border-left: 1
|
||||
image-border-right: 1
|
||||
image-clip: 0 0 32 2
|
||||
height: 2
|
||||
phantom: true
|
||||
|
||||
PopupScrollMenu < UIPopupScrollMenu
|
||||
width: 50
|
||||
image-source: /images/ui/menubox
|
||||
image-border: 3
|
||||
padding: 3
|
||||
|
@@ -1,13 +1,13 @@
|
||||
SpinBox < TextEdit
|
||||
__class: UISpinBox
|
||||
text-align: left
|
||||
size: 86 20
|
||||
size: 86 22
|
||||
padding: 0
|
||||
padding-left: 2
|
||||
|
||||
Button
|
||||
id: up
|
||||
size: 10 10
|
||||
size: 11 11
|
||||
image-source: /images/ui/spinbox_up
|
||||
image-border: 1
|
||||
image-clip: 0 0 10 10
|
||||
@@ -21,7 +21,7 @@ SpinBox < TextEdit
|
||||
|
||||
Button
|
||||
id: down
|
||||
size: 10 10
|
||||
size: 11 11
|
||||
image-source: /images/ui/spinbox_down
|
||||
image-border: 1
|
||||
image-clip: 0 0 10 10
|
||||
|
@@ -1,47 +1,49 @@
|
||||
MoveableTabBar < UIMoveableTabBar
|
||||
size: 80 20
|
||||
size: 80 21
|
||||
MoveableTabBarPanel < Panel
|
||||
MoveableTabBarButton < UIButton
|
||||
size: 20 20
|
||||
size: 20 21
|
||||
image-source: /images/ui/tabbutton_square
|
||||
image-color: white
|
||||
image-clip: 0 0 20 20
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 20 21
|
||||
image-border: 3
|
||||
icon-color: white
|
||||
color: #aaaaaa
|
||||
image-border-bottom: 0
|
||||
icon-color: #dfdfdf
|
||||
color: #dfdfdf
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
padding: 5
|
||||
|
||||
$hover !checked:
|
||||
image-clip: 0 20 20 20
|
||||
color: white
|
||||
image-clip: 0 21 20 21
|
||||
color: #dfdfdf
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff66
|
||||
icon-color: #888888
|
||||
image-color: #dfdfdf88
|
||||
icon-color: #dfdfdf
|
||||
|
||||
$checked:
|
||||
image-clip: 0 40 20 20
|
||||
color: #D8E7F0
|
||||
image-clip: 0 42 20 21
|
||||
color: #dfdfdf
|
||||
|
||||
$on !checked:
|
||||
color: #F55E5E
|
||||
color: #dfdfdf
|
||||
|
||||
TabBar < UITabBar
|
||||
size: 80 20
|
||||
size: 80 21
|
||||
Panel
|
||||
id: buttonsPanel
|
||||
anchors.fill: parent
|
||||
TabBarPanel < Panel
|
||||
TabBarButton < UIButton
|
||||
size: 20 20
|
||||
size: 22 23
|
||||
image-source: /images/ui/tabbutton_square
|
||||
image-color: white
|
||||
image-clip: 0 0 20 20
|
||||
image-color: #dfdfdf
|
||||
image-clip: 0 0 22 23
|
||||
image-border: 3
|
||||
icon-color: white
|
||||
color: #aaaaaa
|
||||
image-border-bottom: 0
|
||||
icon-color: #dfdfdf
|
||||
color: #dfdfdf
|
||||
anchors.top: parent.top
|
||||
padding: 5
|
||||
|
||||
@@ -53,19 +55,19 @@ TabBarButton < UIButton
|
||||
margin-left: 5
|
||||
|
||||
$hover !checked:
|
||||
image-clip: 0 20 20 20
|
||||
color: white
|
||||
image-clip: 0 23 22 23
|
||||
color: #dfdfdf
|
||||
|
||||
$disabled:
|
||||
image-color: #ffffff66
|
||||
icon-color: #888888
|
||||
image-color: #dfdfdf88
|
||||
icon-color: #dfdfdf
|
||||
|
||||
$checked:
|
||||
image-clip: 0 40 20 20
|
||||
color: #80c7f8
|
||||
image-clip: 0 46 22 23
|
||||
color: #dfdfdf
|
||||
|
||||
$on !checked:
|
||||
color: #F55E5E
|
||||
color: #dfdfdf
|
||||
|
||||
TabBarRounded < TabBar
|
||||
TabBarRoundedPanel < TabBarPanel
|
||||
@@ -107,7 +109,7 @@ TabBarVerticalButton < UIButton
|
||||
margin-top: 10
|
||||
$hover !checked:
|
||||
color: white
|
||||
icon-color: #cccccc
|
||||
icon-color: #dfdfdf
|
||||
$disabled:
|
||||
icon-color: #333333
|
||||
$checked:
|
||||
|
4
init.lua
@@ -27,8 +27,8 @@ g_resources.setupUserWriteDir(g_app.getCompactName())
|
||||
-- search all packages
|
||||
g_resources.searchAndAddPackages('/', '.otpkg', true)
|
||||
|
||||
-- load configurations
|
||||
g_configs.load("/config.otml")
|
||||
-- load settings
|
||||
g_configs.loadSettings("/config.otml")
|
||||
|
||||
g_modules.discoverModules()
|
||||
|
||||
|
@@ -53,7 +53,7 @@ function startup()
|
||||
end
|
||||
|
||||
function init()
|
||||
connect(g_app, { onRun = startup,
|
||||
connect(g_app, { onRun = startup,
|
||||
onExit = exit })
|
||||
|
||||
g_window.setMinimumSize({ width = 600, height = 480 })
|
||||
@@ -91,14 +91,14 @@ function init()
|
||||
g_keyboard.bindKeyDown('Ctrl+Shift+R', reloadScripts)
|
||||
|
||||
-- generate machine uuid, this is a security measure for storing passwords
|
||||
if not g_crypt.setMachineUUID(g_configs.get('uuid')) then
|
||||
g_configs.set('uuid', g_crypt.getMachineUUID())
|
||||
g_configs.save()
|
||||
end
|
||||
if not g_crypt.setMachineUUID(g_settings.get('uuid')) then
|
||||
g_settings.set('uuid', g_crypt.getMachineUUID())
|
||||
g_settings.save()
|
||||
end
|
||||
end
|
||||
|
||||
function terminate()
|
||||
disconnect(g_app, { onRun = startup,
|
||||
disconnect(g_app, { onRun = startup,
|
||||
onExit = exit })
|
||||
-- save window configs
|
||||
g_settings.set('window-size', g_window.getUnmaximizedSize())
|
||||
|
@@ -243,7 +243,7 @@ function CharacterList.create(characters, account, otui)
|
||||
else
|
||||
accountStatusLabel:setText(tr('Free Account'))
|
||||
end
|
||||
|
||||
|
||||
if account.premDays > 0 and account.premDays <= 7 then
|
||||
accountStatusLabel:setOn(true)
|
||||
else
|
||||
|
@@ -81,7 +81,7 @@ MainWindow
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: next.top
|
||||
margin-bottom: 1
|
||||
|
||||
|
||||
Label
|
||||
id: accountStatusLabel
|
||||
!text: tr('Free Account')
|
||||
|
@@ -35,7 +35,7 @@ end
|
||||
|
||||
local function onCharacterList(protocol, characters, account, otui)
|
||||
-- Try add server to the server list
|
||||
ServerList.add(G.host, G.port, g_game.getProtocolVersion())
|
||||
ServerList.add(G.host, G.port, g_game.getClientVersion())
|
||||
|
||||
if enterGame:getChildById('rememberPasswordBox'):isChecked() then
|
||||
local account = g_crypt.encrypt(G.account)
|
||||
@@ -82,7 +82,7 @@ local function onUpdateNeeded(protocol, signature)
|
||||
local cancelFunc = EnterGame.show
|
||||
EnterGame.updateFunc(signature, continueFunc, cancelFunc)
|
||||
else
|
||||
local errorBox = displayErrorBox(tr('Update needed'), tr('Your client needs update, try redownloading it.'))
|
||||
local errorBox = displayErrorBox(tr('Update needed'), tr('Your client needs updating, try redownloading it.'))
|
||||
connect(errorBox, { onOk = EnterGame.show })
|
||||
end
|
||||
end
|
||||
@@ -225,7 +225,7 @@ function EnterGame.doLogin()
|
||||
|
||||
g_settings.set('host', G.host)
|
||||
g_settings.set('port', G.port)
|
||||
g_settings.set('client-version', clientVersion)
|
||||
g_settings.set('client-version', clientVersion)
|
||||
|
||||
protocolLogin = ProtocolLogin.create()
|
||||
protocolLogin.onLoginError = onError
|
||||
@@ -242,7 +242,7 @@ function EnterGame.doLogin()
|
||||
|
||||
g_game.chooseRsa(G.host)
|
||||
g_game.setClientVersion(clientVersion)
|
||||
g_game.setProtocolVersion(g_game.getProtocolVersionForClient(clientVersion))
|
||||
g_game.setProtocolVersion(g_game.getClientProtocolVersion(clientVersion))
|
||||
|
||||
if modules.game_things.isLoaded() then
|
||||
protocolLogin:login(G.host, G.port, G.account, G.password)
|
||||
|
@@ -92,6 +92,9 @@ EnterGameWindow
|
||||
margin-top: 2
|
||||
margin-right: 3
|
||||
width: 90
|
||||
menu-scroll: true
|
||||
menu-height: 125
|
||||
menu-scroll-step: 25
|
||||
|
||||
MenuLabel
|
||||
id: portLabel
|
||||
|
@@ -14,7 +14,8 @@ function init()
|
||||
g_keyboard.bindKeyPress('Up', function() moduleList:focusPreviousChild(KeyboardFocusReason) end, moduleManagerWindow)
|
||||
g_keyboard.bindKeyPress('Down', function() moduleList:focusNextChild(KeyboardFocusReason) end, moduleManagerWindow)
|
||||
|
||||
moduleManagerButton = modules.client_topmenu.addLeftButton('moduleManagerButton', tr('Module Manager'), '/images/topbuttons/modulemanager', toggle)
|
||||
moduleManagerButton = modules.client_topmenu.addLeftButton('moduleManagerButton',
|
||||
tr('Module Manager'), '/images/topbuttons/modulemanager', toggle)
|
||||
|
||||
-- refresh modules only after all modules are loaded
|
||||
addEvent(listModules)
|
||||
|
@@ -39,10 +39,10 @@ Panel
|
||||
id: fullscreen
|
||||
!text: tr('Fullscreen')
|
||||
tooltip: Ctrl+Shift+F
|
||||
|
||||
|
||||
OptionCheckBox
|
||||
id: dontStretchShrink
|
||||
!text: tr('Don\'t stretch/shrink Game Window')
|
||||
!text: tr('Don\'t stretch/shrink Game Window')
|
||||
|
||||
Label
|
||||
id: backgroundFrameRateLabel
|
||||
|
@@ -1,7 +1,7 @@
|
||||
MainWindow
|
||||
id: addServerWindow
|
||||
!text: tr('New Server')
|
||||
size: 180 180
|
||||
size: 180 195
|
||||
visible: false
|
||||
@onEscape: AddServer.hide()
|
||||
@onEnter: AddServer.add()
|
||||
@@ -48,6 +48,9 @@ MainWindow
|
||||
anchors.top: protocolLabel.bottom
|
||||
anchors.left: protocolLabel.left
|
||||
anchors.right: port.right
|
||||
menu-scroll: true
|
||||
menu-height: 125
|
||||
menu-scroll-step: 25
|
||||
@onSetup: |
|
||||
for _, proto in pairs(g_game.getSupportedClients()) do
|
||||
self:addOption(proto)
|
||||
|
@@ -50,7 +50,7 @@ function ServerList.add(host, port, protocol, load)
|
||||
end
|
||||
local widget = g_ui.createWidget('ServerWidget', serverTextList)
|
||||
widget:setId(host)
|
||||
|
||||
|
||||
if not load then
|
||||
servers[host] = {
|
||||
port = port,
|
||||
|
@@ -131,11 +131,11 @@ function init()
|
||||
commandTextEdit = terminalWindow:getChildById('commandTextEdit')
|
||||
g_keyboard.bindKeyPress('Up', function() navigateCommand(1) end, commandTextEdit)
|
||||
g_keyboard.bindKeyPress('Down', function() navigateCommand(-1) end, commandTextEdit)
|
||||
g_keyboard.bindKeyPress('Ctrl+C',
|
||||
function()
|
||||
g_keyboard.bindKeyPress('Ctrl+C',
|
||||
function()
|
||||
if commandTextEdit:hasSelection() or not terminalSelectText:hasSelection() then return false end
|
||||
g_window.setClipboardText(terminalSelectText:getSelection())
|
||||
return true
|
||||
return true
|
||||
end, commandTextEdit)
|
||||
g_keyboard.bindKeyDown('Tab', completeCommand, commandTextEdit)
|
||||
g_keyboard.bindKeyDown('Enter', doCommand, commandTextEdit)
|
||||
@@ -202,9 +202,9 @@ function popWindow()
|
||||
else
|
||||
terminalWindow:breakAnchors()
|
||||
terminalWindow:setOn(true)
|
||||
local size = oldSize or { width = g_window.getWidth()/2, height = g_window.getHeight()/2 }
|
||||
local size = oldSize or { width = g_window.getWidth()/2.5, height = g_window.getHeight()/4 }
|
||||
terminalWindow:setSize(size)
|
||||
local pos = oldPos or { x = (g_window.getWidth() - terminalWindow:getWidth())/2, y = (g_window.getHeight() - terminalWindow:getHeight())/2 }
|
||||
local pos = oldPos or { x = 0, y = g_window.getHeight() }
|
||||
terminalWindow:setPosition(pos)
|
||||
terminalWindow:getChildById('bottomResizeBorder'):enable()
|
||||
terminalWindow:getChildById('rightResizeBorder'):enable()
|
||||
@@ -224,7 +224,7 @@ function toggle()
|
||||
if not firstShown then
|
||||
local settings = g_settings.getNode('terminal-window')
|
||||
if settings then
|
||||
if settings.size then oldSize = size end
|
||||
if settings.size then oldSize = settings.size end
|
||||
if settings.pos then oldPos = settings.pos end
|
||||
if settings.poped then popWindow() end
|
||||
end
|
||||
|
@@ -27,7 +27,7 @@ local function addButton(id, description, icon, callback, panel, toggle, front)
|
||||
button:setTooltip(description)
|
||||
button:setIcon(resolvepath(icon, 3))
|
||||
button.onMouseRelease = function(widget, mousePos, mouseButton)
|
||||
if widget:containsPoint(mousePos) and mouseButton ~= MouseMiddleButton then
|
||||
if widget:containsPoint(mousePos) and mouseButton ~= MouseMidButton then
|
||||
callback()
|
||||
return true
|
||||
end
|
||||
|
73
modules/corelib/config.lua
Normal file
@@ -0,0 +1,73 @@
|
||||
-- @docclass
|
||||
|
||||
local function convertSettingValue(value)
|
||||
if type(value) == 'table' then
|
||||
if value.x and value.width then
|
||||
return recttostring(value)
|
||||
elseif value.x then
|
||||
return pointtostring(value)
|
||||
elseif value.width then
|
||||
return sizetostring(value)
|
||||
elseif value.r then
|
||||
return colortostring(value)
|
||||
else
|
||||
return value
|
||||
end
|
||||
elseif value == nil then
|
||||
return ''
|
||||
else
|
||||
return tostring(value)
|
||||
end
|
||||
end
|
||||
|
||||
function Config:set(key, value)
|
||||
self:setValue(key, convertSettingValue(value))
|
||||
end
|
||||
|
||||
function Config:setDefault(key, value)
|
||||
if self:exists(key) then return false end
|
||||
self:set(key, value)
|
||||
return true
|
||||
end
|
||||
|
||||
function Config:get(key, default)
|
||||
if not self:exists(key) and default ~= nil then
|
||||
self:set(key, default)
|
||||
end
|
||||
return self:getValue(key)
|
||||
end
|
||||
|
||||
function Config:getString(key, default)
|
||||
return self:get(key, default)
|
||||
end
|
||||
|
||||
function Config:getInteger(key, default)
|
||||
local v = tonumber(self:get(key, default)) or 0
|
||||
return v
|
||||
end
|
||||
|
||||
function Config:getNumber(key, default)
|
||||
local v = tonumber(self:get(key, default)) or 0
|
||||
return v
|
||||
end
|
||||
|
||||
function Config:getBoolean(key, default)
|
||||
return toboolean(self:get(key, default))
|
||||
end
|
||||
|
||||
function Config:getPoint(key, default)
|
||||
return topoint(self:get(key, default))
|
||||
end
|
||||
|
||||
function Config:getRect(key, default)
|
||||
return torect(self:get(key, default))
|
||||
end
|
||||
|
||||
function Config:getSize(key, default)
|
||||
return tosize(self:get(key, default))
|
||||
end
|
||||
|
||||
function Config:getColor(key, default)
|
||||
return tocolor(self:get(key, default))
|
||||
end
|
||||
|
@@ -14,12 +14,14 @@ Module
|
||||
dofile 'const'
|
||||
dofile 'util'
|
||||
dofile 'globals'
|
||||
dofile 'config'
|
||||
dofile 'settings'
|
||||
dofile 'keyboard'
|
||||
dofile 'mouse'
|
||||
dofile 'net'
|
||||
|
||||
dofiles 'classes'
|
||||
dofiles 'ui'
|
||||
|
||||
dofile 'inputmessage'
|
||||
dofile 'outputmessage'
|
||||
dofile 'outputmessage'
|
@@ -1,86 +1,3 @@
|
||||
-- @docclass
|
||||
g_settings = {}
|
||||
g_settings = makesingleton(g_configs.getSettings())
|
||||
|
||||
g_settings.exists = g_configs.exists
|
||||
g_settings.setNode = g_configs.setNode
|
||||
g_settings.mergeNode = g_configs.mergeNode
|
||||
g_settings.getNode = g_configs.getNode
|
||||
g_settings.remove = g_configs.remove
|
||||
g_settings.setList = g_configs.setList
|
||||
g_settings.getList = g_configs.getList
|
||||
g_settings.save = g_configs.save
|
||||
|
||||
local function convertSettingValue(value)
|
||||
if type(value) == 'table' then
|
||||
if value.x and value.width then
|
||||
return recttostring(value)
|
||||
elseif value.x then
|
||||
return pointtostring(value)
|
||||
elseif value.width then
|
||||
return sizetostring(value)
|
||||
elseif value.r then
|
||||
return colortostring(value)
|
||||
else
|
||||
return value
|
||||
end
|
||||
elseif value == nil then
|
||||
return ''
|
||||
else
|
||||
return tostring(value)
|
||||
end
|
||||
end
|
||||
|
||||
function g_settings.set(key, value)
|
||||
g_configs.set(key, convertSettingValue(value))
|
||||
end
|
||||
|
||||
function g_settings.setDefault(key, value)
|
||||
if g_settings.exists(key) then return false end
|
||||
g_settings.set(key, value)
|
||||
return true
|
||||
end
|
||||
|
||||
function g_settings.get(key, default)
|
||||
if not g_settings.exists(key) and default ~= nil then
|
||||
g_settings.set(key, default)
|
||||
end
|
||||
return g_configs.get(key)
|
||||
end
|
||||
|
||||
function g_settings.getString(key, default)
|
||||
return g_settings.get(key, default)
|
||||
end
|
||||
|
||||
function g_settings.getInteger(key, default)
|
||||
local v = tonumber(g_settings.get(key, default)) or 0
|
||||
return v
|
||||
end
|
||||
|
||||
function g_settings.getNumber(key, default)
|
||||
local v = tonumber(g_settings.get(key, default)) or 0
|
||||
return v
|
||||
end
|
||||
|
||||
function g_settings.getBoolean(key, default)
|
||||
return toboolean(g_settings.get(key, default))
|
||||
end
|
||||
|
||||
function g_settings.getPoint(key, default)
|
||||
return topoint(g_settings.get(key, default))
|
||||
end
|
||||
|
||||
function g_settings.getRect(key, default)
|
||||
return torect(g_settings.get(key, default))
|
||||
end
|
||||
|
||||
function g_settings.getSize(key, default)
|
||||
return tosize(g_settings.get(key, default))
|
||||
end
|
||||
|
||||
function g_settings.getColor(key, default)
|
||||
return tocolor(g_settings.get(key, default))
|
||||
end
|
||||
|
||||
function g_settings.getColor(key, default)
|
||||
return tocolor(g_settings.get(key, default))
|
||||
end
|
||||
-- Reserved for future functionality
|
||||
|
@@ -49,3 +49,11 @@ function string:explode(sep, limit)
|
||||
table.insert(t, tmp)
|
||||
return t
|
||||
end
|
||||
|
||||
function string:contains(str, checkCase, start, plain)
|
||||
if(not checkCase) then
|
||||
self = self:lower()
|
||||
str = str:lower()
|
||||
end
|
||||
return string.find(self, str, start and start or 1, plain == nil and true or false)
|
||||
end
|
||||
|
@@ -55,7 +55,7 @@ end
|
||||
|
||||
function table.find(t, value, lowercase)
|
||||
for k,v in pairs(t) do
|
||||
if lowercase and type(value) == 'string' and type(v) == 'string' then
|
||||
if lowercase and type(value) == 'string' and type(v) == 'string' then
|
||||
if v:lower() == value:lower() then return k end
|
||||
end
|
||||
if v == value then return k end
|
||||
@@ -64,7 +64,7 @@ end
|
||||
|
||||
function table.findbykey(t, key, lowercase)
|
||||
for k,v in pairs(t) do
|
||||
if lowercase and type(key) == 'string' and type(k) == 'string' then
|
||||
if lowercase and type(key) == 'string' and type(k) == 'string' then
|
||||
if k:lower() == key:lower() then return v end
|
||||
end
|
||||
if k == key then return v end
|
||||
@@ -149,7 +149,7 @@ function table.size(t)
|
||||
for i, n in pairs(t) do
|
||||
size = size + 1
|
||||
end
|
||||
|
||||
|
||||
return size
|
||||
end
|
||||
|
||||
@@ -157,6 +157,7 @@ function table.tostring(t)
|
||||
local maxn = #t
|
||||
local str = ""
|
||||
for k,v in pairs(t) do
|
||||
v = tostring(v)
|
||||
if k == maxn and k ~= 1 then
|
||||
str = str .. " and " .. v
|
||||
elseif maxn > 1 and k ~= 1 then
|
||||
@@ -181,3 +182,11 @@ function table.collect(t, func)
|
||||
return res
|
||||
end
|
||||
|
||||
function table.equals(t, comp)
|
||||
if type(t) == "table" and type(comp) == "table" then
|
||||
for k,v in pairs(t) do
|
||||
if v ~= comp[k] then return false end
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIButton = extends(UIWidget)
|
||||
UIButton = extends(UIWidget, "UIButton")
|
||||
|
||||
function UIButton.create()
|
||||
local button = UIButton.internalCreate()
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UICheckBox = extends(UIWidget)
|
||||
UICheckBox = extends(UIWidget, "UICheckBox")
|
||||
|
||||
function UICheckBox.create()
|
||||
local checkbox = UICheckBox.internalCreate()
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIComboBox = extends(UIWidget)
|
||||
UIComboBox = extends(UIWidget, "UIComboBox")
|
||||
|
||||
function UIComboBox.create()
|
||||
local combobox = UIComboBox.internalCreate()
|
||||
@@ -7,6 +7,9 @@ function UIComboBox.create()
|
||||
combobox.options = {}
|
||||
combobox.currentIndex = -1
|
||||
combobox.mouseScroll = true
|
||||
combobox.menuScroll = false
|
||||
combobox.menuHeight = 100
|
||||
combobox.menuScrollStep = 0
|
||||
return combobox
|
||||
end
|
||||
|
||||
@@ -25,25 +28,33 @@ function UIComboBox:getOption(text)
|
||||
end
|
||||
end
|
||||
|
||||
function UIComboBox:setCurrentOption(text)
|
||||
function UIComboBox:setOption(text, dontSignal)
|
||||
self:setCurrentOption(text, dontSignal)
|
||||
end
|
||||
|
||||
function UIComboBox:setCurrentOption(text, dontSignal)
|
||||
if not self.options then return end
|
||||
for i,v in ipairs(self.options) do
|
||||
if v.text == text and self.currentIndex ~= i then
|
||||
self.currentIndex = i
|
||||
self:setText(text)
|
||||
signalcall(self.onOptionChange, self, text, v.data)
|
||||
if not dontSignal then
|
||||
signalcall(self.onOptionChange, self, text, v.data)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function UIComboBox:setCurrentOptionByData(data)
|
||||
function UIComboBox:setCurrentOptionByData(data, dontSignal)
|
||||
if not self.options then return end
|
||||
for i,v in ipairs(self.options) do
|
||||
if v.data == data and self.currentIndex ~= i then
|
||||
self.currentIndex = i
|
||||
self:setText(v.text)
|
||||
signalcall(self.onOptionChange, self, v.text, v.data)
|
||||
if not dontSignal then
|
||||
signalcall(self.onOptionChange, self, v.text, v.data)
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -86,7 +97,16 @@ function UIComboBox:removeOption(text)
|
||||
end
|
||||
|
||||
function UIComboBox:onMousePress(mousePos, mouseButton)
|
||||
local menu = g_ui.createWidget(self:getStyleName() .. 'PopupMenu')
|
||||
local menu
|
||||
if self.menuScroll then
|
||||
menu = g_ui.createWidget(self:getStyleName() .. 'PopupScrollMenu')
|
||||
menu:setHeight(self.menuHeight)
|
||||
if self.menuScrollStep > 0 then
|
||||
menu:setScrollbarStep(self.menuScrollStep)
|
||||
end
|
||||
else
|
||||
menu = g_ui.createWidget(self:getStyleName() .. 'PopupMenu')
|
||||
end
|
||||
menu:setId(self:getId() .. 'PopupMenu')
|
||||
for i,v in ipairs(self.options) do
|
||||
menu:addOption(v.text, function() self:setCurrentOption(v.text) end)
|
||||
@@ -129,6 +149,12 @@ function UIComboBox:onStyleApply(styleName, styleNode)
|
||||
for name,value in pairs(styleNode) do
|
||||
if name == 'mouse-scroll' then
|
||||
self.mouseScroll = value
|
||||
elseif name == 'menu-scroll' then
|
||||
self.menuScroll = value
|
||||
elseif name == 'menu-height' then
|
||||
self.menuHeight = value
|
||||
elseif name == 'menu-scroll-step' then
|
||||
self.menuScrollStep = value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIImageView = extends(UIWidget)
|
||||
UIImageView = extends(UIWidget, "UIImageView")
|
||||
|
||||
function UIImageView.create()
|
||||
local imageView = UIImageView.internalCreate()
|
||||
|
@@ -1,7 +1,7 @@
|
||||
if not UIWindow then dofile 'uiwindow' end
|
||||
|
||||
-- @docclass
|
||||
UIInputBox = extends(UIWindow)
|
||||
UIInputBox = extends(UIWindow, "UIInputBox")
|
||||
|
||||
function UIInputBox.create(title, okCallback, cancelCallback)
|
||||
local inputBox = UIInputBox.internalCreate()
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UILabel = extends(UIWidget)
|
||||
UILabel = extends(UIWidget, "UILabel")
|
||||
|
||||
function UILabel.create()
|
||||
local label = UILabel.internalCreate()
|
||||
|
@@ -1,7 +1,7 @@
|
||||
if not UIWindow then dofile 'uiwindow' end
|
||||
|
||||
-- @docclass
|
||||
UIMessageBox = extends(UIWindow)
|
||||
UIMessageBox = extends(UIWindow, "UIMessageBox")
|
||||
|
||||
-- messagebox cannot be created from otui files
|
||||
UIMessageBox.create = nil
|
||||
|
@@ -1,15 +1,11 @@
|
||||
-- @docclass
|
||||
UIMiniWindow = extends(UIWindow)
|
||||
UIMiniWindow = extends(UIWindow, "UIMiniWindow")
|
||||
|
||||
function UIMiniWindow.create()
|
||||
local miniwindow = UIMiniWindow.internalCreate()
|
||||
return miniwindow
|
||||
end
|
||||
|
||||
function UIMiniWindow:getClassName()
|
||||
return 'UIMiniWindow'
|
||||
end
|
||||
|
||||
function UIMiniWindow:open(dontSave)
|
||||
self:setVisible(true)
|
||||
|
||||
@@ -81,7 +77,7 @@ function UIMiniWindow:setup()
|
||||
self:minimize()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
self:getChildById('miniwindowTopBar').onDoubleClick =
|
||||
function()
|
||||
if self:isOn() then
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIMiniWindowContainer = extends(UIWidget)
|
||||
UIMiniWindowContainer = extends(UIWidget, "UIMiniWindowContainer")
|
||||
|
||||
function UIMiniWindowContainer.create()
|
||||
local container = UIMiniWindowContainer.internalCreate()
|
||||
@@ -9,10 +9,6 @@ function UIMiniWindowContainer.create()
|
||||
return container
|
||||
end
|
||||
|
||||
function UIMiniWindowContainer:getClassName()
|
||||
return 'UIMiniWindowContainer'
|
||||
end
|
||||
|
||||
-- TODO: connect to window onResize event
|
||||
-- TODO: try to resize another widget?
|
||||
-- TODO: try to find another panel?
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIMoveableTabBar = extends(UIWidget)
|
||||
UIMoveableTabBar = extends(UIWidget, "UIMoveableTabBar")
|
||||
|
||||
-- private functions
|
||||
local function onTabClick(tab)
|
||||
@@ -8,7 +8,7 @@ end
|
||||
|
||||
local function updateMargins(tabBar, ignored)
|
||||
if #tabBar.tabs == 0 then return end
|
||||
|
||||
|
||||
local currentMargin = 0
|
||||
for i = 1, #tabBar.tabs do
|
||||
tabBar.tabs[i]:setMarginLeft(currentMargin)
|
||||
@@ -279,17 +279,17 @@ end
|
||||
function UIMoveableTabBar:moveTab(tab, units)
|
||||
local index = table.find(self.tabs, tab)
|
||||
if index == nil then return end
|
||||
|
||||
|
||||
local focus = false
|
||||
if self.currentTab == tab then
|
||||
self:selectPrevTab()
|
||||
focus = true
|
||||
end
|
||||
|
||||
|
||||
table.remove(self.tabs, index)
|
||||
|
||||
|
||||
local newIndex = math.min(#self.tabs+1, math.max(index + units, 1))
|
||||
table.insert(self.tabs, newIndex, tab)
|
||||
table.insert(self.tabs, newIndex, tab)
|
||||
if focus then self:selectTab(tab) end
|
||||
updateMargins(self)
|
||||
return newIndex
|
||||
@@ -389,8 +389,16 @@ function UIMoveableTabBar:selectNextTab()
|
||||
if #self.postTabs > 0 then
|
||||
local widget = showPostTab(self)
|
||||
self:selectTab(widget)
|
||||
updateTabs(self)
|
||||
else
|
||||
if #self.preTabs > 0 then
|
||||
for i = 1, #self.preTabs do
|
||||
showPreTab(self)
|
||||
end
|
||||
end
|
||||
|
||||
self:selectTab(self.tabs[1])
|
||||
end
|
||||
updateTabs(self)
|
||||
return
|
||||
end
|
||||
|
||||
@@ -417,8 +425,16 @@ function UIMoveableTabBar:selectPrevTab()
|
||||
if #self.preTabs > 0 then
|
||||
local widget = showPreTab(self)
|
||||
self:selectTab(widget)
|
||||
updateTabs(self)
|
||||
else
|
||||
if #self.postTabs > 0 then
|
||||
for i = 1, #self.postTabs do
|
||||
showPostTab(self)
|
||||
end
|
||||
end
|
||||
|
||||
self:selectTab(self.tabs[#self.tabs])
|
||||
end
|
||||
updateTabs(self)
|
||||
return
|
||||
end
|
||||
|
||||
@@ -461,4 +477,4 @@ function UIMoveableTabBar:setNavigation(prevButton, nextButton)
|
||||
nextNavigation.onClick = function() self:selectNextTab() end
|
||||
end
|
||||
updateNavigation(self)
|
||||
end
|
||||
end
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIPopupMenu = extends(UIWidget)
|
||||
UIPopupMenu = extends(UIWidget, "UIPopupMenu")
|
||||
|
||||
local currentMenu
|
||||
|
||||
@@ -56,9 +56,8 @@ end
|
||||
|
||||
function UIPopupMenu:addOption(optionName, optionCallback, shortcut)
|
||||
local optionWidget = g_ui.createWidget(self:getStyleName() .. 'Button', self)
|
||||
local lastOptionWidget = self:getLastChild()
|
||||
optionWidget.onClick = function(self)
|
||||
self:getParent():destroy()
|
||||
optionWidget.onClick = function(widget)
|
||||
self:destroy()
|
||||
optionCallback()
|
||||
end
|
||||
optionWidget:setText(optionName)
|
||||
|
129
modules/corelib/ui/uipopupscrollmenu.lua
Normal file
@@ -0,0 +1,129 @@
|
||||
-- @docclass
|
||||
UIPopupScrollMenu = extends(UIWidget, "UIPopupScrollMenu")
|
||||
|
||||
local currentMenu
|
||||
|
||||
function UIPopupScrollMenu.create()
|
||||
local menu = UIPopupScrollMenu.internalCreate()
|
||||
|
||||
local scrollArea = g_ui.createWidget('UIScrollArea', menu)
|
||||
scrollArea:setLayout(UIVerticalLayout.create(menu))
|
||||
scrollArea:setId('scrollArea')
|
||||
|
||||
local scrollBar = g_ui.createWidget('VerticalScrollBar', menu)
|
||||
scrollBar:setId('scrollBar')
|
||||
scrollBar.pixelsScroll = false
|
||||
|
||||
scrollBar:addAnchor(AnchorRight, 'parent', AnchorRight)
|
||||
scrollBar:addAnchor(AnchorTop, 'parent', AnchorTop)
|
||||
scrollBar:addAnchor(AnchorBottom, 'parent', AnchorBottom)
|
||||
|
||||
scrollArea:addAnchor(AnchorLeft, 'parent', AnchorLeft)
|
||||
scrollArea:addAnchor(AnchorTop, 'parent', AnchorTop)
|
||||
scrollArea:addAnchor(AnchorBottom, 'parent', AnchorBottom)
|
||||
scrollArea:addAnchor(AnchorRight, 'next', AnchorLeft)
|
||||
scrollArea:setVerticalScrollBar(scrollBar)
|
||||
|
||||
menu.scrollArea = scrollArea
|
||||
menu.scrollBar = scrollBar
|
||||
return menu
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:setScrollbarStep(step)
|
||||
self.scrollBar:setStep(step)
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:display(pos)
|
||||
-- don't display if not options was added
|
||||
if self.scrollArea:getChildCount() == 0 then
|
||||
self:destroy()
|
||||
return
|
||||
end
|
||||
|
||||
if g_ui.isMouseGrabbed() then
|
||||
self:destroy()
|
||||
return
|
||||
end
|
||||
|
||||
if currentMenu then
|
||||
currentMenu:destroy()
|
||||
end
|
||||
|
||||
if pos == nil then
|
||||
pos = g_window.getMousePosition()
|
||||
end
|
||||
|
||||
rootWidget:addChild(self)
|
||||
self:setPosition(pos)
|
||||
self:grabMouse()
|
||||
currentMenu = self
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:onGeometryChange(oldRect, newRect)
|
||||
local parent = self:getParent()
|
||||
if not parent then return end
|
||||
local ymax = parent:getY() + parent:getHeight()
|
||||
local xmax = parent:getX() + parent:getWidth()
|
||||
if newRect.y + newRect.height > ymax then
|
||||
local newy = newRect.y - newRect.height
|
||||
if newy > 0 and newy + newRect.height < ymax then self:setY(newy) end
|
||||
end
|
||||
if newRect.x + newRect.width > xmax then
|
||||
local newx = newRect.x - newRect.width
|
||||
if newx > 0 and newx + newRect.width < xmax then self:setX(newx) end
|
||||
end
|
||||
self:bindRectToParent()
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:addOption(optionName, optionCallback, shortcut)
|
||||
local optionWidget = g_ui.createWidget(self:getStyleName() .. 'Button', self.scrollArea)
|
||||
optionWidget.onClick = function(widget)
|
||||
self:destroy()
|
||||
optionCallback()
|
||||
end
|
||||
optionWidget:setText(optionName)
|
||||
local width = optionWidget:getTextSize().width + optionWidget:getMarginLeft() + optionWidget:getMarginRight() + 15
|
||||
|
||||
if shortcut then
|
||||
local shortcutLabel = g_ui.createWidget(self:getStyleName() .. 'ShortcutLabel', optionWidget)
|
||||
shortcutLabel:setText(shortcut)
|
||||
width = width + shortcutLabel:getTextSize().width + shortcutLabel:getMarginLeft() + shortcutLabel:getMarginRight()
|
||||
end
|
||||
|
||||
self:setWidth(math.max(self:getWidth(), width))
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:addSeparator()
|
||||
g_ui.createWidget(self:getStyleName() .. 'Separator', self.scrollArea)
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:onDestroy()
|
||||
if currentMenu == self then
|
||||
currentMenu = nil
|
||||
end
|
||||
self:ungrabMouse()
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:onMousePress(mousePos, mouseButton)
|
||||
-- clicks outside menu area destroys the menu
|
||||
if not self:containsPoint(mousePos) then
|
||||
self:destroy()
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function UIPopupScrollMenu:onKeyPress(keyCode, keyboardModifiers)
|
||||
if keyCode == KeyEscape then
|
||||
self:destroy()
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- close all menus when the window is resized
|
||||
local function onRootGeometryUpdate()
|
||||
if currentMenu then
|
||||
currentMenu:destroy()
|
||||
end
|
||||
end
|
||||
connect(rootWidget, { onGeometryChange = onRootGeometryUpdate} )
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIProgressBar = extends(UIWidget)
|
||||
UIProgressBar = extends(UIWidget, "UIProgressBar")
|
||||
|
||||
function UIProgressBar.create()
|
||||
local progressbar = UIProgressBar.internalCreate()
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIRadioGroup = newclass()
|
||||
UIRadioGroup = newclass("UIRadioGroup")
|
||||
|
||||
function UIRadioGroup.create()
|
||||
local radiogroup = UIRadioGroup.internalCreate()
|
||||
@@ -28,7 +28,7 @@ function UIRadioGroup:removeWidget(widget)
|
||||
table.removevalue(self.widgets, widget)
|
||||
end
|
||||
|
||||
function UIRadioGroup:selectWidget(selectedWidget)
|
||||
function UIRadioGroup:selectWidget(selectedWidget, dontSignal)
|
||||
if selectedWidget == self.selectedWidget then return end
|
||||
|
||||
local previousSelectedWidget = self.selectedWidget
|
||||
@@ -42,12 +42,14 @@ function UIRadioGroup:selectWidget(selectedWidget)
|
||||
selectedWidget:setChecked(true)
|
||||
end
|
||||
|
||||
signalcall(self.onSelectionChange, self, selectedWidget, previousSelectedWidget)
|
||||
if not dontSignal then
|
||||
signalcall(self.onSelectionChange, self, selectedWidget, previousSelectedWidget)
|
||||
end
|
||||
end
|
||||
|
||||
function UIRadioGroup:clearSelected()
|
||||
if not self.selectedWidget then return end
|
||||
|
||||
|
||||
local previousSelectedWidget = self.selectedWidget
|
||||
self.selectedWidget:setChecked(false)
|
||||
self.selectedWidget = nil
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIResizeBorder = extends(UIWidget)
|
||||
UIResizeBorder = extends(UIWidget, "UIResizeBorder")
|
||||
|
||||
function UIResizeBorder.create()
|
||||
local resizeborder = UIResizeBorder.internalCreate()
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIScrollArea = extends(UIWidget)
|
||||
UIScrollArea = extends(UIWidget, "UIScrollArea")
|
||||
|
||||
-- public functions
|
||||
function UIScrollArea.create()
|
||||
@@ -107,15 +107,37 @@ end
|
||||
|
||||
function UIScrollArea:onMouseWheel(mousePos, mouseWheel)
|
||||
if self.verticalScrollBar then
|
||||
if not self.verticalScrollBar:isOn() then
|
||||
return false
|
||||
end
|
||||
if mouseWheel == MouseWheelUp then
|
||||
local minimum = self.verticalScrollBar:getMinimum()
|
||||
if self.verticalScrollBar:getValue() <= minimum then
|
||||
return false
|
||||
end
|
||||
self.verticalScrollBar:decrement()
|
||||
else
|
||||
local maximum = self.verticalScrollBar:getMaximum()
|
||||
if self.verticalScrollBar:getValue() >= maximum then
|
||||
return false
|
||||
end
|
||||
self.verticalScrollBar:increment()
|
||||
end
|
||||
elseif self.horizontalScrollBar then
|
||||
if not self.horizontalScrollBar:isOn() then
|
||||
return false
|
||||
end
|
||||
if mouseWheel == MouseWheelUp then
|
||||
local maximum = self.horizontalScrollBar:getMaximum()
|
||||
if self.horizontalScrollBar:getValue() >= maximum then
|
||||
return false
|
||||
end
|
||||
self.horizontalScrollBar:increment()
|
||||
else
|
||||
local minimum = self.horizontalScrollBar:getMinimum()
|
||||
if self.horizontalScrollBar:getValue() <= minimum then
|
||||
return false
|
||||
end
|
||||
self.horizontalScrollBar:decrement()
|
||||
end
|
||||
end
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIScrollBar = extends(UIWidget)
|
||||
UIScrollBar = extends(UIWidget, "UIScrollBar")
|
||||
|
||||
-- private functions
|
||||
local function calcValues(self)
|
||||
@@ -234,19 +234,23 @@ function UIScrollBar:onGeometryChange()
|
||||
end
|
||||
|
||||
function UIScrollBar:onMouseWheel(mousePos, mouseWheel)
|
||||
if not self.mouseScroll then
|
||||
if not self.mouseScroll or not self:isOn() then
|
||||
return false
|
||||
end
|
||||
if mouseWheel == MouseWheelUp then
|
||||
if self.orientation == 'vertical' then
|
||||
if self.value <= self.minimum then return false end
|
||||
self:decrement()
|
||||
else
|
||||
if self.value >= self.maximum then return false end
|
||||
self:increment()
|
||||
end
|
||||
else
|
||||
if self.orientation == 'vertical' then
|
||||
if self.value >= self.maximum then return false end
|
||||
self:increment()
|
||||
else
|
||||
if self.value <= self.minimum then return false end
|
||||
self:decrement()
|
||||
end
|
||||
end
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UISpinBox = extends(UITextEdit)
|
||||
UISpinBox = extends(UITextEdit, "UISpinBox")
|
||||
|
||||
function UISpinBox.create()
|
||||
local spinbox = UISpinBox.internalCreate()
|
||||
@@ -7,11 +7,13 @@ function UISpinBox.create()
|
||||
spinbox:setValidCharacters('0123456789')
|
||||
spinbox.displayButtons = true
|
||||
spinbox.minimum = 0
|
||||
spinbox.maximum = 0
|
||||
spinbox.maximum = 1
|
||||
spinbox.value = 0
|
||||
spinbox.step = 1
|
||||
spinbox.firstchange = true
|
||||
spinbox.mouseScroll = true
|
||||
spinbox:setText("0")
|
||||
spinbox:setValue(1)
|
||||
return spinbox
|
||||
end
|
||||
|
||||
@@ -21,6 +23,9 @@ function UISpinBox:onSetup()
|
||||
end
|
||||
|
||||
function UISpinBox:onMouseWheel(mousePos, direction)
|
||||
if not self.mouseScroll then
|
||||
return false
|
||||
end
|
||||
if direction == MouseWheelUp then
|
||||
self:up()
|
||||
elseif direction == MouseWheelDown then
|
||||
@@ -70,6 +75,8 @@ function UISpinBox:onStyleApply(styleName, styleNode)
|
||||
addEvent(function() self:setMaximum(value) end)
|
||||
elseif name == 'minimum' then
|
||||
addEvent(function() self:setMinimum(value) end)
|
||||
elseif name == 'mouse-scroll' then
|
||||
addEvent(function() self:setMouseScroll(value) end)
|
||||
elseif name == 'buttons' then
|
||||
addEvent(function()
|
||||
if value then
|
||||
@@ -157,3 +164,11 @@ end
|
||||
function UISpinBox:setStep(step)
|
||||
self.step = step or 1
|
||||
end
|
||||
|
||||
function UISpinBox:setMouseScroll(mouseScroll)
|
||||
self.mouseScroll = mouseScroll
|
||||
end
|
||||
|
||||
function UISpinBox:getMouseScroll()
|
||||
return self.mouseScroll
|
||||
end
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UISplitter = extends(UIWidget)
|
||||
UISplitter = extends(UIWidget, "UISplitter")
|
||||
|
||||
function UISplitter.create()
|
||||
local splitter = UISplitter.internalCreate()
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UITabBar = extends(UIWidget)
|
||||
UITabBar = extends(UIWidget, "UITabBar")
|
||||
|
||||
-- private functions
|
||||
local function onTabClick(tab)
|
||||
|
@@ -5,7 +5,7 @@
|
||||
* Get dynamic row heights working with text wrapping.
|
||||
* Every second row different background color applied.
|
||||
]]
|
||||
UITable = extends(UIWidget)
|
||||
UITable = extends(UIWidget, "UITable")
|
||||
|
||||
local HEADER_ID = 'row0'
|
||||
|
||||
|
@@ -1,5 +1,5 @@
|
||||
-- @docclass
|
||||
UIWindow = extends(UIWidget)
|
||||
UIWindow = extends(UIWidget, "UIWindow")
|
||||
|
||||
function UIWindow.create()
|
||||
local window = UIWindow.internalCreate()
|
||||
@@ -9,10 +9,6 @@ function UIWindow.create()
|
||||
return window
|
||||
end
|
||||
|
||||
function UIWindow:getClassName()
|
||||
return 'UIWindow'
|
||||
end
|
||||
|
||||
function UIWindow:onKeyDown(keyCode, keyboardModifiers)
|
||||
if keyboardModifiers == KeyboardNoModifier then
|
||||
if keyCode == KeyEnter then
|
||||
|
@@ -117,7 +117,11 @@ function disconnect(object, arg1, arg2)
|
||||
end
|
||||
end
|
||||
|
||||
function newclass()
|
||||
function newclass(name)
|
||||
if not name then
|
||||
perror(debug.traceback('new class has no name.'))
|
||||
end
|
||||
|
||||
local class = {}
|
||||
function class.internalCreate()
|
||||
local instance = {}
|
||||
@@ -127,10 +131,16 @@ function newclass()
|
||||
return instance
|
||||
end
|
||||
class.create = class.internalCreate
|
||||
class.__class = name
|
||||
class.getClassName = function() return name end
|
||||
return class
|
||||
end
|
||||
|
||||
function extends(base)
|
||||
function extends(base, name)
|
||||
if not name then
|
||||
perror(debug.traceback('extended class has no name.'))
|
||||
end
|
||||
|
||||
local derived = {}
|
||||
function derived.internalCreate()
|
||||
local instance = base.create()
|
||||
@@ -140,6 +150,8 @@ function extends(base)
|
||||
return instance
|
||||
end
|
||||
derived.create = derived.internalCreate
|
||||
derived.__class = name
|
||||
derived.getClassName = function() return name end
|
||||
return derived
|
||||
end
|
||||
|
||||
@@ -328,4 +340,16 @@ function getOppositeAnchor(anchor)
|
||||
return anchor
|
||||
end
|
||||
|
||||
function makesingleton(obj)
|
||||
local singleton = {}
|
||||
if obj.getClassName then
|
||||
for key,value in pairs(_G[obj:getClassName()]) do
|
||||
if type(value) == 'function' then
|
||||
singleton[key] = function(...) return value(obj, ...) end
|
||||
end
|
||||
end
|
||||
end
|
||||
return singleton
|
||||
end
|
||||
|
||||
-- @}
|
@@ -32,11 +32,11 @@ function init()
|
||||
|
||||
filterPanel = battleWindow:recursiveGetChildById('filterPanel')
|
||||
toggleFilterButton = battleWindow:recursiveGetChildById('toggleFilterButton')
|
||||
|
||||
|
||||
if isHidingFilters() then
|
||||
hideFilterPanel()
|
||||
end
|
||||
|
||||
|
||||
sortTypeBox = battleWindow:recursiveGetChildById('sortTypeBox')
|
||||
sortOrderBox = battleWindow:recursiveGetChildById('sortOrderBox')
|
||||
hidePlayersButton = battleWindow:recursiveGetChildById('hidePlayers')
|
||||
@@ -63,7 +63,7 @@ function init()
|
||||
sortOrderBox:addOption('Desc.', 'desc')
|
||||
sortOrderBox:setCurrentOptionByData(getSortOrder())
|
||||
sortOrderBox.onOptionChange = onChangeSortOrder
|
||||
|
||||
|
||||
connect(Creature, {
|
||||
onSkullChange = updateCreatureSkull,
|
||||
onEmblemChange = updateCreatureEmblem,
|
||||
@@ -73,7 +73,7 @@ function init()
|
||||
onAppear = onCreatureAppear,
|
||||
onDisappear = onCreatureDisappear
|
||||
})
|
||||
|
||||
|
||||
connect(LocalPlayer, {
|
||||
onPositionChange = onCreaturePositionChange
|
||||
})
|
||||
@@ -95,7 +95,7 @@ function terminate()
|
||||
battleWindow:destroy()
|
||||
mouseWidget:destroy()
|
||||
|
||||
disconnect(Creature, {
|
||||
disconnect(Creature, {
|
||||
onSkullChange = updateCreatureSkull,
|
||||
onEmblemChange = updateCreatureEmblem,
|
||||
onOutfitChange = onCreatureOutfitChange,
|
||||
@@ -108,7 +108,7 @@ function terminate()
|
||||
disconnect(LocalPlayer, {
|
||||
onPositionChange = onCreaturePositionChange
|
||||
})
|
||||
|
||||
|
||||
disconnect(g_game, {
|
||||
onAttackingCreatureChange = onAttack,
|
||||
onFollowingCreatureChange = onFollow,
|
||||
@@ -214,38 +214,35 @@ function onChangeSortType(comboBox, option)
|
||||
end
|
||||
|
||||
function onChangeSortOrder(comboBox, option)
|
||||
setSortOrder(option:lower():gsub('[.]', '')) -- Replace dot in option name
|
||||
-- Replace dot in option name
|
||||
setSortOrder(option:lower():gsub('[.]', ''))
|
||||
end
|
||||
|
||||
function checkCreatures()
|
||||
removeAllCreatures()
|
||||
|
||||
local spectators = {}
|
||||
local player = g_game.getLocalPlayer()
|
||||
if g_game.isOnline() then
|
||||
creatures = g_map.getSpectators(player:getPosition(), false)
|
||||
for i, creature in ipairs(creatures) do
|
||||
if creature ~= player and doCreatureFitFilters(creature) then
|
||||
table.insert(spectators, creature)
|
||||
end
|
||||
end
|
||||
if not g_game.isOnline() then
|
||||
return
|
||||
end
|
||||
|
||||
for i, v in pairs(spectators) do
|
||||
addCreature(v)
|
||||
local player = g_game.getLocalPlayer()
|
||||
local spectators = g_map.getSpectators(player:getPosition(), false)
|
||||
for _, creature in ipairs(spectators) do
|
||||
if doCreatureFitFilters(creature) then
|
||||
addCreature(creature)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function doCreatureFitFilters(creature)
|
||||
local localPlayer = g_game.getLocalPlayer()
|
||||
if creature == localPlayer then
|
||||
if creature:isLocalPlayer() then
|
||||
return false
|
||||
end
|
||||
|
||||
local pos = creature:getPosition()
|
||||
if not pos then return false end
|
||||
|
||||
local localPlayer = g_game.getLocalPlayer()
|
||||
if pos.z ~= localPlayer:getPosition().z or not creature:canBeSeen() then return false end
|
||||
|
||||
local hidePlayers = hidePlayersButton:isChecked()
|
||||
@@ -293,23 +290,23 @@ function onCreaturePositionChange(creature, newPos, oldPos)
|
||||
-- Distance will change when moving, recalculate and move to correct index
|
||||
if getSortType() == 'distance' then
|
||||
local distanceList = {}
|
||||
for id, creatureButton in pairs(battleButtonsByCreaturesList) do
|
||||
table.insert(distanceList, {distance = getDistanceBetween(newPos, creatureButton.creature:getPosition()), widget = creatureButton})
|
||||
for _, battleButton in pairs(battleButtonsByCreaturesList) do
|
||||
table.insert(distanceList, {distance = getDistanceBetween(newPos, battleButton.creature:getPosition()), widget = battleButton})
|
||||
end
|
||||
|
||||
|
||||
if isSortAsc() then
|
||||
table.sort(distanceList, function(a, b) return a.distance < b.distance end)
|
||||
else
|
||||
table.sort(distanceList, function(a, b) return a.distance > b.distance end)
|
||||
table.sort(distanceList, function(a, b) return a.distance > b.distance end)
|
||||
end
|
||||
|
||||
|
||||
for i = 1, #distanceList do
|
||||
battlePanel:moveChildToIndex(distanceList[i].widget, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for id, creatureButton in pairs(battleButtonsByCreaturesList) do
|
||||
addCreature(creatureButton.creature)
|
||||
for _, battleButton in pairs(battleButtonsByCreaturesList) do
|
||||
addCreature(battleButton.creature)
|
||||
end
|
||||
end
|
||||
else
|
||||
@@ -335,6 +332,12 @@ function onCreatureOutfitChange(creature, outfit, oldOutfit)
|
||||
end
|
||||
|
||||
function onCreatureAppear(creature)
|
||||
if creature:isLocalPlayer() then
|
||||
addEvent(function()
|
||||
updateStaticSquare()
|
||||
end)
|
||||
end
|
||||
|
||||
if doCreatureFitFilters(creature) then
|
||||
addCreature(creature)
|
||||
end
|
||||
@@ -356,7 +359,7 @@ function addCreature(creature)
|
||||
if not creatureAgeList[creatureId] then
|
||||
creatureAgeList[creatureId] = os.time()
|
||||
end
|
||||
|
||||
|
||||
if not battleButton then
|
||||
battleButton = g_ui.createWidget('BattleButton')
|
||||
battleButton:setup(creature)
|
||||
@@ -373,14 +376,14 @@ function addCreature(creature)
|
||||
if creature == g_game.getFollowingCreature() then
|
||||
onFollow(creature)
|
||||
end
|
||||
|
||||
|
||||
local inserted = false
|
||||
local nameLower = creature:getName():lower()
|
||||
local healthPercent = creature:getHealthPercent()
|
||||
local playerPosition = g_game.getLocalPlayer():getPosition()
|
||||
local distance = getDistanceBetween(playerPosition, creature:getPosition())
|
||||
local age = creatureAgeList[creatureId]
|
||||
|
||||
|
||||
local childCount = battlePanel:getChildCount()
|
||||
for i = 1, childCount do
|
||||
local child = battlePanel:getChildByIndex(i)
|
||||
@@ -412,9 +415,9 @@ function addCreature(creature)
|
||||
break
|
||||
elseif healthPercent == childHealth then
|
||||
equal = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- If any other sort type is selected and values are equal, sort it by name also
|
||||
if getSortType() == 'name' or equal then
|
||||
local length = math.min(childName:len(), nameLower:len())
|
||||
@@ -425,7 +428,7 @@ function addCreature(creature)
|
||||
break
|
||||
elseif (nameLower:byte(j) > childName:byte(j) and isSortAsc()) or (nameLower:byte(j) < childName:byte(j) and isSortDesc()) then
|
||||
break
|
||||
elseif j == nameLower:len() and isSortAsc() then
|
||||
elseif j == nameLower:len() and isSortAsc() then
|
||||
battlePanel:insertChild(i, battleButton)
|
||||
inserted = true
|
||||
elseif j == childName:len() and isSortDesc() then
|
||||
@@ -439,7 +442,7 @@ function addCreature(creature)
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Insert at the end if no other place is found
|
||||
if not inserted then
|
||||
battlePanel:insertChild(childCount + 1, battleButton)
|
||||
@@ -454,8 +457,8 @@ end
|
||||
|
||||
function removeAllCreatures()
|
||||
creatureAgeList = {}
|
||||
for i, v in pairs(battleButtonsByCreaturesList) do
|
||||
removeCreature(v.creature)
|
||||
for _, battleButton in pairs(battleButtonsByCreaturesList) do
|
||||
removeCreature(battleButton.creature)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -478,7 +481,7 @@ function onBattleButtonMouseRelease(self, mousePosition, mouseButton)
|
||||
mouseWidget.cancelNextRelease = false
|
||||
return false
|
||||
end
|
||||
if ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||
if ((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton)
|
||||
or (g_mouse.isPressed(MouseRightButton) and mouseButton == MouseLeftButton)) then
|
||||
mouseWidget.cancelNextRelease = true
|
||||
g_game.look(self.creature)
|
||||
@@ -500,10 +503,10 @@ function onBattleButtonMouseRelease(self, mousePosition, mouseButton)
|
||||
return false
|
||||
end
|
||||
|
||||
function onBattleButtonHoverChange(widget, hovered)
|
||||
if widget.isBattleButton then
|
||||
widget.isHovered = hovered
|
||||
updateBattleButton(widget)
|
||||
function onBattleButtonHoverChange(battleButton, hovered)
|
||||
if battleButton.isBattleButton then
|
||||
battleButton.isHovered = hovered
|
||||
updateBattleButton(battleButton)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -523,6 +526,14 @@ function onFollow(creature)
|
||||
end
|
||||
end
|
||||
|
||||
function updateStaticSquare()
|
||||
for _, battleButton in pairs(battleButtonsByCreaturesList) do
|
||||
if battleButton.isTarget then
|
||||
battleButton:update()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function updateCreatureSkull(creature, skullId)
|
||||
local battleButton = battleButtonsByCreaturesList[creature:getId()]
|
||||
if battleButton then
|
||||
|
@@ -92,7 +92,7 @@ MiniWindow
|
||||
height: 20
|
||||
width: 128
|
||||
margin-top: 6
|
||||
|
||||
|
||||
ComboBox
|
||||
id: sortTypeBox
|
||||
width: 74
|
||||
@@ -107,7 +107,7 @@ MiniWindow
|
||||
anchors.top: parent.top
|
||||
anchors.left: prev.right
|
||||
margin-left: 4
|
||||
|
||||
|
||||
Panel
|
||||
height: 18
|
||||
anchors.top: prev.bottom
|
||||
@@ -132,7 +132,7 @@ MiniWindow
|
||||
anchors.right: miniwindowScrollBar.left
|
||||
margin-right: 1
|
||||
margin-top: 11
|
||||
|
||||
|
||||
MiniWindowContents
|
||||
anchors.top: prev.bottom
|
||||
margin-top: 6
|
||||
|