167a22493SPhilippe Houdoin /* 2*9f76097fSPhilippe Houdoin * Copyright 2010-2011, Haiku, Inc. All rights reserved. 367a22493SPhilippe Houdoin * Distributed under the terms of the MIT License. 467a22493SPhilippe Houdoin * 567a22493SPhilippe Houdoin * Authors: 667a22493SPhilippe Houdoin * Philippe Houdoin 767a22493SPhilippe Houdoin */ 867a22493SPhilippe Houdoin 967a22493SPhilippe Houdoin 1067a22493SPhilippe Houdoin #include "ConfigView.h" 1167a22493SPhilippe Houdoin 1267a22493SPhilippe Houdoin #include <stdio.h> 1367a22493SPhilippe Houdoin #include <string.h> 1467a22493SPhilippe Houdoin 15*9f76097fSPhilippe Houdoin #include <Catalog.h> 16*9f76097fSPhilippe Houdoin #include <CheckBox.h> 17*9f76097fSPhilippe Houdoin #include <GridLayoutBuilder.h> 18*9f76097fSPhilippe Houdoin #include <GroupLayout.h> 19*9f76097fSPhilippe Houdoin #include <GroupLayoutBuilder.h> 20*9f76097fSPhilippe Houdoin #include <MenuField.h> 21*9f76097fSPhilippe Houdoin #include <MenuItem.h> 22*9f76097fSPhilippe Houdoin #include <Message.h> 23*9f76097fSPhilippe Houdoin #include <PopUpMenu.h> 24*9f76097fSPhilippe Houdoin #include <Slider.h> 25*9f76097fSPhilippe Houdoin #include <StringView.h> 26*9f76097fSPhilippe Houdoin #include <TextView.h> 27*9f76097fSPhilippe Houdoin 28*9f76097fSPhilippe Houdoin #include "webp/encode.h" 29*9f76097fSPhilippe Houdoin 30*9f76097fSPhilippe Houdoin #include "TranslatorSettings.h" 31*9f76097fSPhilippe Houdoin #include "WebPTranslator.h" 32*9f76097fSPhilippe Houdoin 33*9f76097fSPhilippe Houdoin 346537cf97SJérôme Duval #undef B_TRANSLATE_CONTEXT 356537cf97SJérôme Duval #define B_TRANSLATE_CONTEXT "ConfigView" 366537cf97SJérôme Duval 37*9f76097fSPhilippe Houdoin static const uint32 kMsgQuality = 'qlty'; 38*9f76097fSPhilippe Houdoin static const uint32 kMsgPreset = 'prst'; 39*9f76097fSPhilippe Houdoin static const uint32 kMsgMethod = 'metd'; 40*9f76097fSPhilippe Houdoin static const uint32 kMsgPreprocessing = 'pprc'; 4167a22493SPhilippe Houdoin 42*9f76097fSPhilippe Houdoin static const struct preset_name { 43*9f76097fSPhilippe Houdoin const char* name; 44*9f76097fSPhilippe Houdoin WebPPreset id; 45*9f76097fSPhilippe Houdoin } kPresetNames[] = { 46*9f76097fSPhilippe Houdoin { B_TRANSLATE("Default"), WEBP_PRESET_DEFAULT }, 47*9f76097fSPhilippe Houdoin { B_TRANSLATE("Picture"), WEBP_PRESET_PICTURE }, 48*9f76097fSPhilippe Houdoin { B_TRANSLATE("Photo"), WEBP_PRESET_PHOTO }, 49*9f76097fSPhilippe Houdoin { B_TRANSLATE("Drawing"), WEBP_PRESET_DRAWING }, 50*9f76097fSPhilippe Houdoin { B_TRANSLATE("Icon"), WEBP_PRESET_ICON }, 51*9f76097fSPhilippe Houdoin { B_TRANSLATE("Text"), WEBP_PRESET_TEXT }, 52*9f76097fSPhilippe Houdoin { NULL }, 53*9f76097fSPhilippe Houdoin }; 54*9f76097fSPhilippe Houdoin 55*9f76097fSPhilippe Houdoin 56*9f76097fSPhilippe Houdoin ConfigView::ConfigView(TranslatorSettings* settings, uint32 flags) 57*9f76097fSPhilippe Houdoin : BView(B_TRANSLATE("WebPTranslator Settings"), flags), 58*9f76097fSPhilippe Houdoin fSettings(settings) 5967a22493SPhilippe Houdoin { 6067a22493SPhilippe Houdoin SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 6167a22493SPhilippe Houdoin 626537cf97SJérôme Duval BStringView* title = new BStringView("title", B_TRANSLATE("WebP Images")); 6395d32039SPhilippe Houdoin title->SetFont(be_bold_font); 6467a22493SPhilippe Houdoin 6595d32039SPhilippe Houdoin char versionString[256]; 66*9f76097fSPhilippe Houdoin sprintf(versionString, "v%d.%d.%d", 676537cf97SJérôme Duval static_cast<int>(B_TRANSLATION_MAJOR_VERSION(WEBP_TRANSLATOR_VERSION)), 686537cf97SJérôme Duval static_cast<int>(B_TRANSLATION_MINOR_VERSION(WEBP_TRANSLATOR_VERSION)), 696537cf97SJérôme Duval static_cast<int>(B_TRANSLATION_REVISION_VERSION( 70*9f76097fSPhilippe Houdoin WEBP_TRANSLATOR_VERSION))); 71*9f76097fSPhilippe Houdoin 7295d32039SPhilippe Houdoin BStringView* version = new BStringView("version", versionString); 7367a22493SPhilippe Houdoin 74*9f76097fSPhilippe Houdoin BString copyrightsText; 75*9f76097fSPhilippe Houdoin copyrightsText << B_TRANSLATE(B_UTF8_COPYRIGHT "2010-2011 Haiku Inc.") 76*9f76097fSPhilippe Houdoin << "\n" << B_TRANSLATE("Based on libwebp v0.1," ) 77*9f76097fSPhilippe Houdoin << "\n" << B_TRANSLATE(B_UTF8_COPYRIGHT "2010-2011 Google Inc."); 7867a22493SPhilippe Houdoin 79*9f76097fSPhilippe Houdoin BTextView* copyrights = new BTextView("copyrights"); 80*9f76097fSPhilippe Houdoin copyrights->SetText(copyrightsText); 81*9f76097fSPhilippe Houdoin copyrights->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); 82*9f76097fSPhilippe Houdoin copyrights->MakeEditable(false); 8367a22493SPhilippe Houdoin 84*9f76097fSPhilippe Houdoin // output parameters 85*9f76097fSPhilippe Houdoin 86*9f76097fSPhilippe Houdoin fPresetsMenu = new BPopUpMenu(B_TRANSLATE("Preset")); 87*9f76097fSPhilippe Houdoin const struct preset_name* preset = kPresetNames; 88*9f76097fSPhilippe Houdoin while (preset->name != NULL) { 89*9f76097fSPhilippe Houdoin BMessage* msg = new BMessage(kMsgPreset); 90*9f76097fSPhilippe Houdoin msg->AddInt32("value", preset->id); 91*9f76097fSPhilippe Houdoin 92*9f76097fSPhilippe Houdoin BMenuItem* item = new BMenuItem(preset->name, msg); 93*9f76097fSPhilippe Houdoin if (fSettings->SetGetInt32(WEBP_SETTING_PRESET) == preset->id) 94*9f76097fSPhilippe Houdoin item->SetMarked(true); 95*9f76097fSPhilippe Houdoin fPresetsMenu->AddItem(item); 96*9f76097fSPhilippe Houdoin 97*9f76097fSPhilippe Houdoin preset++; 98*9f76097fSPhilippe Houdoin } 99*9f76097fSPhilippe Houdoin BMenuField* presetsField = new BMenuField(B_TRANSLATE("Output preset:"), 100*9f76097fSPhilippe Houdoin fPresetsMenu, NULL); 101*9f76097fSPhilippe Houdoin 102*9f76097fSPhilippe Houdoin fQualitySlider = new BSlider("quality", B_TRANSLATE("Output quality:"), 103*9f76097fSPhilippe Houdoin new BMessage(kMsgQuality), 0, 100, B_HORIZONTAL, B_BLOCK_THUMB); 104*9f76097fSPhilippe Houdoin fQualitySlider->SetHashMarks(B_HASH_MARKS_BOTTOM); 105*9f76097fSPhilippe Houdoin fQualitySlider->SetHashMarkCount(10); 106*9f76097fSPhilippe Houdoin fQualitySlider->SetLimitLabels(B_TRANSLATE("Low"), B_TRANSLATE("High")); 107*9f76097fSPhilippe Houdoin fQualitySlider->SetValue(fSettings->SetGetInt32(WEBP_SETTING_QUALITY)); 108*9f76097fSPhilippe Houdoin 109*9f76097fSPhilippe Houdoin fMethodSlider = new BSlider("method", B_TRANSLATE("Compression method:"), 110*9f76097fSPhilippe Houdoin new BMessage(kMsgMethod), 0, 6, B_HORIZONTAL, B_BLOCK_THUMB); 111*9f76097fSPhilippe Houdoin fMethodSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); 112*9f76097fSPhilippe Houdoin fMethodSlider->SetHashMarkCount(7); 113*9f76097fSPhilippe Houdoin fMethodSlider->SetLimitLabels(B_TRANSLATE("Fast"), 114*9f76097fSPhilippe Houdoin B_TRANSLATE("Slower but better")); 115*9f76097fSPhilippe Houdoin fMethodSlider->SetValue(fSettings->SetGetInt32(WEBP_SETTING_METHOD)); 116*9f76097fSPhilippe Houdoin 117*9f76097fSPhilippe Houdoin fPreprocessingCheckBox = new BCheckBox("preprocessing", 118*9f76097fSPhilippe Houdoin B_TRANSLATE("Preprocessing filter"), new BMessage(kMsgPreprocessing)); 119*9f76097fSPhilippe Houdoin if (fSettings->SetGetBool(WEBP_SETTING_PREPROCESSING)) 120*9f76097fSPhilippe Houdoin fPreprocessingCheckBox->SetValue(B_CONTROL_ON); 12167a22493SPhilippe Houdoin 12267a22493SPhilippe Houdoin // Build the layout 123*9f76097fSPhilippe Houdoin SetLayout(new BGroupLayout(B_VERTICAL)); 12467a22493SPhilippe Houdoin 125*9f76097fSPhilippe Houdoin AddChild(BGroupLayoutBuilder(B_VERTICAL) 126*9f76097fSPhilippe Houdoin .Add(BGroupLayoutBuilder(B_HORIZONTAL) 12795d32039SPhilippe Houdoin .Add(title) 12895d32039SPhilippe Houdoin .Add(version) 12967a22493SPhilippe Houdoin .AddGlue() 130*9f76097fSPhilippe Houdoin ) 131*9f76097fSPhilippe Houdoin .Add(copyrights) 13267a22493SPhilippe Houdoin .AddGlue() 133*9f76097fSPhilippe Houdoin 134*9f76097fSPhilippe Houdoin // .Add(outputSeparator) 135*9f76097fSPhilippe Houdoin .Add(BGridLayoutBuilder() 136*9f76097fSPhilippe Houdoin .Add(presetsField->CreateLabelLayoutItem(), 0, 0) 137*9f76097fSPhilippe Houdoin .Add(presetsField->CreateMenuBarLayoutItem(), 1, 0) 138*9f76097fSPhilippe Houdoin ) 139*9f76097fSPhilippe Houdoin .Add(fQualitySlider) 140*9f76097fSPhilippe Houdoin .Add(fMethodSlider) 141*9f76097fSPhilippe Houdoin .Add(fPreprocessingCheckBox) 142*9f76097fSPhilippe Houdoin // .AddGlue() 14367a22493SPhilippe Houdoin .SetInsets(5, 5, 5, 5) 14467a22493SPhilippe Houdoin ); 14567a22493SPhilippe Houdoin } 14667a22493SPhilippe Houdoin 14767a22493SPhilippe Houdoin 14867a22493SPhilippe Houdoin ConfigView::~ConfigView() 14967a22493SPhilippe Houdoin { 150*9f76097fSPhilippe Houdoin fSettings->Release(); 15167a22493SPhilippe Houdoin } 15267a22493SPhilippe Houdoin 153*9f76097fSPhilippe Houdoin 154*9f76097fSPhilippe Houdoin void 155*9f76097fSPhilippe Houdoin ConfigView::AttachedToWindow() 156*9f76097fSPhilippe Houdoin { 157*9f76097fSPhilippe Houdoin BView::AttachedToWindow(); 158*9f76097fSPhilippe Houdoin 159*9f76097fSPhilippe Houdoin fPresetsMenu->SetTargetForItems(this); 160*9f76097fSPhilippe Houdoin 161*9f76097fSPhilippe Houdoin fQualitySlider->SetTarget(this); 162*9f76097fSPhilippe Houdoin fMethodSlider->SetTarget(this); 163*9f76097fSPhilippe Houdoin fPreprocessingCheckBox->SetTarget(this); 164*9f76097fSPhilippe Houdoin } 165*9f76097fSPhilippe Houdoin 166*9f76097fSPhilippe Houdoin 167*9f76097fSPhilippe Houdoin void 168*9f76097fSPhilippe Houdoin ConfigView::MessageReceived(BMessage* message) 169*9f76097fSPhilippe Houdoin { 170*9f76097fSPhilippe Houdoin struct { 171*9f76097fSPhilippe Houdoin const char* name; 172*9f76097fSPhilippe Houdoin uint32 what; 173*9f76097fSPhilippe Houdoin TranSettingType type; 174*9f76097fSPhilippe Houdoin } maps[] = { 175*9f76097fSPhilippe Houdoin { WEBP_SETTING_PRESET, kMsgPreset, TRAN_SETTING_INT32 }, 176*9f76097fSPhilippe Houdoin { WEBP_SETTING_QUALITY, kMsgQuality, TRAN_SETTING_INT32 }, 177*9f76097fSPhilippe Houdoin { WEBP_SETTING_METHOD, kMsgMethod, TRAN_SETTING_INT32 }, 178*9f76097fSPhilippe Houdoin { WEBP_SETTING_PREPROCESSING, kMsgPreprocessing, TRAN_SETTING_BOOL }, 179*9f76097fSPhilippe Houdoin { NULL } 180*9f76097fSPhilippe Houdoin }; 181*9f76097fSPhilippe Houdoin 182*9f76097fSPhilippe Houdoin int i; 183*9f76097fSPhilippe Houdoin for (i = 0; maps[i].name != NULL; i++) { 184*9f76097fSPhilippe Houdoin if (maps[i].what == message->what) 185*9f76097fSPhilippe Houdoin break; 186*9f76097fSPhilippe Houdoin } 187*9f76097fSPhilippe Houdoin 188*9f76097fSPhilippe Houdoin if (maps[i].name == NULL) { 189*9f76097fSPhilippe Houdoin BView::MessageReceived(message); 190*9f76097fSPhilippe Houdoin return; 191*9f76097fSPhilippe Houdoin } 192*9f76097fSPhilippe Houdoin 193*9f76097fSPhilippe Houdoin int32 value; 194*9f76097fSPhilippe Houdoin if (message->FindInt32("value", &value) == B_OK 195*9f76097fSPhilippe Houdoin || message->FindInt32("be:value", &value) == B_OK) { 196*9f76097fSPhilippe Houdoin switch(maps[i].type) { 197*9f76097fSPhilippe Houdoin case TRAN_SETTING_BOOL: 198*9f76097fSPhilippe Houdoin { 199*9f76097fSPhilippe Houdoin bool boolValue = value; 200*9f76097fSPhilippe Houdoin fSettings->SetGetBool(maps[i].name, &boolValue); 201*9f76097fSPhilippe Houdoin break; 202*9f76097fSPhilippe Houdoin } 203*9f76097fSPhilippe Houdoin case TRAN_SETTING_INT32: 204*9f76097fSPhilippe Houdoin fSettings->SetGetInt32(maps[i].name, &value); 205*9f76097fSPhilippe Houdoin break; 206*9f76097fSPhilippe Houdoin } 207*9f76097fSPhilippe Houdoin fSettings->SaveSettings(); 208*9f76097fSPhilippe Houdoin } 209*9f76097fSPhilippe Houdoin } 210