16af4da5dSStephan Aßmus // Copyright 1999, Be Incorporated. All Rights Reserved. 26af4da5dSStephan Aßmus // Copyright 2000-2004, Jun Suzuki. All Rights Reserved. 37730c846SStephan Aßmus // Copyright 2007, 2010 Stephan Aßmus. All Rights Reserved. 4ce74de86SJohn Scipione // Copyright 2010-2013, Haiku, Inc. All Rights Reserved. 56af4da5dSStephan Aßmus // This file may be used under the terms of the Be Sample Code License. 67730c846SStephan Aßmus 7ce74de86SJohn Scipione 86af4da5dSStephan Aßmus #include "MediaConverterWindow.h" 96af4da5dSStephan Aßmus 106af4da5dSStephan Aßmus #include <stdio.h> 116af4da5dSStephan Aßmus #include <string.h> 126af4da5dSStephan Aßmus 136af4da5dSStephan Aßmus #include <Alert.h> 146af4da5dSStephan Aßmus #include <Application.h> 156af4da5dSStephan Aßmus #include <Box.h> 166af4da5dSStephan Aßmus #include <Button.h> 17ae0f70fcSAdrien Destugues #include <Catalog.h> 18dd55ed1aSAlex Wilson #include <ControlLook.h> 196af4da5dSStephan Aßmus #include <FilePanel.h> 20fc4d98a2SPhilippe Saint-Pierre #include <FindDirectory.h> 21dd55ed1aSAlex Wilson #include <LayoutBuilder.h> 22ae0f70fcSAdrien Destugues #include <Locale.h> 236af4da5dSStephan Aßmus #include <Menu.h> 246af4da5dSStephan Aßmus #include <MenuBar.h> 256af4da5dSStephan Aßmus #include <MenuField.h> 266af4da5dSStephan Aßmus #include <MenuItem.h> 276af4da5dSStephan Aßmus #include <Path.h> 286af4da5dSStephan Aßmus #include <PopUpMenu.h> 296af4da5dSStephan Aßmus #include <Roster.h> 306af4da5dSStephan Aßmus #include <ScrollBar.h> 316af4da5dSStephan Aßmus #include <ScrollView.h> 326af4da5dSStephan Aßmus #include <Slider.h> 336af4da5dSStephan Aßmus #include <StringView.h> 346af4da5dSStephan Aßmus #include <TextControl.h> 356af4da5dSStephan Aßmus 366af4da5dSStephan Aßmus #include "MediaFileInfoView.h" 376af4da5dSStephan Aßmus #include "MediaFileListView.h" 386af4da5dSStephan Aßmus #include "MessageConstants.h" 39ae0f70fcSAdrien Destugues 40ae0f70fcSAdrien Destugues 41546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT 42546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "MediaConverter" 43ae0f70fcSAdrien Destugues #define VERSION "1.3.0" 446af4da5dSStephan Aßmus 456af4da5dSStephan Aßmus 466af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter 476af4da5dSStephan Aßmus 486af4da5dSStephan Aßmus 4960b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter { 506af4da5dSStephan Aßmus public: 516af4da5dSStephan Aßmus DirectoryFilter() {}; 526af4da5dSStephan Aßmus virtual bool Filter(const entry_ref* ref, 5360b6f368SStephan Aßmus BNode* node, struct stat_beos* st, const char* filetype) 546af4da5dSStephan Aßmus { 556af4da5dSStephan Aßmus return node->IsDirectory(); 566af4da5dSStephan Aßmus } 576af4da5dSStephan Aßmus }; 586af4da5dSStephan Aßmus 596af4da5dSStephan Aßmus 606af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem 616af4da5dSStephan Aßmus 626af4da5dSStephan Aßmus 636af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem { 646af4da5dSStephan Aßmus public: 656af4da5dSStephan Aßmus FileFormatMenuItem(media_file_format* format); 666af4da5dSStephan Aßmus virtual ~FileFormatMenuItem(); 676af4da5dSStephan Aßmus 686af4da5dSStephan Aßmus media_file_format fFileFormat; 696af4da5dSStephan Aßmus }; 706af4da5dSStephan Aßmus 716af4da5dSStephan Aßmus 726af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format *format) 73dd55ed1aSAlex Wilson : 74dd55ed1aSAlex Wilson BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE)) 756af4da5dSStephan Aßmus { 766af4da5dSStephan Aßmus memcpy(&fFileFormat, format, sizeof(fFileFormat)); 776af4da5dSStephan Aßmus } 786af4da5dSStephan Aßmus 796af4da5dSStephan Aßmus 806af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem() 816af4da5dSStephan Aßmus { 826af4da5dSStephan Aßmus } 836af4da5dSStephan Aßmus 846af4da5dSStephan Aßmus 856af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem 866af4da5dSStephan Aßmus 876af4da5dSStephan Aßmus 886af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem { 896af4da5dSStephan Aßmus public: 906af4da5dSStephan Aßmus CodecMenuItem(media_codec_info *ci, uint32 msg_type); 916af4da5dSStephan Aßmus virtual ~CodecMenuItem(); 926af4da5dSStephan Aßmus 936af4da5dSStephan Aßmus media_codec_info fCodecInfo; 946af4da5dSStephan Aßmus }; 956af4da5dSStephan Aßmus 966af4da5dSStephan Aßmus 976af4da5dSStephan Aßmus CodecMenuItem::CodecMenuItem(media_codec_info *ci, uint32 msg_type) 98dd55ed1aSAlex Wilson : 99dd55ed1aSAlex Wilson BMenuItem(ci->pretty_name, new BMessage(msg_type)) 1006af4da5dSStephan Aßmus { 1016af4da5dSStephan Aßmus memcpy(&fCodecInfo, ci, sizeof(fCodecInfo)); 1026af4da5dSStephan Aßmus } 1036af4da5dSStephan Aßmus 1046af4da5dSStephan Aßmus 1056af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem() 1066af4da5dSStephan Aßmus { 1076af4da5dSStephan Aßmus } 1086af4da5dSStephan Aßmus 1096af4da5dSStephan Aßmus 1106af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow 1116af4da5dSStephan Aßmus 1126af4da5dSStephan Aßmus 1136af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame) 114dd55ed1aSAlex Wilson : 115560ff447SJonas Sundström BWindow(frame, B_TRANSLATE_SYSTEM_NAME("MediaConverter"), B_TITLED_WINDOW_LOOK, 11687077901SJohn Scipione B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_NOT_V_RESIZABLE 11787077901SJohn Scipione | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS), 118dd55ed1aSAlex Wilson fVideoQuality(75), 119dd55ed1aSAlex Wilson fAudioQuality(75), 120dd55ed1aSAlex Wilson fSaveFilePanel(NULL), 121dd55ed1aSAlex Wilson fOpenFilePanel(NULL), 122dd55ed1aSAlex Wilson fOutputDirSpecified(false), 123dd55ed1aSAlex Wilson fEnabled(true), 124dd55ed1aSAlex Wilson fConverting(false), 125dd55ed1aSAlex Wilson fCancelling(false) 1266af4da5dSStephan Aßmus { 127b78760b9SPhilippe Saint-Pierre BPath outputDir; 128b78760b9SPhilippe Saint-Pierre if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK) 129b78760b9SPhilippe Saint-Pierre outputDir.SetTo("/boot/home"); 130b78760b9SPhilippe Saint-Pierre fOutputDir.SetTo(outputDir.Path()); 1316af4da5dSStephan Aßmus 132dd55ed1aSAlex Wilson fMenuBar = new BMenuBar("menubar"); 1336af4da5dSStephan Aßmus _CreateMenu(); 1346af4da5dSStephan Aßmus 135a9adf1a6SJohn Scipione float padding = be_control_look->DefaultItemSpacing(); 136a9adf1a6SJohn Scipione 137dd55ed1aSAlex Wilson fListView = new MediaFileListView(); 138a9adf1a6SJohn Scipione fListView->SetExplicitMinSize(BSize(padding * 10, B_SIZE_UNSET)); 139dd55ed1aSAlex Wilson BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true); 1406af4da5dSStephan Aßmus 1416af4da5dSStephan Aßmus // file list view box 142dd55ed1aSAlex Wilson fSourcesBox = new BBox(B_FANCY_BORDER, scroller); 143dd55ed1aSAlex Wilson fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0)); 144dd55ed1aSAlex Wilson // We give fSourcesBox a layout to provide insets for the sources list 145dd55ed1aSAlex Wilson // said insets are adjusted in _UpdateLabels 1466af4da5dSStephan Aßmus 147dd55ed1aSAlex Wilson fInfoView = new MediaFileInfoView(); 148dd55ed1aSAlex Wilson fInfoBox = new BBox(B_FANCY_BORDER, fInfoView); 149dd55ed1aSAlex Wilson fInfoBox->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 150dd55ed1aSAlex Wilson B_ALIGN_USE_FULL_HEIGHT)); 1517730c846SStephan Aßmus 152dd55ed1aSAlex Wilson // Output format box 153dd55ed1aSAlex Wilson fOutputBox = new BBox(B_FANCY_BORDER, NULL); 1540a81944dSStephan Aßmus BGridLayout* outputGrid = new BGridLayout(padding, padding); 1550a81944dSStephan Aßmus fOutputBox->SetLayout(outputGrid); 156dd55ed1aSAlex Wilson // fOutputBox's layout is also adjusted in _UpdateLabels 1577730c846SStephan Aßmus outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 1587730c846SStephan Aßmus B_ALIGN_USE_FULL_HEIGHT)); 1597730c846SStephan Aßmus fOutputBox->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED)); 1606af4da5dSStephan Aßmus 161ae0f70fcSAdrien Destugues fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"), 162ae0f70fcSAdrien Destugues new BPopUpMenu("")); 163ae0f70fcSAdrien Destugues fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"), 164ae0f70fcSAdrien Destugues new BPopUpMenu("")); 165ae0f70fcSAdrien Destugues fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"), 166ae0f70fcSAdrien Destugues new BPopUpMenu("")); 1676af4da5dSStephan Aßmus 1686af4da5dSStephan Aßmus // output folder 169ae0f70fcSAdrien Destugues fDestButton = new BButton(B_TRANSLATE("Output folder"), 170dd55ed1aSAlex Wilson new BMessage(OUTPUT_FOLDER_MESSAGE)); 171dd55ed1aSAlex Wilson BAlignment labelAlignment(be_control_look->DefaultLabelAlignment()); 172b78760b9SPhilippe Saint-Pierre fOutputFolder = new BStringView(NULL, outputDir.Path()); 173dd55ed1aSAlex Wilson fOutputFolder->SetExplicitAlignment(labelAlignment); 1746af4da5dSStephan Aßmus 1756af4da5dSStephan Aßmus // start/end duration 1764d891825SJohn Scipione fStartDurationTC = new BTextControl(NULL, "0", NULL); 1774d891825SJohn Scipione fEndDurationTC = new BTextControl(NULL, "0", NULL); 1786af4da5dSStephan Aßmus 1796af4da5dSStephan Aßmus // Video Quality 180dd55ed1aSAlex Wilson fVideoQualitySlider = new BSlider("VSlider", "" , 181dd55ed1aSAlex Wilson new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 18253bb96c5SJohn Scipione fVideoQualitySlider->SetModificationMessage( 18353bb96c5SJohn Scipione new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE)); 1846af4da5dSStephan Aßmus fVideoQualitySlider->SetValue(fVideoQuality); 1856af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 1866af4da5dSStephan Aßmus 1876af4da5dSStephan Aßmus // Audio Quality 188dd55ed1aSAlex Wilson fAudioQualitySlider = new BSlider("ASlider", "" , 189dd55ed1aSAlex Wilson new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 19053bb96c5SJohn Scipione fAudioQualitySlider->SetModificationMessage( 19153bb96c5SJohn Scipione new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE)); 1926af4da5dSStephan Aßmus fAudioQualitySlider->SetValue(fAudioQuality); 1936af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 194dd55ed1aSAlex Wilson 1950a81944dSStephan Aßmus BLayoutBuilder::Grid<>(outputGrid) 196dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 197*83010212SJohn Scipione .Add(fFormatMenu->CreateLabelLayoutItem(), 0, 0) 198*83010212SJohn Scipione .Add(fFormatMenu->CreateMenuBarLayoutItem(), 1, 0) 199*83010212SJohn Scipione .Add(fAudioMenu->CreateLabelLayoutItem(), 0, 1) 200*83010212SJohn Scipione .Add(fAudioMenu->CreateMenuBarLayoutItem(), 1, 1) 201*83010212SJohn Scipione .Add(fVideoMenu->CreateLabelLayoutItem(), 0, 2) 202*83010212SJohn Scipione .Add(fVideoMenu->CreateMenuBarLayoutItem(), 1, 2) 203dd55ed1aSAlex Wilson .Add(fDestButton, 0, 3) 204dd55ed1aSAlex Wilson .Add(fOutputFolder, 1, 3) 205*83010212SJohn Scipione .Add(fStartDurationTC->CreateLabelLayoutItem(), 0, 4) 206*83010212SJohn Scipione .Add(fStartDurationTC->CreateTextViewLayoutItem(), 1, 4) 207*83010212SJohn Scipione .Add(fEndDurationTC->CreateLabelLayoutItem(), 0, 5) 208*83010212SJohn Scipione .Add(fEndDurationTC->CreateTextViewLayoutItem(), 1, 5) 209dd55ed1aSAlex Wilson .Add(fVideoQualitySlider, 0, 6, 2, 1) 210dd55ed1aSAlex Wilson .Add(fAudioQualitySlider, 0, 7, 2, 1); 2116af4da5dSStephan Aßmus 2126af4da5dSStephan Aßmus // buttons 213ae0f70fcSAdrien Destugues fPreviewButton = new BButton(B_TRANSLATE("Preview"), 214dd55ed1aSAlex Wilson new BMessage(PREVIEW_MESSAGE)); 2156af4da5dSStephan Aßmus fPreviewButton->SetEnabled(false); 2166af4da5dSStephan Aßmus 217ae0f70fcSAdrien Destugues fConvertButton = new BButton(B_TRANSLATE("Convert"), 218dd55ed1aSAlex Wilson new BMessage(CONVERT_BUTTON_MESSAGE)); 2196af4da5dSStephan Aßmus 220dd55ed1aSAlex Wilson // Status views 221dd55ed1aSAlex Wilson fStatus = new BStringView(NULL, NULL); 222dd55ed1aSAlex Wilson fStatus->SetExplicitAlignment(labelAlignment); 223dd55ed1aSAlex Wilson fFileStatus = new BStringView(NULL, NULL); 224dd55ed1aSAlex Wilson fFileStatus->SetExplicitAlignment(labelAlignment); 2256af4da5dSStephan Aßmus 2266af4da5dSStephan Aßmus SetStatusMessage(""); 2276af4da5dSStephan Aßmus _UpdateLabels(); 2286af4da5dSStephan Aßmus 229dd55ed1aSAlex Wilson BLayoutBuilder::Group<>(this, B_VERTICAL, 0) 230dd55ed1aSAlex Wilson .SetInsets(0, 0, 0, 0) 231dd55ed1aSAlex Wilson .Add(fMenuBar) 2327730c846SStephan Aßmus .AddSplit(B_HORIZONTAL, padding / 2) 233dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 2347730c846SStephan Aßmus .Add(fSourcesBox, 0.4) 2357730c846SStephan Aßmus .AddGroup(B_VERTICAL, padding, 0.6) 2367730c846SStephan Aßmus .Add(fInfoBox) 2377730c846SStephan Aßmus .Add(fOutputBox) 2387730c846SStephan Aßmus .End() 2397730c846SStephan Aßmus .End() 2407730c846SStephan Aßmus .AddGrid(padding, padding) 2417730c846SStephan Aßmus .SetInsets(padding, 0, padding, padding) 242dd55ed1aSAlex Wilson .Add(fStatus, 0, 0) 243dd55ed1aSAlex Wilson .Add(fFileStatus, 0, 1) 2449b2ea762SAlex Wilson .Add(BSpaceLayoutItem::CreateGlue(), 1, 0) 245dd55ed1aSAlex Wilson .Add(fPreviewButton, 2, 0) 2467730c846SStephan Aßmus .Add(fConvertButton, 3, 0) 2477730c846SStephan Aßmus .End() 2487730c846SStephan Aßmus ; 2496af4da5dSStephan Aßmus } 2506af4da5dSStephan Aßmus 2516af4da5dSStephan Aßmus 2526af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow() 2536af4da5dSStephan Aßmus { 2543c0f9a7cSKarsten Heimrich delete fSaveFilePanel; 2553c0f9a7cSKarsten Heimrich delete fOpenFilePanel; 2566af4da5dSStephan Aßmus } 2576af4da5dSStephan Aßmus 2586af4da5dSStephan Aßmus 2596af4da5dSStephan Aßmus // #pragma mark - 2606af4da5dSStephan Aßmus 2616af4da5dSStephan Aßmus 2626af4da5dSStephan Aßmus void 2636af4da5dSStephan Aßmus MediaConverterWindow::MessageReceived(BMessage* msg) 2646af4da5dSStephan Aßmus { 2656af4da5dSStephan Aßmus entry_ref inRef; 2666af4da5dSStephan Aßmus 2676af4da5dSStephan Aßmus char buffer[40]; 268f086ada7SStephan Aßmus BEntry inEntry; 2696af4da5dSStephan Aßmus 2706af4da5dSStephan Aßmus switch (msg->what) { 2716af4da5dSStephan Aßmus #if B_BEOS_VERSION <= B_BEOS_VERSION_6 2726af4da5dSStephan Aßmus case B_LANGUAGE_CHANGED: 2736af4da5dSStephan Aßmus LanguageChanged(); 2746af4da5dSStephan Aßmus break; 2756af4da5dSStephan Aßmus #endif 2766af4da5dSStephan Aßmus 2776af4da5dSStephan Aßmus case INIT_FORMAT_MENUS: 2786af4da5dSStephan Aßmus BuildFormatMenu(); 2796af4da5dSStephan Aßmus if (CountSourceFiles() == 0) 2806af4da5dSStephan Aßmus SetEnabled(false, false); 2816af4da5dSStephan Aßmus break; 2826af4da5dSStephan Aßmus 2836af4da5dSStephan Aßmus case B_SIMPLE_DATA: 284f086ada7SStephan Aßmus if (msg->WasDropped()) { 2856af4da5dSStephan Aßmus DetachCurrentMessage(); 2866af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 2876af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 2886af4da5dSStephan Aßmus delete msg; 2896af4da5dSStephan Aßmus } 2906af4da5dSStephan Aßmus break; 2916af4da5dSStephan Aßmus 2926af4da5dSStephan Aßmus case FORMAT_SELECT_MESSAGE: 2936af4da5dSStephan Aßmus BuildAudioVideoMenus(); 2946af4da5dSStephan Aßmus break; 2956af4da5dSStephan Aßmus case AUDIO_CODEC_SELECT_MESSAGE: 2966af4da5dSStephan Aßmus break; 2976af4da5dSStephan Aßmus case VIDEO_CODEC_SELECT_MESSAGE: 2986af4da5dSStephan Aßmus break; 2996af4da5dSStephan Aßmus 3006af4da5dSStephan Aßmus case CONVERT_BUTTON_MESSAGE: 3016af4da5dSStephan Aßmus if (!fConverting) { 302ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Cancel")); 3036af4da5dSStephan Aßmus fConverting = true; 304ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Convert")); 3056af4da5dSStephan Aßmus SetEnabled(false, true); 3066af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE); 3076af4da5dSStephan Aßmus } else if (!fCancelling) { 3086af4da5dSStephan Aßmus fCancelling = true; 309ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS)); 3106af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 3116af4da5dSStephan Aßmus } 3126af4da5dSStephan Aßmus break; 3136af4da5dSStephan Aßmus 3146af4da5dSStephan Aßmus case CONVERSION_DONE_MESSAGE: 315f086ada7SStephan Aßmus { 316ae0f70fcSAdrien Destugues SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled") 317ae0f70fcSAdrien Destugues : B_TRANSLATE("Conversion completed")); 3186af4da5dSStephan Aßmus fConverting = false; 3196af4da5dSStephan Aßmus fCancelling = false; 3206af4da5dSStephan Aßmus bool enable = CountSourceFiles() > 0; 3216af4da5dSStephan Aßmus SetEnabled(enable, enable); 322ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 3236af4da5dSStephan Aßmus break; 324f086ada7SStephan Aßmus } 3256af4da5dSStephan Aßmus 3266af4da5dSStephan Aßmus case OUTPUT_FOLDER_MESSAGE: 3276af4da5dSStephan Aßmus // Execute Save Panel 328f086ada7SStephan Aßmus if (fSaveFilePanel == NULL) { 329f086ada7SStephan Aßmus BButton* selectThisDir; 3306af4da5dSStephan Aßmus 3313c0f9a7cSKarsten Heimrich BMessage message(FOLDER_SELECT_MESSAGE); 3323c0f9a7cSKarsten Heimrich fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 3333c0f9a7cSKarsten Heimrich B_DIRECTORY_NODE, true, &message, NULL, false, true); 334ae0f70fcSAdrien Destugues fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, 335ae0f70fcSAdrien Destugues B_TRANSLATE("Select")); 3366af4da5dSStephan Aßmus fSaveFilePanel->SetTarget(this); 3376af4da5dSStephan Aßmus 3386af4da5dSStephan Aßmus fSaveFilePanel->Window()->Lock(); 339ae0f70fcSAdrien Destugues fSaveFilePanel->Window()->SetTitle( 340ae0f70fcSAdrien Destugues B_TRANSLATE("MediaConverter+:SaveDirectory")); 341f086ada7SStephan Aßmus BRect buttonRect 342f086ada7SStephan Aßmus = fSaveFilePanel->Window()->ChildAt(0)->FindView( 343f086ada7SStephan Aßmus "cancel button")->Frame(); 344f086ada7SStephan Aßmus buttonRect.right = buttonRect.left - 20; 345f086ada7SStephan Aßmus buttonRect.left = buttonRect.right - 130; 346ae0f70fcSAdrien Destugues selectThisDir = new BButton(buttonRect, NULL, 347ae0f70fcSAdrien Destugues B_TRANSLATE("Select this folder"), 348f086ada7SStephan Aßmus new BMessage(SELECT_THIS_DIR_MESSAGE), 349f086ada7SStephan Aßmus B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT); 350f086ada7SStephan Aßmus selectThisDir->SetTarget(this); 351f086ada7SStephan Aßmus fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir); 3526af4da5dSStephan Aßmus fSaveFilePanel->Window()->Unlock(); 3536af4da5dSStephan Aßmus 354f086ada7SStephan Aßmus fSaveFilePanel->SetRefFilter(new DirectoryFilter); 3556af4da5dSStephan Aßmus } 3566af4da5dSStephan Aßmus fSaveFilePanel->Show(); 3576af4da5dSStephan Aßmus break; 3586af4da5dSStephan Aßmus 3596af4da5dSStephan Aßmus case FOLDER_SELECT_MESSAGE: 3606af4da5dSStephan Aßmus // "SELECT" Button at Save Panel Pushed 3616af4da5dSStephan Aßmus fSaveFilePanel->GetNextSelectedRef(&inRef); 362f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 363f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 3646af4da5dSStephan Aßmus fOutputDirSpecified = true; 3656af4da5dSStephan Aßmus break; 3666af4da5dSStephan Aßmus 3676af4da5dSStephan Aßmus case SELECT_THIS_DIR_MESSAGE: 3686af4da5dSStephan Aßmus // "THIS DIR" Button at Save Panel Pushed 3696af4da5dSStephan Aßmus fSaveFilePanel->GetPanelDirectory(&inRef); 3706af4da5dSStephan Aßmus fSaveFilePanel->Hide(); 371f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 372f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 3736af4da5dSStephan Aßmus fOutputDirSpecified = true; 3746af4da5dSStephan Aßmus break; 3756af4da5dSStephan Aßmus 3766af4da5dSStephan Aßmus case OPEN_FILE_MESSAGE: 3776af4da5dSStephan Aßmus // Execute Open Panel 3786af4da5dSStephan Aßmus if (!fOpenFilePanel) { 3793c0f9a7cSKarsten Heimrich fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 3803c0f9a7cSKarsten Heimrich B_FILE_NODE, true, NULL, NULL, false, true); 3816af4da5dSStephan Aßmus fOpenFilePanel->SetTarget(this); 3826af4da5dSStephan Aßmus } 3836af4da5dSStephan Aßmus fOpenFilePanel->Show(); 3846af4da5dSStephan Aßmus break; 3856af4da5dSStephan Aßmus 3866af4da5dSStephan Aßmus case B_REFS_RECEIVED: 3876af4da5dSStephan Aßmus // Media Files Seleced by Open Panel 3886af4da5dSStephan Aßmus DetachCurrentMessage(); 3896af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 3906af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 3916af4da5dSStephan Aßmus // fall through 3926af4da5dSStephan Aßmus 3936af4da5dSStephan Aßmus case B_CANCEL: 3946af4da5dSStephan Aßmus break; 3956af4da5dSStephan Aßmus 3966af4da5dSStephan Aßmus case QUIT_MESSAGE: 3976af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested(); 3986af4da5dSStephan Aßmus break; 3996af4da5dSStephan Aßmus 4006af4da5dSStephan Aßmus case PREVIEW_MESSAGE: 401f086ada7SStephan Aßmus { 402f086ada7SStephan Aßmus // Build the command line to launch the preview application. 403f086ada7SStephan Aßmus // TODO: Launch the default app instead of hardcoded MediaPlayer! 404f086ada7SStephan Aßmus int32 srcIndex = fListView->CurrentSelection(); 405f086ada7SStephan Aßmus BMediaFile* inFile = NULL; 406f086ada7SStephan Aßmus status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef); 4076af4da5dSStephan Aßmus 408f086ada7SStephan Aßmus const char* argv[3]; 409f086ada7SStephan Aßmus BString startPosString; 410f086ada7SStephan Aßmus BPath path; 411f086ada7SStephan Aßmus 4126af4da5dSStephan Aßmus if (status == B_OK) { 413f086ada7SStephan Aßmus argv[0] = "-pos"; 414f086ada7SStephan Aßmus // NOTE: -pos argument is currently not supported by Haiku 415f086ada7SStephan Aßmus // MediaPlayer. 416f086ada7SStephan Aßmus startPosString << fStartDurationTC->Text(); 417f086ada7SStephan Aßmus startPosString << "000"; 418f086ada7SStephan Aßmus argv[1] = startPosString.String(); 4196af4da5dSStephan Aßmus 420f086ada7SStephan Aßmus status = inEntry.SetTo(&inRef); 4216af4da5dSStephan Aßmus } 4226af4da5dSStephan Aßmus 423f086ada7SStephan Aßmus if (status == B_OK) { 424f086ada7SStephan Aßmus status = inEntry.GetPath(&path); 425f086ada7SStephan Aßmus if (status == B_OK) 426f086ada7SStephan Aßmus argv[2] = path.Path(); 427f086ada7SStephan Aßmus } 4286af4da5dSStephan Aßmus 429f086ada7SStephan Aßmus if (status == B_OK) { 430f086ada7SStephan Aßmus status = be_roster->Launch( 431f086ada7SStephan Aßmus "application/x-vnd.Haiku-MediaPlayer", 432f086ada7SStephan Aßmus 3, (char**)argv, NULL); 433f086ada7SStephan Aßmus } 434f086ada7SStephan Aßmus 435f086ada7SStephan Aßmus if (status != B_OK && status != B_ALREADY_RUNNING) { 436007d8a0cSSiarzhuk Zharski BString errorString(B_TRANSLATE("Error launching: %strError%")); 437007d8a0cSSiarzhuk Zharski errorString.ReplaceFirst("%strError%", strerror(status)); 438aed35104SHumdinger BAlert* alert = new BAlert(B_TRANSLATE("Error"), 439aed35104SHumdinger errorString.String(), B_TRANSLATE("OK")); 440aed35104SHumdinger alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 441aed35104SHumdinger alert->Go(); 4426af4da5dSStephan Aßmus } 4436af4da5dSStephan Aßmus break; 444f086ada7SStephan Aßmus } 4456af4da5dSStephan Aßmus 4466af4da5dSStephan Aßmus case VIDEO_QUALITY_CHANGED_MESSAGE: 447f086ada7SStephan Aßmus { 448f086ada7SStephan Aßmus int32 value; 4496af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 450ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 451ae0f70fcSAdrien Destugues B_TRANSLATE("Video quality: %3d%%"), (int8)value); 4526af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 4536af4da5dSStephan Aßmus fVideoQuality = value; 4546af4da5dSStephan Aßmus break; 455f086ada7SStephan Aßmus } 4566af4da5dSStephan Aßmus 4576af4da5dSStephan Aßmus case AUDIO_QUALITY_CHANGED_MESSAGE: 458f086ada7SStephan Aßmus { 459f086ada7SStephan Aßmus int32 value; 4606af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 461ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 462ae0f70fcSAdrien Destugues B_TRANSLATE("Audio quality: %3d%%"), (int8)value); 4636af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 4646af4da5dSStephan Aßmus fAudioQuality = value; 4656af4da5dSStephan Aßmus break; 466f086ada7SStephan Aßmus } 4676af4da5dSStephan Aßmus 4686af4da5dSStephan Aßmus default: 4696af4da5dSStephan Aßmus BWindow::MessageReceived(msg); 4706af4da5dSStephan Aßmus } 4716af4da5dSStephan Aßmus } 4726af4da5dSStephan Aßmus 4736af4da5dSStephan Aßmus 4746af4da5dSStephan Aßmus bool 4756af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested() 4766af4da5dSStephan Aßmus { 4776af4da5dSStephan Aßmus if (!fConverting) { 4786af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(B_QUIT_REQUESTED); 4796af4da5dSStephan Aßmus return true; 4806af4da5dSStephan Aßmus } else if (!fCancelling) { 4816af4da5dSStephan Aßmus fCancelling = true; 482ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling")); 4836af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 4846af4da5dSStephan Aßmus } 4856af4da5dSStephan Aßmus return false; 4866af4da5dSStephan Aßmus } 4876af4da5dSStephan Aßmus 4886af4da5dSStephan Aßmus 4896af4da5dSStephan Aßmus // #pragma mark - 4906af4da5dSStephan Aßmus 4916af4da5dSStephan Aßmus 4926af4da5dSStephan Aßmus void 4936af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged() 4946af4da5dSStephan Aßmus { 4956af4da5dSStephan Aßmus _DestroyMenu(); 4966af4da5dSStephan Aßmus _CreateMenu(); 4976af4da5dSStephan Aßmus _UpdateLabels(); 4986af4da5dSStephan Aßmus BuildAudioVideoMenus(); 4996af4da5dSStephan Aßmus Lock(); 5006af4da5dSStephan Aßmus fInfoView->Invalidate(); 5016af4da5dSStephan Aßmus Unlock(); 5026af4da5dSStephan Aßmus } 5036af4da5dSStephan Aßmus 5046af4da5dSStephan Aßmus 5056af4da5dSStephan Aßmus void 5066af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus() 5076af4da5dSStephan Aßmus { 5086af4da5dSStephan Aßmus BMenu* menu = fAudioMenu->Menu(); 5096af4da5dSStephan Aßmus BMenuItem* item; 5106af4da5dSStephan Aßmus // clear out old audio codec menu items 5117f4d1af4SSergei Reznikov while ((item = menu->RemoveItem((int32)0)) != NULL) 5126af4da5dSStephan Aßmus delete item; 5136af4da5dSStephan Aßmus 5146af4da5dSStephan Aßmus bool separator = true; 5156af4da5dSStephan Aßmus 5166af4da5dSStephan Aßmus // get selected file format 5177730c846SStephan Aßmus FileFormatMenuItem* ffmi 5187730c846SStephan Aßmus = (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked(); 5196af4da5dSStephan Aßmus media_file_format* mf_format = &(ffmi->fFileFormat); 5206af4da5dSStephan Aßmus 5216af4da5dSStephan Aßmus media_format format, outfmt; 5226af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5236af4da5dSStephan Aßmus media_codec_info codec_info; 5246af4da5dSStephan Aßmus int32 cookie = 0; 5256af4da5dSStephan Aßmus CodecMenuItem* cmi; 5266af4da5dSStephan Aßmus 5276af4da5dSStephan Aßmus // add available audio encoders to menu 5286af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5296af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5307730c846SStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) 5317730c846SStephan Aßmus == B_OK) { 5326af4da5dSStephan Aßmus if (separator) { 533ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 534546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"), 5356af4da5dSStephan Aßmus new BMessage(AUDIO_CODEC_SELECT_MESSAGE))); 5366af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5376af4da5dSStephan Aßmus separator = false; 5386af4da5dSStephan Aßmus } 5396af4da5dSStephan Aßmus 5406af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE); 5416af4da5dSStephan Aßmus menu->AddItem(cmi); 5426af4da5dSStephan Aßmus // reset media format struct 5436af4da5dSStephan Aßmus /* 5446af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5456af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5466af4da5dSStephan Aßmus */ 5476af4da5dSStephan Aßmus } 5486af4da5dSStephan Aßmus 5496af4da5dSStephan Aßmus // mark first audio encoder 5506af4da5dSStephan Aßmus item = menu->ItemAt(0); 5516af4da5dSStephan Aßmus if (item != NULL) { 5526af4da5dSStephan Aßmus fAudioMenu->SetEnabled(fEnabled); 5536af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(fEnabled); 5546af4da5dSStephan Aßmus item->SetMarked(true); 5556af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 5566af4da5dSStephan Aßmus } else { 557ae0f70fcSAdrien Destugues item = new BMenuItem( 558546208a5SOliver Tappe B_TRANSLATE_CONTEXT("None available", "Audio codecs"), 559ae0f70fcSAdrien Destugues NULL); 5606af4da5dSStephan Aßmus menu->AddItem(item); 5616af4da5dSStephan Aßmus item->SetMarked(true); 5626af4da5dSStephan Aßmus fAudioMenu->SetEnabled(false); 5636af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 5646af4da5dSStephan Aßmus } 5656af4da5dSStephan Aßmus 5666af4da5dSStephan Aßmus // clear out old video codec menu items 5676af4da5dSStephan Aßmus menu = fVideoMenu->Menu(); 5687f4d1af4SSergei Reznikov while ((item = menu->RemoveItem((int32)0)) != NULL) 5696af4da5dSStephan Aßmus delete item; 5706af4da5dSStephan Aßmus 5716af4da5dSStephan Aßmus separator = true; 5726af4da5dSStephan Aßmus 5736af4da5dSStephan Aßmus // construct a generic video format. Some of these parameters 5746af4da5dSStephan Aßmus // seem silly, but are needed for R4.5.x, which is more picky 5756af4da5dSStephan Aßmus // than subsequent BeOS releases will be. 5766af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5776af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_VIDEO; 5786af4da5dSStephan Aßmus format.u.raw_video.last_active = (uint32)(240 - 1); 5796af4da5dSStephan Aßmus format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT; 5806af4da5dSStephan Aßmus format.u.raw_video.display.format = B_RGB32; 5816af4da5dSStephan Aßmus format.u.raw_video.display.line_width = (int32)320; 5826af4da5dSStephan Aßmus format.u.raw_video.display.line_count = (int32)240; 5836af4da5dSStephan Aßmus format.u.raw_video.display.bytes_per_row = 4 * 320; 5846af4da5dSStephan Aßmus 5856af4da5dSStephan Aßmus // add available video encoders to menu 5866af4da5dSStephan Aßmus cookie = 0; 5876af4da5dSStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) { 5886af4da5dSStephan Aßmus if (separator) { 589ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 590546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No video", "Video codecs list"), 5916af4da5dSStephan Aßmus new BMessage(VIDEO_CODEC_SELECT_MESSAGE))); 5926af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5936af4da5dSStephan Aßmus separator = false; 5946af4da5dSStephan Aßmus } 5956af4da5dSStephan Aßmus 5966af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE); 5976af4da5dSStephan Aßmus menu->AddItem(cmi); 5986af4da5dSStephan Aßmus } 5996af4da5dSStephan Aßmus 6006af4da5dSStephan Aßmus // mark first video encoder 6016af4da5dSStephan Aßmus item = menu->ItemAt(0); 6026af4da5dSStephan Aßmus if (item != NULL) { 6036af4da5dSStephan Aßmus fVideoMenu->SetEnabled(fEnabled); 6046af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(fEnabled); 6056af4da5dSStephan Aßmus item->SetMarked(true); 6066af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6076af4da5dSStephan Aßmus } else { 608ae0f70fcSAdrien Destugues item = new BMenuItem( 609546208a5SOliver Tappe B_TRANSLATE_CONTEXT("None available", "Video codecs"), 610ae0f70fcSAdrien Destugues NULL); 6116af4da5dSStephan Aßmus menu->AddItem(item); 6126af4da5dSStephan Aßmus item->SetMarked(true); 6136af4da5dSStephan Aßmus fVideoMenu->SetEnabled(false); 6146af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 6156af4da5dSStephan Aßmus } 6166af4da5dSStephan Aßmus } 6176af4da5dSStephan Aßmus 6186af4da5dSStephan Aßmus void 6196af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format, 6206af4da5dSStephan Aßmus media_codec_info** audio, media_codec_info** video) 6216af4da5dSStephan Aßmus { 6226af4da5dSStephan Aßmus *audio = NULL; 6236af4da5dSStephan Aßmus *video = NULL; 6246af4da5dSStephan Aßmus *format = NULL; 6256af4da5dSStephan Aßmus 6266af4da5dSStephan Aßmus FileFormatMenuItem *formatItem = 6276af4da5dSStephan Aßmus dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked()); 6286af4da5dSStephan Aßmus if (formatItem != NULL) { 6296af4da5dSStephan Aßmus *format = &(formatItem->fFileFormat); 6306af4da5dSStephan Aßmus } 6316af4da5dSStephan Aßmus 6326af4da5dSStephan Aßmus *audio = *video = NULL; 6336af4da5dSStephan Aßmus CodecMenuItem *codecItem = 6346af4da5dSStephan Aßmus dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked()); 6356af4da5dSStephan Aßmus if (codecItem != NULL) { 6366af4da5dSStephan Aßmus *audio = &(codecItem->fCodecInfo); 6376af4da5dSStephan Aßmus } 6386af4da5dSStephan Aßmus 6396af4da5dSStephan Aßmus codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked()); 6406af4da5dSStephan Aßmus if (codecItem != NULL) { 6416af4da5dSStephan Aßmus *video = &(codecItem->fCodecInfo); 6426af4da5dSStephan Aßmus } 6436af4da5dSStephan Aßmus } 6446af4da5dSStephan Aßmus 6456af4da5dSStephan Aßmus 6466af4da5dSStephan Aßmus void 6476af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu() 6486af4da5dSStephan Aßmus { 6496af4da5dSStephan Aßmus BMenu *menu = fFormatMenu->Menu(); 6506af4da5dSStephan Aßmus BMenuItem *item; 6516af4da5dSStephan Aßmus // clear out old format menu items 6526af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 6536af4da5dSStephan Aßmus delete item; 6546af4da5dSStephan Aßmus } 6556af4da5dSStephan Aßmus 6566af4da5dSStephan Aßmus // add menu items for each file format 6576af4da5dSStephan Aßmus media_file_format mfi; 6586af4da5dSStephan Aßmus int32 cookie = 0; 6596af4da5dSStephan Aßmus FileFormatMenuItem *ff_item; 6606af4da5dSStephan Aßmus while (get_next_file_format(&cookie, &mfi) == B_OK) { 6616af4da5dSStephan Aßmus ff_item = new FileFormatMenuItem(&mfi); 6626af4da5dSStephan Aßmus menu->AddItem(ff_item); 6636af4da5dSStephan Aßmus } 6646af4da5dSStephan Aßmus 6656af4da5dSStephan Aßmus // mark first item 6666af4da5dSStephan Aßmus item = menu->ItemAt(0); 6676af4da5dSStephan Aßmus if (item != NULL) { 6686af4da5dSStephan Aßmus item->SetMarked(true); 6696af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6706af4da5dSStephan Aßmus } 6716af4da5dSStephan Aßmus } 6726af4da5dSStephan Aßmus 673dd55ed1aSAlex Wilson 6746af4da5dSStephan Aßmus void 6756af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message) 6766af4da5dSStephan Aßmus { 677dd55ed1aSAlex Wilson fFileStatus->SetText(message); 6786af4da5dSStephan Aßmus } 6796af4da5dSStephan Aßmus 680dd55ed1aSAlex Wilson 6816af4da5dSStephan Aßmus void 6826af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message) 6836af4da5dSStephan Aßmus { 684dd55ed1aSAlex Wilson fStatus->SetText(message); 6856af4da5dSStephan Aßmus } 6866af4da5dSStephan Aßmus 6876af4da5dSStephan Aßmus 6886af4da5dSStephan Aßmus // #pragma mark - 6896af4da5dSStephan Aßmus 6906af4da5dSStephan Aßmus 6911c992a52SStephan Aßmus bool 6926af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref) 6936af4da5dSStephan Aßmus { 6941c992a52SStephan Aßmus if (!fListView->AddMediaItem(file, ref)) 6951c992a52SStephan Aßmus return false; 6966af4da5dSStephan Aßmus 6976af4da5dSStephan Aßmus if (!fOutputDirSpecified) { 6986af4da5dSStephan Aßmus BEntry entry(&ref); 6996af4da5dSStephan Aßmus entry.GetParent(&entry); 7006af4da5dSStephan Aßmus _SetOutputFolder(entry); 7016af4da5dSStephan Aßmus } 7021c992a52SStephan Aßmus 7031c992a52SStephan Aßmus return true; 7046af4da5dSStephan Aßmus } 7056af4da5dSStephan Aßmus 7066af4da5dSStephan Aßmus 7076af4da5dSStephan Aßmus void 7086af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index) 7096af4da5dSStephan Aßmus { 7106af4da5dSStephan Aßmus delete fListView->RemoveItem(index); 7116af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7126af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 7136af4da5dSStephan Aßmus } 7146af4da5dSStephan Aßmus 7156af4da5dSStephan Aßmus 7166af4da5dSStephan Aßmus int32 7176af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles() 7186af4da5dSStephan Aßmus { 7196af4da5dSStephan Aßmus return fListView->CountItems(); 7206af4da5dSStephan Aßmus } 7216af4da5dSStephan Aßmus 7226af4da5dSStephan Aßmus 7236af4da5dSStephan Aßmus status_t 7246af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file, 7256af4da5dSStephan Aßmus entry_ref* ref) 7266af4da5dSStephan Aßmus { 7276af4da5dSStephan Aßmus MediaFileListItem* item = dynamic_cast<MediaFileListItem*>( 7286af4da5dSStephan Aßmus fListView->ItemAt(index)); 7296af4da5dSStephan Aßmus if (item != NULL) { 7306af4da5dSStephan Aßmus *_file = item->fMediaFile; 7316af4da5dSStephan Aßmus *ref = item->fRef; 7326af4da5dSStephan Aßmus return B_OK; 7336af4da5dSStephan Aßmus } else { 7346af4da5dSStephan Aßmus return B_ERROR; 7356af4da5dSStephan Aßmus } 7366af4da5dSStephan Aßmus } 7376af4da5dSStephan Aßmus 7386af4da5dSStephan Aßmus 7396af4da5dSStephan Aßmus void 7406af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged() 7416af4da5dSStephan Aßmus { 7426af4da5dSStephan Aßmus int32 selected = fListView->CurrentSelection(); 7436af4da5dSStephan Aßmus BMediaFile* file = NULL; 7446af4da5dSStephan Aßmus entry_ref ref; 7457730c846SStephan Aßmus bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK; 7466af4da5dSStephan Aßmus 7476af4da5dSStephan Aßmus fPreviewButton->SetEnabled(enabled); 7486af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(enabled); 7496af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(enabled); 7506af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7516af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7526af4da5dSStephan Aßmus 7537730c846SStephan Aßmus BString duration; 7547730c846SStephan Aßmus if (enabled) { 7557730c846SStephan Aßmus fInfoView->Update(file, &ref); 7566af4da5dSStephan Aßmus // HACK: get the fInfoView to update the duration "synchronously" 7576af4da5dSStephan Aßmus UpdateIfNeeded(); 7587730c846SStephan Aßmus duration << fInfoView->Duration() / 1000; 7597730c846SStephan Aßmus } else 7607730c846SStephan Aßmus duration = "0"; 7616af4da5dSStephan Aßmus 7626af4da5dSStephan Aßmus // update duration text controls 7636af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7646af4da5dSStephan Aßmus fEndDurationTC->SetText(duration.String()); 7656af4da5dSStephan Aßmus } 7666af4da5dSStephan Aßmus 7676af4da5dSStephan Aßmus 7686af4da5dSStephan Aßmus // #pragma mark - 7696af4da5dSStephan Aßmus 7706af4da5dSStephan Aßmus 7716af4da5dSStephan Aßmus void 7726af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled) 7736af4da5dSStephan Aßmus { 7746af4da5dSStephan Aßmus fConvertButton->SetEnabled(convertEnabled); 7756af4da5dSStephan Aßmus if (enabled == fEnabled) 7766af4da5dSStephan Aßmus return; 7776af4da5dSStephan Aßmus 7786af4da5dSStephan Aßmus fFormatMenu->SetEnabled(enabled); 7796af4da5dSStephan Aßmus fAudioMenu->SetEnabled(enabled); 7806af4da5dSStephan Aßmus fVideoMenu->SetEnabled(enabled); 7816af4da5dSStephan Aßmus fListView->SetEnabled(enabled); 7826af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7836af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7846af4da5dSStephan Aßmus 7856af4da5dSStephan Aßmus fEnabled = enabled; 7866af4da5dSStephan Aßmus } 7876af4da5dSStephan Aßmus 7886af4da5dSStephan Aßmus 7896af4da5dSStephan Aßmus bool 7906af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled() 7916af4da5dSStephan Aßmus { 7926af4da5dSStephan Aßmus return fEnabled; 7936af4da5dSStephan Aßmus } 7946af4da5dSStephan Aßmus 7956af4da5dSStephan Aßmus 7966af4da5dSStephan Aßmus const char* 7976af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const 7986af4da5dSStephan Aßmus { 7996af4da5dSStephan Aßmus return fStartDurationTC->Text(); 8006af4da5dSStephan Aßmus } 8016af4da5dSStephan Aßmus 8026af4da5dSStephan Aßmus 8036af4da5dSStephan Aßmus const char* 8046af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const 8056af4da5dSStephan Aßmus { 8066af4da5dSStephan Aßmus return fEndDurationTC->Text(); 8076af4da5dSStephan Aßmus } 8086af4da5dSStephan Aßmus 8096af4da5dSStephan Aßmus 8106af4da5dSStephan Aßmus BDirectory 8116af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const 8126af4da5dSStephan Aßmus { 8136af4da5dSStephan Aßmus return fOutputDir; 8146af4da5dSStephan Aßmus } 8156af4da5dSStephan Aßmus 8166af4da5dSStephan Aßmus 8176af4da5dSStephan Aßmus void 8186af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label) 8196af4da5dSStephan Aßmus { 8206af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(label); 8216af4da5dSStephan Aßmus } 8226af4da5dSStephan Aßmus 8236af4da5dSStephan Aßmus 8246af4da5dSStephan Aßmus void 8256af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label) 8266af4da5dSStephan Aßmus { 8276af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(label); 8286af4da5dSStephan Aßmus } 8296af4da5dSStephan Aßmus 8306af4da5dSStephan Aßmus 8316af4da5dSStephan Aßmus // #pragma mark - 8326af4da5dSStephan Aßmus 8336af4da5dSStephan Aßmus 8346af4da5dSStephan Aßmus void 8356af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels() 8366af4da5dSStephan Aßmus { 837dd55ed1aSAlex Wilson if (fSourcesBox != NULL) { 838ae0f70fcSAdrien Destugues fSourcesBox->SetLabel(B_TRANSLATE("Source files")); 839dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fSourcesBox); 840dd55ed1aSAlex Wilson } 8416af4da5dSStephan Aßmus 842dd55ed1aSAlex Wilson if (fInfoBox != NULL) 843ae0f70fcSAdrien Destugues fInfoBox->SetLabel(B_TRANSLATE("File details")); 8446af4da5dSStephan Aßmus 845dd55ed1aSAlex Wilson if (fOutputBox != NULL) { 846ae0f70fcSAdrien Destugues fOutputBox->SetLabel(B_TRANSLATE("Output format")); 847dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fOutputBox); 848dd55ed1aSAlex Wilson } 8496af4da5dSStephan Aßmus 850dd55ed1aSAlex Wilson if (fConvertButton != NULL) 851ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 8526af4da5dSStephan Aßmus 853dd55ed1aSAlex Wilson if (fPreviewButton != NULL) 854ae0f70fcSAdrien Destugues fPreviewButton->SetLabel(B_TRANSLATE("Preview")); 8556af4da5dSStephan Aßmus 856dd55ed1aSAlex Wilson if (fDestButton != NULL) 857ae0f70fcSAdrien Destugues fDestButton->SetLabel(B_TRANSLATE("Output folder")); 8586af4da5dSStephan Aßmus 8596af4da5dSStephan Aßmus if (fVideoQualitySlider != NULL) { 860dd55ed1aSAlex Wilson char buffer[40]; 861ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"), 862f086ada7SStephan Aßmus (int8)fVideoQuality); 8636af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 864ae0f70fcSAdrien Destugues fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 865ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8666af4da5dSStephan Aßmus } 8676af4da5dSStephan Aßmus 8686af4da5dSStephan Aßmus if (fAudioQualitySlider != NULL) { 869dd55ed1aSAlex Wilson char buffer[40]; 870ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"), 871f086ada7SStephan Aßmus (int8)fAudioQuality); 8726af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 873ae0f70fcSAdrien Destugues fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 874ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8756af4da5dSStephan Aßmus } 8766af4da5dSStephan Aßmus 877dd55ed1aSAlex Wilson if (fStartDurationTC != NULL) 878ae0f70fcSAdrien Destugues fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: ")); 879dd55ed1aSAlex Wilson 880dd55ed1aSAlex Wilson if (fEndDurationTC != NULL) 881ae0f70fcSAdrien Destugues fEndDurationTC->SetLabel(B_TRANSLATE("End [ms]: ")); 8826af4da5dSStephan Aßmus 8836af4da5dSStephan Aßmus if (fFormatMenu != NULL) 884ae0f70fcSAdrien Destugues fFormatMenu->SetLabel(B_TRANSLATE("File format:")); 885dd55ed1aSAlex Wilson 8866af4da5dSStephan Aßmus if (fAudioMenu != NULL) 887ae0f70fcSAdrien Destugues fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:")); 888dd55ed1aSAlex Wilson 8896af4da5dSStephan Aßmus if (fVideoMenu != NULL) 890ae0f70fcSAdrien Destugues fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:")); 8916af4da5dSStephan Aßmus 892ae0f70fcSAdrien Destugues SetFileMessage(B_TRANSLATE("Drop media files onto this window")); 8936af4da5dSStephan Aßmus } 8946af4da5dSStephan Aßmus 8956af4da5dSStephan Aßmus 8966af4da5dSStephan Aßmus void 897dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box) 898dd55ed1aSAlex Wilson { 899dd55ed1aSAlex Wilson BTwoDimensionalLayout* layout 900dd55ed1aSAlex Wilson = dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout()); 9017730c846SStephan Aßmus if (layout != NULL) { 902dd55ed1aSAlex Wilson float padding = be_control_look->DefaultItemSpacing(); 903dd55ed1aSAlex Wilson layout->SetInsets(padding, box->TopBorderOffset() + padding, padding, 904dd55ed1aSAlex Wilson padding); 905dd55ed1aSAlex Wilson } 906dd55ed1aSAlex Wilson } 907dd55ed1aSAlex Wilson 908dd55ed1aSAlex Wilson 909dd55ed1aSAlex Wilson void 9106af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu() 9116af4da5dSStephan Aßmus { 9126af4da5dSStephan Aßmus BMenu* Menu; 9136af4da5dSStephan Aßmus 9146af4da5dSStephan Aßmus while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) { 9156af4da5dSStephan Aßmus fMenuBar->RemoveItem(Menu); 9166af4da5dSStephan Aßmus delete Menu; 9176af4da5dSStephan Aßmus } 9186af4da5dSStephan Aßmus } 9196af4da5dSStephan Aßmus 9206af4da5dSStephan Aßmus 9216af4da5dSStephan Aßmus void 9226af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu() 9236af4da5dSStephan Aßmus { 9246af4da5dSStephan Aßmus BMenuItem* item; 9256af4da5dSStephan Aßmus BMenu* menu; 9266af4da5dSStephan Aßmus 927546208a5SOliver Tappe menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu")); 928546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT( 929ae0f70fcSAdrien Destugues "Open" B_UTF8_ELLIPSIS, "Menu"), 930dd55ed1aSAlex Wilson new BMessage(OPEN_FILE_MESSAGE), 'O'); 9316af4da5dSStephan Aßmus menu->AddItem(item); 9326af4da5dSStephan Aßmus menu->AddSeparatorItem(); 933546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"), 934ae0f70fcSAdrien Destugues new BMessage(QUIT_MESSAGE), 'Q'); 9356af4da5dSStephan Aßmus menu->AddItem(item); 9366af4da5dSStephan Aßmus 9376af4da5dSStephan Aßmus fMenuBar->AddItem(menu); 9386af4da5dSStephan Aßmus } 9396af4da5dSStephan Aßmus 9406af4da5dSStephan Aßmus 9416af4da5dSStephan Aßmus void 9426af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry) 9436af4da5dSStephan Aßmus { 9446af4da5dSStephan Aßmus BPath path; 9456af4da5dSStephan Aßmus entry.GetPath(&path); 9466af4da5dSStephan Aßmus fOutputFolder->SetText(path.Path()); 9476af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 9486af4da5dSStephan Aßmus fOutputDir.SetTo(path.Path()); 9496af4da5dSStephan Aßmus } 9506af4da5dSStephan Aßmus 9516af4da5dSStephan Aßmus 952