Merge remote-tracking branch 'refs/remotes/TheOfficialFloW/master'

This commit is contained in:
littlebalup 2016-09-05 19:44:06 +02:00
commit a3fd43bf3b
7 changed files with 135 additions and 9 deletions

View File

@ -20,10 +20,14 @@ You can customize those files:
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/battery_bar_red.png'**: Red battery bar
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/battery_bar_charge.png'**: Charging battery bar
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/ftp.png'**: Ftp icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/audio_icon.png'**: Audio icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/archive_icon.png'**: Archive icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/file_icon.png'**: File icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/folder_icon.png'**: Folder icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/image_icon.png'**: Image icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/sfo_icon.png'**: SFO icon
- **'ux0:VitaShell/theme/YOUR_THEME_NAME/text_icon.png'**: Text icon
**Theme setting:** VitaShell will load the theme that is set in **'ux0:VitaShell/theme/theme.txt'** (THEME_NAME = "YOUR_THEME_NAME")

18
file.c
View File

@ -419,6 +419,24 @@ FileListEntry *fileListGetNthEntry(FileList *list, int n) {
return entry;
}
int fileListGetNumberByName(FileList *list, char *name) {
FileListEntry *entry = list->head;
int name_length = strlen(name);
int n = 0;
while (entry) {
if (entry->name_length == name_length && strcmp(entry->name, name) == 0)
break;
n++;
entry = entry->next;
}
return n;
}
void fileListAddEntry(FileList *list, FileListEntry *entry, int sort) {
entry->next = NULL;
entry->previous = NULL;

4
file.h
View File

@ -85,10 +85,14 @@ char **getMountPoints();
FileListEntry *fileListFindEntry(FileList *list, char *name);
FileListEntry *fileListGetNthEntry(FileList *list, int n);
int fileListGetNumberByName(FileList *list, char *name);
void fileListAddEntry(FileList *list, FileListEntry *entry, int sort);
int fileListRemoveEntry(FileList *list, FileListEntry *entry);
int fileListRemoveEntryByName(FileList *list, char *name);
void fileListEmpty(FileList *list);
int fileListGetEntries(FileList *list, char *path);
#endif

View File

@ -89,12 +89,14 @@ void loadLanguage(int id) {
LANGUAGE_ENTRY(DELETE_FILE_QUESTION),
LANGUAGE_ENTRY(DELETE_FOLDER_QUESTION),
LANGUAGE_ENTRY(DELETE_FILES_FOLDERS_QUESTION),
LANGUAGE_ENTRY(INSTALL_ALL_QUESTION),
LANGUAGE_ENTRY(INSTALL_QUESTION),
LANGUAGE_ENTRY(INSTALL_WARNING),
LANGUAGE_ENTRY(SAVE_MODIFICATIONS),
LANGUAGE_ENTRY(WIFI_ERROR),
LANGUAGE_ENTRY(FTP_SERVER),
LANGUAGE_ENTRY(SYS_INFO),
LANGUAGE_ENTRY(INSTALL_ALL),
LANGUAGE_ENTRY(UPDATE_QUESTION),
};
@ -109,4 +111,4 @@ void loadLanguage(int id) {
readConfig(path, language_entries, sizeof(language_entries) / sizeof(ConfigEntry));
}
}
}
}

View File

@ -47,12 +47,14 @@ enum LanguageContainer {
DELETE_FILE_QUESTION,
DELETE_FOLDER_QUESTION,
DELETE_FILES_FOLDERS_QUESTION,
INSTALL_ALL_QUESTION,
INSTALL_QUESTION,
INSTALL_WARNING,
SAVE_MODIFICATIONS,
WIFI_ERROR,
FTP_SERVER,
SYS_INFO,
INSTALL_ALL,
UPDATE_QUESTION,
LANGUAGE_CONTRAINER_SIZE,
};
@ -62,4 +64,4 @@ extern char *language_container[LANGUAGE_CONTRAINER_SIZE];
void freeLanguageContainer();
void loadLanguage(int id);
#endif
#endif

106
main.c
View File

