221
227
pluginsDir = QDir(qApp->applicationDirPath());
229
pluginsDir.setNameFilters( QStringList() << "rap*.dll" );
232
pluginsDir.setNameFilters( QStringList() << "librap*.so" );
222
234
foreach( QString fileName, pluginsDir.entryList(QDir::Files) ){
223
TRACE( QString2sString(fileName) );
224
235
QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
225
236
QObject *plugin = loader.instance();
238
RANet::Log.Put(sLog::Warning,"Plugins"
239
,sString("sRAMainWindow::LoadPlugins: file found: '")
240
+FromQString(fileName)
241
+sString("', but cannot be loaded.")
227
244
psDevicePackage P = qobject_cast<psDevicePackage>(plugin);
229
246
if( sEnvironment::Param("install",false) ){
230
247
P->InstallDefaults(sDriver::DeviceList);
250
QTranslator * translator = new QTranslator();
251
if( translator->load(QString("..")+QDir::separator()+"locales"
253
+ToQString(P->Identifier().Tail(1)
255
+sEnvironment::Language )) ){
256
qApp->installTranslator(translator);
233
260
psInstrumentalPackage IP = qobject_cast<psInstrumentalPackage>(plugin);
235
TRACE( IP->TrueType()->Name() );
236
if( RANet::Version < IP->CoreVersionMin() ){
262
RANet::Log.Put(sLog::Debug,"Plugins"
263
,sString("sRAMainWindow::LoadPlugins: InstrumentalPackage: ")
264
+IP->TrueType()->Name() );
265
if( RANet::Version.Principal() < IP->CoreVersionMin().Principal() ){
237
266
QMessageBox::critical(this,tr("Version mismatch")
238
267
,tr("Plugin '%1' version %2 is incompatible with the RA core "
239
268
"program version %3. Please upgrade RA core to at least version "
240
269
"%4. The program will now terminate.")
241
.arg(sString2QString(IP->TrueType()->Name().Tail(1))
242
,sString2QString(IP->Version().Text())
243
,sString2QString(RANet::Version.PrincipalText())
244
,sString2QString(IP->CoreVersionMin().PrincipalText()) )
270
.arg(ToQString(IP->TrueType()->Name().Tail(1))
271
,ToQString(IP->Version().Text())
272
,ToQString(RANet::Version.Principal().Text())
273
,ToQString(IP->CoreVersionMin().Principal().Text()) )
246
275
throw xProgramError("Version mismatch");
248
if( IP->CoreVersionUsed() < RANet::Version ){
277
if( IP->CoreVersionUsed().Principal() < RANet::Version.Principal() ){
249
278
QMessageBox::critical(this,tr("Version mismatch")
250
279
,tr("Plugin '%1' version %2 is not known to be compatible with "
251
280
"the RA core program version %3. Please upgrade the plugin. "
252
281
"The program will now terminate.")
253
.arg(sString2QString(IP->TrueType()->Name())
254
,sString2QString(IP->Version().Text())
255
,sString2QString(RANet::Version.PrincipalText()) )
282
.arg(ToQString(IP->TrueType()->Name())
283
,ToQString(IP->Version().Text())
284
,ToQString(RANet::Version.Principal().Text()) )
257
286
throw xProgramError("Version mismatch");
271
300
// QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
273
302
psActionSignallingText Actn = new sActionSignallingText(this);
274
Actn->setText(sString2QString(IP->TrueType()->Name().Tail(1)));
303
Actn->setText(ToQString(IP->TrueType()->Name().Tail(1)));
275
304
Actn->setStatusTip(IP->UserFriendlyName());
276
Actn->SetDataString(sString2QString(IP->TrueType()->Name().Tail(1))
305
Actn->SetDataString(ToQString(IP->TrueType()->Name().Tail(1))
277
306
+QString(" version ")
278
+sString2QString(IP->Version().Text())
307
+ToQString(IP->Version().Text())
279
308
+QString(".\n\"")
280
309
+IP->UserFriendlyName()
281
310
+QString("\".\n\n")
502
531
MenuSettings = menuBar()->findChild<QMenu *>("MenuSettings");
503
532
if( MenuSettings ){
504
//! @todo{translation} ŃŠ±ŃŠ°ŃŃ ŠøŠ»Šø Š“Š¾Š“ŠµŠ»Š°ŃŃ: Š²ŠøŠ“ŠøŠ¼Š¾, Š½ŃŠ¶Š½Š¾ ŃŠ¾Š·Š“Š°Š²Š°ŃŃ
505
// ŃŠæŠøŃŠ¾Šŗ Š“Š¾ŃŃŃŠæŠ½ŃŃ
ŃŠ·ŃŠŗŠ¾Š² Šø Š“Š»Ń ŠŗŠ°Š¶Š“Š¾Š³Š¾ ŃŠæŠøŃŠ¾Šŗ ŃŠ»Š¾Š²Š°ŃŠµŠ¹,
506
// Š° ŠŗŃŠ¾Š¼Šµ ŃŠ¾Š³Š¾ ŃŠæŠøŃŠ¾Šŗ ŠøŠ½ŃŃŠ°Š»Š»ŠøŃŠ¾Š²Š°Š½Š½ŃŃ
ŃŃŠ°Š½ŃŠ»ŃŃŠ¾ŃŠ¾Š², ŃŃŠ¾Š±Ń ŠøŃ
ŃŠ“Š°Š»ŃŃŃ
533
/*! @todo{UI++} ŠŠµŠ½Ń Š²ŃŠ±Š¾ŃŠ° ŃŠ·ŃŠŗŠ°: ŃŠ±ŃŠ°ŃŃ ŠøŠ»Šø Š“Š¾Š“ŠµŠ»Š°ŃŃ; Š²ŠøŠ“ŠøŠ¼Š¾, Š½ŃŠ¶Š½Š¾
534
ŃŠ¾Š·Š“Š°Š²Š°ŃŃ ŃŠæŠøŃŠ¾Šŗ Š“Š¾ŃŃŃŠæŠ½ŃŃ
ŃŠ·ŃŠŗŠ¾Š² Šø Š“Š»Ń ŠŗŠ°Š¶Š“Š¾Š³Š¾ ŃŠæŠøŃŠ¾Šŗ ŃŠ»Š¾Š²Š°ŃŠµŠ¹, Š° ŠŗŃŠ¾Š¼Šµ
535
ŃŠ¾Š³Š¾ ŃŠæŠøŃŠ¾Šŗ ŠøŠ½ŃŃŠ°Š»Š»ŠøŃŠ¾Š²Š°Š½Š½ŃŃ
ŃŃŠ°Š½ŃŠ»ŃŃŠ¾ŃŠ¾Š², ŃŃŠ¾Š±Ń ŠøŃ
ŃŠ“Š°Š»ŃŃŃ */
507
536
// CreateMenuLanguage();
508
537
if( MenuLanguage ) MenuSettings->addMenu(MenuLanguage);
509
538
MenuUser = new QMenu(this);
730
759
->GetAttr("Version");
731
760
bool Done = false;
732
761
if( LastVerText.IsCorrect() ){
733
sVersion LastVersion((sString)(*LastVerText));
734
if( LastVersion < IP->Version() ){
762
sVersion LastVersion(sVersion::FromString
763
( (sString)(*LastVerText) ) );
764
if( LastVersion.Valuable() < IP->Version().Valuable() ){
735
765
IP->ModifyConfig(LastVersion,List);
736
}else if( IP->Version() < LastVersion ){
766
}else if( IP->Version().Valuable() < LastVersion.Valuable() ){
737
767
QMessageBox::critical(this,tr("Plugin version downshift")
738
768
,tr("Plugin '%1' version %2 may not work with configuration settings "
739
769
"that seem to be done for plugin version %3. "
740
770
"The program will now terminate.")
741
.arg(sString2QString(IP->TrueType()->Name().Tail(1))
742
,sString2QString(IP->Version().Text())
743
,sString2QString(LastVersion.Text()) )
771
.arg(ToQString(IP->TrueType()->Name().Tail(1))
772
,ToQString(IP->Version().Text())
773
,ToQString(LastVersion.Text()) )
745
775
throw xProgramError("Plugin version downshift");
789
819
List |= IP->TrueType()->Name();
790
820
sCluster::sPtr P = List->GetAttr(IP->TrueType()->Name());
791
P << attr("Version",IP->Version().PrincipalText());
794
Configuration |= "Plugins auto-install";
795
sCluster::sPtr List = Configuration->GetAttr("Plugins auto-install");
796
sBooleanNode::sPtr Flag = List->GetAttr(IP->TrueType()->Name());
798
if( Flag.IsCorrect() ) Ask=(bool)(*Flag);
801
D.setWindowTitle(tr("New instrumental plugin"));
802
D.setIcon(QMessageBox::Question);
803
D.setText(tr("New instrumental plugin has been found:")
805
+sString2QString(IP->TrueType()->Name())
807
+IP->UserFriendlyName()
809
+tr("Whould you like to perform a default installation "
810
"for this plugin?"));
811
D.setDetailedText(tr("The plugin may have a default installation "
812
"instructions. These instructions will "
813
"install one or more devices with default "
814
"settings. You will be able to review and "
815
"change any of these settings, as well as "
816
"uninstall any device through the "
817
"Settings menu at any time. Also, you can "
818
"install your devices manually one-by-one.\n\n"
819
"It is recommended, however, to start with "
820
"the default installation provided with this "
822
QAbstractButton * AskBtn;
823
QAbstractButton * NoBtn;
824
QAbstractButton * YesBtn;
825
AskBtn=D.addButton(tr("Ask me next time"),QMessageBox::NoRole);
826
NoBtn=D.addButton(tr("No, I will install every device manually")
827
,QMessageBox::NoRole);
828
YesBtn=D.addButton(tr("Yes, install default devices")
829
,QMessageBox::NoRole);
831
if( D.clickedButton() == YesBtn ){
832
IP->InstallDefaults(sDriver::DeviceList);
834
}else if( D.clickedButton() == NoBtn ){
837
List->SetAttr(bool_attr(IP->TrueType()->Name(),Ask));
821
P << attr("Version",IP->Version().Principal().Text());
875
858
->setStyleSheet("QLabel {background: white; border: 1px solid grey}");
876
859
CursorStatusX = new QLabel(this);
860
CursorStatusY = new QLabel(this);
877
861
CursorStatusDX = new QLabel(this);
878
CursorStatusY = new QLabel(this);
879
862
CursorStatusDY = new QLabel(this);
880
863
CursorStatusX->setVisible(false);
864
CursorStatusY->setVisible(false);
881
865
CursorStatusDX->setVisible(false);
882
CursorStatusY->setVisible(false);
883
866
CursorStatusDY->setVisible(false);
867
CursorStatusDX->setStyleSheet("color: navy");
868
CursorStatusDY->setStyleSheet("color: navy");
884
869
statusBar()->addPermanentWidget(CursorStatusX);
870
statusBar()->addPermanentWidget(CursorStatusY);
885
871
statusBar()->addPermanentWidget(CursorStatusDX);
886
statusBar()->addPermanentWidget(CursorStatusY);
887
872
statusBar()->addPermanentWidget(CursorStatusDY);
891
void sRAMainWindow::ShowCursorInfo (QString X
876
void sRAMainWindow::ShowCursorInfo (sPhysPair position
896
CursorStatusX->setText(X);
897
CursorStatusDX->setText(DX);
898
CursorStatusY->setText(Y);
899
CursorStatusDY->setText(DY);
881
sPhysPair Difference(position);
883
if( x_title.Empty() ){
884
CursorStatusX->setText(ToQString( position.X.Text(HTML,Laconic) ));
886
CursorStatusX->setText(ToQString( sString("<i>") + x_title + "</i>="
887
+ position.X.Text(HTML,Laconic)));
889
if( y_title.Empty() ){
890
CursorStatusY->setText(ToQString( position.Y.Text(HTML,Laconic) ));
892
CursorStatusY->setText(ToQString( sString("<i>") + y_title + "</i>="
893
+ position.Y.Text(HTML,Laconic) ));
900
895
if( ! CursorStatusX->isVisible() ) CursorStatusX->setVisible(true);
901
if( ! CursorStatusDX->isVisible() ) CursorStatusDX->setVisible(true);
902
896
if( ! CursorStatusY->isVisible() ) CursorStatusY->setVisible(true);
903
if( ! CursorStatusDY->isVisible() ) CursorStatusDY->setVisible(true);
898
Difference = position - reference;
899
if( x_title.Empty() ){
900
CursorStatusDX->setText(ToQString( sString(Symbol::DeltaCapital) + "="
901
+ Difference.X.Text(HTML,Laconic) ));
903
CursorStatusDX->setText(ToQString(
904
sString(Symbol::DeltaCapital) + "<sub><i>" + x_title + "</i></sub>="
905
+ Difference.X.Text(HTML,Laconic)
908
if( y_title.Empty() ){
909
CursorStatusDY->setText(ToQString( sString(Symbol::DeltaCapital) + "="
910
+ Difference.Y.Text(HTML,Laconic) ));
912
CursorStatusDY->setText(ToQString(
913
sString(Symbol::DeltaCapital) + "<sub><i>" + y_title + "</i></sub>="
914
+ Difference.Y.Text(HTML,Laconic)
920
if( CursorStatusDX->isVisible() != OK ) CursorStatusDX->setVisible(OK);
921
if( CursorStatusDY->isVisible() != OK ) CursorStatusDY->setVisible(OK);
1103
1123
sNet::Manager->Undo.GroupOpen();
1104
1124
Cfg= (Desktop>>"Children").MakeSubcluster();
1105
1125
Cfg << attr("Type","Workbook")
1106
<< attr("Title","Records")
1126
<< attr("Title",FromQString(tr("Records")))
1107
1127
<< attr("Content" ,Records)
1108
1128
<< attr("DockArea",int(Qt::LeftDockWidgetArea));
1109
1129
CreateSubwidget(Cfg);
1117
1137
sNet::Manager->Undo.GroupOpen();
1118
1138
Cfg= (Desktop>>"Children").MakeSubcluster();
1119
1139
Cfg << attr("Type","Workbook")
1120
<< attr("Title","Samples")
1140
<< attr("Title",FromQString(tr("Samples")))
1121
1141
<< attr("Content" ,Samples)
1122
1142
<< attr("DockArea",int(Qt::LeftDockWidgetArea));
1123
1143
CreateSubwidget(Cfg);
1131
1151
sNet::Manager->Undo.GroupOpen();
1132
1152
Cfg= (Desktop>>"Children").MakeSubcluster();
1133
1153
Cfg << attr("Type","Workbook")
1134
<< attr("Title","Topics")
1154
<< attr("Title",FromQString(tr("Topics")))
1135
1155
<< attr("Content" ,Topics)
1136
1156
<< attr("DockArea",int(Qt::LeftDockWidgetArea));
1137
1157
CreateSubwidget(Cfg);