Exemplo n.º 1
0
    def createEditor(self, parent, option, index):
        """
        Create the editor

        @param parent: 
        @type parent:

        @param option: 
        @type option:

        @param index: 
        @type index:

        @return:
        @rtype:
        """
        # get running probe from context
        self.items_ = ServerProbes.instance().getRunningProbes()
        self.items_ = sorted(self.items_)  # sort agents list, new in v12.2

        # load probs in combobox
        value = self.getValue(index)
        if index.column() == self.col_:
            editor = QComboBox(parent)
            editor.activated.connect(self.onItemActivated)
            editor.addItem(value)
            editor.insertSeparator(1)
            editor.addItems(self.items_)
            return editor

        return QItemDelegate.createEditor(self, parent, option, index)
Exemplo n.º 2
0
    def createEditor(self, parent, option, index):
        """
        Create the editor

        @param parent: 
        @type parent:

        @param option: 
        @type option:

        @param index: 
        @type index:

        @return:
        @rtype:
        """
        value = self.getValue(index)
        if index.column() == COL_VALUE:
            editor = QComboBox(parent)
            editor.activated.connect(self.onItemActivated)
            editor.addItem(value)
            editor.insertSeparator(1)

            # get running agents from context
            runningAgents = ServerAgents.instance().getRunningAgents()
            runningAgents = sorted(
                runningAgents)  # sort agents list, new in v12.2

            for i in xrange(len(runningAgents)):
                if len(runningAgents[i]) == 0:
                    editor.insertSeparator(i + 2)
                else:
                    editor.addItem(runningAgents[i])
            editor.insertSeparator(len(runningAgents) + 2)

            # add alias
            params = []
            for pr in self.parent.model.getData():
                params.append(pr['name'])
            editor.addItems(params)

            return editor
        return QItemDelegate.createEditor(self, parent, option, index)
Exemplo n.º 3
0
class OWFile(OWWidget):
    settingsList = ["selected_file", "recent_files", "show_advanced",
                    "create_new_on"]

    contextHandlers = {"": FileNameContextHandler()}

    def __init__(self, parent=None, signalManager=None,
                 title="CSV File Import"):
        OWWidget.__init__(self, parent, signalManager, title,
                          wantMainArea=False, noReport=True)

        self.symbol_DC = ""
        self.symbol_DK = ""

        #: List of recent opened files.
        self.recent_files = []
        #: Current selected file name
        self.selected_file = None
        #: Variable reuse flag
        self.create_new_on = 2
        #: Display advanced var reuse options
        self.show_advanced = False

        self.loadSettings()

        self.recent_files = filter(os.path.exists, self.recent_files)

        self._loader = None
        self._invalidated = False
        self._datareport = None

        layout = QHBoxLayout()
        OWGUI.widgetBox(self.controlArea, "File", orientation=layout)

        icons = standard_icons(self)

        self.recent_combo = QComboBox(
            self, objectName="recent_combo",
            toolTip="Recent files.",
            activated=self.activate_recent
        )
        cb_append_file_list(self.recent_combo, self.recent_files)

        self.recent_combo.insertSeparator(self.recent_combo.count())
        self.recent_combo.addItem(u"Browse documentation data sets…")

        self.browse_button = QPushButton(
            u"…",
            icon=icons.dir_open_icon, toolTip="Browse filesystem",
            clicked=self.browse
        )

        self.reload_button = QPushButton(
            "Reload", icon=icons.reload_icon,
            toolTip="Reload the selected file", clicked=self.reload,
            default=True
        )

        layout.addWidget(self.recent_combo, 2)
        layout.addWidget(self.browse_button)
        layout.addWidget(self.reload_button)

        ###########
        # Info text
        ###########
        box = OWGUI.widgetBox(self.controlArea, "Info", addSpace=True)
        self.infoa = OWGUI.widgetLabel(box, "No data loaded.")
        self.infob = OWGUI.widgetLabel(box, " ")
        self.warnings = OWGUI.widgetLabel(box, " ")

        # Set word wrap so long warnings won't expand the widget
        self.warnings.setWordWrap(True)
        self.warnings.setSizePolicy(QSizePolicy.Ignored,
                                    QSizePolicy.MinimumExpanding)

        advanced = QGroupBox(
            "Advanced Settings", checkable=True, checked=self.show_advanced
        )
        advanced.setLayout(QVBoxLayout())

        def set_group_visible(groupbox, state):
            layout = groupbox.layout()
            for i in range(layout.count()):
                item = layout.itemAt(i)
                widget = item.widget()
                if widget is not None:
                    widget.setVisible(state)
            groupbox.setFlat(not state)

        def toogle_advanced(state):
            self.show_advanced = state
            set_group_visible(advanced, state)
            self.layout().activate()
            QApplication.instance().processEvents()
            QTimer.singleShot(0, self.adjustSize)

        advanced.toggled.connect(toogle_advanced)

        self.taboptions = QWidget()
        self.taboptions.setLayout(QVBoxLayout())
        box = QGroupBox("Missing Value Symbols", flat=True)
        form = QFormLayout(fieldGrowthPolicy=QFormLayout.AllNonFixedFieldsGrow)
        form.addRow(
            "Don't care:",
            OWGUI.lineEdit(None, self, "symbol_DC",
                           tooltip="Default values: '~' or '*'"))
        form.addRow(
            "Don't know:",
            OWGUI.lineEdit(None, self, "symbol_DK",
                           tooltip="Default values: empty fields (space), "
                                   "'?' or 'NA'"))
        box.setLayout(form)
        advanced.layout().addWidget(box)

        rb = OWGUI.radioButtonsInBox(
            advanced, self, "create_new_on",
            box="New Attributes",
            callback=self._invalidate,
            label=u"Create a new attribute when existing attribute(s) …",
            btnLabels=[u"Have mismatching order of values",
                       u"Have no common values with the new (recommended)",
                       u"Miss some values of the new attribute",
                       u"… Always create a new attribute"]
        )
        rb.setFlat(True)
        self.controlArea.layout().addWidget(advanced)

        button_box = QDialogButtonBox(orientation=Qt.Horizontal)
        self.import_options_button = QPushButton(
            u"Import Options…", enabled=False
        )
        self.import_options_button.pressed.connect(self._activate_import_dialog)
        button_box.addButton(
            self.import_options_button, QDialogButtonBox.ActionRole
        )
        button_box.addButton(
            QPushButton("&Report", pressed=self.reportAndFinish),
            QDialogButtonBox.ActionRole
        )
        self.controlArea.layout().addWidget(button_box)

        OWGUI.rubber(self.controlArea)

        set_group_visible(advanced, self.show_advanced)

        if self.recent_files and self.recent_files[0] == self.selected_file:
            QTimer.singleShot(
                0, lambda: self.activate_recent(0)
            )
        else:
            self.selected_file = None
            self.recent_combo.setCurrentIndex(-1)

    @Slot(int)
    def activate_recent(self, index):
        """Activate an item from the recent list."""
        if 0 <= index < len(self.recent_files):
            recent = self.recent_files[index]
            self.set_selected_file(recent)
        elif index == len(self.recent_files) + 1:
            status = self.browse(Orange.utils.environ.dataset_install_dir)
            if status == QDialog.Rejected:
                self.recent_combo.setCurrentIndex(
                    min(0, len(self.recent_files) - 1)
                )
        else:
            self.recent_combo.setCurrentIndex(-1)

    @Slot()
    def browse(self, startdir=None):
        """
        Open a file dialog and select a user specified file.
        """
        if startdir is None:
            if self.selected_file:
                startdir = os.path.dirname(self.selected_file)
            else:
                startdir = unicode(
                    QDesktopServices.storageLocation(
                        QDesktopServices.DocumentsLocation)
                )

        def format_spec(format):
            ext_pattern = ", ".join(map("*{}".format, format.extensions))
            return "{} ({})".format(format.name, ext_pattern)

        formats = [format_spec(format) for format in FILEFORMATS]
        filters = ";;".join(formats + ["All files (*.*)"])

        path, selected_filter = QFileDialog.getOpenFileNameAndFilter(
            self, "Open Data File", startdir, filters
        )
        if path:
            path = unicode(path)
            if selected_filter in formats:
                filter_idx = formats.index(str(selected_filter))
                fformat = FILEFORMATS[filter_idx]
                loader = DEFAULT_ACTIONS[filter_idx]
                if fformat.extensions in ([".csv"], [".tsv"]):
                    loader = loader._replace(
                        params=loader_for_path(path).params)
            else:
                loader = None
            self.set_selected_file(path, loader=loader)
            return QDialog.Accepted
        else:
            return QDialog.Rejected

    @Slot()
    def reload(self):
        """Reload the current selected file."""
        if self.selected_file:
            self.send_data()

    def _activate_import_dialog(self):
        assert self.selected_file is not None
        dlg = CSVImportDialog(
            self, windowTitle="Import Options",
        )
        dlg.setAttribute(Qt.WA_DeleteOnClose)
        dlg.setWindowFlags(Qt.Sheet)
        loader = self._loader

        dlg.set_options(loader.params)
        dlg.set_path(self.selected_file)

        def update():
            self._loader = loader._replace(params=dlg.options())
            self._invalidate()

        dlg.accepted.connect(update)
        dlg.open()

    def set_selected_file(self, filename, loader=None):
        """Set the current filename path to be loaded."""
        self.closeContext("")

        self.selected_file = filename
        self._loader = None
        self._add_recent(filename)
        self.warning(1)

        self.openContext("", filename)

        if loader is not None and self._loader is not None and \
                self._loader.format == loader.format:
            loader = self._loader

        if loader is None:
            loader = self._loader

        if loader is None:
            loader = loader_for_path(filename)

        self.set_loader(loader)

    def _add_recent(self, filename):
        """Add filename to the list of recent files."""
        index_to_remove = None
        if filename in self.recent_files:
            index_to_remove = self.recent_files.index(filename)
        elif len(self.recent_files) >= 20:
            # keep maximum of 20 files in the list.
            index_to_remove = len(self.recent_files) - 1

        cb_insert_file_list(self.recent_combo, 0, [filename])
        self.recent_files.insert(0, filename)

        if index_to_remove is not None:
            self.recent_combo.removeItem(index_to_remove + 1)
            self.recent_files.pop(index_to_remove + 1)

        self.recent_combo.setCurrentIndex(0)

    def set_loader(self, loader):
        if loader is None:
            loader = DEFAULT_ACTIONS[0]

        self._loader = loader
        self.import_options_button.setEnabled(
            isinstance(loader.params, CSV)
        )

        self._invalidate()

    def _invalidate(self):
        if not self._invalidated:
            self._invalidated = True
            QApplication.postEvent(self, QEvent(QEvent.User))

    def customEvent(self, event):
        if self._invalidated:
            self._invalidated = False
            self.send_data()

    def send_data(self):
        self.error(0)
        loader = self._loader
        if "DK" in loader.params._fields and self.symbol_DK:
            loader = loader._replace(
                params=loader.params._replace(
                    DK=str(self.symbol_DK),
                    DC=str(self.symbol_DC))
            )
        try:
            data = load_table(self.selected_file, loader,
                              create_new_on=3 - self.create_new_on)
        except Exception as err:
            self.error(str(err))
            self.infoa.setText('Data was not loaded due to an error.')
            self.infob.setText('Error:')
            self.warnings.setText(str(err))
            data = None
        else:
            self._update_status_messages(data)

        if data is not None:
            add_origin(data, self.selected_file)
            basename = os.path.basename(self.selected_file)
            data.name, _ = os.path.splitext(basename)
            self._datareport = self.prepareDataReport(data)
        else:
            self._datareport = None

        self.send("Data", data)

    def _update_status_messages(self, data):
        if data is None:
            self.infoa.setText("No data loaded.")
            self.infob.setText("")
            self.warnings.setText("")
            return

        def pluralize(seq):
            return "s" if len(seq) != 1 else ""

        summary = ("{n_instances} data instance{plural_1}, "
                   "{n_features} feature{plural_2}, "
                   "{n_meta} meta{plural_3}").format(
                        n_instances=len(data), plural_1=pluralize(data),
                        n_features=len(data.domain.attributes),
                        plural_2=pluralize(data.domain.attributes),
                        n_meta=len(data.domain.getmetas()),
                        plural_3=pluralize(data.domain.getmetas()))
        self.infoa.setText(summary)

        cl = data.domain.class_var
        if cl is not None:
            if isinstance(cl, Orange.feature.Continuous):
                self.infob.setText('Regression; Numerical class.')
            elif isinstance(cl, Orange.feature.Discrete):
                self.infob.setText(
                    'Classification; Discrete class with %d value%s.' %
                    (len(cl.values), 's' if len(cl.values) > 1 else '')
                )
            else:
                self.infob.setText("Class is neither discrete nor continuous.")
        elif data.domain.class_vars:
            self.infob.setText("Multiple class variables")
        else:
            self.infob.setText("Data has no dependent variable.")

        self.warnings.setText(
            feature_load_status_report(data, self.create_new_on))

    def sendReport(self):
        if self._datareport:
            formatname = self._loader.format
            self.reportSettings(
                "File", [("File name", self.selected_file),
                         ("Format", formatname)])
            self.reportData(self._datareport)

    def settingsFromWidgetCallback(self, handler, context):
        context.filename = self.selected_file or ""
        context.loader = self._loader
        context.symbolDC, context.symbolDK = self.symbol_DC, self.symbol_DK

    def settingsToWidgetCallback(self, handler, context):
        self.symbol_DC, self.symbol_DK = context.symbolDC, context.symbolDK
        self._loader = getattr(context, "loader", None)

    def setSettings(self, settings):
        if settings.get(_SETTINGS_VERSION_KEY, None) is None:
            # import old File widget's settings
            mapping = [
                ("recentFiles", "recent_files"),
                ("createNewOn", "create_new_on"),
                ("showAdvanced", "show_advanced")
            ]

            if all(old in settings for old, _ in mapping) and \
                    not any(new in settings for _, new in mapping):
                settings = settings.copy()
                for old, new in mapping:
                    settings[new] = settings[old]
                    del settings[old]

#                 settings[_SETTINGS_VERSION_KEY] = self.settingsDataVersion
                if len(settings["recent_files"]):
                    settings["selected_file"] = settings["recent_files"][0]

        super(OWFile, self).setSettings(settings)
Exemplo n.º 4
0
class CSVOptionsWidget(QWidget):
    _PresetDelimiters = [
        ("Comma", ","),
        ("Tab", "\t"),
        ("Semicolon", ";"),
        ("Space", " "),
    ]

    format_changed = Signal()

    def __init__(self, parent=None, **kwargs):
        self._delimiter_idx = 0
        self._delimiter_custom = "|"
        self._delimiter = ","
        self._quotechar = "'"
        self._escapechar = "\\"
        self._doublequote = True
        self._skipinitialspace = False

        super(QWidget, self).__init__(parent, **kwargs)

        # Dialect options
        form = QFormLayout()
        self.delimiter_cb = QComboBox()
        self.delimiter_cb.addItems(
            [name for name, _ in self._PresetDelimiters]
        )
        self.delimiter_cb.insertSeparator(self.delimiter_cb.count())
        self.delimiter_cb.addItem("Other")

        self.delimiter_cb.setCurrentIndex(self._delimiter_idx)
        self.delimiter_cb.activated.connect(self._on_delimiter_idx_changed)

        validator = QRegExpValidator(QRegExp("."))
        self.delimiteredit = LineEdit(
            self._delimiter_custom,
            enabled=False,
            minimumContentsLength=2
        )
        self.delimiteredit.setValidator(validator)
        self.delimiteredit.editingFinished.connect(self._on_delimiter_changed)

        delimlayout = QHBoxLayout()
        delimlayout.setContentsMargins(0, 0, 0, 0)
        delimlayout.addWidget(self.delimiter_cb)
        delimlayout.addWidget(self.delimiteredit)

        self.quoteedit = LineEdit(self._quotechar, minimumContentsLength=2)
        self.quoteedit.setValidator(validator)
        self.quoteedit.editingFinished.connect(self._on_quotechar_changed)

        self.escapeedit = LineEdit(self._escapechar, minimumContentsLength=2)
        self.escapeedit.setValidator(validator)
        self.escapeedit.editingFinished.connect(self._on_escapechar_changed)

#         self.skipinitialspace_cb = QCheckBox(
#             checked=self._skipinitialspace
#         )

        form.addRow("Cell delimiter", delimlayout)
        form.addRow("Quote character", self.quoteedit)
        form.addRow("Escape character", self.escapeedit)

        form.addRow(QFrame(self, frameShape=QFrame.HLine))

        # File format option
        self.missingedit = QLineEdit()
        self.missingedit.editingFinished.connect(self.format_changed)

        form.addRow("Missing values", self.missingedit)

        self.header_format_cb = QComboBox()
        self.header_format_cb.addItems(
            ["No header", "Plain header", "Orange header",
             "Orange simplified header"]
        )
        self.header_format_cb.currentIndexChanged.connect(self.format_changed)
        form.addRow("Header", self.header_format_cb)

        self.setLayout(form)
        self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)

    def dialect(self):
        """
        Return the current state as a Dialect instance.
        """
        if self._delimiter_idx >= len(self._PresetDelimiters):
            delimiter = self._delimiter_custom
        else:
            _, delimiter = self._PresetDelimiters[self._delimiter_idx]

        quotechar = str(self.quoteedit.text()) or ""
        escapechar = str(self.escapeedit.text()) or None
        skipinitialspace = True
        return Dialect(delimiter, quotechar, escapechar,
                       doublequote=True, skipinitialspace=skipinitialspace)

    def set_dialect(self, dialect):
        """
        Set the current state to match dialect instance.
        """
        delimiter = dialect.delimiter
        try:
            index = [d for _, d in self._PresetDelimiters].index(delimiter)
        except ValueError:
            index = len(self._PresetDelimiters) + 1
        self._delimiter_idx = index
        self._delimiter_custom = delimiter
        self._quotechar = dialect.quotechar
        self._escapechar = dialect.escapechar
        self._skipinitialspace = dialect.skipinitialspace

        self.delimiter_cb.setCurrentIndex(index)
        self.delimiteredit.setText(delimiter)
        self.quoteedit.setText(dialect.quotechar or '"')
        self.escapeedit.setText(dialect.escapechar or "")
#         self.skipinitialspace_cb.setChecked(dialect.skipinitialspace)

    def set_header_format(self, header_format):
        """Set the current selected header format."""
        self._header_format = header_format
        self.header_format_cb.setCurrentIndex(header_format)

    def header_format(self):
        return self.header_format_cb.currentIndex()

    def set_missing_values(self, missing):
        self.missingedit.setText(missing)

    def missing_values(self):
        return str(self.missingedit.text())

    def _on_delimiter_idx_changed(self, index):
        if index < len(self._PresetDelimiters):
            self.delimiteredit.setText(self._PresetDelimiters[index][1])
        else:
            self.delimiteredit.setText(self._delimiter_custom)

        self.delimiteredit.setEnabled(index >= len(self._PresetDelimiters))
        self._delimiter_idx = index

        self.format_changed.emit()

    def _on_delimiter_changed(self):
        self._delimiter_custom = str(self.delimiteredit.text())
        self.format_changed.emit()

    def _on_quotechar_changed(self):
        self._quotechar = str(self.quoteedit.text())
        self.format_changed.emit()

    def _on_escapechar_changed(self):
        self._escapechar = str(self.escapeedit.text())
        self.format_changed.emit()

    def _on_skipspace_changed(self, skipinitialspace):
        self._skipinitialspace = skipinitialspace
        self.format_changed.emit()
