#include "assets.h"
#include "awindowgui.h"
#include "awindow.h"
+#include "bccmodels.h"
#include "bcsignals.h"
#include "bchash.h"
#include "cache.h"
-#include "bccmodels.h"
+#include "cstrdup.h"
+#include "clip.h"
#include "clippopup.h"
#include "cursors.h"
#include "cwindowgui.h"
delete temp; temp = 0;
}
if( !temp )
- temp = new VFrame(asset->width, asset->height, BC_RGB888);
+ temp = new VFrame(0, -1, asset->width, asset->height, BC_RGB888, -1);
int ww = picon->gui->vicon_thread->view_w;
int hh = picon->gui->vicon_thread->view_h;
while( seq_no >= images.size() ) {
file->set_layer(0);
int64_t pos = images.size() / picon->gui->vicon_thread->refresh_rate * frame_rate;
file->set_video_position(pos,0);
- file->read_frame(temp);
+ if( file->read_frame(temp) ) temp->clear_frame();
add_image(temp, ww, hh, BC_RGB8);
}
mwindow->video_cache->check_in(asset);
icon_vframe = 0;
vicon = 0;
in_use = 1;
+ mtime = 0;
id = 0;
persistent = 0;
}
else {
gui->lock_window("AssetPicon::create_objects 2");
icon = gui->video_icon;
- icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
+ icon_vframe = gui->video_vframe;
}
}
else {
icon = gui->video_icon;
- icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
+ icon_vframe = gui->video_vframe;
}
}
else
if( asset->audio_data ) {
icon = gui->audio_icon;
- icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_SOUND];
+ icon_vframe = gui->audio_vframe;
}
-
+ struct stat st;
+ mtime = !stat(asset->path, &st) ? st.st_mtime : 0;
}
else
if( indexable && !indexable->is_asset ) {
icon = gui->video_icon;
- icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_FILM];
+ icon_vframe = gui->video_vframe;
}
else
if( edl ) {
set_text(strcpy(name, edl->local_session->clip_title));
icon = gui->clip_icon;
- icon_vframe = mwindow->theme->get_image("clip_icon");
+ icon_vframe = gui->clip_vframe;
}
else
if( plugin ) {
- strcpy(name, plugin->title);
+ strcpy(name, _(plugin->title));
set_text(name);
icon_vframe = plugin->get_picon();
if( icon_vframe )
mwindow->edl->session->frames_per_foot);
set_text(name);
icon = gui->label_icon;
- icon_vframe = BC_WindowBase::get_resources()->type_to_icon[ICON_LABEL];
- set_icon(icon);
- set_icon_vframe(icon_vframe);
+ icon_vframe = gui->label_vframe;
}
if( !icon ) {
icon = gui->file_icon;
labellist_menu = 0;
folderlist_menu = 0;
temp_picon = 0;
+ search_text = 0;
allow_iconlisting = 1;
remove_plugin = 0;
vicon_thread = 0;
delete cliplist_menu;
delete labellist_menu;
delete folderlist_menu;
+ delete search_text;
delete temp_picon;
delete remove_plugin;
{
char png_path[BCTEXTLEN];
char *pp = png_path, *ep = pp + sizeof(png_path)-1;
- snprintf(pp, ep-pp, "%s/picon_%s/%s.png",
+ snprintf(pp, ep-pp, "%s/picon/%s/%s.png",
File::get_plugin_path(), plugin_icons, name);
+ if( access(png_path, R_OK) ) return 0;
return VFramePng::vframe_png(png_path,0,0);
}
VFrame *AWindowGUI::get_picon(const char *name)
{
VFrame *vframe = get_picon(name, mwindow->preferences->plugin_icons);
- if( !vframe ) vframe = get_picon(name, DEFAULT_PICON);
+ if( !vframe ) {
+ char png_name[BCSTRLEN], *pp = png_name, *ep = pp + sizeof(png_name)-1;
+ snprintf(pp, ep-pp, "%s.png", name);
+ unsigned char *data = mwindow->theme->get_image_data(png_name);
+ if( data ) vframe = new VFramePng(data, 0.);
+ }
return vframe;
}
mwindow->theme->get_awindow_sizes(this);
load_defaults(mwindow->defaults);
- add_subwindow(asset_list = new AWindowAssets(mwindow, this,
- mwindow->theme->alist_x, mwindow->theme->alist_y,
- mwindow->theme->alist_w, mwindow->theme->alist_h));
+ int x1 = mwindow->theme->alist_x, y1 = mwindow->theme->alist_y;
+ int w1 = mwindow->theme->alist_w, h1 = mwindow->theme->alist_h;
+ search_text = new AWindowSearchText(mwindow, this, x1, y1+5);
+ search_text->create_objects();
+ int dy = search_text->get_h() + 10;
+ y1 += dy; h1 -= dy;
+ add_subwindow(asset_list = new AWindowAssets(mwindow, this, x1, y1, w1, h1));
vicon_thread = new VIconThread(asset_list);
vicon_thread->start();
void AWindowGUI::reposition_objects()
{
- asset_list->reposition_window(
- mwindow->theme->alist_x, mwindow->theme->alist_y,
- mwindow->theme->alist_w, mwindow->theme->alist_h);
+ int x1 = mwindow->theme->alist_x, y1 = mwindow->theme->alist_y;
+ int w1 = mwindow->theme->alist_w, h1 = mwindow->theme->alist_h;
+ search_text->reposition_window(x1, y1+5, w1);
+ int dy = search_text->get_h() + 10;
+ y1 += dy; h1 -= dy;
+ asset_list->reposition_window(x1, y1, w1, h1);
divider->reposition_window(
mwindow->theme->adivider_x, mwindow->theme->adivider_y,
mwindow->theme->adivider_w, mwindow->theme->adivider_h);
{
if( !result ) {
printf(_("remove %s\n"), plugin->path);
+ awindow->gui->lock_window("AWindowRemovePlugin::handle_close_event");
ArrayList<BC_ListBoxItem*> *folder =
plugin->audio ? plugin->transition ?
&awindow->gui->atransitions :
&awindow->gui->veffects :
0;
if( folder ) remove_plugin(plugin, *folder);
+ MWindow *mwindow = awindow->mwindow;
+ awindow->gui->unlock_window();
char plugin_path[BCTEXTLEN];
strcpy(plugin_path, plugin->path);
- MWindow *mwindow = awindow->mwindow;
mwindow->plugindb->remove(plugin);
remove(plugin_path);
char index_path[BCTEXTLEN];
- snprintf(index_path, sizeof(index_path), "%s/%s",
- mwindow->preferences->plugin_dir, PLUGIN_FILE);
+ mwindow->create_defaults_path(index_path, PLUGIN_FILE);
remove(index_path);
+ char picon_path[BCTEXTLEN];
FileSystem fs;
- fs.update(File::get_plugin_path());
+ snprintf(picon_path, sizeof(picon_path), "%s/picon",
+ File::get_plugin_path());
+ char png_name[BCSTRLEN], png_path[BCTEXTLEN];
+ plugin->get_plugin_png_name(png_name);
+ fs.update(picon_path);
for( int i=0; i<fs.dir_list.total; ++i ) {
char *fs_path = fs.dir_list[i]->path;
if( !fs.is_dir(fs_path) ) continue;
- char *cp = strrchr(fs_path,'/');
- cp = !cp ? fs_path : cp+1;
- if( strncmp("picon_", cp, 6) ) continue;
- char png_path[BCTEXTLEN];
- if( !plugin->get_plugin_png_path(png_path, cp+6) )
- remove(png_path);
+ snprintf(png_path, sizeof(picon_path), "%s/%s",
+ fs_path, png_name);
+ remove(png_path);
}
delete plugin; plugin = 0;
awindow->gui->async_update_assets();
void AWindowGUI::update_folder_list()
{
- stop_vicon_drawing();
for( int i = 0; i < folders.total; i++ ) {
AssetPicon *picon = (AssetPicon*)folders.values[i];
picon->in_use = 0;
folders.remove_number(i);
}
}
-
- start_vicon_drawing();
}
void AWindowGUI::create_persistent_folder(ArrayList<BC_ListBoxItem*> *output,
if( !picon->in_use ) {
delete picon;
assets.remove_number(i);
+ continue;
}
+ if( !picon->indexable || !picon->indexable->is_asset ) continue;
+ struct stat st;
+ picon->mtime = !stat(picon->indexable->path, &st) ? st.st_mtime : 0;
}
}
}
}
-void AWindowGUI::sort_assets()
+void AWindowGUI::sort_assets(int use_mtime)
{
switch( mwindow->edl->session->awindow_folder ) {
case AW_AEFFECT_FOLDER:
sort_picons(&labellist);
break;
default:
- sort_picons(&assets);
+ sort_picons(&assets, use_mtime);
}
// reset xyposition
asset_list->update_format(asset_list->get_format(), 0);
if( folder < 0 ||
(picon->indexable && picon->indexable->awindow_folder == folder) ||
(picon->edl && picon->edl->local_session->awindow_folder == folder) ) {
+ const char *text = search_text->get_text();
+ int hidden = text && text[0] && !bstrcasestr(picon->get_text(), text);
+ if( picon->vicon ) picon->vicon->hidden = hidden;
+ if( hidden ) continue;
BC_ListBoxItem *item2, *item1;
dst[0].append(item1 = picon);
if( picon->edl )
else
if( picon->label && picon->label->textstr )
dst[1].append(item2 = new BC_ListBoxItem(picon->label->textstr));
+ else if( picon->mtime ) {
+ char date_time[BCSTRLEN];
+ struct tm stm; localtime_r(&picon->mtime, &stm);
+ sprintf(date_time,"%04d.%02d.%02d %02d:%02d:%02d",
+ stm.tm_year+1900, stm.tm_mon+1, stm.tm_mday,
+ stm.tm_hour, stm.tm_min, stm.tm_sec);
+ dst[1].append(item2 = new BC_ListBoxItem(date_time));
+ }
else
dst[1].append(item2 = new BC_ListBoxItem(""));
- item1->set_autoplace_text(1);
- item2->set_autoplace_text(1);
+ item1->set_autoplace_text(1); item1->set_autoplace_icon(1);
+ item2->set_autoplace_text(1); item2->set_autoplace_icon(1);
}
}
}
-void AWindowGUI::sort_picons(ArrayList<BC_ListBoxItem*> *src)
+void AWindowGUI::sort_picons(ArrayList<BC_ListBoxItem*> *src, int use_mtime)
{
- int done = 0;
- while(!done)
- {
+ int done = 0, changed = 0;
+ while( !done ) {
done = 1;
- for( int i = 0; i < src->total - 1; i++ ) {
- BC_ListBoxItem *item1 = src->values[i];
- BC_ListBoxItem *item2 = src->values[i + 1];
- item1->set_autoplace_icon(1);
- item2->set_autoplace_icon(1);
- item1->set_autoplace_text(1);
- item2->set_autoplace_text(1);
- if( strcmp(item1->get_text(), item2->get_text()) > 0 ) {
+ for( int i=0; i<src->total-1; ++i ) {
+ AssetPicon *item1 = (AssetPicon *)src->values[i];
+ AssetPicon *item2 = (AssetPicon *)src->values[i + 1];
+ if( use_mtime ? item1->mtime > item2->mtime :
+ strcmp(item1->get_text(), item2->get_text()) > 0 ) {
src->values[i + 1] = item1;
src->values[i] = item2;
- done = 0;
+ done = 0; changed = 1;
}
}
}
+ if( changed ) {
+ for( int i=0; i<src->total; ++i ) {
+ AssetPicon *item = (AssetPicon *)src->values[i];
+ item->set_autoplace_icon(1);
+ item->set_autoplace_text(1);
+ }
+ }
}
void AWindowGUI::update_assets()
{
+ stop_vicon_drawing();
update_folder_list();
update_asset_list();
labellist.remove_all_objects();
create_label_folder();
+
+ if( displayed_folder != mwindow->edl->session->awindow_folder )
+ search_text->clear();
filter_displayed_assets();
if( mwindow->edl->session->folderlist_format != folder_list->get_format() ) {
asset_list->center_selection();
flush();
+ start_vicon_drawing();
return;
}
break;
case AW_MEDIA_FOLDER:
case AW_PROXY_FOLDER:
- gui->assetlist_menu->update_titles();
+ gui->assetlist_menu->update_titles(folder==AW_MEDIA_FOLDER);
gui->assetlist_menu->activate_menu();
break;
}
lock_window("AWindowAssets::drag_stop_event");
- if( result ) get_drag_popup()->set_animation(0);
+ if( result )
+ get_drag_popup()->set_animation(0);
BC_ListBox::drag_stop_event();
- mwindow->session->current_operation = ::NO_OPERATION; // since NO_OPERATION is also defined in listbox, we have to reach for global scope...
- return 0;
+// since NO_OPERATION is also defined in listbox, we have to reach for global scope...
+ mwindow->session->current_operation = ::NO_OPERATION;
+ return 1;
}
int AWindowAssets::column_resize_event()
return BC_ListBox::focus_out_event();
}
+AWindowSearchTextBox::AWindowSearchTextBox(AWindowSearchText *search_text, int x, int y, int w)
+ : BC_TextBox(x, y, w, 1, "")
+{
+ this->search_text = search_text;
+}
+int AWindowSearchTextBox::handle_event()
+{
+ return search_text->handle_event();
+}
+AWindowSearchText::AWindowSearchText(MWindow *mwindow, AWindowGUI *gui, int x, int y)
+{
+ this->mwindow = mwindow;
+ this->gui = gui;
+ this->x = x;
+ this->y = y;
+}
+void AWindowSearchText::create_objects()
+{
+ int x1 = x, y1 = y, margin = 10;
+ gui->add_subwindow(text_title = new BC_Title(x1, y1, _("Search:")));
+ x1 += text_title->get_w() + margin;
+ int w1 = gui->get_w() - x1 - 2*margin;
+ gui->add_subwindow(text_box = new AWindowSearchTextBox(this, x1, y1, w1));
+}
+int AWindowSearchText::handle_event()
+{
+ gui->async_update_assets();
+ return 1;
+}
+int AWindowSearchText::get_w()
+{
+ return text_box->get_w() + text_title->get_w() + 10;
+}
+int AWindowSearchText::get_h()
+{
+ return bmax(text_box->get_h(),text_title->get_h());
+}
+void AWindowSearchText::reposition_window(int x, int y, int w)
+{
+ int x1 = x, y1 = y, margin = 10;
+ text_title->reposition_window(x1, y1);
+ x1 += text_title->get_w() + margin;
+ int w1 = gui->get_w() - x1 - 2*margin;
+ text_box->reposition_window(x1, y1, w1);
+}
+const char *AWindowSearchText::get_text()
+{
+ return text_box->get_text();
+}
-
+void AWindowSearchText::clear()
+{
+ text_box->update("");
+}
AWindowNewFolder::AWindowNewFolder(MWindow *mwindow, AWindowGUI *gui, int x, int y)
: BC_Button(x, y, mwindow->theme->newbin_data)
int AWindowListSort::handle_event()
{
- gui->sort_assets();
+ gui->sort_assets(0);
return 1;
}