Ejemplo n.º 1
0
class EditMap(QWidget):  # класс для создания карты
    def __init__(self):
        self._sp_map = []
        self._elem_map = []
        self._activ_pic = 0
        self._mouse_x = 0
        self._mouse_y = 0
        self._flag_1 = False
        self._flag_2 = True
        self._col = 14
        self._row = 14
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowFlags(Qt.Window | Qt.WindowTitleHint
                            | Qt.CustomizeWindowHint)  #
        self.setMouseTracking(True)  # отслеживаем положение мыши
        self.resize(200,
                    100)  # задаем размер окна с параметрами размеров карты
        self.center()  # отцентровываем окно относительно экрана

        self.setWindowTitle('Редактор карты')

        self.input_col = QLineEdit(str(self._col),
                                   self)  # создаем строку для ввода x
        self.input_col.resize(50, 25)  # задаем размер строки для ввода x
        self.input_col.move(
            30, 0
        )  # задаем положение строки для ввода x в окне с параметрами размеров карты

        self.input_row = QLineEdit(str(self._row),
                                   self)  # создаем строку для ввода y
        self.input_row.resize(50, 25)  # задаем размер строки для ввода y
        self.input_row.move(
            120, 0
        )  # задаем положение строки для ввода y в окне с параметрами размеров карты

        self.button_new_map = QPushButton(
            "СОЗДАТЬ КАРТУ", self)  # создаем кнопку "СОЗДАТЬ КАРТУ"
        self.button_new_map.resize(140,
                                   50)  # задаем размер кнопки "СОЗДАТЬ КАРТУ"
        self.button_new_map.move(
            30, 50
        )  # задаем положение кнопки "СОЗДАТЬ КАРТУ" в окне с параметрами размеров карты
        self.button_new_map.clicked.connect(
            self.new_map)  # ждем событие от кнопки "СОЗДАТЬ КАРТУ"

        self.button_create = QPushButton("СОЗДАТЬ",
                                         self)  # создаем кнопку "СОЗДАТЬ"
        self.button_create.resize(70, 30)  # задаем размер кнопки "СОЗДАТЬ"
        self.button_create.setVisible(False)  # прячем кнопку "СОЗДАТЬ"
        self.button_create.clicked.connect(
            self.create_map)  # ждем событие от кнопки "СОЗДАТЬ"

        self.button_open = QPushButton("ОТКРЫТЬ",
                                       self)  # создаем  кнопку "ОТКРЫТЬ"
        self.button_open.resize(70, 30)  # задаем размер кнопки "ОТКРЫТЬ"
        self.button_open.setVisible(False)  # прячем кнопку "ОТКРЫТЬ"
        self.button_open.clicked.connect(
            self.open_map)  # ждем событие от кнопки "ОТКРЫТЬ"

        self.button_save = QPushButton('СОХРАНИТЬ',
                                       self)  # создаем кнопку "СОХРАНИТЬ"
        self.button_save.resize(70, 30)  # задаем размер кнопки "СОХРАНИТЬ"
        self.button_save.setVisible(False)  # прячем кнопку "СОХРАНИТЬ"
        self.button_save.clicked.connect(
            self.save_map)  # ждем событие от кнопки "СОХРАНИТЬ"

        self.button_back = QPushButton("НАЗАД", self)  # создаем кнопку "НАЗАД"
        self.button_back.resize(70, 30)  # задаем размер кнопки "НАЗАД"
        self.button_back.setVisible(False)  # прячем кнопку "НАЗАД"
        self.button_back.clicked.connect(
            self.close)  # ждем событие от кнопки "НАЗАД"

        self.timer_edit_map = QTimer()
        self.timer_edit_map.timeout.connect(self.updateValues)
        self.timer_edit_map.start(200)

    def new_map(self):  # метод класса Edit_Map, новая карта
        if (not self.input_col.text().isdigit() or not self.input_row.text().isdigit()) or \
                (int(self.input_col.text()) < 14 or int(self.input_row.text()) < 14):
            # проверяем значения x, y. Если не числа, то выводим окно ошибки
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Critical)
            msg.setText("Error")  # текст окна msg
            msg.setWindowTitle("Error")  # название окна msg
            msg.exec_()
            return

        self._col = int(self.input_col.text())  # запоминаем новое значение x
        self._row = int(self.input_row.text())  # запоминаем новое значение y
        self._sp_map = [[0 for i in range(self._col)] for j in range(self._row)
                        ]  # создаем список 0 по размерам x, y

        self.input_col.setVisible(False)  # прячем строку для ввода x
        self.input_row.setVisible(False)  # прячем строку для ввода y
        self.button_new_map.setVisible(False)  # прячем кнопку "СОЗДАТЬ КАРТУ"

        edit_map.move_button(
        )  # Расширяем окно и меняем положение кнопок "ОТКРЫТЬ", "НАЗАД", "СОЗДАТЬ", "СОХРАНИТЬ"

        self.button_back.setVisible(True)  # показываем кнопку "НАЗАД"
        self.button_save.setVisible(True)  # показываем кнопку "СОХРАНИТЬ"
        self.button_open.setVisible(True)  # показываем кнопку "ОТКРЫТЬ"
        self.button_create.setVisible(True)  # показываем кнопку "СОЗДАТЬ"
        self.center()  # отцентровываем окно относительно экрана

        for i in range(
                PIC
        ):  # записываем в elem_map изображения из которых будет состоять карта
            self._elem_map.append(QPixmap())
            self._elem_map[i].load(resource_path("PIC/" + str(i) + "_0.png"))
        self._flag_1 = True

    def center(self):  # функция отцентровывает окно относительно окна
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def paintEvent(self, event):
        if self._flag_1:
            qp = QPainter()
            qp.begin(self)

            qp.setBrush(QColor(255, 237,
                               0))  # задаем желтый цвет для рамки выбора
            qp.drawRect(self._col * 40 + 15, self._activ_pic * 50, 50,
                        50)  # задаем положение и размер рамки выбора

            for i in range(self._col):
                for j in range(self._row):
                    qp.setBrush(QColor(50, 50, 50))
                    qp.drawRect(i * 40, j * 40, 40, 40)
                    qp.drawPixmap(i * 40, j * 40, self._elem_map[
                        self._sp_map[j][i]])  # рисуем картинками из elem_map

            for i in range(PIC):
                qp.drawPixmap(self._col * 40 + 20, i * 50 + 5,
                              self._elem_map[i])

            if self._mouse_x < self._col * 40 and self._mouse_y < self._row * 40:
                qp.drawPixmap(self._mouse_x - 30, self._mouse_y - 30,
                              self._elem_map[self._activ_pic])
            qp.end()

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            if self._mouse_x < self._col * 40 and self._mouse_y < self._row * 40:
                self._sp_map[self._mouse_y // 40][self._mouse_x //
                                                  40] = self._activ_pic
            for i in range(PIC):
                if self._col * 40 + 20 < self._mouse_x < self._col * 40 + 80 and \
                        i * 50 + 5 < self._mouse_y < i * 50 + 65:
                    self._activ_pic = i
                    break

    def mouseMoveEvent(self, event):
        self._mouse_x = event.x()
        self._mouse_y = event.y()

    def create_map(self):
        self.button_create.setVisible(False)
        self.button_open.setVisible(False)
        self.button_save.setVisible(False)
        self.button_back.setVisible(False)
        self._flag_1 = False
        self.input_col.setVisible(True)
        self.input_row.setVisible(True)
        self.button_new_map.setVisible(True)
        self.resize(200, 100)
        self.center()

    def save_map(self):
        stroka = ''
        for j in range(self._row):
            for i in range(self._col):
                stroka += str(self._sp_map[j][i])
            stroka += '\n'
        file_save_map = QFileDialog.getSaveFileName(self, filter='*.map')[0]
        if file_save_map != '':
            f = open(file_save_map, 'w', encoding="utf8")
            with f:
                f.write(stroka[:-1])
                self._flag_2 = False
            f.close()

    def open_map(self):
        file_save_map = QFileDialog.getOpenFileName(self, filter='*.map')[0]
        f = open(file_save_map, encoding="utf8")
        with f:
            old_map = f.readlines()
        f.close()
        self._row = len(old_map)
        self._col = len(old_map[0]) - 1
        self._sp_map = []
        for j in range(self._row):
            self._sp_map.append([])
            for i in range(self._col):
                self._sp_map[j].append(int(old_map[j][i]))
        edit_map.move_button()
        self.center()

    def close(self):
        if self._flag_2:
            result = QMessageBox.question(self, "ПРЕДУПРЕЖДЕНИЕ!",
                                          "Сохранить карту?",
                                          QMessageBox.Yes | QMessageBox.No,
                                          QMessageBox.No)
            if result == QMessageBox.Yes:
                edit_map.save_map()
        self.setVisible(False)
        game.setVisible(True)

    def updateValues(self):
        self.update()

    def move_button(self):
        self.resize(self._col * 40 + 100, self._row * 40)
        # расширяем окно по параметрам x, y, добавляем 100 по х для elem_map
        self.button_back.move(self._col * 40 + 15, self._row * 40 -
                              30)  # задаем положение кнопки "НАЗАД"
        self.button_save.move(self._col * 40 + 15, self._row * 40 -
                              60)  # задаем положение кнопки "СОХРАНИТЬ"
        self.button_open.move(self._col * 40 + 15, self._row * 40 -
                              90)  # задаем положение кнопки "ОТКРЫТЬ"
        self.button_create.move(self._col * 40 + 15, self._row * 40 -
                                120)  # задаем положение кнопки "СОЗДАТЬ"
Ejemplo n.º 2
0
class ValueTypeEditor(QWidget):
    ValueTypes = (bool, int, float, complex, str)

    def __init__(self, *args):
        QWidget.__init__(self, *args)
        lo = QHBoxLayout(self)
        lo.setContentsMargins(0, 0, 0, 0)
        lo.setSpacing(5)
        # type selector
        self.wtypesel = QComboBox(self)
        for i, tp in enumerate(self.ValueTypes):
            self.wtypesel.addItem(tp.__name__)
        self.wtypesel.activated[int].connect(self._selectTypeNum)
        typesel_lab = QLabel("&Type:", self)
        typesel_lab.setBuddy(self.wtypesel)
        lo.addWidget(typesel_lab, 0)
        lo.addWidget(self.wtypesel, 0)
        self.wvalue = QLineEdit(self)
        self.wvalue_lab = QLabel("&Value:", self)
        self.wvalue_lab.setBuddy(self.wvalue)
        self.wbool = QComboBox(self)
        self.wbool.addItems(["false", "true"])
        self.wbool.setCurrentIndex(1)
        lo.addWidget(self.wvalue_lab, 0)
        lo.addWidget(self.wvalue, 1)
        lo.addWidget(self.wbool, 1)
        self.wvalue.hide()
        # make input validators
        self._validators = {int: QIntValidator(self), float: QDoubleValidator(self)}
        # select bool type initially
        self._selectTypeNum(0)

    def _selectTypeNum(self, index):
        tp = self.ValueTypes[index]
        self.wbool.setVisible(tp is bool)
        self.wvalue.setVisible(tp is not bool)
        self.wvalue_lab.setBuddy(self.wbool if tp is bool else self.wvalue)
        self.wvalue.setValidator(self._validators.get(tp, None))

    def setValue(self, value):
        """Sets current value"""
        for i, tp in enumerate(self.ValueTypes):
            if isinstance(value, tp):
                self.wtypesel.setCurrentIndex(i)
                self._selectTypeNum(i)
                if tp is bool:
                    self.wbool.setCurrentIndex(1 if value else 0)
                else:
                    self.wvalue.setText(str(value))
                return
        # unknown value: set bool
        self.setValue(True)

    def getValue(self):
        """Returns current value, or None if no legal value is set"""
        tp = self.ValueTypes[self.wtypesel.currentIndex()]
        if tp is bool:
            return bool(self.wbool.currentIndex())
        else:
            try:
                return tp(self.wvalue.text())
            except:
                print("Error converting input to type ", tp.__name__)
                traceback.print_exc()
                return None