Exemplo n.º 5
0
class OWFile(OWWidget):
    settingsList = [
        "selected_file", "recent_files", "show_advanced", "create_new_on"
    ]

    contextHandlers = {"": FileNameContextHandler()}

    def __init__(self,
                 parent=None,
                 signalManager=None,
                 title="CSV File Import"):
        OWWidget.__init__(self,
                          parent,
                          signalManager,
                          title,
                          wantMainArea=False,
                          noReport=True)

        self.symbol_DC = ""
        self.symbol_DK = ""

        #: List of recent opened files.
        self.recent_files = []
        #: Current selected file name
        self.selected_file = None
        #: Variable reuse flag
        self.create_new_on = 2
        #: Display advanced var reuse options
        self.show_advanced = False

        self.loadSettings()

        self.recent_files = filter(os.path.exists, self.recent_files)

        self._loader = None
        self._invalidated = False
        self._datareport = None

        layout = QHBoxLayout()
        OWGUI.widgetBox(self.controlArea, "File", orientation=layout)

        icons = standard_icons(self)

        self.recent_combo = QComboBox(self,
                                      objectName="recent_combo",
                                      toolTip="Recent files.",
                                      activated=self.activate_recent)
        cb_append_file_list(self.recent_combo, self.recent_files)

        self.recent_combo.insertSeparator(self.recent_combo.count())
        self.recent_combo.addItem(u"Browse documentation data sets…")

        self.browse_button = QPushButton(u"…",
                                         icon=icons.dir_open_icon,
                                         toolTip="Browse filesystem",
                                         clicked=self.browse)

        self.reload_button = QPushButton("Reload",
                                         icon=icons.reload_icon,
                                         toolTip="Reload the selected file",
                                         clicked=self.reload,
                                         default=True)

        layout.addWidget(self.recent_combo, 2)
        layout.addWidget(self.browse_button)
        layout.addWidget(self.reload_button)

        ###########
        # Info text
        ###########
        box = OWGUI.widgetBox(self.controlArea, "Info", addSpace=True)
        self.infoa = OWGUI.widgetLabel(box, "No data loaded.")
        self.infob = OWGUI.widgetLabel(box, " ")
        self.warnings = OWGUI.widgetLabel(box, " ")

        # Set word wrap so long warnings won't expand the widget
        self.warnings.setWordWrap(True)
        self.warnings.setSizePolicy(QSizePolicy.Ignored,
                                    QSizePolicy.MinimumExpanding)

        advanced = QGroupBox("Advanced Settings",
                             checkable=True,
                             checked=self.show_advanced)
        advanced.setLayout(QVBoxLayout())

        def set_group_visible(groupbox, state):
            layout = groupbox.layout()
            for i in range(layout.count()):
                item = layout.itemAt(i)
                widget = item.widget()
                if widget is not None:
                    widget.setVisible(state)
            groupbox.setFlat(not state)

        def toogle_advanced(state):
            self.show_advanced = state
            set_group_visible(advanced, state)
            self.layout().activate()
            QApplication.instance().processEvents()
            QTimer.singleShot(0, self.adjustSize)

        advanced.toggled.connect(toogle_advanced)

        self.taboptions = QWidget()
        self.taboptions.setLayout(QVBoxLayout())
        box = QGroupBox("Missing Value Symbols", flat=True)
        form = QFormLayout(fieldGrowthPolicy=QFormLayout.AllNonFixedFieldsGrow)
        form.addRow(
            "Don't care:",
            OWGUI.lineEdit(None,
                           self,
                           "symbol_DC",
                           tooltip="Default values: '~' or '*'"))
        form.addRow(
            "Don't know:",
            OWGUI.lineEdit(None,
                           self,
                           "symbol_DK",
                           tooltip="Default values: empty fields (space), "
                           "'?' or 'NA'"))
        box.setLayout(form)
        advanced.layout().addWidget(box)

        rb = OWGUI.radioButtonsInBox(
            advanced,
            self,
            "create_new_on",
            box="New Attributes",
            callback=self._invalidate,
            label=u"Create a new attribute when existing attribute(s) …",
            btnLabels=[
                u"Have mismatching order of values",
                u"Have no common values with the new (recommended)",
                u"Miss some values of the new attribute",
                u"… Always create a new attribute"
            ])
        rb.setFlat(True)
        self.controlArea.layout().addWidget(advanced)

        button_box = QDialogButtonBox(orientation=Qt.Horizontal)
        self.import_options_button = QPushButton(u"Import Options…",
                                                 enabled=False)
        self.import_options_button.pressed.connect(
            self._activate_import_dialog)
        button_box.addButton(self.import_options_button,
                             QDialogButtonBox.ActionRole)
        button_box.addButton(
            QPushButton("&Report", pressed=self.reportAndFinish),
            QDialogButtonBox.ActionRole)
        self.controlArea.layout().addWidget(button_box)

        OWGUI.rubber(self.controlArea)

        set_group_visible(advanced, self.show_advanced)

        if self.recent_files and self.recent_files[0] == self.selected_file:
            QTimer.singleShot(0, lambda: self.activate_recent(0))
        else:
            self.selected_file = None
            self.recent_combo.setCurrentIndex(-1)

    @Slot(int)
    def activate_recent(self, index):
        """Activate an item from the recent list."""
        if 0 <= index < len(self.recent_files):
            recent = self.recent_files[index]
            self.set_selected_file(recent)
        elif index == len(self.recent_files) + 1:
            status = self.browse(Orange.utils.environ.dataset_install_dir)
            if status == QDialog.Rejected:
                self.recent_combo.setCurrentIndex(
                    min(0,
                        len(self.recent_files) - 1))
        else:
            self.recent_combo.setCurrentIndex(-1)

    @Slot()
    def browse(self, startdir=None):
        """
        Open a file dialog and select a user specified file.
        """
        if startdir is None:
            if self.selected_file:
                startdir = os.path.dirname(self.selected_file)
            else:
                startdir = unicode(
                    QDesktopServices.storageLocation(
                        QDesktopServices.DocumentsLocation))

        def format_spec(format):
            ext_pattern = ", ".join(map("*{}".format, format.extensions))
            return "{} ({})".format(format.name, ext_pattern)

        formats = [format_spec(format) for format in FILEFORMATS]
        filters = ";;".join(formats + ["All files (*.*)"])

        path, selected_filter = QFileDialog.getOpenFileNameAndFilter(
            self, "Open Data File", startdir, filters)
        if path:
            path = unicode(path)
            if selected_filter in formats:
                filter_idx = formats.index(str(selected_filter))
                fformat = FILEFORMATS[filter_idx]
                loader = DEFAULT_ACTIONS[filter_idx]
                if fformat.extensions in ([".csv"], [".tsv"]):
                    loader = loader._replace(
                        params=loader_for_path(path).params)
            else:
                loader = None
            self.set_selected_file(path, loader=loader)
            return QDialog.Accepted
        else:
            return QDialog.Rejected

    @Slot()
    def reload(self):
        """Reload the current selected file."""
        if self.selected_file:
            self.send_data()

    def _activate_import_dialog(self):
        assert self.selected_file is not None
        dlg = CSVImportDialog(
            self,
            windowTitle="Import Options",
        )
        dlg.setAttribute(Qt.WA_DeleteOnClose)
        dlg.setWindowFlags(Qt.Sheet)
        loader = self._loader

        dlg.set_options(loader.params)
        dlg.set_path(self.selected_file)

        def update():
            self._loader = loader._replace(params=dlg.options())
            self._invalidate()

        dlg.accepted.connect(update)
        dlg.open()

    def set_selected_file(self, filename, loader=None):
        """Set the current filename path to be loaded."""
        self.closeContext("")

        self.selected_file = filename
        self._loader = None
        self._add_recent(filename)
        self.warning(1)

        self.openContext("", filename)

        if loader is not None and self._loader is not None and \
                self._loader.format == loader.format:
            loader = self._loader

        if loader is None:
            loader = self._loader

        if loader is None:
            loader = loader_for_path(filename)

        self.set_loader(loader)

    def _add_recent(self, filename):
        """Add filename to the list of recent files."""
        index_to_remove = None
        if filename in self.recent_files:
            index_to_remove = self.recent_files.index(filename)
        elif len(self.recent_files) >= 20:
            # keep maximum of 20 files in the list.
            index_to_remove = len(self.recent_files) - 1

        cb_insert_file_list(self.recent_combo, 0, [filename])
        self.recent_files.insert(0, filename)

        if index_to_remove is not None:
            self.recent_combo.removeItem(index_to_remove + 1)
            self.recent_files.pop(index_to_remove + 1)

        self.recent_combo.setCurrentIndex(0)

    def set_loader(self, loader):
        if loader is None:
            loader = DEFAULT_ACTIONS[0]

        self._loader = loader
        self.import_options_button.setEnabled(isinstance(loader.params, CSV))

        self._invalidate()

    def _invalidate(self):
        if not self._invalidated:
            self._invalidated = True
            QApplication.postEvent(self, QEvent(QEvent.User))

    def customEvent(self, event):
        if self._invalidated:
            self._invalidated = False
            self.send_data()

    def send_data(self):
        self.error(0)
        loader = self._loader
        if "DK" in loader.params._fields and self.symbol_DK:
            loader = loader._replace(params=loader.params._replace(
                DK=str(self.symbol_DK), DC=str(self.symbol_DC)))
        try:
            data = load_table(self.selected_file,
                              loader,
                              create_new_on=3 - self.create_new_on)
        except Exception as err:
            self.error(str(err))
            self.infoa.setText('Data was not loaded due to an error.')
            self.infob.setText('Error:')
            self.warnings.setText(str(err))
            data = None
        else:
            self._update_status_messages(data)

        if data is not None:
            add_origin(data, self.selected_file)
            basename = os.path.basename(self.selected_file)
            data.name, _ = os.path.splitext(basename)
            self._datareport = self.prepareDataReport(data)
        else:
            self._datareport = None

        self.send("Data", data)

    def _update_status_messages(self, data):
        if data is None:
            self.infoa.setText("No data loaded.")
            self.infob.setText("")
            self.warnings.setText("")
            return

        def pluralize(seq):
            return "s" if len(seq) != 1 else ""

        summary = ("{n_instances} data instance{plural_1}, "
                   "{n_features} feature{plural_2}, "
                   "{n_meta} meta{plural_3}").format(
                       n_instances=len(data),
                       plural_1=pluralize(data),
                       n_features=len(data.domain.attributes),
                       plural_2=pluralize(data.domain.attributes),
                       n_meta=len(data.domain.getmetas()),
                       plural_3=pluralize(data.domain.getmetas()))
        self.infoa.setText(summary)

        cl = data.domain.class_var
        if cl is not None:
            if isinstance(cl, Orange.feature.Continuous):
                self.infob.setText('Regression; Numerical class.')
            elif isinstance(cl, Orange.feature.Discrete):
                self.infob.setText(
                    'Classification; Discrete class with %d value%s.' %
                    (len(cl.values), 's' if len(cl.values) > 1 else ''))
            else:
                self.infob.setText("Class is neither discrete nor continuous.")
        elif data.domain.class_vars:
            self.infob.setText("Multiple class variables")
        else:
            self.infob.setText("Data has no dependent variable.")

        self.warnings.setText(
            feature_load_status_report(data, self.create_new_on))

    def sendReport(self):
        if self._datareport:
            formatname = self._loader.format
            self.reportSettings("File", [("File name", self.selected_file),
                                         ("Format", formatname)])
            self.reportData(self._datareport)

    def settingsFromWidgetCallback(self, handler, context):
        context.filename = self.selected_file or ""
        context.loader = self._loader
        context.symbolDC, context.symbolDK = self.symbol_DC, self.symbol_DK

    def settingsToWidgetCallback(self, handler, context):
        self.symbol_DC, self.symbol_DK = context.symbolDC, context.symbolDK
        self._loader = getattr(context, "loader", None)

    def setSettings(self, settings):
        if settings.get(_SETTINGS_VERSION_KEY, None) is None:
            # import old File widget's settings
            mapping = [("recentFiles", "recent_files"),
                       ("createNewOn", "create_new_on"),
                       ("showAdvanced", "show_advanced")]

            if all(old in settings for old, _ in mapping) and \
                    not any(new in settings for _, new in mapping):
                settings = settings.copy()
                for old, new in mapping:
                    settings[new] = settings[old]
                    del settings[old]


#                 settings[_SETTINGS_VERSION_KEY] = self.settingsDataVersion
                if len(settings["recent_files"]):
                    settings["selected_file"] = settings["recent_files"][0]

        super(OWFile, self).setSettings(settings)
Exemplo n.º 6
0
class CSVOptionsWidget(QWidget):
    _PresetDelimiters = [
        ("Comma", ","),
        ("Tab", "\t"),
        ("Semicolon", ";"),
        ("Space", " "),
    ]

    format_changed = Signal()

    def __init__(self, parent=None, **kwargs):
        self._delimiter_idx = 0
        self._delimiter_custom = "|"
        self._delimiter = ","
        self._quotechar = "'"
        self._escapechar = "\\"
        self._doublequote = True
        self._skipinitialspace = False

        super(QWidget, self).__init__(parent, **kwargs)

        # Dialect options
        form = QFormLayout()
        self.delimiter_cb = QComboBox()
        self.delimiter_cb.addItems(
            [name for name, _ in self._PresetDelimiters])
        self.delimiter_cb.insertSeparator(self.delimiter_cb.count())
        self.delimiter_cb.addItem("Other")

        self.delimiter_cb.setCurrentIndex(self._delimiter_idx)
        self.delimiter_cb.activated.connect(self._on_delimiter_idx_changed)

        validator = QRegExpValidator(QRegExp("."))
        self.delimiteredit = LineEdit(self._delimiter_custom,
                                      enabled=False,
                                      minimumContentsLength=2)
        self.delimiteredit.setValidator(validator)
        self.delimiteredit.editingFinished.connect(self._on_delimiter_changed)

        delimlayout = QHBoxLayout()
        delimlayout.setContentsMargins(0, 0, 0, 0)
        delimlayout.addWidget(self.delimiter_cb)
        delimlayout.addWidget(self.delimiteredit)

        self.quoteedit = LineEdit(self._quotechar, minimumContentsLength=2)
        self.quoteedit.setValidator(validator)
        self.quoteedit.editingFinished.connect(self._on_quotechar_changed)

        self.escapeedit = LineEdit(self._escapechar, minimumContentsLength=2)
        self.escapeedit.setValidator(validator)
        self.escapeedit.editingFinished.connect(self._on_escapechar_changed)

        #         self.skipinitialspace_cb = QCheckBox(
        #             checked=self._skipinitialspace
        #         )

        form.addRow("Cell delimiter", delimlayout)
        form.addRow("Quote character", self.quoteedit)
        form.addRow("Escape character", self.escapeedit)

        form.addRow(QFrame(self, frameShape=QFrame.HLine))

        # File format option
        self.missingedit = QLineEdit()
        self.missingedit.editingFinished.connect(self.format_changed)

        form.addRow("Missing values", self.missingedit)

        self.header_format_cb = QComboBox()
        self.header_format_cb.addItems([
            "No header", "Plain header", "Orange header",
            "Orange simplified header"
        ])
        self.header_format_cb.currentIndexChanged.connect(self.format_changed)
        form.addRow("Header", self.header_format_cb)

        self.setLayout(form)
        self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)

    def dialect(self):
        """
        Return the current state as a Dialect instance.
        """
        if self._delimiter_idx >= len(self._PresetDelimiters):
            delimiter = self._delimiter_custom
        else:
            _, delimiter = self._PresetDelimiters[self._delimiter_idx]

        quotechar = str(self.quoteedit.text()) or ""
        escapechar = str(self.escapeedit.text()) or None
        skipinitialspace = True
        return Dialect(delimiter,
                       quotechar,
                       escapechar,
                       doublequote=True,
                       skipinitialspace=skipinitialspace)

    def set_dialect(self, dialect):
        """
        Set the current state to match dialect instance.
        """
        delimiter = dialect.delimiter
        try:
            index = [d for _, d in self._PresetDelimiters].index(delimiter)
        except ValueError:
            index = len(self._PresetDelimiters) + 1
        self._delimiter_idx = index
        self._delimiter_custom = delimiter
        self._quotechar = dialect.quotechar
        self._escapechar = dialect.escapechar
        self._skipinitialspace = dialect.skipinitialspace

        self.delimiter_cb.setCurrentIndex(index)
        self.delimiteredit.setText(delimiter)
        self.quoteedit.setText(dialect.quotechar or '"')
        self.escapeedit.setText(dialect.escapechar or "")


#         self.skipinitialspace_cb.setChecked(dialect.skipinitialspace)

    def set_header_format(self, header_format):
        """Set the current selected header format."""
        self._header_format = header_format
        self.header_format_cb.setCurrentIndex(header_format)

    def header_format(self):
        return self.header_format_cb.currentIndex()

    def set_missing_values(self, missing):
        self.missingedit.setText(missing)

    def missing_values(self):
        return str(self.missingedit.text())

    def _on_delimiter_idx_changed(self, index):
        if index < len(self._PresetDelimiters):
            self.delimiteredit.setText(self._PresetDelimiters[index][1])
        else:
            self.delimiteredit.setText(self._delimiter_custom)

        self.delimiteredit.setEnabled(index >= len(self._PresetDelimiters))
        self._delimiter_idx = index

        self.format_changed.emit()

    def _on_delimiter_changed(self):
        self._delimiter_custom = str(self.delimiteredit.text())
        self.format_changed.emit()

    def _on_quotechar_changed(self):
        self._quotechar = str(self.quoteedit.text())
        self.format_changed.emit()

    def _on_escapechar_changed(self):
        self._escapechar = str(self.escapeedit.text())
        self.format_changed.emit()

    def _on_skipspace_changed(self, skipinitialspace):
        self._skipinitialspace = skipinitialspace
        self.format_changed.emit()
