void IndiWidgetGroup::loadSetup(const QString& setup) { if(setup.isEmpty() or setup == mSetName) return; saveSetup(); mSetName = setup; int rowCount; SettingsFile sfile(mFullIndiSetsPath + mSetName); rowCount = sfile.getIT("IndicatorCount", 1); for(int i = 0; (i < mSplitter->count()) and (i < rowCount); ++i) { static_cast<IndicatorWidget*>(mSplitter->widget(i))->loadSetup(mSetName, i); } while(mSplitter->count() < rowCount) addWindow(); while(mSplitter->count() > rowCount) removeWindow(); mSplitter->restoreState(sfile.getBA("GroupSplitter")); }
int main(int argc, char **argv){ int ii=0, ans=0, nn=0; int det=0; char yn[100]="\0"; int mapLNfill; // shmSetup(); mapLNfill = mmapSetup(); if (mapLNfill == -1) return 0; /* Shared memory creation and attachment // shmKey = ftok("/Users/c4g/src/LNfill/include/lnfill.conf",'b'); // key unique identifier for shared memory, other programs use 'LN' tag // shmKey = ftok("/Users/c4g/src/LNfill/include/lnfill.conf",'b'); // key unique identifier for shared memory, other programs use include this shmKey = ftok("include/lnfill.conf",'b'); // key unique identifier for shared memory, other programs use include this // shmKey = ftok("SHM_PATH",'b'); // key unique identifier for shared memory, other programs use 'LN' tag // shmKey = ftok("/Users/gross/Desktop/LNfill/LNdata",'b'); // key unique identifier for shared memory, other programs use 'LN' tag shmid = shmget(shmKey, sizeof (struct lnfill), 0666); // gets the ID of shared memory, size, permissions, create if necessary by changing to 0666 | IPC_CREAT) lnptr = shmat (shmid, (void *)0, 0); // now link to area so it can be used; struct lnfill pointer char *lnptr if (lnptr == (struct lnfill *)(-1)){ // check for errors perror("shmat"); exit(EXIT_FAILURE); } */ // printf ("%li = %li\n",shmKey, shmid); /* */ // printf ("shm size = %li\n",sizeof (struct lnfill) ); // printf ("pid = %li\n", lnptr->pid); while (ans != 100){ menu(); scanf ("%i", &ans); // read in ans (pointer is indicated) switch (ans){ case 0: // end program but not lnfill if (munmap(lnptr, sizeof (struct lnfill*)) == -1) { perror("Error un-mmapping the file"); } //shmdt(lnptr); // detach from shared memory segment return 0; break; case 1: // display temps and limits if (lnptr->command == 8 || lnptr->command == 7 || lnptr->command == 18) break; // don't force an update lnptr->command = 1; // command (3) stored in SHM so lnfill can do something kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (1) break; case 2: // Change limit and timing parameters if (lnptr->command == 8 || lnptr->command == 7 || lnptr->command == 18) break; // don't force an update printf (" Which detector do you want to change? 1-20, outside this range to do nothing \n"); scanf("%i",&det); if ((det > 0) && (det < 21)){ parametersGe(det); } /* printf("Filling interval ? (usually 28800 s (8 hrs.)) \n"); scanf ("%lf",&zz.interval); printf("Filling time max ? (usually 420 s) \n"); scanf ("%lf",&zz.max); printf("Filling time min ? (usually 150 s) \n"); scanf ("%lf",&zz.min); printf("RTD temperature limit ? (usually ~90 or 6 K above coldest value) \n"); scanf ("%lf",&zz.limit); printf("Outlet temperature limit ? (usually ~90 or few degrees below value) \n"); scanf ("%lf",&zz.limit); lnptr->ge[det].interval = zz.interval; lnptr->ge[det].max = zz.max; lnptr->ge[det].min = zz.min; lnptr->ge[det].limit = zz.limit; lnptr->ge[det].olimit = zz.olimit; lnptr->ge[det].next = time(NULL) + lnptr->ge[det].interval; printf("Detector next fill time has been set to %.0lf s from now \n",lnptr->ge[det].interval); } */ break; case 3: // Add or remove detector from system activeList(); break; /* activemax = activeList(); printf (" Which detector do you want to change? 1-20, outside this range to do nothing \n"); scanf("%i",&det); if ((det > 0) && (det < 21)){ if (lnptr->ge[det].onoff == 0) { printf("RTD is which U6 channel? (0-13) \n"); scanf ("%i",&zz.chanRTD); printf("Overflo is which U6 channel? (0-13) \n"); scanf ("%i",&zz.chanOFLO); printf("Filling interval ? (usually 28800 s (8 hrs.)) \n"); scanf ("%i",&zz.interval); // scanf ("%i",&zz.interval); printf("Filling time max ? (usually 420 s) \n"); scanf ("%i",&zz.max); printf("Filling time min ? (usually 150 s) \n"); scanf ("%i",&zz.min); printf("RTD temperature limit ? (usually ~90 or 6 K above coldest value) \n"); scanf ("%lf",&zz.limit); printf("Outlet temperature limit ? (usually ~90 or few degrees below detector value) \n"); scanf ("%lf",&zz.olimit); printf(" %i %i %lf %lf \n", zz.chanRTD, zz.chanOFLO, zz.limit,zz.olimit); zz.onoff = 1; strcpy(zz.status,"OK"); lnptr->ge[det] = zz; lnptr->ge[det].next = time(NULL) + lnptr->ge[det].interval; printf("Detector next fill time has been set to %.0lf s from now \n",lnptr->ge[det].interval); } else { lnptr->ge[det].onoff = 0; // turn channel off lnptr->ge[det].chanOFLO = -1; // set U6 channels to -1 lnptr->ge[det].chanRTD = -1; // set U6 channels to -1 strcpy(lnptr->ge[det].status,"OFF"); } } // lnptr->command = 3; // command (3) stored in SHM so lnfill can do something not needed...user can force a fill // do I force an RTD read here or wait up to a minute for the natural read? break; */ case 4: // display temps and limits inactiveList(); break; case 5: // Save setup into lnfill.conf printf ("Saving current setup into lnfill.conf (hope you made a copy of the old one) ....\n"); saveSetup(); break; case 7: // force fill 1 detector if (lnptr->command == 8) { printf("Already started a fill ALL ..... returning to menu \n"); break; } if (lnptr->command == 7) { printf("Already filling a detector .... should have done a fill ALL ..... returning to menu \n"); break; } printf ("Which detector do you wish to fill .... <0 do nothing\n"); printf ("Det Name iBar \n"); printf ("--- ---- ---- \n"); for (ii=1; ii < 21; ii++){ if (lnptr->ge[ii-1].chanIbar >=0) printf ("%2i %3s %2i \n",ii, lnptr->ge[ii-1].name, lnptr->ge[ii-1].chanIbar); } scanf("%i",&nn); if (nn < 0) break; lnptr->com1 = nn-1; lnptr->command = 8; // command (8) stored in SHM to start a fill kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (8) // put in detector and value questions break; case 8: // force fill all detectors printf ("force fill ALL detectors here....\n"); if (lnptr->command == 8 || lnptr->command == 7) { printf("Already started a fill ALL ..... returning to menu \n"); break; } lnptr->com1 = -1; // fill all flag lnptr->command = 8; // command (8) stored in SHM so lnfill can do something kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (8) break; case 9: // do initial cool down of a detector printf ("Begin the initial cool down of detectors with next fill 1 hour....\n"); printf ("Which detector do you wish to fill .... <0 do nothing \n"); printf ("Det Name iBar \n"); printf ("--- ---- ---- \n"); printf (" 0 ALL -- \n"); for (ii=1; ii < 21; ii++){ if (lnptr->ge[ii-1].chanIbar >=0) printf ("%2i %3s %2i \n",ii, lnptr->ge[ii-1].name, lnptr->ge[ii-1].chanIbar); } scanf("%i",&nn); if (nn < 0 || nn > 6) break; // if (nn == 0) lnptr->com1 = -1; // else lnptr->com1 = nn-1; lnptr->command = 18; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (3) // put in detector and value questions break; case 10: // Close all valves printf ("Closing valves and opening manifold ....\n"); lnptr->command = ans; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 11: // Close tanl valve printf ("Closing tank ....\n"); lnptr->command = ans; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 12: // Open tank valve printf ("Opening tank ....\n"); lnptr->command = ans; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 13: // Close manifold printf ("Closing manifold ....\n"); lnptr->command = ans; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 14: // Open manifold printf ("Opening manifold ....\n"); lnptr->command = ans; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 15: // Close a detector valve printf ("Which detector valve do you wish to close ? (1-20 from 1st column) \n"); for (ii=1; ii < 21; ii++){ if (lnptr->ge[ii-1].chanIbar >=0) printf ("%2i %3s %2i \n",ii, lnptr->ge[ii-1].name, lnptr->ge[ii-1].chanIbar); } scanf("%i",&nn); lnptr->command = 20 + nn; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 16: // Open a detector valve printf ("Which detector valve do you wish to open ? (1-20 from 1st column) \n"); for (ii=1; ii < 21; ii++){ if (lnptr->ge[ii-1].chanIbar >=0) printf ("%2i %3s %2i \n",ii, lnptr->ge[ii-1].name, lnptr->ge[ii-1].chanIbar); } scanf("%i",&nn); lnptr->command = 40 + nn; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 17: // Get valve status directly from ibootbar printf ("ibootBar outlet status \n"); lnptr->command = 17; kill(lnptr->pid,SIGALRM); // send an alarm to let lnfill know it needs to do command (10) break; case 18: // do initial cool down of a detector printf (" Do you really want to reset all alarms? y/n \n"); scanf("%s",yn); if (strcmp(yn,"Y") == 0 || strcmp(yn,"y") == 0) { // if (yn == 'Y' || yn == 'y'){ for (ii=0; ii < 20; ii++){ if (lnptr->ge[det].onoff == 1) strcpy(lnptr->ge[ii].status,"OK"); else strcpy(lnptr->ge[ii].status,"OFF"); } } else printf ("No alarms were reset"); /* scanf("%1s",&zzz); if (strcmp(zzz,"Y") == 0 || strcmp(zzz,"y") == 0) { for (ii=0; ii < 20; ii++){ if (lnptr->ge[det].onoff == 1) strcpy(lnptr->ge[ii].status,"OK"); else strcpy(lnptr->ge[ii].status,"OFF"); } } */ break; case 19: if (lnptr->com2 == 0) { printf (" Do you really want to toggle the LN HV Emergency Shutdown ON? y/n \n"); scanf("%s",yn); if (strcmp(yn,"Y") == 0 || strcmp(yn,"y") == 0) { // if (yn == 'Y' || yn == 'y'){ // scanf("%1s",&zzz); printf (" Turning emergency shutdown ON \n If shutdown occurs you must run bash script to clear events and shutdown!\n"); lnptr->com2 = 1; printf (" Emergency shutdown is ON \n"); } else { printf (" Emergency shutdown is staying OFF \n"); } } else { printf (" Do you really want to toggle the LN Emergency Shutdown OFF? y/n \n"); scanf("%s",yn); if (strcmp(yn,"Y") == 0 || strcmp(yn,"y") == 0) { // char yn = getchar(); // if (yn == 'Y' || yn == 'y'){ // scanf("%1s",&zzz); printf (" Turning emergency shutdown OFF \n You better know that the Ge detectors are COLD! \n And remember to turn it back on when done !\n"); lnptr->com2 = 0; printf (" Emergency shutdown is OFF \n"); } else { printf (" Emergency shutdown is staying ON \n"); } } break; case 61: // Get valve status directly from ibootbar printf ("Input email addresses \n"); addresses(); if (lnptr->command == 61) kill(lnptr->pid,SIGALRM); break; case 100: // End ALL lnfill programs break; default: // Do nothing and go back to the list of options ans = 0; break; } } /* Wrap up the program ending the lnfill-u6, detaching and getting rid of the shared memory segment */ lnptr->command=-1; kill(lnptr->pid,SIGALRM); /* Release the shared memory and close the U3 */ if (munmap(lnptr, sizeof (struct lnfill*)) == -1) { perror("Error un-mmapping the file"); /* Decide here whether to close(fd) and exit() or not. Depends... */ } close(mapLNfill); /* shmdt(lnptr); // detach from shared memory segment shmctl(shmid, IPC_RMID, NULL); // remove the shared memory segment hopefully forever */ return 0; }
/*! \fn SimpleSynthGui::SimpleSynthGui() */ SimpleSynthGui::SimpleSynthGui() { SS_TRACE_IN setupUi(this); simplesynthgui_ptr = this; pluginGui = new SS_PluginGui(this); pluginGui->hide(); for (int i=0; i<SS_NR_OF_CHANNELS; i++) { channelButtonGroups[i] = new QGroupBox(this); // channelButtonGroups[i]->setMinimumSize(SS_BTNGRP_WIDTH, SS_BTNGRP_HEIGHT); channelButtonGroups[i]->setTitle(QString::number(i + 1)); QString name = QString("volumeSlider"); name.append(i + 1); channelLayout->addWidget(channelButtonGroups[i]); QVBoxLayout* inchnlLayout = new QVBoxLayout(channelButtonGroups[i]); //, 2, 0, "channelinternallayout"); inchnlLayout->setAlignment(Qt::AlignHCenter); inchnlLayout->setSpacing(1); inchnlLayout->setMargin(0); onOff[i] = new QChannelCheckbox(channelButtonGroups[i], i); // onOff[i]->setMinimumSize(SS_ONOFF_WIDTH, SS_ONOFF_HEIGHT); onOff[i]->setToolTip("Channel " + QString::number(i + 1) + " on/off"); inchnlLayout->addWidget(onOff[i]); connect(onOff[i], SIGNAL(channelState(int, bool)), SLOT(channelOnOff(int, bool))); ///volumeSliders[i] = new QInvertedChannelSlider(Qt::Vertical, i, channelButtonGroups[i]); // By Tim. p4.0.27 Inverted was not correct type. Maybe was work in progress, rest of code was not converted yet? QHBoxLayout *volLayout = new QHBoxLayout(channelButtonGroups[i]); volumeSliders[i] = new QChannelSlider(Qt::Vertical, i, channelButtonGroups[i]); volumeSliders[i]->setMinimum(SS_VOLUME_MIN_VALUE); volumeSliders[i]->setMaximum(SS_VOLUME_MAX_VALUE); ///volumeSliders[i]->setValue(SS_VOLUME_MAX_VALUE - SS_VOLUME_DEFAULT_VALUE); volumeSliders[i]->setValue(SS_VOLUME_DEFAULT_VALUE); // p4.0.27 // volumeSliders[i]->setMinimumSize(SS_VOLSLDR_WIDTH, SS_VOLSLDR_LENGTH); volumeSliders[i]->setToolTip("Volume, channel " + QString::number(i + 1)); // setMinimumSize(SS_VOLSLDR_WIDTH, SS_VOLSLDR_LENGTH); volLayout->addWidget(volumeSliders[i]); chnMeter[i] = new MusEGui::Meter(channelButtonGroups[i]); chnMeter[i]->setFixedWidth(9); chnMeter[i]->setVal(0.0, 0.0, false); meterVal[i] = peakVal[i] = 0.0; chnMeter[i]->setRange(MusEGlobal::config.minMeter, 10.0); chnMeter[i]->show(); volLayout->addWidget(chnMeter[i]); inchnlLayout->addLayout(volLayout); //inchnlLayout->addWidget(volumeSliders[i]); connect(volumeSliders[i], SIGNAL(valueChanged(int, int)), SLOT(volumeChanged(int, int))); pitchKnobs[i] = new QChannelDial(channelButtonGroups[i], i, 0); pitchKnobs[i]->setRange(-63,63); pitchKnobs[i]->setValue(0); pitchKnobs[i]->setToolTip("Pitch, channel " + QString::number(i + 1)); pitchKnobs[i]->setFixedSize(30,30); inchnlLayout->addWidget(pitchKnobs[i]); connect(pitchKnobs[i], SIGNAL(valueChanged(int,int,int)), SLOT(pitchChanged(int,int, int))); nOffLabel[i] = new QLabel(channelButtonGroups[i]); nOffLabel[i]->setText("nOff"); inchnlLayout->addWidget(nOffLabel[i]); nOffIgnore[i] = new QChannelCheckbox(channelButtonGroups[i], i); nOffIgnore[i]->setToolTip("Note off ignore, channel " + QString::number(i + 1)); inchnlLayout->addWidget(nOffIgnore[i]); connect(nOffIgnore[i], SIGNAL(channelState(int, bool)),SLOT(channelNoteOffIgnore(int, bool))); panSliders[i] = new QChannelSlider(Qt::Horizontal, i, channelButtonGroups[i]); panSliders[i]->setRange(0, 127); panSliders[i]->setValue(SS_PANSLDR_DEFAULT_VALUE); panSliders[i]->setToolTip("Pan, channel " + QString::number(i + 1)); inchnlLayout->addWidget(panSliders[i]); connect(panSliders[i], SIGNAL(valueChanged(int, int)), SLOT(panChanged(int, int))); QGridLayout* dialGrid = new QGridLayout; inchnlLayout->addLayout(dialGrid); sendFxDial[i][0] = new QChannelDial(channelButtonGroups[i], i, 0); sendFxDial[i][0]->setRange(0, 127); sendFxDial[i][0]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT); sendFxDial[i][0]->setToolTip("Fx 1 send amount"); dialGrid->addWidget(sendFxDial[i][0], 0, 0, Qt::AlignCenter | Qt::AlignTop); connect(sendFxDial[i][0], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int))); sendFxDial[i][1] = new QChannelDial(channelButtonGroups[i], i, 1); sendFxDial[i][1]->setRange(0, 127); dialGrid->addWidget(sendFxDial[i][1], 0, 1, Qt::AlignCenter | Qt::AlignTop); sendFxDial[i][1]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT); sendFxDial[i][1]->setToolTip("Fx 2 send amount"); connect(sendFxDial[i][1], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int))); sendFxDial[i][2] = new QChannelDial(channelButtonGroups[i], i, 2); sendFxDial[i][2]->setRange(0, 127); sendFxDial[i][2]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT); dialGrid->addWidget(sendFxDial[i][2], 1, 0, Qt::AlignCenter | Qt::AlignTop); sendFxDial[i][2]->setToolTip("Fx 3 send amount"); connect(sendFxDial[i][2], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int))); sendFxDial[i][3] = new QChannelDial(channelButtonGroups[i], i, 3); sendFxDial[i][3]->setRange(0, 127); sendFxDial[i][3]->setMaximumSize(SS_SENDFX_WIDTH, SS_SENDFX_HEIGHT); sendFxDial[i][3]->setToolTip("Fx 4 send amount"); dialGrid->addWidget(sendFxDial[i][3], 1, 1, Qt::AlignCenter | Qt::AlignTop); connect(sendFxDial[i][3], SIGNAL(valueChanged(int, int, int)), SLOT(sendFxChanged(int, int, int))); chnRoutingCb[i] = new QComboBox(channelButtonGroups[i]); chnRoutingCb[i]->addItem(tr("Mix"), QVariant(0)); chnRoutingCb[i]->addItem(tr("Chn"), QVariant(1)); chnRoutingCb[i]->setMaximumSize(SS_PANSLDR_WIDTH, SS_PANSLDR_LENGTH); chnRoutingCb[i]->setToolTip(tr("Channel routing")); QFont chnRFont; chnRFont.setPointSize(6); chnRoutingCb[i]->setFont(chnRFont); connect(chnRoutingCb[i], SIGNAL(currentIndexChanged(int)), this, SLOT(routeChanged(int))); inchnlLayout->addWidget(chnRoutingCb[i]); inchnlLayout->activate(); } masterSlider = new QSlider(Qt::Vertical, this); masterSlider->setToolTip("Master volume"); channelLayout->addWidget(masterSlider); masterSlider->setRange(0, 127); masterSlider->setValue((int)(SS_MASTERVOL_DEFAULT_VALUE*SS_VOLUME_MAX_VALUE)); // p4.0.27 connect(masterSlider, SIGNAL(valueChanged(int)), SLOT(masterVolChanged(int))); // p4.0.27 int i=0; for (int c=0; c<2; c++) { for (int r=0; r<SS_NR_OF_CHANNELS/2; r++) { QHBoxLayout* strip = new QHBoxLayout; mgbLayout->addLayout(strip, r, c); QLabel* channelLabel = new QLabel(QString::number(i + 1) + ": (" +labelStrings[i] + ")", mainGroupBox); strip->addWidget(channelLabel); sampleNameLineEdit[i] = new QLineEdit(mainGroupBox); sampleNameLineEdit[i]->setReadOnly(true); sampleNameLineEdit[i]->setFixedWidth(180); strip->addWidget(sampleNameLineEdit[i]); loadSampleButton[i] = new QChannelButton(mainGroupBox, "L", i); loadSampleButton[i]->setToolTip("Load sample on channel " + QString::number(i + 1)); loadSampleButton[i]->setFixedSize(23,23); strip->addWidget(loadSampleButton[i]); connect(loadSampleButton[i], SIGNAL(channelState(int, bool)), SLOT(loadSampleDialogue(int))); clearSampleButton[i] = new QChannelButton(mainGroupBox, "C", i); clearSampleButton[i]->setToolTip("Clear sample on channel " + QString::number(i + 1)); clearSampleButton[i]->setFixedSize(23,23); strip->addWidget(clearSampleButton[i]); connect(clearSampleButton[i], SIGNAL(channelState(int, bool)), SLOT(clearSample(int))); i++; } } // Right bottom panel: QGroupBox* rbPanel= new QGroupBox(mainGroupBox); mgbLayout->addWidget(rbPanel, 1, 3, 7, 1, Qt::AlignCenter); QGridLayout* rbLayout = new QGridLayout(rbPanel); openPluginsButton = new QPushButton("&Send Effects"); openPluginsButton->setToolTip("Configure LADSPA send effects"); connect(openPluginsButton, SIGNAL(clicked()), SLOT(openPluginButtonClicked())); rbLayout->addWidget(openPluginsButton, 2, 1, Qt::AlignCenter | Qt::AlignVCenter); rbLayout->setSpacing(0); rbLayout->setMargin(0); aboutButton = new QPushButton("About SimpleDrums"); connect(aboutButton, SIGNAL(clicked()), SLOT(aboutButtonClicked())); rbLayout->addWidget(aboutButton, 4, 1, Qt::AlignLeft | Qt::AlignVCenter); loadButton = new QPushButton(tr("&Load setup"), rbPanel); connect(loadButton, SIGNAL(clicked()), SLOT(loadSetup())); saveButton = new QPushButton(tr("&Save setup"), rbPanel); connect(saveButton, SIGNAL(clicked()), SLOT(saveSetup())); rbLayout->addWidget(loadButton, 3, 1, Qt::AlignCenter | Qt::AlignVCenter); rbLayout->addWidget(saveButton, 4, 1, Qt::AlignCenter | Qt::AlignVCenter); rbLayout->addWidget(aboutButton, 6, 1, Qt::AlignCenter | Qt::AlignVCenter); lastDir = ""; //Connect socketnotifier to fifo QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read); connect(s, SIGNAL(activated(int)), SLOT(readMessage(int))); //connect heartBeat timer (for channel meters) connect(MusEGlobal::heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat())); SS_TRACE_OUT }
IndiWidgetGroup::~IndiWidgetGroup() { saveSetup(); delete mSplitter; if(mBars) delete mBars; }