OSDN Git Service

#31462対応
[pydun/Pydun.git] / Pydun.py
index 2589148..d2cd649 100644 (file)
--- a/Pydun.py
+++ b/Pydun.py
@@ -24,7 +24,7 @@ _undomanager = None
 \r
 projecturl = "http://sourceforge.jp/projects/pydun/"\r
 projectrssurl = "http://sourceforge.jp/projects/pydun/releases/rss"\r
-projectversion = "1.0.4"\r
+projectversion = "1.0.5"\r
 \r
 \r
 class MainWindow(QtGui.QMainWindow):\r
@@ -128,48 +128,62 @@ class MainWindow(QtGui.QMainWindow):
             self.redoact.setDisabled(True)\r
 \r
     def setTitle(self, filename):\r
+        s ="Pydun - " + self.getfilename(filename)\r
+        self.setWindowTitle(s)\r
+\r
+    def getfilename(self, filename):\r
         if filename == None:\r
             s = u"新規作成"\r
         else:\r
             s = os.path.basename(filename)\r
-        s ="Pydun - " + s\r
-        self.setWindowTitle(s)\r
+        return s\r
 \r
     @QtCore.Slot()\r
     def new_triggered(self):\r
-        if QtGui.QMessageBox.Ok == QtGui.QMessageBox.question(\r
-            self, u"確認", u"新しいマップを作成しますか?",\r
-            (QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)):\r
+        if self.confirmdiscarding():\r
             self.new()\r
+            return True\r
+        return False\r
 \r
     def new(self):\r
         global _mapengine\r
         _mapengine = MapEngine(20, 20, 1, -1, 0, +19)\r
-        _undomanager.clear()\r
-        _undomanager.save(_mapengine.savestring())\r
+        _undomanager.init(_mapengine.savestring())\r
         self.setTitle(None)\r
         try:\r
             self.mainframe.mapframe.repaint()\r
         except:\r
             pass\r
 \r
+    def confirmdiscarding(self):\r
+        if not _undomanager.commited:\r
+            dlg = PydunAskSaveDialog(self, self.getfilename(_mapengine.filename))\r
+            ret = dlg.exec_()\r
+            if ret == QtGui.QMessageBox.Cancel:\r
+                return False\r
+            elif ret == QtGui.QMessageBox.Save:\r
+                saved = self.save_triggered()\r
+                if not saved:\r
+                    return False\r
+        return True\r
+\r
     @QtCore.Slot()\r
     def open_triggered(self):\r
-        d = ""\r
-        try:\r
-            d = os.path.dirname(_mapengine.filename)\r
-        except:\r
-            pass\r
-        filename = QtGui.QFileDialog.getOpenFileName(\r
-            dir=d,\r
-            filter=u"*.pydun;;*.*", selectedFilter=u"*.pydun")\r
-        if filename[0] != u"":\r
-            self.open(filename[0])\r
+        if self.confirmdiscarding():\r
+            d = ""\r
+            try:\r
+                d = os.path.dirname(_mapengine.filename)\r
+            except:\r
+                pass\r
+            filename = QtGui.QFileDialog.getOpenFileName(\r
+                dir=d,\r
+                filter=u"*.pydun;;*.*", selectedFilter=u"*.pydun")\r
+            if filename[0] != u"":\r
+                self.open(filename[0])\r
 \r
     def open(self, filename):\r
         _mapengine.load(filename)\r
-        _undomanager.clear()\r
-        _undomanager.save(_mapengine.savestring())\r
+        _undomanager.init(_mapengine.savestring())\r
         self.setTitle(_mapengine.filename)\r
         try:\r
             self.mainframe.mapframe.repaint()\r
@@ -180,8 +194,10 @@ class MainWindow(QtGui.QMainWindow):
     def save_triggered(self):\r
         if _mapengine.filename:\r
             self.save(_mapengine.filename)\r
+            saved = True\r
         else:\r
-            self.saveas_triggered()\r
+            saved = self.saveas_triggered()\r
+        return saved\r
 \r
     @QtCore.Slot()\r
     def saveas_triggered(self):\r
@@ -195,9 +211,13 @@ class MainWindow(QtGui.QMainWindow):
             filter=u"*.pydun;;*.*", selectedFilter=u"*.pydun")\r
         if filename[0] != u"":\r
             self.save(filename[0])\r
+            return True\r
+        else:\r
+            return False\r
 \r
     def save(self, filename):\r
         _mapengine.save(filename)\r
+        _undomanager.commit()\r
         self.setTitle(_mapengine.filename)\r
 \r
     @QtCore.Slot()\r
@@ -213,9 +233,7 @@ class MainWindow(QtGui.QMainWindow):
     def exit(self):\r
         global config\r
         global configfilename\r
-        if QtGui.QMessageBox.Ok == QtGui.QMessageBox.question(\r
-            self, u"確認", u"終了しますか?",\r
-            (QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)):\r
+        if self.confirmdiscarding():\r
             config["windowSize"] = dict()\r
             config["windowSize"]["width"] = self.size().width()\r
             config["windowSize"]["height"] = self.size().height()\r
@@ -362,7 +380,7 @@ class MainFrame(QtGui.QFrame):
     def create_wall_menu(self, direction):\r
         menu = QtGui.QMenu(self)\r
         for idx, img in enumerate(_mapimages.wall_icons):\r
-            act = QtGui.QAction(self)\r
+            act = QtGui.QAction(_mapimages.wall_texts[idx][direction], self)\r
             act.setIcon(img[direction])\r
 \r
             def triggerd(idx):\r
@@ -689,10 +707,12 @@ class DetailDialog(QtGui.QDialog):
         self.detailtext.setText(u"")\r
         detaillabel.setBuddy(self.detailtext)\r
 \r
-        self.buttonBox = QtGui.QDialogButtonBox(\r
+        self.buttonbox = QtGui.QDialogButtonBox(\r
             QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)\r
-        self.buttonBox.accepted.connect(self.accept)\r
-        self.buttonBox.rejected.connect(self.reject)\r
+        self.buttonbox.accepted.connect(self.accept)\r
+        self.buttonbox.rejected.connect(self.reject)\r
+        self.buttonbox.button(QtGui.QDialogButtonBox.Ok).setText(u"OK")\r
+        self.buttonbox.button(QtGui.QDialogButtonBox.Cancel).setText(u"キャンセル")\r
 \r
         layout = QtGui.QGridLayout()\r
         layout.addWidget(marklabel, 0, 0, 1, 1)\r
@@ -701,7 +721,7 @@ class DetailDialog(QtGui.QDialog):
         layout.addWidget(self.forecolorbox, 0, 3, 1, 1)\r
         layout.addWidget(detaillabel, 1, 0, 1, 1)\r
         layout.addWidget(self.detailtext, 1, 1, 1, 3)\r
-        layout.addWidget(self.buttonBox, 2, 0, 1, 4)\r
+        layout.addWidget(self.buttonbox, 2, 0, 1, 4)\r
         self.setLayout(layout)\r
         self.setModal(True)\r
 \r
@@ -757,10 +777,12 @@ class SetOrigineDialog(QtGui.QDialog):
         self.ybox.setValue(0)\r
         ylabel.setBuddy(self.ybox)\r
 \r
-        self.buttonBox = QtGui.QDialogButtonBox(\r
+        self.buttonbox = QtGui.QDialogButtonBox(\r
             QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)\r
-        self.buttonBox.accepted.connect(self.accept)\r
-        self.buttonBox.rejected.connect(self.reject)\r
+        self.buttonbox.accepted.connect(self.accept)\r
+        self.buttonbox.rejected.connect(self.reject)\r
+        self.buttonbox.button(QtGui.QDialogButtonBox.Ok).setText(u"OK")\r
+        self.buttonbox.button(QtGui.QDialogButtonBox.Cancel).setText(u"キャンセル")\r
 \r
         layout = QtGui.QGridLayout()\r
         layout.addWidget(promptlabel, 0, 0, 1, 4)\r
@@ -769,7 +791,7 @@ class SetOrigineDialog(QtGui.QDialog):
         layout.addWidget(self.xbox, 2, 1, 1, 1)\r
         layout.addWidget(ylabel, 2, 2, 1, 1)\r
         layout.addWidget(self.ybox, 2, 3, 1, 1)\r
-        layout.addWidget(self.buttonBox, 3, 0, 1, 4)\r
+        layout.addWidget(self.buttonbox, 3, 0, 1, 4)\r
         self.setLayout(layout)\r
         self.setModal(True)\r
 \r
@@ -837,6 +859,8 @@ class SetSizeDialog(QtGui.QDialog):
         QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)\r
         self.buttonbox.accepted.connect(self.accept)\r
         self.buttonbox.rejected.connect(self.reject)\r
+        self.buttonbox.button(QtGui.QDialogButtonBox.Ok).setText(u"OK")\r
+        self.buttonbox.button(QtGui.QDialogButtonBox.Cancel).setText(u"キャンセル")\r
 \r
         verticalgroup = QtGui.QButtonGroup(self)\r
         verticalgroup.addButton(self.topbutton)\r
@@ -918,11 +942,15 @@ class SetSizeDialog(QtGui.QDialog):
 \r
 class MapImages(object):\r
     def __init__(self):\r
+        vtext = [u"なし", u"壁", u"扉", u"扉(→)", u"扉(←)", u"一通(→)", u"一通(←)", u"隠", u"隠(→)", u"隠(←)",]\r
+        htext = [u"なし", u"壁", u"扉", u"扉(↓)", u"扉(↑)", u"一通(↓)", u"一通(↑)", u"隠", u"隠(↓)", u"隠(↑)",]\r
         self.wall_images = list()\r
         self.wall_icons = list()\r
+        self.wall_texts = list()\r
         for index in range(10):\r
             self.wall_images.append(dict())\r
             self.wall_icons.append(dict())\r
+            self.wall_texts.append(dict())\r
             for direction in ["v", "h"]:\r
                 filename = os.path.join(\r
                     basedir(),\r
@@ -932,6 +960,8 @@ class MapImages(object):
                 self.wall_images[index][direction] = QtGui.QImage()\r
                 self.wall_images[index][direction].load(filename)\r
                 self.wall_icons[index][direction] = QtGui.QIcon(filename)\r
+            self.wall_texts[index]["v"] = vtext[index]\r
+            self.wall_texts[index]["h"] = htext[index]\r
 \r
     @property\r
     def width(self):\r
@@ -1285,8 +1315,14 @@ class UndoManager(QtCore.QObject):
         self._undo = [None for x in range(self.MAX_UNDO_COUNT)]\r
         self._index = 0\r
         self._undocount = 0\r
+        self._commited = True\r
         self.changed.emit(self.canundo, self.canredo)\r
 \r
+    def init(self, data):\r
+        self.clear()\r
+        self.save(data)\r
+        self._commited = True\r
+\r
     def save(self, obj):\r
         if self._index >= self.MAX_UNDO_COUNT:\r
             self._undo = self._undo[1:]\r
@@ -1295,20 +1331,26 @@ class UndoManager(QtCore.QObject):
         self._undo[self._index] = obj\r
         self._index += 1\r
         self._undocount = 0\r
+        self._commited = False\r
         self.changed.emit(self.canundo, self.canredo)\r
 \r
     def undo(self):\r
         self._index -= 1\r
         self._undocount += 1\r
+        self._commited = False\r
         self.changed.emit(self.canundo, self.canredo)\r
         return self._undo[self._index - 1]\r
 \r
     def redo(self):\r
         self._index += 1\r
         self._undocount -= 1\r
+        self._commited = False\r
         self.changed.emit(self.canundo, self.canredo)\r
         return self._undo[self._index - 1]\r
 \r
+    def commit(self):\r
+        self._commited = True\r
+\r
     @property\r
     def canundo(self):\r
         return (self._index > 1)\r
@@ -1317,6 +1359,10 @@ class UndoManager(QtCore.QObject):
     def canredo(self):\r
         return (self._undocount > 0)\r
 \r
+    @property\r
+    def commited(self):\r
+        return self._commited\r
+\r
 \r
 class PydunColorDialog(QtGui.QColorDialog):\r
     def __init__(self, parent, config):\r
@@ -1342,6 +1388,17 @@ class PydunColorDialog(QtGui.QColorDialog):
         return self._config\r
 \r
 \r
+class PydunAskSaveDialog(QtGui.QMessageBox):\r
+    def __init__(self, parent, filename):\r
+        super(PydunAskSaveDialog, self).__init__(parent)\r
+        self.setText(u"{filename} への変更を保存しますか?".format(filename=filename))\r
+        self.setStandardButtons(QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel)\r
+        self.setDefaultButton(QtGui.QMessageBox.Save)\r
+        self.button(QtGui.QMessageBox.Save).setText(u"保存する(&S)")\r
+        self.button(QtGui.QMessageBox.Discard).setText(u"保存しない(&N)")\r
+        self.button(QtGui.QMessageBox.Cancel).setText(u"キャンセル")\r
+\r
+\r
 def getcolorstring(color):\r
     return "#{r:02x}{g:02x}{b:02x}".format(r=color.red(), g=color.green(), b=color.blue())\r
 \r
@@ -1352,7 +1409,7 @@ def getcolorfromstring(colorstring):
         int(colorstring[5:7], 16))\r
 \r
 def basedir():\r
-    return os.path.dirname(os.path.abspath(sys.argv[0]))\r
+    return os.path.dirname(os.path.abspath(unicode(sys.argv[0], locale.getpreferredencoding())))\r
 \r
 def getlatestversion():\r
     try:\r