xref: /haiku/src/add-ons/translators/webp/ConfigView.cpp (revision 9f76097f9ef981cc953becc641b9d1f804f4e1dc)
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