def restore_ui(self):
     """Restore UI state from previous session."""
     self.qsettings.beginGroup(self.settings_group)
     window_size = self.qsettings.value("windowSize")
     window_pos = self.qsettings.value("windowPosition")
     window_state = self.qsettings.value("windowState")
     window_maximized = self.qsettings.value("windowMaximized",
                                             defaultValue='false')
     n_screens = self.qsettings.value("n_screens", defaultValue=1)
     self.qsettings.endGroup()
     original_size = self.size()
     if window_size:
         self.resize(window_size)
     if window_pos:
         self.move(window_pos)
     if window_state:
         self.restoreState(window_state,
                           version=1)  # Toolbar and dockWidget positions
     if len(QGuiApplication.screens()) < int(n_screens):
         # There are less screens available now than on previous application startup
         self.move(0,
                   0)  # Move this widget to primary screen position (0,0)
     ensure_window_is_on_screen(self, original_size)
     if window_maximized == 'true':
         self.setWindowState(Qt.WindowMaximized)
 def restore_ui(self):
     """Restore UI state from previous session."""
     window_size = self.qsettings.value("dataPackageWidget/windowSize")
     window_pos = self.qsettings.value("dataPackageWidget/windowPosition")
     splitter_state = self.qsettings.value(
         "dataPackageWidget/splitterState")
     window_maximized = self.qsettings.value(
         "dataPackageWidget/windowMaximized", defaultValue='false')
     window_state = self.qsettings.value("dataPackageWidget/windowState")
     n_screens = self.qsettings.value("mainWindow/n_screens",
                                      defaultValue=1)
     original_size = self.size()
     if window_size:
         self.resize(window_size)
     if window_pos:
         self.move(window_pos)
     # noinspection PyArgumentList
     if len(QGuiApplication.screens()) < int(n_screens):
         # There are less screens available now than on previous application startup
         self.move(0,
                   0)  # Move this widget to primary screen position (0,0)
     ensure_window_is_on_screen(self, original_size)
     if window_maximized == 'true':
         self.setWindowState(Qt.WindowMaximized)
     if window_state:
         self.restoreState(window_state,
                           version=1)  # Toolbar and dockWidget positions
     if splitter_state:
         self.ui.splitter.restoreState(splitter_state)