Exemplo n.º 7
0
class AddAgentDialog(QtHelper.EnhancedQDialog, Logger.ClassLogger):
    """
    Add agent dialog
    """
    def __init__(self, parent, agentName='AGENT', datasetView=False):
        """
        Constructor

        @param parent: parent window
        @type parent: instance

        @param agentName: 
        @type agentName: string

        @param datasetView: 
        @type datasetView: boolean
        """
        super(AddAgentDialog, self).__init__(parent)
        self.agentName=agentName
        self.parent__ = parent
        self.datasetView__ = datasetView
        self.createDialog()
        self.createConnections()

        self.initComboType()
    def createDialog (self):
        """
        Create dialog
        """
        self.labelName = QLabel("Agent Name:") 
        self.nameEdit = QLineEdit(self.agentName)
        nameLayout = QHBoxLayout()
        nameLayout.addWidget( self.labelName )
        nameLayout.addWidget( self.nameEdit )

        self.labelDescr = QLabel("Description:") 
        self.descrEdit = QTextEdit()

        self.labelValue= QLabel("Value:") 
        self.comboValue = QComboBox()

        typeLayout = QHBoxLayout()
        typeLayout.addWidget( self.labelValue )
        typeLayout.addWidget( self.comboValue )

        self.labelType = QLabel("Type:") 
        self.typeEdit = QLineEdit()
        self.typeEdit.setEnabled(False)
        type2Layout = QHBoxLayout()
        type2Layout.addWidget( self.labelType )
        type2Layout.addWidget( self.typeEdit )

        self.buttonBox = QDialogButtonBox(self)
        self.buttonBox.setStyleSheet( """QDialogButtonBox { 
            dialogbuttonbox-buttons-have-icons: 1;
            dialog-ok-icon: url(:/ok.png);
            dialog-cancel-icon: url(:/test-close-black.png);
        }""")
        self.buttonBox.setStandardButtons(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)

        mainLayout = QVBoxLayout()
        mainLayout.addLayout(nameLayout)
        if not self.datasetView__:
            mainLayout.addLayout(typeLayout)
            mainLayout.addLayout(type2Layout)
        mainLayout.addWidget(self.labelDescr)
        mainLayout.addWidget(self.descrEdit)
        mainLayout.addWidget(self.buttonBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Test Config > Add agent")
        self.resize(350, 250)
        self.center()

    def initComboType(self):
        """
        Initialize the combobox type with running agents
        """
        TYPES_PARAM = ServerAgents.instance().getRunningAgentsComplete()
        for i in xrange(len(TYPES_PARAM)):
            if len(TYPES_PARAM[i]) == 0:
                self.comboValue.insertSeparator(i + 2)
            else:
                self.comboValue.addItem (TYPES_PARAM[i]['name'])

        #self.onAgentChanged(id=0)

    def createConnections (self):
        """
        Create qt connections
        """
        self.buttonBox.accepted.connect(self.onAdd)
        self.buttonBox.rejected.connect(self.reject)
        self.comboValue.currentIndexChanged.connect(self.onAgentChanged)

    def onAgentChanged(self, id):
        """
        Called on agent changed on combobox
        """
        currentAgent = self.comboValue.currentText()
        currentAgent = unicode(currentAgent)

        currentAgentType = ''
        for agt in ServerAgents.instance().getRunningAgentsComplete():
            if unicode(agt['name']) == currentAgent:
                currentAgentType = unicode(agt['type'].lower())
                break
        
        self.typeEdit.setText(currentAgentType)

    def onAdd(self):
        """
        Called on add
        """
        if sys.version_info > (3,): # python3 support
            if unicode(self.nameEdit.text().upper()):
                self.accept()
        else:
            if unicode(self.nameEdit.text().toUpper()):
                self.accept()

    def getParameterValue(self):
        """
        Returns parameter value
        """
        qvalue = self.comboValue.currentText()
        if sys.version_info > (3,): # python3 support
            nameUpper = unicode(self.nameEdit.text().upper())
        else:
            nameUpper = unicode(self.nameEdit.text().toUpper())
        r = { 'name': nameUpper, 'description': unicode(self.descrEdit.toPlainText()),
                'value': unicode(qvalue), 'type': unicode(self.typeEdit.text()) }
        return r
Exemplo n.º 8
0
class WFramework(QWidget, Logger.ClassLogger):
    """
    Framework widget
    """
    # action, description, misc, parameters
    AddStep = pyqtSignal(str, str, str, dict)  
    UpdateStep = pyqtSignal(str, str, str, dict)  
    CancelEdit = pyqtSignal()
    def __init__(self, parent):
        """
        Constructor
        """
        QWidget.__init__(self)

        self.createActions()
        self.createWidgets()
        self.createToolbar()
        self.createConnections()
    
    def createActions(self):
        """
        Create qt actions
        """
        self.addAction = QPushButton(QIcon(":/add_black.png"), '&Add Action', self)
        self.addAction.setMinimumHeight(40)
        self.addAction.setMaximumWidth(200)
        
        self.cancelAction = QtHelper.createAction(self, "&Cancel", self.cancelStep, 
                                            icon=QIcon(":/undo.png"), tip = 'Cancel update')
        self.cancelAction.setEnabled(False)
        
        self.optionsAction = QtHelper.createAction(self, "&", self.openOptions, 
                                            icon=QIcon(":/recorder-basic-small.png"), tip = 'Framework options')
        
    def openOptions(self):
        """
        Open options dialog
        """
        if self.optionsDialog.exec_() == QDialog.Accepted:
            pass
              
    def createWidgets(self):
        """
        Create all qt widgets
        """
        self.optionsDialog  = OptionsDialog(self)
        
        self.validatorUpper = ValidatorUpper(self)
        self.validatorAll = ValidatorAll(self)
        self.validatorInt = QIntValidator(self)

        font = QFont()
        font.setBold(True)

        self.actionsComboBox = QComboBox(self)
        self.actionsComboBox.setMinimumHeight(40)
        for i in xrange(len(GuiSteps.ACTION_FRAMEWORK_DESCR)):
            if not len( GuiSteps.ACTION_FRAMEWORK_DESCR[i] ):
                self.actionsComboBox.insertSeparator(i+1)
            else:
                el = GuiSteps.ACTION_FRAMEWORK_DESCR[i].keys()
                self.actionsComboBox.addItem( list(el)[0] )
            
        self.labelActionDescr = QLabel(self)
        self.labelActionDescr.setText( "%s\n" % GuiSteps.ACTION_FRAMEWORK_DESCR[0][GuiSteps.FRAMEWORK_INFO])
        self.labelActionDescr.setWordWrap(True)
        self.labelActionDescr.hide()
        
        self.descriptionLine = QLineEdit(self)
        self.descriptionLine.hide()

        actionLayout2 = QGridLayout()

        self.createWidgetGetText()        
        self.createWidgetGetWait()
        self.createWidgetCacheSet()
        self.createWidgetCheckString()
        self.createWidgetGetAsk()

        actionLayout2.addWidget( self.setCacheGroup , 0, 0)
        actionLayout2.addWidget( self.getCheckGroup , 1, 0)
        actionLayout2.addWidget( self.getTextGroup , 2, 0)
        actionLayout2.addWidget( self.getWaitGroup , 3, 0)
        actionLayout2.addWidget( self.getAskGroup , 4, 0)

        labelAct = QLabel( self.tr("Action: ") )
        labelAct.setFont( font) 
        
        self.arrowLabel = QLabel("")
        self.arrowLabel.setPixmap(QPixmap(":/arrow-right.png").scaledToWidth(32))

        self.arrowLabel2 = QLabel("")
        self.arrowLabel2.setPixmap(QPixmap(":/arrow-right.png").scaledToWidth(32))

        layoutFinal = QHBoxLayout()
        layoutFinal.addWidget( labelAct )
        layoutFinal.addWidget(self.actionsComboBox)
        layoutFinal.addWidget( self.arrowLabel )
        layoutFinal.addLayout( actionLayout2 )
        layoutFinal.addWidget( self.arrowLabel2 )
        layoutFinal.addWidget(self.addAction)

        layoutFinal.addStretch(1)
        self.setLayout(layoutFinal)
        
    def createToolbar(self):
        """
        Create toolbar
        """
        pass

    def createWidgetCheckString(self):
        """
        Create widget to check string
        """
        self.getCheckGroup = QGroupBox(self.tr(""))

        # check in ?
        self.checkInTextLine = QLineEdit(self)
        self.checkInTextLine.setMinimumWidth(300)
        self.checkInTextCombo = QComboBox(self)
        self.checkInTextCombo.addItems( [ "CACHE" ] )

        # operator   
        self.checkComboBox = QComboBox(self)
        self.checkComboBox.addItems( [ GuiSteps.OP_CONTAINS, GuiSteps.OP_NOTCONTAINS, GuiSteps.OP_REGEXP, GuiSteps.OP_NOTREGEXP,
                                       GuiSteps.OP_STARTSWITH, GuiSteps.OP_NOTSTARTSWITH, GuiSteps.OP_ENDSWITH, 
                                       GuiSteps.OP_NOTENDSWITH ] )
        
        # check what ?
        self.checkOutTextLine = QLineEdit(self)
        self.checkOutTextLine.setMinimumWidth(300)
        self.checkOutTextCombo = QComboBox(self)
        self.checkOutTextCombo.addItems( LIST_TYPES )

        # final layout
        mainChecklayout = QGridLayout()
        mainChecklayout.addWidget(  QLabel( self.tr("Checking from:") ), 0, 0 )
        mainChecklayout.addWidget(  self.checkInTextCombo, 0, 1 )
        mainChecklayout.addWidget(  self.checkInTextLine, 0, 2 )
        mainChecklayout.addWidget(  QLabel( self.tr("If:") ), 1, 0 )
        mainChecklayout.addWidget(  self.checkComboBox, 1, 1 )
        mainChecklayout.addWidget(  QLabel( self.tr("The Value:") ), 2, 0  )
        mainChecklayout.addWidget(  self.checkOutTextCombo, 2, 1 )
        mainChecklayout.addWidget(  self.checkOutTextLine, 2, 2 )

        self.getCheckGroup.setLayout(mainChecklayout)
        self.getCheckGroup.hide()
        
    def createWidgetGetText(self):
        """
        Create text widget 
        """
        self.getTextGroup = QGroupBox(self.tr(""))

        self.basicTextLine = QLineEdit(self)
        self.basicTextLine.setMinimumWidth(300)
        self.basicTextCombo = QComboBox(self)
        self.basicTextCombo.addItems( LIST_TYPES )

        mainTextlayout = QGridLayout()
        mainTextlayout.addWidget(  QLabel( self.tr("Value:") ), 0, 0 )
        mainTextlayout.addWidget(  self.basicTextCombo, 0, 1 )
        mainTextlayout.addWidget(  self.basicTextLine, 0, 2 )

        self.getTextGroup.setLayout(mainTextlayout)
    
    def createWidgetGetAsk(self):
        """
        Create ask widget
        """
        # ask
        self.getAskGroup = QGroupBox(self.tr(""))

        self.askTextLine = QLineEdit(self)
        self.askTextLine.setMinimumWidth(300)
        self.askTextCombo = QComboBox(self)
        self.askTextCombo.addItems( LIST_TYPES )

        self.askTextCacheLine = QLineEdit(self)
        self.askTextCacheLine.setMinimumWidth(300)
        self.askTextCacheCombo = QComboBox(self)
        self.askTextCacheCombo.addItems( [ "CACHE" ] )
        
        mainAsklayout = QGridLayout()
        mainAsklayout.addWidget(  QLabel( self.tr("User input prompt:") ), 0, 0 )
        mainAsklayout.addWidget(  self.askTextCombo, 0, 1 )
        mainAsklayout.addWidget(  self.askTextLine, 0, 2 )
        mainAsklayout.addWidget(  QLabel( self.tr("And save response in:") ), 1, 0 )
        mainAsklayout.addWidget(  self.askTextCacheCombo, 1, 1 )
        mainAsklayout.addWidget(  self.askTextCacheLine, 1, 2 )
        
        self.getAskGroup.setLayout(mainAsklayout)
        self.getAskGroup.hide()
        
    def createWidgetGetWait(self):
        """
        Create wait text widget
        """
        self.getWaitGroup = QGroupBox(self.tr(""))

        self.valueWaitLine = QLineEdit(self)
        self.valueWaitLine.setMinimumWidth(300)
        self.valueWaitLine.setValidator(self.validatorInt)
        self.valueWaitCombo = QComboBox(self)
        self.valueWaitCombo.addItems( LIST_TYPES )

        mainTextlayout = QGridLayout()
        mainTextlayout.addWidget(  QLabel( self.tr("Value (in seconds):") ), 0, 0 )
        mainTextlayout.addWidget(  self.valueWaitCombo, 0, 1 )
        mainTextlayout.addWidget(  self.valueWaitLine, 0, 2 )

        self.getWaitGroup.setLayout(mainTextlayout)
        self.getWaitGroup.hide()
        
    def createWidgetCacheSet(self):
        """
        Create cache widget
        """
        self.setCacheGroup = QGroupBox(self.tr(""))
        
        setCacheLayout = QGridLayout()
        
        self.cacheKeyName = QLineEdit(self)
        self.cacheKeyName.setMinimumWidth(300)
        
        setCacheLayout.addWidget( QLabel( self.tr("Key name:") ) , 0, 1)
        setCacheLayout.addWidget( self.cacheKeyName , 0, 2)

        self.setCacheGroup.setLayout(setCacheLayout)
        self.setCacheGroup.hide()
        
    def createConnections(self):
        """
        Createa qt connections
        """
        self.actionsComboBox.currentIndexChanged.connect(self.onActionChanged)
        self.addAction.clicked.connect(self.addStep)
        
        self.basicTextCombo.currentIndexChanged.connect(self.onBasicTextTypeChanged)
        self.valueWaitCombo.currentIndexChanged.connect(self.onValueWaitTypeChanged)
        self.checkOutTextCombo.currentIndexChanged.connect(self.onCheckOutTextTypeChanged)
        self.askTextCombo.currentIndexChanged.connect(self.onAskTextTypeChanged)
        
    def onAskTextTypeChanged(self):
        """
        On ask type changed
        """
        if self.askTextCombo.currentText() in [ "TEXT", "CACHE" ]:
            self.askTextLine.setValidator(self.validatorAll)
            
        if self.askTextCombo.currentText() == "ALIAS":
            self.askTextLine.setText( self.askTextLine.text().upper() )
            self.askTextLine.setValidator(self.validatorUpper)
            
    def onCheckOutTextTypeChanged(self):
        """
        On check out type changed
        """
        if self.checkOutTextCombo.currentText() in [ "TEXT", "CACHE" ]:
            self.checkOutTextLine.setValidator(self.validatorAll)
            
        if self.checkOutTextCombo.currentText() == "ALIAS":
            self.checkOutTextLine.setText( self.checkOutTextLine.text().upper() )
            self.checkOutTextLine.setValidator(self.validatorUpper)
            
    def onValueWaitTypeChanged(self):
        """
        On value wait changed
        """
        if self.valueWaitCombo.currentText() in [ "TEXT" ]:
            self.valueWaitLine.setText( "0" )
            self.valueWaitLine.setValidator(self.validatorInt)
            
        if self.valueWaitCombo.currentText() in [ "CACHE" ]:
            self.valueWaitLine.setValidator(self.validatorAll)
            
        if self.valueWaitCombo.currentText() == "ALIAS":
            self.valueWaitLine.setText( self.valueWaitLine.text().upper() )
            self.valueWaitLine.setValidator(self.validatorUpper)
            
    def onBasicTextTypeChanged(self):
        """
        On basic text changed
        """
        if self.basicTextCombo.currentText() in [ "TEXT", "CACHE" ]:
            self.basicTextLine.setValidator(self.validatorAll)

        if self.basicTextCombo.currentText() == "ALIAS":
            self.basicTextLine.setText( self.basicTextLine.text().upper() )
            self.basicTextLine.setValidator(self.validatorUpper)
            
    def pluginDataAccessor(self):
        """
        Return data for plugins
        """
        return { "data": "" } 
        
    def onPluginImport(self, dataJson):
        """
        On call from plugin
        """
        pass 
    
    def onRadioAskChanged(self, button):
        """
        On radio ask changed
        """
        if button.text() == 'From alias parameter':
            self.askTextLine.setText( self.askTextLine.text().upper() )
            self.askTextLine.setValidator(self.validAskUpper)
        else:
            self.askTextLine.setValidator(self.validAskAll)

    def onActionChanged(self):
        """
        On action changed
        """
        descr = 'No description available!'
        i = 0
        for el in GuiSteps.ACTION_FRAMEWORK_DESCR:
            if isinstance(el, dict):
                if self.actionsComboBox.currentText() in el:
                    descr = GuiSteps.ACTION_FRAMEWORK_DESCR[i][self.actionsComboBox.currentText()]
                    break
            i += 1
        self.labelActionDescr.setText( "%s\n" % descr )
        
        if self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_INFO, GuiSteps.FRAMEWORK_WARNING ]:
            self.getTextGroup.show()
            self.getWaitGroup.hide()
            self.setCacheGroup.hide()
            self.getCheckGroup.hide()
            self.getAskGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_WAIT ]:
            self.getWaitGroup.show()
            self.getTextGroup.hide()
            self.setCacheGroup.hide()
            self.getCheckGroup.hide()
            self.getAskGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_CACHE_SET ]:
            self.getTextGroup.show()
            self.getWaitGroup.hide()
            self.setCacheGroup.show()
            self.getCheckGroup.hide()
            self.getAskGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_CHECK_STRING ]:
            self.getCheckGroup.show()
            self.getTextGroup.hide()
            self.getWaitGroup.hide()
            self.setCacheGroup.hide()
            self.getAskGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_INTERACT ]:
            self.getCheckGroup.hide()
            self.getTextGroup.hide()
            self.getWaitGroup.hide()
            self.setCacheGroup.hide()
            self.getAskGroup.show()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_USERCODE, GuiSteps.FRAMEWORK_CACHE_RESET ]:
            self.getCheckGroup.hide()
            self.getTextGroup.hide()
            self.getWaitGroup.hide()
            self.setCacheGroup.hide()
            self.getAskGroup.hide()
            
            self.arrowLabel.hide()
            self.arrowLabel2.show()
            
        else:
            self.getTextGroup.hide()
            self.getWaitGroup.hide()
            self.setCacheGroup.hide()
            self.getCheckGroup.hide()
            self.getAskGroup.hide()
            
            self.arrowLabel.hide()
            self.arrowLabel2.hide()

    def addStep(self):
        """
        Add step
        """
        action = self.actionsComboBox.currentText()
        descr = self.descriptionLine.text()
        descr = unicode(descr).replace('"', '')
        
        signal = self.AddStep
        if self.cancelAction.isEnabled():
            signal = self.UpdateStep

        if action in [ GuiSteps.FRAMEWORK_INFO, GuiSteps.FRAMEWORK_WARNING ]:
            fromCache = False
            if self.basicTextCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.basicTextCombo.currentText() == "ALIAS": fromAlias = True
            
            newText = self.basicTextLine.text()
            if not len(newText):
                QMessageBox.warning(self, "Assistant" , "Please to set a value!")
            else:
                parameters = { 'text': newText, 'from-cache': fromCache, 'from-alias': fromAlias }
                signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
        
        elif action in [ GuiSteps.FRAMEWORK_INTERACT ]:
            # read text from cache, alias or not ?
            fromCache = False
            if self.askTextCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.askTextCombo.currentText() == "ALIAS": fromAlias = True
            
            askText = self.askTextLine.text()
            if not len(askText):
                QMessageBox.warning(self, "Assistant" , "Please to set question to ask!")
            else:
                saveAskText = self.askTextCacheLine.text()
                if not len(saveAskText):
                    QMessageBox.warning(self, "Assistant" , "Please to set key destination cache!")
                else:
                    parameters = { 'key': saveAskText, 'value': askText, 'from-cache': fromCache, 'from-alias': fromAlias }
                    signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                        
        elif action in [ GuiSteps.FRAMEWORK_CHECK_STRING ]:
            fromCache = False
            if self.checkOutTextCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.checkOutTextCombo.currentText() == "ALIAS": fromAlias = True
            
            inText = self.checkInTextLine.text()
            if not len(inText):
                QMessageBox.warning(self, "Assistant" , "Please to set a cache key value!")
            else:
                outText = self.checkOutTextLine.text()
                if not len(outText):
                    QMessageBox.warning(self, "Assistant" , "Please to set a value!")
                else:
                    op = self.checkComboBox.currentText()
                    parameters = { 'key': inText, 'value': outText, 'from-cache': fromCache,
                                    'from-alias': fromAlias, "operator": op }
                    signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                    
        elif action in [ GuiSteps.FRAMEWORK_WAIT ]:
            fromCache = False
            if self.valueWaitCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.valueWaitCombo.currentText() == "ALIAS": fromAlias = True
            
            miscStr = self.valueWaitLine.text()
            if not len(miscStr):
                QMessageBox.warning(self, "Assistant" , "Please to set a value!")
            else:
                parameters = {'from-cache': fromCache, 'from-alias': fromAlias}
                signal.emit( str(action), unicode(descr), miscStr, parameters )
                
        elif action in [ GuiSteps.FRAMEWORK_CACHE_SET ]:
            fromCache = False
            if self.basicTextCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.basicTextCombo.currentText() == "ALIAS": fromAlias = True
            
            newText = self.basicTextLine.text()
            if not len(newText):
                QMessageBox.warning(self, "Assistant" , "Please to set a text value!")
            else:
                miscStr = self.cacheKeyName.text()
                if not len(miscStr):
                    QMessageBox.warning(self, "Assistant" , "Please to set a key name!")
                else:
                    parameters = { 'key': miscStr, 'value': newText, 'from-cache': fromCache, 'from-alias': fromAlias }
                    signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )

        else:
            signal.emit( str(action), unicode(descr), EMPTY_VALUE, {} )
            
    def cancelStep(self):
        """
        Cancel step
        """
        self.addAction.setText( "&Add" )
        
        buttonFont = QFont()
        buttonFont.setBold(False)
        self.addAction.setFont(buttonFont)
        self.cancelAction.setEnabled(False)
        
        self.CancelEdit.emit()
    
    def finalizeUpdate(self):
        """
        Finalize update 
        """
        self.addAction.setText( "&Add Action" )
        
        buttonFont = QFont()
        buttonFont.setBold(False)
        self.addAction.setFont(buttonFont)
        self.cancelAction.setEnabled(False)

    def editStep(self, stepData):
        """
        Edit step
        """
        self.addAction.setText( "&Update" )
        buttonFont = QFont()
        buttonFont.setBold(True)
        self.addAction.setFont(buttonFont)
        
        self.cancelAction.setEnabled(True)
        
            
        # set the current value for actions combo
        for i in xrange(self.actionsComboBox.count()):
            item_text = self.actionsComboBox.itemText(i)
            if unicode(stepData["action"]) == unicode(item_text):
                self.actionsComboBox.setCurrentIndex(i)
                break
        # and then refresh options
        self.onActionChanged()
        
        # finally fill all fields
        self.descriptionLine.setText( stepData["description"] )
                
        if self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_INFO, GuiSteps.FRAMEWORK_WARNING ] :
            self.basicTextLine.setText ( stepData["parameters"]["text"] )
            if stepData["parameters"]["from-cache"]:
                self.basicTextLine.setValidator(self.validatorAll)
                self.basicTextCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias"]:
                self.basicTextLine.setValidator(self.validatorUpper)
                self.basicTextCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.basicTextLine.setValidator(self.validatorAll)
                self.basicTextCombo.setCurrentIndex(INDEX_TEXT)

        if self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_WAIT ]:
            self.valueWaitLine.setText ( stepData["misc"] )
            if stepData["parameters"]["from-cache"]:
                self.valueWaitLine.setValidator(self.validatorAll)
                self.valueWaitCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias"]:
                self.valueWaitLine.setValidator(self.validatorUpper)
                self.valueWaitCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.valueWaitLine.setValidator(self.validatorInt)
                self.valueWaitCombo.setCurrentIndex(INDEX_TEXT)
 
        if self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_CACHE_SET ]:
            self.basicTextLine.setText ( stepData["parameters"]["value"] )
            if stepData["parameters"]["from-cache"]:
                self.basicTextLine.setValidator(self.validatorAll)
                self.basicTextCombo.setCurrentIndex(INDEX_CACHE)
                
            elif stepData["parameters"]["from-alias"]:
                self.basicTextLine.setValidator(self.validatorUpper)
                self.basicTextCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.basicTextLine.setValidator(self.validatorAll)
                self.basicTextCombo.setCurrentIndex(INDEX_TEXT)
                
            self.cacheKeyName.setText( stepData["parameters"]["key"] ) 
            
        if self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_CHECK_STRING ]:

            self.checkOutTextLine.setText ( stepData["parameters"]["value"] )
                        
            if stepData["parameters"]["from-cache"]:
                self.checkOutTextLine.setValidator(self.validatorAll)
                self.checkOutTextCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias"]:
                self.checkOutTextLine.setValidator(self.validatorUpper)
                self.checkOutTextCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.checkOutTextLine.setValidator(self.validatorAll)
                self.checkOutTextCombo.setCurrentIndex(INDEX_TEXT)

            self.checkInTextLine.setText ( stepData["parameters"]["key"] )
            
            for i in xrange(self.checkComboBox.count()):
                item_text = self.checkComboBox.itemText(i)
                if unicode(stepData["parameters"]["operator"]) == unicode(item_text):
                    self.checkComboBox.setCurrentIndex(i)
                    break

        if self.actionsComboBox.currentText() in [ GuiSteps.FRAMEWORK_INTERACT ]:
            self.askTextLine.setText ( stepData["parameters"]["value"] )
            if stepData["parameters"]["from-cache"]:
                self.askTextLine.setValidator(self.validatorAll)
                self.askTextCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias"]:
                self.askTextLine.setValidator(self.validatorUpper)
                self.askTextCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.askTextLine.setValidator(self.validatorAll)
                self.askTextCombo.setCurrentIndex(INDEX_TEXT)

            self.askTextCacheLine.setText ( stepData["parameters"]["key"] )
            
    def getTimeout(self):
        """
        Return timeout
        """
        return self.optionsDialog.timeoutLine.text() 
        
    def setTimeout(self, timeout):
        """
        Set the timeout
        """
        return self.optionsDialog.timeoutLine.setText(timeout) 
