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 46a42b9a43SJohn Scipione static const unsigned int kMinSourceWidth = 12; 47f29499e7SJohn Scipione static const unsigned int kQualitySliderWidth = 28; 48a42b9a43SJohn Scipione static const unsigned int kDurationWidth = 10; 49a42b9a43SJohn Scipione 50a42b9a43SJohn Scipione 516af4da5dSStephan Aßmus // #pragma mark - DirectoryFilter 526af4da5dSStephan Aßmus 536af4da5dSStephan Aßmus 5460b6f368SStephan Aßmus class DirectoryFilter : public BRefFilter { 556af4da5dSStephan Aßmus public: 566af4da5dSStephan Aßmus DirectoryFilter() {}; 576af4da5dSStephan Aßmus virtual bool Filter(const entry_ref* ref, 5860b6f368SStephan Aßmus BNode* node, struct stat_beos* st, const char* filetype) 596af4da5dSStephan Aßmus { 606af4da5dSStephan Aßmus return node->IsDirectory(); 616af4da5dSStephan Aßmus } 626af4da5dSStephan Aßmus }; 636af4da5dSStephan Aßmus 646af4da5dSStephan Aßmus 656af4da5dSStephan Aßmus // #pragma mark - FileFormatMenuItem 666af4da5dSStephan Aßmus 676af4da5dSStephan Aßmus 686af4da5dSStephan Aßmus class FileFormatMenuItem : public BMenuItem { 696af4da5dSStephan Aßmus public: 706af4da5dSStephan Aßmus FileFormatMenuItem(media_file_format* format); 716af4da5dSStephan Aßmus virtual ~FileFormatMenuItem(); 726af4da5dSStephan Aßmus 736af4da5dSStephan Aßmus media_file_format fFileFormat; 746af4da5dSStephan Aßmus }; 756af4da5dSStephan Aßmus 766af4da5dSStephan Aßmus 776af4da5dSStephan Aßmus FileFormatMenuItem::FileFormatMenuItem(media_file_format* format) 78dd55ed1aSAlex Wilson : 79dd55ed1aSAlex Wilson BMenuItem(format->pretty_name, new BMessage(FORMAT_SELECT_MESSAGE)) 806af4da5dSStephan Aßmus { 816af4da5dSStephan Aßmus memcpy(&fFileFormat, format, sizeof(fFileFormat)); 826af4da5dSStephan Aßmus } 836af4da5dSStephan Aßmus 846af4da5dSStephan Aßmus 856af4da5dSStephan Aßmus FileFormatMenuItem::~FileFormatMenuItem() 866af4da5dSStephan Aßmus { 876af4da5dSStephan Aßmus } 886af4da5dSStephan Aßmus 896af4da5dSStephan Aßmus 906af4da5dSStephan Aßmus // #pragma mark - CodecMenuItem 916af4da5dSStephan Aßmus 926af4da5dSStephan Aßmus 936af4da5dSStephan Aßmus class CodecMenuItem : public BMenuItem { 946af4da5dSStephan Aßmus public: 95*0e68593eSJohn Scipione CodecMenuItem(media_codec_info* ci, uint32 message_type); 966af4da5dSStephan Aßmus virtual ~CodecMenuItem(); 976af4da5dSStephan Aßmus 986af4da5dSStephan Aßmus media_codec_info fCodecInfo; 996af4da5dSStephan Aßmus }; 1006af4da5dSStephan Aßmus 1016af4da5dSStephan Aßmus 102*0e68593eSJohn Scipione CodecMenuItem::CodecMenuItem(media_codec_info* ci, uint32 message_type) 103dd55ed1aSAlex Wilson : 104*0e68593eSJohn Scipione BMenuItem(ci->pretty_name, new BMessage(message_type)) 1056af4da5dSStephan Aßmus { 1066af4da5dSStephan Aßmus memcpy(&fCodecInfo, ci, sizeof(fCodecInfo)); 1076af4da5dSStephan Aßmus } 1086af4da5dSStephan Aßmus 1096af4da5dSStephan Aßmus 1106af4da5dSStephan Aßmus CodecMenuItem::~CodecMenuItem() 1116af4da5dSStephan Aßmus { 1126af4da5dSStephan Aßmus } 1136af4da5dSStephan Aßmus 1146af4da5dSStephan Aßmus 115a42b9a43SJohn Scipione // #pragma mark - OutputBox 116a42b9a43SJohn Scipione 117a42b9a43SJohn Scipione 118a42b9a43SJohn Scipione class OutputBox : public BBox { 119a42b9a43SJohn Scipione public: 120a42b9a43SJohn Scipione OutputBox(border_style border, BView* child); 121a42b9a43SJohn Scipione virtual void FrameResized(float width, float height) 122a42b9a43SJohn Scipione { 123a42b9a43SJohn Scipione MediaConverterWindow* window 124a42b9a43SJohn Scipione = dynamic_cast<MediaConverterWindow*>(Window()); 125a42b9a43SJohn Scipione if (window != NULL) 126a42b9a43SJohn Scipione window->TruncateOutputFolderPath(); 127a42b9a43SJohn Scipione BBox::FrameResized(width, height); 128a42b9a43SJohn Scipione } 129a42b9a43SJohn Scipione }; 130a42b9a43SJohn Scipione 131a42b9a43SJohn Scipione 132a42b9a43SJohn Scipione OutputBox::OutputBox(border_style border, BView* child) 133a42b9a43SJohn Scipione : 134a42b9a43SJohn Scipione BBox(border, child) 135a42b9a43SJohn Scipione { 136a42b9a43SJohn Scipione } 137a42b9a43SJohn Scipione 138a42b9a43SJohn Scipione 1396af4da5dSStephan Aßmus // #pragma mark - MediaConverterWindow 1406af4da5dSStephan Aßmus 1416af4da5dSStephan Aßmus 1426af4da5dSStephan Aßmus MediaConverterWindow::MediaConverterWindow(BRect frame) 143dd55ed1aSAlex Wilson : 144*0e68593eSJohn Scipione BWindow(frame, B_TRANSLATE_SYSTEM_NAME("MediaConverter"), 145*0e68593eSJohn Scipione B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_NOT_ZOOMABLE 146*0e68593eSJohn Scipione | B_NOT_V_RESIZABLE | B_ASYNCHRONOUS_CONTROLS 147*0e68593eSJohn Scipione | B_AUTO_UPDATE_SIZE_LIMITS), 148dd55ed1aSAlex Wilson fVideoQuality(75), 149dd55ed1aSAlex Wilson fAudioQuality(75), 150dd55ed1aSAlex Wilson fSaveFilePanel(NULL), 151dd55ed1aSAlex Wilson fOpenFilePanel(NULL), 152dd55ed1aSAlex Wilson fOutputDirSpecified(false), 153dd55ed1aSAlex Wilson fEnabled(true), 154dd55ed1aSAlex Wilson fConverting(false), 155dd55ed1aSAlex Wilson fCancelling(false) 1566af4da5dSStephan Aßmus { 157b78760b9SPhilippe Saint-Pierre BPath outputDir; 158b78760b9SPhilippe Saint-Pierre if (find_directory(B_USER_DIRECTORY, &outputDir) != B_OK) 159b78760b9SPhilippe Saint-Pierre outputDir.SetTo("/boot/home"); 160b78760b9SPhilippe Saint-Pierre fOutputDir.SetTo(outputDir.Path()); 1616af4da5dSStephan Aßmus 162dd55ed1aSAlex Wilson fMenuBar = new BMenuBar("menubar"); 1636af4da5dSStephan Aßmus _CreateMenu(); 1646af4da5dSStephan Aßmus 165a9adf1a6SJohn Scipione float padding = be_control_look->DefaultItemSpacing(); 166a9adf1a6SJohn Scipione 167dd55ed1aSAlex Wilson fListView = new MediaFileListView(); 168a42b9a43SJohn Scipione fListView->SetExplicitMinSize(BSize(padding * kMinSourceWidth, B_SIZE_UNSET)); 169dd55ed1aSAlex Wilson BScrollView* scroller = new BScrollView(NULL, fListView, 0, false, true); 1706af4da5dSStephan Aßmus 1716af4da5dSStephan Aßmus // file list view box 172dd55ed1aSAlex Wilson fSourcesBox = new BBox(B_FANCY_BORDER, scroller); 173dd55ed1aSAlex Wilson fSourcesBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0)); 174a42b9a43SJohn Scipione // fSourcesBox's layout adjusted in _UpdateLabels 1756af4da5dSStephan Aßmus 176a42b9a43SJohn Scipione // info box 177dd55ed1aSAlex Wilson fInfoView = new MediaFileInfoView(); 178a42b9a43SJohn Scipione fInfoView->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 179a42b9a43SJohn Scipione B_ALIGN_VERTICAL_UNSET)); 180dd55ed1aSAlex Wilson fInfoBox = new BBox(B_FANCY_BORDER, fInfoView); 1817730c846SStephan Aßmus 182a42b9a43SJohn Scipione // output menu fields 183ae0f70fcSAdrien Destugues fFormatMenu = new BMenuField(NULL, B_TRANSLATE("File format:"), 184ae0f70fcSAdrien Destugues new BPopUpMenu("")); 185ae0f70fcSAdrien Destugues fAudioMenu = new BMenuField(NULL, B_TRANSLATE("Audio encoding:"), 186ae0f70fcSAdrien Destugues new BPopUpMenu("")); 187ae0f70fcSAdrien Destugues fVideoMenu = new BMenuField(NULL, B_TRANSLATE("Video encoding:"), 188ae0f70fcSAdrien Destugues new BPopUpMenu("")); 1896af4da5dSStephan Aßmus 1906af4da5dSStephan Aßmus // output folder 191ae0f70fcSAdrien Destugues fDestButton = new BButton(B_TRANSLATE("Output folder"), 192dd55ed1aSAlex Wilson new BMessage(OUTPUT_FOLDER_MESSAGE)); 193dd55ed1aSAlex Wilson BAlignment labelAlignment(be_control_look->DefaultLabelAlignment()); 194b78760b9SPhilippe Saint-Pierre fOutputFolder = new BStringView(NULL, outputDir.Path()); 195dd55ed1aSAlex Wilson fOutputFolder->SetExplicitAlignment(labelAlignment); 1966af4da5dSStephan Aßmus 1976af4da5dSStephan Aßmus // start/end duration 1984d891825SJohn Scipione fStartDurationTC = new BTextControl(NULL, "0", NULL); 199a42b9a43SJohn Scipione BLayoutItem* startDuration = fStartDurationTC->CreateTextViewLayoutItem(); 200a42b9a43SJohn Scipione startDuration->SetExplicitSize(BSize(padding * kDurationWidth, B_SIZE_UNSET)); 201a42b9a43SJohn Scipione startDuration->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, 202a42b9a43SJohn Scipione B_ALIGN_VERTICAL_CENTER)); 2034d891825SJohn Scipione fEndDurationTC = new BTextControl(NULL, "0", NULL); 204a42b9a43SJohn Scipione BLayoutItem* endDuration = fEndDurationTC->CreateTextViewLayoutItem(); 205a42b9a43SJohn Scipione endDuration->SetExplicitSize(BSize(padding * kDurationWidth, B_SIZE_UNSET)); 206a42b9a43SJohn Scipione endDuration->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, 207a42b9a43SJohn Scipione B_ALIGN_VERTICAL_CENTER)); 2086af4da5dSStephan Aßmus 209a42b9a43SJohn Scipione // video quality 210dd55ed1aSAlex Wilson fVideoQualitySlider = new BSlider("VSlider", "" , 211dd55ed1aSAlex Wilson new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 21253bb96c5SJohn Scipione fVideoQualitySlider->SetModificationMessage( 21353bb96c5SJohn Scipione new BMessage(VIDEO_QUALITY_CHANGED_MESSAGE)); 2146af4da5dSStephan Aßmus fVideoQualitySlider->SetValue(fVideoQuality); 2156af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 216f29499e7SJohn Scipione fVideoQualitySlider->SetExplicitSize(BSize(padding * kQualitySliderWidth, 217f29499e7SJohn Scipione B_SIZE_UNSET)); 2186af4da5dSStephan Aßmus 219a42b9a43SJohn Scipione // audio quality 220dd55ed1aSAlex Wilson fAudioQualitySlider = new BSlider("ASlider", "" , 221dd55ed1aSAlex Wilson new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE), 1, 100, B_HORIZONTAL); 22253bb96c5SJohn Scipione fAudioQualitySlider->SetModificationMessage( 22353bb96c5SJohn Scipione new BMessage(AUDIO_QUALITY_CHANGED_MESSAGE)); 2246af4da5dSStephan Aßmus fAudioQualitySlider->SetValue(fAudioQuality); 2256af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 226f29499e7SJohn Scipione fAudioQualitySlider->SetExplicitSize(BSize(padding * kQualitySliderWidth, 227f29499e7SJohn Scipione B_SIZE_UNSET)); 228dd55ed1aSAlex Wilson 229a42b9a43SJohn Scipione // output format box 230a42b9a43SJohn Scipione BView* outputGrid = BLayoutBuilder::Grid<>() 23183010212SJohn Scipione .Add(fFormatMenu->CreateLabelLayoutItem(), 0, 0) 23283010212SJohn Scipione .Add(fFormatMenu->CreateMenuBarLayoutItem(), 1, 0) 23383010212SJohn Scipione .Add(fAudioMenu->CreateLabelLayoutItem(), 0, 1) 23483010212SJohn Scipione .Add(fAudioMenu->CreateMenuBarLayoutItem(), 1, 1) 23583010212SJohn Scipione .Add(fVideoMenu->CreateLabelLayoutItem(), 0, 2) 23683010212SJohn Scipione .Add(fVideoMenu->CreateMenuBarLayoutItem(), 1, 2) 237dd55ed1aSAlex Wilson .Add(fDestButton, 0, 3) 238dd55ed1aSAlex Wilson .Add(fOutputFolder, 1, 3) 23983010212SJohn Scipione .Add(fStartDurationTC->CreateLabelLayoutItem(), 0, 4) 240a42b9a43SJohn Scipione .Add(startDuration, 1, 4) 24183010212SJohn Scipione .Add(fEndDurationTC->CreateLabelLayoutItem(), 0, 5) 242a42b9a43SJohn Scipione .Add(endDuration, 1, 5) 243dd55ed1aSAlex Wilson .Add(fVideoQualitySlider, 0, 6, 2, 1) 244a42b9a43SJohn Scipione .Add(fAudioQualitySlider, 0, 7, 2, 1) 245a42b9a43SJohn Scipione .View(); 246a42b9a43SJohn Scipione outputGrid->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, 247a42b9a43SJohn Scipione B_ALIGN_USE_FULL_HEIGHT)); 248a42b9a43SJohn Scipione fOutputBox = new OutputBox(B_FANCY_BORDER, outputGrid); 249a42b9a43SJohn Scipione fOutputBox->SetLayout(new BGroupLayout(B_HORIZONTAL, 0)); 250a42b9a43SJohn Scipione // fOutputBox's layout adjusted in _UpdateLabels 2516af4da5dSStephan Aßmus 2526af4da5dSStephan Aßmus // buttons 253ae0f70fcSAdrien Destugues fPreviewButton = new BButton(B_TRANSLATE("Preview"), 254dd55ed1aSAlex Wilson new BMessage(PREVIEW_MESSAGE)); 2556af4da5dSStephan Aßmus fPreviewButton->SetEnabled(false); 2566af4da5dSStephan Aßmus 257ae0f70fcSAdrien Destugues fConvertButton = new BButton(B_TRANSLATE("Convert"), 258dd55ed1aSAlex Wilson new BMessage(CONVERT_BUTTON_MESSAGE)); 2596af4da5dSStephan Aßmus 260dd55ed1aSAlex Wilson // Status views 261dd55ed1aSAlex Wilson fStatus = new BStringView(NULL, NULL); 262dd55ed1aSAlex Wilson fStatus->SetExplicitAlignment(labelAlignment); 263dd55ed1aSAlex Wilson fFileStatus = new BStringView(NULL, NULL); 264dd55ed1aSAlex Wilson fFileStatus->SetExplicitAlignment(labelAlignment); 2656af4da5dSStephan Aßmus 2666af4da5dSStephan Aßmus SetStatusMessage(""); 2676af4da5dSStephan Aßmus _UpdateLabels(); 2686af4da5dSStephan Aßmus 269dd55ed1aSAlex Wilson BLayoutBuilder::Group<>(this, B_VERTICAL, 0) 270dd55ed1aSAlex Wilson .SetInsets(0, 0, 0, 0) 271dd55ed1aSAlex Wilson .Add(fMenuBar) 2727730c846SStephan Aßmus .AddSplit(B_HORIZONTAL, padding / 2) 273dd55ed1aSAlex Wilson .SetInsets(padding, padding, padding, padding) 2747730c846SStephan Aßmus .Add(fSourcesBox, 0.4) 2757730c846SStephan Aßmus .AddGroup(B_VERTICAL, padding, 0.6) 2767730c846SStephan Aßmus .Add(fInfoBox) 2777730c846SStephan Aßmus .Add(fOutputBox) 2787730c846SStephan Aßmus .End() 2797730c846SStephan Aßmus .End() 2807730c846SStephan Aßmus .AddGrid(padding, padding) 2817730c846SStephan Aßmus .SetInsets(padding, 0, padding, padding) 282dd55ed1aSAlex Wilson .Add(fStatus, 0, 0) 283dd55ed1aSAlex Wilson .Add(fFileStatus, 0, 1) 2849b2ea762SAlex Wilson .Add(BSpaceLayoutItem::CreateGlue(), 1, 0) 285dd55ed1aSAlex Wilson .Add(fPreviewButton, 2, 0) 2867730c846SStephan Aßmus .Add(fConvertButton, 3, 0) 287*0e68593eSJohn Scipione .End(); 2886af4da5dSStephan Aßmus } 2896af4da5dSStephan Aßmus 2906af4da5dSStephan Aßmus 2916af4da5dSStephan Aßmus MediaConverterWindow::~MediaConverterWindow() 2926af4da5dSStephan Aßmus { 2933c0f9a7cSKarsten Heimrich delete fSaveFilePanel; 2943c0f9a7cSKarsten Heimrich delete fOpenFilePanel; 2956af4da5dSStephan Aßmus } 2966af4da5dSStephan Aßmus 2976af4da5dSStephan Aßmus 2986af4da5dSStephan Aßmus // #pragma mark - 2996af4da5dSStephan Aßmus 3006af4da5dSStephan Aßmus 3016af4da5dSStephan Aßmus void 302*0e68593eSJohn Scipione MediaConverterWindow::MessageReceived(BMessage* message) 3036af4da5dSStephan Aßmus { 3046af4da5dSStephan Aßmus entry_ref inRef; 3056af4da5dSStephan Aßmus 3066af4da5dSStephan Aßmus char buffer[40]; 307f086ada7SStephan Aßmus BEntry inEntry; 3086af4da5dSStephan Aßmus 309*0e68593eSJohn Scipione switch (message->what) { 3106af4da5dSStephan Aßmus #if B_BEOS_VERSION <= B_BEOS_VERSION_6 3116af4da5dSStephan Aßmus case B_LANGUAGE_CHANGED: 3126af4da5dSStephan Aßmus LanguageChanged(); 3136af4da5dSStephan Aßmus break; 3146af4da5dSStephan Aßmus #endif 3156af4da5dSStephan Aßmus 3166af4da5dSStephan Aßmus case INIT_FORMAT_MENUS: 3176af4da5dSStephan Aßmus BuildFormatMenu(); 3186af4da5dSStephan Aßmus if (CountSourceFiles() == 0) 3196af4da5dSStephan Aßmus SetEnabled(false, false); 3206af4da5dSStephan Aßmus break; 3216af4da5dSStephan Aßmus 3226af4da5dSStephan Aßmus case B_SIMPLE_DATA: 323*0e68593eSJohn Scipione if (message->WasDropped()) { 3246af4da5dSStephan Aßmus DetachCurrentMessage(); 325*0e68593eSJohn Scipione message->what = B_REFS_RECEIVED; 326*0e68593eSJohn Scipione BMessenger(be_app).SendMessage(message); 327*0e68593eSJohn Scipione delete message; 3286af4da5dSStephan Aßmus } 3296af4da5dSStephan Aßmus break; 3306af4da5dSStephan Aßmus 3316af4da5dSStephan Aßmus case FORMAT_SELECT_MESSAGE: 3326af4da5dSStephan Aßmus BuildAudioVideoMenus(); 3336af4da5dSStephan Aßmus break; 3346af4da5dSStephan Aßmus case AUDIO_CODEC_SELECT_MESSAGE: 3356af4da5dSStephan Aßmus break; 3366af4da5dSStephan Aßmus case VIDEO_CODEC_SELECT_MESSAGE: 3376af4da5dSStephan Aßmus break; 3386af4da5dSStephan Aßmus 3396af4da5dSStephan Aßmus case CONVERT_BUTTON_MESSAGE: 3406af4da5dSStephan Aßmus if (!fConverting) { 341ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Cancel")); 3426af4da5dSStephan Aßmus fConverting = true; 343ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Convert")); 3446af4da5dSStephan Aßmus SetEnabled(false, true); 3456af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(START_CONVERSION_MESSAGE); 3466af4da5dSStephan Aßmus } else if (!fCancelling) { 3476af4da5dSStephan Aßmus fCancelling = true; 348ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling" B_UTF8_ELLIPSIS)); 3496af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 3506af4da5dSStephan Aßmus } 3516af4da5dSStephan Aßmus break; 3526af4da5dSStephan Aßmus 3536af4da5dSStephan Aßmus case CONVERSION_DONE_MESSAGE: 354f086ada7SStephan Aßmus { 355ae0f70fcSAdrien Destugues SetStatusMessage(fCancelling ? B_TRANSLATE("Conversion cancelled") 356ae0f70fcSAdrien Destugues : B_TRANSLATE("Conversion completed")); 3576af4da5dSStephan Aßmus fConverting = false; 3586af4da5dSStephan Aßmus fCancelling = false; 3596af4da5dSStephan Aßmus bool enable = CountSourceFiles() > 0; 3606af4da5dSStephan Aßmus SetEnabled(enable, enable); 361ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 3626af4da5dSStephan Aßmus break; 363f086ada7SStephan Aßmus } 3646af4da5dSStephan Aßmus 3656af4da5dSStephan Aßmus case OUTPUT_FOLDER_MESSAGE: 3666af4da5dSStephan Aßmus // Execute Save Panel 367f086ada7SStephan Aßmus if (fSaveFilePanel == NULL) { 368f086ada7SStephan Aßmus BButton* selectThisDir; 3696af4da5dSStephan Aßmus 370*0e68593eSJohn Scipione BMessage folderSelect(FOLDER_SELECT_MESSAGE); 3713c0f9a7cSKarsten Heimrich fSaveFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 372*0e68593eSJohn Scipione B_DIRECTORY_NODE, true, &folderSelect, NULL, false, true); 373ae0f70fcSAdrien Destugues fSaveFilePanel->SetButtonLabel(B_DEFAULT_BUTTON, 374ae0f70fcSAdrien Destugues B_TRANSLATE("Select")); 3756af4da5dSStephan Aßmus fSaveFilePanel->SetTarget(this); 3766af4da5dSStephan Aßmus 3776af4da5dSStephan Aßmus fSaveFilePanel->Window()->Lock(); 378ae0f70fcSAdrien Destugues fSaveFilePanel->Window()->SetTitle( 379ae0f70fcSAdrien Destugues B_TRANSLATE("MediaConverter+:SaveDirectory")); 380f086ada7SStephan Aßmus BRect buttonRect 381f086ada7SStephan Aßmus = fSaveFilePanel->Window()->ChildAt(0)->FindView( 382f086ada7SStephan Aßmus "cancel button")->Frame(); 383f086ada7SStephan Aßmus buttonRect.right = buttonRect.left - 20; 384f086ada7SStephan Aßmus buttonRect.left = buttonRect.right - 130; 385ae0f70fcSAdrien Destugues selectThisDir = new BButton(buttonRect, NULL, 386ae0f70fcSAdrien Destugues B_TRANSLATE("Select this folder"), 387f086ada7SStephan Aßmus new BMessage(SELECT_THIS_DIR_MESSAGE), 388f086ada7SStephan Aßmus B_FOLLOW_BOTTOM | B_FOLLOW_RIGHT); 389f086ada7SStephan Aßmus selectThisDir->SetTarget(this); 390f086ada7SStephan Aßmus fSaveFilePanel->Window()->ChildAt(0)->AddChild(selectThisDir); 3916af4da5dSStephan Aßmus fSaveFilePanel->Window()->Unlock(); 3926af4da5dSStephan Aßmus 393f086ada7SStephan Aßmus fSaveFilePanel->SetRefFilter(new DirectoryFilter); 3946af4da5dSStephan Aßmus } 3956af4da5dSStephan Aßmus fSaveFilePanel->Show(); 3966af4da5dSStephan Aßmus break; 3976af4da5dSStephan Aßmus 3986af4da5dSStephan Aßmus case FOLDER_SELECT_MESSAGE: 3996af4da5dSStephan Aßmus // "SELECT" Button at Save Panel Pushed 4006af4da5dSStephan Aßmus fSaveFilePanel->GetNextSelectedRef(&inRef); 401f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 402f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 4036af4da5dSStephan Aßmus fOutputDirSpecified = true; 4046af4da5dSStephan Aßmus break; 4056af4da5dSStephan Aßmus 4066af4da5dSStephan Aßmus case SELECT_THIS_DIR_MESSAGE: 4076af4da5dSStephan Aßmus // "THIS DIR" Button at Save Panel Pushed 4086af4da5dSStephan Aßmus fSaveFilePanel->GetPanelDirectory(&inRef); 4096af4da5dSStephan Aßmus fSaveFilePanel->Hide(); 410f086ada7SStephan Aßmus inEntry.SetTo(&inRef, true); 411f086ada7SStephan Aßmus _SetOutputFolder(inEntry); 4126af4da5dSStephan Aßmus fOutputDirSpecified = true; 4136af4da5dSStephan Aßmus break; 4146af4da5dSStephan Aßmus 4156af4da5dSStephan Aßmus case OPEN_FILE_MESSAGE: 4166af4da5dSStephan Aßmus // Execute Open Panel 4176af4da5dSStephan Aßmus if (!fOpenFilePanel) { 4183c0f9a7cSKarsten Heimrich fOpenFilePanel = new BFilePanel(B_OPEN_PANEL, NULL, NULL, 4193c0f9a7cSKarsten Heimrich B_FILE_NODE, true, NULL, NULL, false, true); 4206af4da5dSStephan Aßmus fOpenFilePanel->SetTarget(this); 4216af4da5dSStephan Aßmus } 4226af4da5dSStephan Aßmus fOpenFilePanel->Show(); 4236af4da5dSStephan Aßmus break; 4246af4da5dSStephan Aßmus 4256af4da5dSStephan Aßmus case B_REFS_RECEIVED: 4266af4da5dSStephan Aßmus // Media Files Seleced by Open Panel 4276af4da5dSStephan Aßmus DetachCurrentMessage(); 428*0e68593eSJohn Scipione message->what = B_REFS_RECEIVED; 429*0e68593eSJohn Scipione BMessenger(be_app).SendMessage(message); 4306af4da5dSStephan Aßmus // fall through 4316af4da5dSStephan Aßmus 4326af4da5dSStephan Aßmus case B_CANCEL: 4336af4da5dSStephan Aßmus break; 4346af4da5dSStephan Aßmus 4356af4da5dSStephan Aßmus case QUIT_MESSAGE: 4366af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested(); 4376af4da5dSStephan Aßmus break; 4386af4da5dSStephan Aßmus 4396af4da5dSStephan Aßmus case PREVIEW_MESSAGE: 440f086ada7SStephan Aßmus { 441f086ada7SStephan Aßmus // Build the command line to launch the preview application. 442f086ada7SStephan Aßmus // TODO: Launch the default app instead of hardcoded MediaPlayer! 443f086ada7SStephan Aßmus int32 srcIndex = fListView->CurrentSelection(); 444f086ada7SStephan Aßmus BMediaFile* inFile = NULL; 445f086ada7SStephan Aßmus status_t status = GetSourceFileAt(srcIndex, &inFile, &inRef); 4466af4da5dSStephan Aßmus 447f086ada7SStephan Aßmus const char* argv[3]; 448f086ada7SStephan Aßmus BString startPosString; 449f086ada7SStephan Aßmus BPath path; 450f086ada7SStephan Aßmus 4516af4da5dSStephan Aßmus if (status == B_OK) { 452f086ada7SStephan Aßmus argv[0] = "-pos"; 453f086ada7SStephan Aßmus // NOTE: -pos argument is currently not supported by Haiku 454f086ada7SStephan Aßmus // MediaPlayer. 455f086ada7SStephan Aßmus startPosString << fStartDurationTC->Text(); 456f086ada7SStephan Aßmus startPosString << "000"; 457f086ada7SStephan Aßmus argv[1] = startPosString.String(); 4586af4da5dSStephan Aßmus 459f086ada7SStephan Aßmus status = inEntry.SetTo(&inRef); 4606af4da5dSStephan Aßmus } 4616af4da5dSStephan Aßmus 462f086ada7SStephan Aßmus if (status == B_OK) { 463f086ada7SStephan Aßmus status = inEntry.GetPath(&path); 464f086ada7SStephan Aßmus if (status == B_OK) 465f086ada7SStephan Aßmus argv[2] = path.Path(); 466f086ada7SStephan Aßmus } 4676af4da5dSStephan Aßmus 468f086ada7SStephan Aßmus if (status == B_OK) { 469f086ada7SStephan Aßmus status = be_roster->Launch( 470f086ada7SStephan Aßmus "application/x-vnd.Haiku-MediaPlayer", 471f086ada7SStephan Aßmus 3, (char**)argv, NULL); 472f086ada7SStephan Aßmus } 473f086ada7SStephan Aßmus 474f086ada7SStephan Aßmus if (status != B_OK && status != B_ALREADY_RUNNING) { 475007d8a0cSSiarzhuk Zharski BString errorString(B_TRANSLATE("Error launching: %strError%")); 476007d8a0cSSiarzhuk Zharski errorString.ReplaceFirst("%strError%", strerror(status)); 477aed35104SHumdinger BAlert* alert = new BAlert(B_TRANSLATE("Error"), 478aed35104SHumdinger errorString.String(), B_TRANSLATE("OK")); 479aed35104SHumdinger alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 480aed35104SHumdinger alert->Go(); 4816af4da5dSStephan Aßmus } 4826af4da5dSStephan Aßmus break; 483f086ada7SStephan Aßmus } 4846af4da5dSStephan Aßmus 4856af4da5dSStephan Aßmus case VIDEO_QUALITY_CHANGED_MESSAGE: 486f086ada7SStephan Aßmus { 487f086ada7SStephan Aßmus int32 value; 488*0e68593eSJohn Scipione message->FindInt32("be:value", &value); 489ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 490ae0f70fcSAdrien Destugues B_TRANSLATE("Video quality: %3d%%"), (int8)value); 4916af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 4926af4da5dSStephan Aßmus fVideoQuality = value; 4936af4da5dSStephan Aßmus break; 494f086ada7SStephan Aßmus } 4956af4da5dSStephan Aßmus 4966af4da5dSStephan Aßmus case AUDIO_QUALITY_CHANGED_MESSAGE: 497f086ada7SStephan Aßmus { 498f086ada7SStephan Aßmus int32 value; 499*0e68593eSJohn Scipione message->FindInt32("be:value", &value); 500ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), 501ae0f70fcSAdrien Destugues B_TRANSLATE("Audio quality: %3d%%"), (int8)value); 5026af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 5036af4da5dSStephan Aßmus fAudioQuality = value; 5046af4da5dSStephan Aßmus break; 505f086ada7SStephan Aßmus } 5066af4da5dSStephan Aßmus 5076af4da5dSStephan Aßmus default: 508*0e68593eSJohn Scipione BWindow::MessageReceived(message); 5096af4da5dSStephan Aßmus } 5106af4da5dSStephan Aßmus } 5116af4da5dSStephan Aßmus 5126af4da5dSStephan Aßmus 5136af4da5dSStephan Aßmus bool 5146af4da5dSStephan Aßmus MediaConverterWindow::QuitRequested() 5156af4da5dSStephan Aßmus { 5166af4da5dSStephan Aßmus if (!fConverting) { 5176af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(B_QUIT_REQUESTED); 5186af4da5dSStephan Aßmus return true; 5196af4da5dSStephan Aßmus } else if (!fCancelling) { 5206af4da5dSStephan Aßmus fCancelling = true; 521ae0f70fcSAdrien Destugues SetStatusMessage(B_TRANSLATE("Cancelling")); 5226af4da5dSStephan Aßmus BMessenger(be_app).SendMessage(CANCEL_CONVERSION_MESSAGE); 5236af4da5dSStephan Aßmus } 524*0e68593eSJohn Scipione 5256af4da5dSStephan Aßmus return false; 5266af4da5dSStephan Aßmus } 5276af4da5dSStephan Aßmus 5286af4da5dSStephan Aßmus 5296af4da5dSStephan Aßmus // #pragma mark - 5306af4da5dSStephan Aßmus 5316af4da5dSStephan Aßmus 5326af4da5dSStephan Aßmus void 5336af4da5dSStephan Aßmus MediaConverterWindow::LanguageChanged() 5346af4da5dSStephan Aßmus { 5356af4da5dSStephan Aßmus _DestroyMenu(); 5366af4da5dSStephan Aßmus _CreateMenu(); 5376af4da5dSStephan Aßmus _UpdateLabels(); 5386af4da5dSStephan Aßmus BuildAudioVideoMenus(); 5396af4da5dSStephan Aßmus Lock(); 5406af4da5dSStephan Aßmus fInfoView->Invalidate(); 5416af4da5dSStephan Aßmus Unlock(); 5426af4da5dSStephan Aßmus } 5436af4da5dSStephan Aßmus 5446af4da5dSStephan Aßmus 5456af4da5dSStephan Aßmus void 5466af4da5dSStephan Aßmus MediaConverterWindow::BuildAudioVideoMenus() 5476af4da5dSStephan Aßmus { 5486af4da5dSStephan Aßmus BMenu* menu = fAudioMenu->Menu(); 5496af4da5dSStephan Aßmus BMenuItem* item; 550*0e68593eSJohn Scipione 5516af4da5dSStephan Aßmus // clear out old audio codec menu items 5527f4d1af4SSergei Reznikov while ((item = menu->RemoveItem((int32)0)) != NULL) 5536af4da5dSStephan Aßmus delete item; 5546af4da5dSStephan Aßmus 5556af4da5dSStephan Aßmus bool separator = true; 5566af4da5dSStephan Aßmus 5576af4da5dSStephan Aßmus // get selected file format 5587730c846SStephan Aßmus FileFormatMenuItem* ffmi 5597730c846SStephan Aßmus = (FileFormatMenuItem*)fFormatMenu->Menu()->FindMarked(); 5606af4da5dSStephan Aßmus media_file_format* mf_format = &(ffmi->fFileFormat); 5616af4da5dSStephan Aßmus 5626af4da5dSStephan Aßmus media_format format, outfmt; 5636af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 5646af4da5dSStephan Aßmus media_codec_info codec_info; 5656af4da5dSStephan Aßmus int32 cookie = 0; 5666af4da5dSStephan Aßmus CodecMenuItem* cmi; 5676af4da5dSStephan Aßmus 5686af4da5dSStephan Aßmus // add available audio encoders to menu 5696af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5706af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5717730c846SStephan Aßmus while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) 5727730c846SStephan Aßmus == B_OK) { 5736af4da5dSStephan Aßmus if (separator) { 574ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 575546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No audio", "Audio codecs list"), 5766af4da5dSStephan Aßmus new BMessage(AUDIO_CODEC_SELECT_MESSAGE))); 5776af4da5dSStephan Aßmus menu->AddSeparatorItem(); 5786af4da5dSStephan Aßmus separator = false; 5796af4da5dSStephan Aßmus } 5806af4da5dSStephan Aßmus 5816af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, AUDIO_CODEC_SELECT_MESSAGE); 5826af4da5dSStephan Aßmus menu->AddItem(cmi); 5836af4da5dSStephan Aßmus // reset media format struct 5846af4da5dSStephan Aßmus /* 5856af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_AUDIO; 5866af4da5dSStephan Aßmus format.u.raw_audio = media_raw_audio_format::wildcard; 5876af4da5dSStephan Aßmus */ 5886af4da5dSStephan Aßmus } 5896af4da5dSStephan Aßmus 5906af4da5dSStephan Aßmus // mark first audio encoder 5916af4da5dSStephan Aßmus item = menu->ItemAt(0); 5926af4da5dSStephan Aßmus if (item != NULL) { 5936af4da5dSStephan Aßmus fAudioMenu->SetEnabled(fEnabled); 5946af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(fEnabled); 5956af4da5dSStephan Aßmus item->SetMarked(true); 5966af4da5dSStephan Aßmus ((BInvoker*)item)->Invoke(); 5976af4da5dSStephan Aßmus } else { 598ae0f70fcSAdrien Destugues item = new BMenuItem( 599*0e68593eSJohn Scipione B_TRANSLATE_CONTEXT("None available", "Audio codecs"), NULL); 6006af4da5dSStephan Aßmus menu->AddItem(item); 6016af4da5dSStephan Aßmus item->SetMarked(true); 6026af4da5dSStephan Aßmus fAudioMenu->SetEnabled(false); 6036af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(false); 6046af4da5dSStephan Aßmus } 6056af4da5dSStephan Aßmus 6066af4da5dSStephan Aßmus // clear out old video codec menu items 6076af4da5dSStephan Aßmus menu = fVideoMenu->Menu(); 6087f4d1af4SSergei Reznikov while ((item = menu->RemoveItem((int32)0)) != NULL) 6096af4da5dSStephan Aßmus delete item; 6106af4da5dSStephan Aßmus 6116af4da5dSStephan Aßmus separator = true; 6126af4da5dSStephan Aßmus 6136af4da5dSStephan Aßmus // construct a generic video format. Some of these parameters 6146af4da5dSStephan Aßmus // seem silly, but are needed for R4.5.x, which is more picky 6156af4da5dSStephan Aßmus // than subsequent BeOS releases will be. 6166af4da5dSStephan Aßmus memset(&format, 0, sizeof(format)); 6176af4da5dSStephan Aßmus format.type = B_MEDIA_RAW_VIDEO; 6186af4da5dSStephan Aßmus format.u.raw_video.last_active = (uint32)(240 - 1); 6196af4da5dSStephan Aßmus format.u.raw_video.orientation = B_VIDEO_TOP_LEFT_RIGHT; 6206af4da5dSStephan Aßmus format.u.raw_video.display.format = B_RGB32; 6216af4da5dSStephan Aßmus format.u.raw_video.display.line_width = (int32)320; 6226af4da5dSStephan Aßmus format.u.raw_video.display.line_count = (int32)240; 6236af4da5dSStephan Aßmus format.u.raw_video.display.bytes_per_row = 4 * 320; 6246af4da5dSStephan Aßmus 6256af4da5dSStephan Aßmus // add available video encoders to menu 6266af4da5dSStephan Aßmus cookie = 0; 627*0e68593eSJohn Scipione while (get_next_encoder(&cookie, mf_format, &format, &outfmt, &codec_info) 628*0e68593eSJohn Scipione == B_OK) { 6296af4da5dSStephan Aßmus if (separator) { 630ae0f70fcSAdrien Destugues menu->AddItem(new BMenuItem( 631546208a5SOliver Tappe B_TRANSLATE_CONTEXT("No video", "Video codecs list"), 6326af4da5dSStephan Aßmus new BMessage(VIDEO_CODEC_SELECT_MESSAGE))); 6336af4da5dSStephan Aßmus menu->AddSeparatorItem(); 6346af4da5dSStephan Aßmus separator = false; 6356af4da5dSStephan Aßmus } 6366af4da5dSStephan Aßmus 6376af4da5dSStephan Aßmus cmi = new CodecMenuItem(&codec_info, VIDEO_CODEC_SELECT_MESSAGE); 6386af4da5dSStephan Aßmus menu->AddItem(cmi); 6396af4da5dSStephan Aßmus } 6406af4da5dSStephan Aßmus 6416af4da5dSStephan Aßmus // mark first video encoder 6426af4da5dSStephan Aßmus item = menu->ItemAt(0); 6436af4da5dSStephan Aßmus if (item != NULL) { 6446af4da5dSStephan Aßmus fVideoMenu->SetEnabled(fEnabled); 6456af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(fEnabled); 6466af4da5dSStephan Aßmus item->SetMarked(true); 6476af4da5dSStephan Aßmus ((BInvoker*)item)->Invoke(); 6486af4da5dSStephan Aßmus } else { 649ae0f70fcSAdrien Destugues item = new BMenuItem( 650*0e68593eSJohn Scipione B_TRANSLATE_CONTEXT("None available", "Video codecs"), NULL); 6516af4da5dSStephan Aßmus menu->AddItem(item); 6526af4da5dSStephan Aßmus item->SetMarked(true); 6536af4da5dSStephan Aßmus fVideoMenu->SetEnabled(false); 6546af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(false); 6556af4da5dSStephan Aßmus } 6566af4da5dSStephan Aßmus } 6576af4da5dSStephan Aßmus 6586af4da5dSStephan Aßmus void 6596af4da5dSStephan Aßmus MediaConverterWindow::GetSelectedFormatInfo(media_file_format** format, 6606af4da5dSStephan Aßmus media_codec_info** audio, media_codec_info** video) 6616af4da5dSStephan Aßmus { 6626af4da5dSStephan Aßmus *audio = NULL; 6636af4da5dSStephan Aßmus *video = NULL; 6646af4da5dSStephan Aßmus *format = NULL; 6656af4da5dSStephan Aßmus 6666af4da5dSStephan Aßmus FileFormatMenuItem* formatItem = 6676af4da5dSStephan Aßmus dynamic_cast<FileFormatMenuItem*>(fFormatMenu->Menu()->FindMarked()); 668*0e68593eSJohn Scipione if (formatItem != NULL) 6696af4da5dSStephan Aßmus *format = &(formatItem->fFileFormat); 6706af4da5dSStephan Aßmus 6716af4da5dSStephan Aßmus *audio = *video = NULL; 6726af4da5dSStephan Aßmus CodecMenuItem* codecItem = 6736af4da5dSStephan Aßmus dynamic_cast<CodecMenuItem*>(fAudioMenu->Menu()->FindMarked()); 674*0e68593eSJohn Scipione if (codecItem != NULL) 6756af4da5dSStephan Aßmus *audio = &(codecItem->fCodecInfo); 6766af4da5dSStephan Aßmus 6776af4da5dSStephan Aßmus codecItem = dynamic_cast<CodecMenuItem*>(fVideoMenu->Menu()->FindMarked()); 678*0e68593eSJohn Scipione if (codecItem != NULL) 6796af4da5dSStephan Aßmus *video = &(codecItem->fCodecInfo); 6806af4da5dSStephan Aßmus } 6816af4da5dSStephan Aßmus 6826af4da5dSStephan Aßmus 6836af4da5dSStephan Aßmus void 6846af4da5dSStephan Aßmus MediaConverterWindow::BuildFormatMenu() 6856af4da5dSStephan Aßmus { 6866af4da5dSStephan Aßmus BMenu* menu = fFormatMenu->Menu(); 6876af4da5dSStephan Aßmus BMenuItem* item; 688*0e68593eSJohn Scipione 6896af4da5dSStephan Aßmus // clear out old format menu items 690*0e68593eSJohn Scipione while ((item = menu->RemoveItem((int32)0)) != NULL) 6916af4da5dSStephan Aßmus delete item; 6926af4da5dSStephan Aßmus 6936af4da5dSStephan Aßmus // add menu items for each file format 6946af4da5dSStephan Aßmus media_file_format mfi; 6956af4da5dSStephan Aßmus int32 cookie = 0; 6966af4da5dSStephan Aßmus FileFormatMenuItem* ff_item; 6976af4da5dSStephan Aßmus while (get_next_file_format(&cookie, &mfi) == B_OK) { 6986af4da5dSStephan Aßmus ff_item = new FileFormatMenuItem(&mfi); 6996af4da5dSStephan Aßmus menu->AddItem(ff_item); 7006af4da5dSStephan Aßmus } 7016af4da5dSStephan Aßmus 7026af4da5dSStephan Aßmus // mark first item 7036af4da5dSStephan Aßmus item = menu->ItemAt(0); 7046af4da5dSStephan Aßmus if (item != NULL) { 7056af4da5dSStephan Aßmus item->SetMarked(true); 7066af4da5dSStephan Aßmus ((BInvoker*)item)->Invoke(); 7076af4da5dSStephan Aßmus } 7086af4da5dSStephan Aßmus } 7096af4da5dSStephan Aßmus 710dd55ed1aSAlex Wilson 7116af4da5dSStephan Aßmus void 7126af4da5dSStephan Aßmus MediaConverterWindow::SetFileMessage(const char* message) 7136af4da5dSStephan Aßmus { 714dd55ed1aSAlex Wilson fFileStatus->SetText(message); 7156af4da5dSStephan Aßmus } 7166af4da5dSStephan Aßmus 717dd55ed1aSAlex Wilson 7186af4da5dSStephan Aßmus void 7196af4da5dSStephan Aßmus MediaConverterWindow::SetStatusMessage(const char* message) 7206af4da5dSStephan Aßmus { 721dd55ed1aSAlex Wilson fStatus->SetText(message); 7226af4da5dSStephan Aßmus } 7236af4da5dSStephan Aßmus 7246af4da5dSStephan Aßmus 7256af4da5dSStephan Aßmus // #pragma mark - 7266af4da5dSStephan Aßmus 7276af4da5dSStephan Aßmus 7281c992a52SStephan Aßmus bool 7296af4da5dSStephan Aßmus MediaConverterWindow::AddSourceFile(BMediaFile* file, const entry_ref& ref) 7306af4da5dSStephan Aßmus { 7311c992a52SStephan Aßmus if (!fListView->AddMediaItem(file, ref)) 7321c992a52SStephan Aßmus return false; 7336af4da5dSStephan Aßmus 7346af4da5dSStephan Aßmus if (!fOutputDirSpecified) { 7356af4da5dSStephan Aßmus BEntry entry(&ref); 7366af4da5dSStephan Aßmus entry.GetParent(&entry); 7376af4da5dSStephan Aßmus _SetOutputFolder(entry); 7386af4da5dSStephan Aßmus } 7391c992a52SStephan Aßmus 7401c992a52SStephan Aßmus return true; 7416af4da5dSStephan Aßmus } 7426af4da5dSStephan Aßmus 7436af4da5dSStephan Aßmus 7446af4da5dSStephan Aßmus void 7456af4da5dSStephan Aßmus MediaConverterWindow::RemoveSourceFile(int32 index) 7466af4da5dSStephan Aßmus { 7476af4da5dSStephan Aßmus delete fListView->RemoveItem(index); 7486af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 7496af4da5dSStephan Aßmus fEndDurationTC->SetText("0"); 7506af4da5dSStephan Aßmus } 7516af4da5dSStephan Aßmus 7526af4da5dSStephan Aßmus 7536af4da5dSStephan Aßmus int32 7546af4da5dSStephan Aßmus MediaConverterWindow::CountSourceFiles() 7556af4da5dSStephan Aßmus { 7566af4da5dSStephan Aßmus return fListView->CountItems(); 7576af4da5dSStephan Aßmus } 7586af4da5dSStephan Aßmus 7596af4da5dSStephan Aßmus 7606af4da5dSStephan Aßmus status_t 7616af4da5dSStephan Aßmus MediaConverterWindow::GetSourceFileAt(int32 index, BMediaFile** _file, 7626af4da5dSStephan Aßmus entry_ref* ref) 7636af4da5dSStephan Aßmus { 7646af4da5dSStephan Aßmus MediaFileListItem* item = dynamic_cast<MediaFileListItem*>( 7656af4da5dSStephan Aßmus fListView->ItemAt(index)); 7666af4da5dSStephan Aßmus if (item != NULL) { 7676af4da5dSStephan Aßmus *_file = item->fMediaFile; 7686af4da5dSStephan Aßmus *ref = item->fRef; 7696af4da5dSStephan Aßmus return B_OK; 770*0e68593eSJohn Scipione } else 7716af4da5dSStephan Aßmus return B_ERROR; 7726af4da5dSStephan Aßmus } 7736af4da5dSStephan Aßmus 7746af4da5dSStephan Aßmus 7756af4da5dSStephan Aßmus void 7766af4da5dSStephan Aßmus MediaConverterWindow::SourceFileSelectionChanged() 7776af4da5dSStephan Aßmus { 7786af4da5dSStephan Aßmus int32 selected = fListView->CurrentSelection(); 7796af4da5dSStephan Aßmus BMediaFile* file = NULL; 7806af4da5dSStephan Aßmus entry_ref ref; 7817730c846SStephan Aßmus bool enabled = GetSourceFileAt(selected, &file, &ref) == B_OK; 7826af4da5dSStephan Aßmus 7836af4da5dSStephan Aßmus fPreviewButton->SetEnabled(enabled); 7846af4da5dSStephan Aßmus fVideoQualitySlider->SetEnabled(enabled); 7856af4da5dSStephan Aßmus fAudioQualitySlider->SetEnabled(enabled); 7866af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 7876af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 7886af4da5dSStephan Aßmus 7897730c846SStephan Aßmus BString duration; 7907730c846SStephan Aßmus if (enabled) { 7917730c846SStephan Aßmus fInfoView->Update(file, &ref); 7926af4da5dSStephan Aßmus // HACK: get the fInfoView to update the duration "synchronously" 7936af4da5dSStephan Aßmus UpdateIfNeeded(); 7947730c846SStephan Aßmus duration << fInfoView->Duration() / 1000; 7957730c846SStephan Aßmus } else 7967730c846SStephan Aßmus duration = "0"; 7976af4da5dSStephan Aßmus 7986af4da5dSStephan Aßmus // update duration text controls 7996af4da5dSStephan Aßmus fStartDurationTC->SetText("0"); 8006af4da5dSStephan Aßmus fEndDurationTC->SetText(duration.String()); 8016af4da5dSStephan Aßmus } 8026af4da5dSStephan Aßmus 8036af4da5dSStephan Aßmus 8046af4da5dSStephan Aßmus // #pragma mark - 8056af4da5dSStephan Aßmus 8066af4da5dSStephan Aßmus 8076af4da5dSStephan Aßmus void 8086af4da5dSStephan Aßmus MediaConverterWindow::SetEnabled(bool enabled, bool convertEnabled) 8096af4da5dSStephan Aßmus { 8106af4da5dSStephan Aßmus fConvertButton->SetEnabled(convertEnabled); 8116af4da5dSStephan Aßmus if (enabled == fEnabled) 8126af4da5dSStephan Aßmus return; 8136af4da5dSStephan Aßmus 8146af4da5dSStephan Aßmus fFormatMenu->SetEnabled(enabled); 8156af4da5dSStephan Aßmus fAudioMenu->SetEnabled(enabled); 8166af4da5dSStephan Aßmus fVideoMenu->SetEnabled(enabled); 8176af4da5dSStephan Aßmus fListView->SetEnabled(enabled); 8186af4da5dSStephan Aßmus fStartDurationTC->SetEnabled(enabled); 8196af4da5dSStephan Aßmus fEndDurationTC->SetEnabled(enabled); 8206af4da5dSStephan Aßmus 8216af4da5dSStephan Aßmus fEnabled = enabled; 8226af4da5dSStephan Aßmus } 8236af4da5dSStephan Aßmus 8246af4da5dSStephan Aßmus 8256af4da5dSStephan Aßmus bool 8266af4da5dSStephan Aßmus MediaConverterWindow::IsEnabled() 8276af4da5dSStephan Aßmus { 8286af4da5dSStephan Aßmus return fEnabled; 8296af4da5dSStephan Aßmus } 8306af4da5dSStephan Aßmus 8316af4da5dSStephan Aßmus 8326af4da5dSStephan Aßmus const char* 8336af4da5dSStephan Aßmus MediaConverterWindow::StartDuration() const 8346af4da5dSStephan Aßmus { 8356af4da5dSStephan Aßmus return fStartDurationTC->Text(); 8366af4da5dSStephan Aßmus } 8376af4da5dSStephan Aßmus 8386af4da5dSStephan Aßmus 8396af4da5dSStephan Aßmus const char* 8406af4da5dSStephan Aßmus MediaConverterWindow::EndDuration() const 8416af4da5dSStephan Aßmus { 8426af4da5dSStephan Aßmus return fEndDurationTC->Text(); 8436af4da5dSStephan Aßmus } 8446af4da5dSStephan Aßmus 8456af4da5dSStephan Aßmus 8466af4da5dSStephan Aßmus BDirectory 8476af4da5dSStephan Aßmus MediaConverterWindow::OutputDirectory() const 8486af4da5dSStephan Aßmus { 8496af4da5dSStephan Aßmus return fOutputDir; 8506af4da5dSStephan Aßmus } 8516af4da5dSStephan Aßmus 8526af4da5dSStephan Aßmus 8536af4da5dSStephan Aßmus void 8546af4da5dSStephan Aßmus MediaConverterWindow::SetAudioQualityLabel(const char* label) 8556af4da5dSStephan Aßmus { 8566af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(label); 8576af4da5dSStephan Aßmus } 8586af4da5dSStephan Aßmus 8596af4da5dSStephan Aßmus 8606af4da5dSStephan Aßmus void 8616af4da5dSStephan Aßmus MediaConverterWindow::SetVideoQualityLabel(const char* label) 8626af4da5dSStephan Aßmus { 8636af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(label); 8646af4da5dSStephan Aßmus } 8656af4da5dSStephan Aßmus 8666af4da5dSStephan Aßmus 867a42b9a43SJohn Scipione void 868a42b9a43SJohn Scipione MediaConverterWindow::TruncateOutputFolderPath() 869a42b9a43SJohn Scipione { 870a42b9a43SJohn Scipione BEntry entry; 871a42b9a43SJohn Scipione fOutputDir.GetEntry(&entry); 872a42b9a43SJohn Scipione BPath path; 873a42b9a43SJohn Scipione entry.GetPath(&path); 874a42b9a43SJohn Scipione BString pathString(path.Path()); 875a42b9a43SJohn Scipione float maxWidth = fVideoMenu->MenuBar()->Frame().Width(); 876a42b9a43SJohn Scipione 877a42b9a43SJohn Scipione fOutputFolder->TruncateString(&pathString, B_TRUNCATE_MIDDLE, maxWidth); 878a42b9a43SJohn Scipione fOutputFolder->SetText(pathString.String()); 879a42b9a43SJohn Scipione } 880a42b9a43SJohn Scipione 881a42b9a43SJohn Scipione 8826af4da5dSStephan Aßmus // #pragma mark - 8836af4da5dSStephan Aßmus 8846af4da5dSStephan Aßmus 8856af4da5dSStephan Aßmus void 8866af4da5dSStephan Aßmus MediaConverterWindow::_UpdateLabels() 8876af4da5dSStephan Aßmus { 888dd55ed1aSAlex Wilson if (fSourcesBox != NULL) { 889ae0f70fcSAdrien Destugues fSourcesBox->SetLabel(B_TRANSLATE("Source files")); 890dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fSourcesBox); 891dd55ed1aSAlex Wilson } 8926af4da5dSStephan Aßmus 893dd55ed1aSAlex Wilson if (fInfoBox != NULL) 894ae0f70fcSAdrien Destugues fInfoBox->SetLabel(B_TRANSLATE("File details")); 8956af4da5dSStephan Aßmus 896dd55ed1aSAlex Wilson if (fOutputBox != NULL) { 897ae0f70fcSAdrien Destugues fOutputBox->SetLabel(B_TRANSLATE("Output format")); 898dd55ed1aSAlex Wilson _UpdateBBoxLayoutInsets(fOutputBox); 899dd55ed1aSAlex Wilson } 9006af4da5dSStephan Aßmus 901dd55ed1aSAlex Wilson if (fConvertButton != NULL) 902ae0f70fcSAdrien Destugues fConvertButton->SetLabel(B_TRANSLATE("Convert")); 9036af4da5dSStephan Aßmus 904dd55ed1aSAlex Wilson if (fPreviewButton != NULL) 905ae0f70fcSAdrien Destugues fPreviewButton->SetLabel(B_TRANSLATE("Preview")); 9066af4da5dSStephan Aßmus 907dd55ed1aSAlex Wilson if (fDestButton != NULL) 908ae0f70fcSAdrien Destugues fDestButton->SetLabel(B_TRANSLATE("Output folder")); 9096af4da5dSStephan Aßmus 9106af4da5dSStephan Aßmus if (fVideoQualitySlider != NULL) { 911dd55ed1aSAlex Wilson char buffer[40]; 912ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Video quality: %3d%%"), 913f086ada7SStephan Aßmus (int8)fVideoQuality); 9146af4da5dSStephan Aßmus fVideoQualitySlider->SetLabel(buffer); 915ae0f70fcSAdrien Destugues fVideoQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 916ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 9176af4da5dSStephan Aßmus } 9186af4da5dSStephan Aßmus 9196af4da5dSStephan Aßmus if (fAudioQualitySlider != NULL) { 920dd55ed1aSAlex Wilson char buffer[40]; 921ae0f70fcSAdrien Destugues snprintf(buffer, sizeof(buffer), B_TRANSLATE("Audio quality: %3d%%"), 922f086ada7SStephan Aßmus (int8)fAudioQuality); 9236af4da5dSStephan Aßmus fAudioQualitySlider->SetLabel(buffer); 924ae0f70fcSAdrien Destugues fAudioQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), 925ae0f70fcSAdrien Destugues B_TRANSLATE("High")); 9266af4da5dSStephan Aßmus } 9276af4da5dSStephan Aßmus 928dd55ed1aSAlex Wilson if (fStartDurationTC != NULL) 929ae0f70fcSAdrien Destugues fStartDurationTC->SetLabel(B_TRANSLATE("Start [ms]: ")); 930dd55ed1aSAlex Wilson 931dd55ed1aSAlex Wilson if (fEndDurationTC != NULL) 932ae0f70fcSAdrien Destugues fEndDurationTC->SetLabel(B_TRANSLATE("End [ms]: ")); 9336af4da5dSStephan Aßmus 9346af4da5dSStephan Aßmus if (fFormatMenu != NULL) 935ae0f70fcSAdrien Destugues fFormatMenu->SetLabel(B_TRANSLATE("File format:")); 936dd55ed1aSAlex Wilson 9376af4da5dSStephan Aßmus if (fAudioMenu != NULL) 938ae0f70fcSAdrien Destugues fAudioMenu->SetLabel(B_TRANSLATE("Audio encoding:")); 939dd55ed1aSAlex Wilson 9406af4da5dSStephan Aßmus if (fVideoMenu != NULL) 941ae0f70fcSAdrien Destugues fVideoMenu->SetLabel(B_TRANSLATE("Video encoding:")); 9426af4da5dSStephan Aßmus 943ae0f70fcSAdrien Destugues SetFileMessage(B_TRANSLATE("Drop media files onto this window")); 9446af4da5dSStephan Aßmus } 9456af4da5dSStephan Aßmus 9466af4da5dSStephan Aßmus 9476af4da5dSStephan Aßmus void 948dd55ed1aSAlex Wilson MediaConverterWindow::_UpdateBBoxLayoutInsets(BBox* box) 949dd55ed1aSAlex Wilson { 950dd55ed1aSAlex Wilson BTwoDimensionalLayout* layout 951dd55ed1aSAlex Wilson = dynamic_cast<BTwoDimensionalLayout*>(box->GetLayout()); 9527730c846SStephan Aßmus if (layout != NULL) { 953dd55ed1aSAlex Wilson float padding = be_control_look->DefaultItemSpacing(); 954dd55ed1aSAlex Wilson layout->SetInsets(padding, box->TopBorderOffset() + padding, padding, 955dd55ed1aSAlex Wilson padding); 956dd55ed1aSAlex Wilson } 957dd55ed1aSAlex Wilson } 958dd55ed1aSAlex Wilson 959dd55ed1aSAlex Wilson 960dd55ed1aSAlex Wilson void 9616af4da5dSStephan Aßmus MediaConverterWindow::_DestroyMenu() 9626af4da5dSStephan Aßmus { 963*0e68593eSJohn Scipione BMenu* menu; 9646af4da5dSStephan Aßmus 965*0e68593eSJohn Scipione while ((menu = fMenuBar->SubmenuAt(0)) != NULL) { 966*0e68593eSJohn Scipione fMenuBar->RemoveItem(menu); 967*0e68593eSJohn Scipione delete menu; 9686af4da5dSStephan Aßmus } 9696af4da5dSStephan Aßmus } 9706af4da5dSStephan Aßmus 9716af4da5dSStephan Aßmus 9726af4da5dSStephan Aßmus void 9736af4da5dSStephan Aßmus MediaConverterWindow::_CreateMenu() 9746af4da5dSStephan Aßmus { 9756af4da5dSStephan Aßmus BMenu* menu; 976*0e68593eSJohn Scipione BMenuItem* item; 9776af4da5dSStephan Aßmus 978546208a5SOliver Tappe menu = new BMenu(B_TRANSLATE_CONTEXT("File", "Menu")); 979*0e68593eSJohn Scipione item = new BMenuItem(B_TRANSLATE_CONTEXT("Open" B_UTF8_ELLIPSIS, "Menu"), 980dd55ed1aSAlex Wilson new BMessage(OPEN_FILE_MESSAGE), 'O'); 9816af4da5dSStephan Aßmus menu->AddItem(item); 9826af4da5dSStephan Aßmus menu->AddSeparatorItem(); 983546208a5SOliver Tappe item = new BMenuItem(B_TRANSLATE_CONTEXT("Quit", "Menu"), 984ae0f70fcSAdrien Destugues new BMessage(QUIT_MESSAGE), 'Q'); 9856af4da5dSStephan Aßmus menu->AddItem(item); 9866af4da5dSStephan Aßmus 9876af4da5dSStephan Aßmus fMenuBar->AddItem(menu); 9886af4da5dSStephan Aßmus } 9896af4da5dSStephan Aßmus 9906af4da5dSStephan Aßmus 9916af4da5dSStephan Aßmus void 9926af4da5dSStephan Aßmus MediaConverterWindow::_SetOutputFolder(BEntry entry) 9936af4da5dSStephan Aßmus { 994a42b9a43SJohn Scipione fOutputDir.SetTo(&entry); 995a42b9a43SJohn Scipione TruncateOutputFolderPath(); 9966af4da5dSStephan Aßmus } 997