示例#3
0
 def closeEvent(self, event):
     """Stores window's settings and accepts the event."""
     if self._import_preview is not None:
         self._settings.beginGroup(self._SETTINGS_GROUP_NAME)
         self._settings.setValue("n_screens",
                                 len(QGuiApplication.screens()))
         if not self._import_preview.isHidden():
             self._settings.setValue("windowSize", self.size())
             self._settings.setValue("windowPosition", self.pos())
             self._settings.setValue(
                 "windowMaximized",
                 self.windowState() == Qt.WindowMaximized)
             for splitter in self._import_preview.findChildren(QSplitter):
                 self._settings.setValue(
                     splitter.objectName() + "_splitterState",
                     splitter.saveState())
         elif self._preview_window_state:
             self._settings.setValue("windowSize",
                                     self._preview_window_state["size"])
             self._settings.setValue("windowPosition",
                                     self._preview_window_state["position"])
             self._settings.setValue("windowMaximized",
                                     self._preview_window_state.maximized)
             for name, state in self._preview_window_state["splitters"]:
                 self._settings.setValue(name + "_splitterState", state)
         self._settings.endGroup()
     event.accept()
 def restore_ui(self):
     """Restore UI state from previous session."""
     qsettings = self._qsettings
     qsettings.beginGroup(self.settings_group)
     window_size = qsettings.value("windowSize")
     window_pos = qsettings.value("windowPosition")
     window_state = qsettings.value("windowState")
     window_maximized = qsettings.value("windowMaximized",
                                        defaultValue='false')
     n_screens = qsettings.value("n_screens", defaultValue=1)
     splitter_state = {}
     for splitter in self.findChildren(QSplitter):
         splitter_state[splitter] = qsettings.value(splitter.objectName() +
                                                    "_splitterState")
     qsettings.endGroup()
     original_size = self.size()
     if window_size:
         self.resize(window_size)
     if window_pos:
         self.move(window_pos)
     if window_state:
         self.restoreState(window_state,
                           version=1)  # Toolbar and dockWidget positions
     # noinspection PyArgumentList
     if len(QGuiApplication.screens()) < int(n_screens):
         # There are less screens available now than on previous application startup
         self.move(0,
                   0)  # Move this widget to primary screen position (0,0)
     ensure_window_is_on_screen(self, original_size)
     if window_maximized == 'true':
         self.setWindowState(Qt.WindowMaximized)
     for splitter, state in splitter_state.items():
         if state:
             splitter.restoreState(state)
    def __init__(self, data_connection):
        """Initialize class."""
        from ..ui.spine_datapackage_form import Ui_MainWindow  # pylint: disable=import-outside-toplevel

        super().__init__(
            flags=Qt.Window
        )  # TODO: Set parent as toolbox here if it makes sense
        # TODO: Maybe set the parent as ToolboxUI so that its stylesheet is inherited. This may need
        # TODO: reimplementing the window minimizing and maximizing actions as well as setting the window modality
        self._data_connection = data_connection
        self.datapackage = None
        self.descriptor_tree_context_menu = None
        self.selected_resource_name = None
        self.resource_data = dict()
        self.resources_model = DatapackageResourcesModel(self)
        self.fields_model = DatapackageFieldsModel(self)
        self.foreign_keys_model = DatapackageForeignKeysModel(self)
        self.resource_data_model = MinimalTableModel(self)
        self.default_row_height = QFontMetrics(QFont("", 0)).lineSpacing()
        max_screen_height = max(
            [s.availableSize().height() for s in QGuiApplication.screens()])
        self.visible_rows = int(max_screen_height / self.default_row_height)
        self.err_msg = QErrorMessage(self)
        self.remove_row_icon = QIcon(":/icons/minus.png")
        self.progress_bar = QProgressBar()
        self.progress_bar.hide()
        self.focus_widget = None  # Last widget which had focus before showing a menu from the menubar
        #  Set up the user interface from Designer.
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setWindowIcon(QIcon(":/symbols/app.ico"))
        self.qsettings = QSettings("SpineProject", "Spine Toolbox")
        self.restore_ui()
        self.add_toggle_view_actions()
        # Add status bar to form
        self.ui.statusbar.setFixedHeight(20)
        self.ui.statusbar.setSizeGripEnabled(False)
        self.ui.statusbar.setStyleSheet(STATUSBAR_SS)
        self.ui.statusbar.addPermanentWidget(self.progress_bar)
        self.ui.tableView_resources.setModel(self.resources_model)
        self.ui.tableView_fields.setModel(self.fields_model)
        self.ui.tableView_foreign_keys.setModel(self.foreign_keys_model)
        self.ui.tableView_resource_data.setModel(self.resource_data_model)
        self.ui.tableView_resources.verticalHeader().setDefaultSectionSize(
            self.default_row_height)
        self.ui.tableView_resource_data.verticalHeader().setDefaultSectionSize(
            self.default_row_height)
        self.ui.tableView_resource_data.horizontalHeader(
        ).setResizeContentsPrecision(self.visible_rows)
        self.ui.tableView_fields.verticalHeader().setDefaultSectionSize(
            self.default_row_height)
        self.ui.tableView_fields.horizontalHeader().setResizeContentsPrecision(
            self.visible_rows)
        self.ui.tableView_foreign_keys.verticalHeader().setDefaultSectionSize(
            self.default_row_height)
        self.ui.tableView_foreign_keys.horizontalHeader(
        ).setResizeContentsPrecision(self.visible_rows)
        self.connect_signals()
        # Ensure this window gets garbage-collected when closed
        self.setAttribute(Qt.WA_DeleteOnClose)