Exemplo n.º 9
0
class WAndroid(QWidget, Logger.ClassLogger):
    """
    Android widget
    """
    # action, description, misc, parameters
    AddStep = pyqtSignal(str, str, str, dict)
    UpdateStep = pyqtSignal(str, str, str, dict)    
    CancelEdit = pyqtSignal()
    def __init__(self, parent):
        """
        Constructor
        """
        QWidget.__init__(self)

        self.createActions()
        self.createWidgets()
        self.createToolbar()
        self.createConnections()
    
    def createActions(self):
        """
        Create qt actions
        """
        self.addAndroidAction = QPushButton(QIcon(":/add_black.png"), '&Add Action', self)
        self.addAndroidAction.setMinimumHeight(40)         
        self.addAndroidAction.setMaximumWidth(150)
        
        self.cancelAndroidAction = QtHelper.createAction(self, "&Cancel", self.cancelStep, 
                                            icon=None, tip = 'Cancel update')
        self.cancelAndroidAction.setEnabled(False)
        
        self.optionsAction = QtHelper.createAction(self, "&", self.openOptions, 
                                            icon=QIcon(":/recorder-mobile-small.png"), tip = 'Android options')
                                            
    def createWidgets(self):
        """
        Create qt widgets
        """
        self.optionsDialog  = OptionsDialog(self)
        
        self.validatorUpper = ValidatorUpper(self)
        self.validatorAll = ValidatorAll(self)
        self.validatorInt = QIntValidator(self)

        ###################### android action #########################

        self.actionsAndroidComboBox = QComboBox(self)
        self.actionsAndroidComboBox.setMinimumHeight(40)
        for i in xrange(len(GuiSteps.ACTION_ANDROID_DESCR)):
            if not len( GuiSteps.ACTION_ANDROID_DESCR[i] ):
                self.actionsAndroidComboBox.insertSeparator(i+1)
            else:
                el = GuiSteps.ACTION_ANDROID_DESCR[i].keys()
                self.actionsAndroidComboBox.addItem( list(el)[0] )
            
        self.descriptionAndroidLine = QLineEdit(self)
        self.descriptionAndroidLine.setPlaceholderText("Step purpose description")
        self.descriptionAndroidLine.hide()

        self.labelActionAndroidDescr = QLabel( )
        self.labelActionAndroidDescr.hide()
        self.labelActionAndroidDescr.setText( "%s\n" % GuiSteps.ACTION_ANDROID_DESCR[0][GuiSteps.ANDROID_WAKEUP_UNLOCK])
        self.labelActionAndroidDescr.setWordWrap(True)
        
        actionsLayout = QHBoxLayout()
        actionsLayout.addWidget(self.actionsAndroidComboBox)
        
        actionLayoutAndroid = QGridLayout()
        actionLayoutAndroid.addLayout(actionsLayout, 0, 1)

        self.createWidgetShortcut()
        self.createWidgetCode()
        self.createWidgetStart()
        self.createWidgetXY()
        self.createWidgetEndXY()
        self.createWidgetElement()
        self.createWidgetTextTo()
        self.createWidgetLine()
        self.createWidgetLine2()
        
        actionLayoutAndroid2 = QGridLayout()
        actionLayoutAndroid2.addWidget( self.shortcutAndroidGroup , 0, 0)
        actionLayoutAndroid2.addWidget( self.codeAndroidGroup , 0, 0)
        actionLayoutAndroid2.addWidget( self.elemenAndroidGroup , 0, 0)
        actionLayoutAndroid2.addWidget( self.xyAndroidGroup , 0, 0)
        actionLayoutAndroid2.addWidget( self.startAndroidGroup , 0, 0)
        actionLayoutAndroid2.addWidget( self.lineAndroidGroup , 1, 0)
        actionLayoutAndroid2.addWidget( self.line2AndroidGroup , 0, 1)
        actionLayoutAndroid2.addWidget( self.textToGlobalGroup , 0, 1)
        actionLayoutAndroid2.addWidget( self.endXyAndroidGroup, 0, 1)
        
        font = QFont()
        font.setBold(True)
        
        labelAct = QLabel( self.tr("Action: ") )
        labelAct.setFont( font) 
        
        self.arrowLabel = QLabel("")
        self.arrowLabel.setPixmap(QPixmap(":/arrow-right.png").scaledToWidth(32))
        self.arrowLabel.hide()
        
        self.arrowLabel2 = QLabel("")
        self.arrowLabel2.setPixmap(QPixmap(":/arrow-right.png").scaledToWidth(32))

        layoutAndroid = QHBoxLayout()
        layoutAndroid.addWidget( labelAct )
        layoutAndroid.addLayout( actionLayoutAndroid )
        layoutAndroid.addWidget( self.arrowLabel )
        layoutAndroid.addLayout( actionLayoutAndroid2 )
        layoutAndroid.addWidget( self.arrowLabel2 )
        layoutAndroid.addWidget(self.addAndroidAction)

        layoutAndroid.addStretch(1)
        self.setLayout(layoutAndroid)
        
    def createToolbar(self):
        """
        Create qt toolbar
        """
        pass
        
    def openOptions(self):
        """
        Open options
        """
        if self.optionsDialog.exec_() == QDialog.Accepted:
            pass
            
    def createWidgetLine2(self):
        """
        Create line widget
        """
        self.valueAndroidLine2 = QLineEdit(self)
        self.valueAndroidLine2.setMinimumWidth(150)
        self.valueAndroidCombo2 = QComboBox(self)
        self.valueAndroidCombo2.addItems( LIST_TYPES )

        self.line2AndroidGroup = QGroupBox(self.tr(""))
        
        line2Androidlayout = QGridLayout()
        line2Androidlayout.addWidget( QLabel( self.tr("Text to type:") ), 0, 0  ) 
        line2Androidlayout.addWidget( self.valueAndroidCombo2, 0, 1 )
        line2Androidlayout.addWidget( self.valueAndroidLine2, 0, 2 )

        self.line2AndroidGroup.setLayout(line2Androidlayout)
        self.line2AndroidGroup.hide()
        
    def createWidgetLine(self):
        """
        Create line widget
        """
        self.lineAndroidGroup = QGroupBox(self.tr(""))
        lineAndroidlayout = QGridLayout()
        self.valueAndroidLine = QLineEdit(self)
        self.valueAndroidLine.setMinimumWidth(300)
        lineAndroidlayout.addWidget( QLabel( self.tr("Value:") ) , 0,1)
        lineAndroidlayout.addWidget( self.valueAndroidLine , 0, 2)
        self.lineAndroidGroup.setLayout(lineAndroidlayout)
        self.lineAndroidGroup.hide()
        
    def createWidgetTextTo(self):
        """
        Create text widget
        """
        self.valueTextCacheGlobalLine = QLineEdit(self)
        self.valueTextCacheGlobalLine.setMinimumWidth(150)
        self.valueTextCacheGlobalCombo = QComboBox(self)
        self.valueTextCacheGlobalCombo.addItems( ["CACHE"] )
        
        self.textToGlobalGroup = QGroupBox(self.tr(""))
        textToGloballayout = QGridLayout()
        textToGloballayout.addWidget( QLabel( self.tr("Save text in:") ) , 0, 0)
        textToGloballayout.addWidget( self.valueTextCacheGlobalCombo , 0, 1)
        textToGloballayout.addWidget( self.valueTextCacheGlobalLine , 0, 2)
        self.textToGlobalGroup.setLayout(textToGloballayout)
        self.textToGlobalGroup.hide()
        
    def createWidgetElement(self):
        """
        Create text widget
        """
        self.elemenAndroidGroup = QGroupBox(self.tr(""))
        
        self.elementTextAndroidLine = QLineEdit(self)
        self.elementTextAndroidLine.setMinimumWidth(300)
        self.elementTextCombo = QComboBox(self)
        self.elementTextCombo.addItems( LIST_TYPES )
        
        self.elementDescriptionAndroidLine = QLineEdit(self)
        self.elementDescriptionAndroidLine.setMinimumWidth(300)
        self.elementClassAndroidLine = QLineEdit(self)
        self.elementClassAndroidLine.setMinimumWidth(300)
        self.elementRessourceIdAndroidLine = QLineEdit(self)
        self.elementRessourceIdAndroidLine.setMinimumWidth(300)
        self.elementPackageAndroidLine = QLineEdit(self)
        self.elementPackageAndroidLine.setMinimumWidth(300)

        # get  text end
        elementAndroidlayout = QGridLayout()
        elementAndroidlayout.addWidget( QLabel( self.tr("Text Element:") ) , 0,1)
        elementAndroidlayout.addWidget( self.elementTextCombo , 0, 2)
        elementAndroidlayout.addWidget( self.elementTextAndroidLine , 0, 3)
        elementAndroidlayout.addWidget( QLabel( self.tr("Description Element:") ) , 1,1)
        elementAndroidlayout.addWidget( self.elementDescriptionAndroidLine , 1, 3)
        elementAndroidlayout.addWidget( QLabel( self.tr("Class Name:") ) , 2,1)
        elementAndroidlayout.addWidget( self.elementClassAndroidLine , 2, 3)
        elementAndroidlayout.addWidget( QLabel( self.tr("Resource ID:") ) , 3,1)
        elementAndroidlayout.addWidget( self.elementRessourceIdAndroidLine , 3, 3)
        elementAndroidlayout.addWidget( QLabel( self.tr("Package Name:") ) , 4,1)
        elementAndroidlayout.addWidget( self.elementPackageAndroidLine , 4, 3)
        self.elemenAndroidGroup.setLayout(elementAndroidlayout)
        self.elemenAndroidGroup.hide()
        
    def createWidgetEndXY(self):
        """
        Create widget 
        """
        self.endXyAndroidGroup = QGroupBox(self.tr(""))
        endXyAndroidlayout = QGridLayout()
        
        self.endxAndroidLine = QLineEdit(self)
        validatorEndXAndroid = QIntValidator (self)
        self.endxAndroidLine.setValidator(validatorEndXAndroid)
        self.endxAndroidLine.installEventFilter(self)
        
        self.endyAndroidLine = QLineEdit(self)
        validatorEndYAndroid = QIntValidator (self)
        self.endyAndroidLine.setValidator(validatorEndYAndroid)
        self.endyAndroidLine.installEventFilter(self)
        
        endXyAndroidlayout.addWidget( QLabel( self.tr("Destination Coordinate X:") ) , 0, 0)
        endXyAndroidlayout.addWidget( self.endxAndroidLine , 0, 1)
        endXyAndroidlayout.addWidget( QLabel( self.tr("Destination Coordinate Y:") ) , 1,0)
        endXyAndroidlayout.addWidget( self.endyAndroidLine , 1, 1)
        
        self.endXyAndroidGroup.setLayout(endXyAndroidlayout)
        self.endXyAndroidGroup.hide()
        
    def createWidgetXY(self):
        """
        Create text widget
        """
        self.xyAndroidGroup = QGroupBox(self.tr(""))
        xyAndroidlayout = QGridLayout()
        
        self.xAndroidLine = QLineEdit(self)
        validatorXAndroid = QIntValidator (self)
        self.xAndroidLine.setValidator(validatorXAndroid)
        self.xAndroidLine.installEventFilter(self)
        
        self.yAndroidLine = QLineEdit(self)
        validatorYAndroid = QIntValidator (self)
        self.yAndroidLine.setValidator(validatorYAndroid)
        self.yAndroidLine.installEventFilter(self)
        
        xyAndroidlayout.addWidget( QLabel( self.tr("Coordinate X:") ) , 0,0)
        xyAndroidlayout.addWidget( self.xAndroidLine , 0, 1)
        xyAndroidlayout.addWidget( QLabel( self.tr("Coordinate Y:") ) , 1,0)
        xyAndroidlayout.addWidget( self.yAndroidLine , 1, 1)
        
        self.xyAndroidGroup.setLayout(xyAndroidlayout)
        self.xyAndroidGroup.hide()
        
    def createWidgetStart(self):
        """
        Create text widget
        """
        self.startAndroidGroup = QGroupBox(self.tr(""))
        startAndroidlayout = QGridLayout()
        
        self.startXAndroidLine = QLineEdit(self)
        validatorStartXAndroid = QIntValidator (self)
        self.startXAndroidLine.setValidator(validatorStartXAndroid)
        self.startXAndroidLine.installEventFilter(self)
        
        self.startYAndroidLine = QLineEdit(self)
        validatorStartYAndroid = QIntValidator (self)
        self.startYAndroidLine.setValidator(validatorStartYAndroid)
        self.startYAndroidLine.installEventFilter(self)
        
        self.stopXAndroidLine = QLineEdit(self)
        validatorStopXAndroid = QIntValidator (self)
        self.stopXAndroidLine.setValidator(validatorStopXAndroid)
        self.stopXAndroidLine.installEventFilter(self)
        
        self.stopYAndroidLine = QLineEdit(self)
        validatorStopYAndroid = QIntValidator (self)
        self.stopYAndroidLine.setValidator(validatorStopYAndroid)
        self.stopYAndroidLine.installEventFilter(self)
        
        startAndroidlayout.addWidget( QLabel( self.tr("From X:") ) , 0,1)
        startAndroidlayout.addWidget( self.startXAndroidLine , 0, 2)
        startAndroidlayout.addWidget( QLabel( self.tr("From Y:") ) , 0,3)
        startAndroidlayout.addWidget( self.startYAndroidLine , 0, 4)
        startAndroidlayout.addWidget( QLabel( self.tr("To X:") ) ,1,1)
        startAndroidlayout.addWidget( self.stopXAndroidLine , 1, 2)
        startAndroidlayout.addWidget( QLabel( self.tr("To Y:") ) , 1,3)
        startAndroidlayout.addWidget( self.stopYAndroidLine , 1 , 4)
        self.startAndroidGroup.setLayout(startAndroidlayout)
        self.startAndroidGroup.hide()
        
    def createWidgetShortcut(self):
        """
        Create shortcut widget
        """
        self.shortcutAndroidGroup = QGroupBox(self.tr(""))
        shortcutAndroidlayout = QGridLayout()

        self.shortcutAndroidComboBox = QComboBox(self)
        for i in xrange(len(KEYS_SHORTCUT_ANDROID)):
            if len(KEYS_SHORTCUT_ANDROID[i]) == 0:
                self.shortcutAndroidComboBox.insertSeparator(i + 2)
            else:
                self.shortcutAndroidComboBox.addItem (KEYS_SHORTCUT_ANDROID[i])

        shortcutAndroidlayout.addWidget( QLabel( self.tr("Button:") ) , 0,1)
        shortcutAndroidlayout.addWidget(self.shortcutAndroidComboBox, 0, 2)
        
        self.shortcutAndroidGroup.setLayout(shortcutAndroidlayout)
        self.shortcutAndroidGroup.hide()

    def createWidgetCode(self):
        """
        Create code widget
        """
        self.codeAndroidGroup = QGroupBox(self.tr(""))
        self.codeAndroidLine = QLineEdit(self)
        validatorCodeAndroid = QIntValidator (self)
        self.codeAndroidLine.setValidator(validatorCodeAndroid)
        self.codeAndroidLine.installEventFilter(self)
        
        codeAndroidlayout = QGridLayout()
        codeAndroidlayout.addWidget( QLabel( self.tr("Code:") ) , 0,1)
        codeAndroidlayout.addWidget( self.codeAndroidLine , 0, 2)
        self.codeAndroidGroup.setLayout(codeAndroidlayout)
        self.codeAndroidGroup.hide()
        
    def pluginDataAccessor(self):
        """
        Return data for plugin
        """
        return { "data": "" } 
        
    def onPluginImport(self, dataJson):
        """
        Received data from plugin
        """
        pass

    def createConnections(self):
        """
        Create qt connections
        """
        self.actionsAndroidComboBox.currentIndexChanged.connect(self.onActionAndroidChanged)
        self.addAndroidAction.clicked.connect(self.addStep)
        self.valueAndroidCombo2.currentIndexChanged.connect(self.onValueAndroid2TypeChanged)
        self.elementTextCombo.currentIndexChanged.connect(self.onElementTextTypeChanged)
        
    def onElementTextTypeChanged(self):
        """
        On element text changed
        """
        if self.elementTextCombo.currentText() in [ "TEXT", "CACHE" ]:
            self.elementTextAndroidLine.setValidator(self.validatorAll)
            
        if self.elementTextCombo.currentText() == "ALIAS":
            self.elementTextAndroidLine.setText( self.elementTextAndroidLine.text().upper() )
            self.elementTextAndroidLine.setValidator(self.validatorUpper)
            
    def onValueAndroid2TypeChanged(self):
        """
        On value changed
        """
        if self.valueAndroidCombo2.currentText() in [ "TEXT", "CACHE" ]:
            self.valueAndroidLine2.setValidator(self.validatorAll)
            
        if self.valueAndroidCombo2.currentText() == "ALIAS":
            self.valueAndroidLine2.setText( self.valueAndroidLine2.text().upper() )
            self.valueAndroidLine2.setValidator(self.validatorUpper)

    def addStep(self):
        """
        Add step
        """
        action = self.actionsAndroidComboBox.currentText()
        descr = self.descriptionAndroidLine.text()
        descr = unicode(descr).replace('"', '')
        
        signal = self.AddStep
        if self.cancelAndroidAction.isEnabled():
            signal = self.UpdateStep
            
        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_WAKUP, GuiSteps.ANDROID_UNLOCK, GuiSteps.ANDROID_REBOOT, 
                                                        GuiSteps.ANDROID_SLEEP, GuiSteps.ANDROID_FREEZE_ROTATION, GuiSteps.ANDROID_UNFREEZE_ROTATION, 
                                                        GuiSteps.ANDROID_BOOTLOADER, GuiSteps.ANDROID_RECOVERY, GuiSteps.ANDROID_NOTIFICATION, 
                                                        GuiSteps.ANDROID_SETTINGS, GuiSteps.ANDROID_DEVICEINFO, GuiSteps.ANDROID_GET_LOGS, 
                                                        GuiSteps.ANDROID_CLEAR_LOGS , GuiSteps.ANDROID_WAKEUP_UNLOCK, GuiSteps.ANDROID_LOCK,
                                                        GuiSteps.ANDROID_SLEEP_LOCK ]:
            signal.emit( str(action), unicode(descr), EMPTY_VALUE, {} )
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_TYPE_SHORTCUT]:
            shorcut = self.shortcutAndroidComboBox.currentText()
            signal.emit( str(action), unicode(descr), shorcut, {} )
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_TYPE_KEYCODE ]:
            code = self.codeAndroidLine.text()
            if not len(code):
                QMessageBox.warning(self, "Recording for Gui" , "Please to set a value!")
            else:
                signal.emit( str(action), unicode(descr), code, {} )
                
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_CLEAR_ELEMENT, GuiSteps.ANDROID_CLICK_ELEMENT, GuiSteps.ANDROID_LONG_CLICK_ELEMENT,
                                                            GuiSteps.ANDROID_EXIST_ELEMENT, GuiSteps.ANDROID_WAIT_ELEMENT, GuiSteps.ANDROID_TYPE_TEXT_ELEMENT,
                                                            GuiSteps.ANDROID_GET_TEXT_ELEMENT, GuiSteps.ANDROID_DRAG_ELEMENT, GuiSteps.ANDROID_WAIT_CLICK_ELEMENT ]:
            textAndroid = self.elementTextAndroidLine.text()
            descrAndroid = self.elementDescriptionAndroidLine.text()
            classAndroid = self.elementClassAndroidLine.text()
            ressourceAndroid = self.elementRessourceIdAndroidLine.text()
            packageAndroid = self.elementPackageAndroidLine.text()
            if not len(textAndroid) and not len(classAndroid) and not len(ressourceAndroid) and not len(packageAndroid) and not len(descrAndroid):
                QMessageBox.warning(self, "Recording for Gui" , "Please to set one value!")
            else:
                # read text from cache or not ?
                fromElCache = False
                if self.elementTextCombo.currentText() == "CACHE": fromElCache = True
                fromElAlias = False
                if self.elementTextCombo.currentText() == "ALIAS": fromElAlias = True
                        
                if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_TYPE_TEXT_ELEMENT:
                    newTextAndroid = self.valueAndroidLine2.text()
                    if not len(newTextAndroid):
                        QMessageBox.warning(self, "Recording for Gui" , "Please to set a text value!")
                    else:
                        # read text from cache or not ?
                        fromCache = False
                        if self.valueAndroidCombo2.currentText() == "CACHE": fromCache = True
                        fromAlias = False
                        if self.valueAndroidCombo2.currentText() == "ALIAS": fromAlias = True
                        
                        parameters = {'text': textAndroid, 'class': classAndroid, 'ressource': ressourceAndroid, 
                                        'package': packageAndroid, 'description': descrAndroid, 'new-text': newTextAndroid,
                                        'from-cache': fromCache, 'from-alias': fromAlias,
                                        'from-el-cache': fromElCache, 'from-el-alias': fromElAlias }
                        signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                
                elif self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_GET_TEXT_ELEMENT:       
                    # read text from cache or not ?
                    cacheKey = ''
                    toCache = True
                    cacheKey = self.valueTextCacheGlobalLine.text()
                        
                    parameters = {'text': textAndroid, 'class': classAndroid, 'ressource': ressourceAndroid, 
                                    'package': packageAndroid, 'description': descrAndroid, 'cache-key': cacheKey,
                                    'to-cache': toCache, 'from-el-cache': fromElCache, 'from-el-alias': fromElAlias }
                    signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                    
                elif self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_DRAG_ELEMENT:       
                    xAndroid = self.endxAndroidLine.text()
                    yAndroid = self.endyAndroidLine.text()
                    if not len(xAndroid) and not len(yAndroid):
                        QMessageBox.warning(self, "Recording for Gui" , "Please to set values!")
                    else:
                        parameters = {'text': textAndroid, 'class': classAndroid, 'ressource': ressourceAndroid, 
                                    'package': packageAndroid, 'description': descrAndroid,
                                    'from-el-cache': fromElCache, 'from-el-alias': fromElAlias,
                                    'x': xAndroid, 'y': yAndroid }
                        signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                    
                else:

                    parameters = {'text': textAndroid, 'class': classAndroid, 'ressource': ressourceAndroid, 
                                    'package': packageAndroid, 'description': descrAndroid,
                                    'from-el-cache': fromElCache, 'from-el-alias': fromElAlias }
                    signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                    
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_CLICK_POSITION ]:
            xAndroid = self.xAndroidLine.text()
            yAndroid = self.yAndroidLine.text()
            if not len(xAndroid) and not len(yAndroid):
                QMessageBox.warning(self, "Recording for Gui" , "Please to set values!")
            else:
                parameters = { 'x': xAndroid, 'y': yAndroid }
                signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_DRAG_ELEMENT, GuiSteps.ANDROID_DRAG_POSITION, 
                                                            GuiSteps.ANDROID_SWIPE_POSITION]:
            startXAndroid = self.startXAndroidLine.text()
            startYAndroid = self.startYAndroidLine.text()
            stopXAndroid = self.stopXAndroidLine.text()
            stopYAndroid = self.stopYAndroidLine.text()
            if not len(startXAndroid) and not len(startYAndroid) and not len(stopXAndroid) and not len(stopYAndroid):
                QMessageBox.warning(self, "Recording for Gui" , "Please to set values!")
            else:
                parameters = { 'start-x': startXAndroid, 'start-y': startYAndroid, 'stop-x': stopXAndroid, 'stop-y': stopYAndroid }
                signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )

        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_COMMAND, GuiSteps.ANDROID_SHELL, GuiSteps.ANDROID_RESET_APP,
                                                            GuiSteps.ANDROID_STOP_APP]:
            miscStr = self.valueAndroidLine.text()
            if not len(miscStr):
                QMessageBox.warning(self, "Recording for Gui" , "Please to set a value!")
            else:
                if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_COMMAND:
                    parameters = { 'cmd': miscStr }
                elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_RESET_APP, GuiSteps.ANDROID_STOP_APP ]:
                    parameters = { 'pkg': miscStr }
                else:
                    parameters = { 'sh': miscStr }
                signal.emit( str(action), unicode(descr), EMPTY_VALUE, parameters )
                
        else:
            signal.emit( str(action), unicode(descr), EMPTY_VALUE, {} )
        
    def cancelStep(self):
        """
        Cancel step
        """
        self.addAndroidAction.setText( "&Add" )
        buttonFont = QFont()
        buttonFont.setBold(False)
        self.addAndroidAction.setFont(buttonFont)
        
        self.cancelAndroidAction.setEnabled(False)
        
        self.CancelEdit.emit()
    
    def finalizeUpdate(self):
        """
        Finalize the update of a step
        """
        self.addAndroidAction.setText( "&Add Action" )
        
        buttonFont = QFont()
        buttonFont.setBold(False)
        self.addAndroidAction.setFont(buttonFont)
        self.cancelAndroidAction.setEnabled(False)
        
    def onActionAndroidChanged(self):
        """
        On action changed
        """
        descr = 'No description available!'
        i = 0
        for el in GuiSteps.ACTION_ANDROID_DESCR:
            if isinstance(el, dict):
                if self.actionsAndroidComboBox.currentText() in el:
                    descr = GuiSteps.ACTION_ANDROID_DESCR[i][self.actionsAndroidComboBox.currentText()]
                    break
            i += 1
        self.labelActionAndroidDescr.setText( "%s\n" % descr )

            
        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_TYPE_SHORTCUT ]:
            self.shortcutAndroidGroup.show()   
            self.codeAndroidGroup.hide()  
            self.elemenAndroidGroup.hide()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_TYPE_KEYCODE ]:
            self.codeAndroidGroup.show()   
            self.shortcutAndroidGroup.hide()    
            self.elemenAndroidGroup.hide()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_CLEAR_ELEMENT, GuiSteps.ANDROID_CLICK_ELEMENT, GuiSteps.ANDROID_LONG_CLICK_ELEMENT,
                                                            GuiSteps.ANDROID_EXIST_ELEMENT, GuiSteps.ANDROID_WAIT_ELEMENT, GuiSteps.ANDROID_WAIT_CLICK_ELEMENT ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.show()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_DRAG_ELEMENT ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.show()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.show()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_GET_TEXT_ELEMENT ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.show()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.show()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_CLICK_POSITION ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.hide()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.show()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_DRAG_POSITION, GuiSteps.ANDROID_SWIPE_POSITION ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.hide()
            self.startAndroidGroup.show()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_COMMAND, GuiSteps.ANDROID_SHELL, GuiSteps.ANDROID_RESET_APP, 
                                                            GuiSteps.ANDROID_STOP_APP  ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.hide()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.show()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
             
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        elif self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_TYPE_TEXT_ELEMENT ]:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.show()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.show()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.show()
            self.arrowLabel2.show()
            
        else:
            self.shortcutAndroidGroup.hide()   
            self.codeAndroidGroup.hide()       
            self.elemenAndroidGroup.hide()
            self.startAndroidGroup.hide()
            self.xyAndroidGroup.hide()
            self.lineAndroidGroup.hide()
            self.line2AndroidGroup.hide()
            self.textToGlobalGroup.hide()
            self.endXyAndroidGroup.hide()
            
            self.arrowLabel.hide()
            self.arrowLabel2.show()
            
    def setTimeout(self, timeout):
        """
        Set the timeout
        """
        self.optionsDialog.timeoutAndroidLine.setText(timeout)
        
    def getTimeout(self):
        """
        Return the timeout
        """
        return self.optionsDialog.timeoutAndroidLine.text()
        
    def getAgentName(self):
        """
        Get the agent name
        """
        return self.optionsDialog.agentNameLineAndroid.text()
        
    def getAgentList(self):
        """
        Return the agent list
        """
        return self.optionsDialog.agentsAndroidList
     
    def editStep(self, stepData):
        """
        Edit a step
        """
        self.addAndroidAction.setText( "&Update" )
        buttonFont = QFont()
        buttonFont.setBold(True)
        self.addAndroidAction.setFont(buttonFont)
        
        self.cancelAndroidAction.setEnabled(True)
            
        # set the current value for actions combo
        for i in xrange(self.actionsAndroidComboBox.count()):
            item_text = self.actionsAndroidComboBox.itemText(i)
            if unicode(stepData["action"]) == unicode(item_text):
                self.actionsAndroidComboBox.setCurrentIndex(i)
                break
        # and then refresh options
        self.onActionAndroidChanged()
        
        # finally fill all fields
        self.descriptionAndroidLine.setText( stepData["description"] )

        if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_COMMAND:
            self.valueAndroidLine.setText( stepData["parameters"]["cmd"] )
            
        if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_SHELL:
            self.valueAndroidLine.setText( stepData["parameters"]["sh"] )
            
        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_RESET_APP, GuiSteps.ANDROID_STOP_APP ]:
            self.valueAndroidLine.setText( stepData["parameters"]["pkg"] )
            
        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_CLEAR_ELEMENT, GuiSteps.ANDROID_TYPE_TEXT_ELEMENT, 
                                                          GuiSteps.ANDROID_CLICK_ELEMENT, GuiSteps.ANDROID_LONG_CLICK_ELEMENT,
                                                          GuiSteps.ANDROID_EXIST_ELEMENT, GuiSteps.ANDROID_WAIT_ELEMENT,
                                                          GuiSteps.ANDROID_GET_TEXT_ELEMENT, GuiSteps.ANDROID_DRAG_ELEMENT,
                                                          GuiSteps.ANDROID_WAIT_CLICK_ELEMENT ]:
                                                          
            self.elementTextAndroidLine.setText( "" )
            self.elementDescriptionAndroidLine.setText( "" )
            self.elementClassAndroidLine.setText( "" )
            self.elementRessourceIdAndroidLine.setText( "" )
            self.elementPackageAndroidLine.setText( "" )
            self.valueAndroidLine2.setText( "" )
            
            if "text" in stepData["parameters"]:
                if stepData["parameters"]["from-el-cache"]:
                    self.elementTextCombo.setCurrentIndex(INDEX_CACHE)
                    self.elementTextAndroidLine.setValidator(self.validatorAll)
                elif stepData["parameters"]["from-el-alias"]:
                    self.elementTextCombo.setCurrentIndex(INDEX_ALIAS)
                    self.elementTextAndroidLine.setValidator(self.validatorUpper) 
                else:
                    self.elementTextCombo.setCurrentIndex(INDEX_TEXT)
                    self.elementTextAndroidLine.setValidator(self.validatorAll)
                
                self.elementTextAndroidLine.setText ( stepData["parameters"]["text"] )

            if "description" in stepData["parameters"]:
                self.elementDescriptionAndroidLine.setText( stepData["parameters"]["description"] )
            if "class" in stepData["parameters"]:
                self.elementClassAndroidLine.setText( stepData["parameters"]["class"] )
            if "ressource" in stepData["parameters"]:
                self.elementRessourceIdAndroidLine.setText( stepData["parameters"]["ressource"] )
            if "package" in stepData["parameters"]:
                self.elementPackageAndroidLine.setText( stepData["parameters"]["package"] )
            if "new-text" in stepData["parameters"]:
                self.valueAndroidLine2.setText( stepData["parameters"]["new-text"] )

            if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_DRAG_ELEMENT:
                if "x" in stepData["parameters"]:
                    self.endxAndroidLine.setText( stepData["parameters"]["x"] )
                if "y" in stepData["parameters"]:
                    self.endyAndroidLine.setText( stepData["parameters"]["y"] )
                
            if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_TYPE_TEXT_ELEMENT:
                if stepData["parameters"]["from-cache"]:
                    self.valueAndroidCombo2.setCurrentIndex(INDEX_CACHE)
                    self.valueAndroidLine2.setValidator(self.validatorAll)
                elif stepData["parameters"]["from-alias"]:
                    self.valueAndroidCombo2.setCurrentIndex(INDEX_ALIAS)
                    self.valueAndroidLine2.setValidator(self.validatorUpper) 
                else:
                    self.valueAndroidCombo2.setCurrentIndex(INDEX_TEXT)
                    self.valueAndroidLine2.setValidator(self.validatorAll)
                
            if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_GET_TEXT_ELEMENT:
                self.valueTextCacheGlobalLine.setText ( stepData["parameters"]["cache-key"] )

        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_CLICK_POSITION]:
            if "x" in stepData["parameters"]:
                self.xAndroidLine.setText( stepData["parameters"]["x"] )
            if "y" in stepData["parameters"]:
                self.yAndroidLine.setText( stepData["parameters"]["y"] )
                
        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_DRAG_POSITION, GuiSteps.ANDROID_SWIPE_POSITION]:
            if "start-x" in stepData["parameters"]:
                self.startXAndroidLine.setText( stepData["parameters"]["start-x"] )
            if "start-y" in stepData["parameters"]:
                self.startYAndroidLine.setText( stepData["parameters"]["start-y"] )
            if "stop-x" in stepData["parameters"]:
                self.stopXAndroidLine.setText( stepData["parameters"]["stop-x"] )
            if "stop-y" in stepData["parameters"]:
                self.stopYAndroidLine.setText( stepData["parameters"]["stop-y"] )

        if self.actionsAndroidComboBox.currentText() == GuiSteps.ANDROID_TYPE_KEYCODE:
            self.codeAndroidLine.setText( stepData["misc"] )
            
        if self.actionsAndroidComboBox.currentText() in [ GuiSteps.ANDROID_TYPE_SHORTCUT ]:
            # set default
            for i in xrange(self.shortcutAndroidComboBox.count()):
                item_text = self.shortcutAndroidComboBox.itemText(i)
                if unicode(stepData["misc"]) == unicode(item_text):
                    self.shortcutAndroidComboBox.setCurrentIndex(i)
                    break
