Ticket #6627: mythgame_to_mythui2.patch

File mythgame_to_mythui2.patch, 87.4 KB (added by Mike Rice <mikerice1969@…>, 11 years ago)

added mythui screens for details and edit, includes earlier changes and art changes

  • mythtv/themes/Terra/game-ui.xml

     
     1<mythuitheme>
     2
     3  <window name="gameui">
     4
     5    <imagetype name="fanart" from="basebackdrop" />
     6    <imagetype name="topbar" from="basetopbar" />
     7
     8    <textarea name="heading" from="baseheading">
     9        <value>Play Games</value>
     10    </textarea>
     11
     12    <buttontree name="gametreelist">
     13        <area>8,52,1264,375</area>
     14        <numlists>3</numlists>
     15        <spacing>10</spacing>
     16        <buttonlist name="listtemplate">
     17            <area>0,0,1264,375</area>
     18            <layout>vertical</layout>
     19            <buttonarea>0,0,100%,97%</buttonarea>
     20            <statetype name="buttonitem">
     21                <state name="active">
     22                    <area>0,0,100%,30</area>
     23                    <imagetype name="buttonbackground">
     24                        <gradient start="#4b4b3e" end="#4b4b3e" alpha="255"/>
     25                    </imagetype>
     26                    <textarea name="buttontext">
     27                        <area>5,0,85%,30</area>
     28                        <font>basesmall</font>
     29                        <cutdown>yes</cutdown>
     30                        <align>left,vcenter</align>
     31                    </textarea>
     32                </state>
     33                <state name="selected" from="active">
     34                    <imagetype name="buttonbackground">
     35                        <gradient start="#8a916f" end="#8a916f" alpha="255"/>
     36                    </imagetype>
     37                    <textarea name="buttontext">
     38                        <area>5,0,85%,30</area>
     39                        <font>basesmallbrown</font>
     40                        <cutdown>yes</cutdown>
     41                        <align>left,vcenter</align>
     42                    </textarea>
     43                </state>
     44                <state name="inactive" from="active" />
     45            </statetype>
     46        </buttonlist>
     47    </buttontree>
     48
     49    <textarea name="gametitle">
     50        <area>296,440,752,60</area>
     51        <font>baseextralarge</font>
     52    </textarea>
     53
     54    <textarea name="system">
     55        <area>296,510,140,35</area>
     56        <font>basemedium</font>
     57        <value>System:</value>
     58    </textarea>
     59
     60    <textarea name="systemname">
     61        <area>436,510,580,35</area>
     62        <font>basemedium</font>
     63    </textarea>
     64
     65    <textarea name="year">
     66        <area>296,545,140,35</area>
     67        <font>basemedium</font>
     68        <value>Year:</value>
     69    </textarea>
     70
     71    <textarea name="yearname">
     72        <area>436,545,580,35</area>
     73        <font>basemedium</font>
     74    </textarea>
     75
     76    <textarea name="genre">
     77        <area>296,580,140,35</area>
     78        <font>basemedium</font>
     79        <value>Genre:</value>
     80    </textarea>
     81
     82    <textarea name="genrename">
     83        <area>436,580,580,35</area>
     84        <font>basemedium</font>
     85    </textarea>
     86
     87    <textarea name="favorite">
     88        <area>296,615,140,35</area>
     89        <font>basemedium</font>
     90        <value>Favorite:</value>
     91    </textarea>
     92
     93    <textarea name="showfavorite">
     94        <area>436,615,580,35</area>
     95        <font>basemedium</font>
     96    </textarea>
     97
     98    <imagetype name="gameimage">
     99          <area>880,448,300,196</area>
     100    </imagetype>
     101
     102    <imagetype name="boxart">
     103          <area>25,448,300,196</area>
     104          <preserveaspect>true</preserveaspect>
     105    </imagetype>
     106
     107  </window>
     108
     109</mythuitheme>
  • mythplugins/mythgame/theme/default/game-ui.xml

     
    11<mythuitheme>
    22
    3   <window name="gametree">
     3  <window name="gameui">
    44
    5     <font name="active" face="Arial">
    6         <color>#ffffff</color>
    7         <size>18</size>
    8         <bold>yes</bold>
    9     </font>
     5    <imagetype name="fanart">
     6        <area>0,0,800,600</area>
     7    </imagetype>
    108
    11     <font name="inactive" face="Arial">
    12         <color>#9999cc</color>
    13         <size>18</size>
    14         <bold>yes</bold>
    15     </font>
    16 
    17     <font name="selectable" face="Arial">
    18         <color>#8cdeff</color>
    19         <size>18</size>
    20         <bold>yes</bold>
    21     </font>
    22 
    239    <font name="largetitle" face="Arial">
    2410        <color>#ffffff</color>
    2511        <dropcolor>#000000</dropcolor>
     
    3319        <size>20</size>
    3420        <bold>yes</bold>
    3521    </font>
    36 
    37     <container name="background">
    38         <image name="filler" draworder="0" fleximage="yes">
    39             <filename>background.png</filename>
    40             <position>0,10</position>
    41         </image>
    42         <image name="titlelines" draworder="0" fleximage="no">
    43             <filename>trans-titles.png</filename>
    44             <position>0,10</position>
    45         </image>
    46         <image name="infofiller" draworder="0" fleximage="no">
    47             <filename>pf-top.png</filename>
    48             <position>26,350</position>
    49         </image>
    50     </container>
    51 
    52     <container name="gameselector">
     22   
     23    <buttontree name="gametreelist">
    5324        <area>0,10,800,310</area>
    54         <managedtreelist name="gametreelist" draworder="1" bins="2">
    55             <area>40,10,720,270</area>
    56             <image function="selectionbar" filename="mv_selectionbar.png"></image>
    57             <image function="uparrow" filename="mv_up_arrow.png"></image>
    58             <image function="downarrow" filename="mv_down_arrow.png"></image>
    59             <image function="leftarrow" filename="mv_left_arrow.png"></image>
    60             <image function="rightarrow" filename="mv_right_arrow.png"></image>
    61             <bin number="1">
    62                 <area>30,16,190,250</area>
    63                 <fcnfont name="active" function="active"></fcnfont>
    64                 <fcnfont name="inactive" function="inactive"></fcnfont>
    65                 <fcnfont name="active" function="selected"></fcnfont>
    66                 <fcnfont name="selectable" function="selectable"></fcnfont>
    67             </bin>
    68             <bin number="2">
    69                 <area>235,10,535,270</area>
    70                 <fcnfont name="active" function="active"></fcnfont>
    71                 <fcnfont name="active" function="selected"></fcnfont>
    72                 <fcnfont name="inactive" function="inactive"></fcnfont>
    73                 <fcnfont name="selectable" function="selectable"></fcnfont>
    74             </bin>
    75         </managedtreelist>
     25        <numlists>2</numlists>
     26        <spacing>10</spacing>
     27        <buttonlist name="listtemplate" from="basebuttonlist" />
     28    </buttontree>
    7629
    77         <image name="showinglines" draworder="2" fleximage="yes">
    78             <filename>showings.png</filename>
    79             <position>0,0</position>
    80         </image>
    81     </container>
    82 
    83     <container name="game_info">
    84       <area>25,355,750,220</area>
    85 
    86       <textarea name="gametitle" draworder="6">
    87         <area>13,5,500,50</area>
     30    <textarea name="gametitle">
     31        <area>38,360,500,50</area>
    8832        <font>largetitle</font>
    89       </textarea>
     33    </textarea>
    9034
    91       <textarea name="system" draworder="6">
    92         <area>13,75,150,35</area>
     35    <textarea name="system">
     36        <area>38,430,150,35</area>
    9337        <font>infofont</font>
    9438        <value>System:</value>
    95       </textarea>
     39    </textarea>
    9640
    97       <textarea name="systemname" draworder="6">
    98         <area>153,75,500,35</area>
     41    <textarea name="systemname">
     42        <area>178,430,500,35</area>
    9943        <font>infofont</font>
    100       </textarea>
     44    </textarea>
    10145
    102       <textarea name="year" draworder="6">
    103         <area>13,110,150,35</area>
     46    <textarea name="year">
     47        <area>38,465,150,35</area>
    10448        <font>infofont</font>
    10549        <value>Year:</value>
    106       </textarea>
     50    </textarea>
    10751
    108       <textarea name="yearname" draworder="6">
    109         <area>153,110,500,35</area>
     52    <textarea name="yearname">
     53        <area>178,465,500,35</area>
    11054        <font>infofont</font>
    111       </textarea>
     55    </textarea>
    11256
    113       <textarea name="genre" draworder="6">
    114         <area>13,140,150,35</area>
     57    <textarea name="genre">
     58        <area>38,495,150,35</area>
    11559        <font>infofont</font>
    11660        <value>Genre:</value>
    117       </textarea>
     61    </textarea>
    11862
    119       <textarea name="genrename" draworder="6">
    120         <area>153,140,500,35</area>
     63    <textarea name="genrename">
     64        <area>178,495,500,35</area>
    12165        <font>infofont</font>
    122       </textarea>
     66    </textarea>
    12367
    124       <textarea name="favorite" draworder="6">
    125         <area>13,170,150,35</area>
     68    <textarea name="favorite">
     69        <area>38,525,150,35</area>
    12670        <font>infofont</font>
    12771        <value>Favorite:</value>
    128       </textarea>
     72    </textarea>
    12973
    130       <textarea name="showfavorite" draworder="6">
    131         <area>153,170,500,35</area>
     74    <textarea name="showfavorite">
     75        <area>178,525,500,35</area>
    13276        <font>infofont</font>
    133       </textarea>
     77    </textarea>
    13478
    135       <image name="gameimage" draworder="6" fleximage="no">
    136           <position>535,25</position>
    137           <staticsize>180,150</staticsize>
    138       </image>
    139     </container>
    140  
     79    <imagetype name="gameimage">
     80        <area>600,420,180,150</area>
     81    </imagetype>
     82
     83    <imagetype name="boxart">
     84        <area>410,420,180,150</area>
     85        <preserveaspect>true</preserveaspect>
     86    </imagetype>
     87
    14188  </window>
    14289
     90  <window name="edit_metadata">
     91
     92    <textarea name="title" from="basetextarea">
     93        <area>10,50,1260,50</area>
     94        <value>Edit Game Information</value>
     95        <align>hcenter,vcenter</align>
     96        <font>baselarge</font>
     97    </textarea>
     98
     99    <!-- Labels -->
     100
     101    <textarea name="gamename_label" from="basetextarea">
     102        <area>250,110,250,40</area>
     103        <value>Game Name:</value>
     104        <align>right,top</align>
     105    </textarea>
     106
     107    <textarea name="genre_label" from="basetextarea">
     108        <area>250,155,250,40</area>
     109        <value>Genre:</value>
     110        <align>right,top</align>
     111    </textarea>
     112
     113    <textarea name="year_label" from="basetextarea">
     114        <area>250,200,250,40</area>
     115        <value>Year:</value>
     116        <align>right,top</align>
     117    </textarea>
     118
     119    <textarea name="country_label" from="basetextarea">
     120        <area>250,245,250,40</area>
     121        <value>Country:</value>
     122        <align>right,top</align>
     123    </textarea>
     124
     125    <textarea name="publisher_label" from="basetextarea">
     126        <area>250,290,250,40</area>
     127        <value>Publisher:</value>
     128        <align>right,top</align>
     129    </textarea>
     130
     131    <textarea name="favorite_label" from="basetextarea">
     132        <area>250,335,250,40</area>
     133        <value>Favorite:</value>
     134        <align>right,top</align>
     135    </textarea>
     136
     137    <textarea name="fanart_label" from="basetextarea">
     138        <area>250,380,250,40</area>
     139        <value>Fanart:</value>
     140        <align>right,top</align>
     141    </textarea>
     142
     143    <textarea name="boxart_label" from="basetextarea">
     144        <area>250,425,250,40</area>
     145        <value>Boxart:</value>
     146        <align>right,top</align>
     147    </textarea>
     148
     149    <!-- Widgets -->
     150
     151    <textedit name="gamename_edit" from="basetextedit">
     152        <position>510,100</position>
     153    </textedit>
     154
     155    <textedit name="genre_edit" from="basetextedit">
     156        <position>510,145</position>
     157    </textedit>
     158
     159    <textedit name="year_edit" from="basetextedit">
     160        <position>510,190</position>
     161    </textedit>
     162
     163    <textedit name="country_edit" from="basetextedit">
     164        <position>510,235</position>
     165    </textedit>
     166
     167    <textedit name="publisher_edit" from="basetextedit">
     168        <position>510,280</position>
     169    </textedit>
     170
     171    <checkbox name="favorite_check" from="basecheckbox">
     172        <position>510,330</position>
     173    </checkbox>
     174
     175    <button name="fanart_button" from="basesearchbutton">
     176        <position>510,370</position>
     177    </button>
     178
     179    <textarea name="fanart_text" from="basetextarea">
     180        <area>550,375,250,40</area>
     181        <value>/path/to/the/thing.jpg</value>
     182    </textarea>
     183
     184    <button name="boxart_button" from="basesearchbutton">
     185        <position>510,415</position>
     186    </button>
     187
     188    <textarea name="boxart_text" from="basetextarea">
     189        <area>550,420,250,40</area>
     190        <value>/path/to/the/thing.jpg</value>
     191    </textarea>
     192
     193    <button name="done_button" from="basebutton">
     194        <position>510,565</position>
     195        <value>Done</value>
     196    </button>
     197
     198  </window>
     199
     200  <window name="gamedetailspopup">
     201
     202    <imagetype name="fanart">
     203        <area>0,0,800,600</area>
     204    </imagetype>
     205
     206    <textarea name="gamename_lab" from="basetextarea">
     207        <area>40,60,140,40</area>
     208        <value>Game:</value>
     209        <align>right</align>
     210    </textarea>
     211
     212    <textarea name="gamename" from="basetextarea">
     213        <area>190,60,570,40</area>
     214    </textarea>
     215
     216    <textarea name="gametype_lab" from="basetextarea">
     217        <area>40,100,140,40</area>
     218        <value>Type:</value>
     219        <align>right</align>
     220    </textarea>
     221
     222    <textarea name="gametype" from="basetextarea">
     223        <area>190,100,570,40</area>
     224    </textarea>
     225
     226    <textarea name="romname_lab" from="basetextarea">
     227        <area>40,140,140,40</area>
     228        <value>Filename:</value>
     229        <align>right</align>
     230    </textarea>
     231
     232    <textarea name="romname" from="basetextarea">
     233        <area>190,140,570,40</area>
     234    </textarea>
     235
     236    <textarea name="rompath_lab" from="basetextarea">
     237        <area>40,180,140,40</area>
     238        <value>Rompath:</value>
     239        <align>right</align>
     240    </textarea>
     241
     242    <textarea name="rompath" from="basetextarea">
     243        <area>190,180,570,40</area>
     244    </textarea>
     245
     246    <textarea name="allsystems_lab" from="basetextarea">
     247        <area>40,220,140,40</area>
     248        <value>System(s):</value>
     249        <align>right</align>
     250    </textarea>
     251
     252    <textarea name="allsystems" from="basetextarea">
     253        <area>190,220,570,40</area>
     254    </textarea>
     255
     256    <textarea name="genre_lab" from="basetextarea">
     257        <area>40,260,140,40</area>
     258        <value>Genre:</value>
     259        <align>right</align>
     260    </textarea>
     261
     262    <textarea name="genre" from="basetextarea">
     263        <area>190,260,570,40</area>
     264    </textarea>
     265
     266    <textarea name="year_lab" from="basetextarea">
     267        <area>40,300,140,40</area>
     268        <value>Year:</value>
     269        <align>right</align>
     270    </textarea>
     271
     272    <textarea name="year" from="basetextarea">
     273        <area>190,300,400,40</area>
     274    </textarea>
     275
     276    <textarea name="country_lab" from="basetextarea">
     277        <area>40,340,140,40</area>
     278        <value>Country:</value>
     279        <align>right</align>
     280    </textarea>
     281
     282    <textarea name="country" from="basetextarea">
     283        <area>190,340,400,40</area>
     284    </textarea>
     285
     286    <textarea name="publisher_lab" from="basetextarea">
     287        <area>40,380,140,40</area>
     288        <value>Publisher:</value>
     289        <align>right</align>
     290    </textarea>
     291
     292    <textarea name="publisher" from="basetextarea">
     293        <area>190,380,400,40</area>
     294    </textarea>
     295
     296    <textarea name="crc_lab" from="basetextarea">
     297        <area>40,420,140,40</area>
     298        <value>CRC:</value>
     299        <align>right</align>
     300    </textarea>
     301
     302    <textarea name="crc" from="basetextarea">
     303        <area>190,420,400,40</area>
     304    </textarea>
     305
     306    <imagetype name="boxart">
     307        <area>600,300,180,150</area>
     308        <preserveaspect>true</preserveaspect>
     309    </imagetype>
     310
     311    <button name="play_button" from="basebutton">
     312        <position>118,517</position>
     313        <value>Play</value>
     314    </button>
     315
     316    <button name="done_button" from="basebutton">
     317        <position>529,517</position>
     318        <value>Done</value>
     319    </button>
     320
     321  </window>
     322
    143323</mythuitheme>
  • mythplugins/mythgame/theme/default-wide/game-ui.xml

     
    11<mythuitheme>
    22
    3   <window name="gametree">
     3  <window name="gameui">
    44
    5     <font name="active" face="Trebuchet MS">
    6         <color>#ffffff</color>
    7         <size>18</size>
    8         <bold>yes</bold>
    9     </font>
     5    <imagetype name="fanart">
     6        <area>0,0,1280,720</area>
     7    </imagetype>
    108
    11     <font name="inactive" face="Trebuchet MS">
    12         <color>#9999cc</color>
    13         <size>18</size>
    14         <bold>yes</bold>
    15     </font>
    16 
    17     <font name="selectable" face="Trebuchet MS">
    18         <color>#8cdeff</color>
    19         <size>18</size>
    20         <bold>yes</bold>
    21     </font>
    22 
    239    <font name="largetitle" face="Trebuchet MS">
    2410        <color>#ffffff</color>
    2511        <dropcolor>#000000</dropcolor>
     
    3420        <bold>yes</bold>
    3521    </font>
    3622
    37     <container name="background">
    38         <image name="filler" draworder="0" fleximage="yes">
    39             <filename>background.png</filename> <!-- 1280x326 -->
    40             <position>0,48</position>
    41         </image>
    42         <image name="titlelines" draworder="0" fleximage="no">
    43             <filename>trans-titles.png</filename> <!-- 1280x326 -->
    44             <position>0,50</position>
    45             <staticsize>280,315</staticsize>
    46         </image>
    47         <image name="infofiller" draworder="0" fleximage="no">
    48             <filename>pf-top.png</filename> <!-- 1152x260 -->
    49             <position>64,412</position>
    50         </image>
    51     </container>
    52 
    53     <container name="gameselector">
     23    <buttontree name="gametreelist">
    5424        <area>8,52,1264,310</area>
    55         <managedtreelist name="gametreelist" draworder="1" bins="2">
    56             <area>32,0,1200,296</area>
    57             <image function="selectionbar" filename="mv_selectionbar.png"></image>
    58             <image function="uparrow" filename="mv_up_arrow.png"></image>
    59             <image function="downarrow" filename="mv_down_arrow.png"></image>
    60             <image function="leftarrow" filename="mv_left_arrow.png"></image>
    61             <image function="rightarrow" filename="mv_right_arrow.png"></image>
    62             <bin number="1">
    63                 <area>56,28,288,271</area>
    64                 <fcnfont name="active" function="active"></fcnfont>
    65                 <fcnfont name="inactive" function="inactive"></fcnfont>
    66                 <fcnfont name="active" function="selected"></fcnfont>
    67                 <fcnfont name="selectable" function="selectable"></fcnfont>
    68             </bin>
    69             <bin number="2">
    70                 <area>384,0,816,296</area>
    71                 <fcnfont name="active" function="active"></fcnfont>
    72                 <fcnfont name="active" function="selected"></fcnfont>
    73                 <fcnfont name="inactive" function="inactive"></fcnfont>
    74                 <fcnfont name="selectable" function="selectable"></fcnfont>
    75             </bin>
    76         </managedtreelist>
     25        <numlists>3</numlists>
     26        <spacing>10</spacing>
     27        <buttonlist name="listtemplate" from="basebuttonlist" />
     28    </buttontree>
    7729
    78         <image name="showinglines" draworder="2" fleximage="yes">
    79             <filename>showings.png</filename>
    80             <position>20,10</position>
    81             <staticsize>1200,310</staticsize>
    82         </image>
    83     </container>
    84 
    85     <container name="game_info">
    86       <area>64,412,1152,260</area>
    87 
    88       <textarea name="gametitle" draworder="6">
    89         <area>32,28,752,60</area>
     30    <textarea name="gametitle">
     31        <area>96,440,752,60</area>
    9032        <font>largetitle</font>
    91       </textarea>
     33    </textarea>
    9234
    93       <textarea name="system" draworder="6">
    94         <area>32,98,140,35</area>
     35    <textarea name="system">
     36        <area>96,510,140,35</area>
    9537        <font>infofont</font>
    9638        <value>System:</value>
    97       </textarea>
     39    </textarea>
    9840
    99       <textarea name="systemname" draworder="6">
    100         <area>172,98,580,35</area>
     41    <textarea name="systemname">
     42        <area>236,510,580,35</area>
    10143        <font>infofont</font>
    102       </textarea>
     44    </textarea>
    10345
    104       <textarea name="year" draworder="6">
    105         <area>32,133,140,35</area>
     46    <textarea name="year">
     47        <area>96,545,140,35</area>
    10648        <font>infofont</font>
    10749        <value>Year:</value>
    108       </textarea>
     50    </textarea>
    10951
    110       <textarea name="yearname" draworder="6">
    111         <area>172,133,580,35</area>
     52    <textarea name="yearname">
     53        <area>236,545,580,35</area>
    11254        <font>infofont</font>
    113       </textarea>
     55    </textarea>
    11456
    115       <textarea name="genre" draworder="6">
    116         <area>32,168,140,35</area>
     57    <textarea name="genre">
     58        <area>96,580,140,35</area>
    11759        <font>infofont</font>
    11860        <value>Genre:</value>
    119       </textarea>
     61    </textarea>
    12062
    121       <textarea name="genrename" draworder="6">
    122         <area>172,168,580,35</area>
     63    <textarea name="genrename">
     64        <area>236,580,580,35</area>
    12365        <font>infofont</font>
    124       </textarea>
     66    </textarea>
    12567
    126       <textarea name="favorite" draworder="6">
    127         <area>32,203,140,35</area>
     68    <textarea name="favorite">
     69        <area>96,615,140,35</area>
    12870        <font>infofont</font>
    12971        <value>Favorite:</value>
    130       </textarea>
     72    </textarea>
    13173
    132       <textarea name="showfavorite" draworder="6">
    133         <area>172,203,580,35</area>
     74    <textarea name="showfavorite">
     75        <area>236,615,580,35</area>
    13476        <font>infofont</font>
    135       </textarea>
     77    </textarea>
    13678
    137       <image name="gameimage" draworder="6" fleximage="no">
    138           <position>816,36</position>
    139           <staticsize>300,196</staticsize>
    140       </image>
    141     </container>
    142  
     79    <imagetype name="boxart">
     80        <area>610,500,180,150</area>
     81        <preserveaspect>true</preserveaspect>
     82    </imagetype>
     83
     84    <imagetype name="gameimage">
     85        <area>880,500,300,196</area>
     86    </imagetype>
     87
    14388  </window>
    14489
     90  <window name="gamedetailspopup">
     91
     92    <imagetype name="fanart">
     93        <area>0,0,1280,720</area>
     94    </imagetype>
     95
     96    <textarea name="title" from="basetextarea">
     97        <area>10,50,1260,50</area>
     98        <value>Game Information</value>
     99        <align>hcenter,vcenter</align>
     100        <font>baselarge</font>
     101    </textarea>
     102
     103    <textarea name="gamename_lab" from="basetextarea">
     104        <area>40,160,140,40</area>
     105        <value>Game:</value>
     106        <align>right</align>
     107    </textarea>
     108
     109    <textarea name="gamename" from="basetextarea">
     110        <area>190,160,570,40</area>
     111    </textarea>
     112
     113    <textarea name="gametype_lab" from="basetextarea">
     114        <area>40,200,140,40</area>
     115        <value>Type:</value>
     116        <align>right</align>
     117    </textarea>
     118
     119    <textarea name="gametype" from="basetextarea">
     120        <area>190,200,570,40</area>
     121    </textarea>
     122
     123    <textarea name="romname_lab" from="basetextarea">
     124        <area>40,240,140,40</area>
     125        <value>Filename:</value>
     126        <align>right</align>
     127    </textarea>
     128
     129    <textarea name="romname" from="basetextarea">
     130        <area>190,240,570,40</area>
     131    </textarea>
     132
     133    <textarea name="rompath_lab" from="basetextarea">
     134        <area>40,280,140,40</area>
     135        <value>Rompath:</value>
     136        <align>right</align>
     137    </textarea>
     138
     139    <textarea name="rompath" from="basetextarea">
     140        <area>190,280,570,40</area>
     141    </textarea>
     142
     143    <textarea name="allsystems_lab" from="basetextarea">
     144        <area>40,320,140,40</area>
     145        <value>System(s):</value>
     146        <align>right</align>
     147    </textarea>
     148
     149    <textarea name="allsystems" from="basetextarea">
     150        <area>190,320,570,40</area>
     151    </textarea>
     152
     153    <textarea name="genre_lab" from="basetextarea">
     154        <area>40,360,140,40</area>
     155        <value>Genre:</value>
     156        <align>right</align>
     157    </textarea>
     158
     159    <textarea name="genre" from="basetextarea">
     160        <area>190,360,570,40</area>
     161    </textarea>
     162
     163    <textarea name="year_lab" from="basetextarea">
     164        <area>40,400,140,40</area>
     165        <value>Year:</value>
     166        <align>right</align>
     167    </textarea>
     168
     169    <textarea name="year" from="basetextarea">
     170        <area>190,400,400,40</area>
     171    </textarea>
     172
     173    <textarea name="country_lab" from="basetextarea">
     174        <area>40,440,140,40</area>
     175        <value>Country:</value>
     176        <align>right</align>
     177    </textarea>
     178
     179    <textarea name="country" from="basetextarea">
     180        <area>190,440,400,40</area>
     181    </textarea>
     182
     183    <textarea name="publisher_lab" from="basetextarea">
     184        <area>40,480,140,40</area>
     185        <value>Publisher:</value>
     186        <align>right</align>
     187    </textarea>
     188
     189    <textarea name="publisher" from="basetextarea">
     190        <area>190,480,400,40</area>
     191    </textarea>
     192
     193    <textarea name="crc_lab" from="basetextarea">
     194        <area>40,520,140,40</area>
     195        <value>CRC:</value>
     196        <align>right</align>
     197    </textarea>
     198
     199    <textarea name="crc" from="basetextarea">
     200        <area>190,520,400,40</area>
     201    </textarea>
     202
     203    <imagetype name="boxart">
     204        <area>800,200,415,320</area>
     205        <preserveaspect>true</preserveaspect>
     206    </imagetype>
     207
     208    <button name="play_button" from="basebutton">
     209        <position>347,600</position>
     210        <value>Play</value>
     211    </button>
     212
     213    <button name="done_button" from="basebutton">
     214        <position>629,600</position>
     215        <value>Done</value>
     216    </button>
     217
     218  </window>
     219
     220  <window name="edit_metadata">
     221
     222    <textarea name="title" from="basetextarea">
     223        <area>10,50,1260,50</area>
     224        <value>Edit Game Information</value>
     225        <align>hcenter,vcenter</align>
     226        <font>baselarge</font>
     227    </textarea>
     228
     229    <!-- Labels -->
     230
     231    <textarea name="gamename_label" from="basetextarea">
     232        <area>250,110,250,40</area>
     233        <value>Game Name:</value>
     234        <align>right,top</align>
     235    </textarea>
     236
     237    <textarea name="genre_label" from="basetextarea">
     238        <area>250,155,250,40</area>
     239        <value>Genre:</value>
     240        <align>right,top</align>
     241    </textarea>
     242
     243    <textarea name="year_label" from="basetextarea">
     244        <area>250,200,250,40</area>
     245        <value>Year:</value>
     246        <align>right,top</align>
     247    </textarea>
     248
     249    <textarea name="country_label" from="basetextarea">
     250        <area>250,245,250,40</area>
     251        <value>Country:</value>
     252        <align>right,top</align>
     253    </textarea>
     254
     255    <textarea name="publisher_label" from="basetextarea">
     256        <area>250,290,250,40</area>
     257        <value>Publisher:</value>
     258        <align>right,top</align>
     259    </textarea>
     260
     261    <textarea name="favorite_label" from="basetextarea">
     262        <area>250,335,250,40</area>
     263        <value>Favorite:</value>
     264        <align>right,top</align>
     265    </textarea>
     266
     267    <textarea name="fanart_label" from="basetextarea">
     268        <area>250,380,250,40</area>
     269        <value>Fanart:</value>
     270        <align>right,top</align>
     271    </textarea>
     272
     273    <textarea name="boxart_label" from="basetextarea">
     274        <area>250,425,250,40</area>
     275        <value>Boxart:</value>
     276        <align>right,top</align>
     277    </textarea>
     278
     279    <!-- Widgets -->
     280
     281    <textedit name="gamename_edit" from="basetextedit">
     282        <position>510,100</position>
     283    </textedit>
     284
     285    <textedit name="genre_edit" from="basetextedit">
     286        <position>510,145</position>
     287    </textedit>
     288
     289    <textedit name="year_edit" from="basetextedit">
     290        <position>510,190</position>
     291    </textedit>
     292
     293    <textedit name="country_edit" from="basetextedit">
     294        <position>510,235</position>
     295    </textedit>
     296
     297    <textedit name="publisher_edit" from="basetextedit">
     298        <position>510,280</position>
     299    </textedit>
     300
     301    <checkbox name="favorite_check" from="basecheckbox">
     302        <position>510,330</position>
     303    </checkbox>
     304
     305    <button name="fanart_button" from="basesearchbutton">
     306        <position>510,370</position>
     307    </button>
     308
     309    <textarea name="fanart_text" from="basetextarea">
     310        <area>550,375,750,40</area>
     311        <value>/path/to/the/thing.jpg</value>
     312    </textarea>
     313
     314    <button name="boxart_button" from="basesearchbutton">
     315        <position>510,415</position>
     316    </button>
     317
     318    <textarea name="boxart_text" from="basetextarea">
     319        <area>550,420,750,40</area>
     320        <value>/path/to/the/thing.jpg</value>
     321    </textarea>
     322
     323    <button name="done_button" from="basebutton">
     324        <position>510,565</position>
     325        <value>Done</value>
     326    </button>
     327
     328  </window>
     329
    145330</mythuitheme>
  • mythplugins/mythgame/mythgame/romedit.cpp

     
    1 #include <qstring.h>
     1#include <QImageReader>
     2#include <QApplication>
    23
    34#include <mythtv/mythcontext.h>
     5#include <mythtv/mythdirs.h>
    46
     7#include <mythtv/libmythui/mythmainwindow.h>
     8#include <mythtv/libmythui/mythdialogbox.h>
     9#include <mythtv/libmythui/mythuibuttonlist.h>
     10#include <mythtv/libmythui/mythuitext.h>
     11#include <mythtv/libmythui/mythuitextedit.h>
     12#include <mythtv/libmythui/mythuibutton.h>
     13#include <mythtv/libmythui/mythuicheckbox.h>
     14
    515#include "romedit.h"
     16#include "rominfo.h"
    617
    7 class Gamename : public LineEditSetting, public GenericDBStorage
     18EditRomInfoDialog::EditRomInfoDialog(MythScreenStack *parent,
     19        QString name, RomInfo *romInfo) : MythScreenType(parent, name),
     20    m_id(""), m_retObject(0), m_gamenameEdit(0), m_genreEdit(0),
     21    m_yearEdit(0), m_countryEdit(0), m_publisherEdit(0), m_favoriteCheck(0),
     22    m_fanartButton(0), m_fanartText(0), m_boxartButton(0), m_boxartText(0),
     23    m_doneButton(0)
    824{
    9   public:
    10     Gamename(const QString &romname) :
    11         LineEditSetting(this), GenericDBStorage(
    12             this, "gamemetadata", "gamename", "romname", romname)
    13     {
    14         setLabel(QObject::tr("Game Name"));
    15         setHelpText(QObject::tr("Friendly name of this Game."));
    16     }
    17 };
     25    m_workingRomInfo = new RomInfo(*romInfo);
     26}
    1827
    19 class Genre : public LineEditSetting, public GenericDBStorage
     28EditRomInfoDialog::~EditRomInfoDialog()
    2029{
    21   public:
    22     Genre(const QString &romname) :
    23         LineEditSetting(this), GenericDBStorage(
    24             this, "gamemetadata", "genre", "romname", romname)
     30    delete m_workingRomInfo;
     31}
     32
     33bool EditRomInfoDialog::Create()
     34{
     35    if (!LoadWindowFromXML("game-ui.xml", "edit_metadata", this))
     36        return false;
     37
     38    bool err = false;
     39    UIUtilE::Assign(this, m_gamenameEdit, "gamename_edit", &err);
     40    UIUtilE::Assign(this, m_genreEdit, "genre_edit", &err);
     41    UIUtilE::Assign(this, m_yearEdit, "year_edit", &err);
     42    UIUtilE::Assign(this, m_countryEdit, "country_edit", &err);
     43    UIUtilE::Assign(this, m_publisherEdit, "publisher_edit", &err);
     44
     45    UIUtilE::Assign(this, m_favoriteCheck, "favorite_check", &err);
     46
     47    UIUtilE::Assign(this, m_fanartButton, "fanart_button", &err);
     48    UIUtilE::Assign(this, m_fanartText, "fanart_text", &err);
     49    UIUtilE::Assign(this, m_boxartButton, "boxart_button", &err);
     50    UIUtilE::Assign(this, m_boxartText, "boxart_text", &err);
     51
     52    UIUtilE::Assign(this, m_doneButton, "done_button", &err);
     53
     54    if (err)
    2555    {
    26         setLabel(QObject::tr("Genre"));
    27         setHelpText(QObject::tr("Genre/Category this game falls under."));
     56        VERBOSE(VB_IMPORTANT, "Cannot load screen 'edit_metadata'");
     57        return false;
    2858    }
    29 };
    3059
    31 class Year : public LineEditSetting, public GenericDBStorage
     60    fillWidgets();
     61
     62    if (!BuildFocusList())
     63        VERBOSE(VB_IMPORTANT, "Failed to build a focuslist.");
     64
     65    connect(m_gamenameEdit, SIGNAL(valueChanged()), SLOT(SetGamename()));
     66    connect(m_genreEdit, SIGNAL(valueChanged()), SLOT(SetGenre()));
     67    connect(m_yearEdit, SIGNAL(valueChanged()), SLOT(SetYear()));
     68    connect(m_countryEdit, SIGNAL(valueChanged()), SLOT(SetCountry()));
     69    connect(m_publisherEdit, SIGNAL(valueChanged()), SLOT(SetPublisher()));
     70
     71    connect(m_favoriteCheck, SIGNAL(valueChanged()), SLOT(ToggleFavorite()));
     72
     73    connect(m_fanartButton, SIGNAL(Clicked()), SLOT(FindFanart()));
     74    connect(m_boxartButton, SIGNAL(Clicked()), SLOT(FindBoxart()));
     75
     76    connect(m_doneButton, SIGNAL(Clicked()), SLOT(SaveAndExit()));
     77 
     78    return true;
     79}
     80
     81namespace
    3282{
    33   public:
    34     Year(const QString &romname) :
    35         LineEditSetting(this), GenericDBStorage(
    36             this, "gamemetadata", "year", "romname", romname)
     83    QStringList GetSupportedImageExtensionFilter()
    3784    {
    38         setLabel(QObject::tr("Year"));
    39         setHelpText(QObject::tr("The Year the game was released."));
     85        QStringList ret;
     86
     87        QList<QByteArray> exts = QImageReader::supportedImageFormats();
     88        for (QList<QByteArray>::iterator p = exts.begin(); p != exts.end(); ++p)
     89        {
     90            ret.append(QString("*.").append(*p));
     91        }
     92
     93        return ret;
    4094    }
    41 };
    4295
    43 class Country : public LineEditSetting, public GenericDBStorage
    44 {
    45   public:
    46     Country(const QString &romname) :
    47         LineEditSetting(this), GenericDBStorage(
    48             this, "gamemetadata", "country", "romname", romname)
     96    void FindImagePopup(const QString &prefix, const QString &prefixAlt,
     97            QObject &inst, const QString &returnEvent)
    4998    {
    50         setLabel(QObject::tr("Country"));
    51         setHelpText(QObject::tr("The Country this game was "
    52                                 "originally distributed in."));
     99        QString fp = prefix.isEmpty() ? prefixAlt : prefix;
     100
     101        MythScreenStack *popupStack =
     102                GetMythMainWindow()->GetStack("popup stack");
     103
     104        MythUIFileBrowser *fb = new MythUIFileBrowser(popupStack, fp);
     105        fb->SetNameFilter(GetSupportedImageExtensionFilter());
     106        if (fb->Create())
     107        {
     108            fb->SetReturnEvent(&inst, returnEvent);
     109            popupStack->AddScreen(fb);
     110        }
     111        else
     112            delete fb;
    53113    }
    54 };
    55114
    56 class Publisher : public LineEditSetting, public GenericDBStorage
     115    const QString CEID_FANARTFILE = "fanartfile";
     116    const QString CEID_BOXARTFILE = "boxartfile";
     117}
     118
     119void EditRomInfoDialog::customEvent(QEvent *event)
    57120{
    58   public:
    59     Publisher(const QString &romname) :
    60         LineEditSetting(this), GenericDBStorage(
    61             this, "gamemetadata", "publisher", "romname", romname)
     121    if (event->type() == kMythDialogBoxCompletionEventType)
    62122    {
    63         setLabel(QObject::tr("Publisher"));
    64         setHelpText(QObject::tr("The Company that made and "
    65                                 "published this game."));
     123        DialogCompletionEvent *dce =
     124                dynamic_cast<DialogCompletionEvent*>(event);
     125
     126        if (!dce)
     127            return;
     128
     129        const QString resultid = dce->GetId();
     130
     131        if (resultid == CEID_FANARTFILE)
     132            SetFanart(dce->GetResultText());
     133        else if (resultid == CEID_BOXARTFILE)
     134            SetBoxart(dce->GetResultText());
    66135    }
    67 };
     136}
    68137
     138void EditRomInfoDialog::fillWidgets()
     139{
     140    m_gamenameEdit->SetText(m_workingRomInfo->Gamename());
     141    m_genreEdit->SetText(m_workingRomInfo->Genre());
     142    m_yearEdit->SetText(m_workingRomInfo->Year());
     143    m_countryEdit->SetText(m_workingRomInfo->Country());
     144    m_publisherEdit->SetText(m_workingRomInfo->Publisher());
    69145
    70 class Favourite : public CheckBoxSetting, public GenericDBStorage
     146    if (m_workingRomInfo->Favorite())
     147        m_favoriteCheck->SetCheckState(MythUIStateType::Full);
     148 
     149    m_fanartText->SetText(m_workingRomInfo->Fanart());
     150    m_boxartText->SetText(m_workingRomInfo->Boxart());
     151}
     152
     153void EditRomInfoDialog::SetReturnEvent(QObject *retobject,
     154                                       const QString &resultid)
    71155{
    72   public:
    73     Favourite(const QString &romname) :
    74         CheckBoxSetting(this), GenericDBStorage(
    75             this, "gamemetadata", "favorite", "romname", romname)
     156    m_retObject = retobject;
     157    m_id = resultid;
     158}
     159
     160void EditRomInfoDialog::SaveAndExit()
     161{
     162    if (m_retObject)
    76163    {
    77         setLabel(QObject::tr("Favorite"));
    78         setHelpText(QObject::tr("ROM status as a Favorite"));
     164        RomInfo *romInfo = new RomInfo(*m_workingRomInfo);
     165        DialogCompletionEvent *dce =
     166            new DialogCompletionEvent(m_id, 0, "",
     167                                      qVariantFromValue(romInfo));
     168
     169        QApplication::postEvent(m_retObject, dce);
    79170    }
    80 };
     171    Close();
     172}
    81173
    82 GameEditDialog::GameEditDialog(const QString &romname)
     174void EditRomInfoDialog::SetGamename()
    83175{
    84     QString title = QObject::tr("Editing Metadata - ") + romname;
     176    m_workingRomInfo->setGamename(m_gamenameEdit->GetText());
     177}
    85178
    86     VerticalConfigurationGroup *group =
    87         new VerticalConfigurationGroup(false);
     179void EditRomInfoDialog::SetGenre()
     180{
     181    m_workingRomInfo->setGenre(m_genreEdit->GetText());
     182}
    88183
    89     group->setLabel(title);
    90     group->addChild(new Gamename(romname));
    91     group->addChild(new Genre(romname));
    92     group->addChild(new Year(romname));
    93     group->addChild(new Country(romname));
    94     group->addChild(new Publisher(romname));
    95     group->addChild(new Favourite(romname));
    96     addChild(group);
     184void EditRomInfoDialog::SetYear()
     185{
     186    m_workingRomInfo->setYear(m_yearEdit->GetText());
    97187}
    98188
     189void EditRomInfoDialog::SetCountry()
     190{
     191    m_workingRomInfo->setCountry(m_countryEdit->GetText());
     192}
    99193
     194void EditRomInfoDialog::SetPublisher()
     195{
     196    m_workingRomInfo->setPublisher(m_publisherEdit->GetText());
     197}
     198
     199void EditRomInfoDialog::ToggleFavorite()
     200{
     201    m_workingRomInfo->setFavorite();
     202}
     203
     204void EditRomInfoDialog::FindFanart()
     205{
     206    FindImagePopup(gContext->GetSetting("mythgame.fanartDir"),
     207            GetConfDir() + "/MythGame/Fanart",
     208            *this, CEID_FANARTFILE);
     209}
     210
     211void EditRomInfoDialog::FindBoxart()
     212{
     213    FindImagePopup(gContext->GetSetting("mythgame.boxartDir"),
     214            GetConfDir() + "/MythGame/Boxart",
     215            *this, CEID_BOXARTFILE);
     216}
     217
     218void EditRomInfoDialog::SetFanart(QString file)
     219{
     220    if (file.isEmpty())
     221        return;
     222
     223    m_workingRomInfo->setFanart(file);
     224    m_fanartText->SetText(file);
     225}
     226
     227void EditRomInfoDialog::SetBoxart(QString file)
     228{
     229    if (file.isEmpty())
     230        return;
     231
     232    m_workingRomInfo->setBoxart(file);
     233    m_boxartText->SetText(file);
     234}
  • mythplugins/mythgame/mythgame/gamehandler.cpp

     
    149149
    150150void GameHandler::GetMetadata(GameHandler *handler, QString rom, QString* Genre, QString* Year,
    151151                              QString* Country, QString* CRC32, QString* GameName,
    152                               QString *Publisher, QString *Version)
     152                              QString *Publisher, QString *Version, QString* Fanart,
     153                              QString* Boxart)
    153154{
    154155    QString key;
    155156    QString tmpcrc;
     
    165166    *Genre = QObject::tr("Unknown");
    166167    *Publisher = QObject::tr("Unknown");
    167168    *Version = QObject::tr("0");
     169    *Fanart = QObject::tr("");
     170    *Boxart = QObject::tr("");
    168171
    169172    if (*CRC32 != "")
    170173    {
     
    411414    QString Year;
    412415    QString Publisher;
    413416    QString Version;
     417    QString Fanart;
     418    QString Boxart;
    414419
    415420    int removalprompt = gContext->GetSetting("GameRemovalPrompt").toInt();
    416421    int indepth = gContext->GetSetting("GameDeepScan").toInt();
     
    423428            if (indepth)
    424429            {
    425430                GetMetadata(handler, iter.data().RomFullPath(), &Genre, &Year, &Country, &CRC32, &GameName,
    426                             &Publisher, &Version);
     431                            &Publisher, &Version, &Fanart, &Boxart);
    427432            }
    428433            else
    429434            {
     
    434439                GameName = QObject::tr("Unknown");
    435440                Publisher = QObject::tr("Unknown");
    436441                Version = QObject::tr("0");
     442                Fanart = QObject::tr("");
     443                Boxart = QObject::tr("");
    437444            }
    438445
    439446            if (GameName == QObject::tr("Unknown"))
     
    446453            query.prepare("INSERT INTO gamemetadata "
    447454                          "(system, romname, gamename, genre, year, gametype, "
    448455                          "rompath, country, crc_value, diskcount, display, "
    449                           "publisher, version) "
     456                          "publisher, version, fanart, boxart) "
    450457                          "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, "
    451                           ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PUBLISHER, :VERSION)");
     458                          ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PUBLISHER, :VERSION, "
     459                          ":FANART, BOXART)");
    452460
    453461
    454462
     
    463471            query.bindValue(":CRC32", CRC32);
    464472            query.bindValue(":PUBLISHER", Publisher);
    465473            query.bindValue(":VERSION", Version);
    466                    
     474            query.bindValue(":FANART", Fanart);
     475            query.bindValue(":BOXART", Boxart);
     476
    467477            query.exec();
    468478        }
    469479        else if ((iter.data().FoundLoc() == inDatabase) && (removalprompt))
  • mythplugins/mythgame/mythgame/gameui.cpp

     
     1#include <mythcontext.h>
     2#include <mythuibuttontree.h>
     3#include <mythdialogbox.h>
     4#include <mythgenerictree.h>
     5
     6// MythGame headers
     7#include "gameui.h"
     8#include "gamehandler.h"
     9#include "rominfo.h"
     10#include "gamedetails.h"
     11#include "romedit.h"
     12
     13class GameTreeInfo
     14{
     15  public:
     16    GameTreeInfo(const QString& levels, const QString& filter)
     17      : m_levels(QStringList::split(" ", levels))
     18      , m_filter(filter)
     19    {
     20    }
     21
     22    int getDepth() const                        { return m_levels.size(); }
     23    const QString& getLevel(unsigned i) const   { return m_levels[i]; }
     24    const QString& getFilter() const            { return m_filter; }
     25
     26  private:
     27    QStringList m_levels;
     28    QString m_filter;
     29};
     30
     31Q_DECLARE_METATYPE(GameTreeInfo *)
     32
     33GameUI::GameUI(MythScreenStack *parent)
     34        : MythScreenType(parent, "GameUI")
     35{
     36    gContext->addCurrentLocation("mythgame");
     37}
     38
     39GameUI::~GameUI()
     40{
     41    gContext->removeCurrentLocation();
     42}
     43
     44bool GameUI::Create()
     45{
     46    if (!LoadWindowFromXML("game-ui.xml", "gameui", this))
     47        return false;
     48
     49    bool err = false;
     50    UIUtilE::Assign(this, m_gameTreeUI, "gametreelist", &err);
     51    UIUtilE::Assign(this, m_gameTitle, "gametitle", &err);
     52    UIUtilE::Assign(this, m_gameSystem, "systemname", &err);
     53    UIUtilE::Assign(this, m_gameYear, "yearname", &err);
     54    UIUtilE::Assign(this, m_gameGenre, "genrename", &err);
     55    UIUtilE::Assign(this, m_gameFavourite, "showfavorite", &err);
     56    UIUtilE::Assign(this, m_gameImage, "gameimage", &err);
     57    UIUtilE::Assign(this, m_fanartImage, "fanart", &err);
     58    UIUtilE::Assign(this, m_boxImage, "boxart", &err);
     59
     60    if (err)
     61    {
     62        VERBOSE(VB_IMPORTANT, "Cannot load screen 'gameui'");
     63        return false;
     64    }
     65   
     66    connect(m_gameTreeUI, SIGNAL(itemClicked(MythUIButtonListItem*)),
     67            this, SLOT(itemClicked(MythUIButtonListItem*)));
     68
     69    connect(m_gameTreeUI, SIGNAL(nodeChanged(MythGenericTree*)),
     70            this, SLOT(nodeChanged(MythGenericTree*)));
     71
     72    m_gameShowFileName = gContext->GetSetting("GameShowFileNames").toInt();
     73
     74    m_gameTree = new MythGenericTree("game root", 0, false);
     75
     76    timer = new QTimer(this);
     77    connect(timer, SIGNAL(timeout()), SLOT(showImageTimeout()));
     78
     79    //  create system filter to only select games where handlers are present
     80    QString systemFilter;
     81
     82    // The call to GameHandler::count() fills the handler list for us
     83    // to move through.
     84    unsigned handlercount = GameHandler::count();
     85
     86    for (unsigned i = 0; i < handlercount; ++i)
     87    {
     88        QString system = GameHandler::getHandler(i)->SystemName();
     89        if (i == 0)
     90            systemFilter = "system in ('" + system + "'";
     91        else
     92            systemFilter += ",'" + system + "'";
     93    }
     94    if (systemFilter.isEmpty())
     95    {
     96        systemFilter = "1=0";
     97        VERBOSE(VB_GENERAL, QString("Couldn't find any game handlers!"));
     98    }
     99    else
     100        systemFilter += ")";
     101
     102    m_showHashed = gContext->GetSetting("GameTreeView").toInt();
     103
     104    //  create a few top level nodes - this could be moved to a config based
     105    //  approach with multiple roots if/when someone has the time to create
     106    //  the relevant dialog screens
     107
     108    QString levels = gContext->GetSetting("GameFavTreeLevels");
     109
     110    MythGenericTree *new_node = new MythGenericTree("Favourites", 1, true);
     111    new_node->SetData(qVariantFromValue(
     112                new GameTreeInfo(levels, systemFilter + " and favorite=1")));
     113    m_favouriteNode = m_gameTree->addNode(new_node);
     114
     115    levels = gContext->GetSetting("GameAllTreeLevels");
     116
     117    if (m_showHashed)
     118    {
     119        int pos = levels.find("gamename",0);
     120        if (pos >= 0)
     121            levels.insert(pos, " hash ");
     122    }
     123
     124    new_node = new MythGenericTree(tr("All Games"), 1, true);
     125    new_node->SetData(qVariantFromValue(
     126                new GameTreeInfo(levels, systemFilter)));
     127    m_gameTree->addNode(new_node);
     128
     129    new_node = new MythGenericTree(tr("-   By Genre"), 1, true);
     130    new_node->SetData(qVariantFromValue(
     131                new GameTreeInfo("genre gamename", systemFilter)));
     132    m_gameTree->addNode(new_node);
     133
     134    new_node = new MythGenericTree(tr("-   By Year"), 1, true);
     135    new_node->SetData(qVariantFromValue(
     136                new GameTreeInfo("year gamename", systemFilter)));
     137    m_gameTree->addNode(new_node);
     138
     139    new_node = new MythGenericTree(tr("-   By Name"), 1, true);
     140    new_node->SetData(qVariantFromValue(
     141                new GameTreeInfo("gamename", systemFilter)));
     142    m_gameTree->addNode(new_node);
     143
     144    new_node = new MythGenericTree(tr("-   By Publisher"), 1, true);
     145    new_node->SetData(qVariantFromValue(
     146                new GameTreeInfo("publisher gamename", systemFilter)));
     147    m_gameTree->addNode(new_node);
     148
     149    m_gameTreeUI->AssignTree(m_gameTree);
     150
     151    BuildFocusList();
     152
     153    return true;
     154}
     155
     156bool GameUI::keyPressEvent(QKeyEvent *event)
     157{
     158    if (GetFocusWidget()->keyPressEvent(event))
     159        return true;
     160
     161    bool handled = false;
     162    QStringList actions;
     163    gContext->GetMainWindow()->TranslateKeyPress("Game", event, actions);
     164
     165    for (int i = 0; i < actions.size() && !handled; i++)
     166    {
     167        QString action = actions[i];
     168        handled = true;
     169
     170        if (action == "MENU")
     171            showMenu();
     172        else if (action == "INFO")
     173            showInfo();
     174        else if (action == "TOGGLEFAV")
     175            toggleFavorite();
     176        else if (action == "INCSEARCH")
     177            searchStart();
     178        else if (action == "INCSEARCHNEXT")
     179            searchStart();
     180        else
     181            handled = false;
     182    }
     183    if (!handled && MythScreenType::keyPressEvent(event))
     184        handled = true;
     185
     186    return handled;
     187}
     188
     189void GameUI::nodeChanged(MythGenericTree* node)
     190{
     191    if (!isLeaf(node))
     192    {
     193        if (node->childCount() == 0 || node == m_favouriteNode)
     194        {
     195            node->deleteAllChildren();
     196            fillNode(node);
     197        }
     198        if (timer->isActive())
     199            timer->stop();
     200        clearRomInfo();
     201    }
     202    else
     203    {
     204        RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     205        if (romInfo->Romname().isEmpty())
     206            romInfo->fillData();
     207        updateRomInfo(romInfo);
     208        if (!romInfo->ImagePath().isEmpty() || !romInfo->Fanart().isEmpty() ||
     209            !romInfo->Boxart().isEmpty())
     210        {
     211            if (timer->isActive())
     212                timer->changeInterval(330);
     213            else
     214                timer->start(330, true);
     215        }
     216        else
     217        {
     218            if (m_gameImage->IsVisible())
     219                m_gameImage->Hide();
     220            if (m_fanartImage->IsVisible())
     221                m_fanartImage->Hide();
     222            if (m_boxImage->IsVisible())
     223                m_boxImage->Hide();
     224        }
     225    }
     226}
     227
     228void GameUI::itemClicked(MythUIButtonListItem*)
     229{
     230    MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     231    if (isLeaf(node))
     232    {
     233        RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     234        if (romInfo->RomCount() == 1)
     235        {
     236            GameHandler::Launchgame(romInfo, NULL);
     237        }
     238        else
     239        {
     240            QString msg = QObject::tr("Choose System for") +
     241                              ":\n" + node->getString();
     242            MythScreenStack *popupStack = GetMythMainWindow()->
     243                                              GetStack("popup stack");
     244            MythDialogBox *chooseSystemPopup = new MythDialogBox(
     245                msg, popupStack, "chooseSystemPopup");
     246
     247            if (chooseSystemPopup->Create())
     248            {
     249                chooseSystemPopup->SetReturnEvent(this, "chooseSystemPopup");
     250                QString all_systems = romInfo->AllSystems();
     251                QStringList players = QStringList::split(",", all_systems);
     252                for (QStringList::Iterator it = players.begin();
     253                     it != players.end(); ++it)
     254                {
     255                    chooseSystemPopup->AddButton(*it);
     256                }
     257                chooseSystemPopup->AddButton(tr("Cancel"));
     258                popupStack->AddScreen(chooseSystemPopup);
     259            }
     260            else
     261                delete chooseSystemPopup;
     262        }
     263    }
     264}
     265
     266void GameUI::showImageTimeout(void)
     267{
     268    m_gameImage->Load();
     269    if (!m_gameImage->IsVisible())
     270        m_gameImage->Show();
     271    m_fanartImage->Load();
     272    if (!m_fanartImage->IsVisible())
     273        m_fanartImage->Show();
     274    m_boxImage->Load();
     275    if (!m_boxImage->IsVisible())
     276        m_boxImage->Show();
     277}
     278
     279void GameUI::searchComplete(QString string)
     280{
     281    MythGenericTree *parent = m_gameTreeUI->GetCurrentNode()->getParent();
     282    MythGenericTree *new_node = parent->getChildByName(string);
     283    if (new_node)
     284    {
     285        m_gameTreeUI->SetCurrentNode(new_node);
     286        // SetActive updates the buttonlist but SetCurrentNode doesn't.
     287        m_gameTreeUI->SetActive(true);
     288    }
     289}
     290
     291void GameUI::updateRomInfo(RomInfo *rom)
     292{
     293    m_gameTitle->SetText(rom->Gamename());
     294    m_gameSystem->SetText(rom->System());
     295    m_gameYear->SetText(rom->Year());
     296    m_gameGenre->SetText(rom->Genre());
     297
     298    if (rom->Favorite())
     299        m_gameFavourite->SetText("Yes");
     300    else
     301        m_gameFavourite->SetText("No");
     302
     303    m_gameImage->SetFilename(rom->ImagePath());
     304    m_fanartImage->SetFilename(rom->Fanart());
     305    m_boxImage->SetFilename(rom->Boxart());
     306}
     307
     308void GameUI::clearRomInfo(void) {
     309    m_gameTitle->SetText("");
     310    m_gameSystem->SetText("");
     311    m_gameYear->SetText("");
     312    m_gameGenre->SetText("");
     313    m_gameFavourite->SetText("");
     314
     315    if (m_gameImage->IsVisible())
     316        m_gameImage->Hide();
     317
     318    if (m_fanartImage->IsVisible())
     319        m_fanartImage->Hide();
     320
     321    if (m_boxImage->IsVisible())
     322        m_boxImage->Hide();
     323}
     324
     325void GameUI::edit(void)
     326{
     327    MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     328    if (isLeaf(node))
     329    {
     330        RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     331
     332        MythScreenStack *screenStack = GetScreenStack();
     333
     334        EditRomInfoDialog *md_editor = new EditRomInfoDialog(screenStack,
     335            "mythgameeditmetadata", romInfo);
     336
     337        if (md_editor->Create())
     338        {
     339            screenStack->AddScreen(md_editor);
     340            md_editor->SetReturnEvent(this, "editMetadata");
     341        }
     342        else
     343            delete md_editor;
     344    }
     345}
     346
     347void GameUI::showInfo()
     348{
     349    MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     350    if (isLeaf(node))
     351    {
     352        RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     353        MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
     354        GameDetailsPopup *details_dialog  =
     355            new GameDetailsPopup(mainStack, romInfo);
     356
     357        if (details_dialog->Create())
     358        {
     359            mainStack->AddScreen(details_dialog);
     360            details_dialog->SetReturnEvent(this, "detailsPopup");
     361        }
     362        else
     363            delete details_dialog;
     364    }
     365}
     366
     367void GameUI::showMenu()
     368{
     369    MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     370    if (isLeaf(node))
     371    {
     372        RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     373        MythScreenStack *popupStack = GetMythMainWindow()->
     374                                              GetStack("popup stack");
     375        MythDialogBox *showMenuPopup =
     376            new MythDialogBox(node->getString(), popupStack, "showMenuPopup");
     377
     378        if (showMenuPopup->Create())
     379        {
     380            showMenuPopup->SetReturnEvent(this, "showMenuPopup");
     381            showMenuPopup->AddButton(tr("Show Information"));
     382            if (romInfo->Favorite())
     383                showMenuPopup->AddButton(tr("Remove Favorite"));
     384            else
     385                showMenuPopup->AddButton(tr("Make Favorite"));
     386            showMenuPopup->AddButton(tr("Edit"));
     387            popupStack->AddScreen(showMenuPopup);
     388        }
     389        else
     390            delete showMenuPopup;
     391    }
     392}
     393
     394void GameUI::searchStart(void)
     395{
     396    MythGenericTree *parent = m_gameTreeUI->GetCurrentNode()->getParent();
     397
     398    if (parent != NULL)
     399    {
     400        QStringList childList;
     401        QList<MythGenericTree*>::iterator it;
     402        QList<MythGenericTree*> *children = parent->getAllChildren();
     403
     404        for (it = children->begin(); it != children->end(); ++it)
     405        {
     406            MythGenericTree *child = *it;
     407            childList << child->getString();
     408        }
     409
     410        MythScreenStack *popupStack =
     411            GetMythMainWindow()->GetStack("popup stack");
     412        MythUISearchDialog *searchDialog = new MythUISearchDialog(popupStack,
     413            tr("Game Search"), childList, true, "");
     414
     415        if (searchDialog->Create())
     416        {
     417            connect(searchDialog, SIGNAL(haveResult(QString)),
     418                    SLOT(searchComplete(QString)));
     419
     420            popupStack->AddScreen(searchDialog);
     421        }
     422        else
     423            delete searchDialog;
     424    }
     425}
     426
     427void GameUI::toggleFavorite(void)
     428{
     429    MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     430    if (isLeaf(node))
     431    {
     432        RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     433        romInfo->setFavorite(true);
     434        updateChangedNode(node, romInfo);
     435    }
     436}
     437
     438void GameUI::customEvent(QEvent *event)
     439{
     440    if (event->type() == kMythDialogBoxCompletionEventType)
     441    {
     442        DialogCompletionEvent *dce =
     443            dynamic_cast<DialogCompletionEvent*>(event);
     444
     445        QString resultid = dce->GetId();
     446        QString resulttext = dce->GetResultText();
     447
     448        if (resultid == "showMenuPopup")
     449        {
     450            if (resulttext == tr("Edit")) {
     451                edit();
     452            }
     453            else if (resulttext == tr("Show Information"))
     454            {
     455                showInfo();
     456            }
     457            else if (resulttext == tr("Make Favorite") ||
     458                     resulttext == tr("Remove Favorite"))
     459            {
     460                toggleFavorite();
     461            }
     462        }
     463        else if (resultid == "chooseSystemPopup")
     464        {
     465            if (resulttext != "" && resulttext != tr("Cancel")) {
     466                MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     467                RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     468                GameHandler::Launchgame(romInfo, resulttext);
     469            }
     470        }
     471        else if (resultid == "editMetadata")
     472        {
     473            MythGenericTree *node = m_gameTreeUI->GetCurrentNode();
     474            RomInfo *oldRomInfo = qVariantValue<RomInfo *>(node->GetData());
     475            delete oldRomInfo;
     476
     477            RomInfo *romInfo = qVariantValue<RomInfo *>(dce->GetData());
     478            node->SetData(qVariantFromValue(romInfo));
     479            node->setString(romInfo->Gamename());
     480
     481            romInfo->UpdateDatabase();
     482            updateChangedNode(node, romInfo);
     483        }
     484        else if (resultid == "detailsPopup")
     485        {
     486            // Play button pushed
     487            itemClicked(0);
     488        }
     489    }
     490}
     491
     492QString GameUI::getFillSql(MythGenericTree *node) const
     493{
     494    QString layer = node->getString();
     495    int childDepth = node->getInt() + 1;
     496    QString childLevel = getChildLevelString(node);
     497    QString filter = getFilter(node);
     498    bool childIsLeaf = childDepth == getLevelsOnThisBranch(node) + 1;
     499    RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     500
     501    QString columns;
     502    QString conj = "where ";
     503
     504    if (!filter.isEmpty())
     505    {
     506        filter = conj + filter;
     507        conj = " and ";
     508    }
     509    if ((childLevel == "gamename") && (m_gameShowFileName))
     510    {
     511        columns = childIsLeaf
     512                    ? "romname,system,year,genre,gamename"
     513                    : "romname";
     514
     515        if (m_showHashed)
     516            filter += " and romname like '" + layer + "%'";
     517
     518    }
     519    else if ((childLevel == "gamename") && (layer.length() == 1)) {
     520        columns = childIsLeaf
     521                    ? childLevel + ",system,year,genre,gamename"
     522                    : childLevel;
     523
     524        if (m_showHashed)
     525            filter += " and gamename like '" + layer + "%'";
     526
     527    }
     528    else if (childLevel == "hash") {
     529        columns = "left(gamename,1)";
     530    }
     531    else {
     532
     533        columns = childIsLeaf
     534                    ? childLevel + ",system,year,genre,gamename"
     535                    : childLevel;
     536    }
     537
     538    //  this whole section ought to be in rominfo.cpp really, but I've put it
     539    //  in here for now to minimise the number of files changed by this mod
     540    if (romInfo) {
     541        if (!romInfo->System().isEmpty())
     542        {
     543            filter += conj + "trim(system)=:SYSTEM";
     544            conj = " and ";
     545        }
     546        if (!romInfo->Year().isEmpty())
     547        {
     548            filter += conj + "year=:YEAR";
     549            conj = " and ";
     550        }
     551        if (!romInfo->Genre().isEmpty())
     552        {
     553            filter += conj + "trim(genre)=:GENRE";
     554            conj = " and ";
     555        }
     556        if (!romInfo->Publisher().isEmpty())
     557        {
     558            filter += conj + "publisher=:PUBLISHER";
     559            conj = " and ";
     560        }
     561
     562        if (!romInfo->Gamename().isEmpty())
     563        {
     564            filter += conj + "trim(gamename)=:GAMENAME";
     565        }
     566
     567    }
     568
     569    filter += conj + " display = 1 ";
     570
     571    QString sql;
     572
     573    if ((childLevel == "gamename") && (m_gameShowFileName))
     574    {   
     575        sql = "select distinct "
     576                + columns
     577                + " from gamemetadata "
     578                + filter
     579                + " order by romname"
     580                + ";";
     581    }
     582    else if (childLevel == "hash") {
     583        sql = "select distinct "
     584                + columns
     585                + " from gamemetadata "
     586                + filter
     587                + " order by gamename,romname"
     588                + ";";
     589    }
     590    else
     591    {
     592        sql = "select distinct "
     593                + columns
     594                + " from gamemetadata "
     595                + filter
     596                + " order by "
     597                + childLevel
     598                + ";";
     599    }
     600
     601    return sql;
     602}
     603
     604QString GameUI::getChildLevelString(MythGenericTree *node) const
     605{
     606    unsigned this_level = node->getInt();
     607    while (node->getInt() != 1)
     608        node = node->getParent();
     609
     610    GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
     611    return gi->getLevel(this_level - 1);
     612}
     613
     614QString GameUI::getFilter(MythGenericTree *node) const
     615{
     616    while (node->getInt() != 1)
     617        node = node->getParent();
     618    GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
     619    return gi->getFilter();
     620}
     621
     622int GameUI::getLevelsOnThisBranch(MythGenericTree *node) const
     623{
     624    while (node->getInt() != 1)
     625        node = node->getParent();
     626
     627    GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
     628    return gi->getDepth();
     629}
     630
     631bool GameUI::isLeaf(MythGenericTree *node) const
     632{
     633  return (node->getInt() - 1) == getLevelsOnThisBranch(node);
     634}
     635
     636void GameUI::fillNode(MythGenericTree *node)
     637{
     638    QString layername = node->getString();
     639    RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
     640
     641    MSqlQuery query(MSqlQuery::InitCon());
     642
     643    query.prepare(getFillSql(node));
     644
     645    if (romInfo)
     646    {
     647        if (!romInfo->System().isEmpty())
     648            query.bindValue(":SYSTEM",  romInfo->System());
     649        if (!romInfo->Year().isEmpty())
     650            query.bindValue(":YEAR", romInfo->Year());
     651        if (!romInfo->Genre().isEmpty())
     652            query.bindValue(":GENRE", romInfo->Genre());
     653        if (!romInfo->Publisher().isEmpty())
     654            query.bindValue(":PUBLISHER", romInfo->Publisher());
     655        if (!romInfo->Gamename().isEmpty())
     656            query.bindValue(":GAMENAME", romInfo->Gamename());
     657    }
     658
     659    bool IsLeaf = node->getInt() == getLevelsOnThisBranch(node);
     660    if (query.exec() && query.size() > 0)
     661    {
     662        while (query.next())
     663        {
     664            QString current = query.value(0).toString().stripWhiteSpace();
     665            MythGenericTree *new_node =
     666                new MythGenericTree(current, node->getInt() + 1, false);
     667            if (IsLeaf)
     668            {
     669                RomInfo *temp = new RomInfo();
     670                temp->setSystem(query.value(1).toString().stripWhiteSpace());
     671                temp->setYear(query.value(2).toString());
     672                temp->setGenre(query.value(3).toString().stripWhiteSpace());
     673                temp->setGamename(query.value(4).toString().stripWhiteSpace());
     674                new_node->SetData(qVariantFromValue(temp));
     675                node->addNode(new_node);
     676            }
     677            else
     678            {
     679                RomInfo *newRomInfo;
     680                if (node->getInt() > 1)
     681                {
     682                    RomInfo *currentRomInfo;
     683                    currentRomInfo = qVariantValue<RomInfo *>(node->GetData());
     684                    newRomInfo = new RomInfo(*currentRomInfo);
     685                }
     686                else
     687                {
     688                    newRomInfo = new RomInfo();
     689                }
     690                new_node->SetData(qVariantFromValue(newRomInfo));
     691                node->addNode(new_node);
     692                if (getChildLevelString(node) != "hash")
     693                    newRomInfo->setField(getChildLevelString(node), current);
     694            }
     695        }
     696    }
     697}
     698
     699void GameUI::resetOtherTrees(MythGenericTree *node)
     700{
     701    MythGenericTree *top_level = node;
     702    while (top_level->getParent() != m_gameTree)
     703    {
     704        top_level = top_level->getParent();
     705    }
     706
     707    QList<MythGenericTree*>::iterator it;
     708    QList<MythGenericTree*> *children = m_gameTree->getAllChildren();
     709
     710    for (it = children->begin(); it != children->end(); ++it)
     711    {
     712        MythGenericTree *child = *it;
     713        if (child != top_level)
     714        {
     715            child->deleteAllChildren();
     716        }
     717    }
     718}
     719
     720void GameUI::updateChangedNode(MythGenericTree *node, RomInfo *romInfo)
     721{
     722    resetOtherTrees(node);
     723
     724    if (node->getParent() == m_favouriteNode && romInfo->Favorite() == 0) {
     725        // node is being removed
     726        m_gameTreeUI->SetCurrentNode(m_favouriteNode);
     727    }
     728    else
     729    {
     730        nodeChanged(node);
     731    }
     732    // SetActive to update the buttonlist text
     733    m_gameTreeUI->SetActive(true);
     734}
  • mythplugins/mythgame/mythgame/romedit.h

     
    11#ifndef ROMEDITDLG_H_
    22#define ROMEDITDLG_H_
    33
    4 #include <qstring.h>
     4#include <mythtv/libmythui/mythscreentype.h>
    55
    6 #include <mythtv/mythcontext.h>
    7 #include <mythtv/settings.h>
     6class RomInfo;
    87
    9 class GameEditDialog : public ConfigurationWizard
     8class EditRomInfoDialog : public MythScreenType
    109{
     10    Q_OBJECT
     11
    1112  public:
    12     GameEditDialog(const QString &romname);
     13     EditRomInfoDialog(MythScreenStack *parent,
     14                       QString name,
     15                       RomInfo *romInfo);
     16                       
     17    ~EditRomInfoDialog();
     18
     19    bool Create();
     20    void customEvent(QEvent *levent);
     21    void SetReturnEvent(QObject *retobject, const QString &resultid);
     22
     23  public slots:
     24    void SetGamename();
     25    void SetGenre();
     26    void SetYear();
     27    void SetCountry();
     28    void SetPublisher();
     29    void ToggleFavorite();
     30    void FindFanart();
     31    void FindBoxart();
     32    void SaveAndExit();
     33
     34  private:
     35    void fillWidgets();
     36    void SetFanart(QString file);
     37    void SetBoxart(QString file);
     38
     39  private:
     40    RomInfo             *m_workingRomInfo;
     41    QString              m_id;
     42    QObject             *m_retObject;
     43
     44    MythUITextEdit      *m_gamenameEdit;
     45    MythUITextEdit      *m_genreEdit;
     46    MythUITextEdit      *m_yearEdit;
     47    MythUITextEdit      *m_countryEdit;
     48    MythUITextEdit      *m_publisherEdit;
     49    MythUICheckBox      *m_favoriteCheck;
     50    MythUIButton        *m_fanartButton;
     51    MythUIText          *m_fanartText;
     52    MythUIButton        *m_boxartButton;
     53    MythUIText          *m_boxartText;
     54    MythUIButton        *m_doneButton;
    1355};
    1456
    1557#endif // ROMEDITDLG_H_
  • mythplugins/mythgame/mythgame/rominfo.cpp

     
    11#include <qfile.h>
    22
    33#include <mythtv/mythdb.h>
     4#include <mythtv/mythcontext.h>
    45
    56#include "rominfo.h"
    67#include "romedit.h"
     
    1516    return false;
    1617}
    1718
    18 
    19 void RomInfo::edit_rominfo()
     19void RomInfo::UpdateDatabase()
    2020{
    21     QString rom_ver = Version();
     21    MSqlQuery query(MSqlQuery::InitCon());
     22    query.prepare("SELECT gamename,genre,year,country,publisher,favorite,"
     23                  "fanart,boxart "
     24                  "FROM gamemetadata "
     25                  "WHERE gametype = :GAMETYPE "
     26                  "AND romname = :ROMNAME");
    2227
    23     GameEditDialog romeditdlg(Romname());
     28    query.bindValue(":GAMETYPE", GameType());
     29    query.bindValue(":ROMNAME", Romname());
    2430
    25     DialogCode res = romeditdlg.exec();
     31    if (!query.exec())
     32    {
     33        MythDB::DBError("RomInfo::UpdateDatabase", query);
     34        return;
     35    }
    2636
    27     if (kDialogCodeRejected == res)
     37    if (!query.next())
    2838        return;
    2939
    30     if (res)
     40    QString t_gamename  = query.value(0).toString();
     41    QString t_genre     = query.value(1).toString();
     42    QString t_year      = query.value(2).toString();
     43    QString t_country   = query.value(3).toString();
     44    QString t_publisher = query.value(4).toString();
     45    bool    t_favourite = query.value(5).toBool();
     46    QString t_fanart = query.value(6).toString();
     47    QString t_boxart = query.value(7).toString();
     48
     49    if ((t_gamename  != Gamename())  || (t_genre     != Genre())   ||
     50        (t_year      != Year())      || (t_country   != Country()) ||
     51        (t_publisher != Publisher()) || (t_favourite != Favorite()) ||
     52        (t_fanart    != Fanart())    || (t_boxart    != Boxart()))
    3153    {
    32         MSqlQuery query(MSqlQuery::InitCon());
    33         query.prepare("SELECT gamename,genre,year,country,publisher,favorite "
    34                       "FROM gamemetadata "
    35                       "WHERE gametype = :GAMETYPE "
    36                       "AND romname = :ROMNAME");
    37 
     54        query.prepare("UPDATE gamemetadata "
     55                      "SET version = 'CUSTOM', "
     56                      "    gamename = :GAMENAME,"
     57                      "    genre = :GENRE,"
     58                      "    year = :YEAR,"
     59                      "    country = :COUNTRY,"
     60                      "    publisher = :PUBLISHER,"
     61                      "    favorite = :FAVORITE,"
     62                      "    fanart = :FANART,"
     63                      "    boxart = :BOXART "
     64                      "WHERE gametype = :GAMETYPE AND "
     65                      "      romname  = :ROMNAME");
     66        query.bindValue(":GAMENAME", Gamename());
     67        query.bindValue(":GENRE", Genre());
     68        query.bindValue(":YEAR", Year());
     69        query.bindValue(":COUNTRY", Country());
     70        query.bindValue(":PUBLISHER", Publisher());
     71        query.bindValue(":FAVORITE", Favorite());
     72        query.bindValue(":FANART", Fanart());
     73        query.bindValue(":BOXART", Boxart());
    3874        query.bindValue(":GAMETYPE", GameType());
    3975        query.bindValue(":ROMNAME", Romname());
    4076
    4177        if (!query.exec())
    4278        {
    43             MythDB::DBError("RomInfo::edit_rominfo", query);
     79            MythDB::DBError("RomInfo::UpdateDatabase", query);
    4480            return;
    4581        }
    46 
    47         if (!query.next())
    48             return;
    49 
    50         QString t_gamename  = query.value(0).toString();
    51         QString t_genre     = query.value(1).toString();
    52         QString t_year      = query.value(2).toString();
    53         QString t_country   = query.value(3).toString();
    54         QString t_publisher = query.value(4).toString();
    55         bool    t_favourite = query.value(5).toBool();
    56 
    57         if ((t_gamename  != Gamename())  || (t_genre     != Genre())   ||
    58             (t_year      != Year())      || (t_country   != Country()) ||
    59             (t_publisher != Publisher()) || (t_favourite != Favorite()))
    60         {
    61             query.prepare("UPDATE gamemetadata "
    62                           "SET version = 'CUSTOM' "
    63                           "WHERE gametype = :GAMETYPE AND "
    64                           "      romname  = :ROMNAME");
    65             query.bindValue(":GAMETYPE", GameType());
    66             query.bindValue(":ROMNAME",  Romname());
    67 
    68             if (!query.exec())
    69             {
    70                 MythDB::DBError("RomInfo::edit_rominfo", query);
    71                 return;
    72             }
    73         }
    74    }
     82    }
    7583}
    7684
    7785// Return the count of how many times this appears in the db already
     
    147155        favorite = data.toInt();
    148156    else if (field == "rompath")
    149157        rompath = data;
     158    else if (field == "fanart")
     159        fanart = data;
     160    else if (field == "boxart")
     161        boxart = data;
    150162    else if (field == "country")
    151163        country = data;
    152164    else if (field == "publisher")
     
    164176
    165177}
    166178
    167 void RomInfo::setFavorite()
     179void RomInfo::setFavorite(bool updateDatabase)
    168180{
    169181    favorite = 1 - favorite;
    170182
    171     MSqlQuery query(MSqlQuery::InitCon());
     183    if (updateDatabase)
     184    {
     185        MSqlQuery query(MSqlQuery::InitCon());
    172186
    173     query.prepare("UPDATE gamemetadata SET favorite = :FAV "
    174                   "WHERE romname = :ROMNAME");
     187        query.prepare("UPDATE gamemetadata SET favorite = :FAV "
     188                      "WHERE romname = :ROMNAME");
    175189
    176     query.bindValue(":FAV", favorite);
    177     query.bindValue(":ROMNAME",romname);
     190        query.bindValue(":FAV", favorite);
     191        query.bindValue(":ROMNAME",romname);
    178192
    179     if (!query.exec())
    180     {
    181         MythDB::DBError("RomInfo::setFavorite", query);
     193        if (!query.exec())
     194        {
     195            MythDB::DBError("RomInfo::setFavorite", query);
     196        }
    182197    }
    183198}
    184199
     
    211226
    212227    QString thequery = "SELECT system,gamename,genre,year,romname,favorite,"
    213228                       "rompath,country,crc_value,diskcount,gametype,publisher,"
    214                        "version FROM gamemetadata WHERE gamename = :GAMENAME "
     229                       "version,fanart,boxart FROM gamemetadata WHERE gamename = :GAMENAME "
    215230                       + systemtype + " ORDER BY diskcount DESC";
    216231
    217232    query.prepare(thequery);
     
    234249        setGameType(query.value(10).toString());
    235250        setPublisher(query.value(11).toString());
    236251        setVersion(query.value(12).toString());
     252        setFanart(query.value(13).toString());
     253        setBoxart(query.value(14).toString());
    237254    }
    238255
    239256    query.prepare("SELECT screenshots FROM gameplayers "
  • mythplugins/mythgame/mythgame/gameui.h

     
     1#ifndef GAMEUI_H_
     2#define GAMEUI_H_
     3
     4#include <qtimer.h>
     5
     6// myth
     7#include <mythscreentype.h>
     8
     9class MythUIButtonTree;
     10class MythGenericTree;
     11class RomInfo;
     12
     13class GameUI : public MythScreenType
     14{
     15    Q_OBJECT
     16
     17  public:
     18    GameUI(MythScreenStack *parentStack);
     19    ~GameUI();
     20
     21    bool Create();
     22    bool keyPressEvent(QKeyEvent *event);
     23
     24  public slots:
     25    void nodeChanged(MythGenericTree* node);
     26    void itemClicked(MythUIButtonListItem* item);
     27    void showImageTimeout(void);
     28    void searchComplete(QString);
     29
     30  private:
     31    void updateRomInfo(RomInfo *rom);
     32    void clearRomInfo(void);
     33    void edit(void);
     34    void showInfo(void);
     35    void showMenu(void);
     36    void searchStart(void);
     37    void toggleFavorite(void);
     38    void customEvent(QEvent *event);
     39
     40    QString getFillSql(MythGenericTree* node) const;
     41    QString getChildLevelString(MythGenericTree *node) const;
     42    QString getFilter(MythGenericTree *node) const;
     43    int     getLevelsOnThisBranch(MythGenericTree *node) const;
     44    bool    isLeaf(MythGenericTree *node) const;
     45    void    fillNode(MythGenericTree *node);
     46    void    resetOtherTrees(MythGenericTree *node);
     47    void    updateChangedNode(MythGenericTree *node, RomInfo *romInfo);
     48
     49  private:
     50    bool m_showHashed;
     51    int m_gameShowFileName;
     52    QTimer *timer;
     53
     54    MythGenericTree  *m_gameTree;
     55    MythGenericTree  *m_favouriteNode;
     56
     57    MythUIButtonTree *m_gameTreeUI;
     58    MythUIText       *m_gameTitle;
     59    MythUIText       *m_gameSystem;
     60    MythUIText       *m_gameYear;
     61    MythUIText       *m_gameGenre;
     62    MythUIText       *m_gameFavourite;
     63    MythUIImage      *m_gameImage;
     64    MythUIImage      *m_fanartImage;
     65    MythUIImage      *m_boxImage;
     66};
     67
     68#endif
  • mythplugins/mythgame/mythgame/gamehandler.h

     
    6767    void GetMetadata(GameHandler *handler, QString rom,
    6868                             QString* Genre, QString* Year, QString* Country,
    6969                             QString* CRC32, QString* GameName,
    70                              QString* Publisher, QString* Version);
     70                             QString* Publisher, QString* Version,
     71                             QString* Fanart, QString* Boxart);
    7172
    7273    void promptForRemoval(QString filename, QString RomPath );
    7374    void UpdateGameDB(GameHandler *handler);
  • mythplugins/mythgame/mythgame/rominfo.h

     
    1212            QString lgenre = "", QString lyear = "", bool lfavorite = FALSE,
    1313            QString lrompath = "", QString lcountry ="", QString lcrc_value = "",
    1414            int ldiskcount = 0, QString lgametype = "", int lromcount = 0,
    15             QString lallsystems = "", QString lpublisher = "", QString lversion = "")
     15            QString lallsystems = "", QString lpublisher = "", QString lversion = "",
     16            QString lfanart = "", QString lboxart = "")
    1617            {
    1718                romname = lromname;
    1819                system = lsystem;
     
    2122                year = lyear;
    2223                favorite = lfavorite;
    2324                rompath = lrompath;
     25                fanart = lfanart;
     26                boxart = lboxart;
    2427                country = lcountry;
    2528                crc_value = lcrc_value;
    2629                diskcount = ldiskcount;
     
    3740                system = lhs.system;
    3841                gamename = lhs.gamename;
    3942                genre = lhs.genre;
     43                imagepath = lhs.imagepath;
    4044                year = lhs.year;
    4145                favorite = lhs.favorite;
    4246                rompath = lhs.rompath;
     47                fanart = lhs.fanart;
     48                boxart = lhs.boxart;
    4349                country = lhs.country;
    4450                crc_value = lhs.crc_value;
    4551                diskcount = lhs.diskcount;
     
    5056                version = lhs.version;
    5157            }
    5258
    53     virtual ~RomInfo() {}
     59    ~RomInfo() {}
    5460
    5561    bool FindImage(QString BaseFileName, QString *result);
    5662
    5763    QString Rompath() const { return rompath; }
    5864    void setRompath(const QString &lrompath) { rompath = lrompath; }
    5965
     66    QString Fanart() const { return fanart; }
     67    void setFanart(const QString &lfanart) { fanart = lfanart; }
     68
     69    QString Boxart() const { return boxart; }
     70    void setBoxart(const QString &lboxart) { boxart = lboxart; }
     71
    6072    QString Romname() const { return romname; }
    6173    void setRomname(const QString &lromname) { romname = lromname; }
    6274
    63     QString System() { return system; }
     75    QString System() const { return system; }
    6476    void setSystem(const QString &lsystem) { system = lsystem; }
    6577
    66     QString Gamename() { return gamename; }
     78    QString Gamename() const { return gamename; }
    6779    void setGamename(const QString &lgamename) { gamename = lgamename; }
    6880
    69     QString Genre() { return genre; }
     81    QString Genre() const { return genre; }
    7082    void setGenre(const QString &lgenre) { genre = lgenre; }
    7183   
    72     QString Country() { return country; }
     84    QString Country() const { return country; }
    7385    void setCountry(const QString &lcountry) { country = lcountry; }
    7486
    75     QString GameType() { return gametype; }
     87    QString GameType() const { return gametype; }
    7688    void setGameType(const QString &lgametype) { gametype = lgametype; }
    7789
    78     int RomCount() { return romcount; }
     90    int RomCount() const { return romcount; }
    7991    void setRomCount(const int &lromcount) { romcount = lromcount; }
    8092
    81     QString AllSystems() { return allsystems; }
     93    QString AllSystems() const { return allsystems; }
    8294    void setAllSystems(const QString &lallsystems) { allsystems = lallsystems; }
    8395
    84     int DiskCount() { return diskcount; }
     96    int DiskCount() const { return diskcount; }
    8597    void setDiskCount(const int &ldiskcount) { diskcount = ldiskcount; }
    8698
    87     QString CRC_VALUE() { return crc_value; }
     99    QString CRC_VALUE() const { return crc_value; }
    88100    void setCRC_VALUE(const QString &lcrc_value) { crc_value = lcrc_value; }
    89101
    90     QString ImagePath() { return imagepath; }
     102    QString ImagePath() const { return imagepath; }
    91103    void setImagePath(const QString &limagepath) { imagepath = limagepath; }
    92104
    93     QString Publisher() { return publisher; }
     105    QString Publisher() const { return publisher; }
    94106    void setPublisher(const QString &lpublisher) { publisher = lpublisher; }
    95107
    96     QString Version() { return version; }
     108    QString Version() const { return version; }
    97109    void setVersion(const QString &lversion) { version = lversion; }
    98110
    99 
    100     QString Year() { return year; }
     111    QString Year() const { return year; }
    101112    void setYear(const QString &lyear) { year = lyear; }
    102113
    103     int Favorite() { return favorite; }
    104      virtual void setFavorite();
     114    int Favorite() const { return favorite; }
     115    void setFavorite(bool updateDatabase = false);
    105116
    106117    QString getExtension();
    107118
    108     virtual void setField(QString field, QString data);
    109     virtual void fillData();
    110     virtual void edit_rominfo();
     119    void setField(QString field, QString data);
     120    void fillData();
     121    void UpdateDatabase();
    111122
    112123  protected:
    113124    QString romname;
     
    126137    QString year;
    127138    bool favorite;
    128139    QString rompath;
     140    QString fanart;
     141    QString boxart;
    129142};
    130143
    131144bool operator==(const RomInfo& a, const RomInfo& b);
    132145
     146Q_DECLARE_METATYPE(RomInfo *)
     147
    133148#endif
  • mythplugins/mythgame/mythgame/gamedetails.cpp

     
     1#include <QFile>
     2#include <QApplication>
     3
     4#include "mythcontext.h"
     5#include "mythuihelper.h"
     6#include "mythuitext.h"
     7#include "mythuiimage.h"
     8#include "mythuibutton.h"
     9#include "mythdialogbox.h"
     10
     11#include "gamedetails.h"
     12
     13GameDetailsPopup::GameDetailsPopup(MythScreenStack *parent,
     14                                   const RomInfo *romInfo)
     15           : MythScreenType (parent, "gamedetailspopup")
     16{
     17    m_romInfo = romInfo;
     18}
     19
     20GameDetailsPopup::~GameDetailsPopup(void)
     21{
     22}
     23
     24void GameDetailsPopup::handleText(const QString &name, const QString &value)
     25{
     26    MythUIText *textarea;
     27    UIUtilE::Assign(this, textarea, name);
     28    if (textarea)
     29    {
     30        textarea->SetText(value);
     31    }
     32}
     33
     34void GameDetailsPopup::handleImage(const QString &name, const QString &filename)
     35{
     36    MythUIImage *image;
     37    UIUtilW::Assign(this, image, name);
     38    if (image)
     39    {
     40        if (filename.size())
     41        {
     42            image->SetFilename(filename);
     43            image->Load();
     44        }
     45        else
     46            image->Reset();
     47    }
     48}
     49
     50bool GameDetailsPopup::Create(void)
     51{
     52    if (!LoadWindowFromXML("game-ui.xml", "gamedetailspopup", this))
     53        return false;
     54
     55    UIUtilW::Assign(this, m_playButton, "play_button");
     56    UIUtilW::Assign(this, m_doneButton, "done_button");
     57
     58    if (m_playButton)
     59        connect(m_playButton, SIGNAL(Clicked()), SLOT(Play()));
     60
     61    if (m_doneButton)
     62        connect(m_doneButton, SIGNAL(Clicked()), SLOT(Close()));
     63
     64    BuildFocusList();
     65
     66    if (m_playButton || m_doneButton)
     67        SetFocusWidget(m_playButton ? m_playButton : m_doneButton);
     68
     69    handleText("gamename", m_romInfo->Gamename());
     70    handleText("gametype", m_romInfo->GameType());
     71    handleText("romname", m_romInfo->Romname());
     72    handleText("crc", m_romInfo->CRC_VALUE());
     73    handleText("rompath", m_romInfo->Rompath());
     74    handleText("genre", m_romInfo->Genre());
     75    handleText("year", m_romInfo->Year());
     76    handleText("country", m_romInfo->Country());
     77    handleText("publisher", m_romInfo->Publisher());
     78    handleText("allsystems", m_romInfo->AllSystems());
     79    handleImage("fanart", m_romInfo->Fanart());
     80    handleImage("boxart", m_romInfo->Boxart());
     81
     82    return true;
     83}
     84
     85void GameDetailsPopup::Play()
     86{
     87    if (m_retObject)
     88    {
     89        DialogCompletionEvent *dce =
     90            new DialogCompletionEvent(m_id, 0, "", "");
     91        QApplication::postEvent(m_retObject, dce);
     92        Close();
     93    }
     94}
     95
     96void GameDetailsPopup::SetReturnEvent(QObject *retobject,
     97                                      const QString &resultid)
     98{
     99    m_retObject = retobject;
     100    m_id = resultid;
     101}
  • mythplugins/mythgame/mythgame/dbcheck.cpp

     
    1212
    1313#include "gamesettings.h"
    1414
    15 const QString currentDatabaseVersion = "1014";
     15const QString currentDatabaseVersion = "1015";
    1616
    1717static bool UpdateDBVersionNumber(const QString &newnumber)
    1818{
     
    384384            return false;
    385385    }
    386386
     387    if (dbver == "1014")
     388    {
     389        const QString updates[] = {
    387390
     391"ALTER TABLE gamemetadata ADD fanart VARCHAR(255) NOT NULL AFTER rompath,"
     392"ADD boxart VARCHAR( 255 ) NOT NULL AFTER fanart;",
     393""
     394};
     395
     396        if (!performActualUpdate(updates, "1015", dbver))
     397            return false;
     398    }
     399
    388400    return true;
    389401}
  • mythplugins/mythgame/mythgame/main.cpp

     
    66#include <QDir>
    77#include <QApplication>
    88
     9#include "gameui.h"
    910#include "gamehandler.h"
    1011#include "rominfo.h"
    1112#include "gamesettings.h"
    12 #include "gametree.h"
    1313#include "dbcheck.h"
    1414
    1515#include <mythtv/mythcontext.h>
     
    6060{
    6161    QString themedir = GetMythUI()->GetThemeDir();
    6262
    63     MythThemedMenu *diag = new MythThemedMenu(
     63    MythThemedMenu *menu = new MythThemedMenu(
    6464        themedir, which_menu, GetMythMainWindow()->GetMainStack(), "game menu");
    6565
    6666    GameData data;
    6767
    68     diag->setCallback(GameCallback, &data);
    69     diag->setKillable();
     68    menu->setCallback(GameCallback, &data);
     69    menu->setKillable();
    7070
    71     if (diag->foundTheme())
     71    if (menu->foundTheme())
    7272    {
    73         if (class LCD * lcd = LCD::Get())
    74         {
     73        if (LCD * lcd = LCD::Get())
    7574            lcd->switchToTime();
    76         }
    77         GetMythMainWindow()->GetMainStack()->AddScreen(diag);
     75
     76        GetMythMainWindow()->GetMainStack()->AddScreen(menu);
    7877        return 0;
    7978    }
    8079    else
    8180    {
    8281        VERBOSE(VB_IMPORTANT, QString("Couldn't find menu %1 or theme %2")
    8382                              .arg(which_menu).arg(themedir));
    84         delete diag;
     83        delete menu;
    8584        return -1;
    8685    }
    8786}
    8887
    8988void runGames(void);
     89int  RunGames(void);
    9090
    9191void setupKeys(void)
    9292{
     
    105105{
    106106    if (!gContext->TestPopupVersion("mythgame", libversion,
    107107                                    MYTH_BINARY_VERSION))
     108    {
     109        VERBOSE(VB_IMPORTANT,
     110                QString("libmythgame.so/main.o: binary version mismatch"));
    108111        return -1;
     112    }
    109113
    110 
    111114    gContext->ActivateSettingsCache(false);
    112115    if (!UpgradeGameDatabaseSchema())
    113116    {
     
    126129    return 0;
    127130}
    128131
    129 void runGames(void)
     132void runGames()
    130133{
    131     gContext->addCurrentLocation("mythgame");
    132     GameTree gametree(gContext->GetMainWindow(), "gametree", "game-");
    133     gametree.exec();
    134     gContext->removeCurrentLocation();
     134    RunGames();
    135135}
    136136
     137int RunGames(void)
     138{
     139    MythScreenStack *mainStack = GetMythMainWindow()->GetMainStack();
     140    GameUI *game = new GameUI(mainStack);
     141
     142    if (game->Create())
     143    {
     144        mainStack->AddScreen(game);
     145        return 0;
     146    }
     147    else
     148    {
     149        delete game;
     150        return -1;
     151    }
     152}
     153
    137154int mythplugin_run(void)
    138155{
    139     runGames();
    140     return 0;
     156    return RunGames();
    141157}
    142158
    143159int mythplugin_config(void)
  • mythplugins/mythgame/mythgame/gamedetails.h

     
     1#ifndef GAMEDETAILS_H_
     2#define GAMEDETAILS_H_
     3
     4#include <QString>
     5
     6#include "mythscreentype.h"
     7#include "rominfo.h"
     8
     9class GameDetailsPopup : public MythScreenType
     10{
     11    Q_OBJECT
     12
     13  public:
     14    GameDetailsPopup(MythScreenStack *parent, const RomInfo *romInfo);
     15    ~GameDetailsPopup();
     16
     17    bool Create(void);
     18    void SetReturnEvent(QObject *retobject, const QString &resultid);
     19
     20  private slots:
     21    void Play(void);
     22
     23  private:
     24    void        handleText(const QString &name, const QString &value);
     25    void        handleImage(const QString &name, const QString &filename);
     26
     27    const RomInfo *m_romInfo;
     28    QString        m_id;
     29    QObject       *m_retObject;
     30
     31    MythUIText  *m_gameName;
     32    MythUIText  *m_gameType;
     33    MythUIText  *m_romName;
     34    MythUIText  *m_crc;
     35    MythUIText  *m_romPath;
     36    MythUIText  *m_genre;
     37    MythUIText  *m_year;
     38    MythUIText  *m_country;
     39    MythUIText  *m_publisher;
     40    MythUIText  *m_allSystems;
     41    MythUIImage *m_fanartImage;
     42    MythUIImage *m_boxImage;
     43
     44    MythUIButton *m_playButton;
     45    MythUIButton *m_doneButton;
     46};
     47
     48#endif
  • mythplugins/mythgame/mythgame/mythgame.pro

     
    99INSTALLS += target
    1010
    1111# Input
    12 HEADERS += gamehandler.h rominfo.h unzip.h gamesettings.h gametree.h
    13 HEADERS += rom_metadata.h romedit.h
     12HEADERS += gamehandler.h rominfo.h unzip.h gamesettings.h gameui.h
     13HEADERS += rom_metadata.h romedit.h gamedetails.h
    1414
    15 SOURCES += main.cpp gamehandler.cpp rominfo.cpp gametree.cpp unzip.c
     15SOURCES += main.cpp gamehandler.cpp rominfo.cpp gameui.cpp unzip.c
    1616SOURCES += gamesettings.cpp dbcheck.cpp rom_metadata.cpp romedit.cpp
     17SOURCES += gamedetails.cpp
    1718
    1819use_hidesyms {
    1920    QMAKE_CXXFLAGS += -fvisibility=hidden