示例#6
0
    def __init__(self, db_mngr, *db_urls):
        """Initializes form.

        Args:
            db_mngr (SpineDBManager): The manager to use
            *db_urls (tuple): Database url, codename.
        """
        super().__init__(flags=Qt.Window)
        from ..ui.data_store_view import Ui_MainWindow

        self.db_urls = list(db_urls)
        self.db_url = self.db_urls[0]
        self.db_mngr = db_mngr
        self.db_maps = [
            self.db_mngr.get_db_map_for_listener(self, url, codename=codename)
            for url, codename in self.db_urls
        ]
        self.db_map = self.db_maps[0]
        # Setup UI from Qt Designer file
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.takeCentralWidget()
        self.setWindowIcon(QIcon(":/symbols/app.ico"))
        self.setStyleSheet(MAINWINDOW_SS)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.qsettings = QSettings("SpineProject", "Spine Toolbox")
        self.err_msg = QErrorMessage(self)
        self.notification_stack = NotificationStack(self)
        self.err_msg.setWindowTitle("Error")
        self.parameter_tag_toolbar = ParameterTagToolBar(
            self, self.db_mngr, *self.db_maps)
        self.addToolBar(Qt.TopToolBarArea, self.parameter_tag_toolbar)
        self.selected_ent_cls_ids = {
            "object class": {},
            "relationship class": {}
        }
        self.selected_ent_ids = {"object": {}, "relationship": {}}
        self.selected_parameter_tag_ids = dict()
        self.selected_param_def_ids = {
            "object class": {},
            "relationship class": {}
        }
        self.parameter_value_list_model = ParameterValueListModel(
            self, self.db_mngr, *self.db_maps)
        fm = QFontMetrics(QFont("", 0))
        self.default_row_height = 1.2 * fm.lineSpacing()
        max_screen_height = max(
            [s.availableSize().height() for s in QGuiApplication.screens()])
        self.visible_rows = int(max_screen_height / self.default_row_height)
        self._selection_source = None
        self._selection_locked = False
        self._focusable_childs = [self.ui.treeView_parameter_value_list]
        self.settings_group = 'treeViewWidget'
        self.undo_action = None
        self.redo_action = None
        db_names = ", ".join(
            ["{0}[*]".format(db_map.codename) for db_map in self.db_maps])
        self.setWindowTitle("{0} - Data store view ".format(db_names))
        self.update_commit_enabled()
示例#7
0
文件: api.py 项目: schoentoon/runekit
    def _update_screen_info(self):
        virtual_screen = QRect(0, 0, 0, 0)

        for screen in QGuiApplication.screens():
            geom = screen.virtualGeometry()
            virtual_screen = virtual_screen.united(geom)

        self._screen_info = virtual_screen
        self.screen_update_signal.emit()
 def save_window_state(self):
     """Save window state parameters (size, position, state) via QSettings."""
     self.qsettings.beginGroup(self.settings_group)
     self.qsettings.setValue("windowSize", self.size())
     self.qsettings.setValue("windowPosition", self.pos())
     self.qsettings.setValue("windowState", self.saveState(version=1))
     self.qsettings.setValue("windowMaximized",
                             self.windowState() == Qt.WindowMaximized)
     self.qsettings.setValue("n_screens", len(QGuiApplication.screens()))
     self.qsettings.endGroup()
示例#9
0
def run_spp():
    app = QApplication([])
    global screen
    screen = QGuiApplication.screens()[0]

    main = Changewall()
    main.resize_move()
    main.setWindowTitle('Changewall')
    main.show()
    main.load()
    sys.exit(app.exec_())
