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. 4dd55ed1aSAlex Wilson // Copyright 2010, 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 76af4da5dSStephan Aßmus #include "MediaConverterWindow.h" 86af4da5dSStephan Aßmus 96af4da5dSStephan Aßmus #include <stdio.h> 106af4da5dSStephan Aßmus #include <string.h> 116af4da5dSStephan Aßmus 126af4da5dSStephan Aßmus #include <Alert.h> 136af4da5dSStephan Aßmus #include <Application.h> 146af4da5dSStephan Aßmus #include <Box.h> 156af4da5dSStephan Aßmus #include <Button.h> 16ae0f70fcSAdrien Destugues #include <Catalog.h> 17dd55ed1aSAlex Wilson #include <ControlLook.h> 186af4da5dSStephan Aßmus #include <FilePanel.h> 19dd55ed1aSAlex Wilson #include <LayoutBuilder.h> 20ae0f70fcSAdrien Destugues #include <Locale.h> 216af4da5dSStephan Aßmus #include <Menu.h> 226af4da5dSStephan Aßmus #include <MenuBar.h> 236af4da5dSStephan Aßmus #include <MenuField.h> 246af4da5dSStephan Aßmus #include <MenuItem.h> 256af4da5dSStephan Aßmus #include <Path.h> 266af4da5dSStephan Aßmus #include <PopUpMenu.h> 276af4da5dSStephan Aßmus #include <Roster.h> 286af4da5dSStephan Aßmus #include <ScrollBar.h> 296af4da5dSStephan Aßmus #include <ScrollView.h> 306af4da5dSStephan Aßmus #include <Slider.h> 316af4da5dSStephan Aßmus #include <StringView.h> 326af4da5dSStephan Aßmus #include <TextControl.h> 336af4da5dSStephan Aßmus 34*b78760b9SPhilippe Saint-Pierre #include <storage/FindDirectory.h> 35*b78760b9SPhilippe Saint-Pierre 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 { 127*b78760b9SPhilippe Saint-Pierre BPath outputDir; 128*b78760b9SPhilippe Saint-Pierre if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK) 129*b78760b9SPhilippe Saint-Pierre outputDir.SetTo("/boot/home"); 130*b78760b9SPhilippe 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()); 172*b78760b9SPhilippe 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)); 432007d8a0cSSiarzhuk Zharski (new BAlert(B_TRANSLATE("Error"), errorString.String(), 433ae0f70fcSAdrien Destugues B_TRANSLATE("OK")))->Go(); 4346af4da5dSStephan Aßmus } 4356af4da5dSStephan Aßmus break; 436f086ada7SStephan Aßmus } 4376af4da5dSStephan Aßmus 4386af4da5dSStephan Aßmus case VIDEO_QUALITY_CHANGED_MESSAGE: 439f086ada7SStephan Aßmus { 440f086ada7SStephan Aßmus int32 value; 4416af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 442ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 443ae0f70fcSAdrien Destugues B_TRANSLATE("Video quality: %3d%%"), (int8)value); 4446af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 4456af4da5dSStephan Aßmus fVideoQuality = value; 4466af4da5dSStephan Aßmus break; 447f086ada7SStephan Aßmus } 4486af4da5dSStephan Aßmus 4496af4da5dSStephan Aßmus case AUDIO_QUALITY_CHANGED_MESSAGE: 450f086ada7SStephan Aßmus { 451f086ada7SStephan Aßmus int32 value; 4526af4da5dSStephan Aßmus msg->FindInt32("be:value", &value); 453ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 454ae0f70fcSAdrien Destugues B_TRANSLATE("Audio quality: %3d%%"), (int8)value); 4556af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 4566af4da5dSStephan Aßmus fAudioQuality = value; 4576af4da5dSStephan Aßmus break; 458f086ada7SStephan Aßmus } 4596af4da5dSStephan Aßmus 4606af4da5dSStephan Aßmus default: 4616af4da5dSStephan Aßmus BWindow::MessageReceived(msg); 4626af4da5dSStephan Aßmus } 4636af4da5dSStephan Aßmus } 4646af4da5dSStephan Aßmus 4656af4da5dSStephan Aßmus 4666af4da5dSStephan Aßmus bool 4676af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested() 4686af4da5dSStephan Aßmus { 4696af4da5dSStephan Aßmus if (!fConverting) { 4706af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(B_QUIT_REQUESTED); 4716af4da5dSStephan Aßmus return true; 4726af4da5dSStephan Aßmus } else if (!fCancelling) { 4736af4da5dSStephan Aßmus fCancelling = true; 474ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling")); 4756af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 4766af4da5dSStephan Aßmus } 4776af4da5dSStephan Aßmus return false; 4786af4da5dSStephan Aßmus } 4796af4da5dSStephan Aßmus 4806af4da5dSStephan Aßmus 4816af4da5dSStephan Aßmus // #pragma mark - 4826af4da5dSStephan Aßmus 4836af4da5dSStephan Aßmus 4846af4da5dSStephan Aßmus void 4856af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged() 4866af4da5dSStephan Aßmus { 4876af4da5dSStephan Aßmus _DestroyMenu(); 4886af4da5dSStephan Aßmus _CreateMenu(); 4896af4da5dSStephan Aßmus _UpdateLabels(); 4906af4da5dSStephan Aßmus BuildAudioVideoMenus(); 4916af4da5dSStephan Aßmus Lock(); 4926af4da5dSStephan Aßmus fInfoView->Invalidate(); 4936af4da5dSStephan Aßmus Unlock(); 4946af4da5dSStephan Aßmus } 4956af4da5dSStephan Aßmus 4966af4da5dSStephan Aßmus 4976af4da5dSStephan Aßmus void 4986af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus() 4996af4da5dSStephan Aßmus { 5006af4da5dSStephan Aßmus BMenu* menu = fAudioMenu->Menu(); 5016af4da5dSStephan Aßmus BMenuItem* item; 5026af4da5dSStephan Aßmus // clear out old audio codec menu items 5037730c846SStephan Aßmus while ((item = menu->RemoveItem(0L)) != NULL) 5046af4da5dSStephan Aßmus delete item; 5056af4da5dSStephan Aßmus 5066af4da5dSStephan Aßmus bool separator = true; 5076af4da5dSStephan Aßmus 5086af4da5dSStephan Aßmus // get selected file format 5097730c846SStephan Aßmus FileFormatMenuItem* ffmi 5107730c846SStephan Aßmus = (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked(); 5116af4da5dSStephan Aßmus media_file_format* mf_format = &(ffmi->fFileFormat); 5126af4da5dSStephan Aßmus 5136af4da5dSStephan Aßmus media_format format, outfmt; 5146af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5156af4da5dSStephan Aßmus media_codec_info codec_info; 5166af4da5dSStephan Aßmus int32 cookie = 0; 5176af4da5dSStephan Aßmus CodecMenuItem* cmi; 5186af4da5dSStephan Aßmus 5196af4da5dSStephan Aßmus // add available audio encoders to menu 5206af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5216af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5227730c846SStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) 5237730c846SStephan Aßmus == B_OK) { 5246af4da5dSStephan Aßmus if (separator) { 525ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 526546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"), 5276af4da5dSStephan Aßmus new BMessage(AUDIO_CODEC_SELECT_MESSAGE))); 5286af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5296af4da5dSStephan Aßmus separator = false; 5306af4da5dSStephan Aßmus } 5316af4da5dSStephan Aßmus 5326af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE); 5336af4da5dSStephan Aßmus menu->AddItem(cmi); 5346af4da5dSStephan Aßmus // reset media format struct 5356af4da5dSStephan Aßmus /* 5366af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5376af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5386af4da5dSStephan Aßmus */ 5396af4da5dSStephan Aßmus } 5406af4da5dSStephan Aßmus 5416af4da5dSStephan Aßmus // mark first audio encoder 5426af4da5dSStephan Aßmus item = menu->ItemAt(0); 5436af4da5dSStephan Aßmus if (item != NULL) { 5446af4da5dSStephan Aßmus fAudioMenu->SetEnabled(fEnabled); 5456af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(fEnabled); 5466af4da5dSStephan Aßmus item->SetMarked(true); 5476af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 5486af4da5dSStephan Aßmus } else { 549ae0f70fcSAdrien Destugues item = new BMenuItem( 550546208a5SOliver Tappe B_TRANSLATE_CONTEXT("None available", "Audio codecs"), 551ae0f70fcSAdrien Destugues NULL); 5526af4da5dSStephan Aßmus menu->AddItem(item); 5536af4da5dSStephan Aßmus item->SetMarked(true); 5546af4da5dSStephan Aßmus fAudioMenu->SetEnabled(false); 5556af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 5566af4da5dSStephan Aßmus } 5576af4da5dSStephan Aßmus 5586af4da5dSStephan Aßmus // clear out old video codec menu items 5596af4da5dSStephan Aßmus menu = fVideoMenu->Menu(); 5607730c846SStephan Aßmus while ((item = menu->RemoveItem(0L)) != NULL) 5616af4da5dSStephan Aßmus delete item; 5626af4da5dSStephan Aßmus 5636af4da5dSStephan Aßmus separator = true; 5646af4da5dSStephan Aßmus 5656af4da5dSStephan Aßmus // construct a generic video format. Some of these parameters 5666af4da5dSStephan Aßmus // seem silly, but are needed for R4.5.x, which is more picky 5676af4da5dSStephan Aßmus // than subsequent BeOS releases will be. 5686af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5696af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_VIDEO; 5706af4da5dSStephan Aßmus format.u.raw_video.last_active = (uint32)(240 - 1); 5716af4da5dSStephan Aßmus format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT; 5726af4da5dSStephan Aßmus format.u.raw_video.display.format = B_RGB32; 5736af4da5dSStephan Aßmus format.u.raw_video.display.line_width = (int32)320; 5746af4da5dSStephan Aßmus format.u.raw_video.display.line_count = (int32)240; 5756af4da5dSStephan Aßmus format.u.raw_video.display.bytes_per_row = 4 * 320; 5766af4da5dSStephan Aßmus 5776af4da5dSStephan Aßmus // add available video encoders to menu 5786af4da5dSStephan Aßmus cookie = 0; 5796af4da5dSStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) == B_OK) { 5806af4da5dSStephan Aßmus if (separator) { 581ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 582546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No video", "Video codecs list"), 5836af4da5dSStephan Aßmus new BMessage(VIDEO_CODEC_SELECT_MESSAGE))); 5846af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5856af4da5dSStephan Aßmus separator = false; 5866af4da5dSStephan Aßmus } 5876af4da5dSStephan Aßmus 5886af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE); 5896af4da5dSStephan Aßmus menu->AddItem(cmi); 5906af4da5dSStephan Aßmus } 5916af4da5dSStephan Aßmus 5926af4da5dSStephan Aßmus // mark first video encoder 5936af4da5dSStephan Aßmus item = menu->ItemAt(0); 5946af4da5dSStephan Aßmus if (item != NULL) { 5956af4da5dSStephan Aßmus fVideoMenu->SetEnabled(fEnabled); 5966af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(fEnabled); 5976af4da5dSStephan Aßmus item->SetMarked(true); 5986af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 5996af4da5dSStephan Aßmus } else { 600ae0f70fcSAdrien Destugues item = new BMenuItem( 601546208a5SOliver Tappe B_TRANSLATE_CONTEXT("None available", "Video codecs"), 602ae0f70fcSAdrien Destugues NULL); 6036af4da5dSStephan Aßmus menu->AddItem(item); 6046af4da5dSStephan Aßmus item->SetMarked(true); 6056af4da5dSStephan Aßmus fVideoMenu->SetEnabled(false); 6066af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 6076af4da5dSStephan Aßmus } 6086af4da5dSStephan Aßmus } 6096af4da5dSStephan Aßmus 6106af4da5dSStephan Aßmus void 6116af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format, 6126af4da5dSStephan Aßmus media_codec_info** audio, media_codec_info** video) 6136af4da5dSStephan Aßmus { 6146af4da5dSStephan Aßmus *audio = NULL; 6156af4da5dSStephan Aßmus *video = NULL; 6166af4da5dSStephan Aßmus *format = NULL; 6176af4da5dSStephan Aßmus 6186af4da5dSStephan Aßmus FileFormatMenuItem *formatItem = 6196af4da5dSStephan Aßmus dynamic_cast<FileFormatMenuItem *>(fFormatMenu->Menu()->FindMarked()); 6206af4da5dSStephan Aßmus if (formatItem != NULL) { 6216af4da5dSStephan Aßmus *format = &(formatItem->fFileFormat); 6226af4da5dSStephan Aßmus } 6236af4da5dSStephan Aßmus 6246af4da5dSStephan Aßmus *audio = *video = NULL; 6256af4da5dSStephan Aßmus CodecMenuItem *codecItem = 6266af4da5dSStephan Aßmus dynamic_cast<CodecMenuItem *>(fAudioMenu->Menu()->FindMarked()); 6276af4da5dSStephan Aßmus if (codecItem != NULL) { 6286af4da5dSStephan Aßmus *audio = &(codecItem->fCodecInfo); 6296af4da5dSStephan Aßmus } 6306af4da5dSStephan Aßmus 6316af4da5dSStephan Aßmus codecItem = dynamic_cast<CodecMenuItem *>(fVideoMenu->Menu()->FindMarked()); 6326af4da5dSStephan Aßmus if (codecItem != NULL) { 6336af4da5dSStephan Aßmus *video = &(codecItem->fCodecInfo); 6346af4da5dSStephan Aßmus } 6356af4da5dSStephan Aßmus } 6366af4da5dSStephan Aßmus 6376af4da5dSStephan Aßmus 6386af4da5dSStephan Aßmus void 6396af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu() 6406af4da5dSStephan Aßmus { 6416af4da5dSStephan Aßmus BMenu *menu = fFormatMenu->Menu(); 6426af4da5dSStephan Aßmus BMenuItem *item; 6436af4da5dSStephan Aßmus // clear out old format menu items 6446af4da5dSStephan Aßmus while ((item = menu->RemoveItem((int32)0)) != NULL) { 6456af4da5dSStephan Aßmus delete item; 6466af4da5dSStephan Aßmus } 6476af4da5dSStephan Aßmus 6486af4da5dSStephan Aßmus // add menu items for each file format 6496af4da5dSStephan Aßmus media_file_format mfi; 6506af4da5dSStephan Aßmus int32 cookie = 0; 6516af4da5dSStephan Aßmus FileFormatMenuItem *ff_item; 6526af4da5dSStephan Aßmus while (get_next_file_format(&cookie, &mfi) == B_OK) { 6536af4da5dSStephan Aßmus ff_item = new FileFormatMenuItem(&mfi); 6546af4da5dSStephan Aßmus menu->AddItem(ff_item); 6556af4da5dSStephan Aßmus } 6566af4da5dSStephan Aßmus 6576af4da5dSStephan Aßmus // mark first item 6586af4da5dSStephan Aßmus item = menu->ItemAt(0); 6596af4da5dSStephan Aßmus if (item != NULL) { 6606af4da5dSStephan Aßmus item->SetMarked(true); 6616af4da5dSStephan Aßmus ((BInvoker *)item)->Invoke(); 6626af4da5dSStephan Aßmus } 6636af4da5dSStephan Aßmus } 6646af4da5dSStephan Aßmus 665dd55ed1aSAlex Wilson 6666af4da5dSStephan Aßmus void 6676af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char *message) 6686af4da5dSStephan Aßmus { 669dd55ed1aSAlex Wilson fFileStatus->SetText(message); 6706af4da5dSStephan Aßmus } 6716af4da5dSStephan Aßmus 672dd55ed1aSAlex Wilson 6736af4da5dSStephan Aßmus void 6746af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char *message) 6756af4da5dSStephan Aßmus { 676dd55ed1aSAlex Wilson fStatus->SetText(message); 6776af4da5dSStephan Aßmus } 6786af4da5dSStephan Aßmus 6796af4da5dSStephan Aßmus 6806af4da5dSStephan Aßmus // #pragma mark - 6816af4da5dSStephan Aßmus 6826af4da5dSStephan Aßmus 6831c992a52SStephan Aßmus bool 6846af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref) 6856af4da5dSStephan Aßmus { 6861c992a52SStephan Aßmus if (!fListView->AddMediaItem(file, ref)) 6871c992a52SStephan Aßmus return false; 6886af4da5dSStephan Aßmus 6896af4da5dSStephan Aßmus if (!fOutputDirSpecified) { 6906af4da5dSStephan Aßmus BEntry entry(&ref); 6916af4da5dSStephan Aßmus entry.GetParent(&entry); 6926af4da5dSStephan Aßmus _SetOutputFolder(entry); 6936af4da5dSStephan Aßmus } 6941c992a52SStephan Aßmus 6951c992a52SStephan Aßmus return true; 6966af4da5dSStephan Aßmus } 6976af4da5dSStephan Aßmus 6986af4da5dSStephan Aßmus 6996af4da5dSStephan Aßmus void 7006af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index) 7016af4da5dSStephan Aßmus { 7026af4da5dSStephan Aßmus delete fListView->RemoveItem(index); 7036af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7046af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 7056af4da5dSStephan Aßmus } 7066af4da5dSStephan Aßmus 7076af4da5dSStephan Aßmus 7086af4da5dSStephan Aßmus int32 7096af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles() 7106af4da5dSStephan Aßmus { 7116af4da5dSStephan Aßmus return fListView->CountItems(); 7126af4da5dSStephan Aßmus } 7136af4da5dSStephan Aßmus 7146af4da5dSStephan Aßmus 7156af4da5dSStephan Aßmus status_t 7166af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file, 7176af4da5dSStephan Aßmus entry_ref* ref) 7186af4da5dSStephan Aßmus { 7196af4da5dSStephan Aßmus MediaFileListItem* item = dynamic_cast<MediaFileListItem*>( 7206af4da5dSStephan Aßmus fListView->ItemAt(index)); 7216af4da5dSStephan Aßmus if (item != NULL) { 7226af4da5dSStephan Aßmus *_file = item->fMediaFile; 7236af4da5dSStephan Aßmus *ref = item->fRef; 7246af4da5dSStephan Aßmus return B_OK; 7256af4da5dSStephan Aßmus } else { 7266af4da5dSStephan Aßmus return B_ERROR; 7276af4da5dSStephan Aßmus } 7286af4da5dSStephan Aßmus } 7296af4da5dSStephan Aßmus 7306af4da5dSStephan Aßmus 7316af4da5dSStephan Aßmus void 7326af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged() 7336af4da5dSStephan Aßmus { 7346af4da5dSStephan Aßmus int32 selected = fListView->CurrentSelection(); 7356af4da5dSStephan Aßmus BMediaFile* file = NULL; 7366af4da5dSStephan Aßmus entry_ref ref; 7377730c846SStephan Aßmus bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK; 7386af4da5dSStephan Aßmus 7396af4da5dSStephan Aßmus fPreviewButton->SetEnabled(enabled); 7406af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(enabled); 7416af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(enabled); 7426af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7436af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7446af4da5dSStephan Aßmus 7457730c846SStephan Aßmus BString duration; 7467730c846SStephan Aßmus if (enabled) { 7477730c846SStephan Aßmus fInfoView->Update(file, &ref); 7486af4da5dSStephan Aßmus // HACK: get the fInfoView to update the duration "synchronously" 7496af4da5dSStephan Aßmus UpdateIfNeeded(); 7507730c846SStephan Aßmus duration << fInfoView->Duration() / 1000; 7517730c846SStephan Aßmus } else 7527730c846SStephan Aßmus duration = "0"; 7536af4da5dSStephan Aßmus 7546af4da5dSStephan Aßmus // update duration text controls 7556af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7566af4da5dSStephan Aßmus fEndDurationTC->SetText(duration.String()); 7576af4da5dSStephan Aßmus } 7586af4da5dSStephan Aßmus 7596af4da5dSStephan Aßmus 7606af4da5dSStephan Aßmus // #pragma mark - 7616af4da5dSStephan Aßmus 7626af4da5dSStephan Aßmus 7636af4da5dSStephan Aßmus void 7646af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled) 7656af4da5dSStephan Aßmus { 7666af4da5dSStephan Aßmus fConvertButton->SetEnabled(convertEnabled); 7676af4da5dSStephan Aßmus if (enabled == fEnabled) 7686af4da5dSStephan Aßmus return; 7696af4da5dSStephan Aßmus 7706af4da5dSStephan Aßmus fFormatMenu->SetEnabled(enabled); 7716af4da5dSStephan Aßmus fAudioMenu->SetEnabled(enabled); 7726af4da5dSStephan Aßmus fVideoMenu->SetEnabled(enabled); 7736af4da5dSStephan Aßmus fListView->SetEnabled(enabled); 7746af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7756af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7766af4da5dSStephan Aßmus 7776af4da5dSStephan Aßmus fEnabled = enabled; 7786af4da5dSStephan Aßmus } 7796af4da5dSStephan Aßmus 7806af4da5dSStephan Aßmus 7816af4da5dSStephan Aßmus bool 7826af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled() 7836af4da5dSStephan Aßmus { 7846af4da5dSStephan Aßmus return fEnabled; 7856af4da5dSStephan Aßmus } 7866af4da5dSStephan Aßmus 7876af4da5dSStephan Aßmus 7886af4da5dSStephan Aßmus const char* 7896af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const 7906af4da5dSStephan Aßmus { 7916af4da5dSStephan Aßmus return fStartDurationTC->Text(); 7926af4da5dSStephan Aßmus } 7936af4da5dSStephan Aßmus 7946af4da5dSStephan Aßmus 7956af4da5dSStephan Aßmus const char* 7966af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const 7976af4da5dSStephan Aßmus { 7986af4da5dSStephan Aßmus return fEndDurationTC->Text(); 7996af4da5dSStephan Aßmus } 8006af4da5dSStephan Aßmus 8016af4da5dSStephan Aßmus 8026af4da5dSStephan Aßmus BDirectory 8036af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const 8046af4da5dSStephan Aßmus { 8056af4da5dSStephan Aßmus return fOutputDir; 8066af4da5dSStephan Aßmus } 8076af4da5dSStephan Aßmus 8086af4da5dSStephan Aßmus 8096af4da5dSStephan Aßmus void 8106af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label) 8116af4da5dSStephan Aßmus { 8126af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(label); 8136af4da5dSStephan Aßmus } 8146af4da5dSStephan Aßmus 8156af4da5dSStephan Aßmus 8166af4da5dSStephan Aßmus void 8176af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label) 8186af4da5dSStephan Aßmus { 8196af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(label); 8206af4da5dSStephan Aßmus } 8216af4da5dSStephan Aßmus 8226af4da5dSStephan Aßmus 8236af4da5dSStephan Aßmus // #pragma mark - 8246af4da5dSStephan Aßmus 8256af4da5dSStephan Aßmus 8266af4da5dSStephan Aßmus void 8276af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels() 8286af4da5dSStephan Aßmus { 829dd55ed1aSAlex Wilson if (fSourcesBox != NULL) { 830ae0f70fcSAdrien Destugues fSourcesBox->SetLabel(B_TRANSLATE("Source files")); 831dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fSourcesBox); 832dd55ed1aSAlex Wilson } 8336af4da5dSStephan Aßmus 834dd55ed1aSAlex Wilson if (fInfoBox != NULL) 835ae0f70fcSAdrien Destugues fInfoBox->SetLabel(B_TRANSLATE("File details")); 8366af4da5dSStephan Aßmus 837dd55ed1aSAlex Wilson if (fOutputBox != NULL) { 838ae0f70fcSAdrien Destugues fOutputBox->SetLabel(B_TRANSLATE("Output format")); 839dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fOutputBox); 840dd55ed1aSAlex Wilson } 8416af4da5dSStephan Aßmus 842dd55ed1aSAlex Wilson if (fConvertButton != NULL) 843ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 8446af4da5dSStephan Aßmus 845dd55ed1aSAlex Wilson if (fPreviewButton != NULL) 846ae0f70fcSAdrien Destugues fPreviewButton->SetLabel(B_TRANSLATE("Preview")); 8476af4da5dSStephan Aßmus 848dd55ed1aSAlex Wilson if (fDestButton != NULL) 849ae0f70fcSAdrien Destugues fDestButton->SetLabel(B_TRANSLATE("Output folder")); 8506af4da5dSStephan Aßmus 8516af4da5dSStephan Aßmus if (fVideoQualitySlider != NULL) { 852dd55ed1aSAlex Wilson char buffer[40]; 853ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"), 854f086ada7SStephan Aßmus (int8)fVideoQuality); 8556af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 856ae0f70fcSAdrien Destugues fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 857ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8586af4da5dSStephan Aßmus } 8596af4da5dSStephan Aßmus 8606af4da5dSStephan Aßmus if (fAudioQualitySlider != NULL) { 861dd55ed1aSAlex Wilson char buffer[40]; 862ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"), 863f086ada7SStephan Aßmus (int8)fAudioQuality); 8646af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 865ae0f70fcSAdrien Destugues fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 866ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 8676af4da5dSStephan Aßmus } 8686af4da5dSStephan Aßmus 869dd55ed1aSAlex Wilson if (fStartDurationTC != NULL) 870ae0f70fcSAdrien Destugues fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: ")); 871dd55ed1aSAlex Wilson 872dd55ed1aSAlex Wilson if (fEndDurationTC != NULL) 873ae0f70fcSAdrien Destugues fEndDurationTC->SetLabel(B_TRANSLATE("End [ms]: ")); 8746af4da5dSStephan Aßmus 8756af4da5dSStephan Aßmus if (fFormatMenu != NULL) 876ae0f70fcSAdrien Destugues fFormatMenu->SetLabel(B_TRANSLATE("File format:")); 877dd55ed1aSAlex Wilson 8786af4da5dSStephan Aßmus if (fAudioMenu != NULL) 879ae0f70fcSAdrien Destugues fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:")); 880dd55ed1aSAlex Wilson 8816af4da5dSStephan Aßmus if (fVideoMenu != NULL) 882ae0f70fcSAdrien Destugues fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:")); 8836af4da5dSStephan Aßmus 884ae0f70fcSAdrien Destugues SetFileMessage(B_TRANSLATE("Drop media files onto this window")); 8856af4da5dSStephan Aßmus } 8866af4da5dSStephan Aßmus 8876af4da5dSStephan Aßmus 8886af4da5dSStephan Aßmus void 889dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box) 890dd55ed1aSAlex Wilson { 891dd55ed1aSAlex Wilson BTwoDimensionalLayout* layout 892dd55ed1aSAlex Wilson = dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout()); 8937730c846SStephan Aßmus if (layout != NULL) { 894dd55ed1aSAlex Wilson float padding = be_control_look->DefaultItemSpacing(); 895dd55ed1aSAlex Wilson layout->SetInsets(padding, box->TopBorderOffset() + padding, padding, 896dd55ed1aSAlex Wilson padding); 897dd55ed1aSAlex Wilson } 898dd55ed1aSAlex Wilson } 899dd55ed1aSAlex Wilson 900dd55ed1aSAlex Wilson 901dd55ed1aSAlex Wilson void 9026af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu() 9036af4da5dSStephan Aßmus { 9046af4da5dSStephan Aßmus BMenu* Menu; 9056af4da5dSStephan Aßmus 9066af4da5dSStephan Aßmus while ((Menu = fMenuBar->SubmenuAt(0)) != NULL) { 9076af4da5dSStephan Aßmus fMenuBar->RemoveItem(Menu); 9086af4da5dSStephan Aßmus delete Menu; 9096af4da5dSStephan Aßmus } 9106af4da5dSStephan Aßmus } 9116af4da5dSStephan Aßmus 9126af4da5dSStephan Aßmus 9136af4da5dSStephan Aßmus void 9146af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu() 9156af4da5dSStephan Aßmus { 9166af4da5dSStephan Aßmus BMenuItem* item; 9176af4da5dSStephan Aßmus BMenu* menu; 9186af4da5dSStephan Aßmus 919546208a5SOliver Tappe menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu")); 920546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT( 921ae0f70fcSAdrien Destugues "Open" B_UTF8_ELLIPSIS, "Menu"), 922dd55ed1aSAlex Wilson new BMessage(OPEN_FILE_MESSAGE), 'O'); 9236af4da5dSStephan Aßmus menu->AddItem(item); 9246af4da5dSStephan Aßmus menu->AddSeparatorItem(); 925546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"), 926ae0f70fcSAdrien Destugues new BMessage(QUIT_MESSAGE), 'Q'); 9276af4da5dSStephan Aßmus menu->AddItem(item); 9286af4da5dSStephan Aßmus 9296af4da5dSStephan Aßmus fMenuBar->AddItem(menu); 9306af4da5dSStephan Aßmus } 9316af4da5dSStephan Aßmus 9326af4da5dSStephan Aßmus 9336af4da5dSStephan Aßmus void 9346af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry) 9356af4da5dSStephan Aßmus { 9366af4da5dSStephan Aßmus BPath path; 9376af4da5dSStephan Aßmus entry.GetPath(&path); 9386af4da5dSStephan Aßmus fOutputFolder->SetText(path.Path()); 9396af4da5dSStephan Aßmus fOutputFolder->ResizeToPreferred(); 9406af4da5dSStephan Aßmus fOutputDir.SetTo(path.Path()); 9416af4da5dSStephan Aßmus } 9426af4da5dSStephan Aßmus 9436af4da5dSStephan Aßmus 944