Advertisement
bojjenclon

Story Maker

Jan 9th, 2012
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.75 KB | None | 0 0
  1. import sys, os
  2. from PyQt4 import Qt, QtGui, QtCore
  3.  
  4. class MainWindow( QtGui.QMainWindow ):
  5.     width = 640
  6.     height = 480
  7.    
  8.     def __init__( self ):      
  9.         QtGui.QMainWindow.__init__( self )
  10.        
  11.         self.setWindowTitle( "Story Maker" )
  12.         self.setWindowIcon( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/text-x-generic.png' ) )
  13.        
  14.         self.fname = None
  15.        
  16.         menubar = self.menuBar()
  17.        
  18.         newAction = QtGui.QAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/document-new.png' ), '&New', self )
  19.         newAction.setShortcut( 'Ctrl+N' )
  20.         newAction.setStatusTip( 'Start new story' )
  21.        
  22.         saveAction = QtGui.QAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/document-save.png' ), '&Save', self )
  23.         saveAction.setShortcut( 'Ctrl+S' )
  24.         saveAction.setStatusTip( 'Save story' )
  25.        
  26.         saveAsAction = QtGui.QAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/document-save-as.png' ), '&Save as...', self )
  27.         saveAsAction.setShortcut( 'Ctrl+Shift+S' )
  28.         saveAsAction.setStatusTip( 'Save story as...' )
  29.        
  30.         openAction = QtGui.QAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/document-open.png' ), '&Open', self )
  31.         openAction.setShortcut( 'Ctrl+O' )
  32.         openAction.setStatusTip( 'Open story' )
  33.        
  34.         exitAction = QtGui.QAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/process-stop.png' ), '&Exit', self )
  35.         exitAction.setShortcut( 'Ctrl+Q' )
  36.         exitAction.setStatusTip( 'Exit application' )
  37.        
  38.         fileMenu = menubar.addMenu( '&File' )
  39.         fileMenu.addAction( newAction )
  40.         fileMenu.addAction( saveAction )
  41.         fileMenu.addAction( saveAsAction )
  42.         fileMenu.addAction( openAction )
  43.         fileMenu.addSeparator();
  44.         fileMenu.addAction( exitAction )
  45.        
  46.         main = QtGui.QWidget()
  47.        
  48.         grid = QtGui.QGridLayout()
  49.        
  50.         self.tree = QtGui.QTreeWidget( self )
  51.         self.tree.setHeaderLabels( [ 'Text', 'ID' ] )
  52.         self.tree.setContextMenuPolicy( QtCore.Qt.CustomContextMenu )
  53.         self.tree.customContextMenuRequested.connect( self.contextMenu )
  54.         item = QtGui.QTreeWidgetItem( [ 'Main' ], -1 )
  55.         self.tree.addTopLevelItem( item )
  56.         self.tree.setItemSelected( item, True )
  57.        
  58.         self.addText = QtGui.QPushButton( 'Add Text', self )
  59.         addOption = QtGui.QPushButton( 'Add Option', self )
  60.         self.remove = QtGui.QPushButton( 'Remove', self )
  61.        
  62.         grid.addWidget( self.tree, 0, 0, 1, 3 )
  63.         grid.addWidget( self.addText, 1, 0 )
  64.         grid.addWidget( addOption, 1, 1 )
  65.         grid.addWidget( self.remove, 1, 2 )
  66.        
  67.         main.setLayout( grid )
  68.        
  69.         self.setCentralWidget( main )
  70.        
  71.         self.resize( MainWindow.width, MainWindow.height )
  72.         self.center()
  73.        
  74.         self.statusBar().showMessage( 'Ready' )
  75.        
  76.         newAction.triggered.connect( self.newClicked )
  77.         saveAction.triggered.connect( self.saveClicked )
  78.         saveAsAction.triggered.connect( self.saveAsClicked )
  79.         openAction.triggered.connect( self.openClicked )
  80.         exitAction.triggered.connect( QtGui.qApp.quit )
  81.        
  82.         self.connect( self.addText, QtCore.SIGNAL( 'clicked()' ), self.addTextClicked )
  83.         self.connect( addOption, QtCore.SIGNAL( 'clicked()' ), self.addOptionClicked )
  84.         self.connect( self.remove, QtCore.SIGNAL( 'clicked()' ), self.removeClicked )
  85.        
  86.         self.tree.currentItemChanged.connect( self.onChanged )
  87.    
  88.     def contextMenu( self, position ):
  89.         item = self.tree.selectedItems()[0]
  90.        
  91.         menu = QtGui.QMenu()
  92.         if( self.addText.isEnabled() ):
  93.             menu.addAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/list-add.png' ), self.tr( "Add Text" ) )
  94.         menu.addAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/list-add.png' ), self.tr( "Add Option" ) )
  95.         if( item.type() != -1 ):
  96.             menu.addAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/list-remove.png' ), self.tr( "Delete" ) )
  97.         if( item.isExpanded() ):
  98.             menu.addAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/go-up.png' ), self.tr( "Collapse" ) )
  99.         else:
  100.             menu.addAction( QtGui.QIcon( os.path.dirname( os.path.realpath( __file__ ) ) + '/res/icons/go-down.png' ), self.tr( "Expand" ) )
  101.         option = menu.exec_( self.tree.viewport().mapToGlobal( position ) )
  102.        
  103.         if( option != None ):
  104.             main = self.tree.topLevelItem( 0 )
  105.            
  106.             if( option.text() == "Add Text" ):
  107.                 new = QtGui.QTreeWidgetItem( [ 'Text', 'DON\'T EDIT' ], 0 )
  108.                 new.setFlags( new.flags() | ( QtCore.Qt.ItemIsEditable ) )
  109.                
  110.                 item.addChild( new )
  111.                 item.setExpanded( True )
  112.             if( option.text() == "Add Option" ):
  113.                 new = QtGui.QTreeWidgetItem( [ 'Text', '0' ], 1 )
  114.                 new.setFlags( new.flags() | ( QtCore.Qt.ItemIsEditable ) )
  115.                
  116.                 item.addChild( new )
  117.                 item.setExpanded( True )
  118.             elif( option.text() == "Delete" ):
  119.                 main.removeChild( item )
  120.             elif( option.text() == "Collapse" ):
  121.                 item.setExpanded( False )
  122.             elif( option.text() == "Expand" ):
  123.                 item.setExpanded( True )
  124.  
  125.     def newClicked( self ):
  126.         answer = QtGui.QMessageBox.question( self, 'Confirm', 'All unsaved data will be lost, continue?', QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No )
  127.        
  128.         if( answer == QtGui.QMessageBox.Yes ):
  129.             self.tree.clear()
  130.             item = QtGui.QTreeWidgetItem( [ 'Main' ], -1 )
  131.             self.tree.addTopLevelItem( item )
  132.             self.tree.setItemSelected( item, True )
  133.  
  134.     def save( self ):
  135.         f = open( self.fname, 'w' )
  136.            
  137.         main = self.tree.topLevelItem( 0 )
  138.        
  139.         f.write( "<main>\n" )
  140.                
  141.         self.recursiveSave( main, f )
  142.        
  143.         f.write( "</main>\n" )
  144.        
  145.         f.close()
  146.  
  147.     def recursiveSave( self, main, f ):
  148.         if( main.childCount() > 0 ):
  149.             for i in xrange( main.childCount() ):
  150.                 item = main.child( i )
  151.                
  152.                 t = item.type()
  153.                
  154.                 if( t == 0 ):
  155.                     f.write( "<text text='" + item.text( 0 ) + "'>\n" )
  156.                 elif( t == 1 ):
  157.                     f.write( "<option id='" + item.text( 1 ) + "' text='" + item.text( 0 ) + "'>\n" )
  158.                
  159.                 self.recursiveSave( item, f )
  160.                
  161.                 if( t == 0 ):
  162.                     f.write( "</text>\n" )
  163.                 if( t == 1 ):
  164.                     f.write( "</option>\n" )
  165.  
  166.     def saveClicked( self ):
  167.         if( self.fname == None ):
  168.             self.saveAsClicked()
  169.         else:
  170.             self.save()
  171.        
  172.     def saveAsClicked( self ):
  173.         dialog = QtGui.QFileDialog( self )
  174.         dialog.setAcceptMode( QtGui.QFileDialog.AcceptSave )
  175.         dialog.setFileMode( QtGui.QFileDialog.AnyFile )
  176.         dialog.setFilter( self.tr( 'Stories (*.story)' ) )
  177.         dialog.setDefaultSuffix( self.tr( 'story' ) )
  178.         dialog.setConfirmOverwrite( True )
  179.         dialog.exec_()
  180.        
  181.         fname = dialog.selectedFiles()[0]
  182.        
  183.         if( fname != None and fname != '' ):
  184.             if( not fname.endsWith( '.story' ) ):
  185.                 dot = fname.lastIndexOf( '.' )
  186.                
  187.                 if( dot > -1 ):
  188.                     fname = fname[0:dot]
  189.                    
  190.                 fname += '.story'
  191.            
  192.             self.fname = fname
  193.            
  194.             self.save()
  195.        
  196.     def openClicked( self ):
  197.         fname = QtGui.QFileDialog.getOpenFileName( self, 'Open file...', '', 'Stories (*.story)' )
  198.        
  199.         if( fname != None and fname != '' ):
  200.             self.fname = fname
  201.            
  202.             f = QtCore.QFile( fname )
  203.             f.open( QtCore.QIODevice.ReadOnly )
  204.            
  205.             xml = QtCore.QXmlStreamReader( f )
  206.            
  207.             parent = self.tree.topLevelItem( 0 )
  208.             previousParent = None
  209.            
  210.             while( xml.atEnd() != True ):
  211.                 xml.readNext()
  212.                
  213.                 if( xml.isStartDocument() ):
  214.                     continue
  215.                
  216.                 if( xml.isStartElement() ):
  217.                     if( xml.name() == "option" ):
  218.                         print( "<option id='" + str( xml.attributes().value( 'id' ) ) + "' text='" + str( xml.attributes().value( 'text' ) ) + "'>" )
  219.                        
  220.                         new = QtGui.QTreeWidgetItem( [ str( xml.attributes().value( 'text' ) ), str( xml.attributes().value( 'id' ) ) ], 1 )
  221.                         new.setFlags( new.flags() | ( QtCore.Qt.ItemIsEditable ) )
  222.                        
  223.                         parent.addChild( new )
  224.                         parent.setExpanded( True )
  225.                        
  226.                         previousParent = parent
  227.                         parent = new
  228.                     if( xml.name() == "text" ):
  229.                         print( "<text text='" + str( xml.attributes().value( 'text' ) ) + "'>" )
  230.                        
  231.                         new = QtGui.QTreeWidgetItem( [ str( xml.attributes().value( 'text' ) ), 'DON\'T EDIT' ], 0 )
  232.                         new.setFlags( new.flags() | ( QtCore.Qt.ItemIsEditable ) )
  233.                        
  234.                         parent.addChild( new )
  235.                         parent.setExpanded( True )
  236.                        
  237.                         previousParent = parent
  238.                         parent = new
  239.                 elif( xml.isEndElement() ):
  240.                     if( xml.name() == "option" ):
  241.                         print( "</option>" )
  242.                     elif( xml.name() == "text" ):
  243.                         print( "</text>" )
  244.                    
  245.                     parent = previousParent
  246.            
  247.             xml.clear()
  248.             f.close()
  249.            
  250.     def addTextClicked( self ):
  251.         item = self.tree.selectedItems()[0]
  252.        
  253.         new = QtGui.QTreeWidgetItem( [ 'Text', 'DON\'T EDIT' ], 0 )
  254.         new.setFlags( new.flags() | ( QtCore.Qt.ItemIsEditable ) )
  255.        
  256.         item.addChild( new )
  257.         item.setExpanded( True )
  258.        
  259.     def addOptionClicked( self ):
  260.         item = self.tree.selectedItems()[0]
  261.        
  262.         new = QtGui.QTreeWidgetItem( [ 'Text', '0' ], 1 )
  263.         new.setFlags( new.flags() | ( QtCore.Qt.ItemIsEditable ) )
  264.        
  265.         item.addChild( new )
  266.         item.setExpanded( True )
  267.        
  268.     def removeClicked( self ):
  269.         item = self.tree.selectedItems()[0]
  270.         main = self.tree.topLevelItem( 0 )
  271.         main.removeChild( item )
  272.        
  273.     def onChanged( self, current, previous ):
  274.         if( current != None ):
  275.             if( current.type() == -1 ):
  276.                 self.remove.setEnabled( False )
  277.             else:
  278.                 self.remove.setEnabled( True )
  279.            
  280.             if( current.type() == 0 ):
  281.                 self.addText.setEnabled( False )
  282.             else:
  283.                 self.addText.setEnabled( True )
  284.    
  285.     def center( self ):
  286.         screen = QtGui.QDesktopWidget().screenGeometry()
  287.         size = self.geometry()
  288.  
  289.         widthDif = screen.width() - size.width()
  290.         heightDif = screen.height() - size.height()
  291.        
  292.         x = widthDif / 2
  293.         y = heightDif / 2
  294.        
  295.         self.move( x, y )
  296.  
  297. def main():
  298.     app = QtGui.QApplication( sys.argv );
  299.    
  300.     window = MainWindow();
  301.     window.show();
  302.    
  303.     sys.exit( app.exec_() )
  304.  
  305. if __name__ == '__main__':
  306.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement