#include "texteditor.h"
#include "ui_texteditor.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QFileInfo> // Video 04.05
#include <QDebug>
#include <QSettings> // Video 04.07
TextEditor::TextEditor(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TextEditor)
{
ui->setupUi(this);
readSettings(); // Video 04.07
for( int i = 0; i < MaxRecentFiles; i++ ){
recentFilesActs[ i ] = new QAction( this );
recentFilesActs[ i ]->setVisible( false );
connect( recentFilesActs[ i ],SIGNAL( triggered() ), this, SLOT( openRecentFile() ));
ui->Menu_Open_Recent_Files->addAction( recentFilesActs[ i ] );
}
updateRecentFileActions();
}
//TextEditor::~TextEditor()
//{
// delete ui;
//}
bool TextEditor::on_action_Save_As_triggered()
{
QString fileName = QFileDialog::getSaveFileName(
this,
"Text Editor - Save As",
"/Users/Jaime/Documents/QT/Text Editor/",
"Text Files (*.txt);;All Files (*.*)"
);
if ( !fileName.isEmpty() ){ // Si no esta vacio el campo del texto
currentFile = fileName;
return saveFile( fileName );
}
return false;
}
bool TextEditor::saveFile( const QString &fileName )
{
QFile file( fileName );
if( file.open ( QFile::WriteOnly ) ){ // Si se puede abrir el archivo en modo escritura
file.write( ui->plainTextEdit->toPlainText().toUtf8() );
setCurrentFile( fileName );
setWindowTitle( tr( "Text Editor - %1[*]" ) // Video 04.05
.arg( QFileInfo( currentFile ).fileName() ) );
ui->plainTextEdit->document()->setModified(false); // Video 04.05
return true;
}else{
QMessageBox::warning(
this,
"Text Editor",
tr( "Cannot write file %1.\nError: %2" )
.arg( currentFile )
.arg( file.errorString() )
);
return false;
}
}
bool TextEditor::maybeSave(){
if( ui->plainTextEdit->document()->isModified() ){
QMessageBox::StandardButton ret =
QMessageBox::warning(
this,
"Text Editor",
tr( "The Document has been Modified\n"
"Do you want to save your changes?"
),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel
);
if( ret == QMessageBox::Yes ){
return on_action_Save_triggered();
}else if( ret == QMessageBox::Cancel )
return false;
}
return true;
}
void TextEditor::readSettings() // Video 04.07
{
QSettings settings( "About", "TextEditor" );
QPoint pos = settings.value( "pos", QPoint( 200, 200 ) ).toPoint();
QSize size = settings.value( "size", QSize( 400, 400 ) ).toSize();
resize( size );
move( pos );
}
void TextEditor::writeSettings() // Video 04.07
{
QSettings settings( "About", "TextEditor" );
settings.setValue( "pos", pos() );
settings.setValue( "size", size() );
}
void TextEditor::setCurrentFile(const QString &fileName)
{
currentFile = fileName;
setWindowTitle( tr( "Text Editor - %1[*]" ) // Video 04.05
.arg( QFileInfo( currentFile ).fileName() ) );
QSettings settings;
QStringList recentFilesList = settings.value( "recentFilesList" ).toStringList();
recentFilesList.removeAll( fileName );
recentFilesList.prepend( fileName );
while ( recentFilesList.size() > MaxRecentFiles )
recentFilesList.removeLast();
settings.setValue( "recentFilesList", recentFilesList );
updateRecentFileActions();
}
bool TextEditor::on_action_Save_triggered()
{
if( currentFile.isEmpty() ) // Si esta vacio
return on_action_Save_As_triggered();
else
return saveFile( currentFile );
}
void TextEditor::on_action_Open_triggered()
{
if( maybeSave() ){
QString fileName = QFileDialog::getOpenFileName(
this,
"Text Editor - Open File",
"/Users/Jaime/Documents/QT/Text Editor/",
"Text Files (*.txt);;All Files (*.*)"
);
loadFile( fileName );
}
}
void TextEditor::on_action_New_triggered()
{
if( maybeSave() ){
ui->plainTextEdit->clear();
}
}
void TextEditor::closeEvent( QCloseEvent *event ){
if( maybeSave() ){
writeSettings(); // Video 04.07
event->accept();
}else
event->ignore();
}
void TextEditor::openRecentFile()
{
QAction *action = qobject_cast< QAction *>( sender() );
if( action ){
loadFile( action->data().toString() );
}
}
void TextEditor::updateRecentFileActions()
{
QSettings settings;
QStringList recentFilesList = settings.value( "recentFilesList" ).toStringList();
int numRecentFiles = qMin( recentFilesList.size(), int( MaxRecentFiles ) );
for( int i = 0; i < numRecentFiles; ++i ){
QString text = tr( "&%1 %2" )
.arg( i+1 )
.arg( QFileInfo( recentFilesList[ i ] ).fileName() );
recentFilesActs[ i ]->setText( text );
recentFilesActs[ i ]->setData( recentFilesList[ i ] );
recentFilesActs[ i ]->setVisible( true );
}
for( int j = numRecentFiles; j > MaxRecentFiles; j++){
recentFilesActs[ j ]->setVisible( false );
}
}
void TextEditor::loadFile(const QString &fileName)
{
if ( !fileName.isEmpty() ){ // Si no esta vacio el campo del texto
QFile file( fileName );
if ( file.open( QFile::ReadOnly )){ // Se puede leer en modo de lectura
ui->plainTextEdit->setPlainText( file.readAll() ); //
setCurrentFile( fileName );
}else{
QMessageBox::warning(
this,
"Text Editor",
tr( "Cannot read File %1.\nError: %2" )
.arg( fileName )
.arg( file.errorString() )
);
}
}
}