示例#10
0
    def __init__(self, datapackage):
        """Initialize class.

        Args:
            datapackage (CustomPackage): Data package associated to this widget
        """
        from ..ui.spine_datapackage_form import Ui_MainWindow  # pylint: disable=import-outside-toplevel

        super().__init__(flags=Qt.Window)
        self.datapackage = datapackage
        self.selected_resource_index = None
        self.resources_model = DatapackageResourcesModel(self, self.datapackage)
        self.fields_model = DatapackageFieldsModel(self, self.datapackage)
        self.foreign_keys_model = DatapackageForeignKeysModel(self, self.datapackage)
        self.resource_data_model = DatapackageResourceDataModel(self, self.datapackage)
        self.default_row_height = QFontMetrics(QFont("", 0)).lineSpacing()
        max_screen_height = max([s.availableSize().height() for s in QGuiApplication.screens()])
        self.visible_rows = int(max_screen_height / self.default_row_height)
        self.err_msg = QErrorMessage(self)
        self.notification_stack = NotificationStack(self)
        self._foreign_keys_context_menu = QMenu(self)
        self._file_watcher = QFileSystemWatcher(self)
        self._file_watcher.addPath(self.datapackage.base_path)
        self._changed_source_indexes = set()
        self.undo_group = QUndoGroup(self)
        self.undo_stacks = {}
        self._save_resource_actions = []
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.takeCentralWidget()
        self._before_save_all = self.ui.menuFile.insertSeparator(self.ui.actionSave_All)
        self.setWindowIcon(QIcon(":/symbols/app.ico"))
        self.qsettings = QSettings("SpineProject", "Spine Toolbox")
        self.restore_ui()
        self.add_menu_actions()
        self.setStyleSheet(MAINWINDOW_SS)
        self.ui.tableView_resources.setModel(self.resources_model)
        self.ui.tableView_resources.verticalHeader().setDefaultSectionSize(self.default_row_height)
        self.ui.tableView_resource_data.setModel(self.resource_data_model)
        self.ui.tableView_resource_data.verticalHeader().setDefaultSectionSize(self.default_row_height)
        self.ui.tableView_resource_data.horizontalHeader().setResizeContentsPrecision(self.visible_rows)
        self.ui.tableView_fields.setModel(self.fields_model)
        self.ui.tableView_fields.verticalHeader().setDefaultSectionSize(self.default_row_height)
        self.ui.tableView_fields.horizontalHeader().setResizeContentsPrecision(self.visible_rows)
        self.ui.tableView_foreign_keys.setModel(self.foreign_keys_model)
        self.ui.tableView_foreign_keys.verticalHeader().setDefaultSectionSize(self.default_row_height)
        self.ui.tableView_foreign_keys.horizontalHeader().setResizeContentsPrecision(self.visible_rows)
        self.connect_signals()
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setWindowTitle("{0}[*] - Spine datapackage manager".format(self.datapackage.base_path))
        self.load_datapackage()
示例#11
0
    def closeEvent(self, event=None):
        """Handle close event.

        Args:
            event (QEvent): Closing event if 'X' is clicked.
        """
        # save qsettings
        self.qsettings.setValue("dataPackageWidget/windowSize", self.size())
        self.qsettings.setValue("dataPackageWidget/windowPosition", self.pos())
        self.qsettings.setValue("dataPackageWidget/windowState", self.saveState(version=1))
        self.qsettings.setValue("dataPackageWidget/windowMaximized", self.windowState() == Qt.WindowMaximized)
        self.qsettings.setValue("dataPackageWidget/n_screens", len(QGuiApplication.screens()))
        if event:
            event.accept()
示例#12
0
def screen_info(widget):
    """Format information on the screens"""
    policy = QGuiApplication.highDpiScaleFactorRoundingPolicy()
    policy_string = str(policy).split('.')[-1]
    result = "<p>High DPI scale factor rounding policy: {}</p><ol>".format(
        policy_string)
    for screen in QGuiApplication.screens():
        current = screen == widget.screen()
        result += "<li>"
        if current:
            result += "<i>"
        result += '"{}" {} {}DPI, DPR={}'.format(
            screen.name(), format_geometry(screen.geometry()),
            int(screen.logicalDotsPerInchX()), screen.devicePixelRatio())
        if current:
            result += "</i>"
        result += "</li>"
    result += "</ol>"
    return result
