# HG changeset patch # User unc0rr # Date 1418850233 -10800 # Node ID 20a2d5e6930a08adc1f29852e4edb873e03e228c # Parent 4afb4c4bf495ffda89dc38b4f887494108fbf4fe Schemes list combobox with their names diff -r 4afb4c4bf495 -r 20a2d5e6930a hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Sun Dec 07 22:22:39 2014 +0300 +++ b/hedgewars/CMakeLists.txt Thu Dec 18 00:03:53 2014 +0300 @@ -104,6 +104,7 @@ uFLGameConfig.pas uFLIPC.pas uFLScripts.pas + uFLSchemes.pas uFLTeams.pas uFLTypes.pas uFLUtils.pas diff -r 4afb4c4bf495 -r 20a2d5e6930a hedgewars/hwLibrary.pas --- a/hedgewars/hwLibrary.pas Sun Dec 07 22:22:39 2014 +0300 +++ b/hedgewars/hwLibrary.pas Thu Dec 18 00:03:53 2014 +0300 @@ -45,6 +45,7 @@ , uFLData , uFLTeams , uFLScripts + , uFLSchemes ; {$INCLUDE "config.inc"} @@ -161,6 +162,7 @@ freeThemesList, getThemeIcon, getScriptsList, + getSchemesList, getTeamsList, tryAddTeam, tryRemoveTeam, diff -r 4afb4c4bf495 -r 20a2d5e6930a hedgewars/uFLSchemes.pas --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hedgewars/uFLSchemes.pas Thu Dec 18 00:03:53 2014 +0300 @@ -0,0 +1,155 @@ +unit uFLSchemes; +interface +uses uFLTypes; + +function getSchemesList: PPChar; cdecl; +procedure freeSchemesList; + +implementation +uses uFLUtils, uFLIPC, uPhysFSLayer, uFLData; + +const MAX_SCHEME_NAMES = 64; +type + TScheme = record + schemeName: shortstring; + end; + PScheme = ^TScheme; + TSchemeArray = array [0..0] of TScheme; + PSchemeArray = ^TSchemeArray; +var + schemesList: PScheme; + schemesNumber: LongInt; + listOfSchemeNames: array[0..MAX_SCHEME_NAMES] of PChar; + +procedure loadSchemes; +var f: PFSFile; + scheme: PScheme; + schemes: PSchemeArray; + s: shortstring; + l, i: Longword; +begin + f:= pfsOpenRead('/Config/schemes.ini'); + schemesNumber:= 0; + + if f <> nil then + begin + while (not pfsEOF(f)) and (schemesNumber = 0) do + begin + pfsReadLn(f, s); + + if copy(s, 1, 5) = 'size=' then + schemesNumber:= strToInt(midStr(s, 6)); + end; + + //inc(schemesNumber); // add some default schemes + + schemesList:= GetMem(sizeof(schemesList^) * (schemesNumber + 1)); + schemes:= PSchemeArray(schemesList); + + while (not pfsEOF(f)) do + begin + pfsReadLn(f, s); + + i:= 1; + while(i <= length(s)) and (s[i] <> '\') do inc(i); + + if i < length(s) then + begin + l:= strToInt(copy(s, 1, i - 1)); + + if (l < schemesNumber) and (l > 0) then + begin + scheme:= @schemes^[l - 1]; + + if copy(s, i + 1, 5) = 'name=' then + scheme^. schemeName:= midStr(s, i + 6); + end; + end; + end; + + pfsClose(f) + end; +{ +name=AI TEST +fortsmode=false +divteams=false +solidland=false +border=false +lowgrav=false +laser=false +invulnerability=false +mines=true +damagefactor=100 +turntime=40 +health=100 +suddendeath=0 +caseprobability=5 +vampiric=false +karma=false +artillery=false +minestime=0 +landadds=4 +randomorder=true +king=false +placehog=false +sharedammo=false +disablegirders=false +minedudpct=100 +explosives=40 +disablelandobjects=true +aisurvival=true +resethealth=false +infattack=true +resetweps=true +perhogammo=false +minesnum=0 +healthprobability=100 +healthcaseamount=50 +waterrise=0 +healthdecrease=0 +disablewind=false +morewind=false +ropepct=100 +tagteam=false +getawaytime=100 +bottomborder=false +worldedge=1 +scriptparam=@Invalid() +} +end; + + +function getSchemesList: PPChar; cdecl; +var i, t, l: Longword; + scheme: PScheme; +begin + if schemesList = nil then + loadSchemes; + + t:= schemesNumber; + if t >= MAX_SCHEME_NAMES then + t:= MAX_SCHEME_NAMES; + + scheme:= schemesList; + for i:= 0 to Pred(t) do + begin + l:= length(scheme^.schemeName); + if l >= 255 then l:= 254; + scheme^.schemeName[l + 1]:= #0; + listOfSchemeNames[i]:= @scheme^.schemeName[1]; + inc(scheme) + end; + + listOfSchemeNames[t]:= nil; + + getSchemesList:= listOfSchemeNames +end; + + +procedure freeSchemesList; +begin + if schemesList <> nil then + FreeMem(schemesList, sizeof(schemesList^) * schemesNumber) +end; + +end. diff -r 4afb4c4bf495 -r 20a2d5e6930a hedgewars/uFLUtils.pas --- a/hedgewars/uFLUtils.pas Sun Dec 07 22:22:39 2014 +0300 +++ b/hedgewars/uFLUtils.pas Thu Dec 18 00:03:53 2014 +0300 @@ -3,6 +3,7 @@ function str2PChar(const s: shortstring): PChar; function intToStr(n: LongInt): shortstring; +function strToInt(s: shortstring): LongInt; function midStr(s: shortstring; pos: byte): shortstring; procedure underScore2Space(var s: shortstring); @@ -27,6 +28,11 @@ str(n, intToStr) end; +function strToInt(s: shortstring): LongInt; +begin +val(s, strToInt); +end; + function midStr(s: shortstring; pos: byte): shortstring; begin midStr:= copy(s, pos, length(s) - pos + 1) diff -r 4afb4c4bf495 -r 20a2d5e6930a qmlFrontend/flib.h --- a/qmlFrontend/flib.h Sun Dec 07 22:22:39 2014 +0300 +++ b/qmlFrontend/flib.h Thu Dec 18 00:03:53 2014 +0300 @@ -45,6 +45,7 @@ typedef uint32_t getThemeIcon_t(char * theme, char * buffer, uint32_t size); typedef char **getScriptsList_t(); +typedef char **getSchemesList_t(); typedef char **getTeamsList_t(); typedef void tryAddTeam_t(const char * teamName); diff -r 4afb4c4bf495 -r 20a2d5e6930a qmlFrontend/hwengine.cpp --- a/qmlFrontend/hwengine.cpp Sun Dec 07 22:22:39 2014 +0300 +++ b/qmlFrontend/hwengine.cpp Thu Dec 18 00:03:53 2014 +0300 @@ -25,6 +25,7 @@ freeThemesList_t *flibFreeThemesList; getThemeIcon_t *flibGetThemeIcon; getScriptsList_t *flibGetScriptsList; + getSchemesList_t *flibGetSchemesList; getTeamsList_t *flibGetTeamsList; tryAddTeam_t * flibTryAddTeam; tryRemoveTeam_t * flibTryRemoveTeam; @@ -62,6 +63,7 @@ flibGetThemeIcon = (getThemeIcon_t*) hwlib.resolve("getThemeIcon"); flibGetScriptsList = (getScriptsList_t*) hwlib.resolve("getScriptsList"); + flibGetSchemesList = (getSchemesList_t*) hwlib.resolve("getSchemesList"); flibResetGameConfig = (resetGameConfig_t*) hwlib.resolve("resetGameConfig"); flibGetTeamsList = (getTeamsList_t*) hwlib.resolve("getTeamsList"); @@ -171,25 +173,25 @@ QStringList resultModel; char ** themes = flibGetThemesList(); - for (char **i = themes; *i != NULL; i++) { - QString theme = QString::fromUtf8(*i); - - resultModel << theme; - } + for (char **i = themes; *i != NULL; i++) + resultModel << QString::fromUtf8(*i); flibFreeThemesList(themes); m_engine->rootContext()->setContextProperty("themesModel", QVariant::fromValue(resultModel)); + // scripts model resultModel.clear(); - char ** scripts = flibGetScriptsList(); - - for (char **i = scripts; *i != NULL; i++) { - QString script = QString::fromUtf8(*i); - - resultModel << script; - } + for (char **i = flibGetScriptsList(); *i != NULL; i++) + resultModel << QString::fromUtf8(*i); m_engine->rootContext()->setContextProperty("scriptsModel", QVariant::fromValue(resultModel)); + + // schemes model + resultModel.clear(); + for (char **i = flibGetSchemesList(); *i != NULL; i++) + resultModel << QString::fromUtf8(*i); + + m_engine->rootContext()->setContextProperty("schemesModel", QVariant::fromValue(resultModel)); } void HWEngine::getTeamsList() diff -r 4afb4c4bf495 -r 20a2d5e6930a qmlFrontend/qml/qmlFrontend/GameConfig.qml --- a/qmlFrontend/qml/qmlFrontend/GameConfig.qml Sun Dec 07 22:22:39 2014 +0300 +++ b/qmlFrontend/qml/qmlFrontend/GameConfig.qml Thu Dec 18 00:03:53 2014 +0300 @@ -101,6 +101,38 @@ } } + HWComboBox { + id: cbScheme + x: 50 + y: 336 + width: 256 + height: 64 + + model: schemesModel + delegate: Rectangle { + height: 25 + width: 100 + color: "transparent" + + property string itemIconSource: "" + property alias itemText: schemeName.text + + Row { + //Image {id: themeIcon; width: height; height: parent.height; source: "image://theme/" + modelData} + Text {id: schemeName; text: modelData } + } + + MouseArea { + z: 1 + anchors.fill: parent + onClicked: { + cbScheme.currentIndex = index + //HWEngine.setScheme(schemeName.text) + } + } + } + } + ListView { id: playingTeamsList