2 Bacula® - The Network Backup Solution
4 Copyright (C) 2007-2010 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version three of the GNU Affero General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Affero General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
31 * Main Window control for bat (qt-console)
33 * Kern Sibbald, January MMVII
39 #include "joblist/joblist.h"
40 #include "storage/storage.h"
41 #include "fileset/fileset.h"
42 #include "label/label.h"
45 #include "restore/restore.h"
46 #include "medialist/medialist.h"
47 #include "joblist/joblist.h"
48 #include "clients/clients.h"
49 #include "restore/restoretree.h"
50 #include "help/help.h"
51 #include "jobs/jobs.h"
52 #include "medialist/mediaview.h"
54 #include "jobgraphs/jobplot.h"
56 #include "status/dirstat.h"
57 #include "util/fmtwidgetitem.h"
60 * Daemon message callback
62 void message_callback(int /* type */, char *msg)
64 QMessageBox::warning(mainWin, "Bat", msg, QMessageBox::Ok);
67 MainWin::MainWin(QWidget *parent) : QMainWindow(parent)
69 app->setOverrideCursor(QCursor(Qt::WaitCursor));
73 m_treeStackTrap = false;
74 m_dtformat = "yyyy-MM-dd HH:mm:ss";
76 setupUi(this); /* Setup UI defined by main.ui (designer) */
77 register_message_callback(message_callback);
80 treeWidget->setColumnCount(1);
81 treeWidget->setHeaderLabel( tr("Select Page") );
82 treeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
83 tabWidget->setTabsClosable(true); /* wait for QT 4.5 */
86 resetFocus(); /* lineEdit->setFocus() */
89 actionJobPlot->setEnabled(false);
90 actionJobPlot->setVisible(false);
97 foreach(Console *console, m_consoleHash) {
98 console->connect_dir();
101 * Note, the notifier is now a global flag, although each notifier
102 * can be individually turned on and off at a socket level. Once
103 * the notifier is turned off, we don't accept anything from anyone
104 * this prevents unwanted messages from getting into the input
105 * dialogs such as restore that read from the director and "know"
109 m_currentConsole = (Console*)getFromHash(m_firstItem);
110 QTimer::singleShot(2000, this, SLOT(popLists()));
112 QString directoryResourceName;
113 m_currentConsole->getDirResName(directoryResourceName);
114 Pmsg1(100, "Setting initial window to %s\n", directoryResourceName.toUtf8().data());
116 app->restoreOverrideCursor();
119 void MainWin::popLists()
121 foreach(Console *console, m_consoleHash) {
122 console->populateLists(true);
125 connectConsoleSignals();
127 app->restoreOverrideCursor();
128 m_currentConsole->setCurrent();
131 void MainWin::createPages()
134 QTreeWidgetItem *item, *topItem;
138 foreach_res(dir, R_DIRECTOR) {
140 /* Create console tree stacked widget item */
141 m_currentConsole = new Console(tabWidget);
142 m_currentConsole->setDirRes(dir);
143 m_currentConsole->readSettings();
145 /* The top tree item representing the director */
146 topItem = new QTreeWidgetItem(treeWidget);
147 topItem->setText(0, dir->name());
148 topItem->setIcon(0, QIcon(":images/server.png"));
149 /* Set background to grey for ease of identification of inactive Director */
150 QBrush greyBrush(Qt::lightGray);
151 topItem->setBackground(0, greyBrush);
152 m_currentConsole->setDirectorTreeItem(topItem);
153 m_consoleHash.insert(topItem, m_currentConsole);
155 /* Create Tree Widget Item */
156 item = new QTreeWidgetItem(topItem);
157 item->setText(0, tr("Console"));
158 if (!m_firstItem){ m_firstItem = item; }
159 item->setIcon(0,QIcon(QString::fromUtf8(":images/utilities-terminal.png")));
161 /* insert the cosole and tree widget item into the hashes */
162 hashInsert(item, m_currentConsole);
163 m_currentConsole->dockPage();
165 /* Set Color of treeWidgetItem for the console
166 * It will be set to green in the console class if the connection is made.
168 QBrush redBrush(Qt::red);
169 item->setForeground(0, redBrush);
172 * Create instances in alphabetic order of the rest
173 * of the classes that will by default exist under each Director.
179 createPageJobList("", "", "", "", NULL);
184 new JobPlot(NULL, pass);
195 treeWidget->expandItem(topItem);
196 tabWidget->setCurrentWidget(m_currentConsole);
202 * create an instance of the the joblist class on the stack
204 void MainWin::createPageJobList(const QString &media, const QString &client,
205 const QString &job, const QString &fileset, QTreeWidgetItem *parentTreeWidgetItem)
207 QTreeWidgetItem *holdItem;
209 /* save current tree widget item in case query produces no results */
210 holdItem = treeWidget->currentItem();
211 JobList* joblist = new JobList(media, client, job, fileset, parentTreeWidgetItem);
212 /* If this is a query of jobs on a specific media */
213 if ((media != "") || (client != "") || (job != "") || (fileset != "")) {
214 joblist->setCurrent();
215 /* did query produce results, if not close window and set back to hold */
216 if (joblist->m_resultCount == 0) {
217 joblist->closeStackPage();
218 treeWidget->setCurrentItem(holdItem);
224 * Handle up and down arrow keys for the command line
227 void MainWin::keyPressEvent(QKeyEvent *event)
229 if (m_cmd_history.size() == 0) {
233 switch (event->key()) {
235 if (m_cmd_last < 0 || m_cmd_last >= (m_cmd_history.size()-1)) {
242 if (m_cmd_last == 0) {
246 if (m_cmd_last < 0 || m_cmd_last > (m_cmd_history.size()-1)) {
247 m_cmd_last = m_cmd_history.size() - 1;
256 lineEdit->setText(m_cmd_history[m_cmd_last]);
259 void MainWin::connectSignals()
261 /* Connect signals to slots */
262 connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
263 connect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
264 connect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
265 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
266 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
267 connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
268 connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closePage(int)));
269 connect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
270 connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
271 connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
272 connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
273 connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
274 connect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
276 connect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
278 connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
279 connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
280 connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
281 connect(actionClosePage, SIGNAL(triggered()), this, SLOT(closeCurrentPage()));
282 connect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
283 connect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
284 connect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
287 void MainWin::disconnectSignals()
289 /* Connect signals to slots */
290 disconnect(lineEdit, SIGNAL(returnPressed()), this, SLOT(input_line()));
291 disconnect(actionAbout_bat, SIGNAL(triggered()), this, SLOT(about()));
292 disconnect(actionBat_Help, SIGNAL(triggered()), this, SLOT(help()));
293 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
294 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
295 disconnect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(stackItemChanged(int)));
296 disconnect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closePage(int)));
297 disconnect(actionQuit, SIGNAL(triggered()), app, SLOT(closeAllWindows()));
298 disconnect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
299 disconnect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
300 disconnect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
301 disconnect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
302 disconnect(actionStatusDirPage, SIGNAL(triggered()), this, SLOT(statusPageButtonClicked()));
304 disconnect(actionJobPlot, SIGNAL(triggered()), this, SLOT(jobPlotButtonClicked()));
306 disconnect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
307 disconnect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
308 disconnect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
309 disconnect(actionClosePage, SIGNAL(triggered()), this, SLOT(closeCurrentPage()));
310 disconnect(actionPreferences, SIGNAL(triggered()), this, SLOT(setPreferences()));
311 disconnect(actionRepopLists, SIGNAL(triggered()), this, SLOT(repopLists()));
312 disconnect(actionReloadRepop, SIGNAL(triggered()), this, SLOT(reloadRepopLists()));
318 void MainWin::waitEnter()
320 if (m_waitState || m_isClosing) {
324 if (mainWin->m_connDebug) Pmsg0(000, "Entering Wait State\n");
325 app->setOverrideCursor(QCursor(Qt::WaitCursor));
327 disconnectConsoleSignals(m_currentConsole);
328 m_waitTreeItem = treeWidget->currentItem();
334 void MainWin::waitExit()
336 if (!m_waitState || m_isClosing) {
339 if (mainWin->m_connDebug) Pmsg0(000, "Exiting Wait State\n");
340 if (m_waitTreeItem && (m_waitTreeItem != treeWidget->currentItem())) {
341 treeWidget->setCurrentItem(m_waitTreeItem);
345 connectConsoleSignals();
347 app->restoreOverrideCursor();
351 void MainWin::connectConsoleSignals()
353 connect(actionConnect, SIGNAL(triggered()), m_currentConsole, SLOT(connect_dir()));
354 connect(actionSelectFont, SIGNAL(triggered()), m_currentConsole, SLOT(set_font()));
355 connect(actionMessages, SIGNAL(triggered()), m_currentConsole, SLOT(messages()));
358 void MainWin::disconnectConsoleSignals(Console *console)
360 disconnect(actionConnect, SIGNAL(triggered()), console, SLOT(connect_dir()));
361 disconnect(actionMessages, SIGNAL(triggered()), console, SLOT(messages()));
362 disconnect(actionSelectFont, SIGNAL(triggered()), console, SLOT(set_font()));
367 * Two functions to respond to menu items to repop lists and execute reload and repopulate
368 * the lists for jobs, clients, filesets .. ..
370 void MainWin::repopLists()
372 m_currentConsole->populateLists(false);
374 void MainWin::reloadRepopLists()
376 QString cmd = "reload";
377 m_currentConsole->consoleCommand(cmd);
378 m_currentConsole->populateLists(false);
382 * Reimplementation of QWidget closeEvent virtual function
384 void MainWin::closeEvent(QCloseEvent *event)
388 /* Remove all groups from settings for OpenOnExit so that we can start some of the status windows */
389 foreach(Console *console, m_consoleHash){
390 QSettings settings(console->m_dir->name(), "bat");
391 settings.beginGroup("OpenOnExit");
395 /* close all non console pages, this will call settings in destructors */
396 while (m_consoleHash.count() < m_pagehash.count()) {
397 foreach(Pages *page, m_pagehash) {
398 if (page != page->console()) {
399 QTreeWidgetItem* pageSelectorTreeWidgetItem = mainWin->getFromHash(page);
400 if (pageSelectorTreeWidgetItem->childCount() == 0) {
401 page->console()->setCurrent();
402 page->closeStackPage();
407 foreach(Console *console, m_consoleHash){
408 console->writeSettings();
409 console->terminate();
410 console->closeStackPage();
415 void MainWin::writeSettings()
417 QSettings settings("bacula.org", "bat");
419 settings.beginGroup("MainWin");
420 settings.setValue("winSize", size());
421 settings.setValue("winPos", pos());
422 settings.setValue("state", saveState());
427 void MainWin::readSettings()
429 QSettings settings("bacula.org", "bat");
431 settings.beginGroup("MainWin");
432 resize(settings.value("winSize", QSize(1041, 801)).toSize());
433 move(settings.value("winPos", QPoint(200, 150)).toPoint());
434 restoreState(settings.value("state").toByteArray());
439 * This subroutine is called with an item in the Page Selection window
442 void MainWin::treeItemClicked(QTreeWidgetItem *item, int /*column*/)
444 /* Is this a page that has been inserted into the hash */
445 if (getFromHash(item)) {
446 Pages* page = getFromHash(item);
447 int stackindex = tabWidget->indexOf(page);
449 if (stackindex >= 0) {
450 tabWidget->setCurrentWidget(page);
453 /* run the virtual function in case this class overrides it */
454 page->PgSeltreeWidgetClicked();
456 Dmsg0(000, "Page not in hash");
461 * Called with a change of the highlighed tree widget item in the page selector.
463 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
465 if (m_isClosing) return; /* if closing the application, do nothing here */
467 Pages *previousPage, *nextPage;
468 Console *previousConsole = NULL;
469 Console *nextConsole;
471 /* remove all actions before adding actions appropriate for new page */
472 foreach(QAction* pageAction, treeWidget->actions()) {
473 treeWidget->removeAction(pageAction);
476 /* first determine the next item */
478 /* knowing the treeWidgetItem, get the page from the hash */
479 nextPage = getFromHash(currentitem);
480 nextConsole = m_consoleHash.value(currentitem);
481 /* Is this a page that has been inserted into the hash */
483 nextConsole = nextPage->console();
484 /* then is it a treeWidgetItem representing a director */
485 } else if (nextConsole) {
486 /* let the next page BE the console */
487 nextPage = nextConsole;
489 /* Should never get here */
494 /* The Previous item */
496 /* this condition prevents a segfault. The first time there is no previousitem*/
498 if (m_treeStackTrap == false) { /* keep track of previous items for going Back */
499 m_treeWidgetStack.append(previousitem);
501 /* knowing the treeWidgetItem, get the page from the hash */
502 previousPage = getFromHash(previousitem);
503 previousConsole = m_consoleHash.value(previousitem);
505 previousConsole = previousPage->console();
506 } else if (previousConsole) {
507 previousPage = previousConsole;
509 if ((previousPage) || (previousConsole)) {
510 if (nextConsole != previousConsole) {
511 /* remove connections to the current console */
512 disconnectConsoleSignals(previousConsole);
513 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
514 QBrush greyBrush(Qt::lightGray);
515 dirItem->setBackground(0, greyBrush);
520 /* process the current (next) item */
522 if ((nextPage) || (nextConsole)) {
523 if (nextConsole != previousConsole) {
524 /* make connections to the current console */
525 m_currentConsole = nextConsole;
526 connectConsoleSignals();
528 /* Set director's tree widget background to magenta for ease of identification */
529 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
530 QBrush magentaBrush(Qt::magenta);
531 dirItem->setBackground(0, magentaBrush);
533 /* set the value for the currently active console */
534 int stackindex = tabWidget->indexOf(nextPage);
535 nextPage->firstUseDock();
537 /* Is this page currently on the stack or is it undocked */
538 if (stackindex >= 0) {
539 /* put this page on the top of the stack */
540 tabWidget->setCurrentIndex(stackindex);
542 /* it is undocked, raise it to the front */
545 /* for the page selectors menu action to dock or undock, set the text */
546 nextPage->setContextMenuDockText();
548 treeWidget->addAction(actionToggleDock);
549 /* if this page is closeable, and it has no childern, then add that action */
550 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
551 treeWidget->addAction(actionClosePage);
553 /* Add the actions to the Page Selectors tree widget that are part of the
554 * current items list of desired actions regardless of whether on top of stack*/
555 treeWidget->addActions(nextPage->m_contextActions);
559 void MainWin::labelButtonClicked()
564 void MainWin::runButtonClicked()
569 void MainWin::estimateButtonClicked()
574 void MainWin::browseButtonClicked()
579 void MainWin::statusPageButtonClicked()
581 /* if one exists, then just set it current */
583 foreach(Pages *page, m_pagehash) {
584 if (m_currentConsole == page->console()) {
585 if (page->name() == tr("Director Status")) {
596 void MainWin::restoreButtonClicked()
598 new prerestorePage();
599 if (mainWin->m_miscDebug) Pmsg0(000, "in restoreButtonClicked after prerestorePage\n");
602 void MainWin::jobPlotButtonClicked()
607 new JobPlot(NULL, pass);
612 * The user just finished typing a line in the command line edit box
614 void MainWin::input_line()
617 QString cmdStr = lineEdit->text(); /* Get the text */
618 lineEdit->clear(); /* clear the lineEdit box */
619 if (m_currentConsole->is_connected()) {
620 if (m_currentConsole->findDirComm(conn)) {
621 m_currentConsole->consoleCommand(cmdStr, conn);
623 /* Use consoleCommand to allow typing anything */
624 m_currentConsole->consoleCommand(cmdStr);
627 set_status(tr("Director not connected. Click on connect button."));
629 m_cmd_history.append(cmdStr);
631 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
632 m_currentConsole->setCurrent();
636 void MainWin::about()
638 QMessageBox::about(this, tr("About bat"),
639 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
640 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
641 "<p>The <b>bat</b> is an administrative console"
642 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
647 Help::displayFile("index.html");
650 void MainWin::set_statusf(const char *fmt, ...)
655 va_start(arg_ptr, fmt);
656 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
661 void MainWin::set_status_ready()
663 set_status(tr(" Ready"));
666 void MainWin::set_status(const QString &str)
668 statusBar()->showMessage(str);
671 void MainWin::set_status(const char *buf)
673 statusBar()->showMessage(buf);
677 * Function to respond to the button bar button to undock
679 void MainWin::undockWindowButton()
681 Pages* page = (Pages*)tabWidget->currentWidget();
682 page->togglePageDocking();
686 * Function to respond to action on page selector context menu to toggle the
687 * dock status of the window associated with the page selectors current
690 void MainWin::toggleDockContextWindow()
692 QTreeWidgetItem *currentitem = treeWidget->currentItem();
694 /* Is this a page that has been inserted into the hash */
695 if (getFromHash(currentitem)) {
696 Pages* page = getFromHash(currentitem);
697 page->togglePageDocking();
702 * This function is called when the stack item is changed. Call
703 * the virtual function here. Avoids a window being undocked leaving
704 * a window at the top of the stack unpopulated.
706 void MainWin::stackItemChanged(int)
708 if (m_isClosing) return; /* if closing the application, do nothing here */
709 Pages* page = (Pages*)tabWidget->currentWidget();
710 /* run the virtual function in case this class overrides it */
711 page->currentStackItem();
713 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
714 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
715 treeWidget->setCurrentItem(getFromHash(page));
716 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
717 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
722 * Function to simplify insertion of QTreeWidgetItem <-> Page association
723 * into a double direction hash.
725 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
727 m_pagehash.insert(item, page);
728 m_widgethash.insert(page, item);
732 * Function to simplify removal of QTreeWidgetItem <-> Page association
733 * into a double direction hash.
735 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
737 /* I had all sorts of return status checking code here. Do we have a log
738 * level capability in bat. I would have left it in but it used printf's
739 * and it should really be some kind of log level facility ???
740 * ******FIXME********/
741 m_pagehash.remove(item);
742 m_widgethash.remove(page);
746 * Function to retrieve a Page* when the item in the page selector's tree is
749 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
751 return m_pagehash.value(item);
755 * Function to retrieve the page selectors tree widget item when the page is
758 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
760 return m_widgethash.value(page);
763 void MainWin::closeCurrentPage()
769 * Function to respond to action on page selector context menu to close the
772 void MainWin::closePage(int item)
774 QTreeWidgetItem *currentitem;
778 page = (Pages *)tabWidget->widget(item);
780 currentitem = treeWidget->currentItem();
781 /* Is this a page that has been inserted into the hash */
782 if (getFromHash(currentitem)) {
783 page = getFromHash(currentitem);
788 if (page->isCloseable()) {
789 page->closeStackPage();
796 /* Quick function to return the current console */
797 Console *MainWin::currentConsole()
799 return m_currentConsole;
802 /* Quick function to return the tree item for the director */
803 QTreeWidgetItem *MainWin::currentTopItem()
805 return m_currentConsole->directorTreeItem();
808 /* Preferences menu item clicked */
809 void MainWin::setPreferences()
812 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
813 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
814 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
815 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
816 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
817 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
818 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
819 prefs.recordSpinBox->setValue(m_recordLimitVal);
820 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
821 prefs.daysSpinBox->setValue(m_daysLimitVal);
822 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
823 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
824 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
825 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
826 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
827 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
828 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
829 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
830 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
831 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
832 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
833 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
834 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
835 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
836 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
837 switch (ItemFormatterBase::getBytesConversion()) {
838 case ItemFormatterBase::BYTES_CONVERSION_NONE:
839 prefs.radioConvertOff->setChecked(Qt::Checked);
841 case ItemFormatterBase::BYTES_CONVERSION_IEC:
842 prefs.radioConvertIEC->setChecked(Qt::Checked);
845 prefs.radioConvertStandard->setChecked(Qt::Checked);
848 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
850 prefs.openPlotCheckBox->setVisible(false);
852 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
853 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
857 /* Preferences dialog */
858 prefsDialog::prefsDialog()
863 void prefsDialog::accept()
866 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
867 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
868 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
869 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
870 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
871 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
872 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
873 mainWin->m_recordLimitVal = this->recordSpinBox->value();
874 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
875 mainWin->m_daysLimitVal = this->daysSpinBox->value();
876 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
877 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
878 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
880 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
881 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
882 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
883 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
884 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
885 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
886 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
887 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
888 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
889 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
890 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
891 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
892 if (this->radioConvertOff->isChecked()) {
893 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
894 } else if (this->radioConvertIEC->isChecked()){
895 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
897 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
899 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
900 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
901 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
903 QSettings settings("www.bacula.org", "bat");
904 settings.beginGroup("Debug");
905 settings.setValue("commDebug", mainWin->m_commDebug);
906 settings.setValue("connDebug", mainWin->m_connDebug);
907 settings.setValue("displayAll", mainWin->m_displayAll);
908 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
909 settings.setValue("commandDebug", mainWin->m_commandDebug);
910 settings.setValue("miscDebug", mainWin->m_miscDebug);
912 settings.beginGroup("JobList");
913 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
914 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
915 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
916 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
918 settings.beginGroup("Timers");
919 settings.setValue("checkMessages", mainWin->m_checkMessages);
920 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
922 settings.beginGroup("Misc");
923 settings.setValue("longList", mainWin->m_longList);
924 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
925 settings.setValue("openplot", mainWin->m_openPlot);
926 settings.setValue("openbrowser", mainWin->m_openBrowser);
927 settings.setValue("opendirstat", mainWin->m_openDirStat);
929 settings.beginGroup("RestoreTree");
930 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
931 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
932 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
933 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
934 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
935 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
936 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
937 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
938 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
939 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
940 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
941 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
945 void prefsDialog::reject()
948 mainWin->set_status(tr("Canceled"));
951 /* read preferences for the prefences dialog box */
952 void MainWin::readPreferences()
954 QSettings settings("www.bacula.org", "bat");
955 settings.beginGroup("Debug");
956 m_commDebug = settings.value("commDebug", false).toBool();
957 m_connDebug = settings.value("connDebug", false).toBool();
958 m_displayAll = settings.value("displayAll", false).toBool();
959 m_sqlDebug = settings.value("sqlDebug", false).toBool();
960 m_commandDebug = settings.value("commandDebug", false).toBool();
961 m_miscDebug = settings.value("miscDebug", false).toBool();
963 settings.beginGroup("JobList");
964 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
965 m_recordLimitVal = settings.value("recordLimitVal", 50).toInt();
966 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
967 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
969 settings.beginGroup("Timers");
970 m_checkMessages = settings.value("checkMessages", false).toBool();
971 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
973 settings.beginGroup("Misc");
974 m_longList = settings.value("longList", false).toBool();
975 ItemFormatterBase::setBytesConversion(
976 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
977 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
978 m_openPlot = settings.value("openplot", false).toBool();
979 m_openBrowser = settings.value("openbrowser", false).toBool();
980 m_openDirStat = settings.value("opendirstat", false).toBool();
982 settings.beginGroup("RestoreTree");
983 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
984 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
985 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
986 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
987 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
988 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
989 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
990 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
991 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
992 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
993 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
994 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
998 void MainWin::setMessageIcon()
1000 if (m_currentConsole->is_messagesPending())
1001 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
1003 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));
1006 void MainWin::goToPreviousPage()
1008 m_treeStackTrap = true;
1011 /* If stack list is emtpty, then done */
1012 if (m_treeWidgetStack.isEmpty()) {
1015 QTreeWidgetItem* testItem = m_treeWidgetStack.takeLast();
1016 QTreeWidgetItemIterator it(treeWidget);
1017 /* lets avoid a segfault by setting an item current that no longer exists */
1019 if (*it == testItem) {
1020 if (testItem != treeWidget->currentItem()) {
1021 treeWidget->setCurrentItem(testItem);
1030 m_treeStackTrap = false;