示例#13
0
 def _restore_preview_ui(self):
     """Restore UI state from previous session."""
     if not self._preview_window_state:
         self._settings.beginGroup(self._SETTINGS_GROUP_NAME)
         window_size = self._settings.value("windowSize")
         window_pos = self._settings.value("windowPosition")
         n_screens = self._settings.value("n_screens", defaultValue=1)
         window_maximized = self._settings.value("windowMaximized",
                                                 defaultValue='false')
         splitter_state = {}
         for splitter in self._import_preview.findChildren(QSplitter):
             splitter_state[splitter] = self._settings.value(
                 splitter.objectName() + "_splitterState")
         self._settings.endGroup()
         original_size = self.size()
         if window_size:
             self.resize(window_size)
         else:
             self.setGeometry(
                 QStyle.alignedRect(
                     Qt.LeftToRight, Qt.AlignCenter, QSize(1000, 700),
                     QApplication.desktop().availableGeometry(self)))
         if window_pos:
             self.move(window_pos)
         if len(QGuiApplication.screens()) < int(n_screens):
             # There are less screens available now than on previous application startup
             self.move(
                 0, 0)  # Move this widget to primary screen position (0,0)
         ensure_window_is_on_screen(self, original_size)
         if window_maximized == 'true':
             self.setWindowState(Qt.WindowMaximized)
         for splitter, state in splitter_state.items():
             if state:
                 splitter.restoreState(state)
     else:
         self.resize(self._preview_window_state["size"])
         self.move(self._preview_window_state["position"])
         self.setWindowState(self._preview_window_state["maximized"])
         for splitter in self._import_preview.findChildren(QSplitter):
             name = splitter.objectName()
             splitter.restoreState(
                 self._preview_window_state["splitters"][name])
示例#14
0
    def __init__(self, db_mngr):
        """Initializes form.

        Args:
            db_mngr (SpineDBManager): The manager to use
        """
        super().__init__(flags=Qt.Window)
        from ..ui.spine_db_editor_window import Ui_MainWindow  # pylint: disable=import-outside-toplevel

        self.db_mngr = db_mngr
        self.db_maps = []
        self.db_urls = []
        self._change_notifiers = []
        self._changelog = []
        self.db_url = None
        self._fetcher = None
        # Setup UI from Qt Designer file
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.takeCentralWidget()
        self.url_toolbar = UrlToolBar(self)
        self.addToolBar(Qt.TopToolBarArea, self.url_toolbar)
        self.setStyleSheet(MAINWINDOW_SS)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.qsettings = self.db_mngr.qsettings
        self.err_msg = QErrorMessage(self)
        self.err_msg.setWindowTitle("Error")
        self.err_msg.setWindowFlag(Qt.WindowContextHelpButtonHint, False)
        self.notification_stack = NotificationStack(self)
        self.silenced = False
        fm = QFontMetrics(QFont("", 0))
        self.default_row_height = 1.2 * fm.lineSpacing()
        max_screen_height = max(
            [s.availableSize().height() for s in QGuiApplication.screens()])
        self.visible_rows = int(max_screen_height / self.default_row_height)
        self.settings_group = "spineDBEditor"
        self.undo_action = None
        self.redo_action = None
        self.ui.actionUndo.setShortcuts(QKeySequence.Undo)
        self.ui.actionRedo.setShortcuts(QKeySequence.Redo)
        self.update_commit_enabled()
        self.setContextMenuPolicy(Qt.NoContextMenu)
    def closeEvent(self, event=None):
        """Handle close window.

        Args:
            event (QEvent): Closing event if 'X' is clicked.
        """
        qsettings = self._qsettings
        qsettings.beginGroup(self.settings_group)
        for splitter in self.findChildren(QSplitter):
            qsettings.setValue(splitter.objectName() + "_splitterState",
                               splitter.saveState())
        qsettings.setValue("windowSize", self.size())
        qsettings.setValue("windowPosition", self.pos())
        qsettings.setValue("windowState", self.saveState(version=1))
        qsettings.setValue("windowMaximized",
                           self.windowState() == Qt.WindowMaximized)
        qsettings.setValue("n_screens", len(QGuiApplication.screens()))
        qsettings.endGroup()
        if event:
            event.accept()
