/***************************************************************************
mainqtwidget . cpp - The main TQt / KDE window
- - - - - - - - - - - - - - - - - - -
begin : Tue Mar 16 00 : 00 : 00 CET 2003
copyright : ( C ) 2003 - 2004 by Sebastian Stein
email : seb . kde @ hpfsc . de
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/***************************************************************************
* *
* This program 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 2 of the License , or *
* ( at your option ) any later version . *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include "mainqtwidget.h"
# include <config.h>
# include <kaccel.h>
# include <kapplication.h>
# include <kaction.h>
# include <kdebug.h>
# include <kiconloader.h>
# include <kjanuswidget.h>
# include <kconfigdialog.h>
# include <klocale.h>
# include <tqsplitter.h>
# include <tqlabel.h>
# include <tqtooltip.h>
# include <tqwhatsthis.h>
# include <tqwidget.h>
# include <math.h>
# include "exercisecompare.h"
# include "exerciseconvert.h"
# include "exercisefactorize.h"
# include "taskview.h"
# include "taskvieweroptionsbase.h"
# include "statisticsview.h"
# include "settingsclass.h"
/* ------ public member functions ------ */
MainTQtWidget : : MainTQtWidget ( )
{
# ifdef DEBUG
kdDebug ( ) < < " constructor MainTQtWidget " < < endl ;
# endif
// get the settings
readOptions ( ) ;
// creating KActions, used by the kbruchui.rc file
setupActions ( ) ;
createGUI ( 0L ) ;
// we split the main view into 2 parts, one for the tasks, one for the
// statistics
TQSplitter * splitter = new TQSplitter ( Qt : : Horizontal , this , TQSPLITTER_OBJECT_NAME_STRING ) ;
setCentralWidget ( splitter ) ;
// the iconlist, where the user can choose the different exercises
m_exercises = new KJanusWidget ( splitter , " KJanusWidget " , KJanusWidget : : IconList ) ;
TQToolTip : : add ( m_exercises , i18n ( " Choose another exercise by clicking on an icon. " ) ) ;
TQWhatsThis : : add ( m_exercises , i18n ( " Click on the different icons to choose another exercise. The exercises help you to practice different aspects of calculating with fractions. " ) ) ;
// create the statistic view
m_statview = new StatisticsView ( splitter , " StatisticsView " ) ;
// add the pages
//
// we have the exercise to solve fraction tasks
TQVBox * page = m_exercises - > addVBoxPage ( i18n ( " Fraction Task " ) , " " , DesktopIcon ( " kbruch_exercise_common " ) ) ;
m_taskview = new TaskView ( ( TQWidget * ) page , " TaskView " , m_addSub , m_mulDiv , m_nrRatios , m_maxMainDenominator ) ;
// we have the exercise to compare ratios
page = m_exercises - > addVBoxPage ( i18n ( " Comparison " ) , " " , DesktopIcon ( " kbruch_exercise_compare " ) ) ;
m_exerciseCompare = new ExerciseCompare ( ( TQWidget * ) page , " ExerciseCompare " ) ;
// we have the exercise to convert rational numbers into ratios
page = m_exercises - > addVBoxPage ( i18n ( " Conversion " ) , " " , DesktopIcon ( " kbruch_exercise_conversion " ) ) ;
m_exerciseConvert = new ExerciseConvert ( ( TQWidget * ) page , " ExerciseConvert " ) ;
// we have the exercise to factorize a given number into prime factors
page = m_exercises - > addVBoxPage ( i18n ( " Factorization " ) , " " , DesktopIcon ( " kbruch_exercise_factorisation " ) ) ;
m_exerciseFactorize = new ExerciseFactorize ( ( TQWidget * ) page , " ExerciseFactorize " ) ;
splitter - > setResizeMode ( m_statview , TQSplitter : : FollowSizeHint ) ;
// we must change the status of the menubar before another page is shown
TQObject : : connect ( m_exercises , TQT_SIGNAL ( aboutToShowPage ( TQWidget * ) ) , this , TQT_SLOT ( slotAboutToShowPage ( TQWidget * ) ) ) ;
// connect signals of the exercises and StatisticView, so that StatisticView
// gets informed about how the user solved a given task (wrong or correct)
TQObject : : connect ( m_taskview , TQT_SIGNAL ( signalTaskSolvedCorrect ( ) ) , m_statview , TQT_SLOT ( addCorrect ( ) ) ) ;
TQObject : : connect ( m_taskview , TQT_SIGNAL ( signalTaskSolvedWrong ( ) ) , m_statview , TQT_SLOT ( addWrong ( ) ) ) ;
TQObject : : connect ( m_exerciseCompare , TQT_SIGNAL ( signalExerciseSolvedCorrect ( ) ) , m_statview , TQT_SLOT ( addCorrect ( ) ) ) ;
TQObject : : connect ( m_exerciseCompare , TQT_SIGNAL ( signalExerciseSolvedWrong ( ) ) , m_statview , TQT_SLOT ( addWrong ( ) ) ) ;
TQObject : : connect ( m_exerciseConvert , TQT_SIGNAL ( signalExerciseSolvedCorrect ( ) ) , m_statview , TQT_SLOT ( addCorrect ( ) ) ) ;
TQObject : : connect ( m_exerciseConvert , TQT_SIGNAL ( signalExerciseSolvedWrong ( ) ) , m_statview , TQT_SLOT ( addWrong ( ) ) ) ;
TQObject : : connect ( m_exerciseFactorize , TQT_SIGNAL ( signalExerciseSolvedCorrect ( ) ) , m_statview , TQT_SLOT ( addCorrect ( ) ) ) ;
TQObject : : connect ( m_exerciseFactorize , TQT_SIGNAL ( signalExerciseSolvedWrong ( ) ) , m_statview , TQT_SLOT ( addWrong ( ) ) ) ;
# if (KDE_VERSION_MINOR>=3) && (KDE_VERSION_MAJOR>=3)
# else
resize ( TQSize ( TQMAX ( toolBar ( ) - > tqsizeHint ( ) . width ( ) , tqsizeHint ( ) . width ( ) ) , tqsizeHint ( ) . height ( ) ) ) ;
# endif
// now show the last exercise
m_exercises - > showPage ( SettingsClass : : activeExercise ( ) ) ;
slotAboutToShowPage ( m_exercises - > pageWidget ( m_exercises - > activePageIndex ( ) ) ) ;
}
MainTQtWidget : : ~ MainTQtWidget ( )
{
}
/* ------ private member functions ------ */
void MainTQtWidget : : readOptions ( )
{
m_addSub = SettingsClass : : addsub ( ) ;
m_mulDiv = SettingsClass : : muldiv ( ) ;
m_nrRatios = SettingsClass : : number_ratios ( ) ;
m_maxMainDenominator = SettingsClass : : max_main_denominator ( ) ;
/* make sure that we can load config files with corrupted values */
if ( m_mulDiv = = true & & pow ( 2 , m_nrRatios ) > m_maxMainDenominator )
{
m_nrRatios = 2 ;
m_maxMainDenominator = 10 ;
}
}
void MainTQtWidget : : writeOptions ( )
{
SettingsClass : : setActiveExercise ( m_exercises - > activePageIndex ( ) ) ;
// save settings for exercise solve task with fractions
SettingsClass : : setAddsub ( m_addSub ) ;
SettingsClass : : setMuldiv ( m_mulDiv ) ;
SettingsClass : : setNumber_ratios ( m_nrRatios ) ;
SettingsClass : : setMax_main_denominator ( m_maxMainDenominator ) ;
SettingsClass : : writeConfig ( ) ;
}
void MainTQtWidget : : setupActions ( )
{
// new task action
m_NewTaskAction = new KAction ( i18n ( " &New " ) , " filenew " , KStdAccel : : shortcut ( KStdAccel : : New ) ,
TQT_TQOBJECT ( this ) , TQT_SLOT ( NewTask ( ) ) ,
actionCollection ( ) , " NewTask " ) ;
// quit action
KStdAction : : quit ( TQT_TQOBJECT ( kapp ) , TQT_SLOT ( quit ( ) ) , actionCollection ( ) ) ;
//
KStdAction : : preferences ( TQT_TQOBJECT ( this ) , TQT_SLOT ( slotPrefs ( ) ) , actionCollection ( ) ) ;
// a label just describing the Number of terms ComboBox
m_NrOfTermsLabel = new TQLabel ( i18n ( " Terms: " ) , 0 , " kde toolbar widget " ) ;
m_NrOfTermsLabelAction = new KWidgetAction ( m_NrOfTermsLabel , i18n ( " Terms: " ) , ALT + Key_E ,
TQT_TQOBJECT ( this ) , TQT_SLOT ( NrOfTermsBoxSlot ( ) ) ,
actionCollection ( ) , " NrOfTermsLabelAction " ) ;
// the ComboBox holding possible values for term number
m_NrOfTermsBox = new TQComboBox ( ) ;
m_NrOfTermsBox - > insertItem ( " 2 " ) ;
m_NrOfTermsBox - > insertItem ( " 3 " ) ;
m_NrOfTermsBox - > insertItem ( " 4 " ) ;
m_NrOfTermsBox - > insertItem ( " 5 " ) ;
m_NrOfTermsBox - > setCurrentItem ( m_nrRatios - 2 ) ;
TQToolTip : : add ( m_NrOfTermsBox , i18n ( " The number of terms you want " ) ) ;
TQWhatsThis : : add ( m_NrOfTermsBox , i18n ( " Choose the number of terms (2, 3, 4 or 5) you want for calculating fractions. " ) ) ;
m_NrOfTermsBoxAction = new KWidgetAction ( m_NrOfTermsBox , i18n ( " Number of Terms " ) , ALT + Key_E , TQT_TQOBJECT ( this ) , TQT_SLOT ( NrOfTermsBoxSlot ( ) ) , actionCollection ( ) , " NrOfTermsBoxAction " ) ;
// now connect the ComboBox's signal textChanged() to the slot function
TQObject : : connect ( m_NrOfTermsBox , TQT_SIGNAL ( activated ( int ) ) , TQT_TQOBJECT ( this ) , TQT_SLOT ( NrOfTermsBoxSlot ( ) ) ) ;
// a label just describing the max. main denominator ComboBox
m_MaxMainDenominatorLabel = new TQLabel ( i18n ( " Max. main denominator: " ) , 0 , " kde toolbar widget " ) ;
m_MaxMainDenominatorLabelAction = new KWidgetAction ( m_MaxMainDenominatorLabel , i18n ( " Max. main denominator: " ) , ALT + Key_D ,
TQT_TQOBJECT ( this ) , TQT_SLOT ( MaxMainDenominatorBoxSlot ( ) ) ,
actionCollection ( ) , " MaxMainDenominatorLabelAction " ) ;
// the ComboBox holding possible values for the max. main denominator
m_MaxMainDenominatorBox = new TQComboBox ( this ) ;
m_MaxMainDenominatorBox - > insertItem ( " 10 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 20 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 30 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 50 " ) ;
TQToolTip : : add ( m_MaxMainDenominatorBox , i18n ( " The maximum number you can have as main denominator " ) ) ;
TQWhatsThis : : add ( m_MaxMainDenominatorBox , i18n ( " Choose the number which will be the maximum for the main denominator: 10, 20, 30, 40 or 50. " ) ) ;
switch ( m_maxMainDenominator )
{
case 10 : m_MaxMainDenominatorBox - > setCurrentItem ( 0 ) ;
break ;
case 20 : m_MaxMainDenominatorBox - > setCurrentItem ( 1 ) ;
break ;
case 30 : m_MaxMainDenominatorBox - > setCurrentItem ( 2 ) ;
break ;
case 50 : m_MaxMainDenominatorBox - > setCurrentItem ( 3 ) ;
break ;
}
m_MaxMainDenominatorBoxAction = new KWidgetAction ( m_MaxMainDenominatorBox , i18n ( " Maximal Main Denominator " ) , ALT + Key_D , TQT_TQOBJECT ( this ) , TQT_SLOT ( MaxMainDenominatorBoxSlot ( ) ) , actionCollection ( ) , " MaxMainDenominatorBoxAction " ) ;
// now connect the ComboBox's signal textChanged() to the slot function
TQObject : : connect ( m_MaxMainDenominatorBox , TQT_SIGNAL ( activated ( int ) ) ,
this , TQT_SLOT ( MaxMainDenominatorBoxSlot ( ) ) ) ;
// a label just describing the operation ComboBox
m_OperationLabel = new TQLabel ( i18n ( " Operations: " ) , 0 , " kde toolbar widget " ) ;
m_OperationLabelAction = new KWidgetAction ( m_OperationLabel , i18n ( " Operations: " ) , ALT + Key_O ,
TQT_TQOBJECT ( this ) , TQT_SLOT ( OperationBoxSlot ( ) ) ,
actionCollection ( ) , " OperationLabelAction " ) ;
// the ComboBox holding possible combinations for operations
m_OperationBox = new TQComboBox ( this ) ;
m_OperationBox - > insertItem ( i18n ( " Addition/Subtraction " ) ) ;
m_OperationBox - > insertItem ( i18n ( " Multiplication/Division " ) ) ;
m_OperationBox - > insertItem ( i18n ( " All Operations Mixed " ) ) ;
if ( m_addSub = = true & & m_mulDiv = = false )
{
m_OperationBox - > setCurrentItem ( 0 ) ;
} else if ( m_addSub = = false & & m_mulDiv = = true ) {
m_OperationBox - > setCurrentItem ( 1 ) ;
} else if ( m_addSub = = true & & m_mulDiv = = true ) {
m_OperationBox - > setCurrentItem ( 2 ) ;
}
TQToolTip : : add ( m_OperationBox , i18n ( " The operations you want " ) ) ;
TQWhatsThis : : add ( m_OperationBox , i18n ( " Choose the type of operations you want for calculating fractions: Addition/Substraction, Multiplication/Division or All Operations Mixed. If you choose All Operations Mixed, the program will randomly choose addition, substraction, multiplication and/or division. " ) ) ;
m_OperationBoxAction = new KWidgetAction ( m_OperationBox , i18n ( " Operations: " ) , ALT + Key_O , TQT_TQOBJECT ( this ) , TQT_SLOT ( OperationBoxSlot ( ) ) , actionCollection ( ) , " OperationBoxAction " ) ;
// now connect the ComboBox's signal textChanged() to the slot function
TQObject : : connect ( m_OperationBox , TQT_SIGNAL ( activated ( int ) ) , this , TQT_SLOT ( OperationBoxSlot ( ) ) ) ;
# if (KDE_VERSION_MINOR>=3) && (KDE_VERSION_MAJOR>=3)
if ( ! initialGeometrySet ( ) )
resize ( TQSize ( 725 , 330 ) . expandedTo ( tqminimumSizeHint ( ) ) ) ;
setupGUI ( ToolBar | Keys | StatusBar | Create ) ;
setAutoSaveSettings ( ) ;
# endif
}
/* ------ private slots ------ */
void MainTQtWidget : : NewTask ( )
{
# ifdef DEBUG
kdDebug ( ) < < " NewTask MainTQtWidget " < < endl ;
kdDebug ( ) < < " pageIndex(m_taskview): " < < m_exercises - > pageIndex ( m_taskview ) < < endl ;
kdDebug ( ) < < " pageIndex(m_exerciseCompare): " < < m_exercises - > pageIndex ( m_exerciseCompare ) < < endl ;
kdDebug ( ) < < " pageIndex(m_exerciseConvert): " < < m_exercises - > pageIndex ( m_exerciseConvert ) < < endl ;
# endif
// check which page should generate a new task
switch ( m_exercises - > activePageIndex ( ) )
{
case 0 :
m_taskview - > forceNewTask ( ) ;
break ;
case 1 :
m_exerciseCompare - > forceNewTask ( ) ;
break ;
case 2 :
m_exerciseConvert - > forceNewTask ( ) ;
break ;
case 3 :
m_exerciseFactorize - > forceNewTask ( ) ;
break ;
}
/* this doesn't seem to work, because pageIndex always returns 0
if ( m_exercises - > activePageIndex ( ) = = m_exercises - > pageIndex ( m_taskview ) )
{
m_taskview - > forceNewTask ( ) ;
return ;
}
if ( m_exercises - > activePageIndex ( ) = = m_exercises - > pageIndex ( m_exerciseCompare ) )
{
m_exerciseCompare - > forceNewTask ( ) ;
return ;
}
*/
/* this even do not compile, but I don't know why
switch ( m_exercises - > activePageIndex ( ) )
{
case m_exercises - > pageIndex ( m_taskview ) :
break ;
case m_exercises - > pageIndex ( m_exerciseCompare ) :
m_exerciseCompare - > forceNewTask ( ) ;
break ;
}
*/
return ;
}
void MainTQtWidget : : NrOfTermsBoxSlot ( )
{
# ifdef DEBUG
kdDebug ( ) < < " MainTQtWidget::NrOfTermsBoxSlot() " < < endl ;
# endif
TQString curr_nr = m_NrOfTermsBox - > currentText ( ) ;
m_MaxMainDenominatorBox - > clear ( ) ;
if ( m_mulDiv = = true )
{
if ( curr_nr = = " 2 " )
{
m_MaxMainDenominatorBox - > insertItem ( " 10 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 20 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 30 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 50 " ) ;
m_nrRatios = 2 ;
m_maxMainDenominator = 10 ;
} else if ( curr_nr = = " 3 " ) {
m_MaxMainDenominatorBox - > insertItem ( " 20 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 30 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 50 " ) ;
m_nrRatios = 3 ;
m_maxMainDenominator = 20 ;
} else if ( curr_nr = = " 4 " ) {
m_MaxMainDenominatorBox - > insertItem ( " 20 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 30 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 50 " ) ;
m_nrRatios = 4 ;
m_maxMainDenominator = 20 ;
} else {
m_MaxMainDenominatorBox - > insertItem ( " 50 " ) ;
m_nrRatios = 5 ;
m_maxMainDenominator = 50 ;
}
m_MaxMainDenominatorBox - > setCurrentItem ( 0 ) ;
} else {
/* no multiplication or division allowed, so we add the default values */
m_MaxMainDenominatorBox - > insertItem ( " 10 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 20 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 30 " ) ;
m_MaxMainDenominatorBox - > insertItem ( " 50 " ) ;
if ( curr_nr = = " 2 " )
m_nrRatios = 2 ;
else if ( curr_nr = = " 3 " )
m_nrRatios = 3 ;
else if ( curr_nr = = " 4 " )
m_nrRatios = 4 ;
else
m_nrRatios = 5 ;
} // if (m_mulDiv == true)
// set the new task parameters
( void ) m_taskview - > setTaskParameters ( m_addSub , m_mulDiv , m_nrRatios , m_maxMainDenominator ) ;
}
void MainTQtWidget : : MaxMainDenominatorBoxSlot ( )
{
# ifdef DEBUG
kdDebug ( ) < < " MainTQtWidget::MaxMainDenominatorBoxSlot() " < < endl ;
# endif
// get the max. size from the ComboBox, convert it to a number and store
// it in the private member
TQString curr_md = m_MaxMainDenominatorBox - > currentText ( ) ;
m_maxMainDenominator = curr_md . toUInt ( ) ;
// set the new task parameters
( void ) m_taskview - > setTaskParameters ( m_addSub , m_mulDiv , m_nrRatios , m_maxMainDenominator ) ;
}
void MainTQtWidget : : OperationBoxSlot ( )
{
# ifdef DEBUG
kdDebug ( ) < < " MainTQtWidget::OperationBoxSlot() " < < endl ;
# endif
int index = m_OperationBox - > currentItem ( ) ; // get selected item
// user has selected the operations for the next task, so store it in the
// private members
if ( index = = 0 )
{
m_addSub = true ;
m_mulDiv = false ;
/* set the number of terms box and max main denominator box correctly */
NrOfTermsBoxSlot ( ) ;
} else if ( index = = 1 ) {
m_addSub = false ;
m_mulDiv = true ;
/* set the number of terms box and max main denominator box correctly */
NrOfTermsBoxSlot ( ) ;
} else {
m_addSub = true ;
m_mulDiv = true ;
/* set the number of terms box and max main denominator box correctly */
NrOfTermsBoxSlot ( ) ;
}
// set the new task parameters
( void ) m_taskview - > setTaskParameters ( m_addSub , m_mulDiv , m_nrRatios , m_maxMainDenominator ) ;
}
void MainTQtWidget : : slotPrefs ( )
{
// do not show dialog twice
if ( KConfigDialog : : showDialog ( " settings " ) )
return ;
//KConfigDialog didn't find an instance of this dialog, so lets create it :
KConfigDialog * configDialog = new KConfigDialog ( this , " settings " , SettingsClass : : self ( ) ) ;
TaskViewerOptionsBase * taskViewerOptions = new TaskViewerOptionsBase ( 0 , " TaskViewerOptionsBase " ) ;
configDialog - > addPage ( taskViewerOptions , i18n ( " Task Viewer Settings " ) , " colorize " ) ;
// User edited the configuration - update your local copies of the
// configuration data
connect ( configDialog , TQT_SIGNAL ( settingsChanged ( ) ) , this , TQT_SLOT ( slotApplySettings ( ) ) ) ;
configDialog - > show ( ) ;
/*
SettingsDialog * dlg = new SettingsDialog ( this ) ;
connect ( dlg , TQT_SIGNAL ( configChanged ( ) ) , this , TQT_SLOT ( slotApplySettings ( ) ) ) ;
dlg - > exec ( ) ;
delete dlg ;
dlg = NULL ;
*/
return ;
}
void MainTQtWidget : : slotApplySettings ( )
{
// update the task view
m_taskview - > update ( ) ;
m_exerciseCompare - > update ( ) ;
m_exerciseConvert - > update ( ) ;
m_exerciseFactorize - > update ( ) ;
return ;
}
void MainTQtWidget : : slotAboutToShowPage ( TQWidget * page )
{
# ifdef DEBUG
kdDebug ( ) < < " slotAboutToShowPage MainTQtWidget " < < endl ;
kdDebug ( ) < < " pageIndex(m_taskview): " < < m_exercises - > pageIndex ( m_taskview ) < < endl ;
kdDebug ( ) < < " pageIndex(m_exerciseCompare): " < < m_exercises - > pageIndex ( m_exerciseCompare ) < < endl ;
kdDebug ( ) < < " pageIndex(m_exerciseConvert): " < < m_exercises - > pageIndex ( m_exerciseConvert ) < < endl ;
# endif
// check which page to show
if ( m_exercises - > pageIndex ( page ) = = m_exercises - > pageIndex ( m_taskview ) )
{
// exercise solve task with fraction (taskview.h)
m_NrOfTermsBox - > setEnabled ( true ) ;
m_MaxMainDenominatorBox - > setEnabled ( true ) ;
m_OperationBox - > setEnabled ( true ) ;
} else {
m_NrOfTermsBox - > setEnabled ( false ) ;
m_MaxMainDenominatorBox - > setEnabled ( false ) ;
m_OperationBox - > setEnabled ( false ) ;
}
return ;
}
bool MainTQtWidget : : queryExit ( )
{
writeOptions ( ) ;
return true ;
}
# include "mainqtwidget.moc"