|
SASC-NG
DVBSoftCAM
|
00001 /* 00002 * menuitems.c: General purpose menu items 00003 * 00004 * See the main source file 'vdr.c' for copyright information and 00005 * how to reach the author. 00006 * 00007 * $Id: menuitems.c 1.19 2004/06/19 09:45:45 kls Exp $ 00008 */ 00009 00010 #include "include/vdr/menuitems.h" 00011 #include <ctype.h> 00012 #include "include/vdr/plugin.h" 00013 #include "include/vdr/remote.h" 00014 #include "include/vdr/skins.h" 00015 #include "include/vdr/status.h" 00016 00017 const char *FileNameChars = " abcdefghijklmnopqrstuvwxyz0123456789-.#~"; 00018 00019 // --- cMenuEditItem --------------------------------------------------------- 00020 00021 cMenuEditItem::cMenuEditItem(const char *Name) 00022 { 00023 name = strdup(Name ? Name : "???"); 00024 } 00025 00026 cMenuEditItem::~cMenuEditItem() 00027 { 00028 free(name); 00029 } 00030 00031 void cMenuEditItem::SetValue(const char *Value) 00032 { 00033 char *buffer = NULL; 00034 asprintf(&buffer, "%s:\t%s", name, Value); 00035 SetText(buffer, false); 00036 } 00037 00038 // --- cMenuEditIntItem ------------------------------------------------------ 00039 00040 cMenuEditIntItem::cMenuEditIntItem(const char *Name, int *Value, int Min, int Max, const char *MinString, const char *MaxString) 00041 :cMenuEditItem(Name) 00042 { 00043 value = Value; 00044 min = Min; 00045 max = Max; 00046 minString = MinString; 00047 maxString = MaxString; 00048 if (*value < min) 00049 *value = min; 00050 else if (*value > max) 00051 *value = max; 00052 Set(); 00053 } 00054 00055 void cMenuEditIntItem::Set(void) 00056 { 00057 if (minString && *value == min) 00058 SetValue(minString); 00059 else if (maxString && *value == max) 00060 SetValue(maxString); 00061 else { 00062 char buf[16]; 00063 snprintf(buf, sizeof(buf), "%d", *value); 00064 SetValue(buf); 00065 } 00066 } 00067 00068 eOSState cMenuEditIntItem::ProcessKey(eKeys Key) 00069 { 00070 eOSState state = cMenuEditItem::ProcessKey(Key); 00071 00072 if (state == osUnknown) { 00073 int newValue = *value; 00074 Key = NORMALKEY(Key); 00075 switch (Key) { 00076 case kNone: break; 00077 case k0 ... k9: 00078 if (fresh) { 00079 *value = 0; 00080 fresh = false; 00081 } 00082 newValue = *value * 10 + (Key - k0); 00083 break; 00084 case kLeft: // TODO might want to increase the delta if repeated quickly? 00085 newValue = *value - 1; 00086 fresh = true; 00087 break; 00088 case kRight: 00089 newValue = *value + 1; 00090 fresh = true; 00091 break; 00092 default: 00093 if (*value < min) { *value = min; Set(); } 00094 if (*value > max) { *value = max; Set(); } 00095 return state; 00096 } 00097 if ((!fresh || min <= newValue) && newValue <= max) { 00098 *value = newValue; 00099 Set(); 00100 } 00101 state = osContinue; 00102 } 00103 return state; 00104 } 00105 00106 // --- cMenuEditBoolItem ----------------------------------------------------- 00107 00108 cMenuEditBoolItem::cMenuEditBoolItem(const char *Name, int *Value, const char *FalseString, const char *TrueString) 00109 :cMenuEditIntItem(Name, Value, 0, 1) 00110 { 00111 falseString = FalseString ? FalseString : tr("no"); 00112 trueString = TrueString ? TrueString : tr("yes"); 00113 Set(); 00114 } 00115 00116 void cMenuEditBoolItem::Set(void) 00117 { 00118 char buf[16]; 00119 snprintf(buf, sizeof(buf), "%s", *value ? trueString : falseString); 00120 SetValue(buf); 00121 } 00122 00123 // --- cMenuEditBitItem ------------------------------------------------------ 00124 00125 cMenuEditBitItem::cMenuEditBitItem(const char *Name, uint *Value, uint Mask, const char *FalseString, const char *TrueString) 00126 :cMenuEditBoolItem(Name, &bit, FalseString, TrueString) 00127 { 00128 value = Value; 00129 bit = (*value & Mask) != 0; 00130 mask = Mask; 00131 Set(); 00132 } 00133 00134 void cMenuEditBitItem::Set(void) 00135 { 00136 *value = bit ? *value | mask : *value & ~mask; 00137 cMenuEditBoolItem::Set(); 00138 } 00139 00140 // --- cMenuEditNumItem ------------------------------------------------------ 00141 00142 cMenuEditNumItem::cMenuEditNumItem(const char *Name, char *Value, int Length, bool Blind) 00143 :cMenuEditItem(Name) 00144 { 00145 value = Value; 00146 length = Length; 00147 blind = Blind; 00148 Set(); 00149 } 00150 00151 void cMenuEditNumItem::Set(void) 00152 { 00153 if (blind) { 00154 char buf[length + 1]; 00155 int i; 00156 for (i = 0; i < length && value[i]; i++) 00157 buf[i] = '*'; 00158 buf[i] = 0; 00159 SetValue(buf); 00160 } 00161 else 00162 SetValue(value); 00163 } 00164 00165 eOSState cMenuEditNumItem::ProcessKey(eKeys Key) 00166 { 00167 eOSState state = cMenuEditItem::ProcessKey(Key); 00168 00169 if (state == osUnknown) { 00170 Key = NORMALKEY(Key); 00171 switch (Key) { 00172 case kLeft: { 00173 int l = strlen(value); 00174 if (l > 0) 00175 value[l - 1] = 0; 00176 } 00177 break; 00178 case k0 ... k9: { 00179 int l = strlen(value); 00180 if (l < length) { 00181 value[l] = Key - k0 + '0'; 00182 value[l + 1] = 0; 00183 } 00184 } 00185 break; 00186 default: return state; 00187 } 00188 Set(); 00189 state = osContinue; 00190 } 00191 return state; 00192 } 00193 00194 // --- cMenuEditChrItem ------------------------------------------------------ 00195 00196 cMenuEditChrItem::cMenuEditChrItem(const char *Name, char *Value, const char *Allowed) 00197 :cMenuEditItem(Name) 00198 { 00199 value = Value; 00200 allowed = strdup(Allowed); 00201 current = strchr(allowed, *Value); 00202 if (!current) 00203 current = allowed; 00204 Set(); 00205 } 00206 00207 cMenuEditChrItem::~cMenuEditChrItem() 00208 { 00209 free(allowed); 00210 } 00211 00212 void cMenuEditChrItem::Set(void) 00213 { 00214 char buf[2]; 00215 snprintf(buf, sizeof(buf), "%c", *value); 00216 SetValue(buf); 00217 } 00218 00219 eOSState cMenuEditChrItem::ProcessKey(eKeys Key) 00220 { 00221 return osContinue; 00222 } 00223 00224 // --- cMenuEditStrItem ------------------------------------------------------ 00225 00226 cMenuEditStrItem::cMenuEditStrItem(const char *Name, char *Value, int Length, const char *Allowed) 00227 :cMenuEditItem(Name) 00228 { 00229 } 00230 00231 cMenuEditStrItem::~cMenuEditStrItem() 00232 { 00233 } 00234 00235 void cMenuEditStrItem::SetHelpKeys(void) 00236 { 00237 } 00238 00239 void cMenuEditStrItem::Set(void) 00240 { 00241 } 00242 00243 uint cMenuEditStrItem::Inc(uint c, bool Up) 00244 { 00245 return '\0'; 00246 } 00247 00248 eOSState cMenuEditStrItem::ProcessKey(eKeys Key) 00249 { 00250 return osContinue; 00251 } 00252 00253 // --- cMenuEditStraItem ----------------------------------------------------- 00254 00255 cMenuEditStraItem::cMenuEditStraItem(const char *Name, int *Value, int NumStrings, const char * const *Strings) 00256 :cMenuEditIntItem(Name, Value, 0, NumStrings - 1) 00257 { 00258 } 00259 00260 void cMenuEditStraItem::Set(void) 00261 { 00262 } 00263 00264 // --- cMenuEditChanItem ----------------------------------------------------- 00265 00266 cMenuEditChanItem::cMenuEditChanItem(const char *Name, int *Value, const char *NoneString) 00267 :cMenuEditIntItem(Name, Value, NoneString ? 0 : 1, Channels.MaxNumber()) 00268 { 00269 noneString = NoneString; 00270 Set(); 00271 } 00272 00273 void cMenuEditChanItem::Set(void) 00274 { 00275 } 00276 00277 eOSState cMenuEditChanItem::ProcessKey(eKeys Key) 00278 { 00279 return osContinue; 00280 } 00281 00282 // --- cMenuEditTranItem ----------------------------------------------------- 00283 00284 cMenuEditTranItem::cMenuEditTranItem(const char *Name, int *Value, int *Source) 00285 :cMenuEditChanItem(Name, Value) 00286 { 00287 } 00288 00289 eOSState cMenuEditTranItem::ProcessKey(eKeys Key) 00290 { 00291 return osContinue; 00292 } 00293 00294 // --- cMenuEditDateItem ----------------------------------------------------- 00295 00296 cMenuEditDateItem::cMenuEditDateItem(const char *Name, time_t *Value, int *WeekDays) 00297 :cMenuEditItem(Name) 00298 { 00299 } 00300 00301 void cMenuEditDateItem::Set(void) 00302 { 00303 } 00304 00305 eOSState cMenuEditDateItem::ProcessKey(eKeys Key) 00306 { 00307 return osContinue; 00308 } 00309 00310 // --- cMenuEditTimeItem ----------------------------------------------------- 00311 00312 cMenuEditTimeItem::cMenuEditTimeItem(const char *Name, int *Value) 00313 :cMenuEditItem(Name) 00314 { 00315 } 00316 00317 void cMenuEditTimeItem::Set(void) 00318 { 00319 } 00320 00321 eOSState cMenuEditTimeItem::ProcessKey(eKeys Key) 00322 { 00323 return osContinue; 00324 } 00325 00326 // --- cMenuSetupPage -------------------------------------------------------- 00327 00328 cMenuSetupPage::cMenuSetupPage(void) 00329 :cOsdMenu("", 33) 00330 { 00331 plugin = NULL; 00332 } 00333 00334 void cMenuSetupPage::SetSection(const char *Section) 00335 { 00336 } 00337 00338 eOSState cMenuSetupPage::ProcessKey(eKeys Key) 00339 { 00340 return osContinue; 00341 } 00342 00343 void cMenuSetupPage::SetPlugin(cPlugin *Plugin) 00344 { 00345 } 00346 00347 void cMenuSetupPage::SetupStore(const char *Name, const char *Value) 00348 { 00349 } 00350 00351 void cMenuSetupPage::SetupStore(const char *Name, int Value) 00352 { 00353 }