示例#16
0
    def __init__(self):
        super().__init__(flags=Qt.Widget
                         | Qt.FramelessWindowHint
                         | Qt.BypassWindowManagerHint
                         | Qt.WindowTransparentForInput
                         | Qt.WindowStaysOnTopHint)
        self.logger = logging.getLogger(__name__ + "." +
                                        self.__class__.__name__)
        self.setAttribute(Qt.WA_NoSystemBackground, True)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setAttribute(Qt.WA_DeleteOnClose, True)
        self.setStyleSheet("background: transparent")
        self._instances = {}

        virtual_screen = QRect(0, 0, 0, 0)

        for screen in QGuiApplication.screens():
            # TODO: Handle screen change
            geom = screen.virtualGeometry()
            virtual_screen = virtual_screen.united(geom)

        self.scene = QGraphicsScene(0,
                                    0,
                                    virtual_screen.width(),
                                    virtual_screen.height(),
                                    parent=self)

        self.view = QGraphicsView(self.scene, self)
        self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.view.setStyleSheet("background: transparent")
        self.view.setGeometry(0, 0, virtual_screen.width(),
                              virtual_screen.height())
        self.view.setInteractive(False)

        self.transparent_pen = QPen()
        self.transparent_pen.setBrush(Qt.NoBrush)

        self.setGeometry(virtual_screen)
 def restore_ui(self):
     """Restore UI state from previous session."""
     window_size = self.qsettings.value("{0}/windowSize".format(
         self.settings_key))
     window_pos = self.qsettings.value("{0}/windowPosition".format(
         self.settings_key))
     window_maximized = self.qsettings.value("{0}/windowMaximized".format(
         self.settings_key),
                                             defaultValue='false')
     n_screens = self.qsettings.value("{0}/n_screens".format(
         self.settings_key),
                                      defaultValue=1)
     if window_size:
         self.resize(window_size)
     if window_pos:
         self.move(window_pos)
     if window_maximized == 'true':
         self.setWindowState(Qt.WindowMaximized)
     # noinspection PyArgumentList
     if len(QGuiApplication.screens()) < int(n_screens):
         # There are less screens available now than on previous application startup
         self.move(0,
                   0)  # Move this widget to primary screen position (0,0)
     #restore splitters
     splitters = [self.ui.splitter_3, self.ui.splitter_2, self.ui.splitter]
     splitter_keys = [
         "/splitterSelectTable", "/splitterTableFilter",
         "/splitterPivotFrozen"
     ]
     splitter_states = [
         self.qsettings.value(s)
         for s in (self.settings_key + p for p in splitter_keys)
     ]
     for state, splitter in zip(splitter_states, splitters):
         if state:
             splitter.restoreState(state)
示例#18
0
    def __init__(self):
        self.screens = QGuiApplication.screens()
        self.primary = QGuiApplication.primaryScreen()

        if self.primary in self.screens:
            self.screens.remove(self.primary)
示例#19
0
import sys
import time

from PySide2.QtCore import Qt
from PySide2.QtGui import QPixmap, QGuiApplication
from PySide2.QtWidgets import QApplication, QLabel
from pyqt_screenshot.screenshot import Screenshot, constant

if __name__ == "__main__":
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    qtApp = QApplication(sys.argv)

    # main_window = QLabel()
    # img = Screenshot.take_screenshot(constant.CLIPBOARD)
    pos = Screenshot.take_screenshot_pos(constant.CLIPBOARD)
    print(pos)
    for i in range(10):
        screen = QGuiApplication.screens()[0]
        screenPixel = screen.grabWindow(0)
        img = screenPixel.copy(pos)
        print(img)
        img.save('e:/abc_%03d.jpg' % i)
        time.sleep(10)
    # main_window.show()
    # if img is not None:
    #     main_window.setPixmap(QPixmap(img))
    qtApp.exec_()