@ -56,10 +56,10 @@ int _newlib_heap_size_user = 64 * 1024 * 1024;
#define MAX_DIR_LEVELS 1024
// File lists
static FileList file_list, mark_list, copy_list;
static FileList file_list, mark_list, copy_list, install_list;
// Paths
static char cur_file[MAX_PATH_LENGTH], archive_path[MAX_PATH_LENGTH];
static char cur_file[MAX_PATH_LENGTH], archive_path[MAX_PATH_LENGTH], install_path[MAX_PATH_LENGTH];
// Position
static int base_pos = 0, rel_pos = 0;
@ -149,6 +149,39 @@ DIR_UP_RETURN:
dirUpCloseArchive();
}
void focusOnFilename(char *name) {
int name_pos = fileListGetNumberByName(&file_list, name);
if (name_pos < file_list.length) {
while (1) {
int index = base_pos + rel_pos;
if (index == name_pos)
break;
if (index > name_pos) {
if (rel_pos > 0) {
rel_pos--;
} else {
if (base_pos > 0) {
base_pos--;
}
}
}
if (index < name_pos) {
if ((rel_pos + 1) < file_list.length) {
if ((rel_pos + 1) < MAX_POSITION) {
rel_pos++;
} else {
if ((base_pos + rel_pos + 1) < file_list.length) {
base_pos++;
}
}
}
}
}
}
}
int refreshFileList() {
int ret = 0, res = 0;
@ -406,7 +439,8 @@ void drawShellInfo(char *path) {
}
enum MenuEntrys {
MENU_ENTRY_MARK_UNMARK_ALL,
MENU_ENTRY_INSTALL_ALL,
MENU_ENTRY_MARK_UNMARK_ALL,
MENU_ENTRY_EMPTY_1,
MENU_ENTRY_MOVE,
MENU_ENTRY_COPY,
@ -430,7 +464,8 @@ typedef struct {
} MenuEntry;
MenuEntry menu_entries[] = {
{ MARK_ALL, VISIBILITY_INVISIBLE },
{ INSTALL_ALL, VISIBILITY_INVISIBLE },
{ MARK_ALL, VISIBILITY_INVISIBLE },
{ -1, VISIBILITY_UNUSED },
{ MOVE, VISIBILITY_INVISIBLE },
{ COPY, VISIBILITY_INVISIBLE },
@ -477,6 +512,10 @@ void initContextMenu() {
menu_entries[MENU_ENTRY_NEW_FOLDER].visibility = VISIBILITY_INVISIBLE;
}
if(file_entry->type != FILE_TYPE_VPK) {
menu_entries[MENU_ENTRY_INSTALL_ALL].visibility = VISIBILITY_INVISIBLE;
}
// TODO: Moving from one mount point to another is not possible
// Mark/Unmark all text
@ -733,6 +772,37 @@ void contextMenuCtrl() {
dialog_step = DIALOG_STEP_NEW_FOLDER;
break;
}
case MENU_ENTRY_INSTALL_ALL:
{
// Empty install list
fileListEmpty(&install_list);
FileListEntry *file_entry = file_list.head->next; // Ignore '..'
int i;
for (i = 0; i < file_list.length - 1; i++) {
char path[MAX_PATH_LENGTH];
snprintf(path, MAX_PATH_LENGTH, "%s%s", file_list.path, file_entry->name);
int type = getFileType(path);
if (type == FILE_TYPE_VPK) {
FileListEntry *install_entry = malloc(sizeof(FileListEntry));
memcpy(install_entry, file_entry, sizeof(FileListEntry));
fileListAddEntry(&install_list, install_entry, SORT_NONE);
}
// Next
file_entry = file_entry->next;
}
strcpy(install_list.path, file_list.path);
initMessageDialog(SCE_MSG_DIALOG_BUTTON_TYPE_YESNO, language_container[INSTALL_ALL_QUESTION]);
dialog_step = DIALOG_STEP_INSTALL_QUESTION;
break;
}
}
ctx_menu_mode = CONTEXT_MENU_CLOSING;
@ -759,7 +829,6 @@ int dialogSteps() {
// With refresh
case DIALOG_STEP_COPIED:
case DIALOG_STEP_DELETED:
case DIALOG_STEP_INSTALLED:
if (msg_result == MESSAGE_DIALOG_RESULT_NONE || msg_result == MESSAGE_DIALOG_RESULT_FINISHED) {
refresh = 1;
dialog_step = DIALOG_STEP_NONE;
@ -908,7 +977,19 @@ int dialogSteps() {
case DIALOG_STEP_INSTALL_CONFIRMED:
if (msg_result == MESSAGE_DIALOG_RESULT_RUNNING) {
InstallArguments args;
args.file = cur_file;
if(install_list.length > 0) {
FileListEntry *entry = install_list.head;
snprintf(install_path, MAX_PATH_LENGTH, "%s%s", install_list.path, entry->name);
args.file = install_path;
// Focus
focusOnFilename(entry->name);
// Remove entry
fileListRemoveEntry(&install_list, entry);
} else {
args.file = cur_file;
}
SceUID thid = sceKernelCreateThread("install_thread", (SceKernelThreadEntry)install_thread, 0x40, 0x10000, 0, 0, NULL);
if (thid >= 0)
@ -928,6 +1009,19 @@ int dialogSteps() {
break;
case DIALOG_STEP_INSTALLED:
if (msg_result == MESSAGE_DIALOG_RESULT_NONE || msg_result == MESSAGE_DIALOG_RESULT_FINISHED) {
if(install_list.length > 0) {
initMessageDialog(MESSAGE_DIALOG_PROGRESS_BAR, language_container[INSTALLING]);
dialog_step = DIALOG_STEP_INSTALL_CONFIRMED;
break;
}
dialog_step = DIALOG_STEP_NONE;
}
break;
case DIALOG_STEP_UPDATE_QUESTION:
if (msg_result == MESSAGE_DIALOG_RESULT_YES) {
initMessageDialog(MESSAGE_DIALOG_PROGRESS_BAR, language_container[DOWNLOADING]);

View File

@ -27,10 +27,12 @@ EXTRACTING = "Extracting..."
DELETE_FILE_QUESTION = "Are you sure you want to delete this file?"
DELETE_FOLDER_QUESTION = "Are you sure you want to delete this folder?"
DELETE_FILES_FOLDERS_QUESTION = "Are you sure you want to delete these files/folders?"
INSTALL_ALL_QUESTION = "Do you want to install all packages available in this folder?"
INSTALL_QUESTION = "Do you want to install this package?"
INSTALL_WARNING = "This package requests extended permissions.\It will have access to your personal information.\If you did not obtain it from a trusted source,\please proceed at your own caution.\\Would you like to continue the install?"
SAVE_MODIFICATIONS = "Do you want to save your modifications?"
WIFI_ERROR = "You must use Wi-Fi to do this."
FTP_SERVER = "FTP server is now running at\ftp://%s:%i\\Press 'OK' to keep it in background.\Press 'Cancel' to disconnect."
SYS_INFO = "System software: %s\Model: 0x%08X\MAC address: %s\IP address: %s\Memory card: %s/%s"
UPDATE_QUESTION = "VitaShell %s is now available.\\Do you want to update the application?"
INSTALL_ALL = "Install all"
UPDATE_QUESTION = "VitaShell %s is now available.\\Do you want to update the application?"