/*
* CINELERRA
- * Copyright (C) 1997-2011 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 1997-2017 Adam Williams <broadcast at earthling dot net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
{
get_resources()->filebox_sortcolumn = filebox->sort_column = get_sort_column();
get_resources()->filebox_sortorder = filebox->sort_order = get_sort_order();
- filebox->refresh();
+ filebox->refresh(-1);
return 1;
}
}
-
-
BC_FileBoxTextBox::BC_FileBoxTextBox(int x, int y, BC_FileBox *filebox)
: BC_TextBox(x, y, filebox->get_w() - 20, 1,
filebox->want_directory ? filebox->directory : filebox->filename)
{
}
-
-
-
int BC_FileBoxTextBox::handle_event()
{
int result = 0;
}
-
-
BC_FileBoxDirectoryText::BC_FileBoxDirectoryText(int x, int y, BC_FileBox *filebox)
: BC_TextBox(x, y, filebox->get_w() - 40, 1, filebox->fs->get_current_dir())
{
while( *cp ) ++cp;
if( cp > path && *--cp != '/' ) return 0;
char *file_path = FileSystem::basepath(path);
- char *dir_path = FileSystem::basepath(filebox->fs->get_current_dir());
+ char *dir_path = FileSystem::basepath(filebox->directory);
int ret = !strcmp(file_path, dir_path) ? 0 : 1;
if( ret ) {
strcpy(filebox->directory, file_path);
}
-
-
-
BC_FileBoxFilterText::BC_FileBoxFilterText(int x, int y, BC_FileBox *filebox)
- : BC_TextBox(x, y, filebox->get_w() - 50, 1, filebox->get_resources()->filebox_filter)
+ : BC_TextBox(x, y, filebox->get_w() - x - 50, 1, filebox->get_resources()->filebox_filter)
{
this->filebox = filebox;
}
}
-
-
BC_FileBoxFilterMenu::BC_FileBoxFilterMenu(int x, int y, BC_FileBox *filebox)
- : BC_ListBox(x,
- y,
- filebox->get_w() - 30,
- 120,
- LISTBOX_TEXT,
- &filebox->filter_list,
- 0,
- 0,
- 1,
- 0,
- 1)
+ : BC_ListBox(x, y, filebox->get_w() - 30, 120,
+ LISTBOX_TEXT, &filebox->filter_list, 0, 0, 1, 0, 1)
{
this->filebox = filebox;
set_tooltip(_("Change the filter"));
}
-
-
-
-
-
-
-
-
-BC_FileBoxCancel::BC_FileBoxCancel(BC_FileBox *filebox)
- : BC_CancelButton(filebox)
+BC_FileBoxSizeFormat::BC_FileBoxSizeFormat(int x, int y, BC_FileBox *file_box)
+ : BC_Button(x, y, &BC_WindowBase::get_resources()->
+ filebox_szfmt_images[3*file_box->size_format])
{
- this->filebox = filebox;
- set_tooltip(_("Cancel the operation"));
+ this->file_box = file_box;
+ set_tooltip(_("Size numeric format"));
}
-
-BC_FileBoxCancel::~BC_FileBoxCancel()
+BC_FileBoxSizeFormat::~BC_FileBoxSizeFormat()
{
}
-int BC_FileBoxCancel::handle_event()
+int BC_FileBoxSizeFormat::handle_event()
{
-// filebox->submit_file(filebox->textbox->get_text());
- filebox->newfolder_thread->interrupt();
- filebox->set_done(1);
+ if( ++file_box->size_format > FILEBOX_SIZE_THOU )
+ file_box->size_format = FILEBOX_SIZE_RAW;
+ BC_WindowBase::get_resources()->filebox_size_format = file_box->size_format;
+ set_images(&BC_WindowBase::get_resources()->
+ filebox_szfmt_images[3*file_box->size_format]);
+ draw_face(0);
+ file_box->refresh(0);
return 1;
}
-
-
-
-
-
BC_FileBoxUseThis::BC_FileBoxUseThis(BC_FileBox *filebox)
: BC_Button(filebox->get_w() / 2 -
BC_WindowBase::get_resources()->usethis_button_images[0]->get_w() / 2,
}
-
-
-
BC_FileBoxOK::BC_FileBoxOK(BC_FileBox *filebox)
: BC_OKButton(filebox,
!filebox->want_directory ?
return 1;
}
+BC_FileBoxCancel::BC_FileBoxCancel(BC_FileBox *filebox)
+ : BC_CancelButton(filebox)
+{
+ this->filebox = filebox;
+ set_tooltip(_("Cancel the operation"));
+}
+
+BC_FileBoxCancel::~BC_FileBoxCancel()
+{
+}
+
+int BC_FileBoxCancel::handle_event()
+{
+// filebox->submit_file(filebox->textbox->get_text());
+ filebox->newfolder_thread->interrupt();
+ filebox->set_done(1);
+ return 1;
+}
+
+
BC_FileBoxText::BC_FileBoxText(int x, int y, BC_FileBox *filebox)
: BC_Button(x, y, BC_WindowBase::get_resources()->filebox_text_images)
-
-
-
-
-
-
-
BC_FileBox::BC_FileBox(int x, int y, const char *init_path,
const char *title, const char *caption, int show_all_files,
int want_directory, int multiple_files, int h_padding)
column_type = new int[columns];
column_width = new int[columns];
+ filter_title = 0;
filter_text = 0;
filter_popup = 0;
usethis_button = 0;
+ size_format = BC_WindowBase::get_resources()->filebox_size_format;
strcpy(this->caption, caption);
strcpy(this->current_path, init_path);
this->want_directory = want_directory;
if(show_all_files) fs->set_show_all();
fs->complete_path(this->current_path);
- fs->complete_path(this->submitted_path);
+ strcpy(this->submitted_path, this->current_path);
fs->extract_dir(directory, this->current_path);
fs->extract_name(filename, this->current_path);
// Test if current directory exists
if(!fs->is_dir(directory))
{
- sprintf(this->current_path, "~");
- fs->complete_path(this->current_path);
- fs->set_current_dir(this->current_path);
-// fs->update(this->current_path);
- strcpy(directory, fs->get_current_dir());
+ sprintf(directory, "~");
+ fs->complete_path(directory);
+ strcpy(current_path,directory);
filename[0] = 0;
}
- else
- fs->set_current_dir(this->directory);
-
+ fs->set_current_dir(directory);
if(h_padding == -1)
{
int directory_title_margin = MAX(20,
resources->filebox_text_images[0]->get_h());
-// Create recent dir list
- create_history();
-
// Directories aren't filtered in FileSystem so skip this
if(!want_directory)
{
filter_list.append(new BC_ListBoxItem("*"));
- filter_list.append(new BC_ListBoxItem("[*.ifo][*.vob]"));
+ filter_list.append(new BC_ListBoxItem("[*.mkv][*.webm]"));
+ filter_list.append(new BC_ListBoxItem("[*.mp4][*.MP4]"));
filter_list.append(new BC_ListBoxItem("[*.mp2][*.mp3][*.wav]"));
filter_list.append(new BC_ListBoxItem("[*.avi][*.mpg][*.m2v][*.m1v][*.mov]"));
- filter_list.append(new BC_ListBoxItem("heroine*"));
+ filter_list.append(new BC_ListBoxItem("[*.jpg][*.JPG][*.png][*.gif][*.tiff]"));
filter_list.append(new BC_ListBoxItem("*.xml"));
fs->set_filter(get_resources()->filebox_filter);
}
-// fs->update(directory);
create_icons();
create_tables();
x -= resources->filebox_updir_images[0]->get_w() + 5;
add_subwindow(updir_button = new BC_FileBoxUpdir(x, y, this));
+ x -= resources->filebox_szfmt_images[0]->get_w() + 5;
+
+ add_subwindow(szfmt_button = new BC_FileBoxSizeFormat(x, y, this));
x = 10;
y += directory_title_margin + 3;
add_subwindow(recent_popup = new BC_FileBoxRecent(this, x, y));
add_subwindow(directory_title = new BC_FileBoxDirectoryText(x, y, this));
- directory_title->reposition_window(x, y,
- get_w() - recent_popup->get_w() - 20, 1);
- recent_popup->reposition_window(
- x + directory_title->get_w(), y,
- directory_title->get_w(), 200);
+ directory_title->reposition_window(x, y, get_w() - recent_popup->get_w() - 20, 1);
+ x += directory_title->get_w() + 8;
+ recent_popup->reposition_window(x, y, directory_title->get_w(), 200);
x = 10;
y += directory_title->get_h() + 5;
if( newest >= 0 ) {
strcpy(directory, resources->filebox_history[newest].path);
fs->change_dir(directory, 0);
+ strcpy(directory, fs->get_current_dir());
directory_title->update(fs->get_current_dir());
}
+ fs->set_sort_order(sort_order);
+ fs->set_sort_field(column_type[sort_column]);
+ fs->update(directory);
+
+// Create recent dir list
+ create_history();
+ update_history();
listbox = 0;
create_listbox(x, y, get_display_mode());
y += textbox->get_h() + 10;
if(!want_directory) {
- add_subwindow(filter_text = new BC_FileBoxFilterText(x, y, this));
+ add_subwindow(filter_title = new BC_Title(x, y, _("Specify filter:")));
+ int x1 = x + filter_title->get_w() + 10;
+ add_subwindow(filter_text = new BC_FileBoxFilterText(x1, y, this));
add_subwindow(filter_popup =
- new BC_FileBoxFilterMenu(x + filter_text->get_w(), y, this));;
+ new BC_FileBoxFilterMenu(x1 + filter_text->get_w(), y, this));
}
// listbox has to be active because refresh might be called from newfolder_thread
rename_thread = new BC_RenameThread(this);
-
+ refresh();
show_window();
}
int BC_FileBox::get_listbox_h(int y)
{
- int result = get_h() -
- y -
- h_padding;
+ int result = get_h() - y - h_padding - 10;
if(want_directory)
result -= BC_WindowBase::get_resources()->dirbox_margin;
else
w - 30,
0);
-
+ if(filter_title) filter_title->reposition_window(filter_title->get_x(),
+ h - (get_h() - filter_title->get_y()));
if(filter_text) filter_text->reposition_window(filter_text->get_x(),
h - (get_h() - filter_text->get_y()),
w - (get_w() - filter_text->get_w()),
get_w() - recent_popup->get_w() - 20,
1);
recent_popup->reposition_window(
- directory_title->get_x() + directory_title->get_w(),
+ directory_title->get_x() + directory_title->get_w() + 8,
directory_title->get_y(),
directory_title->get_w() + recent_popup->get_w(),
recent_popup->get_h());
reload_button->reposition_window(reload_button->get_x()+dx, reload_button->get_y());
delete_button->reposition_window(delete_button->get_x()+dx, delete_button->get_y());
updir_button->reposition_window(updir_button->get_x()+dx, updir_button->get_y());
+ szfmt_button->reposition_window(szfmt_button->get_x()+dx, szfmt_button->get_y());
set_w(w); set_h(h);
get_resources()->filebox_w = get_w();
get_resources()->filebox_h = get_h();
return 0;
}
+static inline int64_t ipow(int m, int n)
+{
+ int64_t v = 1;
+ for( int64_t vv=m; n>0; vv*=vv,n>>=1 ) if( n & 1 ) v *= vv;
+ return v;
+}
+static inline int ilen(int64_t v)
+{
+ int len = 1;
+ while( len<16 && (v/=10)>0 ) ++len;
+ return len;
+}
+
int BC_FileBox::create_tables()
{
delete_tables();
fs->set_sort_order(sort_order);
fs->set_sort_field(column_type[sort_column]);
-// Directory is entered before this from a random source
- fs->update(0);
for(int i = 0; i < fs->total_files(); i++)
{
FileItem *file_item = fs->get_entry(i);
// {
if(!is_dir)
{
- sprintf(string, "%jd", file_item->size);
+ int64_t size = file_item->size;
+ if( (size_format == FILEBOX_SIZE_1000 && size >= 1000) ||
+ (size_format == FILEBOX_SIZE_1024 && size >= 1024) ) {
+ static const char *suffix[] = { "", "K", "M", "G", "T", "P" };
+ if( size_format == FILEBOX_SIZE_1024 ) {
+ static const long double kk = logl(1000.)/logl(1024.);
+ size = expl(kk*logl((long double)size)) + 0.5;
+ }
+ int len = ilen(size), drop = len-3, round = 1;
+ if( round && drop > 0 ) { //round
+ size += ipow(10,drop)/2;
+ len = ilen(size); drop = len-3;
+ }
+ size /= ipow(10,drop);
+ int sfx = (len-1)/3;
+ int digits = (sfx+1)*3 - len;
+ int64_t frac = ipow(10,digits);
+ int mant = size / frac;
+ int fraction = size - mant*frac;
+ sfx = *suffix[sfx];
+ if( sfx && size_format == FILEBOX_SIZE_1000 ) sfx += 'a'-'A';
+ if( digits )
+ sprintf(string, "%d.%0*d%c", mant, digits, fraction, sfx);
+ else
+ sprintf(string, "%d%c", mant, sfx);
+ }
+ else {
+ sprintf(string, "%jd", size);
+ if( size_format == FILEBOX_SIZE_THOU )
+ Units::punctuate(string);
+ }
new_item = new BC_ListBoxItem(string, get_resources()->file_color);
}
else
// Date entry
if(!is_dir || 1)
{
- static const char *month_text[13] = { "Nul",
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
- };
- sprintf(string,
- "%s %d, %d",
- month_text[file_item->month],
- file_item->day,
- file_item->year);
+ struct tm mod_time;
+ localtime_r(&file_item->mtime, &mod_time);
+ sprintf(string, "%04d.%02d.%02d %02d:%02d:%02d",
+ mod_time.tm_year+1900, mod_time.tm_mon+1, mod_time.tm_mday,
+ mod_time.tm_hour, mod_time.tm_min, mod_time.tm_sec);
new_item = new BC_ListBoxItem(string, get_resources()->file_color);
}
else
BC_Pixmap* BC_FileBox::get_icon(char *path, int is_dir)
{
- char *suffix = strrchr(path, '.');
+ if( is_dir ) return icons[ICON_FOLDER];
int icon_type = ICON_UNKNOWN;
-
- if(is_dir) return icons[ICON_FOLDER];
-
- if(suffix)
- {
- suffix++;
- if(*suffix != 0)
- {
- for(int i = 0; i < TOTAL_SUFFIXES; i++)
- {
- if(!strcasecmp(suffix, BC_WindowBase::get_resources()->suffix_to_type[i].suffix))
- {
- icon_type = BC_WindowBase::get_resources()->suffix_to_type[i].icon_type;
- break;
- }
- }
- }
+ char *suffix = strrchr(path, '.');
+ if( suffix && *++suffix ) {
+ suffix_to_type_t *stp = &BC_WindowBase::get_resources()->suffix_to_type[0];
+ while( stp->suffix && strcasecmp(stp->suffix, suffix) ) ++stp;
+ if( stp->icon_type ) icon_type = stp->icon_type;
}
return icons[icon_type];
const char* BC_FileBox::columntype_to_text(int type)
{
- switch(type)
- {
- case FILEBOX_NAME:
- return FILEBOX_NAME_TEXT;
- break;
- case FILEBOX_SIZE:
- return FILEBOX_SIZE_TEXT;
- break;
- case FILEBOX_DATE:
- return FILEBOX_DATE_TEXT;
- break;
- case FILEBOX_EXTENSION:
- return FILEBOX_EXTENSION_TEXT;
- break;
+ switch(type) {
+ case FILEBOX_NAME: return FILEBOX_NAME_TEXT;
+ case FILEBOX_SIZE: return FILEBOX_SIZE_TEXT;
+ case FILEBOX_DATE: return FILEBOX_DATE_TEXT;
+ case FILEBOX_EXTENSION: return FILEBOX_EXTENSION_TEXT;
}
return "";
}
-int BC_FileBox::refresh(int zscroll)
+int BC_FileBox::refresh(int reset)
{
+ fs->set_sort_order(sort_order);
+ fs->set_sort_field(column_type[sort_column]);
+ if( reset >= 0 )
+ fs->update(0);
+ else
+ fs->update_sort();
create_tables();
listbox->set_master_column(column_of_type(FILEBOX_NAME), 0);
listbox->update(list_column, column_titles, column_width, columns,
- !zscroll ? listbox->get_xposition() : 0,
- !zscroll ? listbox->get_yposition() : 0,
+ reset>0 ? 0 : listbox->get_xposition(),
+ reset>0 ? 0 : listbox->get_yposition(),
-1, 1);
return 0;
}
{
if(src != dst)
{
-
ArrayList<BC_ListBoxItem*> *new_columns =
new ArrayList<BC_ListBoxItem*>[columns];
int *new_types = new int[columns];
int BC_FileBox::submit_file(const char *path, int use_this)
{
+ char path1[BCTEXTLEN];
+ strcpy(path1, path);
+ char *cp = strchr(path1,'\n');
+ if( cp ) *cp = 0;
+
// Deactivate textbox to hide suggestions
textbox->deactivate();
// If file wanted, take the current directory as the desired file.
// If directory wanted, ignore it.
- if(!path[0] && !want_directory)
+ if(!path1[0] && !want_directory)
{
// save complete path
strcpy(this->current_path, directory);
}
// is a directory, change directories
- if(fs->is_dir(path) && !use_this)
+ if(fs->is_dir(path1) && !use_this)
{
- fs->change_dir(path, 0);
+ fs->change_dir(path1, 0);
refresh(1);
directory_title->update(fs->get_current_dir());
strcpy(this->current_path, fs->get_current_dir());
// Is a file or desired directory. Quit the operation.
{
char path2[BCTEXTLEN];
- strcpy(path2, path);
+ strcpy(path2, path1);
// save directory for defaults
fs->extract_dir(directory, path2);
strcpy(path, directory);
// enfore one trailing slash
char *cp = path;
- while( *cp ) ++cp;
+ while( *cp && *cp != '\n' ) ++cp;
while( cp > path && *(cp-1) == '/' ) --cp;
*cp++ = '/'; *cp = 0;