//----------------------------------------------------------------------------- // Copyright 2007 Jonathan Westhues // // This file is part of LDmicro. // // LDmicro is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // LDmicro is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with LDmicro. If not, see . //------ // // All the simple dialogs that just require a row of text boxes: timer name // and delay, counter name and count, move and arithmetic destination and // operands. Try to reuse code a bit. // Jonathan Westhues, Nov 2004 //----------------------------------------------------------------------------- #include "linuxUI.h" //#include #include #include #include "ldmicro.h" static QDialog* SimpleDialog; #define MAX_BOXES 5 static QLineEdit* Textboxes[MAX_BOXES]; static QLabel* Labels[MAX_BOXES]; static QGridLayout* SimpleGrid; /*static LONG_PTR PrevAlnumOnlyProc[MAX_BOXES]; static LONG_PTR PrevNumOnlyProc[MAX_BOXES];*/ static BOOL NoCheckingOnBox[MAX_BOXES]; /*static BOOL SIMPLE_DIALOG_ACTIVE = FALSE;*/ /*static SimpleDialogData SDdata;*/ /// Simple dialog data flags #define SD_TIMER 0x0000001 #define SD_COUNTER 0x0000002 #define SD_CMP 0x0000003 #define SD_MOVE 0x0000004 #define SD_READ_ADC 0x0000005 #define SD_SET_PWM 0x0000006 #define SD_UART 0x0000007 #define SD_MATH 0x0000008 #define SD_SHIFT_REGISTER 0x0000009 #define SD_FORMATTED_STRING 0x0000010 #define SD_PERSIST 0x0000011 static inline void DestroyWindow (int boxes){ for(int i = 0; i < boxes; i++) { delete Labels[i]; delete Textboxes[i]; } delete SimpleGrid; delete SimpleDialog; ProgramChanged(); } static void MakeControls(int boxes, char **labels, DWORD fixedFontMask) { int i; // HDC hdc = GetDC(SimpleDialog); // SelectObject(hdc, MyNiceFont); // SIZE si; // int maxLen = 0; // for(i = 0; i < boxes; i++) { // GetTextExtentPoint32(hdc, labels[i], strlen(labels[i]), &si); // if(si.cx > maxLen) maxLen = si.cx; // } // int adj; // if(maxLen > 70) { // adj = maxLen - 70; // } else { // adj = 0; // } QGridLayout* grid = new QGridLayout(); QDialogButtonBox *ButtonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Vertical, SimpleDialog); NiceFont(SimpleDialog); for(i = 0; i < boxes; i++) { // GetTextExtentPoint32(hdc, labels[i], strlen(labels[i]), &si); Labels[i] = new QLabel(labels[i]); NiceFont(Labels[i]); grid->addWidget(Labels[i],i,0); Textboxes[i] = new QLineEdit(); if(fixedFontMask & (1 << i)) { FixedFont(Textboxes[i]); } else { NiceFont(Textboxes[i]); } grid->addWidget(Textboxes[i],i,1); } SimpleGrid->addLayout(grid, 0,0); SimpleGrid->addWidget(ButtonBox, 0, 1); QObject::connect(ButtonBox, SIGNAL(accepted()), SimpleDialog, SLOT(accept())); QObject::connect(ButtonBox, SIGNAL(rejected()), SimpleDialog, SLOT(reject())); } BOOL ShowSimpleDialog(char *title, int boxes, char **labels, DWORD numOnlyMask, DWORD alnumOnlyMask, DWORD fixedFontMask, char **dests) { /*if(SIMPLE_DIALOG_ACTIVE) return; SIMPLE_DIALOG_ACTIVE = TRUE; BOOL didCancel = FALSE;*/ BOOL RetVal = FALSE; if(boxes > MAX_BOXES) oops(); SimpleDialog = CreateWindowClient(title, 100, 100, 304, 15 + 30*(boxes < 2 ? 2 : boxes), MainWindow); SimpleGrid = new QGridLayout(SimpleDialog); SimpleDialog->setWindowTitle(title); MakeControls(boxes, labels, fixedFontMask); int i; for(i = 0; i < boxes; i++) { Textboxes[i]->setText(dests[i]); if(numOnlyMask & (1 << i)) { Textboxes[i]->setValidator( new QRegExpValidator(QRegExp("-?[0-9]+[.]?[0-9]+"))); } if(alnumOnlyMask & (1 << i)) { Textboxes[i]->setValidator( new QRegExpValidator( QRegExp("[a-zA-Z0-9_'-]+"))); } } Textboxes[0]->setFocus(); int ret = SimpleDialog->exec(); switch(ret) { case QDialog::Accepted: { for(i = 0; i < boxes; i++) { if(NoCheckingOnBox[i]) { strncpy(dests[i], Textboxes[i]->text().toStdString().c_str(),60); } else { char get[20]; // SendMessage(Textboxes[i], WM_GETTEXT, 15, (LPARAM)get); strncpy(get, Textboxes[i]->text().toStdString().c_str(),15); if( (!strchr(get, '\'')) || (get[0] == '\'' && get[2] == '\'' && strlen(get)==3) ) { if(strlen(get) == 0) { Error(_("Empty textbox; not permitted.")); } else { strcpy(dests[i], get); } } else { Error(_("Bad use of quotes: <%s>"), get); } } } RetVal = TRUE; break; } case QDialog::Rejected: RetVal = FALSE; break; } DestroyWindow(boxes); return RetVal; } void ShowTimerDialog(int which, int *delay, char *name) { char *s; switch(which) { case ELEM_TON: s = _("Turn-On Delay"); break; case ELEM_TOF: s = _("Turn-Off Delay"); break; case ELEM_RTO: s = _("Retentive Turn-On Delay"); break; default: oops(); break; } char *labels[] = { _("Name:"), _("Delay (ms):") }; char delBuf[16]; char nameBuf[16]; sprintf(delBuf, "%.3f", (*delay / 1000.0)); strcpy(nameBuf, name+1); char *dests[] = { nameBuf, delBuf }; if(ShowSimpleDialog(s, 2, labels, (1 << 1), (1 << 0), (1 << 0), dests)) { name[0] = 'T'; strcpy(name+1, nameBuf); double del = atof(delBuf); if(del > 2140000) { // 2**31/1000, don't overflow signed int Error(_("Delay too long; maximum is 2**31 us.")); } else if(del <= 0) { Error(_("Delay cannot be zero or negative.")); } else { *delay = (int)(1000*del + 0.5); } } } void ShowCounterDialog(int which, int *maxV, char *name) { char *title; switch(which) { case ELEM_CTU: title = _("Count Up"); break; case ELEM_CTD: title = _("Count Down"); break; case ELEM_CTC: title = _("Circular Counter"); break; default: oops(); } char *labels[] = { _("Name:"), (which == ELEM_CTC ? _("Max value:") : _("True if >= :")) }; char maxS[128]; sprintf(maxS, "%d", *maxV); char *dests[] = { name+1, maxS }; ShowSimpleDialog(title, 2, labels, 0x2, 0x1, 0x1, dests); *maxV = atoi(maxS); } void ShowCmpDialog(int which, char *op1, char *op2) { char *title; char *l2; switch(which) { case ELEM_EQU: title = _("If Equals"); l2 = "= :"; break; case ELEM_NEQ: title = _("If Not Equals"); l2 = "/= :"; break; case ELEM_GRT: title = _("If Greater Than"); l2 = "> :"; break; case ELEM_GEQ: title = _("If Greater Than or Equal To"); l2 = ">= :"; break; case ELEM_LES: title = _("If Less Than"); l2 = "< :"; break; case ELEM_LEQ: title = _("If Less Than or Equal To"); l2 = "<= :"; break; default: oops(); } char *labels[] = { _("'Closed' if:"), l2 }; char *dests[] = { op1, op2 }; ShowSimpleDialog(title, 2, labels, 0, 0x3, 0x3, dests); } void ShowMoveDialog(char *dest, char *src) { char *labels[] = { _("Destination:"), _("Source:") }; char *dests[] = { dest, src }; ShowSimpleDialog(_("Move"), 2, labels, 0, 0x3, 0x3, dests); } void ShowReadAdcDialog(char *name) { char *labels[] = { _("Destination:") }; char *dests[] = { name }; ShowSimpleDialog(_("Read A/D Converter"), 1, labels, 0, 0x1, 0x1, dests); } void ShowSetPwmDialog(char *name, int *targetFreq) { char freq[100]; sprintf(freq, "%d", *targetFreq); char *labels[] = { _("Duty cycle var:"), _("Frequency (Hz):") }; char *dests[] = { name, freq }; ShowSimpleDialog(_("Set PWM Duty Cycle"), 2, labels, 0x2, 0x1, 0x1, dests); *targetFreq = atoi(freq); } void ShowUartDialog(int which, char *name) { char *labels[] = { (which == ELEM_UART_RECV) ? _("Destination:") : _("Source:") }; char *dests[] = { name }; ShowSimpleDialog((which == ELEM_UART_RECV) ? _("Receive from UART") : _("Send to UART"), 1, labels, 0, 0x1, 0x1, dests); } void ShowMathDialog(int which, char *dest, char *op1, char *op2) { char *l2, *title; if(which == ELEM_ADD) { l2 = "+ :"; title = _("Add"); } else if(which == ELEM_SUB) { l2 = "- :"; title = _("Subtract"); } else if(which == ELEM_MUL) { l2 = "* :"; title = _("Multiply"); } else if(which == ELEM_DIV) { l2 = "/ :"; title = _("Divide"); } else oops(); char *labels[] = { _("Destination:"), _("is set := :"), l2 }; char *dests[] = { dest, op1, op2 }; ShowSimpleDialog(title, 3, labels, 0, 0x7, 0x7, dests); } void ShowShiftRegisterDialog(char *name, int *stages) { char stagesStr[20]; sprintf(stagesStr, "%d", *stages); char *labels[] = { _("Name:"), _("Stages:") }; char *dests[] = { name, stagesStr }; ShowSimpleDialog(_("Shift Register"), 2, labels, 0x2, 0x1, 0x1, dests); *stages = atoi(stagesStr); if(*stages <= 0 || *stages >= 200) { Error(_("Not a reasonable size for a shift register.")); *stages = 1; } } void ShowFormattedStringDialog(char *var, char *string) { char *labels[] = { _("Variable:"), _("String:") }; char *dests[] = { var, string }; NoCheckingOnBox[0] = TRUE; NoCheckingOnBox[1] = TRUE; ShowSimpleDialog(_("Formatted String Over UART"), 2, labels, 0x0, 0x1, 0x3, dests); NoCheckingOnBox[0] = FALSE; NoCheckingOnBox[1] = FALSE; } void ShowPersistDialog(char *var) { char *labels[] = { _("Variable:") }; char *dests[] = { var }; ShowSimpleDialog(_("Make Persistent"), 1, labels, 0, 1, 1, dests); }