2021-06-21 03:43:40 +01:00
/*
2021-06-24 02:37:57 +01:00
* titles_tab . cpp
2021-06-21 03:43:40 +01:00
*
2024-04-12 10:47:36 +01:00
* Copyright ( c ) 2020 - 2024 , DarkMatterCore < pabloacurielz @ gmail . com > .
2021-06-21 03:43:40 +01:00
*
* This file is part of nxdumptool ( https : //github.com/DarkMatterCore/nxdumptool).
*
* nxdumptool is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* nxdumptool is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
*/
2024-04-30 22:01:42 +01:00
# include <views/titles_tab.hpp>
2021-06-21 03:43:40 +01:00
2021-06-21 04:00:39 +01:00
using namespace brls : : i18n : : literals ; /* For _i18n. */
2021-06-21 03:43:40 +01:00
namespace nxdt : : views
{
2021-06-24 16:53:36 +01:00
TitlesTabPopup : : TitlesTabPopup ( const TitleApplicationMetadata * app_metadata , bool is_system ) : brls : : TabFrame ( ) , app_metadata ( app_metadata ) , is_system ( is_system )
{
u64 title_id = this - > app_metadata - > title_id ;
bool user_ret = false ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
if ( ! this - > is_system )
{
/* Get user application data. */
user_ret = titleGetUserApplicationData ( title_id , & ( this - > user_app_data ) ) ;
} else {
/* Get system title info. */
2024-08-18 14:29:57 +01:00
this - > system_title_info = titleGetTitleInfoEntryFromStorageByTitleId ( NcmStorageId_BuiltInSystem , title_id ) ;
2021-06-24 16:53:36 +01:00
}
2022-07-05 02:04:28 +01:00
2024-04-18 09:46:29 +01:00
/* Make sure we got title information. This should never get triggered. */
2021-06-24 16:53:36 +01:00
if ( ( ! this - > is_system & & ! user_ret ) | | ( this - > is_system & & ! this - > system_title_info ) ) throw fmt : : format ( " Failed to retrieve title information for {:016X}. " , title_id ) ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Add tabs. */
this - > addTab ( " Red " , new brls : : Rectangle ( nvgRGB ( 255 , 0 , 0 ) ) ) ;
this - > addTab ( " Green " , new brls : : Rectangle ( nvgRGB ( 0 , 255 , 0 ) ) ) ;
this - > addTab ( " Blue " , new brls : : Rectangle ( nvgRGB ( 0 , 0 , 255 ) ) ) ;
}
2022-07-05 02:04:28 +01:00
2024-04-19 11:08:44 +01:00
TitlesTabPopup : : ~ TitlesTabPopup ( )
2021-06-24 16:53:36 +01:00
{
/* Free title information. */
if ( ! this - > is_system )
{
titleFreeUserApplicationData ( & ( this - > user_app_data ) ) ;
} else {
titleFreeTitleInfo ( & ( this - > system_title_info ) ) ;
}
}
2022-07-05 02:04:28 +01:00
2022-07-28 03:13:48 +01:00
TitlesTabItem : : TitlesTabItem ( const TitleApplicationMetadata * app_metadata , bool is_system , bool click_anim ) : brls : : ListItem ( std : : string ( app_metadata - > lang_entry . name ) , " " , " " ) , \
app_metadata ( app_metadata ) , \
is_system ( is_system ) , \
click_anim ( click_anim )
2021-06-24 02:04:28 +01:00
{
2021-06-24 02:37:57 +01:00
/* Set sublabel. */
2021-07-21 16:04:18 +01:00
if ( ! this - > is_system ) this - > setSubLabel ( std : : string ( app_metadata - > lang_entry . author ) ) ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Set thumbnail (if needed). */
if ( app_metadata - > icon & & app_metadata - > icon_size ) this - > setThumbnail ( app_metadata - > icon , app_metadata - > icon_size ) ;
2022-07-05 02:04:28 +01:00
2021-06-25 21:13:39 +01:00
/* Set value. */
this - > setValue ( fmt : : format ( " {:016X} " , this - > app_metadata - > title_id ) , false , false ) ;
2021-06-24 02:04:28 +01:00
}
2022-07-05 02:04:28 +01:00
2022-07-28 03:13:48 +01:00
void TitlesTabItem : : playClickAnimation ( void )
{
if ( this - > click_anim ) brls : : View : : playClickAnimation ( ) ;
}
2021-08-11 08:17:57 +01:00
TitlesTab : : TitlesTab ( RootView * root_view , bool is_system ) : LayeredErrorFrame ( " titles_tab/no_titles_available " _i18n ) , root_view ( root_view ) , is_system ( is_system )
2021-06-21 03:43:40 +01:00
{
/* Populate list. */
2024-05-05 23:41:41 +01:00
this - > PopulateList ( this - > root_view - > GetApplicationMetadataInfo ( this - > is_system ) ) ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Subscribe to the title event if this is the user titles tab. */
2021-06-24 02:37:57 +01:00
if ( ! this - > is_system )
{
2024-05-05 23:41:41 +01:00
this - > title_task_sub = this - > root_view - > RegisterTitleMetadataTaskListener ( [ this ] ( const nxdt : : tasks : : TitleApplicationMetadataInfo & app_metadata_info ) {
2021-06-24 02:37:57 +01:00
/* Update list. */
2024-05-05 23:41:41 +01:00
this - > PopulateList ( app_metadata_info ) ;
2021-06-24 02:37:57 +01:00
} ) ;
}
2021-06-21 03:43:40 +01:00
}
2022-07-05 02:04:28 +01:00
2024-04-19 11:08:44 +01:00
TitlesTab : : ~ TitlesTab ( )
2021-06-21 03:43:40 +01:00
{
2021-06-24 02:37:57 +01:00
/* Unregister task listener if this is the user titles tab. */
2024-04-30 22:01:42 +01:00
if ( ! this - > is_system ) this - > root_view - > UnregisterTitleMetadataTaskListener ( this - > title_task_sub ) ;
2021-06-21 03:43:40 +01:00
}
2022-07-05 02:04:28 +01:00
2024-05-05 23:41:41 +01:00
void TitlesTab : : PopulateList ( const nxdt : : tasks : : TitleApplicationMetadataInfo & app_metadata_info )
2021-06-21 03:43:40 +01:00
{
2024-05-05 20:42:32 +01:00
/* Block user inputs. */
brls : : Application : : blockInputs ( ) ;
2021-06-25 21:13:39 +01:00
/* Populate variables. */
2024-05-10 11:18:57 +01:00
TitleApplicationMetadata * * app_metadata = app_metadata_info . app_metadata ;
const u32 app_metadata_count = app_metadata_info . app_metadata_count ;
2021-06-25 21:13:39 +01:00
bool update_focused_view = this - > IsListItemFocused ( ) ;
int focus_stack_index = this - > GetFocusStackViewIndex ( ) ;
2022-07-05 02:04:28 +01:00
2021-06-25 21:13:39 +01:00
/* If needed, switch to the error frame *before* cleaning up our list. */
2024-05-10 11:18:57 +01:00
if ( ! app_metadata_count ) this - > SwitchLayerView ( true ) ;
2022-07-05 02:04:28 +01:00
2021-06-21 03:43:40 +01:00
/* Clear list. */
this - > list - > clear ( ) ;
this - > list - > invalidate ( true ) ;
2022-07-05 02:04:28 +01:00
2024-05-05 20:42:32 +01:00
/* Return immediately if we have no application metadata. */
2024-05-10 11:18:57 +01:00
if ( ! app_metadata_count )
2024-05-05 20:42:32 +01:00
{
brls : : Application : : unblockInputs ( ) ;
return ;
}
2022-07-05 02:04:28 +01:00
2021-06-21 03:43:40 +01:00
/* Populate list. */
2024-05-10 11:18:57 +01:00
for ( u32 i = 0 ; i < app_metadata_count ; i + + )
2021-06-24 16:53:36 +01:00
{
/* Create list item. */
2024-05-10 11:18:57 +01:00
TitlesTabItem * item = new TitlesTabItem ( app_metadata [ i ] , this - > is_system ) ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Register click event. */
2024-04-18 09:46:29 +01:00
item - > getClickEvent ( ) - > subscribe ( [ ] ( brls : : View * view ) {
2021-06-24 16:53:36 +01:00
TitlesTabItem * item = static_cast < TitlesTabItem * > ( view ) ;
2024-05-05 20:42:32 +01:00
const TitleApplicationMetadata * item_app_metadata = item - > GetApplicationMetadata ( ) ;
2021-06-24 16:53:36 +01:00
bool is_system = item - > IsSystemTitle ( ) ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Create popup. */
TitlesTabPopup * popup = nullptr ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
try {
2024-05-05 20:42:32 +01:00
popup = new TitlesTabPopup ( item_app_metadata , is_system ) ;
2021-06-24 16:53:36 +01:00
} catch ( const std : : string & msg ) {
2022-07-27 23:53:52 +01:00
LOG_MSG_DEBUG ( " %s " , msg . c_str ( ) ) ;
2021-06-24 16:53:36 +01:00
if ( popup ) delete popup ;
return ;
}
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Display popup. */
2024-05-05 20:42:32 +01:00
std : : string name = std : : string ( item_app_metadata - > lang_entry . name ) ;
std : : string tid = fmt : : format ( " {:016X} " , item_app_metadata - > title_id ) ;
std : : string sub_left = ( ! is_system ? std : : string ( item_app_metadata - > lang_entry . author ) : tid ) ;
2021-06-24 16:53:36 +01:00
std : : string sub_right = ( ! is_system ? tid : " " ) ;
2022-07-05 02:04:28 +01:00
2024-05-05 20:42:32 +01:00
if ( item_app_metadata - > icon & & item_app_metadata - > icon_size )
2021-06-24 16:53:36 +01:00
{
2024-05-05 20:42:32 +01:00
brls : : PopupFrame : : open ( name , item_app_metadata - > icon , item_app_metadata - > icon_size , popup , sub_left , sub_right ) ;
2021-06-24 16:53:36 +01:00
} else {
brls : : PopupFrame : : open ( name , popup , sub_left , sub_right ) ;
}
} ) ;
2022-07-05 02:04:28 +01:00
2021-06-24 16:53:36 +01:00
/* Add list item to our view. */
2024-04-18 09:46:29 +01:00
this - > list - > addView ( item ) ;
2021-06-24 16:53:36 +01:00
}
2022-07-05 02:04:28 +01:00
2021-06-25 21:13:39 +01:00
/* Update focus stack, if needed. */
2022-07-27 23:53:52 +01:00
if ( focus_stack_index > - 1 ) this - > UpdateFocusStackViewAtIndex ( focus_stack_index , this - > GetListFirstFocusableChild ( ) ) ;
2022-07-05 02:04:28 +01:00
2021-06-21 03:43:40 +01:00
/* Switch to the list. */
this - > list - > invalidate ( true ) ;
2021-06-25 21:13:39 +01:00
this - > SwitchLayerView ( false , update_focused_view , focus_stack_index < 0 ) ;
2024-05-05 20:42:32 +01:00
/* Unblock user inputs. */
brls : : Application : : unblockInputs ( ) ;
2021-06-21 03:43:40 +01:00
}
}