示例#20
0
    def __init__(self, parent=None, *args, appctxt=None, **kwargs):
        """Initializes all GUI elements and a separate thread."""
        super().__init__(parent)
        self.appctxt = appctxt
        self.worker = Worker(self)
        self.workerThread = QThread()
        self.worker.moveToThread(self.workerThread)
        self.workerThread.finished.connect(self.worker.deleteLater)
        self.worker.started.connect(self.startProgress)
        self.worker.ended.connect(self.endProgress)
        self.worker.translationsReady.connect(self.showTranslations)
        self.workerThread.start()

        screenGeometry = QGuiApplication.screens()[0].geometry()
        self.setGeometry(screenGeometry.width() / 5,
                         screenGeometry.height() / 5,
                         screenGeometry.width() / 3,
                         screenGeometry.height() / 3)
        self.setMinimumSize(screenGeometry.width() / 4,
                            screenGeometry.height() / 4)

        self.fileMenu = self.menuBar().addMenu(self.tr("&File"))
        self.exitAct = self.fileMenu.addAction(self.tr("&Exit"))
        self.exitAct.setStatusTip(self.tr("Exit from FreeLingvo"))
        self.exitAct.triggered.connect(self.close)

        self.helpMenu = self.menuBar().addMenu(self.tr("&Help"))
        self.aboutAct = self.helpMenu.addAction(self.tr("&About"))
        self.aboutAct.setStatusTip(
            self.tr("Show information about FreeLingvo"))
        self.aboutAct.triggered.connect(self.about)

        self.searchText = QLineEdit()
        self.searchText.setPlaceholderText(
            self.tr("What word(s) to look for?"))
        self.searchText.setClearButtonEnabled(True)
        self.searchText.returnPressed.connect(self.worker.findTranslations)

        self.translateButton = QPushButton(self.tr("Translate"))
        self.translateButton.clicked.connect(self.worker.findTranslations)

        self.dictsCombo = QComboBox()
        self.dictsCombo.setInsertPolicy(QComboBox.InsertAlphabetically)
        self.dictsCombo.setToolTip(
            self.tr("Dictionary used to search for words"))
        dictNames = os.listdir(self.appctxt.get_resource("dictionaries"))
        dictNames = [name.replace(".tei", "") for name in dictNames]
        self.dictsCombo.addItems(dictNames)
        self.dictsCombo.currentIndexChanged[str].connect(self.worker.loadDict)
        self.dictsCombo.setCurrentIndex(1)

        self.translationsBrowser = QTextBrowser()
        self.translationsBrowser.setUndoRedoEnabled(True)

        self.undoButton = QPushButton(
            QIcon(self.appctxt.get_resource("images/arrow_back.png")), "")
        self.undoButton.setEnabled(False)
        self.undoButton.setToolTip(self.tr("Show previous translation"))
        self.undoButton.clicked.connect(self.translationsBrowser.undo)
        self.translationsBrowser.undoAvailable.connect(
            self.undoButton.setEnabled)

        self.redoButton = QPushButton(
            QIcon(self.appctxt.get_resource("images/arrow_forward.png")), "")
        self.redoButton.setEnabled(False)
        self.redoButton.setToolTip(self.tr("Show next translation"))
        self.redoButton.clicked.connect(self.translationsBrowser.redo)
        self.translationsBrowser.redoAvailable.connect(
            self.redoButton.setEnabled)

        self.sizeLabel = QLabel(self.tr("Font size:"))
        self.sizeCombo = QComboBox()
        for size in QFontDatabase.standardSizes():
            self.sizeCombo.addItem(str(size))
        self.sizeCombo.setCurrentText(str(self.font().pointSize()))
        self.sizeCombo.currentIndexChanged[str].connect(self.changeFontSize)

        self.controlsLayout = QHBoxLayout()
        self.controlsLayout.addWidget(self.searchText)
        self.controlsLayout.addWidget(self.translateButton)
        self.controlsLayout.addWidget(self.dictsCombo)

        self.browserToolsLayout = QHBoxLayout()
        self.browserToolsLayout.addWidget(self.undoButton)
        self.browserToolsLayout.addWidget(self.redoButton)
        self.browserToolsLayout.addStretch(1)
        self.browserToolsLayout.addWidget(self.sizeLabel)
        self.browserToolsLayout.addWidget(self.sizeCombo)

        self.centralLayout = QVBoxLayout()
        self.centralLayout.addLayout(self.controlsLayout)
        self.centralLayout.addLayout(self.browserToolsLayout)
        self.centralLayout.addWidget(self.translationsBrowser)

        centralWidget = QWidget()
        centralWidget.setLayout(self.centralLayout)
        self.setCentralWidget(centralWidget)

        self.statusBar().showMessage(self.tr("Ready"), 2000)