Exemplo n.º 10
0
class LDSControls(QFrame):
        
    STATIC_IMG = ('error_static.png','linz_static.png','busy_static.png','clean_static.png')
    ANIM_IMG   = ('error.gif','linz.gif','layer.gif','clean.gif')
    
    IMG_SPEED  = 100
    IMG_WIDTH  = 64
    IMG_HEIGHT = 64
    
    MAX_WD = 450
    
    GD_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../bin/gdal/gdal-data'))
    STATUS = LU.enum('ERROR','IDLE','BUSY','CLEAN')
    
    def __init__(self,parent):
        super(LDSControls, self).__init__()
        self.parent = parent
        self.initConf()
        self.initEPSG()
        self.initUI()
        
    def initConf(self):
        '''Read files in conf dir ending in conf'''
        self.cflist = ConfigInitialiser.getConfFiles()
        #self.imgset = self.STATIC_IMG if ConfigWrapper().readDSProperty('Misc','indicator')=='static' else self.ANIM_IMG
        #self.imgset = self.STATIC_IMG if self.parent.confconn.tp.src.confwrap.readDSProperty('Misc','indicator')=='static' else self.ANIM_IMG
        sep = self.parent.confconn.reg.openEndPoint(self.parent.confconn.SRCNAME,self.parent.confconn.uconf)
        self.imgset = self.STATIC_IMG if sep.confwrap.readDSProperty('Misc','indicator')=='static' else self.ANIM_IMG
        self.parent.confconn.reg.closeEndPoint(self.parent.confconn.SRCNAME)
        
    def initEPSG(self):
        '''Read GDAL EPSG files, splitting by NZ(RSR) and RestOfTheWorld'''

        gcsf = gdal.FindFile('gdal','gcs.csv') 
        if not gcsf:
            gcsf = os.path.join(self.GD_PATH,'gcs.csv')
        pcsf = gdal.FindFile('gdal','pcs.csv') 
        if not pcsf: 
            pcsf = os.path.join(self.GD_PATH,'pcs.csv')
        gcs = ConfigInitialiser.readCSV(gcsf)
        pcs = ConfigInitialiser.readCSV(pcsf)

        self.nzlsr = [(e[0],e[0]+' - '+e[3]) for e in gcs if 'NZGD'     in e[1] or  'RSRGD'     in e[1]] \
                   + [(e[0],e[0]+' - '+e[1]) for e in pcs if 'NZGD'     in e[1] or  'RSRGD'     in e[1]]
        self.rowsr = [(e[0],e[0]+' - '+e[3]) for e in gcs if 'NZGD' not in e[1] and 'RSRGD' not in e[1]] \
                   + [(e[0],e[0]+' - '+e[1]) for e in pcs if 'NZGD' not in e[1] and 'RSRGD' not in e[1]]
                   
                   
    def initUI(self):
        
        # 0      1          2       3       4       5      6    7    8
        #'destname','lgselect','layer','uconf','group','epsg','fd','td','int'
        
        #self.rdest,rlgselect,self.rlayer,ruconf,self.rgroup,repsg,rfd,rtd,rint = readlist 
        
        QToolTip.setFont(QFont('SansSerif', 10))
        
        #labels
        destLabel = QLabel('Destination')
        lgLabel = QLabel('Group/Layer')
        epsgLabel = QLabel('EPSG')
        fromDateLabel = QLabel('From Date')
        toDateLabel = QLabel('To Date')
        confLabel = QLabel('User Config')
        
        self.view = QLabel() 
        self.view.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.view.setAlignment(Qt.AlignCenter)

        self.confcombo = QComboBox(self)
        self.confcombo.setToolTip('Enter your user config name (file) here')
        self.confcombo.addItems(self.cflist)
        self.confcombo.setEditable(False)
        #self.confcombo.currentIndexChanged.connect(self.doLGEditUpdate)
        
        #combos
        self.lgcombo = QComboBox(self)
        self.lgcombo.setMaximumWidth(self.MAX_WD)
        self.lgcombo.setDuplicatesEnabled(False)
        #self.lgcombo.setInsertPolicy(QComboBox.InsertAlphabetically)#?doesnt seem to work
        self.lgcombo.setToolTip('Select either Layer or Group entry')
        self.lgcombo.setEditable(False)
        self.sepindex = None
        #self.updateLGValues()
        
        self.epsgcombo = QComboBox(self)
        self.epsgcombo.setMaximumWidth(self.MAX_WD)
        self.epsgcombo.setToolTip('Setting an EPSG number here determines the output SR of the layer')  
        self.epsgcombo.addItems([i[1] for i in self.nzlsr])
        self.epsgcombo.insertSeparator(len(self.nzlsr))
        self.epsgcombo.addItems([i[1] for i in self.rowsr])
        self.epsgcombo.setEditable(True)
        self.epsgcombo.setEnabled(False)
        
        self.destlist = self.getConfiguredDestinations()
        self.destcombo = QComboBox(self)
        self.destcombo.setToolTip('Choose the desired output type')   
        self.destcombo.setEditable(False)
        self.destcombo.addItems(self.destlist)

        #date selection
        self.fromdateedit = QDateEdit()
        self.fromdateedit.setCalendarPopup(True)
        self.fromdateedit.setEnabled(False)
        
        self.todateedit = QDateEdit()
        self.todateedit.setCalendarPopup(True)
        self.todateedit.setEnabled(False)
        
        #check boxes
        self.epsgenable = QCheckBox()
        self.epsgenable.setCheckState(False)
        self.epsgenable.clicked.connect(self.doEPSGEnable)       
        
        self.fromdateenable = QCheckBox()
        self.fromdateenable.setCheckState(False)
        self.fromdateenable.clicked.connect(self.doFromDateEnable)
        
        self.todateenable = QCheckBox()
        self.todateenable.setCheckState(False) 
        self.todateenable.clicked.connect(self.doToDateEnable)
        
        self.progressbar = QProgressBar()
        self.progressbar.setRange(0,100)
        self.progressbar.setVisible(True)
        self.progressbar.setMinimumWidth(self.MAX_WD)
        
        
        #buttons        
        self.initbutton = QPushButton("waiting")
        self.initbutton.setToolTip('Initialise the Layer Configuration')
        self.initbutton.clicked.connect(self.doInitClickAction)
        
        self.cleanbutton = QPushButton("Clean")
        self.cleanbutton.setToolTip('Clean the selected layer/group from local storage')
        self.cleanbutton.clicked.connect(self.doCleanClickAction)
        
        self.replicatebutton = QPushButton("Replicate")
        self.replicatebutton.setToolTip('Execute selected replication')
        self.replicatebutton.clicked.connect(self.doReplicateClickAction)
        
        self.cancelbutton = QPushButton("Close")
        self.cancelbutton.setToolTip('Close the LDS Replicate application')       
        self.cancelbutton.clicked.connect(self.parent.close)


        #set dialog values using GPR
        self.updateGUIValues(self.parent.gvs)
        
        #set onchange here otherwise we get circular initialisation
        self.destcombo.currentIndexChanged.connect(self.doDestChanged)
        self.confcombo.currentIndexChanged.connect(self.doConfChanged)
        self.lgcombo.currentIndexChanged.connect(self.doLGComboChanged)

        self.setStatus(self.STATUS.IDLE)
        
        #grid
        grid = QGridLayout()
        grid.setSpacing(10)
        
        
        #placement section ------------------------------------
        #---------+---------+--------+---------+--------
        # dest LB |         | dest DD
        # grp LB  |         | grp DD
        # conf LB |         | conf DD
        # epsg L  | epsg CB | epsg DD
        # f dt L  | f dt CB | f dt DD
        # t td L  | t td CB | t td DD
        # icon    |       <- progress ->
        # layer B | <- . -> |repl B  | clean B | close B 
        #---------+---------+--------+---------+--------

        grid.addWidget(destLabel, 1, 0)
        grid.addWidget(self.destcombo, 1, 2)

        #grid.addWidget(layerLabel, 2, 0)
        grid.addWidget(lgLabel, 2, 0)
        grid.addWidget(self.lgcombo, 2, 2)
        
        grid.addWidget(confLabel, 3, 0)
        grid.addWidget(self.confcombo, 3, 2)
        
        #grid.addWidget(groupLabel, 4, 0)
        #grid.addWidget(self.groupEdit, 4, 2)
        
        grid.addWidget(epsgLabel, 5, 0)
        grid.addWidget(self.epsgenable, 5, 1)
        grid.addWidget(self.epsgcombo, 5, 2)

        grid.addWidget(fromDateLabel, 6, 0)
        grid.addWidget(self.fromdateenable, 6, 1)
        grid.addWidget(self.fromdateedit, 6, 2)
        
        grid.addWidget(toDateLabel, 7, 0)
        grid.addWidget(self.todateenable, 7, 1)
        grid.addWidget(self.todateedit, 7, 2)
        
        hbox3 = QHBoxLayout()
        hbox3.addWidget(self.view) 
        hbox3.addStretch(1)
        hbox3.addWidget(self.progressbar)

        #hbox3.addLayout(vbox2)
        #hbox3.addLayout(vbox3)
        
        hbox4 = QHBoxLayout()
        hbox4.addWidget(self.initbutton)
        hbox4.addStretch(1)
        hbox4.addWidget(self.replicatebutton)
        hbox4.addWidget(self.cleanbutton)
        hbox4.addWidget(self.cancelbutton)
        

        vbox = QVBoxLayout()
        #vbox.addStretch(1)
        vbox.addLayout(grid)
        vbox.addLayout(hbox3)
        vbox.addLayout(hbox4)
        
        self.setLayout(vbox)  
       
    #def setProgress(self,pct):
    #    self.progressbar.setValue(pct)
        
    def setStatus(self,status,message='',tooltip=None):
        '''Sets indicator icon and statusbar message'''
        self.parent.statusbar.showMessage(message)
        self.parent.statusbar.setToolTip(tooltip if tooltip else '')

        #progress
        loc = os.path.abspath(os.path.join(IMG_LOC,self.imgset[status]))
        #loc = os.path.abspath(os.path.join(os.path.dirname(__file__),self.parent.IMG_LOC,self.imgset[status]))
        self.progressbar.setVisible(status in (self.STATUS.BUSY, self.STATUS.CLEAN))
        
        #icon
        anim = QMovie(loc, QByteArray(), self)
        anim.setScaledSize(QSize(self.IMG_WIDTH,self.IMG_HEIGHT))
        anim.setCacheMode(QMovie.CacheAll)
        anim.setSpeed(self.IMG_SPEED)
        self.view.clear()
        self.view.setMovie(anim)
        anim.start()

        self.view.repaint()
        QApplication.processEvents(QEventLoop.AllEvents)

    def mainWindowEnable(self,enable=True):
        cons = (self.lgcombo, self.confcombo, self.destcombo, 
                self.initbutton, self.replicatebutton, self.cleanbutton, self.cancelbutton,
                self.epsgenable,self.fromdateenable,self.todateenable,
                self.parent.menubar)
        for c in cons:
            c.setEnabled(enable)
            
        if enable:
            self.epsgcombo.setEnabled(self.epsgenable.checkState())
            self.fromdateedit.setEnabled(self.fromdateenable.checkState())
            self.todateedit.setEnabled(self.todateenable.checkState())
        else:
            self.epsgcombo.setEnabled(False)
            self.fromdateedit.setEnabled(False)
            self.todateedit.setEnabled(False)
   
        QApplication.restoreOverrideCursor() if enable else QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) 

    def refreshLGCombo(self):
        '''Re index LG combobox since a refreshLG call (new dest?) will usually mean new groups'''
        self.lgcombo.clear()
        self.lgcombo.addItems([i[2] for i in self.parent.confconn.lglist])
        #NOTE the separator consumes an index, if not clearing the combobox selectively remove the old sepindex (assumes g preceeds l)
        #if self.sepindex:
        #    self.lgcombo.removeItem(self.sepindex)
        self.sepindex = [i[0] for i in self.parent.confconn.lglist].count(LORG.GROUP)
        self.lgcombo.insertSeparator(self.sepindex)
        
    def updateLGValues(self,uconf,lgval,dest):
        '''Sets the values displayed in the Layer/Group combo'''
        #because we cant seem to sort combobox entries and want groups at the top, clear and re-add
        #TRACE#        
        #pdb.set_trace()
        sf = None
        try:
            self.parent.confconn.initConnections(uconf,lgval,dest)
        except Exception as e:
            sf=1
            ldslog.error('Error Updating UC Values. '+str(e))
            
        if sf:
            self.setStatus(self.STATUS.ERROR,'Error Updating UC Values', str(e))
        else:
            self.setStatus(self.STATUS.IDLE)
            
        self.refreshLGCombo()
        
    def centre(self):
        
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
        
    
    def gprParameters(self,rdest):
        '''Zip default and GPR values'''
        return [x if LU.assessNone(x) else y for x,y in zip(self.parent.gpr.readsec(rdest),self.parent.DEF_RVALS[1:])]
    
    def getLCE(self,ln):
        '''Read layer parameters'''
        dep = self.parent.confconn.reg.openEndPoint(self.parent.confconn.destname,self.parent.confconn.uconf)
        #sep = self.parent.confconn.reg.openEndPoint('WFS',self.parent.confconn.uconf)
        self.parent.confconn.reg.setupLayerConfig(self.parent.confconn.tp,None,dep,initlc=False)
        lce = dep.getLayerConf().readLayerParameters(ln)
        #self.parent.confconn.reg.closeEndPoint('WFS')
        self.parent.confconn.reg.closeEndPoint(self.parent.confconn.destname)
        sep,dep = None,None
        return lce
    
    
    def doDestChanged(self):
        '''Read the destname parameter and fill dialog with matching GPR values'''
        rdest = str(self.destlist[self.destcombo.currentIndex()])
        rvals = self.gprParameters(rdest)
        self.updateGUIValues([rdest]+rvals)    
        
        
    def doConfChanged(self):
        '''Read the user conf parameter and fill dialog with matching GPR values'''
        rdest = str(self.destlist[self.destcombo.currentIndex()])
        rlg,_,rep,rfd,rtd = self.gprParameters(rdest)
        ruc = str(self.cflist[self.confcombo.currentIndex()])
        self.updateGUIValues((rdest,rlg,ruc,rep,rfd,rtd))
        
        
    def doLGComboChanged(self):
        '''Read the layer/group value and change epsg to layer or gpr match'''
        #get a matching LG entry and test whether its a layer or group
        #lgi = self.parent.confconn.getLayerGroupIndex(self.lgcombo.currentText().toUtf8().data())
        lgi = self.parent.confconn.getLayerGroupIndex(LQ.readWidgetText(self.lgcombo.currentText()))
        #lgi can be none if we init a new group, in which case we use the GPR value
        if lgi:
            lge = self.parent.confconn.lglist[lgi]
            lce = self.getLCE(lge[1]) if lge[0]==LORG.LAYER else None
        else:
            lce = None
        
        #look for filled layer conf epsg OR use prefs stored in gpr
        if lce and LU.assessNone(lce.epsg):
            epsgval = lce.epsg
        else:
            rdest = str(self.destlist[self.destcombo.currentIndex()])
            _,_,epsgval,_,_ = self.gprParameters(rdest)
        epsgindex = [i[0] for i in self.nzlsr+[(0,0)]+self.rowsr].index(epsgval)
        if self.epsgcombo.currentIndex() != epsgindex:
            self.epsgcombo.setCurrentIndex(int(epsgindex))

        
    def updateGUIValues(self,readlist):
        '''Fill dialog values from provided list'''
        #TODO. Remove circular references when setCurrentIndex() triggers do###Changed()
        #Read user input
        rdest,self.rlgval,ruconf,repsg,rfd,rtd = readlist
        
        #--------------------------------------------------------------------
        
        #Destination Menu
        selecteddest = LU.standardiseDriverNames(rdest)
        if selecteddest not in self.destlist:
            self.destlist = self.getConfiguredDestinations()
            self.destcombo.addItem(selecteddest)
        destindex = self.destlist.index(selecteddest) if selecteddest else 0
        
        if self.destcombo.currentIndex() != destindex:
            self.destcombo.setCurrentIndex(destindex)
        
        #InitButton
        self.initbutton.setText('Layer Select')
        
        #Config File
        confindex = 0
        if LU.assessNone(ruconf):
            ruconf = ruconf.split('.')[0]
            if ruconf not in self.cflist:
                self.cflist += [ruconf,]
                self.confcombo.addItem(ruconf)
            confindex = self.cflist.index(ruconf)
            
        if self.confcombo.currentIndex() != confindex:
            self.confcombo.setCurrentIndex(confindex)
        #self.confEdit.setText(ruconf if LU.assessNone(ruconf) else '')
        
        #Layer/Group Selection
        self.updateLGValues(ruconf,self.rlgval,rdest)
        lgindex = None
        if LU.assessNone(self.rlgval):
            #index of list value
            lgindex = self.parent.confconn.getLayerGroupIndex(self.rlgval,col=1)
            
        if LU.assessNone(lgindex):
            #advance by 1 for sep
            lgindex += 1 if lgindex>self.sepindex else 0 
        else:
            #using the separator index sets the combo to blank
            lgindex = self.sepindex
        if self.lgcombo.currentIndex() != lgindex:
            self.lgcombo.setCurrentIndex(lgindex)
        #self.doLGEditUpdate()
        
        #EPSG
        #                                user > layerconf
        #useepsg = LU.precedence(repsg, lce.epsg if lce else None, None)
        epsgindex = [i[0] for i in self.nzlsr+[(None,None)]+self.rowsr].index(repsg)
        if self.epsgcombo.currentIndex() != epsgindex:
            self.epsgcombo.setCurrentIndex(epsgindex)
            
        #epsgedit = self.epsgcombo.lineEdit()
        #epsgedit.setText([e[1] for e in self.nzlsr+self.rowsr if e[0]==repsg][0])
        
        #epsgedit.setText([e for e in self.nzlsr+self.rowsr if re.match('^\s*(\d+).*',e).group(1)==repsg][0])
        
        #To/From Dates
        if LU.assessNone(rfd):
            self.fromdateedit.setDate(QDate(int(rfd[0:4]),int(rfd[5:7]),int(rfd[8:10])))
        else:
            early = DataStore.EARLIEST_INIT_DATE
            self.fromdateedit.setDate(QDate(int(early[0:4]),int(early[5:7]),int(early[8:10])))
            
        if LU.assessNone(rtd):
            self.todateedit.setDate(QDate(int(rtd[0:4]),int(rtd[5:7]),int(rtd[8:10]))) 
        else:
            today = DataStore.getCurrent()
            self.todateedit.setDate(QDate(int(today[0:4]),int(today[5:7]),int(today[8:10])))
            
        #Internal/External CheckBox
#        if LU.assessNone(rint):
#            self.internalTrigger.setChecked(rint.lower()==DataStore.CONF_INT)
#        else:
#            self.internalTrigger.setChecked(DataStore.DEFAULT_CONF==DataStore.CONF_INT)
        
        
    def getConfiguredDestinations(self):
        defml = ['',]+DataStore.DRIVER_NAMES.values()
        return [d for d in self.parent.gpr.getDestinations() if d in defml]
        
    def doEPSGEnable(self):
        self.epsgcombo.setEnabled(self.epsgenable.isChecked())
        
    def doFromDateEnable(self):
        self.fromdateedit.setEnabled(self.fromdateenable.isChecked())
          
    def doToDateEnable(self):
        self.todateedit.setEnabled(self.todateenable.isChecked())  
          
    def readParameters(self):
        '''Read values out of dialogs'''
        destination = LU.assessNone(str(self.destlist[self.destcombo.currentIndex()]))
        #lgindex = self.parent.confconn.getLayerGroupIndex(self.lgcombo.currentText().toUtf8().data())
        lgindex = self.parent.confconn.getLayerGroupIndex(LQ.readWidgetText(self.lgcombo.currentText()))
        #NB need to test for None explicitly since zero is a valid index
        lgval = self.parent.confconn.lglist[lgindex][1] if LU.assessNone(lgindex) else None       
        #uconf = LU.standardiseUserConfigName(str(self.confcombo.lineEdit().text()))
        #uconf = str(self.confcombo.lineEdit().text())
        uconf = str(self.cflist[self.confcombo.currentIndex()])
        ee = self.epsgenable.isChecked()
        epsg = None if ee is False else re.match('^\s*(\d+).*',str(self.epsgcombo.lineEdit().text())).group(1)
        fe = self.fromdateenable.isChecked()
        te = self.todateenable.isChecked()
        fd = None if fe is False else str(self.fromdateedit.date().toString('yyyy-MM-dd'))
        td = None if te is False else str(self.todateedit.date().toString('yyyy-MM-dd'))
        
        return destination,lgval,uconf,epsg,fe,te,fd,td
    
    def doInitClickAction(self):
        '''Initialise the LC on LC-button-click, action'''
        try:
            try:
                self.setStatus(self.STATUS.BUSY,'Opening Layer-Config Editor')  
                self.progressbar.setValue(0)
                self.parent.runLayerConfigAction()
            finally:
                self.setStatus(self.STATUS.IDLE,'Ready')
        except Exception as e:
            self.setStatus(self.STATUS.ERROR,'Error in Layer-Config',str(sys.exc_info()))#e))
        
    def doCleanClickAction(self):
        '''Set clean anim and run clean'''
        #lgo = self.lgcombo.currentText().toUtf8().data()
        lgo = LQ.readWidgetText(self.lgcombo.currentText())
        
        try:
            self.setStatus(self.STATUS.CLEAN,'Running Clean '+lgo)
            self.progressbar.setValue(0)
            self.runReplicationScript(True)
        except Exception as e:
            self.setStatus(self.STATUS.ERROR,'Failed Clean of '+lgo,str(sys.exc_info()))#e))
        
    def doReplicateClickAction(self):
        '''Set busy anim and run repl'''
        lgo = self.lgcombo.currentText()#.toUtf8().data()#only used for error messages
        try:
            self.setStatus(self.STATUS.BUSY,'Running Replicate '+lgo)
            self.progressbar.setValue(0)
            self.runReplicationScript(False)
        except Exception as e:
            self.setStatus(self.STATUS.ERROR,'Failed Replication of '+lgo,str(sys.exc_info()))#e))

    def runReplicationScript(self,clean=False):
        '''Run the layer/group repliction script'''
        destination,lgval,uconf,epsg,fe,te,fd,td = self.readParameters()
        uconf_path = LU.standardiseUserConfigName(uconf)
        destination_path = LU.standardiseLayerConfigName(destination)
        destination_driver = LU.standardiseDriverNames(destination)

        if not os.path.exists(uconf_path):
            self.userConfMessage(uconf_path)
            return
        elif not MainFileReader(uconf_path).hasSection(destination_driver):
            self.userConfMessage(uconf_path,destination_driver)
            return
        #-----------------------------------------------------
        #'destname','layer','uconf','group','epsg','fd','td','int'
     
        self.parent.gpr.write((destination_driver,lgval,uconf,epsg,fd,td))        
        ldslog.info(u'dest={0}, lg={1}, conf={2}, epsg={3}'.format(destination_driver,lgval,uconf,epsg))
        ldslog.info('fd={0}, td={1}, fe={2}, te={3}'.format(fd,td,fe,te))
        lgindex = self.parent.confconn.getLayerGroupIndex(lgval,col=1)
        #lorg = self.parent.confconn.lglist[lgindex][0]
        #----------don't need lorg in TP anymore but it is useful for sorting/counting groups
        #self.parent.confconn.tp.setLayerOrGroup(lorg)
        self.parent.confconn.tp.setLayerGroupValue(lgval)
        if self.fromdateenable.isChecked(): self.parent.confconn.tp.setFromDate(fd)
        if self.todateenable.isChecked(): self.parent.confconn.tp.setToDate(td)
        self.parent.confconn.tp.setUserConf(uconf)
        if self.epsgenable: self.parent.confconn.tp.setEPSG(epsg)
        
        #because clean state persists in TP
        if clean:
            self.parent.confconn.tp.setCleanConfig()
        else:
            self.parent.confconn.tp.clearCleanConfig()
        #(re)initialise the data source since uconf may have changed
        #>>#self.parent.confconn.tp.src = self.parent.confconn.initSourceWrapper()
        #--------------------------
        ###ep = self.parent.confconn.reg.openEndPoint(self.parent.confconn.destname,self.parent.confconn.uconf)
        
        ###self.parent.confconn.reg.closeEndPoint(self.parent.confconn.destname)
        ###ep = None
        #Open ProcessRunner and run with TP(proc)/self(gui) instances
        #HACK temp add of dest_drv to PR call
        try:
            #TODO. Test for valid LC first
            self.tpr = ProcessRunner(self,destination_driver)
        except Exception as e:
            ldslog.error('Cannot create ProcessRunner {}. NB Possible missing Layer Config {}'.format(str(e),destination_path))
            self.layerConfMessage(destination_path)
            return
        #If PR has been successfully created we must vave a valid dst    
        self.tpr.start()
        
    def quitProcessRunner(self):
        self.tpr.join()
        self.tpr.quit()
        self.trp = None

        
    def userConfMessage(self,uconf,secname=None):
        ucans = QMessageBox.warning(self, 'User Config Missing/Incomplete', 
                                'Specified User-Config file, '+str(uconf)+' does not exist' if secname is None else 'User-Config file does not contain '+str(secname)+' section', 
                                'Back','Initialise User Config')
        if not ucans:
            #Retry
            ldslog.warn('Retry specifying UC')
            #self.confcombo.setCurrentIndex(0)
            return
        #Init
        ldslog.warn('Reset User Config Wizard')
        self.parent.runWizardAction()


    def layerConfMessage(self,dest):
        lcans = QMessageBox.warning(self, 'Layer Config Missing', 
                                'Required Layer-Config file, '+str(dest)+' does not exist', 
                                'Back','Run Layer Select')
        if not lcans:
            #Retry
            ldslog.warn('Retry specifying LC')
            #self.destcombo.setCurrentIndex(0)
            return
        #Init
        ldslog.warn('Reset Layer Config')
        self.doInitClickAction()
