diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-17 01:24:36 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-17 01:24:36 +0000 |
commit | a8c9924456e5335c964e4e55b2dde1963c88726f (patch) | |
tree | f5bf107ba079ae460536da778ce2da5e6c68aa69 /knights/knights.cpp | |
download | knights-a8c9924456e5335c964e4e55b2dde1963c88726f.tar.gz knights-a8c9924456e5335c964e4e55b2dde1963c88726f.zip |
Added KDE3 version of Knights
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/knights@1091568 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'knights/knights.cpp')
-rw-r--r-- | knights/knights.cpp | 1024 |
1 files changed, 1024 insertions, 0 deletions
diff --git a/knights/knights.cpp b/knights/knights.cpp new file mode 100644 index 0000000..ae68539 --- /dev/null +++ b/knights/knights.cpp @@ -0,0 +1,1024 @@ +/*************************************************************************** + knights.cpp - description + ------------------- + begin : Thu Mar 1 10:43:51 CST 2001 + copyright : (C) 2003 by Troy Corbin Jr. + email : tcorbin@users.sourceforge.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +/* Local */ +#include "knights.moc" +#include "core.h" +#include "wiz_setup.h" +#include "pgn.h" +#include "splash.h" +#include "dlg_settings.h" +#include "dlg_newmatch.h" +/* KDE */ +#include <kmenubar.h> +#include <kmessagebox.h> +#include <kicontheme.h> +#include <kkeydialog.h> +#include <kcombobox.h> +#include <kpopupmenu.h> +#include <klocale.h> +/* KFile */ +#include <kfiledialog.h> +/* Qt */ +#include <qpalette.h> +#include <qiconset.h> +#include <qlabel.h> +#include <qframe.h> +#include <qstyle.h> + +Knights::Knights(KCmdLineArgs *Args, QWidget *parent, const char *name) : KMainWindow(parent, name) +{ + InitAll = TRUE; + ResizeFlag = TRUE; + Minimized = FALSE; + args = Args; + SplashScreen = NULL; + setFocusPolicy( ClickFocus ); +} +Knights::~Knights() +{ + if( !InitAll ) + KillAll(); +} +/////////////////////////////////////// +// +// Knights::BirthAll +// +/////////////////////////////////////// +void Knights::BirthAll(void) +{ + SettingsDialog = NULL; + Resource = new resource(args); + + if( Resource->OPTION_Show_Splash ) + SplashScreen = new splash(); + + aboutData = new KAboutData( "knights", I18N_NOOP("Knights"), _VERSION_ ); + topMenu = menuBar(); + myAccel = new Accel( this, Resource->myAccel ); + help = helpMenu(); + fileMenu = new KPopupMenu( this , "fileMenu"); + settingsMenu = new KPopupMenu( this, "settingsMenu"); + matchMenu = new KPopupMenu( this, "matchMenu"); + drawMenu = new KPopupMenu( this, "drawMenu"); + tutorialMenu = new KPopupMenu( this, "tutorialMenu"); + MainFrame = new QFrame( this, "MainFrame" ); + Core = new core( MainFrame, "Core", Resource ); + Message = new QLabel( MainFrame, "Message"); + whiteTimeLabel = new QLabel( MainFrame, "whiteTimeLabel"); + blackTimeLabel = new QLabel( MainFrame, "blackTimeLabel"); + notationBar = new KComboBox( MainFrame, "notationBar"); + + /* Connect all Signals & Slots */ + connect( Core, SIGNAL( requestResize() ), this, SLOT( resizeMainFrame() ) ); + connect( Core, SIGNAL( setStatusBar(const int&, const QString& ) ), this, SLOT( setStatusBar(const int&, const QString& ) ) ); + connect( Core, SIGNAL( setNotation() ), this, SLOT( setNotation() ) ); + connect( Core, SIGNAL( initMatch() ), this, SLOT( initMatch() ) ); + connect( Core, SIGNAL( setClocks() ), this, SLOT( setClocks() ) ); + connect( Core, SIGNAL( serverDestroyed() ), this, SLOT( netConnect() ) ); + connect( notationBar, SIGNAL( activated(int) ), Core, SLOT( review(int) ) ); +} +/////////////////////////////////////// +// +// Knights::menuClose +// +/////////////////////////////////////// +void Knights::menuClose(void) +{ + if( !queryClose() ) + return; + qApp->quit(); +} +/////////////////////////////////////// +// +// Knights::queryClose +// +/////////////////////////////////////// +bool Knights::queryClose(void) +{ + return Core->clearAll(); +} +/////////////////////////////////////// +// +// Knights::KillAll +// +/////////////////////////////////////// +void Knights::KillAll(void) +{ + delete Core; + delete fileMenu; + delete matchMenu; + delete drawMenu; + delete tutorialMenu; + delete settingsMenu; + delete whiteTimeLabel; + delete blackTimeLabel; + delete notationBar; + delete Message; + delete aboutData; + delete MainFrame; + delete myAccel; + delete Resource; + InitAll = TRUE; +} +/////////////////////////////////////// +// +// Knights::init +// +/////////////////////////////////////// +bool Knights::init( void ) +{ + wiz_setup *Wizard; + QColorGroup GroupWhite; + QColorGroup GroupBlack; + + BirthAll(); + SelectTheme(-1,-1); + Resource->setAudio(); + ResizeFlag = FALSE; + + /* + Connect Accelerators + */ + connect( Resource->myAccel, SIGNAL( board_up() ), this, SLOT( boardBigger() ) ); + connect( Resource->myAccel, SIGNAL( board_down() ), this, SLOT( boardSmaller() ) ); + connect( Resource->myAccel, SIGNAL( move_prev() ), this, SLOT( PrevNotation() ) ); + connect( Resource->myAccel, SIGNAL( move_next() ), this, SLOT( NextNotation() ) ); + connect( this, SIGNAL( focus( const QChar& ) ), Resource->myAccel, SIGNAL( focus( const QChar& ) ) ); + + initMenus(); + + /* Init Message */ + Message->setAlignment( Qt::AlignAuto | Qt::AlignVCenter | Qt::SingleLine ); + + /* Init White Time Label */ + GroupWhite.setColor( QColorGroup::Background, Resource->COLOR_White ); + GroupWhite.setColor( QColorGroup::Foreground, Resource->COLOR_Black ); + whiteTimeLabel->setPalette( QPalette( GroupWhite, GroupWhite, GroupWhite ) ); + whiteTimeLabel->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); + whiteTimeLabel->setAlignment( Qt::AlignCenter | Qt::SingleLine ); + + /* Init Black Time Label */ + GroupBlack.setColor( QColorGroup::Background, Resource->COLOR_Black ); + GroupBlack.setColor( QColorGroup::Foreground, Resource->COLOR_White ); + blackTimeLabel->setPalette( QPalette( GroupBlack, GroupBlack, GroupBlack ) ); + blackTimeLabel->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); + blackTimeLabel->setAlignment( Qt::AlignCenter | Qt::SingleLine ); + + /* Configure self */ + setCentralWidget( MainFrame ); + InitAll = FALSE; + resizeMainFrame(); + show(); + setStatusBar( READY ); + + /* Remove the Splash Screen */ + if( SplashScreen != NULL ) + { + delete SplashScreen; + } + + /* Run the Setup Wizard if needed */ + if( Resource->Config_Version < CONFIG_VERSION ) + { + Wizard = new wiz_setup( this, "wiz_setup", Resource ); + Wizard->exec(); + delete Wizard; + resizeMainFrame(); + /* if( !Resource->Accepted_License ) + return FALSE;*/ + Resource->Config_Version = CONFIG_VERSION; + } + + /* Begin loading file from command line */ + if( args->count() ) + { + Core->load( QString( args->arg( 0 ) ) ); + } + else + { + /* Bring up a match or pgn file */ + switch( Resource->OPTION_On_Init ) + { + case MENU_SOLITARE: + Core->newMatch( new match_param( Resource, PLAYERLOCAL, PLAYERLOCAL ) ); + break; + case MENU_VS_PC: + if( Resource->engines.count() ) + { + Core->newMatch( new match_param( Resource, PLAYERLOCAL, PLAYERPC ) ); + } + break; + case MENU_CONNECT: + netConnect(); + break; + default: + break; + } + } + return TRUE; +} +/////////////////////////////////////// +// +// Knights::initMenus +// +/////////////////////////////////////// +void Knights::initMenus( void ) +{ + /* + matchMenu menu + */ + matchMenu->setCheckable(TRUE); + // MENU_DRAW + matchMenu->insertItem( i18n( "&Draw" ), drawMenu, MENU_DRAW ); + matchMenu->setItemEnabled( MENU_DRAW, FALSE ); + // MENU_RETRACT + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("undo"), KIcon::Small ) ), + i18n( "&Retract Move" ), Core, SLOT(matchMenu(int)), 0, MENU_RETRACT ); + matchMenu->setItemEnabled( MENU_RETRACT, FALSE ); + matchMenu->setWhatsThis( MENU_RETRACT, i18n( "Select this to retract your last move." ) ); + // MENU_RESIGN + matchMenu->insertItem( i18n( "Resign" ), Core, SLOT(matchMenu(int)), 0, MENU_RESIGN ); + matchMenu->setItemEnabled( MENU_RESIGN, FALSE ); + matchMenu->setWhatsThis( MENU_RESIGN, i18n( "Use this to concede the match to your opponent." ) ); + // MENU_CALL_FLAG + matchMenu->insertItem( i18n( "&Call Flag" ), Core, SLOT(matchMenu(int)), 0, MENU_CALL_FLAG ); + matchMenu->setItemEnabled( MENU_CALL_FLAG, FALSE ); + matchMenu->setWhatsThis( MENU_CALL_FLAG, i18n( "Use this to declare the match over, due to your opponent being out of time." ) ); + // MENU_HINT + matchMenu->insertItem( i18n( "&Hint" ), Core, SLOT(matchMenu(int)), 0, MENU_HINT ); + matchMenu->setItemEnabled( MENU_HINT, FALSE ); + matchMenu->setWhatsThis( MENU_HINT, i18n( "This will ask your opponent for a hint." ) ); + // MENU_MOVE_NOW + matchMenu->insertItem( i18n( "Move &Now" ), Core, SLOT(matchMenu(int)), 0, MENU_MOVE_NOW ); + matchMenu->setItemEnabled( MENU_MOVE_NOW, FALSE ); + matchMenu->setWhatsThis( MENU_MOVE_NOW, i18n( "Clicking this option will force your opponent to move immediately." ) ); + // MENU_ORIENTATION + matchMenu->insertItem( i18n( "&Flip View" ), Core, SLOT(matchMenu(int)), Key_F2, MENU_ORIENTATION ); + matchMenu->setItemEnabled( MENU_ORIENTATION, FALSE ); + matchMenu->setWhatsThis( MENU_ORIENTATION, i18n( "This will reverse the chessboard's orientation by 180 degrees." ) ); + // MENU_PONDER + matchMenu->insertItem( i18n( "&Ponder" ), this, SLOT(Settings(int)), 0, MENU_PONDER ); + matchMenu->setItemChecked( MENU_PONDER, Resource->OPTION_Ponder ); + matchMenu->setItemEnabled( MENU_PONDER, FALSE ); + matchMenu->setWhatsThis( MENU_PONDER, i18n( "This toggles your opponent's ability to think while it's your turn." ) ); + matchMenu->insertSeparator(); + // MENU_PAUSE + matchMenu->insertItem( QIconSet( Resource->LoadIcon( QString("player_pause"), KIcon::Small ) ), + i18n( "Pause" ), this, SLOT( Settings(int) ), Key_F12, MENU_PAUSE ); + matchMenu->setItemEnabled( MENU_PAUSE, FALSE ); + matchMenu->setWhatsThis( MENU_PAUSE, i18n( "Select this to pause the clock for this match." ) ); + /* + drawMenu menu + */ + // MENU_OFFER_DRAW + drawMenu->insertItem( i18n( "&Offer Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_OFFER_DRAW ); + drawMenu->setWhatsThis( MENU_OFFER_DRAW, i18n( "Clicking this will inform your opponent that you are willing draw the match." ) ); + // MENU_ACCEPT_DRAW + drawMenu->insertItem( i18n( "&Accept Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_ACCEPT_DRAW ); + drawMenu->setWhatsThis( MENU_ACCEPT_DRAW, i18n( "Clicking this will accept a draw offered by your opponent." ) ); + // MENU_REJECT_DRAW + drawMenu->insertItem( i18n( "&Reject Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_REJECT_DRAW ); + drawMenu->setWhatsThis( MENU_REJECT_DRAW, i18n( "Clicking this will reject a draw offered by your opponent." ) ); + // MENU_IGNORE_DRAW + drawMenu->insertItem( i18n( "&Ignore Draw" ), Core, SLOT(matchMenu(int)), 0, MENU_IGNORE_DRAW ); + drawMenu->setWhatsThis( MENU_IGNORE_DRAW, i18n( "Clicking this will ignore future draw offers from your opponent." ) ); + /* + fileMenu menu + */ + // MENU_NEWGAME + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filenew"), KIcon::Small ) ), + i18n( "&New Match..." ), this, SLOT( openNewMatchDialog() ), CTRL+Key_N, MENU_NEWGAME ); + fileMenu->setWhatsThis( MENU_NEWGAME, i18n( "This allows you to begin a new match." ) ); + // MENU_LOAD + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileopen"), KIcon::Small ) ), + i18n( "&Load Match..." ), Core, SLOT( load() ), CTRL+Key_L, MENU_LOAD ); + fileMenu->setWhatsThis( MENU_LOAD, i18n( "The Load command will allow you to select a previously saved match and play it again." ) ); + fileMenu->insertSeparator(); + // MENU_SAVE + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filesave"), KIcon::Small ) ), + i18n( "&Save Match" ), this, SLOT( SaveGame() ), CTRL+Key_S, MENU_SAVE ); + fileMenu->setItemEnabled( MENU_SAVE, FALSE ); + fileMenu->setWhatsThis( MENU_SAVE, i18n( "The Save command will allow you to store a copy of your current match for later use." ) ); + // MENU_SAVEAS + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("filesave"), KIcon::Small ) ), + i18n( "Save Match &As..." ), this, SLOT( SaveGameAs() ), CTRL+Key_A, MENU_SAVEAS ); + fileMenu->setItemEnabled( MENU_SAVEAS, FALSE ); + fileMenu->setWhatsThis( MENU_SAVEAS, i18n( "The Save command will allow you to store a copy of your current match for later use." ) ); + fileMenu->insertSeparator(); + // MENU_CONNECT + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("connect_creating"), KIcon::Small ) ), + i18n( "Connect to Server" ), this, SLOT( netConnect() ), CTRL+Key_C, MENU_CONNECT ); + fileMenu->setWhatsThis( MENU_CONNECT, i18n( "Clicking this will connect Knights with an internet chess server." ) ); + fileMenu->insertSeparator(); + // MENU_PRINT + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileprint"), KIcon::Small ) ), + i18n( "&Print Notation..." ), Core, SLOT( print() ), CTRL+Key_P, MENU_PRINT ); + fileMenu->setItemEnabled( MENU_PRINT, FALSE ); + fileMenu->setWhatsThis( MENU_PRINT, i18n( "The Print command will allow you to print this game's notation on your printer." ) ); + fileMenu->insertSeparator(); + // MENU_CLOSE + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("fileclose"), KIcon::Small ) ), + i18n( "&Close Match" ), Core, SLOT( clearMatch() ), CTRL+Key_W, MENU_CLOSE ); + fileMenu->setItemEnabled( MENU_CLOSE, FALSE ); + fileMenu->setWhatsThis( MENU_CLOSE, i18n( "This command removes the current match." ) ); + // MENU_CLOSEALL + fileMenu->insertItem( i18n( "Close All" ), Core, SLOT( clearAll() ), 0, MENU_CLOSEALL ); + fileMenu->setItemEnabled( MENU_CLOSEALL, FALSE ); + fileMenu->setWhatsThis( MENU_CLOSEALL, i18n( "This command will remove all matches that are currently loaded." ) ); + fileMenu->insertSeparator(); + // MENU_QUIT + fileMenu->insertItem( QIconSet( Resource->LoadIcon( QString("exit"), KIcon::Small ) ), + i18n( "&Quit" ), this, SLOT(menuClose()), CTRL+Key_Q, MENU_QUIT ); + fileMenu->setWhatsThis( MENU_QUIT, i18n( "The Quit command will stop all matches and exit Knights." ) ); + /* + settingsMenu menu + */ + // MENU_INSTALL_THEMES + settingsMenu->insertItem( i18n( "&Install Themes" ), this, SLOT(installThemes()), 0, MENU_INSTALL_THEMES ); + settingsMenu->setWhatsThis( MENU_INSTALL_THEMES, i18n( "This lets you install downloaded themes into Knights." ) ); + // MENU_BINDINGS_DIALOG + settingsMenu->insertItem( QIconSet( Resource->LoadIcon( QString("key_bindings"), KIcon::Small ) ), + i18n( "Configure &Key Bindings..." ), this, SLOT(openKeyBindingDialog()), 0, MENU_BINDINGS_DIALOG ); + settingsMenu->setWhatsThis( MENU_BINDINGS_DIALOG, i18n( "Click this if you want to change the keyboard shortcuts that Knights uses." ) ); + // MENU_SETTINGS_DIALOG + settingsMenu->insertItem( QIconSet( Resource->LoadIcon( QString("configure"), KIcon::Small ) ), + i18n( "&Configure Knights..." ), this, SLOT(openSettingsDialog()), 0, MENU_SETTINGS_DIALOG ); + settingsMenu->setWhatsThis( MENU_SETTINGS_DIALOG, i18n( "This opens a new window which allows you to customize Knights to your particular tastes." ) ); + /* + tutorialMenu menu + */ + tutorialMenu->setCheckable(TRUE); + // MENU_OPEN_TUTORIAL + tutorialMenu->insertItem( i18n( "Begin a Tutorial" ), this, SLOT(Settings(int)), 0, MENU_OPEN_TUTORIAL ); +// tutorialMenu->setWhatsThis( MENU_OPEN_TUTORIAL, i18n( "" ) ); + /* + topMenu menu + */ + topMenu->insertItem( i18n( "&File" ), fileMenu ); + topMenu->insertItem( i18n( "&Match" ), matchMenu ); + topMenu->insertItem( i18n( "&Settings" ), settingsMenu ); +// topMenu->insertItem( i18n( "&Tutorials" ), tutorialMenu ); + topMenu->insertSeparator(); + topMenu->insertItem( i18n( "&Help" ), help ); +} +/////////////////////////////////////// +// +// Knights::resizeMainFrame +// +/////////////////////////////////////// +void Knights::resizeMainFrame(void) +{ + QStyle& Style = QApplication::style(); + QSize S_Message; + QSize S_Menu; + + int statusY(0); + int statusX(0); + int statusHeight(0); + + /* Get some numbers */ + margin = Style.defaultFrameWidth(); + /* Take care of the Core first */ + Core->move( 0, 0 ); + Core->resize(); + /* Get our size hints */ + S_Message = Message->sizeHint(); + S_Menu = topMenu->sizeHint(); + statusHeight = S_Message.height() + ( margin << 1 ); + statusY += Core->height() + margin + statusHeight + margin; + statusX = Core->width(); + + MainFrame->setFixedSize( statusX, statusY ); + setFixedSize( statusX, statusY + S_Menu.height() ); + + /* enable or disable games in the menu */ + if( Resource->servers.count() ) + { + fileMenu->setItemEnabled( MENU_CONNECT, TRUE ); + } + else + { + fileMenu->setItemEnabled( MENU_CONNECT, FALSE ); + } +} +/////////////////////////////////////// +// +// Knights::event +// +/////////////////////////////////////// +bool Knights::event( QEvent *e ) +{ + if( e->type() == EVENT_Del_IO_Net ) + { + netConnect(); + return TRUE; + } + return KMainWindow::event( e ); +} +/////////////////////////////////////// +// +// Knights::resizeEvent +// +/////////////////////////////////////// +void Knights::resizeEvent( QResizeEvent * ) +{ + QSize S_Message; + int tmp(0); + int statusHeight(0); + int statusY(0); + int statusX(0); + int gridX(0); + + if( ResizeFlag ) return; + /* Get the height & Y of the status bar */ + gridX = Core->width() >> 3; + S_Message = Message->sizeHint() + QSize( 2, 2 ); + statusHeight = S_Message.height() + ( margin << 1 ); + Resource->Widget_Height = statusHeight; + statusY += Core->height() + margin; + + if( InitAll ) return; + /* Do the Message box */ + tmp = gridX * 3; + Message->setFixedSize( tmp - ( margin << 1 ), statusHeight ); + Message->move( margin, statusY ); + statusX = tmp; + /* Do the White Time */ + tmp = gridX + ( gridX >> 1 ); + whiteTimeLabel->setFixedSize( tmp - margin, statusHeight ); + whiteTimeLabel->move( statusX, statusY ); + statusX += tmp; + /* Do the Black Time */ + tmp = gridX + ( gridX >> 1 ); + blackTimeLabel->setFixedSize( tmp - margin, statusHeight ); + blackTimeLabel->move( statusX, statusY ); + statusX += tmp; + /* Do the Notation Bar */ + tmp = gridX << 1; + notationBar->setFixedSize( tmp - margin, statusHeight ); + notationBar->move( statusX, statusY ); + statusX += tmp; +} +/////////////////////////////////////// +// +// Knights::keyPressEvent +// +/////////////////////////////////////// +void Knights::keyPressEvent( QKeyEvent *e ) +{ + QChar input; + + if( ( e->state() | Qt::ShiftButton ) == Qt::ShiftButton ) + { + input = e->text().at(0); + if( input.isLetterOrNumber() ) + { + emit focus( input ); + e->accept(); + return; + } + } + e->ignore(); +} +/////////////////////////////////////// +// +// Knights::hideEvent +// +/////////////////////////////////////// +void Knights::hideEvent( QHideEvent* ) +{ + if( !Resource->OPTION_Pause_On_Minimize ) + return; + Core->matchMenu( MENU_PAUSEALL ); + Minimized = TRUE; +} +/////////////////////////////////////// +// +// Knights::showEvent +// +/////////////////////////////////////// +void Knights::showEvent( QShowEvent* ) +{ + if( !Minimized ) + return; + Core->matchMenu( MENU_PAUSEALL ); + Minimized = FALSE; +} +/////////////////////////////////////// +// +// Knights::wheelEvent +// +/////////////////////////////////////// +void Knights::wheelEvent( QWheelEvent *event ) +{ + event->accept(); + if( event->delta() > 0 ) PrevNotation(); + if( event->delta() < 0 ) NextNotation(); +} +/////////////////////////////////////// +// +// Knights::SelectTheme +// +/////////////////////////////////////// +void Knights::SelectTheme( int boardIndex, int chessmenIndex ) +{ + Resource->setTheme( boardIndex, chessmenIndex ); + resizeMainFrame(); +} +/////////////////////////////////////// +// +// Knights::setStatusBar +// +/////////////////////////////////////// +void Knights::setStatusBar( const int &ID, const QString &MSG ) +{ + /* Game comments as specified in http://www.schachprobleme.de/chessml/faq/pgn/ + Section 10: Numeric Annotation Glyphs */ + if( ( ID & COMMENT ) == COMMENT ) + { + Message->setText( pgn::getNAG( ID - COMMENT ) ); + return; + } + /* Knights specific messages */ + switch( ID ) + { + /* Error Codes */ + case BOOK_ERROR_1: + Message->setText( i18n( "Error with white engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play white,\nbut it can only be used as a book engine.\nPlease select another engine to play white.").arg( MSG ), + i18n("White Engine Problem") ); + break; + case BOOK_ERROR_2: + Message->setText( i18n( "Error with white book engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play white's book,\nbut it can only be used as a regular engine.\nPlease select another engine to play white's book.").arg( MSG ), + i18n("White Book Engine Problem") ); + break; + case BOOK_ERROR_3: + Message->setText( i18n( "Error with black engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play black,\nbut it can only be used as a book engine.\nPlease select another engine to play black.").arg( MSG ), + i18n("Black Engine Problem") ); + break; + case BOOK_ERROR_4: + Message->setText( i18n( "Error with black book engine" ) ); + KMessageBox::sorry( this, + i18n("You selected %1 to play black's book,\nbut it can only be used as a regular engine.\nPlease select another engine to play black's book.").arg( MSG ), + i18n("Black Book Engine Problem") ); + break; + case ENGINE_DIED_ERROR: + Message->setText( i18n( "The computer opponent assigned to play %1 has crashed" ).arg( MSG ) ); + break; + case LOAD_ERROR: + Message->setText( i18n( "There was an error while loading the file" ) ); + break; + case SAVE_ERROR: + Message->setText( i18n( "There was an error while saving the file" ) ); + break; + /* Standard Codes */ + case LOAD_OK: + Message->setText( i18n( "Loading complete" ) ); + break; + case SAVE_OK: + Message->setText( i18n( "Saving complete" ) ); + break; + case READING_FILE: + Message->setText( i18n( "Reading File" ) ); + break; + case NO_MOVE_WHILE_REVIEW: + Message->setText( i18n( "Can not move a chessman while reviewing the match" ) ); + break; + case ILLEGAL_MOVE: + Message->setText( i18n( "Illegal Move" ) ); + break; + case WHITE_TURN: + Message->setText( i18n( "White's turn" ) ); + break; + case BLACK_TURN: + Message->setText( i18n( "Black's turn" ) ); + break; + case WHITE_WIN: + Message->setText( i18n( "White wins" ) ); + break; + case BLACK_WIN: + Message->setText( i18n( "Black wins" ) ); + break; + case WHITE_CHECKMATE: + Message->setText( i18n( "Checkmate, White wins" ) ); + break; + case BLACK_CHECKMATE: + Message->setText( i18n( "Checkmate, Black wins" ) ); + break; + case WHITE_RESIGN: + Message->setText( i18n( "White resigns" ) ); + break; + case BLACK_RESIGN: + Message->setText( i18n( "Black resigns" ) ); + break; + case WHITE_FLAG: + Message->setText( i18n( "White's flag fell" ) ); + break; + case BLACK_FLAG: + Message->setText( i18n( "Black's flag fell" ) ); + break; + case WHITE_CALL_FLAG: + Message->setText( i18n( "Black's flag was called, White wins" ) ); + break; + case BLACK_CALL_FLAG: + Message->setText( i18n( "White's flag was called, Black wins" ) ); + break; + case GAME_DRAW: + Message->setText( i18n( "Draw match" ) ); + break; + case GAME_50_MOVES: + Message->setText( i18n( "50 moves rule, draw match" ) ); + break; + case WAITING: + Message->setText( i18n( "Starting computer players, please wait" ) ); + break; + case PAUSED: + Message->setText( i18n( "Match paused" ) ); + break; + case WHITE_DRAW_OFFER: + Message->setText( i18n( "White has offered a draw" ) ); + break; + case BLACK_DRAW_OFFER: + Message->setText( i18n( "Black has offered a draw" ) ); + break; + case LOST_CONTACT: + Message->setText( i18n( "Lost contact with opponent" ) ); + case READY: + default: + Message->setText( i18n( "Ready" ) ); + break; + } +} +/////////////////////////////////////// +// +// Knights::setClocks +// +/////////////////////////////////////// +void Knights::setClocks( void ) +{ + whiteTimeLabel->setText( Core->clock( WHITE ) ); + blackTimeLabel->setText( Core->clock( BLACK ) ); + if( Core->flag( WHITE ) ) + if( Core->blackInput() == PLAYERLOCAL ) + matchMenu->setItemEnabled( MENU_CALL_FLAG, TRUE ); + else + matchMenu->setItemEnabled( MENU_CALL_FLAG, FALSE ); + if( Core->flag( BLACK ) ) + if( Core->whiteInput() == PLAYERLOCAL ) + matchMenu->setItemEnabled( MENU_CALL_FLAG, TRUE ); + else + matchMenu->setItemEnabled( MENU_CALL_FLAG, FALSE ); +} +/////////////////////////////////////// +// +// Knights::setNotation +// +/////////////////////////////////////// +void Knights::setNotation( void ) +{ + QStringList *list; + QStringList::Iterator IT; + int count(0); + + setCaption( Core->caption() ); + notationBar->clear(); + list = Core->notation(); + /* + Several menu items' status changes based upon the availability + of notation data. Therefore, we'll enable & disable those here + since we've gathered the notation data anyway. + */ + if( list == NULL ) + { + /* Disable Save & Print Functions */ + fileMenu->setItemEnabled( MENU_SAVE, FALSE ); + fileMenu->setItemEnabled( MENU_SAVEAS, FALSE ); + fileMenu->setItemEnabled( MENU_PRINT, FALSE ); + matchMenu->setItemEnabled( MENU_RETRACT, FALSE ); + return; + } + if( Core->modified() ) + fileMenu->setItemEnabled( MENU_SAVE, TRUE ); + else + fileMenu->setItemEnabled( MENU_SAVE, FALSE ); + /* Core->onMove is called before it is updated by Match->slot_Move. Because of this, the following + if statement checks for the wrong player's turn. On purpose */ + if( ( Core->inputOnMove() == PLAYERLOCAL ) && ( Core->inputOnMove(TRUE) == PLAYERPC ) && list->count() ) + matchMenu->setItemEnabled( MENU_RETRACT, TRUE ); + else + matchMenu->setItemEnabled( MENU_RETRACT, FALSE ); + fileMenu->setItemEnabled( MENU_SAVEAS, TRUE ); + fileMenu->setItemEnabled( MENU_PRINT, TRUE ); + + /* Create the List */ + for( IT = list->begin(); IT != list->end(); ++IT ) + { + notationBar->insertItem( (*IT), count++ ); + } + notationBar->setCurrentItem( --count ); + delete list; +} +/////////////////////////////////////// +// +// Knights::PrevNotation +// +/////////////////////////////////////// +void Knights::PrevNotation( void ) +{ + int tmp( notationBar->currentItem() - 1 ); + Core->review( tmp ); // Do this before the bounds checking in case this is examine mode + if( tmp < 0 ) + return; + notationBar->setCurrentItem( tmp ); +} +/////////////////////////////////////// +// +// Knights::NextNotation +// +/////////////////////////////////////// +void Knights::NextNotation( void ) +{ + int tmp( notationBar->currentItem() + 1 ); + Core->review( tmp ); // Do this before the bounds checking in case this is examine mode + if( tmp > ( notationBar->count() - 1 ) ) + return; + notationBar->setCurrentItem( tmp ); +} +/////////////////////////////////////// +// +// Knights::initMatch +// +/////////////////////////////////////// +void Knights::initMatch( void ) +{ + setNotation(); + + /* Are there any players? ( ie - is this a match or a null? */ + if( ( Core->whiteInput() == Null ) || ( Core->blackInput() == Null ) ) + { + fileMenu->setItemEnabled( MENU_CLOSE, FALSE ); + fileMenu->setItemEnabled( MENU_CLOSEALL, FALSE ); + matchMenu->setItemEnabled( MENU_ORIENTATION, FALSE ); + whiteTimeLabel->setText( "" ); + blackTimeLabel->setText( "" ); + setStatusBar( READY ); + } + else + { + fileMenu->setItemEnabled( MENU_CLOSE, TRUE ); + fileMenu->setItemEnabled( MENU_CLOSEALL, TRUE ); + matchMenu->setItemEnabled( MENU_ORIENTATION, TRUE ); + } + + /* Is there a local player? */ + if( ( Core->whiteInput() == PLAYERLOCAL ) || ( Core->blackInput() == PLAYERLOCAL ) ) + { + matchMenu->setItemEnabled( MENU_DRAW, TRUE ); + matchMenu->setItemEnabled( MENU_RESIGN, TRUE ); + /* Is there also a PC player? */ + if( ( Core->whiteInput() == PLAYERPC ) || ( Core->blackInput() == PLAYERPC ) ) + { + } + } + else + { + matchMenu->setItemEnabled( MENU_DRAW, FALSE ); + matchMenu->setItemEnabled( MENU_RESIGN, FALSE ); + } + /* Is there a PC player? */ + if( ( Core->whiteInput() == PLAYERPC ) || ( Core->blackInput() == PLAYERPC ) ) + { + matchMenu->setItemEnabled( MENU_MOVE_NOW, TRUE ); + matchMenu->setItemEnabled( MENU_HINT, TRUE ); + matchMenu->setItemEnabled( MENU_PONDER, TRUE ); + matchMenu->setItemEnabled( MENU_PAUSE, TRUE ); + } + else + { + matchMenu->setItemEnabled( MENU_MOVE_NOW, FALSE ); + matchMenu->setItemEnabled( MENU_HINT, FALSE ); + matchMenu->setItemEnabled( MENU_PONDER, FALSE ); + matchMenu->setItemEnabled( MENU_PAUSE, FALSE ); + } + /* Is there a TCP player? */ +// if( ( Core->whiteInput() == PLAYERTCP ) || ( Core->blackInput() == PLAYERTCP ) ) +// { +// } +// else +// { +// } +} +/////////////////////////////////////// +// +// Knights::netConnect +// +/////////////////////////////////////// +void Knights::netConnect( void ) +{ + if(Core->isOnline()) + { + fileMenu->changeItem( MENU_CONNECT, QIconSet( Resource->LoadIcon( QString("connect_creating"), + KIcon::Small ) ), i18n( "Connect to Server" )); + Core->goOffline(); + setCursor( Resource->CURSOR_Standard ); + } + else + { + fileMenu->changeItem( MENU_CONNECT, QIconSet( Resource->LoadIcon( QString("connect_no"), + KIcon::Small ) ), i18n( "Disconnect from Server" ) ); + /* + By passing Null as the ID, we're telling core that we're + creating a new internetio, not reusing an exsisting one. + */ + Core->createNewIO( PLAYERTCP, Null); + } +} +/////////////////////////////////////// +// +// Knights::openSettingsDialog +// +/////////////////////////////////////// +void Knights::openSettingsDialog( void ) +{ + SettingsDialog = new dlg_settings( this, "settings", Resource ); + connect( SettingsDialog, SIGNAL( themeChanged(int,int) ), this, SLOT( SelectTheme(int,int) ) ); + connect( SettingsDialog, SIGNAL( redrawBoard() ), Core, SLOT( resize() ) ); + connect( SettingsDialog, SIGNAL( resetServer() ), Core, SLOT( resetServer() ) ); + connect( this, SIGNAL( themesAdded() ), SettingsDialog, SLOT( slotThemesAdded() ) ); + SettingsDialog->show(); +} +/////////////////////////////////////// +// +// Knights::openNewMatchDialog +// +/////////////////////////////////////// +void Knights::openNewMatchDialog( void ) +{ + NewMatch = new dlg_newmatch( this, "NewMatch", Resource ); + connect( NewMatch, SIGNAL( okClicked() ), this, SLOT( newMatch() ) ); + NewMatch->show(); +} +/////////////////////////////////////// +// +// Knights::newMatch +// +/////////////////////////////////////// +void Knights::newMatch( void ) +{ + Core->newMatch( NewMatch->paramaters() ); +} +/////////////////////////////////////// +// +// Knights::openKeyBindingDialog +// +/////////////////////////////////////// +void Knights::openKeyBindingDialog( void ) +{ + KKeyDialog::configureKeys( myAccel, TRUE, this ); +} +/////////////////////////////////////// +// +// Knights::Settings +// +/////////////////////////////////////// +void Knights::Settings(int opt) +{ + switch(opt) + { + case MENU_PONDER: + Resource->OPTION_Ponder = 1 - Resource->OPTION_Ponder; + matchMenu->setItemChecked(MENU_PONDER, Resource->OPTION_Ponder ); + Core->matchMenu( MENU_PONDER ); + break; + case MENU_PAUSE: + if( Core->paused() ) + { + matchMenu->changeItem( MENU_PAUSE, + QIconSet( Resource->LoadIcon( QString("player_pause"), KIcon::Small ) ), + i18n( "Pause" ) ); + } + else + { + matchMenu->changeItem( MENU_PAUSE, + QIconSet( Resource->LoadIcon( QString("1rightarrow"), KIcon::Small ) ), + i18n( "Resume" ) ); + } + Core->matchMenu( MENU_PAUSE ); + break; + default: + break; + } +} +/////////////////////////////////////// +// +// Knights::SaveGame & Variants +// +/////////////////////////////////////// +bool Knights::SaveGame( void ) +{ + /* We use 'Null' to indicate the current match */ + return Core->save( Null, FALSE, FALSE ); +} +bool Knights::SaveGamePrompt( void ) +{ + return Core->save( Null, TRUE, FALSE ); +} +bool Knights::SaveGameAs( void ) +{ + return Core->save( Null, FALSE, TRUE ); +} +/////////////////////////////////////// +// +// Knights::boardBigger +// +/////////////////////////////////////// +void Knights::boardBigger( void ) +{ + Resource->resizeTheme( Resource->ThemeSize + 8 ); + resizeMainFrame(); +} +/////////////////////////////////////// +// +// Knights::boardSmaller +// +/////////////////////////////////////// +void Knights::boardSmaller( void ) +{ + Resource->resizeTheme( Resource->ThemeSize - 8 ); + resizeMainFrame(); +} + +/////////////////////////////////////// +// +// Knights::installThemes +// +/////////////////////////////////////// +void Knights::installThemes( void ) +{ + bool localFlag(FALSE); + bool installError(FALSE); + unsigned int loop; + QString allerror; + QString fileFilter( "KB* KC* KS*|" ); + fileFilter += i18n( "Knights Themes" ); + KURL::List files = KFileDialog::getOpenURLs( QString::null, fileFilter, this, i18n( "Install Theme..." ) ); + for( loop = 0; loop < files.count(); loop++ ) + { + /* Try writing to the global theme dir */ + if( !KIO::NetAccess::copy( files[loop], KURL( QString( Resource->themeDir() + files[loop].filename() ) ) ) ) + { + /* Nope... Try a local .knights dir */ + allerror += "\n\n" + QString( Resource->themeDir() + files[loop].filename() ) + + " - " + KIO::NetAccess::lastErrorString(); + if( !KIO::NetAccess::exists( KURL( QString( QDir::homeDirPath() + "/.knights" ) ) ) ) + { + /* Create local .knights dir */ + KIO::NetAccess::mkdir( KURL( QString( QDir::homeDirPath() + "/.knights" ) ) ); + } + if( !KIO::NetAccess::copy( files[loop], KURL( QString( QDir::homeDirPath() + "/.knights/" + files[loop].filename() ) ) ) ) + { + /* Nope, can't copy it anywhere */ + installError = TRUE; + allerror += "\n\n" + QString( QDir::homeDirPath() + "/.knights/" + + files[loop].filename() ) + " - " + KIO::NetAccess::lastErrorString(); + } + else + { + localFlag = TRUE; + } + } + } + if( localFlag ) + { + KMessageBox::sorry( this, + i18n("You do not have permission to install this theme systemwide, so Knights installed it locally."), + i18n("Installed theme locally") ); + } + if( installError ) + { + KMessageBox::sorry( this, + i18n("The theme could not be installed:\n%1").arg( allerror ), + i18n("Can not install theme") ); + } + return; +} |