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()));
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(closePage()));
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()));
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(closePage()));
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);
452 /* run the virtual function in case this class overrides it */
453 page->PgSeltreeWidgetClicked();
458 * Called with a change of the highlighed tree widget item in the page selector.
460 void MainWin::treeItemChanged(QTreeWidgetItem *currentitem, QTreeWidgetItem *previousitem)
462 if (m_isClosing) return; /* if closing the application, do nothing here */
464 Pages *previousPage, *nextPage;
465 Console *previousConsole = NULL;
466 Console *nextConsole;
468 /* remove all actions before adding actions appropriate for new page */
469 foreach(QAction* pageAction, treeWidget->actions()) {
470 treeWidget->removeAction(pageAction);
473 /* first determine the next item */
475 /* knowing the treeWidgetItem, get the page from the hash */
476 nextPage = getFromHash(currentitem);
477 nextConsole = m_consoleHash.value(currentitem);
478 /* Is this a page that has been inserted into the hash */
480 nextConsole = nextPage->console();
481 /* then is it a treeWidgetItem representing a director */
482 } else if (nextConsole) {
483 /* let the next page BE the console */
484 nextPage = nextConsole;
486 /* Should never get here */
491 /* The Previous item */
493 /* this condition prevents a segfault. The first time there is no previousitem*/
495 if (m_treeStackTrap == false) { /* keep track of previous items for going Back */
496 m_treeWidgetStack.append(previousitem);
498 /* knowing the treeWidgetItem, get the page from the hash */
499 previousPage = getFromHash(previousitem);
500 previousConsole = m_consoleHash.value(previousitem);
502 previousConsole = previousPage->console();
503 } else if (previousConsole) {
504 previousPage = previousConsole;
506 if ((previousPage) || (previousConsole)) {
507 if (nextConsole != previousConsole) {
508 /* remove connections to the current console */
509 disconnectConsoleSignals(previousConsole);
510 QTreeWidgetItem *dirItem = previousConsole->directorTreeItem();
511 QBrush greyBrush(Qt::lightGray);
512 dirItem->setBackground(0, greyBrush);
517 /* process the current (next) item */
519 if ((nextPage) || (nextConsole)) {
520 if (nextConsole != previousConsole) {
521 /* make connections to the current console */
522 m_currentConsole = nextConsole;
523 connectConsoleSignals();
525 /* Set director's tree widget background to magenta for ease of identification */
526 QTreeWidgetItem *dirItem = m_currentConsole->directorTreeItem();
527 QBrush magentaBrush(Qt::magenta);
528 dirItem->setBackground(0, magentaBrush);
530 /* set the value for the currently active console */
531 int stackindex = tabWidget->indexOf(nextPage);
532 nextPage->firstUseDock();
534 /* Is this page currently on the stack or is it undocked */
535 if (stackindex >= 0) {
536 /* put this page on the top of the stack */
537 tabWidget->setCurrentIndex(stackindex);
539 /* it is undocked, raise it to the front */
542 /* for the page selectors menu action to dock or undock, set the text */
543 nextPage->setContextMenuDockText();
545 treeWidget->addAction(actionToggleDock);
546 /* if this page is closeable, and it has no childern, then add that action */
547 if ((nextPage->isCloseable()) && (currentitem->child(0) == NULL))
548 treeWidget->addAction(actionClosePage);
550 /* Add the actions to the Page Selectors tree widget that are part of the
551 * current items list of desired actions regardless of whether on top of stack*/
552 treeWidget->addActions(nextPage->m_contextActions);
556 void MainWin::labelButtonClicked()
561 void MainWin::runButtonClicked()
566 void MainWin::estimateButtonClicked()
571 void MainWin::browseButtonClicked()
576 void MainWin::statusPageButtonClicked()
578 /* if one exists, then just set it current */
580 foreach(Pages *page, m_pagehash) {
581 if (m_currentConsole == page->console()) {
582 if (page->name() == tr("Director Status")) {
593 void MainWin::restoreButtonClicked()
595 new prerestorePage();
596 if (mainWin->m_miscDebug) Pmsg0(000, "in restoreButtonClicked after prerestorePage\n");
599 void MainWin::jobPlotButtonClicked()
604 new JobPlot(NULL, pass);
609 * The user just finished typing a line in the command line edit box
611 void MainWin::input_line()
614 QString cmdStr = lineEdit->text(); /* Get the text */
615 lineEdit->clear(); /* clear the lineEdit box */
616 if (m_currentConsole->is_connected()) {
617 if (m_currentConsole->findDirComm(conn)) {
618 m_currentConsole->consoleCommand(cmdStr, conn);
620 /* Use consoleCommand to allow typing anything */
621 m_currentConsole->consoleCommand(cmdStr);
624 set_status(tr("Director not connected. Click on connect button."));
626 m_cmd_history.append(cmdStr);
628 if (treeWidget->currentItem() != getFromHash(m_currentConsole))
629 m_currentConsole->setCurrent();
633 void MainWin::about()
635 QMessageBox::about(this, tr("About bat"),
636 tr("<br><h2>bat %1 (%2), by Dirk H Bartley and Kern Sibbald</h2>"
637 "<p>Copyright © 2007-%3 Free Software Foundation Europe e.V."
638 "<p>The <b>bat</b> is an administrative console"
639 " interface to the Director.").arg(VERSION).arg(BDATE).arg(BYEAR));
644 Help::displayFile("index.html");
647 void MainWin::set_statusf(const char *fmt, ...)
652 va_start(arg_ptr, fmt);
653 len = bvsnprintf(buf, sizeof(buf), fmt, arg_ptr);
658 void MainWin::set_status_ready()
660 set_status(tr(" Ready"));
663 void MainWin::set_status(const QString &str)
665 statusBar()->showMessage(str);
668 void MainWin::set_status(const char *buf)
670 statusBar()->showMessage(buf);
674 * Function to respond to the button bar button to undock
676 void MainWin::undockWindowButton()
678 Pages* page = (Pages*)tabWidget->currentWidget();
679 page->togglePageDocking();
683 * Function to respond to action on page selector context menu to toggle the
684 * dock status of the window associated with the page selectors current
687 void MainWin::toggleDockContextWindow()
689 QTreeWidgetItem *currentitem = treeWidget->currentItem();
691 /* Is this a page that has been inserted into the hash */
692 if (getFromHash(currentitem)) {
693 Pages* page = getFromHash(currentitem);
694 page->togglePageDocking();
699 * This function is called when the stack item is changed. Call
700 * the virtual function here. Avoids a window being undocked leaving
701 * a window at the top of the stack unpopulated.
703 void MainWin::stackItemChanged(int)
705 if (m_isClosing) return; /* if closing the application, do nothing here */
706 Pages* page = (Pages*)tabWidget->currentWidget();
707 /* run the virtual function in case this class overrides it */
708 page->currentStackItem();
710 disconnect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
711 disconnect(treeWidget, SIGNAL( currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
712 treeWidget->setCurrentItem(getFromHash(page));
713 connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem *, int)), this, SLOT(treeItemClicked(QTreeWidgetItem *, int)));
714 connect(treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
719 * Function to simplify insertion of QTreeWidgetItem <-> Page association
720 * into a double direction hash.
722 void MainWin::hashInsert(QTreeWidgetItem *item, Pages *page)
724 m_pagehash.insert(item, page);
725 m_widgethash.insert(page, item);
729 * Function to simplify removal of QTreeWidgetItem <-> Page association
730 * into a double direction hash.
732 void MainWin::hashRemove(QTreeWidgetItem *item, Pages *page)
734 /* I had all sorts of return status checking code here. Do we have a log
735 * level capability in bat. I would have left it in but it used printf's
736 * and it should really be some kind of log level facility ???
737 * ******FIXME********/
738 m_pagehash.remove(item);
739 m_widgethash.remove(page);
743 * Function to retrieve a Page* when the item in the page selector's tree is
746 Pages* MainWin::getFromHash(QTreeWidgetItem *item)
748 return m_pagehash.value(item);
752 * Function to retrieve the page selectors tree widget item when the page is
755 QTreeWidgetItem* MainWin::getFromHash(Pages *page)
757 return m_widgethash.value(page);
761 * Function to respond to action on page selector context menu to close the
764 void MainWin::closePage()
766 QTreeWidgetItem *currentitem = treeWidget->currentItem();
768 /* Is this a page that has been inserted into the hash */
769 if (getFromHash(currentitem)) {
770 Pages* page = getFromHash(currentitem);
771 if (page->isCloseable()) {
772 page->closeStackPage();
777 /* Quick function to return the current console */
778 Console *MainWin::currentConsole()
780 return m_currentConsole;
783 /* Quick function to return the tree item for the director */
784 QTreeWidgetItem *MainWin::currentTopItem()
786 return m_currentConsole->directorTreeItem();
789 /* Preferences menu item clicked */
790 void MainWin::setPreferences()
793 prefs.commDebug->setCheckState(m_commDebug ? Qt::Checked : Qt::Unchecked);
794 prefs.connDebug->setCheckState(m_connDebug ? Qt::Checked : Qt::Unchecked);
795 prefs.displayAll->setCheckState(m_displayAll ? Qt::Checked : Qt::Unchecked);
796 prefs.sqlDebug->setCheckState(m_sqlDebug ? Qt::Checked : Qt::Unchecked);
797 prefs.commandDebug->setCheckState(m_commandDebug ? Qt::Checked : Qt::Unchecked);
798 prefs.miscDebug->setCheckState(m_miscDebug ? Qt::Checked : Qt::Unchecked);
799 prefs.recordLimit->setCheckState(m_recordLimitCheck ? Qt::Checked : Qt::Unchecked);
800 prefs.recordSpinBox->setValue(m_recordLimitVal);
801 prefs.daysLimit->setCheckState(m_daysLimitCheck ? Qt::Checked : Qt::Unchecked);
802 prefs.daysSpinBox->setValue(m_daysLimitVal);
803 prefs.checkMessages->setCheckState(m_checkMessages ? Qt::Checked : Qt::Unchecked);
804 prefs.checkMessagesSpin->setValue(m_checkMessagesInterval);
805 prefs.executeLongCheckBox->setCheckState(m_longList ? Qt::Checked : Qt::Unchecked);
806 prefs.rtPopDirCheckBox->setCheckState(m_rtPopDirDebug ? Qt::Checked : Qt::Unchecked);
807 prefs.rtDirCurICCheckBox->setCheckState(m_rtDirCurICDebug ? Qt::Checked : Qt::Unchecked);
808 prefs.rtDirICCheckBox->setCheckState(m_rtDirICDebug ? Qt::Checked : Qt::Unchecked);
809 prefs.rtFileTabICCheckBox->setCheckState(m_rtFileTabICDebug ? Qt::Checked : Qt::Unchecked);
810 prefs.rtVerTabICCheckBox->setCheckState(m_rtVerTabICDebug ? Qt::Checked : Qt::Unchecked);
811 prefs.rtUpdateFTCheckBox->setCheckState(m_rtUpdateFTDebug ? Qt::Checked : Qt::Unchecked);
812 prefs.rtUpdateVTCheckBox->setCheckState(m_rtUpdateVTDebug ? Qt::Checked : Qt::Unchecked);
813 prefs.rtChecksCheckBox->setCheckState(m_rtChecksDebug ? Qt::Checked : Qt::Unchecked);
814 prefs.rtIconStateCheckBox->setCheckState(m_rtIconStateDebug ? Qt::Checked : Qt::Unchecked);
815 prefs.rtRestore1CheckBox->setCheckState(m_rtRestore1Debug ? Qt::Checked : Qt::Unchecked);
816 prefs.rtRestore2CheckBox->setCheckState(m_rtRestore2Debug ? Qt::Checked : Qt::Unchecked);
817 prefs.rtRestore3CheckBox->setCheckState(m_rtRestore3Debug ? Qt::Checked : Qt::Unchecked);
818 switch (ItemFormatterBase::getBytesConversion()) {
819 case ItemFormatterBase::BYTES_CONVERSION_NONE:
820 prefs.radioConvertOff->setChecked(Qt::Checked);
822 case ItemFormatterBase::BYTES_CONVERSION_IEC:
823 prefs.radioConvertIEC->setChecked(Qt::Checked);
826 prefs.radioConvertStandard->setChecked(Qt::Checked);
829 prefs.openPlotCheckBox->setCheckState(m_openPlot ? Qt::Checked : Qt::Unchecked);
831 prefs.openPlotCheckBox->setVisible(false);
833 prefs.openBrowserCheckBox->setCheckState(m_openBrowser ? Qt::Checked : Qt::Unchecked);
834 prefs.openDirStatCheckBox->setCheckState(m_openDirStat ? Qt::Checked : Qt::Unchecked);
838 /* Preferences dialog */
839 prefsDialog::prefsDialog()
844 void prefsDialog::accept()
847 mainWin->m_commDebug = this->commDebug->checkState() == Qt::Checked;
848 mainWin->m_connDebug = this->connDebug->checkState() == Qt::Checked;
849 mainWin->m_displayAll = this->displayAll->checkState() == Qt::Checked;
850 mainWin->m_sqlDebug = this->sqlDebug->checkState() == Qt::Checked;
851 mainWin->m_commandDebug = this->commandDebug->checkState() == Qt::Checked;
852 mainWin->m_miscDebug = this->miscDebug->checkState() == Qt::Checked;
853 mainWin->m_recordLimitCheck = this->recordLimit->checkState() == Qt::Checked;
854 mainWin->m_recordLimitVal = this->recordSpinBox->value();
855 mainWin->m_daysLimitCheck = this->daysLimit->checkState() == Qt::Checked;
856 mainWin->m_daysLimitVal = this->daysSpinBox->value();
857 mainWin->m_checkMessages = this->checkMessages->checkState() == Qt::Checked;
858 mainWin->m_checkMessagesInterval = this->checkMessagesSpin->value();
859 mainWin->m_longList = this->executeLongCheckBox->checkState() == Qt::Checked;
861 mainWin->m_rtPopDirDebug = this->rtPopDirCheckBox->checkState() == Qt::Checked;
862 mainWin->m_rtDirCurICDebug = this->rtDirCurICCheckBox->checkState() == Qt::Checked;
863 mainWin->m_rtDirICDebug = this->rtDirICCheckBox->checkState() == Qt::Checked;
864 mainWin->m_rtFileTabICDebug = this->rtFileTabICCheckBox->checkState() == Qt::Checked;
865 mainWin->m_rtVerTabICDebug = this->rtVerTabICCheckBox->checkState() == Qt::Checked;
866 mainWin->m_rtUpdateFTDebug = this->rtUpdateFTCheckBox->checkState() == Qt::Checked;
867 mainWin->m_rtUpdateVTDebug = this->rtUpdateVTCheckBox->checkState() == Qt::Checked;
868 mainWin->m_rtChecksDebug = this->rtChecksCheckBox->checkState() == Qt::Checked;
869 mainWin->m_rtIconStateDebug = this->rtIconStateCheckBox->checkState() == Qt::Checked;
870 mainWin->m_rtRestore1Debug = this->rtRestore1CheckBox->checkState() == Qt::Checked;
871 mainWin->m_rtRestore2Debug = this->rtRestore2CheckBox->checkState() == Qt::Checked;
872 mainWin->m_rtRestore3Debug = this->rtRestore3CheckBox->checkState() == Qt::Checked;
873 if (this->radioConvertOff->isChecked()) {
874 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_NONE);
875 } else if (this->radioConvertIEC->isChecked()){
876 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_IEC);
878 ItemFormatterBase::setBytesConversion(ItemFormatterBase::BYTES_CONVERSION_SI);
880 mainWin->m_openPlot = this->openPlotCheckBox->checkState() == Qt::Checked;
881 mainWin->m_openBrowser = this->openBrowserCheckBox->checkState() == Qt::Checked;
882 mainWin->m_openDirStat = this->openDirStatCheckBox->checkState() == Qt::Checked;
884 QSettings settings("www.bacula.org", "bat");
885 settings.beginGroup("Debug");
886 settings.setValue("commDebug", mainWin->m_commDebug);
887 settings.setValue("connDebug", mainWin->m_connDebug);
888 settings.setValue("displayAll", mainWin->m_displayAll);
889 settings.setValue("sqlDebug", mainWin->m_sqlDebug);
890 settings.setValue("commandDebug", mainWin->m_commandDebug);
891 settings.setValue("miscDebug", mainWin->m_miscDebug);
893 settings.beginGroup("JobList");
894 settings.setValue("recordLimitCheck", mainWin->m_recordLimitCheck);
895 settings.setValue("recordLimitVal", mainWin->m_recordLimitVal);
896 settings.setValue("daysLimitCheck", mainWin->m_daysLimitCheck);
897 settings.setValue("daysLimitVal", mainWin->m_daysLimitVal);
899 settings.beginGroup("Timers");
900 settings.setValue("checkMessages", mainWin->m_checkMessages);
901 settings.setValue("checkMessagesInterval", mainWin->m_checkMessagesInterval);
903 settings.beginGroup("Misc");
904 settings.setValue("longList", mainWin->m_longList);
905 settings.setValue("byteConvert", ItemFormatterBase::getBytesConversion());
906 settings.setValue("openplot", mainWin->m_openPlot);
907 settings.setValue("openbrowser", mainWin->m_openBrowser);
908 settings.setValue("opendirstat", mainWin->m_openDirStat);
910 settings.beginGroup("RestoreTree");
911 settings.setValue("rtPopDirDebug", mainWin->m_rtPopDirDebug);
912 settings.setValue("rtDirCurICDebug", mainWin->m_rtDirCurICDebug);
913 settings.setValue("rtDirCurICRetDebug", mainWin->m_rtDirICDebug);
914 settings.setValue("rtFileTabICDebug", mainWin->m_rtFileTabICDebug);
915 settings.setValue("rtVerTabICDebug", mainWin->m_rtVerTabICDebug);
916 settings.setValue("rtUpdateFTDebug", mainWin->m_rtUpdateFTDebug);
917 settings.setValue("rtUpdateVTDebug", mainWin->m_rtUpdateVTDebug);
918 settings.setValue("rtChecksDebug", mainWin->m_rtChecksDebug);
919 settings.setValue("rtIconStateDebug", mainWin->m_rtIconStateDebug);
920 settings.setValue("rtRestore1Debug", mainWin->m_rtRestore1Debug);
921 settings.setValue("rtRestore2Debug", mainWin->m_rtRestore2Debug);
922 settings.setValue("rtRestore3Debug", mainWin->m_rtRestore3Debug);
926 void prefsDialog::reject()
929 mainWin->set_status(tr("Canceled"));
932 /* read preferences for the prefences dialog box */
933 void MainWin::readPreferences()
935 QSettings settings("www.bacula.org", "bat");
936 settings.beginGroup("Debug");
937 m_commDebug = settings.value("commDebug", false).toBool();
938 m_connDebug = settings.value("connDebug", false).toBool();
939 m_displayAll = settings.value("displayAll", false).toBool();
940 m_sqlDebug = settings.value("sqlDebug", false).toBool();
941 m_commandDebug = settings.value("commandDebug", false).toBool();
942 m_miscDebug = settings.value("miscDebug", false).toBool();
944 settings.beginGroup("JobList");
945 m_recordLimitCheck = settings.value("recordLimitCheck", true).toBool();
946 m_recordLimitVal = settings.value("recordLimitVal", 50).toInt();
947 m_daysLimitCheck = settings.value("daysLimitCheck", false).toBool();
948 m_daysLimitVal = settings.value("daysLimitVal", 28).toInt();
950 settings.beginGroup("Timers");
951 m_checkMessages = settings.value("checkMessages", false).toBool();
952 m_checkMessagesInterval = settings.value("checkMessagesInterval", 28).toInt();
954 settings.beginGroup("Misc");
955 m_longList = settings.value("longList", false).toBool();
956 ItemFormatterBase::setBytesConversion(
957 (ItemFormatterBase::BYTES_CONVERSION) settings.value("byteConvert",
958 ItemFormatterBase::BYTES_CONVERSION_IEC).toInt());
959 m_openPlot = settings.value("openplot", false).toBool();
960 m_openBrowser = settings.value("openbrowser", false).toBool();
961 m_openDirStat = settings.value("opendirstat", false).toBool();
963 settings.beginGroup("RestoreTree");
964 m_rtPopDirDebug = settings.value("rtPopDirDebug", false).toBool();
965 m_rtDirCurICDebug = settings.value("rtDirCurICDebug", false).toBool();
966 m_rtDirICDebug = settings.value("rtDirCurICRetDebug", false).toBool();
967 m_rtFileTabICDebug = settings.value("rtFileTabICDebug", false).toBool();
968 m_rtVerTabICDebug = settings.value("rtVerTabICDebug", false).toBool();
969 m_rtUpdateFTDebug = settings.value("rtUpdateFTDebug", false).toBool();
970 m_rtUpdateVTDebug = settings.value("rtUpdateVTDebug", false).toBool();
971 m_rtChecksDebug = settings.value("rtChecksDebug", false).toBool();
972 m_rtIconStateDebug = settings.value("rtIconStateDebug", false).toBool();
973 m_rtRestore1Debug = settings.value("rtRestore1Debug", false).toBool();
974 m_rtRestore2Debug = settings.value("rtRestore2Debug", false).toBool();
975 m_rtRestore3Debug = settings.value("rtRestore3Debug", false).toBool();
979 void MainWin::setMessageIcon()
981 if (m_currentConsole->is_messagesPending())
982 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-pending.png")));
984 actionMessages->setIcon(QIcon(QString::fromUtf8(":/images/mail-message-new.png")));
987 void MainWin::goToPreviousPage()
989 m_treeStackTrap = true;
992 /* If stack list is emtpty, then done */
993 if (m_treeWidgetStack.isEmpty()) {
996 QTreeWidgetItem* testItem = m_treeWidgetStack.takeLast();
997 QTreeWidgetItemIterator it(treeWidget);
998 /* lets avoid a segfault by setting an item current that no longer exists */
1000 if (*it == testItem) {
1001 if (testItem != treeWidget->currentItem()) {
1002 treeWidget->setCurrentItem(testItem);
1011 m_treeStackTrap = false;