Exemplo n.º 11
0
class WSystem(QWidget, Logger.ClassLogger):
    """
    System widget
    """
    # action, description, misc, parameters
    AddStep = pyqtSignal(str, str, str, dict)
    UpdateStep = pyqtSignal(str, str, str, dict)
    CancelEdit = pyqtSignal()

    def __init__(self, parent):
        """
        Constructor
        """
        QWidget.__init__(self)

        self.createActions()
        self.createWidgets()
        self.createToolbar()
        self.createConnections()

    def createActions(self):
        """
        Create qt actions
        """
        self.addAction = QPushButton(QIcon(":/add_black.png"), '&Add Action',
                                     self)
        self.addAction.setMinimumHeight(40)
        self.addAction.setMaximumWidth(150)
        self.cancelAction = QtHelper.createAction(self,
                                                  "&Cancel",
                                                  self.cancelStep,
                                                  icon=QIcon(":/undo.png"),
                                                  tip='Cancel update')
        self.cancelAction.setEnabled(False)

        self.optionsAction = QtHelper.createAction(
            self,
            "&",
            self.openOptions,
            icon=QIcon(":/system-small.png"),
            tip='System options')

    def openOptions(self):
        """
        Open options dialog
        """
        if self.optionsDialog.exec_() == QDialog.Accepted:
            pass

    def createWidgets(self):
        """
        Create qt widgets
        """
        self.optionsDialog = OptionsDialog(self)

        self.validatorUpper = ValidatorUpper(self)
        self.validatorAll = ValidatorAll(self)
        self.validatorInt = QIntValidator(self)

        self.actionsComboBox = QComboBox(self)
        self.actionsComboBox.setMinimumHeight(40)
        for i in xrange(len(GuiSteps.ACTION_SYSTEM_DESCR)):
            if not len(GuiSteps.ACTION_SYSTEM_DESCR[i]):
                self.actionsComboBox.insertSeparator(i + 1)
            else:
                el = GuiSteps.ACTION_SYSTEM_DESCR[i].keys()
                self.actionsComboBox.addItem(list(el)[0])

        self.labelActionDescr = QLabel(self)
        self.labelActionDescr.hide()
        self.descriptionLine = QLineEdit(self)
        self.descriptionLine.setPlaceholderText("Step purpose description")
        self.descriptionLine.hide()

        actionsLayout = QHBoxLayout()
        actionsLayout.addWidget(self.actionsComboBox)

        actionLayout1 = QGridLayout()
        actionLayout1.addLayout(actionsLayout, 0, 1)

        self.createWidgetSession()
        self.createWidgetText()
        self.createWidgetShortcut()
        self.createWidgetScreen()

        actionLayout2 = QGridLayout()
        actionLayout2.addWidget(self.sessionGroup, 1, 0)
        actionLayout2.addWidget(self.textGroup, 1, 0)
        actionLayout2.addWidget(self.shortcutGroup, 1, 0)
        actionLayout2.addWidget(self.screenGroup, 1, 0)

        font = QFont()
        font.setBold(True)

        labelAct = QLabel(self.tr("Action: "))
        labelAct.setFont(font)

        self.arrowLabel = QLabel("")
        self.arrowLabel.setPixmap(
            QPixmap(":/arrow-right.png").scaledToWidth(32))

        self.arrowLabel2 = QLabel("")
        self.arrowLabel2.setPixmap(
            QPixmap(":/arrow-right.png").scaledToWidth(32))

        layoutFinal = QHBoxLayout()
        layoutFinal.addWidget(labelAct)
        layoutFinal.addLayout(actionLayout1)
        layoutFinal.addWidget(self.arrowLabel)
        layoutFinal.addLayout(actionLayout2)
        layoutFinal.addWidget(self.arrowLabel2)
        layoutFinal.addWidget(self.addAction)

        layoutFinal.addStretch(1)
        self.setLayout(layoutFinal)

    def createToolbar(self):
        """
        Create toolbar
        """
        pass

    def createWidgetScreen(self):
        """
        Create screen widget
        """
        self.screenGroup = QGroupBox(self.tr(""))

        # text
        self.checkComboBox = QComboBox(self)
        self.checkComboBox.addItems([
            GuiSteps.OP_ANY, GuiSteps.OP_CONTAINS, GuiSteps.OP_NOTCONTAINS,
            GuiSteps.OP_REGEXP, GuiSteps.OP_NOTREGEXP, GuiSteps.OP_STARTSWITH,
            GuiSteps.OP_NOTSTARTSWITH, GuiSteps.OP_ENDSWITH,
            GuiSteps.OP_NOTENDSWITH
        ])

        self.screenLine = QLineEdit(self)
        self.screenLine.setMinimumWidth(300)
        self.screenLine.setEnabled(False)
        self.screenLine.hide()
        self.screenArea = QTextEdit(self)
        self.screenArea.setMinimumWidth(300)
        self.screenArea.setEnabled(False)

        self.screenCombo = QComboBox(self)
        self.screenCombo.addItems(LIST_TYPES)
        self.screenCombo.setEnabled(False)

        self.screenSaveCombo = QComboBox(self)
        self.screenSaveCombo.addItems(["VARIABLE", "CACHE"])
        self.screenSaveLine = QLineEdit(self)
        self.screenSaveLine.setMinimumWidth(300)
        self.screenSaveLine.setEnabled(False)

        mainTextlayout = QGridLayout()
        mainTextlayout.addWidget(QLabel(self.tr("Checking if the screen: ")),
                                 0, 0)
        mainTextlayout.addWidget(self.checkComboBox, 0, 1)
        mainTextlayout.addWidget(QLabel(self.tr("The value:")), 1, 0)
        mainTextlayout.addWidget(self.screenCombo, 1, 1)
        mainTextlayout.addWidget(self.screenLine, 2, 1)
        mainTextlayout.addWidget(self.screenArea, 2, 1)
        mainTextlayout.addWidget(QLabel(self.tr("And save the screen in:")), 0,
                                 2)
        mainTextlayout.addWidget(self.screenSaveCombo, 1, 2)
        mainTextlayout.addWidget(self.screenSaveLine, 2, 2)

        self.screenGroup.setLayout(mainTextlayout)
        self.screenGroup.hide()

    def createWidgetText(self):
        """
        Create text widget
        """
        self.textGroup = QGroupBox(self.tr(""))

        # text
        self.textLine = QLineEdit(self)
        self.textLine.setMinimumWidth(300)
        self.textCombo = QComboBox(self)
        self.textCombo.addItems(LIST_TYPES)

        mainTextlayout = QGridLayout()
        mainTextlayout.addWidget(QLabel(self.tr("Send the value:")), 0, 0)
        mainTextlayout.addWidget(self.textCombo, 0, 1)
        mainTextlayout.addWidget(self.textLine, 0, 2)

        self.textGroup.setLayout(mainTextlayout)
        self.textGroup.hide()

    def createWidgetShortcut(self):
        """
        Create shortcut widget
        """
        self.shortcutGroup = QGroupBox(self.tr(""))

        # text
        self.shortcutComboBox = QComboBox()
        self.shortcutComboBox.addItems([KEY_CTRLC, KEY_ENTER])
        self.shortcutComboBox.setMinimumWidth(300)

        mainTextlayout = QGridLayout()
        mainTextlayout.addWidget(QLabel(self.tr("Shortcut:")), 0, 0)
        mainTextlayout.addWidget(self.shortcutComboBox, 0, 1)

        self.shortcutGroup.setLayout(mainTextlayout)
        self.shortcutGroup.hide()

    def createWidgetSession(self):
        """
        Create session widget
        """
        self.sessionGroup = QGroupBox(self.tr(""))

        # login
        self.loginLine = QLineEdit(self)
        self.loginLine.setMinimumWidth(300)
        self.loginCombo = QComboBox(self)
        self.loginCombo.addItems(LIST_TYPES)

        # password
        self.pwdLine = QLineEdit(self)
        self.pwdLine.setMinimumWidth(300)
        self.pwdCombo = QComboBox(self)
        self.pwdCombo.addItems(LIST_TYPES)

        # ip
        self.ipLine = QLineEdit(self)
        self.ipLine.setMinimumWidth(300)
        self.ipCombo = QComboBox(self)
        self.ipCombo.addItems(LIST_TYPES)

        # port
        self.portLine = QLineEdit(self)
        self.portLine.setMinimumWidth(300)
        self.portLine.setText("22")
        self.portLine.setValidator(self.validatorInt)
        self.portCombo = QComboBox(self)
        self.portCombo.addItems(LIST_TYPES)

        # agent support
        self.useAgent = QCheckBox("Use with agent mode")

        mainTextlayout = QGridLayout()
        mainTextlayout.addWidget(QLabel(self.tr("Host:")), 0, 0)
        mainTextlayout.addWidget(self.ipCombo, 0, 1)
        mainTextlayout.addWidget(self.ipLine, 0, 2)
        mainTextlayout.addWidget(QLabel(self.tr("Port (optional):")), 1, 0)
        mainTextlayout.addWidget(self.portCombo, 1, 1)
        mainTextlayout.addWidget(self.portLine, 1, 2)
        mainTextlayout.addWidget(QLabel(self.tr("Login:"******"Password:"******"""
        Create qt connections
        """
        self.actionsComboBox.currentIndexChanged.connect(self.onActionChanged)
        self.addAction.clicked.connect(self.addStep)

        self.ipCombo.currentIndexChanged.connect(self.onIpTypeChanged)
        self.portCombo.currentIndexChanged.connect(self.onPortTypeChanged)
        self.loginCombo.currentIndexChanged.connect(self.onLoginTypeChanged)
        self.pwdCombo.currentIndexChanged.connect(self.onPwdTypeChanged)

        self.textCombo.currentIndexChanged.connect(self.onTextTypeChanged)
        self.screenCombo.currentIndexChanged.connect(self.onScreenTypeChanged)
        self.checkComboBox.currentIndexChanged.connect(
            self.onScreenOperatorChanged)
        self.screenSaveCombo.currentIndexChanged.connect(
            self.onScreenSaveChanged)

    def pluginDataAccessor(self):
        """
        Return data to plugin
        """
        return {"data": ""}

    def onPluginImport(self, dataJson):
        """
        Received data from plugins
        """
        if "steps" not in dataJson:
            QMessageBox.warning(self, "Assistant Automation", "bad import")
            return

        if not isinstance(dataJson['steps'], list):
            QMessageBox.warning(self, "Assistant Automation", "bad import")
            return

        if not ('ip' in dataJson and 'login' in dataJson
                and 'password' in dataJson):
            QMessageBox.warning(self, "Assistant Automation", "bad import")
            return

        # emit open session
        parameters = {
            'dest-ip': dataJson['ip'],
            'dest-port': 22,
            'login': dataJson['login'],
            'password': dataJson['password'],
            'from-cache-ip': False,
            'from-alias-ip': False,
            'from-cache-port': False,
            'from-alias-port': False,
            'from-cache-login': False,
            'from-alias-login': False,
            'from-cache-pwd': False,
            'from-alias-pwd': False,
            'agent-support': False
        }
        self.AddStep.emit(GuiSteps.SYSTEM_SESSION, EMPTY_VALUE, EMPTY_VALUE,
                          parameters)

        for stp in dataJson['steps']:
            if isinstance(stp, dict):

                # new in v16
                fromCache = False
                fromAlias = False
                if "type-value" in stp:
                    if stp["type-value"].lower() == "cache": fromCache = True
                    if stp["type-value"].lower() == "alias": fromAlias = True
                # end of new

                if stp["action-name"] == "SEND":
                    parameters = {
                        'text': stp["action-value"],
                        'from-cache': fromCache,
                        'from-alias': fromAlias
                    }
                    self.AddStep.emit(GuiSteps.SYSTEM_TEXT, EMPTY_VALUE,
                                      EMPTY_VALUE, parameters)
                elif stp["action-name"] == "EXPECT":
                    op = "Contains"
                    if stp["action-type"] == "REGEX":
                        op = "RegEx"
                    parameters = {
                        'value': stp["action-value"],
                        'from-cache': fromCache,
                        'from-alias': fromAlias,
                        'operator': op,
                        'to-cache': False,
                        'cache-key': ''
                    }
                    self.AddStep.emit(GuiSteps.SYSTEM_CHECK_SCREEN,
                                      EMPTY_VALUE, EMPTY_VALUE, parameters)
                else:
                    QMessageBox.warning(
                        self, "Assistant Automation",
                        "action not yet supported: %s" % stp["action-name"])

        # close
        self.AddStep.emit(GuiSteps.SYSTEM_CLOSE, EMPTY_VALUE, EMPTY_VALUE, {})

    def onScreenOperatorChanged(self):
        """
        On screen operator changed
        """
        if self.checkComboBox.currentText() == GuiSteps.OP_ANY:
            self.screenLine.setEnabled(False)
            self.screenArea.setEnabled(False)
            self.screenCombo.setEnabled(False)
        else:
            self.screenLine.setEnabled(True)
            self.screenArea.setEnabled(True)
            self.screenCombo.setEnabled(True)

    def onScreenSaveChanged(self):
        """
        On screen save changed
        """
        if self.screenSaveCombo.currentText() == "VARIABLE":
            self.screenSaveLine.setEnabled(False)
        else:
            self.screenSaveLine.setEnabled(True)

    def onScreenTypeChanged(self):
        """
        On screen type changed
        """
        if self.screenCombo.currentText() in ["TEXT"]:
            self.screenArea.show()
            self.screenLine.hide()
        else:
            self.screenLine.show()
            self.screenArea.hide()
            if self.screenCombo.currentText() in ["CACHE"]:
                self.screenLine.setValidator(self.validatorAll)

            if self.screenCombo.currentText() == "ALIAS":
                self.screenLine.setText(self.screenLine.text().upper())
                self.screenLine.setValidator(self.validatorUpper)

    def onTextTypeChanged(self):
        """
        On text type changed
        """
        if self.textCombo.currentText() in ["TEXT", "CACHE"]:
            self.textLine.setValidator(self.validatorAll)

        if self.textCombo.currentText() == "ALIAS":
            self.textLine.setText(self.textLine.text().upper())
            self.textLine.setValidator(self.validatorUpper)

    def onLoginTypeChanged(self):
        """
        On login type changed
        """
        if self.loginCombo.currentText() in ["TEXT", "CACHE"]:
            self.loginLine.setValidator(self.validatorAll)

        if self.loginCombo.currentText() == "ALIAS":
            self.loginLine.setText(self.loginLine.text().upper())
            self.loginLine.setValidator(self.validatorUpper)

    def onPwdTypeChanged(self):
        """
        On password type changed
        """
        if self.pwdCombo.currentText() in ["TEXT", "CACHE"]:
            self.pwdLine.setValidator(self.validatorAll)

        if self.pwdCombo.currentText() == "ALIAS":
            self.pwdLine.setText(self.pwdLine.text().upper())
            self.pwdLine.setValidator(self.validatorUpper)

    def onIpTypeChanged(self):
        """
        On ip type changed
        """
        if self.ipCombo.currentText() in ["TEXT", "CACHE"]:
            self.ipLine.setValidator(self.validatorAll)

        if self.ipCombo.currentText() == "ALIAS":
            self.ipLine.setText(self.ipLine.text().upper())
            self.ipLine.setValidator(self.validatorUpper)

    def onPortTypeChanged(self):
        """
        On port type changed
        """
        if self.portCombo.currentText() in ["TEXT"]:
            self.portLine.setText("22")
            self.portLine.setValidator(self.validatorInt)

        if self.portCombo.currentText() in ["CACHE"]:
            self.portLine.setValidator(self.validatorAll)

        if self.portCombo.currentText() == "ALIAS":
            self.portLine.setText(self.portLine.text().upper())
            self.portLine.setValidator(self.validatorUpper)

    def onActionChanged(self):
        """
        On action changed
        """
        descr = 'No description available!'
        i = 0
        for el in GuiSteps.ACTION_SYSTEM_DESCR:
            if isinstance(el, dict):
                if self.actionsComboBox.currentText() in el:
                    descr = GuiSteps.ACTION_SYSTEM_DESCR[i][
                        self.actionsComboBox.currentText()]
                    break
            i += 1
        self.labelActionDescr.setText("%s\n" % descr)

        if self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_SESSION]:
            self.sessionGroup.show()
            self.textGroup.hide()
            self.shortcutGroup.hide()
            self.screenGroup.hide()

            self.arrowLabel.show()
            self.arrowLabel2.show()

        elif self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_CLOSE]:
            self.sessionGroup.hide()
            self.textGroup.hide()
            self.shortcutGroup.hide()
            self.screenGroup.hide()

            self.arrowLabel.hide()
            self.arrowLabel2.show()

        elif self.actionsComboBox.currentText() in [
                GuiSteps.SYSTEM_CLEAR_SCREEN
        ]:
            self.sessionGroup.hide()
            self.textGroup.hide()
            self.shortcutGroup.hide()
            self.screenGroup.hide()

            self.arrowLabel.hide()
            self.arrowLabel2.show()

        elif self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_TEXT]:
            self.sessionGroup.hide()
            self.textGroup.show()
            self.shortcutGroup.hide()
            self.screenGroup.hide()

            self.arrowLabel.show()
            self.arrowLabel2.show()

        elif self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_SHORTCUT]:
            self.sessionGroup.hide()
            self.textGroup.hide()
            self.shortcutGroup.show()
            self.screenGroup.hide()

            self.arrowLabel.show()
            self.arrowLabel2.show()

        elif self.actionsComboBox.currentText() in [
                GuiSteps.SYSTEM_CHECK_SCREEN
        ]:
            self.sessionGroup.hide()
            self.textGroup.hide()
            self.shortcutGroup.hide()
            self.screenGroup.show()

            self.arrowLabel.show()
            self.arrowLabel2.show()

        else:
            self.sessionGroup.hide()
            self.textGroup.hide()
            self.shortcutGroup.hide()
            self.screenGroup.hide()

            self.arrowLabel.hide()
            self.arrowLabel2.hide()

    def addStep(self):
        """
        Add step
        """
        action = self.actionsComboBox.currentText()
        descr = self.descriptionLine.text()
        descr = unicode(descr).replace('"', '')

        signal = self.AddStep
        if self.cancelAction.isEnabled():
            signal = self.UpdateStep

        if action in [GuiSteps.SYSTEM_SESSION]:
            fromCacheIp = False
            if self.ipCombo.currentText() == "CACHE": fromCacheIp = True
            fromAliasIp = False
            if self.ipCombo.currentText() == "ALIAS": fromAliasIp = True

            fromCachePort = False
            if self.portCombo.currentText() == "CACHE": fromCachePort = True
            fromAliasPort = False
            if self.portCombo.currentText() == "ALIAS": fromAliasPort = True

            fromCacheLogin = False
            if self.loginCombo.currentText() == "CACHE": fromCacheLogin = True
            fromAliasLogin = False
            if self.loginCombo.currentText() == "ALIAS": fromAliasLogin = True

            fromCachePwd = False
            if self.pwdCombo.currentText() == "CACHE": fromCachePwd = True
            fromAliasPwd = False
            if self.pwdCombo.currentText() == "ALIAS": fromAliasPwd = True

            newIp = self.ipLine.text()
            if not len(newIp):
                QMessageBox.warning(self, "Assistant",
                                    "Please to provide a ip!")
                return

            newPort = self.portLine.text()
            if not len(newPort):
                QMessageBox.warning(self, "Assistant",
                                    "Please to provide a port!")
                return

            newLogin = self.loginLine.text()
            if not len(newLogin):
                QMessageBox.warning(self, "Assistant",
                                    "Please to provide a login!")
                return

            newPwd = self.pwdLine.text()
            agentSupport = "False"
            if self.useAgent.isChecked(): agentSupport = "True"

            parameters = {
                'dest-ip': newIp,
                'dest-port': newPort,
                'login': newLogin,
                'password': newPwd,
                'from-cache-ip': fromCacheIp,
                'from-alias-ip': fromAliasIp,
                'from-cache-port': fromCachePort,
                'from-alias-port': fromAliasPort,
                'from-cache-login': fromCacheLogin,
                'from-alias-login': fromAliasLogin,
                'from-cache-pwd': fromCachePwd,
                'from-alias-pwd': fromAliasPwd,
                'agent-support': agentSupport
            }
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, parameters)

        elif action in [GuiSteps.SYSTEM_CLOSE]:
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, {})

        elif action in [GuiSteps.SYSTEM_CLEAR_SCREEN]:
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, {})

        elif action in [GuiSteps.SYSTEM_TEXT]:
            fromCache = False
            if self.textCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.textCombo.currentText() == "ALIAS": fromAlias = True

            newText = self.textLine.text()
            if not len(newText):
                QMessageBox.warning(self, "Assistant",
                                    "Please to provide text!")
                return
            parameters = {
                'text': newText,
                'from-cache': fromCache,
                'from-alias': fromAlias
            }
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, parameters)

        elif action in [GuiSteps.SYSTEM_SHORTCUT]:

            newShortcut = self.shortcutComboBox.currentText()
            parameters = {'shortcut': newShortcut}
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, parameters)

        elif action in [GuiSteps.SYSTEM_CHECK_SCREEN]:
            op = self.checkComboBox.currentText()
            fromCache = False
            if self.screenCombo.currentText() == "CACHE": fromCache = True
            fromAlias = False
            if self.screenCombo.currentText() == "ALIAS": fromAlias = True

            toCache = False
            if self.screenSaveCombo.currentText() == "CACHE": toCache = True
            keyCache = self.screenSaveLine.text()

            newText = ""
            if op != GuiSteps.OP_ANY:
                if fromCache or fromAlias:
                    newText = self.screenLine.text()
                else:
                    newText = self.screenArea.toPlainText()
                if not len(newText):
                    QMessageBox.warning(self, "Assistant",
                                        "Please to provide value to search!")
                    return

            parameters = {
                'value': newText,
                'from-cache': fromCache,
                'from-alias': fromAlias,
                'operator': op,
                'to-cache': toCache,
                'cache-key': keyCache
            }
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, parameters)

        else:
            signal.emit(str(action), unicode(descr), EMPTY_VALUE, {})

    def cancelStep(self):
        """
        Cancel step
        """
        self.addAction.setText("&Add")

        buttonFont = QFont()
        buttonFont.setBold(False)
        self.addAction.setFont(buttonFont)
        self.cancelAction.setEnabled(False)

        self.CancelEdit.emit()

    def finalizeUpdate(self):
        """
        Finalize the update of the step
        """
        self.addAction.setText("&Add Action")

        buttonFont = QFont()
        buttonFont.setBold(False)
        self.addAction.setFont(buttonFont)
        self.cancelAction.setEnabled(False)

    def editStep(self, stepData):
        """
        Edit step
        """
        self.addAction.setText("&Update")
        buttonFont = QFont()
        buttonFont.setBold(True)
        self.addAction.setFont(buttonFont)

        self.cancelAction.setEnabled(True)

        # set the current value for actions combo
        for i in xrange(self.actionsComboBox.count()):
            item_text = self.actionsComboBox.itemText(i)
            if unicode(stepData["action"]) == unicode(item_text):
                self.actionsComboBox.setCurrentIndex(i)
                break

        # and then refresh options
        self.onActionChanged()

        # finally fill all fields
        self.descriptionLine.setText(stepData["description"])

        if self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_SESSION]:
            self.ipLine.setText(stepData["parameters"]["dest-ip"])
            self.portLine.setText("%s" % stepData["parameters"]["dest-port"])
            self.loginLine.setText(stepData["parameters"]["login"])
            self.pwdLine.setText(stepData["parameters"]["password"])

            if stepData["parameters"]["from-cache-ip"]:
                self.ipLine.setValidator(self.validatorAll)
                self.ipCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias-ip"]:
                self.ipLine.setValidator(self.validatorUpper)
                self.ipCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.ipLine.setValidator(self.validatorAll)
                self.ipCombo.setCurrentIndex(INDEX_TEXT)

            if stepData["parameters"]["from-cache-port"]:
                self.portLine.setValidator(self.validatorAll)
                self.portCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias-port"]:
                self.portLine.setValidator(self.validatorUpper)
                self.portCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.portLine.setValidator(self.validatorInt)
                self.portCombo.setCurrentIndex(INDEX_TEXT)

            if stepData["parameters"]["from-cache-login"]:
                self.loginLine.setValidator(self.validatorAll)
                self.loginCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias-login"]:
                self.loginLine.setValidator(self.validatorUpper)
                self.loginCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.loginLine.setValidator(self.validatorAll)
                self.loginCombo.setCurrentIndex(INDEX_TEXT)

            if stepData["parameters"]["from-cache-pwd"]:
                self.pwdLine.setValidator(self.validatorAll)
                self.pwdCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias-pwd"]:
                self.pwdLine.setValidator(self.validatorUpper)
                self.pwdCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.pwdLine.setValidator(self.validatorAll)
                self.pwdCombo.setCurrentIndex(INDEX_TEXT)

        if self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_CLOSE]:
            pass

        if self.actionsComboBox.currentText() in [
                GuiSteps.SYSTEM_CLEAR_SCREEN
        ]:
            pass

        if self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_TEXT]:

            if stepData["parameters"]["from-cache"]:
                self.textLine.setValidator(self.validatorAll)
                self.textCombo.setCurrentIndex(INDEX_CACHE)
            elif stepData["parameters"]["from-alias"]:
                self.textLine.setValidator(self.validatorUpper)
                self.textCombo.setCurrentIndex(INDEX_ALIAS)
            else:
                self.textLine.setValidator(self.validatorAll)
                self.textCombo.setCurrentIndex(INDEX_TEXT)

            self.textLine.setText(stepData["parameters"]["text"])

        if self.actionsComboBox.currentText() in [GuiSteps.SYSTEM_SHORTCUT]:

            for i in xrange(self.shortcutComboBox.count()):
                item_text = self.shortcutComboBox.itemText(i)
                if unicode(stepData["parameters"]["shortcut"]) == unicode(
                        item_text):
                    self.shortcutComboBox.setCurrentIndex(i)
                    break

        if self.actionsComboBox.currentText() in [
                GuiSteps.SYSTEM_CHECK_SCREEN
        ]:

            if stepData["parameters"]["from-cache"]:
                self.screenLine.setValidator(self.validatorAll)
                self.screenCombo.setCurrentIndex(INDEX_CACHE)
                self.screenLine.setText(stepData["parameters"]["value"])
            elif stepData["parameters"]["from-alias"]:
                self.screenLine.setValidator(self.validatorUpper)
                self.screenCombo.setCurrentIndex(INDEX_ALIAS)
                self.screenLine.setText(stepData["parameters"]["value"])
            else:
                self.screenCombo.setCurrentIndex(INDEX_TEXT)
                self.screenArea.setPlainText(stepData["parameters"]["value"])

            for i in xrange(self.checkComboBox.count()):
                item_text = self.checkComboBox.itemText(i)
                if unicode(stepData["parameters"]["operator"]) == unicode(
                        item_text):
                    self.checkComboBox.setCurrentIndex(i)
                    break

            if stepData["parameters"]["to-cache"]:
                self.screenSaveCombo.setCurrentIndex(1)
                self.screenSaveLine.setText(
                    stepData["parameters"]["cache-key"])
            else:
                self.screenSaveCombo.setCurrentIndex(0)

    def getTimeout(self):
        """
        Return timeout value
        """
        return self.optionsDialog.timeoutLine.text()

    def setTimeout(self, timeout):
        """
        Set the timeout
        """
        return self.optionsDialog.timeoutLine.setText(timeout)

    def getAgentName(self):
        """
        Return the agent name
        """
        return self.optionsDialog.agentNameLine.text()

    def getAgentList(self):
        """
        Return the agent list
        """
        return self.optionsDialog.agentsList
