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. 4*ce74de86SJohn 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 7*ce74de86SJohn 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, 116007d8a0cSSiarzhuk Zharski B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | 117007d8a0cSSiarzhuk Zharski 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 135dd55ed1aSAlex Wilson fListView = new MediaFileListView(); 136dd55ed1aSAlex Wilson fListView->SetExplicitMinSize(BSize(100, B_SIZE_UNSET)); 137dd55ed1aSAlex Wilson BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true); 1386af4da5dSStephan Aßmus 1396af4da5dSStephan Aßmus // file list view box 140dd55ed1aSAlex Wilson fSourcesBox = new BBox(B_FANCY_BORDER, scroller); 141dd55ed1aSAlex Wilson fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0)); 142dd55ed1aSAlex Wilson // We give fSourcesBox a layout to provide insets for the sources list 143dd55ed1aSAlex Wilson // said insets are adjusted in _UpdateLabels 1446af4da5dSStephan Aßmus 145dd55ed1aSAlex Wilson fInfoView = new MediaFileInfoView(); 146dd55ed1aSAlex Wilson fInfoBox = new BBox(B_FANCY_BORDER, fInfoView); 147dd55ed1aSAlex Wilson fInfoBox->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 148dd55ed1aSAlex Wilson B_ALIGN_USE_FULL_HEIGHT)); 1497730c846SStephan Aßmus 1507730c846SStephan Aßmus float padding = be_control_look->DefaultItemSpacing(); 1516af4da5dSStephan 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 176dd55ed1aSAlex Wilson fStartDurationTC = new BTextControl(NULL, NULL, NULL); 1776af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 1786af4da5dSStephan Aßmus 179dd55ed1aSAlex Wilson fEndDurationTC = new BTextControl(NULL, NULL, NULL); 1806af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 1816af4da5dSStephan Aßmus 1826af4da5dSStephan Aßmus // Video Quality 183dd55ed1aSAlex Wilson fVideoQualitySlider = new BSlider("VSlider", "" , 184dd55ed1aSAlex Wilson new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 1856af4da5dSStephan Aßmus fVideoQualitySlider->SetValue(fVideoQuality); 1866af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 1876af4da5dSStephan Aßmus 1886af4da5dSStephan Aßmus // Audio Quality 189dd55ed1aSAlex Wilson fAudioQualitySlider = new BSlider("ASlider", "" , 190dd55ed1aSAlex Wilson new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 1916af4da5dSStephan Aßmus fAudioQualitySlider->SetValue(fAudioQuality); 1926af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 193dd55ed1aSAlex Wilson 1940a81944dSStephan Aßmus BLayoutBuilder::Grid<>(outputGrid) 195dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 196dd55ed1aSAlex Wilson .AddMenuField(fFormatMenu, 0, 0) 197dd55ed1aSAlex Wilson .AddMenuField(fAudioMenu, 0, 1) 198dd55ed1aSAlex Wilson .AddMenuField(fVideoMenu, 0, 2) 199dd55ed1aSAlex Wilson .Add(fDestButton, 0, 3) 200dd55ed1aSAlex Wilson .Add(fOutputFolder, 1, 3) 201dd55ed1aSAlex Wilson .AddTextControl(fStartDurationTC, 0, 4) 202dd55ed1aSAlex Wilson .AddTextControl(fEndDurationTC, 0, 5) 203dd55ed1aSAlex Wilson .Add(fVideoQualitySlider, 0, 6, 2, 1) 204dd55ed1aSAlex Wilson .Add(fAudioQualitySlider, 0, 7, 2, 1); 2056af4da5dSStephan Aßmus 2066af4da5dSStephan Aßmus // buttons 207ae0f70fcSAdrien Destugues fPreviewButton = new BButton(B_TRANSLATE("Preview"), 208dd55ed1aSAlex Wilson new BMessage(PREVIEW_MESSAGE)); 2096af4da5dSStephan Aßmus fPreviewButton->SetEnabled(false); 2106af4da5dSStephan Aßmus 211ae0f70fcSAdrien Destugues fConvertButton = new BButton(B_TRANSLATE("Convert"), 212dd55ed1aSAlex Wilson new BMessage(CONVERT_BUTTON_MESSAGE)); 2136af4da5dSStephan Aßmus 214dd55ed1aSAlex Wilson // Status views 215dd55ed1aSAlex Wilson fStatus = new BStringView(NULL, NULL); 216dd55ed1aSAlex Wilson fStatus->SetExplicitAlignment(labelAlignment); 217dd55ed1aSAlex Wilson fFileStatus = new BStringView(NULL, NULL); 218dd55ed1aSAlex Wilson fFileStatus->SetExplicitAlignment(labelAlignment); 2196af4da5dSStephan Aßmus 2206af4da5dSStephan Aßmus SetStatusMessage(""); 2216af4da5dSStephan Aßmus _UpdateLabels(); 2226af4da5dSStephan Aßmus 223dd55ed1aSAlex Wilson BLayoutBuilder::Group<>(this, B_VERTICAL, 0) 224dd55ed1aSAlex Wilson .SetInsets(0, 0, 0, 0) 225dd55ed1aSAlex Wilson .Add(fMenuBar) 2267730c846SStephan Aßmus .AddSplit(B_HORIZONTAL, padding / 2) 227dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 2287730c846SStephan Aßmus .Add(fSourcesBox, 0.4) 2297730c846SStephan Aßmus .AddGroup(B_VERTICAL, padding, 0.6) 2307730c846SStephan Aßmus .Add(fInfoBox) 2317730c846SStephan Aßmus .Add(fOutputBox) 2327730c846SStephan Aßmus .End() 2337730c846SStephan Aßmus .End() 2347730c846SStephan Aßmus .AddGrid(padding, padding) 2357730c846SStephan Aßmus .SetInsets(padding, 0, padding, padding) 236dd55ed1aSAlex Wilson .Add(fStatus, 0, 0) 237dd55ed1aSAlex Wilson .Add(fFileStatus, 0, 1) 2389b2ea762SAlex Wilson .Add(BSpaceLayoutItem::CreateGlue(), 1, 0) 239dd55ed1aSAlex Wilson .Add(fPreviewButton, 2, 0) 2407730c846SStephan Aßmus .Add(fConvertButton, 3, 0) 2417730c846SStephan Aßmus .End() 2427730c846SStephan Aßmus ; 2436af4da5dSStephan Aßmus } 2446af4da5dSStephan Aßmus 2456af4da5dSStephan Aßmus 2466af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow() 2476af4da5dSStephan Aßmus { 2483c0f9a7cSKarsten Heimrich delete fSaveFilePanel; 2493c0f9a7cSKarsten Heimrich delete fOpenFilePanel; 2506af4da5dSStephan Aßmus } 2516af4da5dSStephan Aßmus 2526af4da5dSStephan Aßmus 2536af4da5dSStephan Aßmus // #pragma mark - 2546af4da5dSStephan Aßmus 2556af4da5dSStephan Aßmus 2566af4da5dSStephan Aßmus void 2576af4da5dSStephan Aßmus MediaConverterWindow::MessageReceived(BMessage* msg) 2586af4da5dSStephan Aßmus { 2596af4da5dSStephan Aßmus entry_ref inRef; 2606af4da5dSStephan Aßmus 2616af4da5dSStephan Aßmus char buffer[40]; 262f086ada7SStephan Aßmus BEntry inEntry; 2636af4da5dSStephan Aßmus 2646af4da5dSStephan Aßmus switch (msg->what) { 2656af4da5dSStephan Aßmus #if B_BEOS_VERSION <= B_BEOS_VERSION_6 2666af4da5dSStephan Aßmus case B_LANGUAGE_CHANGED: 2676af4da5dSStephan Aßmus LanguageChanged(); 2686af4da5dSStephan Aßmus break; 2696af4da5dSStephan Aßmus #endif 2706af4da5dSStephan Aßmus 2716af4da5dSStephan Aßmus case INIT_FORMAT_MENUS: 2726af4da5dSStephan Aßmus BuildFormatMenu(); 2736af4da5dSStephan Aßmus if (CountSourceFiles() == 0) 2746af4da5dSStephan Aßmus SetEnabled(false, false); 2756af4da5dSStephan Aßmus break; 2766af4da5dSStephan Aßmus 2776af4da5dSStephan Aßmus case B_SIMPLE_DATA: 278f086ada7SStephan Aßmus if (msg->WasDropped()) { 2796af4da5dSStephan Aßmus DetachCurrentMessage(); 2806af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 2816af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 2826af4da5dSStephan Aßmus delete msg; 2836af4da5dSStephan Aßmus } 2846af4da5dSStephan Aßmus break; 2856af4da5dSStephan Aßmus 2866af4da5dSStephan Aßmus case FORMAT_SELECT_MESSAGE: 2876af4da5dSStephan Aßmus BuildAudioVideoMenus(); 2886af4da5dSStephan Aßmus break; 2896af4da5dSStephan Aßmus case AUDIO_CODEC_SELECT_MESSAGE: 2906af4da5dSStephan Aßmus break; 2916af4da5dSStephan Aßmus case VIDEO_CODEC_SELECT_MESSAGE: 2926af4da5dSStephan Aßmus break; 2936af4da5dSStephan Aßmus 2946af4da5dSStephan Aßmus case CONVERT_BUTTON_MESSAGE: 2956af4da5dSStephan Aßmus if (!fConverting) { 296ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Cancel")); 2976af4da5dSStephan Aßmus fConverting = true; 298ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Convert")); 2996af4da5dSStephan Aßmus SetEnabled(false, true); 3006af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE); 3016af4da5dSStephan Aßmus } else if (!fCancelling) { 3026af4da5dSStephan Aßmus fCancelling = true; 303ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS)); 3046af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 3056af4da5dSStephan Aßmus } 3066af4da5dSStephan Aßmus break; 3076af4da5dSStephan Aßmus 3086af4da5dSStephan Aßmus case CONVERSION_DONE_MESSAGE: 309f086ada7SStephan Aßmus { 310ae0f70fcSAdrien Destugues SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled") 311ae0f70fcSAdrien Destugues : B_TRANSLATE("Conversion completed")); 3126af4da5dSStephan Aßmus fConverting = false; 3136af4da5dSStephan Aßmus fCancelling = false; 3146af4da5dSStephan Aßmus bool enable = CountSourceFiles() > 0; 3156af4da5dSStephan Aßmus SetEnabled(enable, enable); 316ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 3176af4da5dSStephan Aßmus break; 318f086ada7SStephan Aßmus } 3196af4da5dSStephan Aßmus 3206af4da5dSStephan Aßmus case OUTPUT_FOLDER_MESSAGE: 3216af4da5dSStephan Aßmus // Execute Save Panel 322f086ada7SStephan Aßmus if (fSaveFilePanel == NULL) { 323f086ada7SStephan Aßmus BButton* selectThisDir; 3246af4da5dSStephan Aßmus 3253c0f9a7cSKarsten Heimrich BMessage message(FOLDER_SELECT_MESSAGE); 3263c0f9a7cSKarsten Heimrich fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 3273c0f9a7cSKarsten Heimrich B_DIRECTORY_NODE, true, &message, NULL, false, true); 328ae0f70fcSAdrien Destugues fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, 329ae0f70fcSAdrien Destugues B_TRANSLATE("Select")); 3306af4da5dSStephan Aßmus fSaveFilePanel->SetTarget(this); 3316af4da5dSStephan Aßmus 3326af4da5dSStephan Aßmus fSaveFilePanel->Window()->Lock(); 333ae0f70fcSAdrien Destugues fSaveFilePanel->Window()->SetTitle( 334ae0f70fcSAdrien Destugues B_TRANSLATE("MediaConverter+:SaveDirectory")); 335f086ada7SStephan Aßmus BRect buttonRect 336f086ada7SStephan Aßmus = fSaveFilePanel->Window()->ChildAt(0)->FindView( 337f086ada7SStephan Aßmus "cancel button")->Frame(); 338f086ada7SStephan Aßmus buttonRect.right = buttonRect.left - 20; 339f086ada7SStephan Aßmus buttonRect.left = buttonRect.right - 130; 340ae0f70fcSAdrien Destugues selectThisDir = new BButton(buttonRect, NULL, 341ae0f70fcSAdrien Destugues B_TRANSLATE("Select this folder"), 342f086ada7SStephan Aßmus new BMessage(SELECT_THIS_DIR_MESSAGE), 343f086ada7SStephan Aßmus B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT); 344f086ada7SStephan Aßmus selectThisDir->SetTarget(this); 345f086ada7SStephan Aßmus fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir); 3466af4da5dSStephan Aßmus fSaveFilePanel->Window()->Unlock(); 3476af4da5dSStephan Aßmus 348f086ada7SStephan Aßmus fSaveFilePanel->SetRefFilter(new DirectoryFilter); 3496af4da5dSStephan Aßmus } 3506af4da5dSStephan Aßmus fSaveFilePanel->Show(); 3516af4da5dSStephan Aßmus break; 3526af4da5dSStephan Aßmus 3536af4da5dSStephan Aßmus case FOLDER_SELECT_MESSAGE: 3546af4da5dSStephan Aßmus // "SELECT" Button at Save Panel Pushed 3556af4da5dSStephan Aßmus fSaveFilePanel->GetNextSelectedRef(&inRef); 356f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 357f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 3586af4da5dSStephan Aßmus fOutputDirSpecified = true; 3596af4da5dSStephan Aßmus break; 3606af4da5dSStephan Aßmus 3616af4da5dSStephan Aßmus case SELECT_THIS_DIR_MESSAGE: 3626af4da5dSStephan Aßmus // "THIS DIR" Button at Save Panel Pushed 3636af4da5dSStephan Aßmus fSaveFilePanel->GetPanelDirectory(&inRef); 3646af4da5dSStephan Aßmus fSaveFilePanel->Hide(); 365f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 366f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 3676af4da5dSStephan Aßmus fOutputDirSpecified = true; 3686af4da5dSStephan Aßmus break; 3696af4da5dSStephan Aßmus 3706af4da5dSStephan Aßmus case OPEN_FILE_MESSAGE: 3716af4da5dSStephan Aßmus // Execute Open Panel 3726af4da5dSStephan Aßmus if (!fOpenFilePanel) { 3733c0f9a7cSKarsten Heimrich fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 3743c0f9a7cSKarsten Heimrich B_FILE_NODE, true, NULL, NULL, false, true); 3756af4da5dSStephan Aßmus fOpenFilePanel->SetTarget(this); 3766af4da5dSStephan Aßmus } 3776af4da5dSStephan Aßmus fOpenFilePanel->Show(); 3786af4da5dSStephan Aßmus break; 3796af4da5dSStephan Aßmus 3806af4da5dSStephan Aßmus case B_REFS_RECEIVED: 3816af4da5dSStephan Aßmus // Media Files Seleced by Open Panel 3826af4da5dSStephan Aßmus DetachCurrentMessage(); 3836af4da5dSStephan Aßmus msg->what = B_REFS_RECEIVED; 3846af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(msg); 3856af4da5dSStephan Aßmus // fall through 3866af4da5dSStephan Aßmus 3876af4da5dSStephan Aßmus case B_CANCEL: 3886af4da5dSStephan Aßmus break; 3896af4da5dSStephan Aßmus 3906af4da5dSStephan Aßmus case QUIT_MESSAGE: 3916af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested(); 3926af4da5dSStephan Aßmus break; 3936af4da5dSStephan Aßmus 3946af4da5dSStephan Aßmus case PREVIEW_MESSAGE: 395f086ada7SStephan Aßmus { 396f086ada7SStephan Aßmus // Build the command line to launch the preview application. 397f086ada7SStephan Aßmus // TODO: Launch the default app instead of hardcoded MediaPlayer! 398f086ada7SStephan Aßmus int32 srcIndex = fListView->CurrentSelection(); 399f086ada7SStephan Aßmus BMediaFile* inFile = NULL; 400f086ada7SStephan Aßmus status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef); 4016af4da5dSStephan Aßmus 402f086ada7SStephan Aßmus const char* argv[3]; 403f086ada7SStephan Aßmus BString startPosString; 404f086ada7SStephan Aßmus BPath path; 405f086ada7SStephan Aßmus 4066af4da5dSStephan Aßmus if (status == B_OK) { 407f086ada7SStephan Aßmus argv[0] = "-pos"; 408f086ada7SStephan Aßmus // NOTE: -pos argument is currently not supported by Haiku 409f086ada7SStephan Aßmus // MediaPlayer. 410f086ada7SStephan Aßmus startPosString << fStartDurationTC->Text(); 411f086ada7SStephan Aßmus startPosString << "000"; 412f086ada7SStephan Aßmus argv[1] = startPosString.String(); 4136af4da5dSStephan Aßmus 414f086ada7SStephan Aßmus status = inEntry.SetTo(&inRef); 4156af4da5dSStephan Aßmus } 4166af4da5dSStephan Aßmus 417f086ada7SStephan Aßmus if (status == B_OK) { 418f086ada7SStephan Aßmus status = inEntry.GetPath(&path); 419f086ada7SStephan Aßmus if (status == B_OK) 420f086ada7SStephan Aßmus argv[2] = path.Path(); 421f086ada7SStephan Aßmus } 4226af4da5dSStephan Aßmus 423f086ada7SStephan Aßmus if (status == B_OK) { 424f086ada7SStephan Aßmus status = be_roster->Launch( 425f086ada7SStephan Aßmus "application/x-vnd.Haiku-MediaPlayer", 426f086ada7SStephan Aßmus 3, (char**)argv, NULL); 427f086ada7SStephan Aßmus } 428f086ada7SStephan Aßmus 429f086ada7SStephan Aßmus if (status != B_OK && status != B_ALREADY_RUNNING) { 430007d8a0cSSiarzhuk Zharski BString errorString(B_TRANSLATE("Error launching: %strError%")); 431007d8a0cSSiarzhuk Zharski errorString.ReplaceFirst("%strError%", strerror(status)); 432aed35104SHumdinger BAlert* alert = new BAlert(B_TRANSLATE("Error"), 433aed35104SHumdinger errorString.String(), B_TRANSLATE("OK")); 434aed35104SHumdinger alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 435aed35104SHumdinger alert->Go(); 4366af4da5dSStephan Aßmus } 4376af4da5dSStephan Aßmus break; 438f086ada7SStephan Aßmus } 4396af4da5dSStephan Aßmus 4406af4da5dSStephan Aßmus case VIDEO_QUALITY_CHANGED_MESSAGE: 441f086ada7SStephan Aßmus { 442f086ada7SStephan Aßmus int32 value; 4436af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 444ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 445ae0f70fcSAdrien Destugues B_TRANSLATE("Video quality: %3d%%"), (int8)value); 4466af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 4476af4da5dSStephan Aßmus fVideoQuality = value; 4486af4da5dSStephan Aßmus break; 449f086ada7SStephan Aßmus } 4506af4da5dSStephan Aßmus 4516af4da5dSStephan Aßmus case AUDIO_QUALITY_CHANGED_MESSAGE: 452f086ada7SStephan Aßmus { 453f086ada7SStephan Aßmus int32 value; 4546af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 455ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 456ae0f70fcSAdrien Destugues B_TRANSLATE("Audio quality: %3d%%"), (int8)value); 4576af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 4586af4da5dSStephan Aßmus fAudioQuality = value; 4596af4da5dSStephan Aßmus break; 460f086ada7SStephan Aßmus } 4616af4da5dSStephan Aßmus 4626af4da5dSStephan Aßmus default: 4636af4da5dSStephan Aßmus BWindow::MessageReceived(msg); 4646af4da5dSStephan Aßmus } 4656af4da5dSStephan Aßmus } 4666af4da5dSStephan Aßmus 4676af4da5dSStephan Aßmus 4686af4da5dSStephan Aßmus bool 4696af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested() 4706af4da5dSStephan Aßmus { 4716af4da5dSStephan Aßmus if (!fConverting) { 4726af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(B_QUIT_REQUESTED); 4736af4da5dSStephan Aßmus return true; 4746af4da5dSStephan Aßmus } else if (!fCancelling) { 4756af4da5dSStephan Aßmus fCancelling = true; 476ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling")); 4776af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 4786af4da5dSStephan Aßmus } 4796af4da5dSStephan Aßmus return false; 4806af4da5dSStephan Aßmus } 4816af4da5dSStephan Aßmus 4826af4da5dSStephan Aßmus 4836af4da5dSStephan Aßmus // #pragma mark - 4846af4da5dSStephan Aßmus 4856af4da5dSStephan Aßmus 4866af4da5dSStephan Aßmus void 4876af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged() 4886af4da5dSStephan Aßmus { 4896af4da5dSStephan Aßmus _DestroyMenu(); 4906af4da5dSStephan Aßmus _CreateMenu(); 4916af4da5dSStephan Aßmus _UpdateLabels(); 4926af4da5dSStephan Aßmus BuildAudioVideoMenus(); 4936af4da5dSStephan Aßmus Lock(); 4946af4da5dSStephan Aßmus fInfoView->Invalidate(); 4956af4da5dSStephan Aßmus Unlock(); 4966af4da5dSStephan Aßmus } 4976af4da5dSStephan Aßmus 4986af4da5dSStephan Aßmus 4996af4da5dSStephan Aßmus void 5006af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus() 5016af4da5dSStephan Aßmus { 5026af4da5dSStephan Aßmus BMenu* menu = fAudioMenu->Menu(); 5036af4da5dSStephan Aßmus BMenuItem* item; 5046af4da5dSStephan Aßmus // clear out old audio codec menu items 5057f4d1af4SSergei Reznikov while ((item = menu->RemoveItem((int32)0)) != NULL) 5066af4da5dSStephan Aßmus delete item; 5076af4da5dSStephan Aßmus 5086af4da5dSStephan Aßmus bool separator = true; 5096af4da5dSStephan Aßmus 5106af4da5dSStephan Aßmus // get selected file format 5117730c846SStephan Aßmus FileFormatMenuItem* ffmi 5127730c846SStephan Aßmus = (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked(); 5136af4da5dSStephan Aßmus media_file_format* mf_format = &(ffmi->fFileFormat); 5146af4da5dSStephan Aßmus 5156af4da5dSStephan Aßmus media_format format, outfmt; 5166af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5176af4da5dSStephan Aßmus media_codec_info codec_info; 5186af4da5dSStephan Aßmus int32 cookie = 0; 5196af4da5dSStephan Aßmus CodecMenuItem* cmi; 5206af4da5dSStephan Aßmus 5216af4da5dSStephan Aßmus // add available audio encoders to menu 5226af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5236af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5247730c846SStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) 5257730c846SStephan Aßmus == B_OK) { 5266af4da5dSStephan Aßmus if (separator) { 527ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 528546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"), 5296af4da5dSStephan Aßmus new BMessage(AUDIO_CODEC_SELECT_MESSAGE))); 5306af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5316af4da5dSStephan Aßmus separator = false; 5326af4da5dSStephan Aßmus } 5336af4da5dSStephan Aßmus 5346af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE); 5356af4da5dSStephan Aßmus menu->AddItem(cmi); 5366af4da5dSStephan Aßmus // reset media format struct 5376af4da5dSStephan Aßmus /* 5386af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5396af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5406af4da5dSStephan Aßmus */ 5416af4da5dSStephan Aßmus } 5426af4da5dSStephan Aßmus 5436af4da5dSStephan Aßmus // mark first audio encoder 5446af4da5dSStephan Aßmus item = menu->ItemAt(0); 5456af4da5dSStephan Aßmus if (item != NULL) { 5466af4da5dSStephan Aßmus fAudioMenu->SetEnabled(fEnabled); 5476af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(fEnabled); 5486af4da5dSStephan Aßmus item->SetMarked(true); 5496af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 5506af4da5dSStephan Aßmus } else { 551ae0f70fcSAdrien Destugues item = new BMenuItem( 552546208a5SOliver Tappe B_TRANSLATE_CONTEXT("None available", "Audio codecs"), 553ae0f70fcSAdrien Destugues NULL); 5546af4da5dSStephan Aßmus menu->AddItem(item); 5556af4da5dSStephan Aßmus item->SetMarked(true); 5566af4da5dSStephan Aßmus fAudioMenu->SetEnabled(false); 5576af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 5586af4da5dSStephan Aßmus } 5596af4da5dSStephan Aßmus 5606af4da5dSStephan Aßmus // clear out old video codec menu items 5616af4da5dSStephan Aßmus menu = fVideoMenu->Menu(); 5627f4d1af4SSergei Reznikov while ((item = menu->RemoveItem((int32)0)) != NULL) 5636af4da5dSStephan Aßmus delete item; 5646af4da5dSStephan Aßmus 5656af4da5dSStephan Aßmus separator = true; 5666af4da5dSStephan Aßmus 5676af4da5dSStephan Aßmus // construct a generic video format. Some of these parameters 5686af4da5dSStephan Aßmus // seem silly, but are needed for R4.5.x, which is more picky 5696af4da5dSStephan Aßmus // than subsequent BeOS releases will be. 5706af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5716af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_VIDEO; 5726af4da5dSStephan Aßmus format.u.raw_video.last_active = (uint32)(240 - 1); 5736af4da5dSStephan Aßmus format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT; 5746af4da5dSStephan Aßmus format.u.raw_video.display.format = B_RGB32; 5756af4da5dSStephan Aßmus format.u.raw_video.display.line_width = (int32)320; 5766af4da5dSStephan Aßmus format.u.raw_video.display.line_count = (int32)240; 5776af4da5dSStephan Aßmus format.u.raw_video.display.bytes_per_row = 4 * 320; 5786af4da5dSStephan Aßmus 5796af4da5dSStephan Aßmus // add available video encoders to menu 5806af4da5dSStephan Aßmus cookie = 0; 5816af4da5dSStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) { 5826af4da5dSStephan Aßmus if (separator) { 583ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 584546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No video", "Video codecs list"), 5856af4da5dSStephan Aßmus new BMessage(VIDEO_CODEC_SELECT_MESSAGE))); 5866af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5876af4da5dSStephan Aßmus separator = false; 5886af4da5dSStephan Aßmus } 5896af4da5dSStephan Aßmus 5906af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE); 5916af4da5dSStephan Aßmus menu->AddItem(cmi); 5926af4da5dSStephan Aßmus } 5936af4da5dSStephan Aßmus 5946af4da5dSStephan Aßmus // mark first video encoder 5956af4da5dSStephan Aßmus item = menu->ItemAt(0); 5966af4da5dSStephan Aßmus if (item != NULL) { 5976af4da5dSStephan Aßmus fVideoMenu->SetEnabled(fEnabled); 5986af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(fEnabled); 5996af4da5dSStephan Aßmus item->SetMarked(true); 6006af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6016af4da5dSStephan Aßmus } else { 602ae0f70fcSAdrien Destugues item = new BMenuItem( 603546208a5SOliver Tappe B_TRANSLATE_CONTEXT("None available", "Video codecs"), 604ae0f70fcSAdrien Destugues NULL); 6056af4da5dSStephan Aßmus menu->AddItem(item); 6066af4da5dSStephan Aßmus item->SetMarked(true); 6076af4da5dSStephan Aßmus fVideoMenu->SetEnabled(false); 6086af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 6096af4da5dSStephan Aßmus } 6106af4da5dSStephan Aßmus } 6116af4da5dSStephan Aßmus 6126af4da5dSStephan Aßmus void 6136af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format, 6146af4da5dSStephan Aßmus media_codec_info** audio, media_codec_info** video) 6156af4da5dSStephan Aßmus { 6166af4da5dSStephan Aßmus *audio = NULL; 6176af4da5dSStephan Aßmus *video = NULL; 6186af4da5dSStephan Aßmus *format = NULL; 6196af4da5dSStephan Aßmus 6206af4da5dSStephan Aßmus FileFormatMenuItem *formatItem = 6216af4da5dSStephan Aßmus dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked()); 6226af4da5dSStephan Aßmus if (formatItem != NULL) { 6236af4da5dSStephan Aßmus *format = &(formatItem->fFileFormat); 6246af4da5dSStephan Aßmus } 6256af4da5dSStephan Aßmus 6266af4da5dSStephan Aßmus *audio = *video = NULL; 6276af4da5dSStephan Aßmus CodecMenuItem *codecItem = 6286af4da5dSStephan Aßmus dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked()); 6296af4da5dSStephan Aßmus if (codecItem != NULL) { 6306af4da5dSStephan Aßmus *audio = &(codecItem->fCodecInfo); 6316af4da5dSStephan Aßmus } 6326af4da5dSStephan Aßmus 6336af4da5dSStephan Aßmus codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked()); 6346af4da5dSStephan Aßmus if (codecItem != NULL) { 6356af4da5dSStephan Aßmus *video = &(codecItem->fCodecInfo); 6366af4da5dSStephan Aßmus } 6376af4da5dSStephan Aßmus } 6386af4da5dSStephan Aßmus 6396af4da5dSStephan Aßmus 6406af4da5dSStephan Aßmus void 6416af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu() 6426af4da5dSStephan Aßmus { 6436af4da5dSStephan Aßmus BMenu *menu = fFormatMenu->Menu(); 6446af4da5dSStephan Aßmus BMenuItem *item; 6456af4da5dSStephan Aßmus // clear out old format menu items 6466af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 6476af4da5dSStephan Aßmus delete item; 6486af4da5dSStephan Aßmus } 6496af4da5dSStephan Aßmus 6506af4da5dSStephan Aßmus // add menu items for each file format 6516af4da5dSStephan Aßmus media_file_format mfi; 6526af4da5dSStephan Aßmus int32 cookie = 0; 6536af4da5dSStephan Aßmus FileFormatMenuItem *ff_item; 6546af4da5dSStephan Aßmus while (get_next_file_format(&cookie, &mfi) == B_OK) { 6556af4da5dSStephan Aßmus ff_item = new FileFormatMenuItem(&mfi); 6566af4da5dSStephan Aßmus menu->AddItem(ff_item); 6576af4da5dSStephan Aßmus } 6586af4da5dSStephan Aßmus 6596af4da5dSStephan Aßmus // mark first item 6606af4da5dSStephan Aßmus item = menu->ItemAt(0); 6616af4da5dSStephan Aßmus if (item != NULL) { 6626af4da5dSStephan Aßmus item->SetMarked(true); 6636af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6646af4da5dSStephan Aßmus } 6656af4da5dSStephan Aßmus } 6666af4da5dSStephan Aßmus 667dd55ed1aSAlex Wilson 6686af4da5dSStephan Aßmus void 6696af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message) 6706af4da5dSStephan Aßmus { 671dd55ed1aSAlex Wilson fFileStatus->SetText(message); 6726af4da5dSStephan Aßmus } 6736af4da5dSStephan Aßmus 674dd55ed1aSAlex Wilson 6756af4da5dSStephan Aßmus void 6766af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message) 6776af4da5dSStephan Aßmus { 678dd55ed1aSAlex Wilson fStatus->SetText(message); 6796af4da5dSStephan Aßmus } 6806af4da5dSStephan Aßmus 6816af4da5dSStephan Aßmus 6826af4da5dSStephan Aßmus // #pragma mark - 6836af4da5dSStephan Aßmus 6846af4da5dSStephan Aßmus 6851c992a52SStephan Aßmus bool 6866af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref) 6876af4da5dSStephan Aßmus { 6881c992a52SStephan Aßmus if (!fListView->AddMediaItem(file, ref)) 6891c992a52SStephan Aßmus return false; 6906af4da5dSStephan Aßmus 6916af4da5dSStephan Aßmus if (!fOutputDirSpecified) { 6926af4da5dSStephan Aßmus BEntry entry(&ref); 6936af4da5dSStephan Aßmus entry.GetParent(&entry); 6946af4da5dSStephan Aßmus _SetOutputFolder(entry); 6956af4da5dSStephan Aßmus } 6961c992a52SStephan Aßmus 6971c992a52SStephan Aßmus return true; 6986af4da5dSStephan Aßmus } 6996af4da5dSStephan Aßmus 7006af4da5dSStephan Aßmus 7016af4da5dSStephan Aßmus void 7026af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index) 7036af4da5dSStephan Aßmus { 7046af4da5dSStephan Aßmus delete fListView->RemoveItem(index); 7056af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7066af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 7076af4da5dSStephan Aßmus } 7086af4da5dSStephan Aßmus 7096af4da5dSStephan Aßmus 7106af4da5dSStephan Aßmus int32 7116af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles() 7126af4da5dSStephan Aßmus { 7136af4da5dSStephan Aßmus return fListView->CountItems(); 7146af4da5dSStephan Aßmus } 7156af4da5dSStephan Aßmus 7166af4da5dSStephan Aßmus 7176af4da5dSStephan Aßmus status_t 7186af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file, 7196af4da5dSStephan Aßmus entry_ref* ref) 7206af4da5dSStephan Aßmus { 7216af4da5dSStephan Aßmus MediaFileListItem* item = dynamic_cast<MediaFileListItem*>( 7226af4da5dSStephan Aßmus fListView->ItemAt(index)); 7236af4da5dSStephan Aßmus if (item != NULL) { 7246af4da5dSStephan Aßmus *_file = item->fMediaFile; 7256af4da5dSStephan Aßmus *ref = item->fRef; 7266af4da5dSStephan Aßmus return B_OK; 7276af4da5dSStephan Aßmus } else { 7286af4da5dSStephan Aßmus return B_ERROR; 7296af4da5dSStephan Aßmus } 7306af4da5dSStephan Aßmus } 7316af4da5dSStephan Aßmus 7326af4da5dSStephan Aßmus 7336af4da5dSStephan Aßmus void 7346af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged() 7356af4da5dSStephan Aßmus { 7366af4da5dSStephan Aßmus int32 selected = fListView->CurrentSelection(); 7376af4da5dSStephan Aßmus BMediaFile* file = NULL; 7386af4da5dSStephan Aßmus entry_ref ref; 7397730c846SStephan Aßmus bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK; 7406af4da5dSStephan Aßmus 7416af4da5dSStephan Aßmus fPreviewButton->SetEnabled(enabled); 7426af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(enabled); 7436af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(enabled); 7446af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7456af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7466af4da5dSStephan Aßmus 7477730c846SStephan Aßmus BString duration; 7487730c846SStephan Aßmus if (enabled) { 7497730c846SStephan Aßmus fInfoView->Update(file, &ref); 7506af4da5dSStephan Aßmus // HACK: get the fInfoView to update the duration "synchronously" 7516af4da5dSStephan Aßmus UpdateIfNeeded(); 7527730c846SStephan Aßmus duration << fInfoView->Duration() / 1000; 7537730c846SStephan Aßmus } else 7547730c846SStephan Aßmus duration = "0"; 7556af4da5dSStephan Aßmus 7566af4da5dSStephan Aßmus // update duration text controls 7576af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7586af4da5dSStephan Aßmus fEndDurationTC->SetText(duration.String()); 7596af4da5dSStephan Aßmus } 7606af4da5dSStephan Aßmus 7616af4da5dSStephan Aßmus 7626af4da5dSStephan Aßmus // #pragma mark - 7636af4da5dSStephan Aßmus 7646af4da5dSStephan Aßmus 7656af4da5dSStephan Aßmus void 7666af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled) 7676af4da5dSStephan Aßmus { 7686af4da5dSStephan Aßmus fConvertButton->SetEnabled(convertEnabled); 7696af4da5dSStephan Aßmus if (enabled == fEnabled) 7706af4da5dSStephan Aßmus return; 7716af4da5dSStephan Aßmus 7726af4da5dSStephan Aßmus fFormatMenu->SetEnabled(enabled); 7736af4da5dSStephan Aßmus fAudioMenu->SetEnabled(enabled); 7746af4da5dSStephan Aßmus fVideoMenu->SetEnabled(enabled); 7756af4da5dSStephan Aßmus fListView->SetEnabled(enabled); 7766af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7776af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7786af4da5dSStephan Aßmus 7796af4da5dSStephan Aßmus fEnabled = enabled; 7806af4da5dSStephan Aßmus } 7816af4da5dSStephan Aßmus 7826af4da5dSStephan Aßmus 7836af4da5dSStephan Aßmus bool 7846af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled() 7856af4da5dSStephan Aßmus { 7866af4da5dSStephan Aßmus return fEnabled; 7876af4da5dSStephan Aßmus } 7886af4da5dSStephan Aßmus 7896af4da5dSStephan Aßmus 7906af4da5dSStephan Aßmus const char* 7916af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const 7926af4da5dSStephan Aßmus { 7936af4da5dSStephan Aßmus return fStartDurationTC->Text(); 7946af4da5dSStephan Aßmus } 7956af4da5dSStephan Aßmus 7966af4da5dSStephan Aßmus 7976af4da5dSStephan Aßmus const char* 7986af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const 7996af4da5dSStephan Aßmus { 8006af4da5dSStephan Aßmus return fEndDurationTC->Text(); 8016af4da5dSStephan Aßmus } 8026af4da5dSStephan Aßmus 8036af4da5dSStephan Aßmus 8046af4da5dSStephan Aßmus BDirectory 8056af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const 8066af4da5dSStephan Aßmus { 8076af4da5dSStephan Aßmus return fOutputDir; 8086af4da5dSStephan Aßmus } 8096af4da5dSStephan Aßmus 8106af4da5dSStephan Aßmus 8116af4da5dSStephan Aßmus void 8126af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label) 8136af4da5dSStephan Aßmus { 8146af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(label); 8156af4da5dSStephan Aßmus } 8166af4da5dSStephan Aßmus 8176af4da5dSStephan Aßmus 8186af4da5dSStephan Aßmus void 8196af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label) 8206af4da5dSStephan Aßmus { 8216af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(label); 8226af4da5dSStephan Aßmus } 8236af4da5dSStephan Aßmus 8246af4da5dSStephan Aßmus 8256af4da5dSStephan Aßmus // #pragma mark - 8266af4da5dSStephan Aßmus 8276af4da5dSStephan Aßmus 8286af4da5dSStephan Aßmus void 8296af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels() 8306af4da5dSStephan Aßmus { 831dd55ed1aSAlex Wilson if (fSourcesBox != NULL) { 832ae0f70fcSAdrien Destugues fSourcesBox->SetLabel(B_TRANSLATE("Source files")); 833dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fSourcesBox); 834dd55ed1aSAlex Wilson } 8356af4da5dSStephan Aßmus 836dd55ed1aSAlex Wilson if (fInfoBox != NULL) 837ae0f70fcSAdrien Destugues fInfoBox->SetLabel(B_TRANSLATE("File details")); 8386af4da5dSStephan Aßmus 839dd55ed1aSAlex Wilson if (fOutputBox != NULL) { 840ae0f70fcSAdrien Destugues fOutputBox->SetLabel(B_TRANSLATE("Output format")); 841dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fOutputBox); 842dd55ed1aSAlex Wilson } 8436af4da5dSStephan Aßmus 844dd55ed1aSAlex Wilson if (fConvertButton != NULL) 845ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 8466af4da5dSStephan Aßmus 847dd55ed1aSAlex Wilson if (fPreviewButton != NULL) 848ae0f70fcSAdrien Destugues fPreviewButton->SetLabel(B_TRANSLATE("Preview")); 8496af4da5dSStephan Aßmus 850dd55ed1aSAlex Wilson if (fDestButton != NULL) 851ae0f70fcSAdrien Destugues fDestButton->SetLabel(B_TRANSLATE("Output folder")); 8526af4da5dSStephan Aßmus 8536af4da5dSStephan Aßmus if (fVideoQualitySlider != NULL) { 854dd55ed1aSAlex Wilson char buffer[40]; 855ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"), 856f086ada7SStephan Aßmus (int8)fVideoQuality); 8576af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 858ae0f70fcSAdrien Destugues fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 859ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8606af4da5dSStephan Aßmus } 8616af4da5dSStephan Aßmus 8626af4da5dSStephan Aßmus if (fAudioQualitySlider != NULL) { 863dd55ed1aSAlex Wilson char buffer[40]; 864ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"), 865f086ada7SStephan Aßmus (int8)fAudioQuality); 8666af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 867ae0f70fcSAdrien Destugues fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 868ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8696af4da5dSStephan Aßmus } 8706af4da5dSStephan Aßmus 871dd55ed1aSAlex Wilson if (fStartDurationTC != NULL) 872ae0f70fcSAdrien Destugues fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: ")); 873dd55ed1aSAlex Wilson 874dd55ed1aSAlex Wilson if (fEndDurationTC != NULL) 875ae0f70fcSAdrien Destugues fEndDurationTC->SetLabel(B_TRANSLATE("End [ms]: ")); 8766af4da5dSStephan Aßmus 8776af4da5dSStephan Aßmus if (fFormatMenu != NULL) 878ae0f70fcSAdrien Destugues fFormatMenu->SetLabel(B_TRANSLATE("File format:")); 879dd55ed1aSAlex Wilson 8806af4da5dSStephan Aßmus if (fAudioMenu != NULL) 881ae0f70fcSAdrien Destugues fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:")); 882dd55ed1aSAlex Wilson 8836af4da5dSStephan Aßmus if (fVideoMenu != NULL) 884ae0f70fcSAdrien Destugues fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:")); 8856af4da5dSStephan Aßmus 886ae0f70fcSAdrien Destugues SetFileMessage(B_TRANSLATE("Drop media files onto this window")); 8876af4da5dSStephan Aßmus } 8886af4da5dSStephan Aßmus 8896af4da5dSStephan Aßmus 8906af4da5dSStephan Aßmus void 891dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box) 892dd55ed1aSAlex Wilson { 893dd55ed1aSAlex Wilson BTwoDimensionalLayout* layout 894dd55ed1aSAlex Wilson = dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout()); 8957730c846SStephan Aßmus if (layout != NULL) { 896dd55ed1aSAlex Wilson float padding = be_control_look->DefaultItemSpacing(); 897dd55ed1aSAlex Wilson layout->SetInsets(padding, box->TopBorderOffset() + padding, padding, 898dd55ed1aSAlex Wilson padding); 899dd55ed1aSAlex Wilson } 900dd55ed1aSAlex Wilson } 901dd55ed1aSAlex Wilson 902dd55ed1aSAlex Wilson 903dd55ed1aSAlex Wilson void 9046af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu() 9056af4da5dSStephan Aßmus { 9066af4da5dSStephan Aßmus BMenu* Menu; 9076af4da5dSStephan Aßmus 9086af4da5dSStephan Aßmus while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) { 9096af4da5dSStephan Aßmus fMenuBar->RemoveItem(Menu); 9106af4da5dSStephan Aßmus delete Menu; 9116af4da5dSStephan Aßmus } 9126af4da5dSStephan Aßmus } 9136af4da5dSStephan Aßmus 9146af4da5dSStephan Aßmus 9156af4da5dSStephan Aßmus void 9166af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu() 9176af4da5dSStephan Aßmus { 9186af4da5dSStephan Aßmus BMenuItem* item; 9196af4da5dSStephan Aßmus BMenu* menu; 9206af4da5dSStephan Aßmus 921546208a5SOliver Tappe menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu")); 922546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT( 923ae0f70fcSAdrien Destugues "Open" B_UTF8_ELLIPSIS, "Menu"), 924dd55ed1aSAlex Wilson new BMessage(OPEN_FILE_MESSAGE), 'O'); 9256af4da5dSStephan Aßmus menu->AddItem(item); 9266af4da5dSStephan Aßmus menu->AddSeparatorItem(); 927546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"), 928ae0f70fcSAdrien Destugues new BMessage(QUIT_MESSAGE), 'Q'); 9296af4da5dSStephan Aßmus menu->AddItem(item); 9306af4da5dSStephan Aßmus 9316af4da5dSStephan Aßmus fMenuBar->AddItem(menu); 9326af4da5dSStephan Aßmus } 9336af4da5dSStephan Aßmus 9346af4da5dSStephan Aßmus 9356af4da5dSStephan Aßmus void 9366af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry) 9376af4da5dSStephan Aßmus { 9386af4da5dSStephan Aßmus BPath path; 9396af4da5dSStephan Aßmus entry.GetPath(&path); 9406af4da5dSStephan Aßmus fOutputFolder->SetText(path.Path()); 9416af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 9426af4da5dSStephan Aßmus fOutputDir.SetTo(path.Path()); 9436af4da5dSStephan Aßmus } 9446af4da5dSStephan Aßmus 9456af4da5dSStephan Aßmus 946