Ticket #1810: game2.patch

File game2.patch, 16.4 KB (added by jochen, 14 years ago)

Version 2

  • mythgame/mythgame/gametree.h

     
    102102  public slots:
    103103    void handleTreeListSelection(int, IntVector*);
    104104    void handleTreeListEntry(int, IntVector*);
     105    void showImageTimeout(void);
    105106
    106107  protected:
    107108    void keyPressEvent(QKeyEvent *e);
     
    125126    UITextType  *m_gameGenre;
    126127    UITextType  *m_gameFavourite;
    127128    UIImageType *m_gameImage;
     129
     130    QTimer      *timer;
    128131};
    129132
    130133#endif
  • 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.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,
     
    723730    else if (!(handler = GetHandler(romdata)))
    724731    {
    725732        // Couldn't get handler so abort.
    726         return;
     733        return ;
    727734    }
    728735    QString exec = handler->SystemCmdLine();
    729736
     
    806813    handlers->append(handler);
    807814}
    808815
     816void GameHandler::generateScreenshots(void)
     817{
     818    checkHandlers();
     819
     820    GameHandler *handler = handlers->first();
     821
     822    MSqlQuery query(MSqlQuery::InitCon());
     823    while(handler)
     824    {
     825        updateSettings(handler);
     826        if (handler->ScreenShotEnabled())
     827        {
     828
     829        QString thequery;       
     830        thequery = QString("SELECT romname, rompath, gamename, diskcount "
     831                           "FROM gamemetadata WHERE system = '%1';")
     832                           .arg(handler->SystemName());
     833                           
     834        query.exec(thequery);
     835
     836        if (query.isActive() && query.size() >0)
     837        {
     838        while (query.next())
     839        {
     840            QString romname = query.value(0).toString();
     841            QString rompath = query.value(1).toString();
     842            int diskcount   = query.value(3).toInt();
     843            //Get the Extension via the RomInfo Class
     844                RomInfo temp;
     845                temp.setRomname(romname);
     846            QString extension = temp.getExtension();
     847           
     848            QString basename = romname.left(romname.length() - (extension.length() + 2));
     849               
     850            QString exec = handler->SystemCmdLine();
     851
     852            if (handler->GameType() != "PC")
     853            {
     854                QString arg = "\"" + rompath +
     855                               "/" + romname + "\"";
     856
     857                // If they specified a %s in the commandline place the romname
     858                // in that location, otherwise tack it on to the end of
     859                // the command.
     860                if (exec.contains("%s") || handler->SpanDisks())
     861                {
     862                    exec = exec.replace(QRegExp("%s"),arg);
     863
     864                    if (handler->SpanDisks())
     865                    {
     866                        QRegExp rxp = QRegExp( "%d[0-4]", TRUE, FALSE );
     867
     868                        if (exec.contains(rxp))
     869                        {
     870                            if (diskcount > 1)
     871                            {
     872                                // Chop off the extension, .  and last character of the name which we are assuming is the disk #
     873                                QString rom;
     874                                QString diskid[] = { "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6" };
     875
     876                                for (int disk = 1; disk <= diskcount; disk++)
     877                                {
     878                                    rom = QString("\"%1/%2%3.%4\"")
     879                                                .arg(rompath)
     880                                                .arg(basename)
     881                                                .arg(disk)
     882                                                .arg(extension);
     883                                    exec = exec.replace(QRegExp(diskid[disk]),rom);
     884                                }
     885                            }
     886                           
     887                            else
     888                            {   // If there is only one disk make sure we replace %d1 just like %s
     889                                exec = exec.replace(QRegExp("%d1"),arg);
     890                            }
     891                        }
     892                    }
     893                }
     894                else
     895                {
     896                    exec = exec + " \"" +
     897                            rompath + "/" +
     898                            romname + "\"";
     899                }
     900            }
     901
     902            QString savedir = QDir::currentDirPath ();
     903            QDir d;
     904            if (handler->SystemWorkingPath()) {
     905                if (!d.cd(handler->SystemWorkingPath()))
     906                {
     907                cout << "Failed to change to specified Working Directory : " << handler->SystemWorkingPath() << endl;
     908                }
     909            }
     910       
     911            if (handler->ScreenShotCmd().length() < 2)
     912                screencmd = gContext->GetSetting("GameScreenshotCmd");
     913            else
     914                screencmd = handler->ScreenShotCmd();
     915           
     916            if (screencmd.contains("%p"))
     917                {
     918                QString reptxt = handler->SystemScreenShots() + "/" + basename;
     919                screencmd = screencmd.replace(QRegExp("%p"),reptxt);       
     920                }
     921
     922            if (screencmd.contains("%s"))
     923                {
     924                QString reptxt = rompath + "/" + romname;
     925                screencmd = screencmd.replace(QRegExp("%s"),reptxt);       
     926                }
     927
     928            process = new QProcess();
     929           
     930            QStringList lst( QStringList::split( " ", exec ) );
     931           
     932            //Combine Parameters within "" to 1 Argument!
     933            QStringList s2;
     934           
     935            for(int i = 0; i < lst.count(); i++)
     936            {
     937                if(lst[i][0] == '"')
     938                {
     939                    if(lst[i][lst[i].length()-1] == '"')
     940                    {
     941                        s2.append(lst[i]);
     942                    }
     943                    else
     944                    {
     945                        QString s = lst[i];
     946                        s += " ";
     947                       
     948                        for(int j = i+1; j < lst.count(); j++)
     949                        {
     950                            s += lst[j];
     951                            if (s[s.length()-1] == '"')
     952                            {
     953                                s2.append(s);
     954                                i=j;
     955                                break;
     956                            }
     957                            else
     958                                s += " ";
     959                        }
     960                    }
     961                }
     962                else
     963                    s2.append(lst[i]);
     964            }
     965        process->setArguments(s2);
     966
     967            QString ShotTime = gContext->GetSetting("GameScreenshotTime");
     968            int myShotTime = ShotTime.toInt() * 1000;
     969
     970            QTimer::singleShot( myShotTime, this, SLOT( screenshotTimeout() ) );
     971            if (!process->start())
     972                cout << "Error running Process:" << exec << endl;
     973           
     974            while (process->isRunning()){ qApp->processEvents(); }
     975           
     976       
     977        }
     978        }
     979        }
     980        handler = handlers->next();
     981       
     982    }
     983}
     984void GameHandler::screenshotTimeout(void)
     985{
     986    myth_system(screencmd);
     987    process->kill();
     988}
  • 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/gametree.cpp

     
    136136
    137137    m_gameTree = new GenericTree("game root", 0, false);
    138138
     139    timer = new QTimer( this );
     140    connect( timer, SIGNAL(timeout()),  SLOT(showImageTimeout()) );
     141         
    139142    wireUpTheme();
    140143    //  create system filter to only select games where handlers are present
    141144    QString systemFilter;
     
    251254            if (romInfo->ImagePath())
    252255            {
    253256                m_gameImage->SetImage(romInfo->ImagePath());
    254                 m_gameImage->LoadImage();
     257                if ( timer->isActive() )
     258                    timer->changeInterval(300);
     259                else
     260                    timer->start(300, true);
    255261            }
    256262        }
    257263    }
    258264    else
    259265    {   // Otherwise use some defaults.
     266        timer->stop();
    260267        m_gameImage->SetImage("");
    261268        m_gameTitle->SetText("");
    262269        m_gameSystem->SetText("Unknown");
     
    267274
    268275}
    269276
     277void GameTree::showImageTimeout(void)
     278{
     279    m_gameImage->LoadImage();
     280}
     281
    270282QString getElement(QStringList list, int pos)
    271283{
    272284    int curpos = 0;
  • 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("Generation of SCreenshots Enabled"));
     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