Exemplo n.º 12
0
    def generateDataTypesField(dataType=None):
        """
		@rtype: QComboBox
		"""
        dataTypes = QComboBox()
        dataTypes.addItems(
            helper_methods.buildQStringList(
                ['TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT', 'BIGINT', 'BIT']))
        dataTypes.insertSeparator(dataTypes.count())
        dataTypes.addItems(
            helper_methods.buildQStringList(['FLOAT', 'DOUBLE', 'DECIMAL']))
        dataTypes.insertSeparator(dataTypes.count())
        dataTypes.addItems(
            helper_methods.buildQStringList([
                'CHAR', 'VARCHAR', 'TINYTEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT'
            ]))
        dataTypes.insertSeparator(dataTypes.count())
        dataTypes.addItems(
            helper_methods.buildQStringList([
                'BINARY', 'VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB',
                'LONGBLOB'
            ]))
        dataTypes.insertSeparator(dataTypes.count())
        dataTypes.addItems(
            helper_methods.buildQStringList(
                ['DATE', 'TIME', 'YEAR', 'DATETIME', 'TIMESTAMP']))
        dataTypes.insertSeparator(dataTypes.count())
        dataTypes.addItems(
            helper_methods.buildQStringList([
                'POINT', 'LINESTRING', 'POLYGON', 'GEOMETRY', 'MULTIPOINT',
                'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION'
            ]))
        dataTypes.insertSeparator(dataTypes.count())
        dataTypes.addItems(helper_methods.buildQStringList(['ENUM', 'SET']))

        if dataType is not None:
            dataTypes.setCurrentIndex(dataTypes.findText(dataType.upper()))

        return dataTypes
Exemplo n.º 13
0
class Settings(SymbolManager, QWidget):
    """
    The widget where users can set other preferences.
    """
    def __init__(self, parent):
        QWidget.__init__(self, parent)
        SymbolManager.__init__(self)
        parent.addPage(self, i18n("Score settings"))

        h = QHBoxLayout(self)
        v = QVBoxLayout()
        h.addLayout(v)
        score = QGroupBox(i18n("Score settings"))
        v.addWidget(score)
        lily =  QGroupBox(i18n("LilyPond"))
        v.addWidget(lily)

        v = QVBoxLayout()
        h.addLayout(v)
        prefs = QGroupBox(i18n("General preferences"))
        v.addWidget(prefs)
        instr = QGroupBox(i18n("Instrument names"))
        v.addWidget(instr)

        # Score settings:
        v = QVBoxLayout(score)
        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Key signature:"), h)
        self.key = QComboBox(h) # the key names are filled in later
        self.mode = QComboBox(h)
        self.mode.addItems([title for name, title in ly.modes(i18n)])
        l.setBuddy(self.key)

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Time signature:"), h)
        self.time = QComboBox(h)
        self.time.setEditable(True)
        self.time.addItems([
            '(4/4)', '(2/2)',
            '2/4', '3/4', '4/4', '5/4', '6/4', '7/4',
            '2/2', '3/2', '4/2',
            '3/8', '5/8', '6/8', '7/8', '8/8', '9/8', '12/8',
            '3/16', '6/16', '12/16'])
        # palette sensitive icons for the first two items
        self.addItemSymbol(self.time, 0, 'time_c44')
        self.addItemSymbol(self.time, 1, 'time_c22')
        l.setBuddy(self.time)

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Pickup measure:"), h)
        self.pickup = QComboBox(h)
        self.pickup.addItem(i18n("None"))
        self.pickup.insertSeparator(1)
        durs = [('note_' + d.replace('.', 'd'), d) for d in durations]
        for icon, text in durs:
            self.addItemSymbol(self.pickup, self.pickup.count(), icon)
            self.pickup.addItem(text)
        l.setBuddy(self.pickup)

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Metronome mark:"), h)
        self.metroDur = QComboBox(h)

        l.setBuddy(self.metroDur)
        for icon, text in durs:
            self.addItemSymbol(self.metroDur, self.metroDur.count(), icon)
            self.metroDur.addItem('')
        l = QLabel('=', h)
        l.setAlignment(Qt.AlignCenter)
        l.setMaximumWidth(20)
        self.metroVal = QComboBox(h)
        self.metroVal.setEditable(True)
        metroValues, start = [], 40
        for end, step in (60, 2), (72, 3), (120, 4), (144, 6), (210, 8):
            metroValues.extend(range(start, end, step))
            start = end
        # reverse so mousewheeling is more intuitive
        self.metroValues = metroValues[::-1]
        self.metroVal.addItems(map(str, self.metroValues))
        def tap(bpm):
            """ Tap the tempo tap button """
            l = [abs(t - bpm) for t in self.metroValues]
            m = min(l)
            if m < 6:
                self.metroVal.setCurrentIndex(l.index(m))
        TapButton(h, tap)

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Tempo indication:"), h)
        self.tempoInd = KLineEdit(h)
        parent.complete(self.tempoInd, "tempo")
        l.setBuddy(self.tempoInd)
        h.setToolTip(i18n("A tempo indication, e.g. \"Allegro.\""))

        # LilyPond settings
        v = QVBoxLayout(lily)
        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Pitch name language:"), h)
        self.languageNames = list(sorted(ly.keyNames))
        self.lylang = QComboBox(h)
        l.setBuddy(self.lylang)
        self.lylang.addItem(i18n("Default"))
        self.lylang.insertSeparator(1)
        self.lylang.addItems([l.title() for l in self.languageNames])
        h.setToolTip(i18n(
            "The LilyPond language you want to use for the pitch names."))
        self.lylang.currentIndexChanged.connect(self.slotLanguageChanged)
        self.slotLanguageChanged(0) # init with default
        
        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Version:"), h)
        self.lyversion = QComboBox(h)
        self.lyversion.setEditable(True)
        l.setBuddy(self.lyversion)
        version = defaultVersion()
        if version:
            self.lyversion.addItem(str(version))
        self.lyversion.addItems(('2.12.0', '2.10.0'))
        h.setToolTip(i18n(
            "The LilyPond version you will be using for this document."))

        # General preferences
        v = QVBoxLayout(prefs)
        self.typq = QCheckBox(i18n("Use typographical quotes"))
        self.typq.setToolTip(i18n(
            "Replace normal quotes in titles with nice typographical quotes."))
        v.addWidget(self.typq)
        self.tagl = QCheckBox(i18n("Remove default tagline"))
        self.tagl.setToolTip(i18n(
            "Suppress the default tagline output by LilyPond."))
        v.addWidget(self.tagl)
        self.barnum = QCheckBox(i18n("Remove bar numbers"))
        self.barnum.setToolTip(i18n(
            "Suppress the display of measure numbers at the beginning of "
            "every system."))
        v.addWidget(self.barnum)
        self.midi = QCheckBox(i18n("Create MIDI output"))
        self.midi.setToolTip(i18n(
            "Create a MIDI file in addition to the PDF file."))
        v.addWidget(self.midi)
        self.metro = QCheckBox(i18n("Show metronome mark"))
        self.metro.setToolTip(i18n(
            "If checked, show the metronome mark at the beginning of the "
            "score. The MIDI output also uses the metronome setting."))
        v.addWidget(self.metro)

        self.book = QCheckBox(i18n("Wrap score in \\book block"))
        self.book.setToolTip(i18n(
            "If checked, wraps the \\score block inside a \\book block."))
        v.addWidget(self.book)

        # paper size:
        h = KHBox()
        v.addWidget(h)
        h.setSpacing(2)
        l = QLabel(i18n("Paper size:"), h)
        self.paper = QComboBox(h)
        l.setBuddy(self.paper)
        self.paperLandscape = QCheckBox(i18n("Landscape"), h)
        self.paper.addItem(i18n("Default"))
        self.paper.addItems(ly.paperSizes)
        self.paper.activated.connect(lambda i: self.paperLandscape.setEnabled(bool(i)))

        # Instrument names
        instr.setCheckable(True)
        self.instr = instr
        v = QVBoxLayout(instr)

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("First system:"), h)
        self.instrFirst = QComboBox(h)
        l.setBuddy(self.instrFirst)
        self.instrFirst.addItems((i18n("Long"), i18n("Short")))
        h.setToolTip(i18n(
            "Use long or short instrument names before the first system."))

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Other systems:"), h)
        self.instrOther = QComboBox(h)
        l.setBuddy(self.instrOther)
        self.instrOther.addItems((i18n("Long"), i18n("Short"), i18n("None")))
        h.setToolTip(i18n(
            "Use short, long or no instrument names before the next systems."))

        h = KHBox()
        v.addWidget(h)
        l = QLabel(i18n("Language:"), h)
        self.instrLang = QComboBox(h)
        l.setBuddy(self.instrLang)
        self.instrLang.addItems((i18n("Default"), KGlobal.locale().languageCodeToName("en")))
        h.setToolTip(i18n("Which language to use for the instrument names."))

        langs = KGlobal.dirs().findAllResources("locale", "*/LC_MESSAGES/frescobaldi.mo")
        self.instrLanguages = list(sorted(set(lang.split('/')[-3] for lang in langs)))
        self.instrLang.addItems(map(KGlobal.locale().languageCodeToName, self.instrLanguages))
        
        self.default()
        self.loadConfig()

    def saveConfig(self):
        conf = config()
        conf.writeEntry('language', self.getLanguage() or 'default')
        conf.writeEntry('typographical', self.typq.isChecked())
        conf.writeEntry('remove tagline', self.tagl.isChecked())
        conf.writeEntry('remove barnumbers', self.barnum.isChecked())
        conf.writeEntry('midi', self.midi.isChecked())
        conf.writeEntry('metronome mark', self.metro.isChecked())
        conf.writeEntry('wrap in book', self.book.isChecked())
        if self.paper.currentIndex() > 0:
            conf.writeEntry('paper size', ly.paperSizes[self.paper.currentIndex() - 1])
        conf.writeEntry('paper landscape', self.paperLandscape.isChecked())
        g = config('instrument names')
        g.writeEntry('show', self.instr.isChecked())
        g.writeEntry('first', ['long', 'short'][self.instrFirst.currentIndex()])
        g.writeEntry('other', ['long', 'short', 'none'][self.instrOther.currentIndex()])
        g.writeEntry('lang', (['default', 'english'] + self.instrLanguages)[self.instrLang.currentIndex()])

    def loadConfig(self):
        conf = config()
        self.setLanguage(conf.readEntry('language', 'default'))
        self.typq.setChecked(conf.readEntry('typographical', True))
        self.tagl.setChecked(conf.readEntry('remove tagline', False))
        self.barnum.setChecked(conf.readEntry('remove barnumbers', False))
        self.midi.setChecked(conf.readEntry('midi', True))
        self.metro.setChecked(conf.readEntry('metronome mark', False))
        self.book.setChecked(conf.readEntry('wrap in book', False))

        psize = conf.readEntry('paper size', "")
        if psize in ly.paperSizes:
            self.paper.setCurrentIndex(ly.paperSizes.index(psize) + 1)
        self.paperLandscape.setChecked(conf.readEntry('paper landscape', False))
        self.paperLandscape.setEnabled(psize in ly.paperSizes)

        g = config('instrument names')
        def readconf(entry, itemlist, defaultIndex):
            item = g.readEntry(entry, itemlist[defaultIndex])
            if item in itemlist:
                return itemlist.index(item)
            else:
                return defaultIndex

        first = readconf('first', ['long', 'short'], 0)
        other = readconf('other', ['long', 'short', 'none'], 2)
        lang = readconf('lang', ['default', 'english'] + self.instrLanguages, 0)

        self.instrFirst.setCurrentIndex(first)
        self.instrOther.setCurrentIndex(other)
        self.instrLang.setCurrentIndex(lang)
        self.instr.setChecked(g.readEntry('show', True))

    def default(self):
        """ Set various items to their default state """
        self.lylang.setCurrentIndex(0)
        self.key.setCurrentIndex(0)
        self.mode.setCurrentIndex(0)
        self.time.setCurrentIndex(0)
        self.pickup.setCurrentIndex(0)
        self.metroVal.setCurrentIndex(self.metroValues.index(100))
        self.metroDur.setCurrentIndex(durations.index('4'))
        self.tempoInd.clear()
        self.typq.setChecked(True)
        self.tagl.setChecked(False)
        self.barnum.setChecked(False)
        self.midi.setChecked(True)
        self.metro.setChecked(False)
        self.book.setChecked(False)
        self.paper.setCurrentIndex(0)
        self.paperLandscape.setEnabled(False)
        self.instrFirst.setCurrentIndex(0)
        self.instrOther.setCurrentIndex(2)
        self.instrLang.setCurrentIndex(0)
        self.instr.setChecked(True)

    def getLanguage(self):
        """ Return the configured LilyPond pitch language, '' for default. """
        if self.lylang.currentIndex() >= 2:
            return self.languageNames[self.lylang.currentIndex() - 2]
        else:
            return ''

    def setLanguage(self, lang):
        """ Sets the language combobox to the specified language """
        if lang not in self.languageNames:
            self.lylang.setCurrentIndex(0)
        else:
            self.lylang.setCurrentIndex(self.languageNames.index(lang) + 2)
    
    def slotLanguageChanged(self, index):
        """ Change the LilyPond language, affects key names """
        lang = index < 2 and "nederlands" or self.languageNames[index - 2]
        key = self.key.currentIndex()
        if key == -1:
            key = 0
        self.key.clear()
        self.key.addItems(ly.keyNames[lang])
        self.key.setCurrentIndex(key)
