package MainWindow; use strict; use File::Basename; use QtCore4; use QtGui4; use QtCore4::isa qw( Qt::MainWindow ); use QtCore4::slots newFile => [], openFile => [], save => [], saveAs => [], about => [], documentWasModified => []; sub NEW { shift->SUPER::NEW(@_); my $textEdit = Qt::TextEdit(); this->setCentralWidget($textEdit); this->{textEdit} = $textEdit; createActions(); createMenus(); createToolBars(); createStatusBar(); readSettings(); this->connect($textEdit->document(), SIGNAL 'contentsChanged()', this, SLOT 'documentWasModified()'); this->setCurrentFile(""); } sub closeEvent { my ($event) = @_; if (maybeSave()) { writeSettings(); $event->accept(); } else { $event->ignore(); } } sub newFile { if (maybeSave()) { this->{textEdit}->clear(); setCurrentFile(""); } } sub openFile { if (maybeSave()) { my $fileName = Qt::FileDialog::getOpenFileName(this); if ($fileName) { loadFile($fileName); } } } sub save { if (!defined this->{curFile} || !this->{curFile}) { return saveAs(); } else { return saveFile(this->{curFile}); } } sub saveAs { my $fileName = Qt::FileDialog::getSaveFileName(this); if (!defined $fileName){ return 0; } return saveFile($fileName); } sub about { Qt::MessageBox::about(this, "About Application", "The Application example demonstrates how to " . "write modern GUI applications using Qt, with a menu bar, " . "toolbars, and a status bar."); } sub documentWasModified { this->setWindowModified(this->{textEdit}->document()->isModified()); } sub createActions { my $textEdit = this->{textEdit}; my $newAct = Qt::Action(Qt::Icon("images/new.png"), "&New", this); $newAct->setShortcut(Qt::KeySequence("Ctrl+N")); $newAct->setStatusTip("Create a new file"); this->connect($newAct, SIGNAL 'triggered()', this, SLOT 'newFile()'); this->{newAct} = $newAct; my $openAct = Qt::Action(Qt::Icon("images/open.png"), "&Open...", this); $openAct->setShortcut(Qt::KeySequence("Ctrl+O")); $openAct->setStatusTip("Open an existing file"); this->connect($openAct, SIGNAL 'triggered()', this, SLOT 'openFile()'); this->{openAct} = $openAct; my $saveAct = Qt::Action(Qt::Icon("images/save.png"), "&Save", this); $saveAct->setShortcut(Qt::KeySequence("Ctrl+S")); $saveAct->setStatusTip("Save the document to disk"); this->connect($saveAct, SIGNAL 'triggered()', this, SLOT 'save()'); this->{saveAct} = $saveAct; my $saveAsAct = Qt::Action("Save &As...", this); $saveAsAct->setStatusTip("Save the document under a new name"); this->connect($saveAsAct, SIGNAL 'triggered()', this, SLOT 'saveAs()'); this->{saveAsAct} = $saveAsAct; my $exitAct = Qt::Action("E&xit", this); $exitAct->setShortcut(Qt::KeySequence("Ctrl+Q")); $exitAct->setStatusTip("Exit the application"); this->connect($exitAct, SIGNAL 'triggered()', this, SLOT 'close()'); this->{exitAct} = $exitAct; my $cutAct = Qt::Action(Qt::Icon("images/cut.png"), "Cu&t", this); $cutAct->setShortcut(Qt::KeySequence("Ctrl+X")); $cutAct->setStatusTip("Cut the current selection's contents to the " . "clipboard"); this->connect($cutAct, SIGNAL 'triggered()', $textEdit, SLOT 'cut()'); this->{cutAct} = $cutAct; my $copyAct = Qt::Action(Qt::Icon("images/copy.png"), "&Copy", this); $copyAct->setShortcut(Qt::KeySequence("Ctrl+C")); $copyAct->setStatusTip("Copy the current selection's contents to the " . "clipboard"); this->connect($copyAct, SIGNAL 'triggered()', $textEdit, SLOT 'copy()'); this->{copyAct} = $copyAct; my $pasteAct = Qt::Action(Qt::Icon("images/paste.png"), "&Paste", this); $pasteAct->setShortcut(Qt::KeySequence("Ctrl+V")); $pasteAct->setStatusTip("Paste the clipboard's contents into the current " . "selection"); this->connect($pasteAct, SIGNAL 'triggered()', $textEdit, SLOT 'paste()'); this->{pasteAct} = $pasteAct; my $aboutAct = Qt::Action("&About", this); $aboutAct->setStatusTip("Show the application's About box"); this->connect($aboutAct, SIGNAL 'triggered()', this, SLOT 'about()'); this->{aboutAct} = $aboutAct; my $aboutQtAct = Qt::Action("About &Qt", this); $aboutQtAct->setStatusTip("Show the Qt4 library's About box"); this->connect($aboutQtAct, SIGNAL 'triggered()', Qt::qApp(), SLOT 'aboutQt()'); this->{aboutQtAct} = $aboutQtAct; $cutAct->setEnabled(0); $copyAct->setEnabled(0); this->connect($textEdit, SIGNAL 'copyAvailable(bool)', $cutAct, SLOT 'setEnabled(bool)'); this->connect($textEdit, SIGNAL 'copyAvailable(bool)', $copyAct, SLOT 'setEnabled(bool)'); } sub createMenus { my $fileMenu = this->menuBar()->addMenu("&File"); $fileMenu->addAction(this->{newAct}); $fileMenu->addAction(this->{openAct}); $fileMenu->addAction(this->{saveAct}); $fileMenu->addAction(this->{saveAsAct}); $fileMenu->addSeparator(); $fileMenu->addAction(this->{exitAct}); my $editMenu = this->menuBar()->addMenu("&Edit"); $editMenu->addAction(this->{cutAct}); $editMenu->addAction(this->{copyAct}); $editMenu->addAction(this->{pasteAct}); this->menuBar()->addSeparator(); my $helpMenu = this->menuBar()->addMenu("&Help"); $helpMenu->addAction(this->{aboutAct}); $helpMenu->addAction(this->{aboutQtAct}); } sub createToolBars { my $fileToolBar = this->addToolBar("File"); $fileToolBar->addAction(this->{newAct}); $fileToolBar->addAction(this->{openAct}); $fileToolBar->addAction(this->{saveAct}); my $editToolBar = this->addToolBar("Edit"); $editToolBar->addAction(this->{cutAct}); $editToolBar->addAction(this->{copyAct}); $editToolBar->addAction(this->{pasteAct}); } sub createStatusBar { this->statusBar()->showMessage("Ready"); } sub readSettings { my $settings = Qt::Settings("Trolltech", "Application Example"); my $pos = $settings->value("pos", Qt::Variant(Qt::Point(200, 200)))->toPoint(); my $size = $settings->value("size", Qt::Variant(Qt::Size(400, 400)))->toSize(); this->resize($size); this->move($pos); } sub writeSettings { my $settings = Qt::Settings("Trolltech", "Application Example"); $settings->setValue("pos", Qt::Variant(this->pos())); $settings->setValue("size", Qt::Variant(this->size())); } sub maybeSave { if (this->{textEdit}->document()->isModified()) { my $ret = Qt::MessageBox::warning(this, "Application", "The document has been modified.\n" . "Do you want to save your changes?", CAST Qt::MessageBox::Save() | Qt::MessageBox::Discard() | Qt::MessageBox::Cancel(), 'QMessageBox::StandardButtons'); if ($ret == Qt::MessageBox::Save()) { return save(); } elsif ($ret == Qt::MessageBox::Cancel()) { return 0; } } return 1; } sub loadFile { my ( $fileName ) = @_; if(!(open( FH, "< $fileName"))) { Qt::MessageBox::warning(this, "Application", sprintf("Cannot read file %s:\n%s.", $fileName, $!)); return 0; } Qt::Application::setOverrideCursor(Qt::Cursor(Qt::WaitCursor())); this->{textEdit}->setPlainText(join "\n", ); Qt::Application::restoreOverrideCursor(); close FH; setCurrentFile($fileName); this->statusBar()->showMessage("File loaded", 2000); } sub saveFile { my ($fileName) = @_; if(!(open( FH, "> $fileName"))) { Qt::MessageBox::warning(this, "Application", sprintf("Cannot write file %s:\n%s.", $fileName, $!)); return 0; } Qt::Application::setOverrideCursor(Qt::Cursor(Qt::WaitCursor())); print FH this->{textEdit}->toPlainText(); Qt::Application::restoreOverrideCursor(); close FH; setCurrentFile($fileName); this->statusBar()->showMessage("File saved", 2000); return 1; } sub setCurrentFile { my ( $fileName ) = @_; this->{curFile} = $fileName; this->{textEdit}->document()->setModified(0); this->setWindowModified(0); my $shownName; if (!defined this->{curFile} || !(this->{curFile})) { $shownName = "untitled.txt"; } else { $shownName = strippedName(this->{curFile}); } this->setWindowTitle(sprintf("%s\[*] - %s", $shownName, "Application")); } sub strippedName { my ( $fullFileName ) = @_; return basename( $fullFileName ); } 1;