Ticket #1810: game3.patch

File game3.patch, 14.8 KB (added by babysimon, 13 years ago)

Patch that works for me

  • mythgame/mythgame/gamehandler.cpp

     
    33#include "rom_metadata.h"
    44
    55#include <qobject.h>
     6#include <qapplication.h>
     7#include <qtimer.h>
     8#include <qprocess.h>
    69#include <qptrlist.h>
    710#include <qstringlist.h>
    811#include <iostream>
     
    1417#include <mythtv/mythdialogs.h>
    1518#include <mythtv/util.h>
    1619
     20QProcess *process;
     21QString screencmd;
     22
    1723using namespace std;
    1824
    1925static QPtrList<GameHandler> *handlers = 0;
     
    6470void GameHandler::updateSettings(GameHandler *handler)
    6571{
    6672    MSqlQuery query(MSqlQuery::InitCon());
    67     query.exec("SELECT rompath, workingpath, commandline, screenshots, gameplayerid, gametype, extensions, spandisks  FROM gameplayers WHERE playername = \"" + handler->SystemName() + "\";");
     73    query.exec("SELECT rompath, workingpath, commandline, screenshots, gameplayerid, gametype, extensions, spandisks, screenshotenabled, screenshotcmd FROM gameplayers WHERE playername = \"" + handler->SystemName() + "\";");
    6874
    6975    query.next();
    7076    handler->rompath = query.value(0).toString();
     
    7581    handler->gametype = query.value(5).toString();
    7682    handler->validextensions = QStringList::split(",", query.value(6).toString().stripWhiteSpace().remove(" "));
    7783    handler->spandisks = query.value(7).toInt();
     84    handler->screenshotenabled = query.value(8).toInt();
     85    handler->screenshotcmd = query.value(9).toInt();
    7886
    7987}
    8088
     
    131139        cerr << "No romDB data read from database. Not imported?" << endl;
    132140    else
    133141        cerr << "Loaded " << romDB.count() << " items from romDB Database" << endl;
    134 
    135142}
    136143
    137144void GameHandler::GetMetadata(GameHandler *handler, QString rom, QString* Genre, QString* Year,
     
    733740    else if (!(handler = GetHandler(romdata)))
    734741    {
    735742        // Couldn't get handler so abort.
    736         return;
     743        return ;
    737744    }
    738745    QString exec = handler->SystemCmdLine();
    739746
     
    816823    handlers->append(handler);
    817824}
    818825
     826void GameHandler::generateScreenshots(void)
     827{
     828    checkHandlers();
     829
     830    GameHandler *handler = handlers->first();
     831
     832    MSqlQuery query(MSqlQuery::InitCon());
     833    while(handler)
     834    {
     835        updateSettings(handler);
     836        if (handler->ScreenShotEnabled())
     837        {
     838        QString thequery;       
     839        thequery = QString("SELECT romname, rompath, gamename, diskcount "
     840                           "FROM gamemetadata WHERE system = '%1';")
     841                           .arg(handler->SystemName());
     842                           
     843        query.exec(thequery);
     844
     845        if (query.isActive() && query.size() >0)
     846        {
     847        while (query.next())
     848
     849        {
     850            QString romname = query.value(0).toString();
     851            QString rompath = query.value(1).toString();
     852            int diskcount   = query.value(3).toInt();
     853            //Get the Extension via the RomInfo Class
     854                RomInfo temp;
     855                temp.setRomname(romname);
     856            QString extension = temp.getExtension();
     857           
     858            QString basename = romname.left(romname.length() - (extension.length() + 1));
     859               
     860            QString exec = handler->SystemCmdLine();
     861
     862            if (handler->GameType() != "PC")
     863            {
     864                QString arg = "\"" + rompath +
     865                               "/" + romname + "\"";
     866
     867                // If they specified a %s in the commandline place the romname
     868                // in that location, otherwise tack it on to the end of
     869                // the command.
     870                if (exec.contains("%s") || handler->SpanDisks())
     871                {
     872                    exec = exec.replace(QRegExp("%s"),arg);
     873
     874                    if (handler->SpanDisks())
     875                    {
     876                        QRegExp rxp = QRegExp( "%d[0-4]", TRUE, FALSE );
     877
     878                        if (exec.contains(rxp))
     879                        {
     880                            if (diskcount > 1)
     881                            {
     882                                // Chop off the extension, .  and last character of the name which we are assuming is the disk #
     883                                QString rom;
     884                                QString diskid[] = { "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6" };
     885
     886                                for (int disk = 1; disk <= diskcount; disk++)
     887                                {
     888                                    rom = QString("\"%1/%2%3.%4\"")
     889                                                .arg(rompath)
     890                                                .arg(basename)
     891                                                .arg(disk)
     892                                                .arg(extension);
     893                                    exec = exec.replace(QRegExp(diskid[disk]),rom);
     894                                }
     895                            }
     896                           
     897                            else
     898                            {   // If there is only one disk make sure we replace %d1 just like %s
     899                                exec = exec.replace(QRegExp("%d1"),arg);
     900                            }
     901                        }
     902                    }
     903                }
     904                else
     905                {
     906                    exec = exec + " \"" +
     907                            rompath + "/" +
     908                            romname + "\"";
     909                }
     910            }
     911
     912            QString savedir = QDir::currentDirPath ();
     913            QDir d;
     914            if (handler->SystemWorkingPath()) {
     915                if (!d.cd(handler->SystemWorkingPath()))
     916                {
     917                cout << "Failed to change to specified Working Directory : " << handler->SystemWorkingPath() << endl;
     918                }
     919            }
     920       
     921            if (handler->ScreenShotCmd().length() < 2)
     922                screencmd = gContext->GetSetting("GameScreenshotCmd");
     923            else
     924                screencmd = handler->ScreenShotCmd();
     925           
     926            if (screencmd.contains("%p"))
     927                {
     928                QString reptxt = handler->SystemScreenShots() + "/" + basename;
     929                screencmd = screencmd.replace(QRegExp("%p"),reptxt);
     930                }
     931
     932            if (screencmd.contains("%s"))
     933                {
     934                QString reptxt = rompath + "/" + romname;
     935                screencmd = screencmd.replace(QRegExp("%s"),reptxt);       
     936                }
     937
     938            process = new QProcess();
     939           
     940            // We need to pass separate args to QProcess. Rather than split
     941            // "exec" up, (which would require parsing the user-supplied
     942            // command), get sh to do it
     943            QStringList shellCmd;
     944           
     945            shellCmd.append("sh");
     946            shellCmd.append("-c");
     947            shellCmd.append(exec);
     948
     949            process->setArguments(shellCmd);
     950
     951            QString ShotTime = gContext->GetSetting("GameScreenshotTime");
     952            int myShotTime = ShotTime.toInt() * 1000;
     953
     954            QTimer::singleShot( myShotTime, this, SLOT( screenshotTimeout() ) );
     955
     956            if (!process->start())
     957                cout << "Error running Process:" << exec << endl;
     958           
     959            while (process->isRunning()){
     960                qApp->processEvents();
     961            }
     962
     963            delete process;
     964        }
     965        }
     966        }
     967        handler = handlers->next();
     968       
     969    }
     970}
     971void GameHandler::screenshotTimeout(void)
     972{
     973    myth_system(screencmd);
     974    process->kill();
     975}
  • mythgame/mythgame/game_settings.xml

     
    2121      <text>Game Players</text>
    2222      <text lang="IT">Impostazioni generali</text>
    2323      <text lang="ES">Opciones Reproductores</text>
    24       <text lang="CA">Opcions Generals</text>
    25       <text lang="DE">Grundeinstellungen</text>
     24      <text lang="CA"></text>
     25      <text lang="DE">Spielestarter</text>
    2626      <text lang="DK">Spil Systemer</text>
    2727      <text lang="NL">Algemeen</text>
    2828      <text lang="PT">Jogadores</text>
     
    5050      <text>Clear Game Data</text>
    5151      <text lang="IT">Impostazioni generali</text>
    5252      <text lang="ES">Borrar Datos</text>
    53       <text lang="CA">Opcions Generals</text>
    54       <text lang="DE">Grundeinstellungen</text>
     53      <text lang="CA"></text>
     54      <text lang="DE">Loesche Spieleliste</text>
    5555      <text lang="DK">Slet spil data</text>
    56       <text lang="NL">Algemeen</text>
     56      <text lang="NL"></text>
    5757      <text lang="PT">Apagar Dados de Jogos</text>
    5858      <text lang="SV">Generella instÀllningar</text>
    5959      <text lang="SI">SploÅ¡ne nastavitve</text>
     
    6161      <action>CLEAR_GAME_DATA</action>
    6262   </button>
    6363
     64   <button>
     65      <type>GAME_SETTINGS_GENERAL</type>
     66      <text>Generate Screenshots</text>
     67      <text lang="IT"></text>
     68      <text lang="ES"></text>
     69      <text lang="CA"></text>
     70      <text lang="DE">Screenshots erzeugen</text>
     71      <text lang="DK"></text>
     72      <text lang="NL"></text>
     73      <text lang="PT"></text>
     74      <text lang="SV"></text>
     75      <text lang="SI"></text>
     76      <text lang="FI"></text>
     77      <action>GENERATE_SCREENSHOTS</action>
     78   </button>
    6479
    6580</mythmenu>
  • mythgame/mythgame/gamehandler.h

     
    5353
    5454typedef QMap <QString, GameScan> GameScanMap;
    5555
    56 class GameHandler
    57 {
     56class GameHandler : public QObject
     57
     58 
     59  Q_OBJECT
     60 
    5861  public:
    5962    GameHandler()
    6063    {
     
    7881    void VerifyGameDB(GameHandler *handler);
    7982
    8083    static void clearAllGameData(void);
     84    void generateScreenshots(void);
    8185
    8286    static int buildFileCount(QString directory, GameHandler *handler);
    8387    void buildFileList(QString directory, GameHandler *handler,
     
    96100
    97101    static RomInfo* create_rominfo(RomInfo* parent);
    98102    int SpanDisks() const { return spandisks; }
     103    int ScreenShotEnabled() const { return screenshotenabled; }
    99104    QString SystemName() const { return systemname; }
    100105    QString SystemCmdLine() const { return commandline; }
    101106    QString SystemRomPath() const { return rompath; }
     
    103108    QString SystemScreenShots() const { return screenshots; }
    104109    uint GamePlayerID() const { return gameplayerid; }
    105110    QString GameType() const { return gametype; }
     111    QString ScreenShotCmd() const { return screenshotcmd; }
     112   
     113  public slots:
     114    void screenshotTimeout(void);
    106115
    107116  protected:
    108117    static GameHandler* GetHandler(RomInfo *rominfo);
     
    110119
    111120    bool rebuild;
    112121    int spandisks;
     122    int screenshotenabled;
    113123    QString systemname;
    114124    QString rompath;
    115125    QString commandline;
     
    117127    QString screenshots;
    118128    uint gameplayerid;
    119129    QString gametype;
     130    QString screenshotcmd;
    120131    QStringList validextensions;
    121132
    122133    RomDBMap romDB;
  • mythgame/mythgame/dbcheck.cpp

     
    1010
    1111#include "gamesettings.h"
    1212
    13 const QString currentDatabaseVersion = "1012";
     13const QString currentDatabaseVersion = "1013";
    1414
    1515static bool UpdateDBVersionNumber(const QString &newnumber)
    1616{
     
    320320    }
    321321
    322322
     323    if (dbver == "1012")
     324    {
     325        const QString updates[] = {
     326"ALTER TABLE gameplayers ADD COLUMN screenshotcmd text NOT NULL default ''; ",
     327"ALTER TABLE gameplayers ADD COLUMN screenshotenabled tinyint(1) NOT NULL default '0'; ",
     328""
     329};
    323330
     331        if (!performActualUpdate(updates, "1013", dbver))
     332            return false;
     333    }
    324334
    325335
     336
     337
     338
    326339    return true;
    327340}
  • mythgame/mythgame/main.cpp

     
    3333        settings.exec();
    3434    }
    3535
    36     if (sel == "game_players")
     36    else if (sel == "game_players")
    3737    {
    3838        MythGamePlayerEditor mgpe;
    3939        mgpe.exec();
     
    4242    {
    4343        GameHandler::processAllGames();
    4444    }
    45     if (sel == "clear_game_data")
     45   
     46    else if (sel == "clear_game_data")
    4647    {
    4748        GameHandler::clearAllGameData();
    4849    }
    4950
     51    else if (sel == "generate_screenshots")
     52    {
     53        GameHandler myHandler;
     54        myHandler.generateScreenshots();
     55    }
     56
    5057}
    5158
    5259void runMenu(QString which_menu)
  • mythgame/mythgame/gamesettings.cpp

     
    7676    return gc;
    7777}   
    7878
     79static HostLineEdit *GameScreenshotCmd()
     80{
     81    HostLineEdit *gc = new HostLineEdit("GameScreenshotCmd");
     82    gc->setLabel(QObject::tr("Screenshot Command"));
     83    gc->setValue("/usr/bin/scrot --quality 1 \"%p.png\"");
     84    gc->setHelpText(QObject::tr("Programm wich generate Screenshots "
     85                    "when the Rom ist started in Background "
     86                    "use %s for romname and %p for the imagename without extension."));
     87    return gc;
     88}
    7989
     90static HostLineEdit *GameScreenshotTime()
     91{
     92    HostLineEdit *gc = new HostLineEdit("GameScreenshotTime");
     93    gc->setLabel(QObject::tr("Screenshot Timeout:"));
     94    gc->setValue("10");
     95    gc->setHelpText(QObject::tr("Enter Time (in seconds) after wich a Screenshot is taken"));
     96    return gc;
     97}
     98
    8099MythGameGeneralSettings::MythGameGeneralSettings()
    81100{
    82101    VerticalConfigurationGroup *general = new VerticalConfigurationGroup(false);
     
    87106    general->addChild(GameRemovalPrompt());
    88107    general->addChild(GameShowFileNames());
    89108
     109    VerticalConfigurationGroup *screenshot = new VerticalConfigurationGroup(false);
     110    screenshot->setLabel(QObject::tr("MythGame Settings -- Screenshots"));
     111    screenshot->addChild(GameScreenshotCmd());
     112    screenshot->addChild(GameScreenshotTime());
     113
    90114    addChild(general);
     115    addChild(screenshot);
    91116
    92117}
    93118
     
    183208    };
    184209};
    185210
     211class GenerateScreenshots: virtual public MGSetting, virtual public CheckBoxSetting {
     212public:
     213    GenerateScreenshots(const MythGamePlayerSettings& parent):
     214        MGSetting(parent, "screenshotenabled") {
     215        setLabel(QObject::tr("Generate screenshots"));
     216        setHelpText(QObject::tr("This setting means that this Gameplayer is included in the generation of screenshots."));
     217    };
     218};
     219
     220class GenerateScreenshotsCmd: virtual public MGSetting, virtual public LineEditSetting {
     221public:
     222    GenerateScreenshotsCmd(const MythGamePlayerSettings& parent):
     223        MGSetting(parent, "screenshotcmd") {
     224        setLabel(QObject::tr("Screenshot Command"));
     225        setHelpText(QObject::tr("If you want another Command then the global to Generate Screenshots, Enter it here!"));
     226    };
     227};
     228
    186229MythGamePlayerSettings::MythGamePlayerSettings()
    187230{
    188231    // must be first
     
    198241    group->addChild(new WorkingDirPath(*this));
    199242    group->addChild(new Extensions(*this));
    200243    group->addChild(new AllowMultipleRoms(*this));
     244    group->addChild(new GenerateScreenshots(*this));
     245    group->addChild(new GenerateScreenshotsCmd(*this));
    201246    addChild(group);
    202247};
    203248