1/* 2 * Copyright 2012, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Aaron Hill <serac@hillvisions.com> 7 * Alexander von Gluck <kallisti5@unixzen.com> 8 */ 9 10 11#include "GLifeConfig.h" 12 13#include <Catalog.h> 14#include <GroupLayoutBuilder.h> 15#include <Slider.h> 16#include <String.h> 17#include <StringView.h> 18#include <View.h> 19 20#include <stdio.h> 21 22#include "GLifeState.h" 23 24#undef B_TRANSLATION_CONTEXT 25#define B_TRANSLATION_CONTEXT "GLife ScreenSaver" 26 27 28// ------------------------------------------------------ 29// GLifeConfig Class Constructor Definition 30GLifeConfig::GLifeConfig(BRect frame, GLifeState* pglsState) 31 : 32 BView(frame, "", B_FOLLOW_ALL_SIDES, B_WILL_DRAW), 33 m_pglsState(pglsState) 34{ 35 SetLayout(new BGroupLayout(B_HORIZONTAL)); 36 SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 37 38 // Info text 39 BStringView* name = new BStringView(frame, B_EMPTY_STRING, 40 B_TRANSLATE("OpenGL \"Game of Life\""), B_FOLLOW_LEFT); 41 BStringView* author = new BStringView(frame, B_EMPTY_STRING, B_TRANSLATE("by Aaron Hill"), 42 B_FOLLOW_LEFT); 43 44 // Sliders 45 fGridDelay = new BSlider(frame, "GridDelay", 46 B_TRANSLATE("Grid life delay: "), 47 new BMessage(kGridDelay), 48 0, 4, B_BLOCK_THUMB); 49 50 fGridDelay->SetHashMarks(B_HASH_MARKS_BOTTOM); 51 fGridDelay->SetLimitLabels(B_TRANSLATE("None"), 52 B_TRANSLATE_COMMENT("4x", "This is a factor: the x represents 'times'")); 53 fGridDelay->SetValue(pglsState->GridDelay()); 54 fGridDelay->SetHashMarkCount(5); 55 56 fGridBorder = new BSlider(frame, "GridBorder", B_TRANSLATE("Grid border: "), 57 new BMessage(kGridBorder), 0, 10, B_BLOCK_THUMB); 58 59 fGridBorder->SetHashMarks(B_HASH_MARKS_BOTTOM); 60 fGridBorder->SetLimitLabels("0", "10"); 61 fGridBorder->SetValue(pglsState->GridBorder()); 62 fGridBorder->SetHashMarkCount(11); 63 64 fGridWidth = new BSlider(frame, "GridWidth", B_TRANSLATE("Grid width: "), 65 new BMessage(kGridWidth), 10, 100, B_BLOCK_THUMB); 66 67 fGridWidth->SetHashMarks(B_HASH_MARKS_BOTTOM); 68 // fGridWidth->SetLimitLabels("10", "100"); 69 fGridWidth->SetValue(pglsState->GridWidth()); 70 fGridWidth->SetHashMarkCount(10); 71 72 fGridHeight = new BSlider(frame, "GridHeight", B_TRANSLATE("Grid height: "), 73 new BMessage(kGridHeight), 10, 100, B_BLOCK_THUMB); 74 75 fGridHeight->SetHashMarks(B_HASH_MARKS_BOTTOM); 76 // fGridHeight->SetLimitLabels("10", "100"); 77 fGridHeight->SetValue(pglsState->GridHeight()); 78 fGridHeight->SetHashMarkCount(10); 79 80 AddChild(BGroupLayoutBuilder(B_VERTICAL, B_USE_DEFAULT_SPACING) 81 .Add(BGroupLayoutBuilder(B_VERTICAL, 0) 82 .Add(name) 83 .Add(author) 84 ) 85 .AddGlue() 86 .Add(fGridDelay) 87 .Add(fGridBorder) 88 .Add(BGroupLayoutBuilder(B_HORIZONTAL, 0) 89 .Add(fGridWidth) 90 .Add(fGridHeight) 91 ) 92 .SetInsets(B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING, 93 B_USE_DEFAULT_SPACING, B_USE_DEFAULT_SPACING) 94 ); 95 96 // Do our first label update 97 _UpdateLabels(); 98} 99 100 101// ------------------------------------------------------ 102// GLifeConfig Class AttachedToWindow Definition 103void 104GLifeConfig::AttachedToWindow(void) 105{ 106 fGridWidth->SetTarget(this); 107 fGridHeight->SetTarget(this); 108 fGridBorder->SetTarget(this); 109 fGridDelay->SetTarget(this); 110 111#ifdef _USE_ASYNCHRONOUS 112 113 m_uiWindowFlags = Window()->Flags(); 114 Window()->SetFlags(m_uiWindowFlags | B_ASYNCHRONOUS_CONTROLS); 115 116#endif 117} 118 119 120void 121GLifeConfig::_UpdateLabels() 122{ 123 BString newLabel; 124 newLabel.SetToFormat(B_TRANSLATE("Grid width: %d"), (int)fGridWidth->Value()); 125 fGridWidth->SetLabel(newLabel); 126 127 newLabel.SetToFormat(B_TRANSLATE("Grid height: %d"), (int)fGridHeight->Value()); 128 fGridHeight->SetLabel(newLabel); 129 130 newLabel.SetToFormat(B_TRANSLATE("Grid border: %d"), (int)fGridBorder->Value()); 131 fGridBorder->SetLabel(newLabel); 132 133 int delay = fGridDelay->Value(); 134 if (delay <= 0) 135 newLabel = B_TRANSLATE("Grid life delay: none"); 136 else { 137 newLabel.SetToFormat(B_TRANSLATE_CONTEXT("Grid life delay: %d��", 138 "This is a factor: the �� represents 'times', don't translate '%d'"), 139 delay); 140 } 141 fGridDelay->SetLabel(newLabel); 142} 143 144 145// ------------------------------------------------------ 146// GLifeConfig Class MessageReceived Definition 147void 148GLifeConfig::MessageReceived(BMessage* pbmMessage) 149{ 150 switch (pbmMessage->what) { 151 case kGridWidth: 152 m_pglsState->GridWidth() = fGridWidth->Value(); 153 break; 154 case kGridHeight: 155 m_pglsState->GridHeight() = fGridHeight->Value(); 156 break; 157 case kGridBorder: 158 m_pglsState->GridBorder() = fGridBorder->Value(); 159 break; 160 case kGridDelay: 161 m_pglsState->GridDelay() = fGridDelay->Value(); 162 break; 163 default: 164 BView::MessageReceived(pbmMessage); 165 return; 166 } 167 _UpdateLabels(); 168} 169