Exemplo n.º 14
0
class LDSControls(QFrame):
        
    STATIC_IMG = ('error_static.png','linz_static.png','busy_static.png','clean_static.png')
    ANIM_IMG   = ('error.gif','linz.gif','layer.gif','clean.gif')
    
    IMG_SPEED  = 100
    IMG_WIDTH  = 64
    IMG_HEIGHT = 64
    
    MAX_WD = 450
    
    GD_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../../bin/gdal/gdal-data'))
    STATUS = LU.enum('ERROR','IDLE','BUSY','CLEAN')
    
    def __init__(self,parent):
        super(LDSControls, self).__init__()
        self.parent = parent
        self.initConf()
        self.initEPSG()
        self.initUI()
        
    def initConf(self):
        '''Read files in conf dir ending in conf'''
        self.cflist = ConfigInitialiser.getConfFiles()
        #self.imgset = self.STATIC_IMG if ConfigWrapper().readDSProperty('Misc','indicator')=='static' else self.ANIM_IMG
        #self.imgset = self.STATIC_IMG if self.parent.confconn.tp.src.confwrap.readDSProperty('Misc','indicator')=='static' else self.ANIM_IMG
        sep = self.parent.confconn.reg.openEndPoint(self.parent.confconn.SRCNAME,self.parent.confconn.uconf)
        self.imgset = self.STATIC_IMG if sep.confwrap.readDSProperty('Misc','indicator')=='static' else self.ANIM_IMG
        self.parent.confconn.reg.closeEndPoint(self.parent.confconn.SRCNAME)
        
    def initEPSG(self):
        '''Read GDAL EPSG files, splitting by NZ(RSR) and RestOfTheWorld'''

        gcsf = gdal.FindFile('gdal','gcs.csv') 
        if not gcsf:
            gcsf = os.path.join(self.GD_PATH,'gcs.csv')
        pcsf = gdal.FindFile('gdal','pcs.csv') 
        if not pcsf: 
            pcsf = os.path.join(self.GD_PATH,'pcs.csv')
        gcs = ConfigInitialiser.readCSV(gcsf)
        pcs = ConfigInitialiser.readCSV(pcsf)

        self.nzlsr = [(e[0],e[0]+' - '+e[3]) for e in gcs if 'NZGD'     in e[1] or  'RSRGD'     in e[1]] \
                   + [(e[0],e[0]+' - '+e[1]) for e in pcs if 'NZGD'     in e[1] or  'RSRGD'     in e[1]]
        self.rowsr = [(e[0],e[0]+' - '+e[3]) for e in gcs if 'NZGD' not in e[1] and 'RSRGD' not in e[1]] \
                   + [(e[0],e[0]+' - '+e[1]) for e in pcs if 'NZGD' not in e[1] and 'RSRGD' not in e[1]]
                   
                   
    def initUI(self):
        
        # 0      1          2       3       4       5      6    7    8
        #'destname','lgselect','layer','uconf','group','epsg','fd','td','int'
        
        #self.rdest,rlgselect,self.rlayer,ruconf,self.rgroup,repsg,rfd,rtd,rint = readlist 
        
        QToolTip.setFont(QFont('SansSerif', 10))
        
        #labels
        destLabel = QLabel('Destination')
        lgLabel = QLabel('Group/Layer')
        epsgLabel = QLabel('EPSG')
        fromDateLabel = QLabel('From Date')
        toDateLabel = QLabel('To Date')
        confLabel = QLabel('User Config')
        
        self.view = QLabel() 
        self.view.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.view.setAlignment(Qt.AlignCenter)

        self.confcombo = QComboBox(self)
        self.confcombo.setToolTip('Enter your user config name (file) here')
        self.confcombo.addItems(self.cflist)
        self.confcombo.setEditable(False)
        #self.confcombo.currentIndexChanged.connect(self.doLGEditUpdate)
        
        #combos
        self.lgcombo = QComboBox(self)
        self.lgcombo.setMaximumWidth(self.MAX_WD)
        self.lgcombo.setDuplicatesEnabled(False)
        #self.lgcombo.setInsertPolicy(QComboBox.InsertAlphabetically)#?doesnt seem to work
        self.lgcombo.setToolTip('Select either Layer or Group entry')
        self.lgcombo.setEditable(False)
        self.sepindex = None
        #self.updateLGValues()
        
        self.epsgcombo = QComboBox(self)
        self.epsgcombo.setMaximumWidth(self.MAX_WD)
        self.epsgcombo.setToolTip('Setting an EPSG number here determines the output SR of the layer')  
        self.epsgcombo.addItems([i[1] for i in self.nzlsr])
        self.epsgcombo.insertSeparator(len(self.nzlsr))
        self.epsgcombo.addItems([i[1] for i in self.rowsr])
        self.epsgcombo.setEditable(True)
        self.epsgcombo.setEnabled(False)
        
        self.destlist = self.getConfiguredDestinations()
        self.destcombo = QComboBox(self)
        self.destcombo.setToolTip('Choose the desired output type')   
        self.destcombo.setEditable(False)
        self.destcombo.addItems(self.destlist)

        #date selection
        self.fromdateedit = QDateEdit()
        self.fromdateedit.setCalendarPopup(True)
        self.fromdateedit.setEnabled(False)
        
        self.todateedit = QDateEdit()
        self.todateedit.setCalendarPopup(True)
        self.todateedit.setEnabled(False)
        
        #check boxes
        self.epsgenable = QCheckBox()
        self.epsgenable.setCheckState(False)
        self.epsgenable.clicked.connect(self.doEPSGEnable)       
        
        self.fromdateenable = QCheckBox()
        self.fromdateenable.setCheckState(False)
        self.fromdateenable.clicked.connect(self.doFromDateEnable)
        
        self.todateenable = QCheckBox()
        self.todateenable.setCheckState(False) 
        self.todateenable.clicked.connect(self.doToDateEnable)
        
        self.progressbar = QProgressBar()
        self.progressbar.setRange(0,100)
        self.progressbar.setVisible(True)
        self.progressbar.setMinimumWidth(self.MAX_WD)
        
        
        #buttons        
        self.initbutton = QPushButton("waiting")
        self.initbutton.setToolTip('Initialise the Layer Configuration')
        self.initbutton.clicked.connect(self.doInitClickAction)
        
        self.cleanbutton = QPushButton("Clean")
        self.cleanbutton.setToolTip('Clean the selected layer/group from local storage')
        self.cleanbutton.clicked.connect(self.doCleanClickAction)
        
        self.replicatebutton = QPushButton("Replicate")
        self.replicatebutton.setToolTip('Execute selected replication')
        self.replicatebutton.clicked.connect(self.doReplicateClickAction)
        
        self.cancelbutton = QPushButton("Close")
        self.cancelbutton.setToolTip('Close the LDS Replicate application')       
        self.cancelbutton.clicked.connect(self.parent.close)


        #set dialog values using GPR
        self.updateGUIValues(self.parent.gvs)
        
        #set onchange here otherwise we get circular initialisation
        self.destcombo.currentIndexChanged.connect(self.doDestChanged)
        self.confcombo.currentIndexChanged.connect(self.doConfChanged)
        self.lgcombo.currentIndexChanged.connect(self.doLGComboChanged)

        self.setStatus(self.STATUS.IDLE)
        
        #grid
        grid = QGridLayout()
        grid.setSpacing(10)
        
        
        #placement section ------------------------------------
        #---------+---------+--------+---------+--------
        # dest LB |         | dest DD
        # grp LB  |         | grp DD
        # conf LB |         | conf DD
        # epsg L  | epsg CB | epsg DD
        # f dt L  | f dt CB | f dt DD
        # t td L  | t td CB | t td DD
        # icon    |       <- progress ->
        # layer B | <- . -> |repl B  | clean B | close B 
        #---------+---------+--------+---------+--------

        grid.addWidget(destLabel, 1, 0)
        grid.addWidget(self.destcombo, 1, 2)

        #grid.addWidget(layerLabel, 2, 0)
        grid.addWidget(lgLabel, 2, 0)
        grid.addWidget(self.lgcombo, 2, 2)
        
        grid.addWidget(confLabel, 3, 0)
        grid.addWidget(self.confcombo, 3, 2)
        
        #grid.addWidget(groupLabel, 4, 0)
        #grid.addWidget(self.groupEdit, 4, 2)
        
        grid.addWidget(epsgLabel, 5, 0)
        grid.addWidget(self.epsgenable, 5, 1)
        grid.addWidget(self.epsgcombo, 5, 2)

        grid.addWidget(fromDateLabel, 6, 0)
        grid.addWidget(self.fromdateenable, 6, 1)
        grid.addWidget(self.fromdateedit, 6, 2)
        
        grid.addWidget(toDateLabel, 7, 0)
        grid.addWidget(self.todateenable, 7, 1)
        grid.addWidget(self.todateedit, 7, 2)
        
        hbox3 = QHBoxLayout()
        hbox3.addWidget(self.view) 
        hbox3.addStretch(1)
        hbox3.addWidget(self.progressbar)

        #hbox3.addLayout(vbox2)
        #hbox3.addLayout(vbox3)
        
        hbox4 = QHBoxLayout()
        hbox4.addWidget(self.initbutton)
        hbox4.addStretch(1)
        hbox4.addWidget(self.replicatebutton)
        hbox4.addWidget(self.cleanbutton)
        hbox4.addWidget(self.cancelbutton)
        

        vbox = QVBoxLayout()
        #vbox.addStretch(1)
        vbox.addLayout(grid)
        vbox.addLayout(hbox3)
        vbox.addLayout(hbox4)
        
        self.setLayout(vbox)  
       
    #def setProgress(self,pct):
    #    self.progressbar.setValue(pct)
        
    def setStatus(self,status,message='',tooltip=None):
        '''Sets indicator icon and statusbar message'''
        self.parent.statusbar.showMessage(message)
        self.parent.statusbar.setToolTip(tooltip if tooltip else '')

        #progress
        loc = os.path.abspath(os.path.join(IMG_LOC,self.imgset[status]))
        #loc = os.path.abspath(os.path.join(os.path.dirname(__file__),self.parent.IMG_LOC,self.imgset[status]))
        self.progressbar.setVisible(status in (self.STATUS.BUSY, self.STATUS.CLEAN))
        
        #icon
        anim = QMovie(loc, QByteArray(), self)
        anim.setScaledSize(QSize(self.IMG_WIDTH,self.IMG_HEIGHT))
        anim.setCacheMode(QMovie.CacheAll)
        anim.setSpeed(self.IMG_SPEED)
        self.view.clear()
        self.view.setMovie(anim)
        anim.start()

        self.view.repaint()
        QApplication.processEvents(QEventLoop.AllEvents)

    def mainWindowEnable(self,enable=True):
        cons = (self.lgcombo, self.confcombo, self.destcombo, 
                self.initbutton, self.replicatebutton, self.cleanbutton, self.cancelbutton,
                self.epsgenable,self.fromdateenable,self.todateenable,
                self.parent.menubar)
        for c in cons:
            c.setEnabled(enable)
            
        if enable:
            self.epsgcombo.setEnabled(self.epsgenable.checkState())
            self.fromdateedit.setEnabled(self.fromdateenable.checkState())
            self.todateedit.setEnabled(self.todateenable.checkState())
        else:
            self.epsgcombo.setEnabled(False)
            self.fromdateedit.setEnabled(False)
            self.todateedit.setEnabled(False)
   
        QApplication.restoreOverrideCursor() if enable else QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) 

    def refreshLGCombo(self):
        '''Re index LG combobox since a refreshLG call (new dest?) will usually mean new groups'''
        self.lgcombo.clear()
        self.lgcombo.addItems([i[2] for i in self.parent.confconn.lglist])
        #NOTE the separator consumes an index, if not clearing the combobox selectively remove the old sepindex (assumes g preceeds l)
        #if self.sepindex:
        #    self.lgcombo.removeItem(self.sepindex)
        self.sepindex = [i[0] for i in self.parent.confconn.lglist].count(LORG.GROUP)
        self.lgcombo.insertSeparator(self.sepindex)
        
    def updateLGValues(self,uconf,lgval,dest):
        '''Sets the values displayed in the Layer/Group combo'''
        #because we cant seem to sort combobox entries and want groups at the top, clear and re-add
        #TRACE#        
        #pdb.set_trace()
        sf = None
        try:
            self.parent.confconn.initConnections(uconf,lgval,dest)
        except Exception as e:
            sf=1
            ldslog.error('Error Updating UC Values. '+str(e))
            
        if sf:
            self.setStatus(self.STATUS.ERROR,'Error Updating UC Values', str(e))
        else:
            self.setStatus(self.STATUS.IDLE)
            
        self.refreshLGCombo()
        
    def centre(self):
        
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
        
    
    def gprParameters(self,rdest):
        '''Zip default and GPR values'''
        return [x if LU.assessNone(x) else y for x,y in zip(self.parent.gpr.readsec(rdest),self.parent.DEF_RVALS[1:])]
    
    def getLCE(self,ln):
        '''Read layer parameters'''
        dep = self.parent.confconn.reg.openEndPoint(self.parent.confconn.destname,self.parent.confconn.uconf)
        #sep = self.parent.confconn.reg.openEndPoint('WFS',self.parent.confconn.uconf)
        self.parent.confconn.reg.setupLayerConfig(self.parent.confconn.tp,None,dep,initlc=False)
        lce = dep.getLayerConf().readLayerParameters(ln)
        #self.parent.confconn.reg.closeEndPoint('WFS')
        self.parent.confconn.reg.closeEndPoint(self.parent.confconn.destname)
        sep,dep = None,None
        return lce
    
    
    def doDestChanged(self):
        '''Read the destname parameter and fill dialog with matching GPR values'''
        rdest = str(self.destlist[self.destcombo.currentIndex()])
        rvals = self.gprParameters(rdest)
        self.updateGUIValues([rdest]+rvals)    
        
        
    def doConfChanged(self):
        '''Read the user conf parameter and fill dialog with matching GPR values'''
        rdest = str(self.destlist[self.destcombo.currentIndex()])
        rlg,_,rep,rfd,rtd = self.gprParameters(rdest)
        ruc = str(self.cflist[self.confcombo.currentIndex()])
        self.updateGUIValues((rdest,rlg,ruc,rep,rfd,rtd))
        
        
    def doLGComboChanged(self):
        '''Read the layer/group value and change epsg to layer or gpr match'''
        #get a matching LG entry and test whether its a layer or group
        #lgi = self.parent.confconn.getLayerGroupIndex(self.lgcombo.currentText().toUtf8().data())
        lgi = self.parent.confconn.getLayerGroupIndex(LQ.readWidgetText(self.lgcombo.currentText()))
        #lgi can be none if we init a new group, in which case we use the GPR value
        if lgi:
            lge = self.parent.confconn.lglist[lgi]
            lce = self.getLCE(lge[1]) if lge[0]==LORG.LAYER else None
        else:
            lce = None
        
        #look for filled layer conf epsg OR use prefs stored in gpr
        if lce and LU.assessNone(lce.epsg):
            epsgval = lce.epsg
        else:
            rdest = str(self.destlist[self.destcombo.currentIndex()])
            _,_,epsgval,_,_ = self.gprParameters(rdest)
        epsgindex = [i[0] for i in self.nzlsr+[(0,0)]+self.rowsr].index(epsgval)
        if self.epsgcombo.currentIndex() != epsgindex:
            self.epsgcombo.setCurrentIndex(int(epsgindex))

        
    def updateGUIValues(self,readlist):
        '''Fill dialog values from provided list'''
        #TODO. Remove circular references when setCurrentIndex() triggers do###Changed()
        #Read user input
        rdest,self.rlgval,ruconf,repsg,rfd,rtd = readlist
        
        #--------------------------------------------------------------------
        
        #Destination Menu
        selecteddest = LU.standardiseDriverNames(rdest)
        if selecteddest not in self.destlist:
            self.destlist = self.getConfiguredDestinations()
            self.destcombo.addItem(selecteddest)
        destindex = self.destlist.index(selecteddest) if selecteddest else 0
        
        if self.destcombo.currentIndex() != destindex:
            self.destcombo.setCurrentIndex(destindex)
        
        #InitButton
        self.initbutton.setText('Layer Select')
        
        #Config File
        confindex = 0
        if LU.assessNone(ruconf):
            ruconf = ruconf.split('.')[0]
            if ruconf not in self.cflist:
                self.cflist += [ruconf,]
                self.confcombo.addItem(ruconf)
            confindex = self.cflist.index(ruconf)
            
        if self.confcombo.currentIndex() != confindex:
            self.confcombo.setCurrentIndex(confindex)
        #self.confEdit.setText(ruconf if LU.assessNone(ruconf) else '')
        
        #Layer/Group Selection
        self.updateLGValues(ruconf,self.rlgval,rdest)
        lgindex = None
        if LU.assessNone(self.rlgval):
            #index of list value
            lgindex = self.parent.confconn.getLayerGroupIndex(self.rlgval,col=1)
            
        if LU.assessNone(lgindex):
            #advance by 1 for sep
            lgindex += 1 if lgindex>self.sepindex else 0 
        else:
            #using the separator index sets the combo to blank
            lgindex = self.sepindex
        if self.lgcombo.currentIndex() != lgindex:
            self.lgcombo.setCurrentIndex(lgindex)
        #self.doLGEditUpdate()
        
        #EPSG
        #                                user > layerconf
        #useepsg = LU.precedence(repsg, lce.epsg if lce else None, None)
        epsgindex = [i[0] for i in self.nzlsr+[(None,None)]+self.rowsr].index(repsg)
        if self.epsgcombo.currentIndex() != epsgindex:
            self.epsgcombo.setCurrentIndex(epsgindex)
            
        #epsgedit = self.epsgcombo.lineEdit()
        #epsgedit.setText([e[1] for e in self.nzlsr+self.rowsr if e[0]==repsg][0])
        
        #epsgedit.setText([e for e in self.nzlsr+self.rowsr if re.match('^\s*(\d+).*',e).group(1)==repsg][0])
        
        #To/From Dates
        if LU.assessNone(rfd):
            self.fromdateedit.setDate(QDate(int(rfd[0:4]),int(rfd[5:7]),int(rfd[8:10])))
        else:
            early = DataStore.EARLIEST_INIT_DATE
            self.fromdateedit.setDate(QDate(int(early[0:4]),int(early[5:7]),int(early[8:10])))
            
        if LU.assessNone(rtd):
            self.todateedit.setDate(QDate(int(rtd[0:4]),int(rtd[5:7]),int(rtd[8:10]))) 
        else:
            today = DataStore.getCurrent()
            self.todateedit.setDate(QDate(int(today[0:4]),int(today[5:7]),int(today[8:10])))
            
        #Internal/External CheckBox
#        if LU.assessNone(rint):
#            self.internalTrigger.setChecked(rint.lower()==DataStore.CONF_INT)
#        else:
#            self.internalTrigger.setChecked(DataStore.DEFAULT_CONF==DataStore.CONF_INT)
        
        
    def getConfiguredDestinations(self):
        defml = ['',]+DataStore.DRIVER_NAMES.values()
        return [d for d in self.parent.gpr.getDestinations() if d in defml]
        
    def doEPSGEnable(self):
        self.epsgcombo.setEnabled(self.epsgenable.isChecked())
        
    def doFromDateEnable(self):
        self.fromdateedit.setEnabled(self.fromdateenable.isChecked())
          
    def doToDateEnable(self):
        self.todateedit.setEnabled(self.todateenable.isChecked())  
          
    def readParameters(self):
        '''Read values out of dialogs'''
        destination = LU.assessNone(str(self.destlist[self.destcombo.currentIndex()]))
        #lgindex = self.parent.confconn.getLayerGroupIndex(self.lgcombo.currentText().toUtf8().data())
        lgindex = self.parent.confconn.getLayerGroupIndex(LQ.readWidgetText(self.lgcombo.currentText()))
        #NB need to test for None explicitly since zero is a valid index
        lgval = self.parent.confconn.lglist[lgindex][1] if LU.assessNone(lgindex) else None       
        #uconf = LU.standardiseUserConfigName(str(self.confcombo.lineEdit().text()))
        #uconf = str(self.confcombo.lineEdit().text())
        uconf = str(self.cflist[self.confcombo.currentIndex()])
        ee = self.epsgenable.isChecked()
        epsg = None if ee is False else re.match('^\s*(\d+).*',str(self.epsgcombo.lineEdit().text())).group(1)
        fe = self.fromdateenable.isChecked()
        te = self.todateenable.isChecked()
        fd = None if fe is False else str(self.fromdateedit.date().toString('yyyy-MM-dd'))
        td = None if te is False else str(self.todateedit.date().toString('yyyy-MM-dd'))
        
        return destination,lgval,uconf,epsg,fe,te,fd,td
    
    def doInitClickAction(self):
        '''Initialise the LC on LC-button-click, action'''
        try:
            try:
                self.setStatus(self.STATUS.BUSY,'Opening Layer-Config Editor')  
                self.progressbar.setValue(0)
                self.parent.runLayerConfigAction()
            finally:
                self.setStatus(self.STATUS.IDLE,'Ready')
        except Exception as e:
            self.setStatus(self.STATUS.ERROR,'Error in Layer-Config',str(sys.exc_info()))#e))
        
    def doCleanClickAction(self):
        '''Set clean anim and run clean'''
        #lgo = self.lgcombo.currentText().toUtf8().data()
        lgo = LQ.readWidgetText(self.lgcombo.currentText())
        
        try:
            self.setStatus(self.STATUS.CLEAN,'Running Clean '+lgo)
            self.progressbar.setValue(0)
            self.runReplicationScript(True)
        except Exception as e:
            self.setStatus(self.STATUS.ERROR,'Failed Clean of '+lgo,str(sys.exc_info()))#e))
        
    def doReplicateClickAction(self):
        '''Set busy anim and run repl'''
        lgo = self.lgcombo.currentText()#.toUtf8().data()#only used for error messages
        try:
            self.setStatus(self.STATUS.BUSY,'Running Replicate '+lgo)
            self.progressbar.setValue(0)
            self.runReplicationScript(False)
            ldslog.debug('TRPfinish')
        except Exception as e:
            self.setStatus(self.STATUS.ERROR,'Failed Replication of '+lgo,str(sys.exc_info()))#e))

    def runReplicationScript(self,clean=False):
        '''Run the layer/group repliction script'''
        destination,lgval,uconf,epsg,fe,te,fd,td = self.readParameters()
        uconf_path = LU.standardiseUserConfigName(uconf)
        destination_path = LU.standardiseLayerConfigName(destination)
        destination_driver = LU.standardiseDriverNames(destination)

        if not os.path.exists(uconf_path):
            self.userConfMessage(uconf_path)
            return
        elif not MainFileReader(uconf_path).hasSection(destination_driver):
            self.userConfMessage(uconf_path,destination_driver)
            return
        #-----------------------------------------------------
        #'destname','layer','uconf','group','epsg','fd','td','int'
     
        self.parent.gpr.write((destination_driver,lgval,uconf,epsg,fd,td))        
        ldslog.info(u'dest={0}, lg={1}, conf={2}, epsg={3}'.format(destination_driver,lgval,uconf,epsg))
        ldslog.info('fd={0}, td={1}, fe={2}, te={3}'.format(fd,td,fe,te))
        lgindex = self.parent.confconn.getLayerGroupIndex(lgval,col=1)
        #lorg = self.parent.confconn.lglist[lgindex][0]
        #----------don't need lorg in TP anymore but it is useful for sorting/counting groups
        #self.parent.confconn.tp.setLayerOrGroup(lorg)
        self.parent.confconn.tp.setLayerGroupValue(lgval)
        if self.fromdateenable.isChecked(): self.parent.confconn.tp.setFromDate(fd)
        if self.todateenable.isChecked(): self.parent.confconn.tp.setToDate(td)
        self.parent.confconn.tp.setUserConf(uconf)
        if self.epsgenable: self.parent.confconn.tp.setEPSG(epsg)
        
        #because clean state persists in TP
        if clean:
            self.parent.confconn.tp.setCleanConfig()
        else:
            self.parent.confconn.tp.clearCleanConfig()
        #(re)initialise the data source since uconf may have changed
        #>>#self.parent.confconn.tp.src = self.parent.confconn.initSourceWrapper()
        #--------------------------
        ###ep = self.parent.confconn.reg.openEndPoint(self.parent.confconn.destname,self.parent.confconn.uconf)
        
        ###self.parent.confconn.reg.closeEndPoint(self.parent.confconn.destname)
        ###ep = None
        #Open ProcessRunner and run with TP(proc)/self(gui) instances
        #HACK temp add of dest_drv to PR call
        try:
            #TODO. Test for valid LC first
            self.tpr = ProcessRunner(self,destination_driver)
        except Exception as e:
            ldslog.error('Cannot create ProcessRunner {}. NB Possible missing Layer Config {}'.format(str(e),destination_path))
            self.layerConfMessage(destination_path)
            return
        #If PR has been successfully created we must vave a valid dst    
        ldslog.debug('TRPstart')
        self.tpr.start()
        
#     def quitProcessRunner(self):
#         self.tpr.join()
#         self.tpr.quit()
#         self.trp = None

        
    def userConfMessage(self,uconf,secname=None):
        ucans = QMessageBox.warning(self, 'User Config Missing/Incomplete', 
                                'Specified User-Config file, '+str(uconf)+' does not exist' if secname is None else 'User-Config file does not contain '+str(secname)+' section', 
                                'Back','Initialise User Config')
        if not ucans:
            #Retry
            ldslog.warn('Retry specifying UC')
            #self.confcombo.setCurrentIndex(0)
            return
        #Init
        ldslog.warn('Reset User Config Wizard')
        self.parent.runWizardAction()


    def layerConfMessage(self,dest):
        lcans = QMessageBox.warning(self, 'Layer Config Missing', 
                                'Required Layer-Config file, '+str(dest)+' does not exist', 
                                'Back','Run Layer Select')
        if not lcans:
            #Retry
            ldslog.warn('Retry specifying LC')
            #self.destcombo.setCurrentIndex(0)
            return
        #Init
        ldslog.warn('Reset Layer Config')
        self.doInitClickAction()
Exemplo n.º 15
0
	def generateDataTypesField(dataType=None):
		"""
		@rtype: QComboBox
		"""
		dataTypes = QComboBox()
		dataTypes.addItems(helper_methods.buildQStringList(['TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT', 'BIGINT', 'BIT']))
		dataTypes.insertSeparator(dataTypes.count())
		dataTypes.addItems(helper_methods.buildQStringList(['FLOAT', 'DOUBLE', 'DECIMAL']))
		dataTypes.insertSeparator(dataTypes.count())
		dataTypes.addItems(helper_methods.buildQStringList(['CHAR', 'VARCHAR', 'TINYTEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT']))
		dataTypes.insertSeparator(dataTypes.count())
		dataTypes.addItems(helper_methods.buildQStringList(['BINARY', 'VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB']))
		dataTypes.insertSeparator(dataTypes.count())
		dataTypes.addItems(helper_methods.buildQStringList(['DATE', 'TIME', 'YEAR', 'DATETIME', 'TIMESTAMP']))
		dataTypes.insertSeparator(dataTypes.count())
		dataTypes.addItems(helper_methods.buildQStringList(['POINT', 'LINESTRING', 'POLYGON', 'GEOMETRY', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION']))
		dataTypes.insertSeparator(dataTypes.count())
		dataTypes.addItems(helper_methods.buildQStringList(['ENUM', 'SET']))

		if dataType is not None:
			dataTypes.setCurrentIndex(dataTypes.findText(dataType.upper()))

		return dataTypes