Add "Set Rel" for directory bookmarks

see
http://pulkomandy.tk/projects/GrafX2/ticket/45
It is disabled under AmigaOS, AROS and MorphOS
This commit is contained in:
Thomas Bernard 2018-04-04 19:11:21 +02:00
parent 175ea62b02
commit 7c79cf41e2
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C
3 changed files with 95 additions and 10 deletions

View File

@ -1170,7 +1170,7 @@ short Compute_click_offset_in_fileselector(void)
return computed_offset; return computed_offset;
} }
void Display_bookmark(T_Dropdown_button * Button, int bookmark_number) static void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
{ {
if (Config.Bookmark_directory[bookmark_number]) if (Config.Bookmark_directory[bookmark_number])
{ {
@ -1182,11 +1182,6 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
Window_rectangle(Button->Pos_X+3+10+label_size*8,Button->Pos_Y+2,(8-label_size)*8,8,MC_Light); Window_rectangle(Button->Pos_X+3+10+label_size*8,Button->Pos_Y+2,(8-label_size)*8,8,MC_Light);
// Menu apparait sur clic droit // Menu apparait sur clic droit
Button->Active_button=RIGHT_SIDE; Button->Active_button=RIGHT_SIDE;
// item actifs
Window_dropdown_clear_items(Button);
Window_dropdown_add_item(Button,0,"Set");
Window_dropdown_add_item(Button,1,"Rename");
Window_dropdown_add_item(Button,2,"Clear");
} }
else else
{ {
@ -1194,9 +1189,17 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
Print_in_window(Button->Pos_X+3+10,Button->Pos_Y+2,"--------",MC_Dark,MC_Light); Print_in_window(Button->Pos_X+3+10,Button->Pos_Y+2,"--------",MC_Dark,MC_Light);
// Menu apparait sur clic droit ou gauche // Menu apparait sur clic droit ou gauche
Button->Active_button=RIGHT_SIDE|LEFT_SIDE; Button->Active_button=RIGHT_SIDE|LEFT_SIDE;
// item actifs }
Window_dropdown_clear_items(Button); // item actifs
Window_dropdown_add_item(Button,0,"Set"); Window_dropdown_clear_items(Button);
Window_dropdown_add_item(Button,0,"Set");
#if !(defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) || defined(__amigaos__))
Window_dropdown_add_item(Button,3,"Set Rel");
#endif
if (Config.Bookmark_directory[bookmark_number])
{
Window_dropdown_add_item(Button,1,"Rename");
Window_dropdown_add_item(Button,2,"Clear");
} }
} }
@ -1728,7 +1731,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
for (temp=0;temp<NB_BOOKMARKS;temp++) for (temp=0;temp<NB_BOOKMARKS;temp++)
{ {
bookmark_dropdown[temp]= bookmark_dropdown[temp]=
Window_set_dropdown_button(127+(88+1)*(temp%2),18+(temp/2)*12,88,11,56,"",0,0,1,RIGHT_SIDE,0); // 10-13 Window_set_dropdown_button(127+(88+1)*(temp%2),18+(temp/2)*12,88,11,64,"",0,0,1,RIGHT_SIDE,0); // 10-13
Window_display_icon_sprite(bookmark_dropdown[temp]->Pos_X+3,bookmark_dropdown[temp]->Pos_Y+2,ICON_STAR); Window_display_icon_sprite(bookmark_dropdown[temp]->Pos_X+3,bookmark_dropdown[temp]->Pos_Y+2,ICON_STAR);
Display_bookmark(bookmark_dropdown[temp],temp); Display_bookmark(bookmark_dropdown[temp],temp);
} }
@ -2133,6 +2136,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
{ {
// Bookmark // Bookmark
char * directory_name; char * directory_name;
const char * rel_path;
load_from_clipboard = 0; load_from_clipboard = 0;
switch(Window_attribute2) switch(Window_attribute2)
@ -2196,6 +2200,30 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
Display_bookmark(bookmark_dropdown[clicked_button-10],clicked_button-10); Display_bookmark(bookmark_dropdown[clicked_button-10],clicked_button-10);
} }
break; break;
case 3: // Set Rel
rel_path = Calculate_relative_path(Data_directory, Selector->Directory);
if (rel_path != NULL)
{
// Erase old bookmark
free(Config.Bookmark_directory[clicked_button-10]);
Config.Bookmark_directory[clicked_button-10] = NULL;
Config.Bookmark_directory[clicked_button-10] = strdup(rel_path);
directory_name=Find_last_separator(Selector->Directory);
if (directory_name && directory_name[1]!='\0')
directory_name++;
else
directory_name=Selector->Directory;
temp=strlen(directory_name);
strncpy(Config.Bookmark_label[clicked_button-10],directory_name,8);
if (temp>8)
{
Config.Bookmark_label[clicked_button-10][7]=ELLIPSIS_CHARACTER;
Config.Bookmark_label[clicked_button-10][8]='\0';
}
Display_bookmark(bookmark_dropdown[clicked_button-10],clicked_button-10);
}
break;
} }
} }
break; break;

View File

@ -918,3 +918,56 @@ int Remove_directory(const char * path)
return rmdir(path); return rmdir(path);
#endif #endif
} }
///
/// Calculate relative path
const char * Calculate_relative_path(const char * ref_path, const char * path)
{
char real_ref_path[MAX_PATH_CHARACTERS];
static char rel_path[MAX_PATH_CHARACTERS];
int last_separator = -1;
int i;
int separator_count = 0;
if (ref_path == NULL || path == NULL)
return NULL;
if (Realpath(ref_path, real_ref_path) == NULL)
{
strncpy(real_ref_path, ref_path, MAX_PATH_CHARACTERS);
real_ref_path[MAX_PATH_CHARACTERS-1] = '\0';
}
#if defined(WIN32) || defined(__MINT__)
if ((real_ref_path[1] == ':') && (real_ref_path[0] | 32) != (path[0] | 32))
return NULL; // path on different volumes, not possible
#endif
// look for common path parts
for (i = 0; real_ref_path[i] == path[i] && path[i] != '\0'; i++)
{
if (path[i] == PATH_SEPARATOR[0])
last_separator = i;
#if defined(WIN32)
else if(path[i] == '/')
last_separator = i;
#endif
}
if (real_ref_path[i] == '\0' && path[i] == PATH_SEPARATOR[0])
{
snprintf(rel_path, MAX_PATH_CHARACTERS, ".%s", path + i); // path is under ref_path
return rel_path;
}
if (real_ref_path[i] == '\0' && path[i] == '\0')
return "."; // path are identical
if (last_separator <= 0)
return path; // no common part found return absolute path
// count the number of path separators in the reference path
for (i = last_separator; real_ref_path[i] != '\0'; i++)
if (real_ref_path[i] == PATH_SEPARATOR[0])
separator_count++;
i = 0;
// construct the relative path
while(separator_count-- > 0)
i += snprintf(rel_path + i, MAX_PATH_CHARACTERS - i, "..%s", PATH_SEPARATOR);
strncpy(rel_path + i, path + last_separator + 1, MAX_PATH_CHARACTERS - i);
rel_path[MAX_PATH_CHARACTERS -1] = '\0';
return rel_path;
}

View File

@ -195,5 +195,9 @@ int Remove_path(const char * path);
/// Remove the directory /// Remove the directory
int Remove_directory(const char * path); int Remove_directory(const char * path);
///
/// Calculate relative path
const char * Calculate_relative_path(const char * ref_path, const char * path);
/** @}*/ /** @}*/
#endif #endif