From: <dav...@us...> - 2007-05-21 00:10:58
|
Revision: 7234 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7234&view=rev Author: davidfancella Date: 2007-05-20 17:10:58 -0700 (Sun, 20 May 2007) Log Message: ----------- Added main window ui file Modified Paths: -------------- tools/acme/trunk/acme tools/acme/trunk/libacme/paths.py Added Paths: ----------- tools/acme/trunk/libacmegui/ tools/acme/trunk/libacmegui/__init__.py tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/resources/ui/ tools/acme/trunk/resources/ui/main.ui Modified: tools/acme/trunk/acme =================================================================== --- tools/acme/trunk/acme 2007-05-20 23:39:04 UTC (rev 7233) +++ tools/acme/trunk/acme 2007-05-21 00:10:58 UTC (rev 7234) @@ -24,74 +24,15 @@ ''' -# Import Psyco if available -# No idea if that speeds up the application or not, though. -try: - import psyco - psyco.full() -except ImportError: - pass - import os, sys, random -import pygame -from pygame.locals import * -from libGUIacme.main import mgGame from libacme import paths -from libGUIacme import graphics -def showSplashScreen(screen, resolution): - #splScr = pygame.image.load(paths.Join("graphics", "logo.png") ) - #splScr = pygame.transform.scale(splScr, resolution) - #splScr.convert() - #screen.blit(splScr, (0,0) ) - #pygame.display.flip() - #return splScr - return screen - -def fadeSplashScreen(screen, splScr): - starttick = float(pygame.time.get_ticks() / 1000.0) - - while 1: - ticks = float(pygame.time.get_ticks() / 1000.0) - if ticks - starttick >= 1: - break - - def main(): - # First make sure we've got fonts - if not pygame.font: - print "No fonts available!" - sys.exit() - resolution = (800,600) - - pygame.init() - screen = pygame.display.set_mode(resolution, pygame.DOUBLEBUF | pygame.RESIZABLE) - # For later, after we have autolayout, we can add this flag to make it so - # the window can be resized - # | pygame.RESIZABLE + paths.InitializePaths() + from libacmegui import mainqt + theApp = mainqt.acmeApp(sys.argv) - theIcon = graphics.LoadImage(paths.Join('icons', 'armagetronad.png')) - pygame.display.set_icon(theIcon) - pygame.key.set_repeat(100,30) - pygame.display.set_caption('ACME') - pygame.mouse.set_visible(1) - #pygame.mixer.music.load(os.path.join("resources", "music", "complete2.mp3")) - #pygame.mixer.music.play() - #splScr = showSplashScreen(screen, resolution) - - #random.seed() - - frames = 0 - ticks = float(pygame.time.get_ticks() / 1000.0) - - theGame = mgGame(ticks, screen, resolution) - - theGame.loop() - - #fadeSplashScreen(screen, splScr) - - - -if __name__ == '__main__': main() +if __name__ == '__main__': + main() Modified: tools/acme/trunk/libacme/paths.py =================================================================== --- tools/acme/trunk/libacme/paths.py 2007-05-20 23:39:04 UTC (rev 7233) +++ tools/acme/trunk/libacme/paths.py 2007-05-21 00:10:58 UTC (rev 7234) @@ -25,36 +25,55 @@ ''' import sys, os -import pygame -from pygame.locals import * -if sys.platform == 'win32': - __basepath = '' - __share = '' - __lib = '' -else: - __basepath = sys.path[0] - if __basepath.startswith(sys.prefix): - __share = os.path.join('share', 'mathguy') - __lib = os.path.join('lib', 'mathguy') +__allPaths = {} + +def InitializePaths(): + global __allPaths + + if sys.platform == 'win32': __home = os.path.expanduser('~/') - else: + __basepath = '' __share = '' __lib = '' + __etc = 'etc' + else: + __basepath = sys.path[0] __home = os.path.expanduser('~') + # installed to some system prefix + if __basepath.startswith(sys.prefix): + __share = os.path.join('share', 'acme') + __lib = os.path.join('lib', 'libacme') + __etc = 'etc' + # installed to any arbitrary prefix + if __basepath.endswith('/lib'): + __basepath = os.path.dirname(__basepath) + __share = os.path.join('share', 'acme') + __lib = os.path.join('lib', 'libacme') + __etc = 'etc' + # run from source directory + else: + __share = '' + __lib = '' + __etc = 'etc' + + __allPaths = { 'resource' : os.path.join(__basepath, __share, "resources"), + 'graphics' : os.path.join(__basepath, __share, "resources", "graphics"), + 'icons' : os.path.join(__basepath, __share, 'resources', 'icons'), + 'fonts' : os.path.join(__basepath, __share, "resources", "fonts"), + 'dtd' : os.path.join(__basepath, __share, "resources", "dtd"), + 'ui' : os.path.join(__basepath, __share, "resources", "ui"), + 'default' : os.path.join(__home, "armagetronmaps") } -__allPaths = { 'resource' : os.path.join(__basepath, __share, "resources"), - 'graphics' : os.path.join(__basepath, __share, "resources", "graphics"), - 'icons' : os.path.join(__basepath, __share, 'resources', 'icons'), - 'fonts' : os.path.join(__basepath, __share, "resources", "fonts"), - 'dtd' : os.path.join(__basepath, __share, "resources", "dtd"), - 'default' : os.path.join(__home, "armagetronmaps") } - # todo: make GetPath throw an exception or something instead if a path isn't known def GetPath(path): + global __allPaths + if __allPaths.has_key(path): return __allPaths[path] else: + print "Don't know path '" + path + "'!" + print __allPaths return None def LoadFont(fontname, size, module=None): @@ -65,11 +84,8 @@ theFont = pygame.font.Font(fontfile, size) return theFont -def Join(mgpath, path): - if GetPath(mgpath) is not None: - return os.path.join(GetPath(mgpath), path) - else: - return None +def JoinPaths(apath, bpath): + return os.path.join(apath, bpath) def SearchModulePath(resource, file, module=None): # first search in the module's specific graphics directory Added: tools/acme/trunk/libacmegui/__init__.py =================================================================== Added: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py (rev 0) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-21 00:10:58 UTC (rev 7234) @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py,v 1.0 0005/01/14 00:50:36 davidfancella Exp $ + + This file is part of Dave's Stupid Alarm Clock. + + Dave's Stupid Alarm Clock is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Dave's Stupid Alarm Clock is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Dave's Stupid Alarm Clock; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 00111-1307 USA + + Dave's Stupid Alarm Clock is copyright 2006 by Dave Fancella + +''' + +from PyQt4 import QtCore, QtGui +from PyQt4 import uic + +from libacme import paths + +print paths.GetPath('ui') +print paths.JoinPaths( paths.GetPath('ui'), 'main.ui') +Ui_acmeMain, throwmeaway = uic.loadUiType( paths.JoinPaths( paths.GetPath('ui'), 'main.ui') ) + +class acmeApp(QtGui.QApplication): + def __init__(self, args): + QtGui.QApplication.__init__(self,args) + + self.mainwin = MainFrame(None) + self.mainwin.show() + + self.exec_() + +class SelectorIcon(QtGui.QListWidgetItem): + panel = None + + def __init__(self, parent, caption, icon, panel): + QtGui.QListWidgetItem.__init__(self, icon, caption, parent) + self.panel = panel + +class MainFrame(QtGui.QMainWindow, Ui_acmeMain): + def __init__(self, args): + QtGui.QMainWindow.__init__(self, args) + + self.setupUi(self) + + '''img = QtGui.QIcon(paths.JoinPaths(paths.GetPath('graphics'),'medium/dsac.png') ) + background = QtGui.QPixmap(paths.JoinPaths(paths.GetPath('graphics'), 'fireman_alarm_mimooh_01.svg') ) + #pm.convertFromImage(img.smoothScale(22, 22), 0) + palette = QtGui.QPalette() + palette.setBrush(self.backgroundRole(), QtGui.QBrush(background) ) + #self.setPalette(palette) + + self._createTrayactions() + self._createTrayMenu() + + self._setupModuleSelector() + + self.tray = QtGui.QSystemTrayIcon(img, self) + self.tray.setContextMenu(self.trayMenu) + self.tray.show() + + self._connectSlots() + dsMain.gCommand.RegisterCallback('timer', self.NotifyTime) + #dsMain.gCommand.RegisterCallback('soundalarm', self.SoundAlarm) + #dsMain.gCommand.RegisterCallback('snoozing', self.SnoozeAlarm) + #dsMain.gCommand.RegisterCallback('unsnoozing', self.UnSnoozeAlarm) + #dsMain.gCommand.RegisterCallback('stopalarm', self.StopAlarm) + #dsMain.gCommand.RegisterCallback('mediaplay', self.NewTrack) + #dsMain.gCommand.RegisterCallback('mediastopplay', self.StopPlayCb) + #dsMain.gCommand.RegisterCallback('mediastartplay', self.StartPlayCb)''' + + def _connectSlots(self): + pass + #QtCore.QObject.connect( self.tray, QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.trayClicked) + + def quit(self): + QtGui.QApplication.quit() + + def trayClicked(self, reason): + if reason == QtGui.QSystemTrayIcon.Trigger: + self.bringtoFront() + + Added: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui (rev 0) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-21 00:10:58 UTC (rev 7234) @@ -0,0 +1,30 @@ +<ui version="4.0" > + <class>MainWindow</class> + <widget class="QMainWindow" name="MainWindow" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>800</width> + <height>600</height> + </rect> + </property> + <property name="windowTitle" > + <string>MainWindow</string> + </property> + <widget class="QWidget" name="centralwidget" /> + <widget class="QMenuBar" name="menubar" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>800</width> + <height>32</height> + </rect> + </property> + </widget> + <widget class="QStatusBar" name="statusbar" /> + </widget> + <resources/> + <connections/> +</ui> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-21 01:36:10
|
Revision: 7235 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7235&view=rev Author: davidfancella Date: 2007-05-20 18:36:05 -0700 (Sun, 20 May 2007) Log Message: ----------- Can't do svn cp without a commit, grrr Modified Paths: -------------- tools/acme/trunk/resources/ui/main.ui Added Paths: ----------- tools/acme/trunk/libacmegui/editors/ tools/acme/trunk/libacmegui/editors/__init__.py tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/editors/mapwidgets/ Added: tools/acme/trunk/libacmegui/editors/__init__.py =================================================================== --- tools/acme/trunk/libacmegui/editors/__init__.py (rev 0) +++ tools/acme/trunk/libacmegui/editors/__init__.py 2007-05-21 01:36:05 UTC (rev 7235) @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' Added: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py (rev 0) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-21 01:36:05 UTC (rev 7235) @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-21 00:10:58 UTC (rev 7234) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-21 01:36:05 UTC (rev 7235) @@ -12,7 +12,58 @@ <property name="windowTitle" > <string>MainWindow</string> </property> - <widget class="QWidget" name="centralwidget" /> + <widget class="QWidget" name="centralwidget" > + <layout class="QVBoxLayout" > + <property name="margin" > + <number>9</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QSplitter" name="splitter" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <widget class="QStackedWidget" name="toolView" > + <widget class="QWidget" name="page" /> + <widget class="QWidget" name="page_2" /> + </widget> + <widget class="QToolBox" name="editToolBox" > + <property name="currentIndex" > + <number>0</number> + </property> + <widget class="QWidget" name="page_3" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>333</width> + <height>457</height> + </rect> + </property> + <attribute name="label" > + <string>Page 1</string> + </attribute> + </widget> + <widget class="QWidget" name="page_4" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>96</width> + <height>26</height> + </rect> + </property> + <attribute name="label" > + <string>Page 2</string> + </attribute> + </widget> + </widget> + </widget> + </item> + </layout> + </widget> <widget class="QMenuBar" name="menubar" > <property name="geometry" > <rect> @@ -22,8 +73,50 @@ <height>32</height> </rect> </property> + <widget class="QMenu" name="menuFile" > + <property name="title" > + <string>File</string> + </property> + <addaction name="actionNew" /> + <addaction name="actionOpen" /> + <addaction name="actionSave" /> + <addaction name="actionSave_As" /> + </widget> + <addaction name="menuFile" /> </widget> <widget class="QStatusBar" name="statusbar" /> + <action name="actionNew" > + <property name="icon" > + <iconset>../icons/spawn.png</iconset> + </property> + <property name="text" > + <string>New</string> + </property> + </action> + <action name="actionOpen" > + <property name="icon" > + <iconset>../icons/fileopen.png</iconset> + </property> + <property name="text" > + <string>Open...</string> + </property> + </action> + <action name="actionSave" > + <property name="icon" > + <iconset>../icons/filesave.png</iconset> + </property> + <property name="text" > + <string>Save</string> + </property> + </action> + <action name="actionSave_As" > + <property name="icon" > + <iconset>../icons/filesaveas.png</iconset> + </property> + <property name="text" > + <string>Save As...</string> + </property> + </action> </widget> <resources/> <connections/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-21 05:01:54
|
Revision: 7236 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7236&view=rev Author: davidfancella Date: 2007-05-20 22:01:54 -0700 (Sun, 20 May 2007) Log Message: ----------- Acme can now display the walls on a map. Modified Paths: -------------- tools/acme/trunk/libacme/map_parser.py tools/acme/trunk/libacme/paths.py tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/resources/ui/main.ui Added Paths: ----------- tools/acme/trunk/libacmegui/editors/mapwidgets/__init__.py tools/acme/trunk/resources/dtd/map-0.2.8_beta3.dtd tools/acme/trunk/resources/dtd/map.dtd tools/acme/trunk/resources/icons/new_map.png Removed Paths: ------------- tools/acme/trunk/resources/dtd/map-0.1-exp.dtd tools/acme/trunk/resources/dtd/map-0.1.dtd Modified: tools/acme/trunk/libacme/map_parser.py =================================================================== --- tools/acme/trunk/libacme/map_parser.py 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/libacme/map_parser.py 2007-05-21 05:01:54 UTC (rev 7236) @@ -49,7 +49,7 @@ class aaEntResolver(EntityResolver): def resolveEntity(self, pubid, sysid): - return paths.Join('dtd', sysid) + return paths.GetPath('dtd', sysid) # The error handler class, empty to ignore errors for now class aaError(ErrorHandler): @@ -98,13 +98,10 @@ vector=vector, angle=angle) if name.lower() == 'wall': - self.currentTag = 'wall' - if name.lower() == 'obstaclewall': - self.currentTag = 'obstaclewall' + self.currentTag = 'wall' - # Now check to see if it's an alarm, or something else - if name.lower() == "map": + if name.lower() == "resource": self.mymode = 'map' self.themap.SetName(attrs.getValue('name')) self.themap.SetAuthor(attrs.getValue('author')) Modified: tools/acme/trunk/libacme/paths.py =================================================================== --- tools/acme/trunk/libacme/paths.py 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/libacme/paths.py 2007-05-21 05:01:54 UTC (rev 7236) @@ -66,27 +66,25 @@ 'default' : os.path.join(__home, "armagetronmaps") } # todo: make GetPath throw an exception or something instead if a path isn't known -def GetPath(path): +def GetPath(path, targetFile=None): global __allPaths if __allPaths.has_key(path): - return __allPaths[path] + if targetFile is None: + return __allPaths[path] + else: + return JoinPaths(__allPaths[path], targetFile) else: print "Don't know path '" + path + "'!" print __allPaths return None -def LoadFont(fontname, size, module=None): - fontfile = fontname + ".ttf" - - fontfile = SearchModulePath("fonts", fontfile, module) - - theFont = pygame.font.Font(fontfile, size) - return theFont - def JoinPaths(apath, bpath): return os.path.join(apath, bpath) +def GetIcon(theIcon): + return JoinPaths( GetPath('icons'), theIcon) + def SearchModulePath(resource, file, module=None): # first search in the module's specific graphics directory if module is not None: Modified: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-21 05:01:54 UTC (rev 7236) @@ -23,3 +23,37 @@ acme is copyright 2005, 2007 by David Fancella ''' + +from PyQt4 import QtGui, QtCore + +from libacme import map_parser + +from libacmegui.editors.mapwidgets import wall + +class mapView(QtGui.QGraphicsView): + def __init__(self, parent): + QtGui.QGraphicsView.__init__(self, parent) + + self.map = QtGui.QGraphicsScene(self) + self.setScene(self.map) + + self.show() + self.theMap = None + + QtCore.QObject.connect(self.map, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) + + def updateSceneP(self, theRect): + print theRect + self.updateScene(theRect) + + def LoadMap(self, theMap): + self.theMap = map_parser.ParseMap(theMap) + + for aWall in self.theMap.walls: + self.map.addItem( wall.Wall(aWall) ) + + self.update() + self.centerOn(0,0) + self.map.addText("Test me") + + \ No newline at end of file Copied: tools/acme/trunk/libacmegui/editors/mapwidgets/__init__.py (from rev 7235, tools/acme/trunk/libacmegui/editors/__init__.py) =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/__init__.py (rev 0) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/__init__.py 2007-05-21 05:01:54 UTC (rev 7236) @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-21 05:01:54 UTC (rev 7236) @@ -28,9 +28,9 @@ from PyQt4 import uic from libacme import paths +from libacmegui.editors import mapEditor -print paths.GetPath('ui') -print paths.JoinPaths( paths.GetPath('ui'), 'main.ui') +# Set up widgets Ui_acmeMain, throwmeaway = uic.loadUiType( paths.JoinPaths( paths.GetPath('ui'), 'main.ui') ) class acmeApp(QtGui.QApplication): @@ -54,42 +54,89 @@ QtGui.QMainWindow.__init__(self, args) self.setupUi(self) - - '''img = QtGui.QIcon(paths.JoinPaths(paths.GetPath('graphics'),'medium/dsac.png') ) - background = QtGui.QPixmap(paths.JoinPaths(paths.GetPath('graphics'), 'fireman_alarm_mimooh_01.svg') ) - #pm.convertFromImage(img.smoothScale(22, 22), 0) - palette = QtGui.QPalette() - palette.setBrush(self.backgroundRole(), QtGui.QBrush(background) ) - #self.setPalette(palette) - - self._createTrayactions() - self._createTrayMenu() - self._setupModuleSelector() + self.mapViewer = mapEditor.mapView(self) + self.toolView.removeWidget(self.toolView.widget(0) ) - self.tray = QtGui.QSystemTrayIcon(img, self) - self.tray.setContextMenu(self.trayMenu) - self.tray.show() + self.toolView.addWidget(self.mapViewer) + + self.toolView.setCurrentWidget(self.mapViewer) self._connectSlots() - dsMain.gCommand.RegisterCallback('timer', self.NotifyTime) - #dsMain.gCommand.RegisterCallback('soundalarm', self.SoundAlarm) - #dsMain.gCommand.RegisterCallback('snoozing', self.SnoozeAlarm) - #dsMain.gCommand.RegisterCallback('unsnoozing', self.UnSnoozeAlarm) - #dsMain.gCommand.RegisterCallback('stopalarm', self.StopAlarm) - #dsMain.gCommand.RegisterCallback('mediaplay', self.NewTrack) - #dsMain.gCommand.RegisterCallback('mediastopplay', self.StopPlayCb) - #dsMain.gCommand.RegisterCallback('mediastartplay', self.StartPlayCb)''' + self._createFileActions() + self._createMenus() def _connectSlots(self): pass #QtCore.QObject.connect( self.tray, QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.trayClicked) + def _createFileActions(self): + self.fileActions = QtGui.QActionGroup(self) + self.fileActionHash = {} + + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('new_map.png') ) ), "&New", self.fileActions) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileNew) + self.fileActions.addAction(tmpAction) + self.fileActionHash['new'] = tmpAction + + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('fileopen.png') ) ), "&Open", self.fileActions) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileOpen) + self.fileActions.addAction(tmpAction) + self.fileActionHash['open'] = tmpAction + + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('filesave.png') ) ), "&Save", self.fileActions) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileSave) + self.fileActions.addAction(tmpAction) + self.fileActionHash['save'] = tmpAction + + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('filesaveas.png') ) ), "Save &As", self.fileActions) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileSaveAs) + self.fileActions.addAction(tmpAction) + self.fileActionHash['save_as'] = tmpAction + + # for stuff Qt Designer doesn't handle + def _createToolbars(self): + '''self.theFileToolbar = QtGui.QToolBar() + self.theFileToolbar.setIconSize( QtCore.QSize(32,32) ) + self.theFileToolbar.addActions(self.fileActions.actions() ) + self.addToolBar(self.theFileToolbar) + + self.templateToolbar = QtGui.QToolBar() + self.templateToolbar.setIconSize( QtCore.QSize(32,32) ) + self.templateBox = QtGui.QComboBox(self.templateToolbar) + self.templateModel = templatemodel.TemplateModel(self.templateBox, "./") + self.templateBox.setModel(self.templateModel) + self.templateToolbar.addWidget(self.templateBox) + QtCore.QObject.connect(self.templateBox, QtCore.SIGNAL("activated(const QString&)"), self.templateSelected) + self.addToolBar(self.templateToolbar) + ''' + pass + + def _createMenus(self): + self.theFileMenu = QtGui.QMenu("&File") + self.theFileMenu.addActions(self.fileActions.actions() ) + self.menubar.addMenu(self.theFileMenu) + + #self.theEditMenu = QtGui.QMenu("&Edit") + #self.theEditMenu.addActions(self.editActions.actions() ) + #self.menubar.addMenu(self.theEditMenu) + def quit(self): QtGui.QApplication.quit() - def trayClicked(self, reason): - if reason == QtGui.QSystemTrayIcon.Trigger: - self.bringtoFront() - - + def fileNew(self): + pass + + def fileOpen(self): + fileName = str(QtGui.QFileDialog.getOpenFileName(self, "Open File", + "./", + "Armagetron Advanced Map Resources (*.aamap *.xml)") ) + + if fileName != "": + self.mapViewer.LoadMap(fileName) + + def fileSave(self): + pass + + def fileSaveAs(self): + pass Deleted: tools/acme/trunk/resources/dtd/map-0.1-exp.dtd =================================================================== --- tools/acme/trunk/resources/dtd/map-0.1-exp.dtd 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/resources/dtd/map-0.1-exp.dtd 2007-05-21 05:01:54 UTC (rev 7236) @@ -1,63 +0,0 @@ -<!-- --> -<!-- Pointless at the moment, but prepared for later --> -<!ELEMENT World (Map)> - -<!-- ATM, a map contain only one Field --> -<!ELEMENT Map (Field)> -<!-- a field - - may have an axes declared - - need at least one spawn - - need at least one wall --> -<!ELEMENT Field (Axes?, Spawn+, Wall+, ObstacleWall*)> - -<!-- <!ELEMENT Axes (Point*,Order)> --> -<!ELEMENT Axes (Axis*)> -<!ELEMENT Spawn EMPTY> -<!ELEMENT Wall (Point | SavePos | RestorePos | Line | Rectangle)+ > -<!ELEMENT Point EMPTY> -<!ELEMENT Axis EMPTY> -<!-- Experimental features --> -<!ELEMENT ObstacleWall (Point)+ > -<!ELEMENT SavePos EMPTY> -<!ELEMENT RestorePos EMPTY> -<!ELEMENT Line EMPTY> -<!ELEMENT Rectangle EMPTY> -<!-- <!ELEMENT Order (PCDATA)> --> - -<!ATTLIST World version CDATA #REQUIRED> - -<!ATTLIST Map name CDATA #REQUIRED> -<!ATTLIST Map version CDATA #REQUIRED> -<!ATTLIST Map author CDATA #REQUIRED> -<!ATTLIST Map category CDATA "unsorted"> - -<!ATTLIST Axes number CDATA "4"> -<!ATTLIST Axes normalize (true | false) "true"> - -<!ATTLIST Spawn x CDATA #REQUIRED> -<!ATTLIST Spawn y CDATA #REQUIRED> -<!ATTLIST Spawn xdir CDATA #IMPLIED> -<!ATTLIST Spawn ydir CDATA #IMPLIED> -<!ATTLIST Spawn angle CDATA #IMPLIED> -<!ATTLIST Spawn length CDATA "1.0"> - -<!-- <!ATTLIST Point num CDATA #IMPLIED> --> -<!ATTLIST Point x CDATA #REQUIRED> -<!ATTLIST Point y CDATA #REQUIRED> - -<!ATTLIST Axis xdir CDATA #IMPLIED> -<!ATTLIST Axis ydir CDATA #IMPLIED> -<!ATTLIST Axis angle CDATA #IMPLIED> -<!ATTLIST Axis length CDATA "1.0"> - -<!ATTLIST Line startx CDATA #REQUIRED> -<!ATTLIST Line starty CDATA #REQUIRED> -<!ATTLIST Line endx CDATA #REQUIRED> -<!ATTLIST Line endy CDATA #REQUIRED> - -<!ATTLIST Rectangle startx CDATA #REQUIRED> -<!ATTLIST Rectangle starty CDATA #REQUIRED> -<!ATTLIST Rectangle endx CDATA #REQUIRED> -<!ATTLIST Rectangle endy CDATA #REQUIRED> - -<!ATTLIST ObstacleWall height CDATA "1.5"> Deleted: tools/acme/trunk/resources/dtd/map-0.1.dtd =================================================================== --- tools/acme/trunk/resources/dtd/map-0.1.dtd 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/resources/dtd/map-0.1.dtd 2007-05-21 05:01:54 UTC (rev 7236) @@ -1,46 +0,0 @@ -<!-- --> -<!-- Pointless at the moment, but prepared for later --> -<!ELEMENT World (Map)> - -<!-- ATM, a map contain only one Field --> -<!ELEMENT Map (Field)> -<!-- a field - - may have an axes declared - - need at least one spawn - - need at least one wall --> -<!ELEMENT Field (Axes?, Spawn+, Wall+)> - -<!-- <!ELEMENT Axes (Point*,Order)> --> -<!ELEMENT Axes (Axis*)> -<!ELEMENT Spawn EMPTY> -<!ELEMENT Wall (Point+) > -<!ELEMENT Point EMPTY> -<!ELEMENT Axis EMPTY> - -<!-- <!ELEMENT Order (PCDATA)> --> - -<!ATTLIST World version CDATA #REQUIRED> - -<!ATTLIST Map name CDATA #REQUIRED> -<!ATTLIST Map version CDATA #REQUIRED> -<!ATTLIST Map author CDATA #REQUIRED> -<!ATTLIST Map category CDATA "unsorted"> - -<!ATTLIST Axes number CDATA "4"> -<!ATTLIST Axes normalize (true | false) "true"> - -<!ATTLIST Spawn x CDATA #REQUIRED> -<!ATTLIST Spawn y CDATA #REQUIRED> -<!ATTLIST Spawn xdir CDATA #IMPLIED> -<!ATTLIST Spawn ydir CDATA #IMPLIED> -<!ATTLIST Spawn angle CDATA #IMPLIED> -<!ATTLIST Spawn length CDATA "1.0"> - -<!-- <!ATTLIST Point num CDATA #IMPLIED> --> -<!ATTLIST Point x CDATA #REQUIRED> -<!ATTLIST Point y CDATA #REQUIRED> - -<!ATTLIST Axis xdir CDATA #IMPLIED> -<!ATTLIST Axis ydir CDATA #IMPLIED> -<!ATTLIST Axis angle CDATA #IMPLIED> -<!ATTLIST Axis length CDATA "1.0"> Added: tools/acme/trunk/resources/dtd/map-0.2.8_beta3.dtd =================================================================== --- tools/acme/trunk/resources/dtd/map-0.2.8_beta3.dtd (rev 0) +++ tools/acme/trunk/resources/dtd/map-0.2.8_beta3.dtd 2007-05-21 05:01:54 UTC (rev 7236) @@ -0,0 +1,63 @@ +<!-- version="0.2.8_beta3" --> +<!ELEMENT Resource (Map)> + +<!ATTLIST Resource + type (aamap) "aamap" + name CDATA #REQUIRED + version CDATA #REQUIRED + author CDATA "Anonymous" + category CDATA "unsorted" + comissioner CDATA #IMPLIED +> + +<!ELEMENT Map (Settings?, World)> + +<!ELEMENT Settings (Setting*)> +<!ELEMENT Setting EMPTY> +<!ATTLIST Setting name CDATA #REQUIRED> +<!ATTLIST Setting value CDATA #REQUIRED> + +<!-- ATM, a map contain only one Field --> +<!ELEMENT World (Field)> +<!-- a field + - may have an axes declared + - need at least one spawn + - need at least one wall --> +<!ELEMENT Field (Axes?, (Spawn | Wall | Zone)*)> + +<!ELEMENT Axes (Axis*)> +<!ELEMENT Spawn EMPTY> +<!ELEMENT Wall (Point+) > +<!ELEMENT Point EMPTY> +<!ELEMENT Axis EMPTY> +<!ELEMENT Zone (ShapeCircle) > + +<!ATTLIST Map version CDATA #REQUIRED> + +<!ATTLIST Field logicalBox (true | false) "true"> + +<!ATTLIST Axes number CDATA "4"> +<!ATTLIST Axes normalize (true | false) "true"> + +<!ATTLIST Spawn x CDATA #REQUIRED> +<!ATTLIST Spawn y CDATA #REQUIRED> +<!ATTLIST Spawn xdir CDATA #IMPLIED> +<!ATTLIST Spawn ydir CDATA #IMPLIED> +<!ATTLIST Spawn angle CDATA #IMPLIED> +<!ATTLIST Spawn length CDATA "1.0"> + +<!ATTLIST Wall height CDATA #IMPLIED> + +<!ATTLIST Point x CDATA #REQUIRED> +<!ATTLIST Point y CDATA #REQUIRED> + +<!ATTLIST Axis xdir CDATA #IMPLIED> +<!ATTLIST Axis ydir CDATA #IMPLIED> +<!ATTLIST Axis angle CDATA #IMPLIED> +<!ATTLIST Axis length CDATA "1.0"> + +<!ATTLIST Zone effect (win | death | fortress ) "death" > + +<!ELEMENT ShapeCircle (Point)> +<!ATTLIST ShapeCircle radius CDATA #REQUIRED> +<!ATTLIST ShapeCircle growth CDATA "0.0"> Added: tools/acme/trunk/resources/dtd/map.dtd =================================================================== --- tools/acme/trunk/resources/dtd/map.dtd (rev 0) +++ tools/acme/trunk/resources/dtd/map.dtd 2007-05-21 05:01:54 UTC (rev 7236) @@ -0,0 +1,63 @@ +<!-- version="0.3.1-a" --> +<!ENTITY % ResourceContents "Map" > +<!ENTITY % ResourceType "aamap" > + +<!-- syntax and naming loosely based on the XHTML 1.1 DTD --> +<!ENTITY % resource.module "INCLUDE"> +<![%resource.module;[ +<!ENTITY % resource.mod + SYSTEM "AATeam/resource-0.3.1-a.dtd"> +%resource.mod;]]> + +<!ELEMENT Map (Settings?, World)> + +<!ELEMENT Settings (Setting*)> +<!ELEMENT Setting EMPTY> +<!ATTLIST Setting name CDATA #REQUIRED> +<!ATTLIST Setting value CDATA #REQUIRED> + +<!-- ATM, a map contain only one Field --> +<!ELEMENT World (Field)> +<!-- a field + - may have an axes declared + - need at least one spawn + - need at least one wall --> +<!ELEMENT Field (Axes?, (Spawn | Wall | Zone)*)> + +<!ELEMENT Axes (Axis*)> +<!ELEMENT Spawn EMPTY> +<!ELEMENT Wall (Point+) > +<!ELEMENT Point EMPTY> +<!ELEMENT Axis EMPTY> +<!ELEMENT Zone (ShapeCircle) > + +<!ATTLIST Map version CDATA #REQUIRED> + +<!ATTLIST Field logicalBox (true | false) "true"> + +<!ATTLIST Axes number CDATA "4"> +<!ATTLIST Axes normalize (true | false) "true"> + +<!ATTLIST Spawn x CDATA #REQUIRED> +<!ATTLIST Spawn y CDATA #REQUIRED> +<!ATTLIST Spawn xdir CDATA #IMPLIED> +<!ATTLIST Spawn ydir CDATA #IMPLIED> +<!ATTLIST Spawn angle CDATA #IMPLIED> +<!ATTLIST Spawn length CDATA "1.0"> + +<!ATTLIST Wall height CDATA #IMPLIED> + +<!ATTLIST Point x CDATA #REQUIRED> +<!ATTLIST Point y CDATA #REQUIRED> + +<!ATTLIST Axis xdir CDATA #IMPLIED> +<!ATTLIST Axis ydir CDATA #IMPLIED> +<!ATTLIST Axis angle CDATA #IMPLIED> +<!ATTLIST Axis length CDATA "1.0"> + +<!ATTLIST Zone effect (win | death | fortress ) "death" > + +<!ELEMENT ShapeCircle (Point)> +<!ATTLIST ShapeCircle radius CDATA #REQUIRED> +<!ATTLIST ShapeCircle growth CDATA "0.0"> + Added: tools/acme/trunk/resources/icons/new_map.png =================================================================== (Binary files differ) Property changes on: tools/acme/trunk/resources/icons/new_map.png ___________________________________________________________________ Name: svn:mime-type + image/png Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-21 01:36:05 UTC (rev 7235) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-21 05:01:54 UTC (rev 7236) @@ -26,10 +26,25 @@ <enum>Qt::Horizontal</enum> </property> <widget class="QStackedWidget" name="toolView" > - <widget class="QWidget" name="page" /> + <property name="sizePolicy" > + <sizepolicy> + <hsizetype>4</hsizetype> + <vsizetype>4</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <widget class="QWidget" name="page_2" /> </widget> <widget class="QToolBox" name="editToolBox" > + <property name="sizePolicy" > + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> <property name="currentIndex" > <number>0</number> </property> @@ -38,7 +53,7 @@ <rect> <x>0</x> <y>0</y> - <width>333</width> + <width>90</width> <height>457</height> </rect> </property> @@ -73,16 +88,6 @@ <height>32</height> </rect> </property> - <widget class="QMenu" name="menuFile" > - <property name="title" > - <string>File</string> - </property> - <addaction name="actionNew" /> - <addaction name="actionOpen" /> - <addaction name="actionSave" /> - <addaction name="actionSave_As" /> - </widget> - <addaction name="menuFile" /> </widget> <widget class="QStatusBar" name="statusbar" /> <action name="actionNew" > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-21 08:48:28
|
Revision: 7240 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7240&view=rev Author: davidfancella Date: 2007-05-21 01:48:29 -0700 (Mon, 21 May 2007) Log Message: ----------- Trying to add zones Modified Paths: -------------- tools/acme/trunk/libacme/map.py tools/acme/trunk/libacme/map_parser.py Added Paths: ----------- tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd Modified: tools/acme/trunk/libacme/map.py =================================================================== --- tools/acme/trunk/libacme/map.py 2007-05-21 08:14:38 UTC (rev 7239) +++ tools/acme/trunk/libacme/map.py 2007-05-21 08:48:29 UTC (rev 7240) @@ -29,6 +29,7 @@ from libacme.mapobjects import wall from libacme.mapobjects import spawn +from libacme.mapobjects import zone # this class contains the map @@ -39,7 +40,7 @@ mapCategory = None spawnPoints = [] walls = [] - obwalls = [] + zones = [] isDirty = None __dom = None @@ -145,6 +146,11 @@ self.isDirty = True theWall = wall.xWall(args['points']) self.walls.append(theWall) + + def AddZone(self, **args): + self.isdirty = True + theZone = zone.xZone(args['pos'], args['radius'], args) + self.zones.append(theZone) def SaveMap(self, filename): theFile = open(filename, 'w') Modified: tools/acme/trunk/libacme/map_parser.py =================================================================== --- tools/acme/trunk/libacme/map_parser.py 2007-05-21 08:14:38 UTC (rev 7239) +++ tools/acme/trunk/libacme/map_parser.py 2007-05-21 08:48:29 UTC (rev 7240) @@ -78,9 +78,11 @@ if self.currentTag == 'wall': if name.lower() == "point": self.points.append( (float(attrs.getValue('x')), float(attrs.getValue('y')) ) ) - if self.currentTag == 'obstaclewall': + if self.currentTag == "zone": + if name.lower() == "shapecircle": + self.radius = float(attrs.getValue('radius') ) if name.lower() == "point": - self.points.append( (float(attrs.getValue('x')), float(attrs.getValue('y')) ) ) + self.center = [float(attrs.getValue('x')), float(attrs.getValue('y')) ] if name.lower() == 'spawn': theNames = attrs.getNames() for a in range(len(theNames)): @@ -116,9 +118,11 @@ self.themap.AddWall(points=self.points) self.points = [] self.currentTag = '' - elif name.lower() == 'obstaclewall': - self.themap.AddObstacleWall(points=self.points) + elif name.lower() == 'zone': + self.themap.AddZone(radius=self.radius, pos=self.center) self.points = [] + self.radius = None + self.center = None self.currentTag = '' def characters(self,content): Copied: tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd (from rev 7236, tools/acme/trunk/resources/dtd/map-0.2.8_beta3.dtd) =================================================================== --- tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd (rev 0) +++ tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd 2007-05-21 08:48:29 UTC (rev 7240) @@ -0,0 +1,63 @@ +<!-- version="0.2.8_beta3" --> +<!ELEMENT Resource (Map)> + +<!ATTLIST Resource + type (aamap) "aamap" + name CDATA #REQUIRED + version CDATA #REQUIRED + author CDATA "Anonymous" + category CDATA "unsorted" + comissioner CDATA #IMPLIED +> + +<!ELEMENT Map (Settings?, World)> + +<!ELEMENT Settings (Setting*)> +<!ELEMENT Setting EMPTY> +<!ATTLIST Setting name CDATA #REQUIRED> +<!ATTLIST Setting value CDATA #REQUIRED> + +<!-- ATM, a map contain only one Field --> +<!ELEMENT World (Field)> +<!-- a field + - may have an axes declared + - need at least one spawn + - need at least one wall --> +<!ELEMENT Field (Axes?, (Spawn | Wall | Zone)*)> + +<!ELEMENT Axes (Axis*)> +<!ELEMENT Spawn EMPTY> +<!ELEMENT Wall (Point+) > +<!ELEMENT Point EMPTY> +<!ELEMENT Axis EMPTY> +<!ELEMENT Zone (ShapeCircle) > + +<!ATTLIST Map version CDATA #REQUIRED> + +<!ATTLIST Field logicalBox (true | false) "true"> + +<!ATTLIST Axes number CDATA "4"> +<!ATTLIST Axes normalize (true | false) "true"> + +<!ATTLIST Spawn x CDATA #REQUIRED> +<!ATTLIST Spawn y CDATA #REQUIRED> +<!ATTLIST Spawn xdir CDATA #IMPLIED> +<!ATTLIST Spawn ydir CDATA #IMPLIED> +<!ATTLIST Spawn angle CDATA #IMPLIED> +<!ATTLIST Spawn length CDATA "1.0"> + +<!ATTLIST Wall height CDATA #IMPLIED> + +<!ATTLIST Point x CDATA #REQUIRED> +<!ATTLIST Point y CDATA #REQUIRED> + +<!ATTLIST Axis xdir CDATA #IMPLIED> +<!ATTLIST Axis ydir CDATA #IMPLIED> +<!ATTLIST Axis angle CDATA #IMPLIED> +<!ATTLIST Axis length CDATA "1.0"> + +<!ATTLIST Zone effect (win | death | fortress ) "death" > + +<!ELEMENT ShapeCircle (Point)> +<!ATTLIST ShapeCircle radius CDATA #REQUIRED> +<!ATTLIST ShapeCircle growth CDATA "0.0"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-21 08:52:42
|
Revision: 7241 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7241&view=rev Author: davidfancella Date: 2007-05-21 01:52:43 -0700 (Mon, 21 May 2007) Log Message: ----------- Just one last commit before going to bed, too sleepy to do anything else. Modified Paths: -------------- tools/acme/trunk/libacme/map.py Added Paths: ----------- tools/acme/trunk/libacme/mapobjects/zone.py tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py tools/acme/trunk/resources/dtd/AATeam/ tools/acme/trunk/resources/dtd/AATeam/map-0.2.8.0.dtd Removed Paths: ------------- tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd Modified: tools/acme/trunk/libacme/map.py =================================================================== --- tools/acme/trunk/libacme/map.py 2007-05-21 08:48:29 UTC (rev 7240) +++ tools/acme/trunk/libacme/map.py 2007-05-21 08:52:43 UTC (rev 7241) @@ -133,9 +133,9 @@ # determine if the angle given is the same angle pointed to by vector # This code is broke - if vectorAngle != angle: - print "Warning: angle is not the same angle that vector points to" - print angle + #if vectorAngle != angle: + # print "Warning: angle is not the same angle that vector points to" + # print angle # ignore it, of course, and only store the angle--in radians posX, posY = args['pos'] Added: tools/acme/trunk/libacme/mapobjects/zone.py =================================================================== --- tools/acme/trunk/libacme/mapobjects/zone.py (rev 0) +++ tools/acme/trunk/libacme/mapobjects/zone.py 2007-05-21 08:52:43 UTC (rev 7241) @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005 by David Fancella + +''' + +from libacme.mapobjects import base_element + +class xZone(base_element.baseElement): + def __init__(self, pos, radius, **args): + super(xZone, self).__init__(**args) + + self.x = pos[0] + self.y = pos[1] + self.radius = radius + Added: tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py (rev 0) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py 2007-05-21 08:52:43 UTC (rev 7241) @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' + +from PyQt4 import QtGui, QtCore + +class Zone(QtGui.QGraphicsItem): + def __init__(self, zoneObj): + #print type(parent) + QtGui.QGraphicsItem.__init__(self) + + # Zones are drawn at the top + self.setZValue(15) + + self.setPos(zoneObj.x, zoneObj.y ) + self.theZone = zoneObj + + def paint(self, painter, option, widget): + painter.setPen(QtCore.Qt.green); + theRect = QtCore.QRectF( -self.theZone.radius, -self.theZone.radius, self.theZone.radius*2, self.theZone.radius*2 ) + + painter.drawEllipse(theRect) + + def boundingRect(self): + #print self.leftx, self.bottomy, self.rightx-self.leftx, self.topy-self.bottomy + return QtCore.QRectF( -self.theZone.radius, -self.theZone.radius, self.theZone.radius*2, self.theZone.radius*2 ) + Copied: tools/acme/trunk/resources/dtd/AATeam/map-0.2.8.0.dtd (from rev 7240, tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd) =================================================================== --- tools/acme/trunk/resources/dtd/AATeam/map-0.2.8.0.dtd (rev 0) +++ tools/acme/trunk/resources/dtd/AATeam/map-0.2.8.0.dtd 2007-05-21 08:52:43 UTC (rev 7241) @@ -0,0 +1,63 @@ +<!-- version="0.2.8_beta3" --> +<!ELEMENT Resource (Map)> + +<!ATTLIST Resource + type (aamap) "aamap" + name CDATA #REQUIRED + version CDATA #REQUIRED + author CDATA "Anonymous" + category CDATA "unsorted" + comissioner CDATA #IMPLIED +> + +<!ELEMENT Map (Settings?, World)> + +<!ELEMENT Settings (Setting*)> +<!ELEMENT Setting EMPTY> +<!ATTLIST Setting name CDATA #REQUIRED> +<!ATTLIST Setting value CDATA #REQUIRED> + +<!-- ATM, a map contain only one Field --> +<!ELEMENT World (Field)> +<!-- a field + - may have an axes declared + - need at least one spawn + - need at least one wall --> +<!ELEMENT Field (Axes?, (Spawn | Wall | Zone)*)> + +<!ELEMENT Axes (Axis*)> +<!ELEMENT Spawn EMPTY> +<!ELEMENT Wall (Point+) > +<!ELEMENT Point EMPTY> +<!ELEMENT Axis EMPTY> +<!ELEMENT Zone (ShapeCircle) > + +<!ATTLIST Map version CDATA #REQUIRED> + +<!ATTLIST Field logicalBox (true | false) "true"> + +<!ATTLIST Axes number CDATA "4"> +<!ATTLIST Axes normalize (true | false) "true"> + +<!ATTLIST Spawn x CDATA #REQUIRED> +<!ATTLIST Spawn y CDATA #REQUIRED> +<!ATTLIST Spawn xdir CDATA #IMPLIED> +<!ATTLIST Spawn ydir CDATA #IMPLIED> +<!ATTLIST Spawn angle CDATA #IMPLIED> +<!ATTLIST Spawn length CDATA "1.0"> + +<!ATTLIST Wall height CDATA #IMPLIED> + +<!ATTLIST Point x CDATA #REQUIRED> +<!ATTLIST Point y CDATA #REQUIRED> + +<!ATTLIST Axis xdir CDATA #IMPLIED> +<!ATTLIST Axis ydir CDATA #IMPLIED> +<!ATTLIST Axis angle CDATA #IMPLIED> +<!ATTLIST Axis length CDATA "1.0"> + +<!ATTLIST Zone effect (win | death | fortress ) "death" > + +<!ELEMENT ShapeCircle (Point)> +<!ATTLIST ShapeCircle radius CDATA #REQUIRED> +<!ATTLIST ShapeCircle growth CDATA "0.0"> Deleted: tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd =================================================================== --- tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd 2007-05-21 08:48:29 UTC (rev 7240) +++ tools/acme/trunk/resources/dtd/map-0.2.8.0.dtd 2007-05-21 08:52:43 UTC (rev 7241) @@ -1,63 +0,0 @@ -<!-- version="0.2.8_beta3" --> -<!ELEMENT Resource (Map)> - -<!ATTLIST Resource - type (aamap) "aamap" - name CDATA #REQUIRED - version CDATA #REQUIRED - author CDATA "Anonymous" - category CDATA "unsorted" - comissioner CDATA #IMPLIED -> - -<!ELEMENT Map (Settings?, World)> - -<!ELEMENT Settings (Setting*)> -<!ELEMENT Setting EMPTY> -<!ATTLIST Setting name CDATA #REQUIRED> -<!ATTLIST Setting value CDATA #REQUIRED> - -<!-- ATM, a map contain only one Field --> -<!ELEMENT World (Field)> -<!-- a field - - may have an axes declared - - need at least one spawn - - need at least one wall --> -<!ELEMENT Field (Axes?, (Spawn | Wall | Zone)*)> - -<!ELEMENT Axes (Axis*)> -<!ELEMENT Spawn EMPTY> -<!ELEMENT Wall (Point+) > -<!ELEMENT Point EMPTY> -<!ELEMENT Axis EMPTY> -<!ELEMENT Zone (ShapeCircle) > - -<!ATTLIST Map version CDATA #REQUIRED> - -<!ATTLIST Field logicalBox (true | false) "true"> - -<!ATTLIST Axes number CDATA "4"> -<!ATTLIST Axes normalize (true | false) "true"> - -<!ATTLIST Spawn x CDATA #REQUIRED> -<!ATTLIST Spawn y CDATA #REQUIRED> -<!ATTLIST Spawn xdir CDATA #IMPLIED> -<!ATTLIST Spawn ydir CDATA #IMPLIED> -<!ATTLIST Spawn angle CDATA #IMPLIED> -<!ATTLIST Spawn length CDATA "1.0"> - -<!ATTLIST Wall height CDATA #IMPLIED> - -<!ATTLIST Point x CDATA #REQUIRED> -<!ATTLIST Point y CDATA #REQUIRED> - -<!ATTLIST Axis xdir CDATA #IMPLIED> -<!ATTLIST Axis ydir CDATA #IMPLIED> -<!ATTLIST Axis angle CDATA #IMPLIED> -<!ATTLIST Axis length CDATA "1.0"> - -<!ATTLIST Zone effect (win | death | fortress ) "death" > - -<!ELEMENT ShapeCircle (Point)> -<!ATTLIST ShapeCircle radius CDATA #REQUIRED> -<!ATTLIST ShapeCircle growth CDATA "0.0"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-21 17:25:42
|
Revision: 7242 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7242&view=rev Author: davidfancella Date: 2007-05-21 10:22:58 -0700 (Mon, 21 May 2007) Log Message: ----------- Added window icon and set a window title Modified Paths: -------------- tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/resources/ui/main.ui Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-21 08:52:43 UTC (rev 7241) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-21 17:22:58 UTC (rev 7242) @@ -36,7 +36,7 @@ class acmeApp(QtGui.QApplication): def __init__(self, args): QtGui.QApplication.__init__(self,args) - + self.mainwin = MainFrame(None) self.mainwin.show() @@ -66,6 +66,8 @@ self._createFileActions() self._createMenus() self._createStatusBar() + + self.setWindowIcon( QtGui.QIcon( paths.GetPath('icons', "armagetronad.png") ) ) def _connectSlots(self): QtCore.QObject.connect( self.mapViewer, QtCore.SIGNAL("mouseHover"), self.mouseHover) Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-21 08:52:43 UTC (rev 7241) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-21 17:22:58 UTC (rev 7242) @@ -10,7 +10,7 @@ </rect> </property> <property name="windowTitle" > - <string>MainWindow</string> + <string>Acme - Armagetron Advanced Resource Editor</string> </property> <widget class="QWidget" name="centralwidget" > <layout class="QVBoxLayout" > @@ -46,34 +46,8 @@ </sizepolicy> </property> <property name="currentIndex" > - <number>0</number> + <number>-1</number> </property> - <widget class="QWidget" name="page_3" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>90</width> - <height>457</height> - </rect> - </property> - <attribute name="label" > - <string>Page 1</string> - </attribute> - </widget> - <widget class="QWidget" name="page_4" > - <property name="geometry" > - <rect> - <x>0</x> - <y>0</y> - <width>96</width> - <height>26</height> - </rect> - </property> - <attribute name="label" > - <string>Page 2</string> - </attribute> - </widget> </widget> </widget> </item> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-22 00:12:44
|
Revision: 7245 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7245&view=rev Author: davidfancella Date: 2007-05-21 17:12:46 -0700 (Mon, 21 May 2007) Log Message: ----------- Drawing grid lines in the main map editor now Modified Paths: -------------- tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py tools/acme/trunk/resources/ui/main.ui Modified: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-21 22:52:35 UTC (rev 7244) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-22 00:12:46 UTC (rev 7245) @@ -91,3 +91,44 @@ self.scale(1/self.scaleFactor, 1/self.scaleFactor) print scaleFactorDelta + + def drawBackground(self, painter, rect): + backBrush = QtGui.QBrush(QtGui.QColor( 0, 0, 0) ) + painter.setBackground(backBrush) + + painter.fillRect(rect, backBrush) + + frontBrush = QtGui.QBrush(QtGui.QColor( 50, 50, 50) ) + painter.setBrush(frontBrush) + frontPen = QtGui.QPen(QtCore.Qt.SolidLine) + frontPen.setBrush(frontBrush) + frontPen.setWidth(1) + painter.setPen(frontPen) + + leftx, bottomy = rect.x(), rect.y() + width, height = rect.width(), rect.height() + + leftStart = leftx + while(leftStart % 50 != 0): + leftStart += 1 + + bottomStart = bottomy + while(bottomStart % 50 != 0): + bottomStart += 1 + + # Draw grid + for a in range(int(leftStart), int(leftx + width), 50 ): + painter.drawLine(a, bottomy, a, bottomy + height) + for a in range(int(bottomStart), int(bottomy + height), 50 ): + painter.drawLine(leftx, a, leftx + width, a) + + frontPen.setWidthF(3.0) + painter.setPen(frontPen) + # Draw axes + if leftx <= 0 and (leftx + width) >= 0: + painter.drawLine(0,bottomy, 0, bottomy + height) + if bottomy <= 0 and (bottomy + height) >= 0: + painter.drawLine(leftx, 0, leftx + width, 0) + + + Modified: tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py 2007-05-21 22:52:35 UTC (rev 7244) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py 2007-05-22 00:12:46 UTC (rev 7245) @@ -40,6 +40,10 @@ def paint(self, painter, option, widget): painter.setPen(QtCore.Qt.black); thePointList = QtGui.QPolygonF() + forePen = QtGui.QPen(QtCore.Qt.SolidLine) + forePen.setColor( QtGui.QColor( 255, 255, 255) ) + forePen.setWidthF(1.8) + painter.setPen(forePen) for a in self.theWall.points: thePointList.append( QtCore.QPointF(a[0], a[1]) ) Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-21 22:52:35 UTC (rev 7244) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-22 00:12:46 UTC (rev 7245) @@ -28,26 +28,30 @@ <widget class="QStackedWidget" name="toolView" > <property name="sizePolicy" > <sizepolicy> - <hsizetype>4</hsizetype> + <hsizetype>7</hsizetype> <vsizetype>4</vsizetype> - <horstretch>1</horstretch> + <horstretch>3</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <widget class="QWidget" name="page_2" /> </widget> - <widget class="QToolBox" name="editToolBox" > + <widget class="QDockWidget" name="propertyBox" > <property name="sizePolicy" > <sizepolicy> <hsizetype>7</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> + <vsizetype>4</vsizetype> + <horstretch>1</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="currentIndex" > - <number>-1</number> + <property name="features" > + <set>QDockWidget::NoDockWidgetFeatures</set> </property> + <property name="windowTitle" > + <string>Properties</string> + </property> + <widget class="QWidget" name="dockWidgetContents" /> </widget> </widget> </item> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-22 03:46:14
|
Revision: 7246 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7246&view=rev Author: davidfancella Date: 2007-05-21 20:46:15 -0700 (Mon, 21 May 2007) Log Message: ----------- Parser works much better now, but only parses spawn points. Modified Paths: -------------- tools/acme/trunk/libacme/map.py tools/acme/trunk/libacme/map_parser.py tools/acme/trunk/libacme/mapobjects/spawn.py tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/editors/mapwidgets/spawn.py tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/resources/ui/main.ui Modified: tools/acme/trunk/libacme/map.py =================================================================== --- tools/acme/trunk/libacme/map.py 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/libacme/map.py 2007-05-22 03:46:15 UTC (rev 7246) @@ -25,58 +25,90 @@ ''' import math -import xml.dom.minidom +from xml import dom + +from libacme import resource from libacme.mapobjects import wall from libacme.mapobjects import spawn from libacme.mapobjects import zone # this class contains the map -class aaMap(object): - mapName = None - mapAuthor = None - mapVersion = None - mapCategory = None - spawnPoints = [] - walls = [] - zones = [] - isDirty = None - - __dom = None - __mapDocument = None +class aaMap(resource.Resource): + __mapObjects = None - def __init__(self): - #self.__dom = xml.dom.minidom.getDOMImplementation() - #self.__mapDocument = self.__dom. - self.mapName = '' - self.mapAuthor = '' - self.mapVersion = '' - self.isDirty = True + def __init__(self, theResource=None): + self.__mapObjects = [] + + if theResource is not None: + self.CopyResource(theResource) + self.Parse(theResource.GetDom() ) + + def GetObjects(self): + if self.__mapObjects is not None: + return self.__mapObjects + + return [] + + def Parse(self, theResource): + theObjects = theResource.getElementsByTagName("Field")[0].childNodes + + for a in theObjects: + if a.nodeType == dom.Node.ELEMENT_NODE: + if a.tagName == "Spawn": + self.ParseSpawn(a) + elif a.tagName == "Wall": + self.ParseWall(a) + elif a.tagName == "Zone": + self.ParseZone(a) + + def ParseSpawn(self, theSpawn): + spawnDict = { + 'x' : theSpawn.getAttribute('x'), + 'y' : theSpawn.getAttribute('y'), + 'xdir' : theSpawn.getAttribute('xdir'), + 'ydir' : theSpawn.getAttribute('ydir'), + 'angle' : theSpawn.getAttribute('angle') + } + + # special case for an empty spawn tag, also make them all the right types + if spawnDict['x'] == "": + spawnDict['x'] = 0.0 + else: + spawnDict['x'] = float(spawnDict['x']) + if spawnDict['y'] == "": + spawnDict['y'] = 0.0 + else: + spawnDict['y'] = float(spawnDict['y']) + + hasxdir = False + if spawnDict['xdir'] == "": + pass + else: + hasxdir = True + spawnDict['xdir'] = float(spawnDict['xdir']) + + hasydir = False + if spawnDict['ydir'] == "": + pass + else: + hasxdir = True + spawnDict['ydir'] = float(spawnDict['ydir']) + + hasangle = False + if spawnDict['angle'] != "": + hasangle = True + spawnDict['angle'] = float(spawnDict['angle']) - def SetName(self, newName): - self.mapName = newName + self.__mapObjects.append( spawn.xSpawn(spawnDict, theSpawn) ) - def SetCategory(self, newName): - self.mapCategory = newName - - def SetAuthor(self, newAuthor): - self.mapAuthor = newAuthor - - def SetVersion(self, newVersion): - self.mapVersion = newVersion - - def GetSpawnInRadius(self, point, radius): - for aa in self.spawnPoints: - spX, spY = aa['pos'] - pX, pY = point - a = abs(pX - spX) - b = abs(pY - spY) - c = math.hypot( a,b ) - if c <= radius : - return aa - return None + def ParseWall(self, theWall): + pass + def ParseZone(self, theZone): + pass + def GetWallContainsPoint(self, point): for a in self.walls: for b in a: @@ -100,80 +132,4 @@ self.isDirty = True return - def AddSpawn(self, **args): - self.isDirty = True - # as in the game, angles override vectors - # since we will be writing all spawn points with angles, - # we throw away the vector - if args.has_key('vector'): - if args['vector'] is not None: - if args['vector'][0] != 0.0: - vectorAngle = math.atan2(args['vector'][1] , args['vector'][0]) - else: - if args['vector'][1] < 0.0: - vectorAngle = math.pi/2.0 - elif args['vector'][1] > 0.0: - vectorAngle = 3.0/2.0 * math.pi - else: - vectorAngle = 0.0 - else: - vectorAngle = None - if args.has_key('angle'): - if args['angle'] == None: - angle = vectorAngle - else: - angle = math.radians(args['angle']) - else: - # special case, both were passed as None, so default to 0 - if vectorAngle is None: - angle = 0.0 - vectorAngle = 0.0 - else: - angle = vectorAngle - - # determine if the angle given is the same angle pointed to by vector - # This code is broke - #if vectorAngle != angle: - # print "Warning: angle is not the same angle that vector points to" - # print angle - - # ignore it, of course, and only store the angle--in radians - posX, posY = args['pos'] - spPos = ( float(posX), float(posY) ) - self.spawnPoints.append( spawn.xSpawn(args['pos'], angle ) ) - def AddWall(self, **args): - self.isDirty = True - theWall = wall.xWall(args['points']) - self.walls.append(theWall) - - def AddZone(self, **args): - self.isdirty = True - theZone = zone.xZone(args['pos'], args['radius'], args) - self.zones.append(theZone) - - def SaveMap(self, filename): - theFile = open(filename, 'w') - - theFile.write('<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>\n') - theFile.write('<!DOCTYPE World SYSTEM "map-0.1.dtd">\n') - theFile.write('<World version="0.1">') - theFile.write('\n') - theFile.write('<Map name="' + self.mapName + '" version="' + self.mapVersion + '" author="' + self.mapAuthor + '" category="' + self.mapCategory + '">\n') - theFile.write(' <Field>\n <Axes number="4"/>\n') - - for sp in self.spawnPoints: - sptxt = '<Spawn x="' + str(sp['pos'][0]) + '" y="' + str(sp['pos'][1]) + '" xdir="1" ydir="0" />\n' - theFile.write(sptxt) - - for sp in self.walls: - theFile.write('<Wall>\n') - for p in sp: - sptxt = '<Point x="' + str(p[0]) + '" y="' + str(p[1]) + '" />\n' - theFile.write(sptxt) - theFile.write('</Wall>\n') - - theFile.write(' </Field>\n</Map>\n</World>') - theFile.close() - - Modified: tools/acme/trunk/libacme/map_parser.py =================================================================== --- tools/acme/trunk/libacme/map_parser.py 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/libacme/map_parser.py 2007-05-22 03:46:15 UTC (rev 7246) @@ -30,6 +30,9 @@ from xml.sax.handler import ErrorHandler from xml.sax.handler import EntityResolver import xml + +from xml.dom import minidom + from libacme.map import aaMap from libacme import paths @@ -38,15 +41,28 @@ # This is the only function you should call externally, it will return a data # structure that contains the map read. def ParseMap(theFile): - contentParser = aaContent() - errorHandler = aaError() + contentParser = aaParser() + contentParser.buildMap( minidom.parse(theFile) ) + '''errorHandler = aaError() theParser = xml.sax.make_parser() theParser.setContentHandler(contentParser) theParser.setEntityResolver( aaEntResolver() ) #theParser.setDTDHandler(None) - theParser.parse(theFile) + theParser.parse(theFile)''' return contentParser.themap +class aaParser(object): + themap = None + + def __init__(self): + self.themap = aaMap() + + def buildMap(self, theDom): + pass + +''' +All this stuff is kept as reference, but isn't used anymore + class aaEntResolver(EntityResolver): def resolveEntity(self, pubid, sysid): return paths.GetPath('dtd', sysid) @@ -134,7 +150,7 @@ def GetMap(self): self.themap.isDirty = True return self.themap +''' - Modified: tools/acme/trunk/libacme/mapobjects/spawn.py =================================================================== --- tools/acme/trunk/libacme/mapobjects/spawn.py 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/libacme/mapobjects/spawn.py 2007-05-22 03:46:15 UTC (rev 7246) @@ -24,13 +24,32 @@ ''' +import math + from libacme.mapobjects import base_element class xSpawn(base_element.baseElement): - def __init__(self, pos, angle, **args): + objType = "spawn" + x = None + y = None + angle = None + xdir = None + ydir = None + theNode = None + + def __init__(self, theSpawn=None, theNode=None, **args): super(xSpawn, self).__init__(**args) - self.x = pos[0] - self.y = pos[1] - self.angle = angle + if theSpawn is not None: + self.theNode = theNode + + self.x = theSpawn['x'] + self.y = theSpawn['y'] + self.xdir = theSpawn['xdir'] + self.ydir = theSpawn['ydir'] + self.angle = theSpawn['angle'] + + if self.angle == "": + self.angle = math.degrees(math.atan2(self.ydir, self.xdir) ) + print self.angle Modified: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-22 03:46:15 UTC (rev 7246) @@ -26,7 +26,7 @@ from PyQt4 import QtGui, QtCore -from libacme import map_parser +from libacme import map from libacmegui.editors.mapwidgets import wall from libacmegui.editors.mapwidgets import spawn @@ -35,6 +35,8 @@ def __init__(self, parent): QtGui.QGraphicsView.__init__(self, parent) + self.setCursor(QtCore.Qt.CrossCursor) + self.mapScene = QtGui.QGraphicsScene(self) self.setScene(self.mapScene) self._mode = "view" @@ -51,27 +53,29 @@ self.updateScene(theRect) def LoadMap(self, theMap): - self.theMap = map_parser.ParseMap(theMap) + self.theMap = map.aaMap(theMap) QtCore.QObject.disconnect(self.mapScene, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) self.mapScene = QtGui.QGraphicsScene(self) self.setScene(self.mapScene) QtCore.QObject.connect(self.mapScene, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) - - for aWall in self.theMap.walls: - self.mapScene.addItem( wall.Wall(aWall) ) - for aSpawn in self.theMap.spawnPoints: - self.mapScene.addItem( spawn.Spawn( aSpawn) ) + for anObj in self.theMap.GetObjects(): + if anObj.objType == "wall": + self.mapScene.addItem( wall.Wall(anObj) ) + elif anObj.objType == "spawn": + self.mapScene.addItem( spawn.Spawn( anObj) ) + self.scale(1,1) def mouseMoveEvent(self, e): if self._mode == "translate": - print self.mouseStart[0] - e.x(), self.mouseStart[1] - e.y() - print self.horizontalScrollBar().maximum() - print self.verticalScrollBar().maximum() - #self.translate( self.mouseStart[0] - e.x(), self.mouseStart[1] - e.y() ) + #print self.mouseStart[0] - e.x(), self.mouseStart[1] - e.y() + #print self.horizontalScrollBar().maximum() + #print self.verticalScrollBar().maximum() + #self.mapScene.translate( self.mouseStart[0] - e.x(), self.mouseStart[1] - e.y() ) + pass self.emit(QtCore.SIGNAL("mouseHover"), self.mapToScene( e.pos() ) ) def mousePressEvent(self, e): @@ -108,11 +112,11 @@ leftx, bottomy = rect.x(), rect.y() width, height = rect.width(), rect.height() - leftStart = leftx + leftStart = int(leftx) while(leftStart % 50 != 0): leftStart += 1 - bottomStart = bottomy + bottomStart = int(bottomy) while(bottomStart % 50 != 0): bottomStart += 1 Modified: tools/acme/trunk/libacmegui/editors/mapwidgets/spawn.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/spawn.py 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/spawn.py 2007-05-22 03:46:15 UTC (rev 7246) @@ -38,7 +38,7 @@ self.setPos(spawnObj.x, spawnObj.y ) self.theSpawn = spawnObj - self.rotate(math.degrees(-self.theSpawn.angle) ) + self.rotate(self.theSpawn.angle) def paint(self, painter, option, widget): painter.setPen(QtCore.Qt.red); Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-22 03:46:15 UTC (rev 7246) @@ -28,6 +28,7 @@ from PyQt4 import uic from libacme import paths +from libacme import resource_parser from libacmegui.editors import mapEditor # Set up widgets @@ -139,7 +140,7 @@ "Armagetron Advanced Map Resources (*.aamap *.xml)") ) if fileName != "": - self.mapViewer.LoadMap(fileName) + self.mapViewer.LoadMap(resource_parser.LoadResource(fileName) ) def fileSave(self): pass Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-22 00:12:46 UTC (rev 7245) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-22 03:46:15 UTC (rev 7246) @@ -30,7 +30,7 @@ <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>4</vsizetype> - <horstretch>3</horstretch> + <horstretch>2</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> @@ -41,7 +41,7 @@ <sizepolicy> <hsizetype>7</hsizetype> <vsizetype>4</vsizetype> - <horstretch>1</horstretch> + <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-22 16:57:37
|
Revision: 7251 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7251&view=rev Author: davidfancella Date: 2007-05-22 09:56:25 -0700 (Tue, 22 May 2007) Log Message: ----------- Fixed zoom feature Modified Paths: -------------- tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py tools/acme/trunk/resources/ui/main.ui Modified: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-22 05:08:49 UTC (rev 7250) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-22 16:56:25 UTC (rev 7251) @@ -32,6 +32,38 @@ from libacmegui.editors.mapwidgets import spawn from libacmegui.editors.mapwidgets import zone +class CrossHairs(QtGui.QGraphicsItem): + def __init__(self): + QtGui.QGraphicsItem.__init__(self) + self.setPos( 0,0 ) + self.setZValue(100) + self.setAcceptedMouseButtons(QtCore.Qt.NoButton) + + def boundingRect(self): + return QtCore.QRectF( -36, -36, 72, 72 ) + + def paint(self, painter, option, widget): + frontBrush = QtGui.QBrush(QtGui.QColor( 0, 255, 0) ) + painter.setBrush(frontBrush) + frontPen = QtGui.QPen(QtCore.Qt.SolidLine) + frontPen.setBrush(frontBrush) + frontPen.setWidth(1) + painter.setPen(frontPen) + painter.drawLine( -26, 0, 26, 0) + painter.drawLine( 0, -26, 0, 26) + +class MapScene(QtGui.QGraphicsScene): + def __init__(self, parent): + QtGui.QGraphicsScene.__init__(self, parent) + #self.snapPointer = CrossHairs() + + #self.addItem(self.snapPointer) + + def mouseMoveEvent(self, eve): + #self.snapPointer.setPos( eve.scenePos() ) + #self.snapPointer.update() + QtGui.QGraphicsScene.mouseMoveEvent(self, eve) + class mapView(QtGui.QGraphicsView): def __init__(self, parent): QtGui.QGraphicsView.__init__(self, parent) @@ -40,7 +72,9 @@ #self.setViewportMargins(3,3,3,3) self.setInteractive(True) - self.mapScene = QtGui.QGraphicsScene(self) + self.currentMousePos = (0, 0) + + self.mapScene = MapScene(self) self.setScene(self.mapScene) self._mode = "view" @@ -60,7 +94,7 @@ QtCore.QObject.disconnect(self.mapScene, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) - self.mapScene = QtGui.QGraphicsScene(self) + self.mapScene = MapScene(self) self.setScene(self.mapScene) QtCore.QObject.connect(self.mapScene, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) @@ -81,14 +115,14 @@ #print self.verticalScrollBar().maximum() #self.mapScene.translate( self.mouseStart[0] - e.x(), self.mouseStart[1] - e.y() ) pass - #self.emit(QtCore.SIGNAL("mouseHover"), self.mapToScene( e.pos() ) ) + self.emit(QtCore.SIGNAL("mouseHover"), self.mapToScene( e.pos() ) ) + self.currentMousePos = ( e.x(), e.y() ) QtGui.QGraphicsView.mouseMoveEvent(self, e) def mousePressEvent(self, e): if e.button() == QtCore.Qt.MidButton: self._mode = "translate" self.mouseStart = [e.x(), e.y()] - print e.button() == QtCore.Qt.MidButton QtGui.QGraphicsView.mousePressEvent(self, e) def mouseReleaseEvent(self, e): @@ -99,14 +133,17 @@ QtGui.QGraphicsView.mouseReleaseEvent(self, e) def wheelEvent(self, e): - scaleFactorDelta = float(e.delta() )/200.0 + scaleFactorDelta = float(e.delta() )/150.0 - if self.scaleFactor + scaleFactorDelta > 0: - self.scaleFactor = self.scaleFactor + scaleFactorDelta - self.scale(1/self.scaleFactor, 1/self.scaleFactor) - + if float(self.scaleFactor) + scaleFactorDelta > 0: + self.scaleFactor = float(self.scaleFactor) - scaleFactorDelta + #self.scale(1.0/self.scaleFactor, 1.0/self.scaleFactor) + if scaleFactorDelta > 0: + self.scale(1.0/scaleFactorDelta, 1.0/scaleFactorDelta) + else: + self.scale(-scaleFactorDelta, -scaleFactorDelta) QtGui.QGraphicsView.wheelEvent(self, e) - + def drawBackground(self, painter, rect): backBrush = QtGui.QBrush(QtGui.QColor( 0, 0, 0) ) painter.setBackground(backBrush) Modified: tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py 2007-05-22 05:08:49 UTC (rev 7250) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py 2007-05-22 16:56:25 UTC (rev 7251) @@ -33,7 +33,7 @@ self.setFlags( QtGui.QGraphicsItem.ItemIsMovable or QtGui.QGraphicsItem.ItemIsSelectable) # Zones are drawn at the top - self.setZValue(15) + self.setZValue(5) self.setPos(zoneObj.x, zoneObj.y ) self.theZone = zoneObj @@ -47,6 +47,8 @@ else: frontPen.setColor(QtCore.Qt.red) + frontPen.setDashPattern( [6, 9] ) + painter.setPen(frontPen) theRect = QtCore.QRectF( -self.theZone.radius, -self.theZone.radius, self.theZone.radius*2, self.theZone.radius*2 ) Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-22 05:08:49 UTC (rev 7250) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-22 16:56:25 UTC (rev 7251) @@ -48,6 +48,9 @@ <property name="features" > <set>QDockWidget::NoDockWidgetFeatures</set> </property> + <property name="allowedAreas" > + <set>Qt::AllDockWidgetAreas</set> + </property> <property name="windowTitle" > <string>Properties</string> </property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-22 22:47:40
|
Revision: 7252 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7252&view=rev Author: davidfancella Date: 2007-05-22 15:47:40 -0700 (Tue, 22 May 2007) Log Message: ----------- Added svnignore file Added Paths: ----------- tools/acme/trunk/.svnignore Property Changed: ---------------- tools/acme/trunk/ Property changes on: tools/acme/trunk ___________________________________________________________________ Name: svn:ignore - *.pyc *.pyo + *.pyc Added: tools/acme/trunk/.svnignore =================================================================== --- tools/acme/trunk/.svnignore (rev 0) +++ tools/acme/trunk/.svnignore 2007-05-22 22:47:40 UTC (rev 7252) @@ -0,0 +1,2 @@ +*.pyc + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-23 03:45:29
|
Revision: 7253 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7253&view=rev Author: davidfancella Date: 2007-05-22 20:45:29 -0700 (Tue, 22 May 2007) Log Message: ----------- Added tabbed widget so multiple resources can be loaded at once. Modified Paths: -------------- tools/acme/trunk/libacme/resource.py tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/resources/ui/main.ui Added Paths: ----------- tools/acme/trunk/libacmegui/toolView.py Modified: tools/acme/trunk/libacme/resource.py =================================================================== --- tools/acme/trunk/libacme/resource.py 2007-05-22 22:47:40 UTC (rev 7252) +++ tools/acme/trunk/libacme/resource.py 2007-05-23 03:45:29 UTC (rev 7253) @@ -43,6 +43,12 @@ def GetDom(self): return self.theDom + def GetType(self): + return self.rType + + def GetName(self): + return self.rName + def LoadResourceFields(self, theDom): resourceNode = theDom.getElementsByTagName('Resource')[0] Modified: tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py 2007-05-22 22:47:40 UTC (rev 7252) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/wall.py 2007-05-23 03:45:29 UTC (rev 7253) @@ -32,6 +32,7 @@ QtGui.QGraphicsItem.__init__(self) self.setFlags( QtGui.QGraphicsItem.ItemIsMovable or QtGui.QGraphicsItem.ItemIsSelectable) + self.setAcceptsHoverEvents(True) # Walls are always drawn first self.setZValue(0) @@ -39,6 +40,8 @@ self.setPos(wallObj.x, wallObj.y ) self.theWall = wallObj + self.hovering = False + def paint(self, painter, option, widget): painter.setPen(QtCore.Qt.black); thePointList = QtGui.QPolygonF() @@ -51,9 +54,32 @@ thePointList.append( QtCore.QPointF(a[0], a[1]) ) painter.drawPolyline(thePointList ) + if self.hovering: + forePen = QtGui.QPen(QtCore.Qt.SolidLine) + forePen.setColor( QtGui.QColor( 255, 0, 0) ) + forePen.setWidthF(1) + theBrush = QtGui.QBrush(QtCore.Qt.RadialGradientPattern ) + theBrush.setColor( QtGui.QColor( 255, 0, 0 ) ) + painter.setBrush( theBrush ) + painter.setPen(forePen) + for a in self.theWall.points: + theRect = QtCore.QRectF( a[0]-2, a[1]-2, 4, 4 ) + + painter.drawEllipse(theRect) + + def hoverEnterEvent(self, eve): + self.hovering = True + print "Hovering!" + self.update() + + def hoverLeaveEvent(self, eve): + self.hovering = False + print "Not Hovering" + self.update() + def boundingRect(self): #print self.leftx, self.bottomy, self.rightx-self.leftx, self.topy-self.bottomy - return QtCore.QRectF( self.theWall.leftx, self.theWall.bottomy, self.theWall.rightx-self.theWall.leftx, self.theWall.topy-self.theWall.bottomy ) + return QtCore.QRectF( self.theWall.leftx-5, self.theWall.bottomy-5, self.theWall.rightx-self.theWall.leftx+10, self.theWall.topy-self.theWall.bottomy+10 ) def shape(self): thePointList = QtGui.QPolygonF() Modified: tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py 2007-05-22 22:47:40 UTC (rev 7252) +++ tools/acme/trunk/libacmegui/editors/mapwidgets/zone.py 2007-05-23 03:45:29 UTC (rev 7253) @@ -56,5 +56,5 @@ def boundingRect(self): #print self.leftx, self.bottomy, self.rightx-self.leftx, self.topy-self.bottomy - return QtCore.QRectF( -self.theZone.radius, -self.theZone.radius, self.theZone.radius*2, self.theZone.radius*2 ) + return QtCore.QRectF( -self.theZone.radius-5, -self.theZone.radius-5, self.theZone.radius*2+10, self.theZone.radius*2+10 ) Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-22 22:47:40 UTC (rev 7252) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-23 03:45:29 UTC (rev 7253) @@ -29,6 +29,7 @@ from libacme import paths from libacme import resource_parser +from libacmegui import toolView from libacmegui.editors import mapEditor # Set up widgets @@ -50,19 +51,46 @@ QtGui.QListWidgetItem.__init__(self, icon, caption, parent) self.panel = panel +class mainView(QtGui.QWidget): + def __init__(self, args): + QtGui.QWidget.__init__(self, args) + + editorLayout = QtGui.QVBoxLayout(self) + + self.splitter1 = QtGui.QSplitter(self) + self.splitter1.setOrientation(QtCore.Qt.Horizontal) + self.splitter1.setContentsMargins(0,0,0,0) + self.mainEditor = toolView.ToolBook(self.splitter1) + + self.toolBox = QtGui.QWidget(self.splitter1) + + editorLayout.addWidget(self.splitter1) + + self.splitter1.setStretchFactor(0, 2) + self.splitter1.setStretchFactor(1, 1) + + def LoadResource(self, theResourcePath): + theResource = resource_parser.LoadResource(theResourcePath) + if theResource.GetType() == "aamap": + aMapEditor = mapEditor.mapView(self) + aMapEditor.LoadMap(theResource) + self.mainEditor.addTab(aMapEditor, theResource.GetName() ) + self.mainEditor.setCurrentWidget(aMapEditor) + + class MainFrame(QtGui.QMainWindow, Ui_acmeMain): def __init__(self, args): QtGui.QMainWindow.__init__(self, args) self.setupUi(self) - self.mapViewer = mapEditor.mapView(self) - self.toolView.removeWidget(self.toolView.widget(0) ) + self.toolView = mainView(self) - self.toolView.addWidget(self.mapViewer) + #self.mapViewer = mapEditor.mapView(self) + #self.toolView.setCurrentWidget(self.toolView) - self.toolView.setCurrentWidget(self.mapViewer) - + self.setCentralWidget(self.toolView) + self._connectSlots() self._createFileActions() self._createMenus() @@ -71,7 +99,7 @@ self.setWindowIcon( QtGui.QIcon( paths.GetPath('icons', "armagetronad.png") ) ) def _connectSlots(self): - QtCore.QObject.connect( self.mapViewer, QtCore.SIGNAL("mouseHover"), self.mouseHover) + QtCore.QObject.connect( self.toolView, QtCore.SIGNAL("mouseHover"), self.mouseHover) def _createFileActions(self): self.fileActions = QtGui.QActionGroup(self) @@ -140,7 +168,7 @@ "Armagetron Advanced Map Resources (*.aamap *.xml)") ) if fileName != "": - self.mapViewer.LoadMap(resource_parser.LoadResource(fileName) ) + self.toolView.LoadResource(str(fileName) ) def fileSave(self): pass Added: tools/acme/trunk/libacmegui/toolView.py =================================================================== --- tools/acme/trunk/libacmegui/toolView.py (rev 0) +++ tools/acme/trunk/libacmegui/toolView.py 2007-05-23 03:45:29 UTC (rev 7253) @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' + +from PyQt4 import QtGui, QtCore + +from libacme import paths + +class ToolBook(QtGui.QTabWidget): + + def __init__(self, parent): + QtGui.QTabWidget.__init__(self, parent) + + self.closeTab = QtGui.QToolButton(self) + self.closeTab.setIcon( QtGui.QIcon( QtGui.QPixmap( paths.GetIcon('close_button.png') ) ) ) + + self.setCornerWidget(self.closeTab, QtCore.Qt.BottomLeftCorner) + self.setTabPosition(QtGui.QTabWidget.South) + #self.setContentsMargin(0,0,0,0) + + self._connectSlots() + + def _connectSlots(self): + pass + + + + + + + + + + Modified: tools/acme/trunk/resources/ui/main.ui =================================================================== --- tools/acme/trunk/resources/ui/main.ui 2007-05-22 22:47:40 UTC (rev 7252) +++ tools/acme/trunk/resources/ui/main.ui 2007-05-23 03:45:29 UTC (rev 7253) @@ -15,49 +15,11 @@ <widget class="QWidget" name="centralwidget" > <layout class="QVBoxLayout" > <property name="margin" > - <number>9</number> + <number>3</number> </property> <property name="spacing" > <number>6</number> </property> - <item> - <widget class="QSplitter" name="splitter" > - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <widget class="QStackedWidget" name="toolView" > - <property name="sizePolicy" > - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>4</vsizetype> - <horstretch>2</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <widget class="QWidget" name="page_2" /> - </widget> - <widget class="QDockWidget" name="propertyBox" > - <property name="sizePolicy" > - <sizepolicy> - <hsizetype>7</hsizetype> - <vsizetype>4</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="features" > - <set>QDockWidget::NoDockWidgetFeatures</set> - </property> - <property name="allowedAreas" > - <set>Qt::AllDockWidgetAreas</set> - </property> - <property name="windowTitle" > - <string>Properties</string> - </property> - <widget class="QWidget" name="dockWidgetContents" /> - </widget> - </widget> - </item> </layout> </widget> <widget class="QMenuBar" name="menubar" > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-23 03:51:22
|
Revision: 7254 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7254&view=rev Author: davidfancella Date: 2007-05-22 20:51:24 -0700 (Tue, 22 May 2007) Log Message: ----------- Added close button to tab widget Modified Paths: -------------- tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/libacmegui/toolView.py Added Paths: ----------- tools/acme/trunk/resources/icons/close_button.png Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-23 03:45:29 UTC (rev 7253) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-23 03:51:24 UTC (rev 7254) @@ -56,7 +56,7 @@ QtGui.QWidget.__init__(self, args) editorLayout = QtGui.QVBoxLayout(self) - + self.splitter1 = QtGui.QSplitter(self) self.splitter1.setOrientation(QtCore.Qt.Horizontal) self.splitter1.setContentsMargins(0,0,0,0) @@ -76,7 +76,10 @@ aMapEditor.LoadMap(theResource) self.mainEditor.addTab(aMapEditor, theResource.GetName() ) self.mainEditor.setCurrentWidget(aMapEditor) + QtCore.QObject.connect( aMapEditor, QtCore.SIGNAL("mouseHover"), self.mouseHover) + def mouseHover(self, eve): + self.emit(QtCore.SIGNAL("mouseHover"), eve) class MainFrame(QtGui.QMainWindow, Ui_acmeMain): def __init__(self, args): Modified: tools/acme/trunk/libacmegui/toolView.py =================================================================== --- tools/acme/trunk/libacmegui/toolView.py 2007-05-23 03:45:29 UTC (rev 7253) +++ tools/acme/trunk/libacmegui/toolView.py 2007-05-23 03:51:24 UTC (rev 7254) @@ -34,7 +34,7 @@ QtGui.QTabWidget.__init__(self, parent) self.closeTab = QtGui.QToolButton(self) - self.closeTab.setIcon( QtGui.QIcon( QtGui.QPixmap( paths.GetIcon('close_button.png') ) ) ) + self.closeTab.setIcon( QtGui.QIcon( QtGui.QPixmap( paths.GetPath('icons', 'close_button.png') ) ) ) self.setCornerWidget(self.closeTab, QtCore.Qt.BottomLeftCorner) self.setTabPosition(QtGui.QTabWidget.South) Added: tools/acme/trunk/resources/icons/close_button.png =================================================================== (Binary files differ) Property changes on: tools/acme/trunk/resources/icons/close_button.png ___________________________________________________________________ Name: svn:mime-type + image/png This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-23 22:45:00
|
Revision: 7257 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7257&view=rev Author: davidfancella Date: 2007-05-23 15:44:58 -0700 (Wed, 23 May 2007) Log Message: ----------- Random commit, going to the bedroom. Acme probably doesn't work at this moment because of this, sorry. Modified Paths: -------------- tools/acme/trunk/libacme/resource.py tools/acme/trunk/libacmegui/editors/editorbase.py tools/acme/trunk/libacmegui/editors/genericEditor.py tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/mainqt.py Added Paths: ----------- tools/acme/trunk/resources/icons/package.png Modified: tools/acme/trunk/libacme/resource.py =================================================================== --- tools/acme/trunk/libacme/resource.py 2007-05-23 06:06:05 UTC (rev 7256) +++ tools/acme/trunk/libacme/resource.py 2007-05-23 22:44:58 UTC (rev 7257) @@ -34,12 +34,20 @@ rVersion = None rCategory = None + thePath = None + def __init__(self, theDom = None): if theDom is not None: self.LoadResourceFields(theDom) self.theDom = theDom + # This method must not be implemented in base classes + def SaveFile(self, thePath): + theFile = open(thePath, "w") + + self.theDom.writexml(theFile) + def GetDom(self): return self.theDom Modified: tools/acme/trunk/libacmegui/editors/editorbase.py =================================================================== --- tools/acme/trunk/libacmegui/editors/editorbase.py 2007-05-23 06:06:05 UTC (rev 7256) +++ tools/acme/trunk/libacmegui/editors/editorbase.py 2007-05-23 22:44:58 UTC (rev 7257) @@ -44,6 +44,16 @@ def idstr(self): return str(self.__id) + # CommitToDom needs to yield values that start at 0 and progress to 100. It can skip as needed, and + # these integers should indicate the percentage of dom-committing that's complete. + def CommitToDom(self): + print "EditorBase: CommitToDom not implemented yet" + return [100] + + def GetResource(self): + print "EditorBase: GetResource not implemented yet" + return None + def LoadResource(self, thePath): print "EditorBase: LoadResource not implemented yet" Modified: tools/acme/trunk/libacmegui/editors/genericEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/genericEditor.py 2007-05-23 06:06:05 UTC (rev 7256) +++ tools/acme/trunk/libacmegui/editors/genericEditor.py 2007-05-23 22:44:58 UTC (rev 7257) @@ -33,8 +33,13 @@ QtGui.QTextEdit.__init__(self, parent) editorbase.EditorBase.__init__(self, toolboxparent) + self.theResource = None + def LoadResource(self, theResource): + self.theResource = theResource + theText = QtGui.QTextDocument(theResource.theDom.toxml(), self) self.setDocument(theText) + + - Modified: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-23 06:06:05 UTC (rev 7256) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-23 22:44:58 UTC (rev 7257) @@ -110,6 +110,9 @@ def GetActions(self): return self.actionList + def GetResource(self): + return self.theMap + def notImpl(self): print "This feature not yet implemented, whatever it is" Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-23 06:06:05 UTC (rev 7256) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-23 22:44:58 UTC (rev 7257) @@ -97,7 +97,8 @@ self.editorList[anEditor.idstr()] = { 'editor' : anEditor, 'toolbox' : theToolBox, - 'actions' : theActionList } + 'actions' : theActionList, + 'resource' : anEditor.GetResource() } self.mainEditor.setCurrentWidget(anEditor) @@ -105,6 +106,15 @@ return anEditor + def SaveActiveResource(self, thePath): + anEditor = self.mainEditor.currentWidget() + + for a in anEditor.CommitToDom(): + print a + theResource = anEditor.GetResource() + if theResource is not None: + theResource.SaveFile(thePath) + def LoadResource(self, theResourcePath): theResource = resource_parser.LoadResource(theResourcePath) if theResource.GetType() == "aamap": @@ -112,6 +122,9 @@ else: anEditor = self.NewEditor(genericEditor.genericEditor) anEditor.LoadResource(theResource) + + self.editorList[anEditor.idstr()]['path'] = theResourcePath + self.mainEditor.setTabText(self.mainEditor.indexOf(anEditor), theResource.GetName() ) def mouseHover(self, eve): @@ -164,7 +177,16 @@ QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileSaveAs) self.fileActions.addAction(tmpAction) self.fileActionHash['save_as'] = tmpAction + + tmpAction = QtGui.QAction(self.fileActions) + tmpAction.setSeparator(True) + self.fileActions.addAction(tmpAction) + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('package.png') ) ), "&Package", self.fileActions) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.filePackage) + self.fileActions.addAction(tmpAction) + self.fileActionHash['package'] = tmpAction + # for stuff Qt Designer doesn't handle def _createToolbars(self): self.theFileToolbar = QtGui.QToolBar() @@ -180,6 +202,10 @@ def _createMenus(self): self.theFileMenu = QtGui.QMenu("&File") self.theFileMenu.addActions(self.fileActions.actions() ) + self.theFileMenu.addSeparator() + self.theFileMenu.addAction("Preferences", self.filePreferences) + self.theFileMenu.addSeparator() + self.theFileMenu.addAction("&Quit", self.quit) self.menubar.addMenu(self.theFileMenu) #self.theEditMenu = QtGui.QMenu("&Edit") @@ -207,7 +233,7 @@ def fileOpen(self): fileName = str(QtGui.QFileDialog.getOpenFileName(self, "Open File", "./", - "Armagetron Advanced Map Resources (*.aamap *.xml)") ) + "Armagetron Advanced Resources (*.xml)") ) if fileName != "": self.toolView.LoadResource(str(fileName) ) @@ -216,7 +242,18 @@ pass def fileSaveAs(self): + fileName = str(QtGui.QFileDialog.getSaveFileName(self, "Save As...", + "./", + "Armagetron Advanced Resources (*.xml)") ) + + if fileName != "": + self.toolView.SaveActiveResource(str(fileName) ) + + def filePackage(self): pass + def filePreferences(self): + pass + def mouseHover(self, pos): self.statusText.setText( str(pos.x()) + ", " + str(pos.y() ) ) Added: tools/acme/trunk/resources/icons/package.png =================================================================== (Binary files differ) Property changes on: tools/acme/trunk/resources/icons/package.png ___________________________________________________________________ Name: svn:mime-type + image/png This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-24 02:24:21
|
Revision: 7258 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7258&view=rev Author: davidfancella Date: 2007-05-23 19:24:13 -0700 (Wed, 23 May 2007) Log Message: ----------- Wired up the save buttons and made the generic resource editor save files. Modified Paths: -------------- tools/acme/trunk/libacmegui/editors/editorbase.py tools/acme/trunk/libacmegui/editors/genericEditor.py tools/acme/trunk/libacmegui/mainqt.py tools/acme/trunk/libacmegui/toolView.py tools/acme/trunk/resources/icons/fileopen.png tools/acme/trunk/resources/icons/filesave.png tools/acme/trunk/resources/icons/filesaveas.png Added Paths: ----------- tools/acme/trunk/resources/icons/save_all.png Modified: tools/acme/trunk/libacmegui/editors/editorbase.py =================================================================== --- tools/acme/trunk/libacmegui/editors/editorbase.py 2007-05-23 22:44:58 UTC (rev 7257) +++ tools/acme/trunk/libacmegui/editors/editorbase.py 2007-05-24 02:24:13 UTC (rev 7258) @@ -43,27 +43,37 @@ def idstr(self): return str(self.__id) - + + # Override this to tell the parent your document has changes + def HasChanges(self): + print "EditorBase: HasChanges not implemented yet" + return True + # CommitToDom needs to yield values that start at 0 and progress to 100. It can skip as needed, and # these integers should indicate the percentage of dom-committing that's complete. def CommitToDom(self): print "EditorBase: CommitToDom not implemented yet" return [100] - + + # Override this to provide access to the resource object, which must inherit Resource def GetResource(self): print "EditorBase: GetResource not implemented yet" return None + # Override this to parse the resource. You will receive an instance of Resource def LoadResource(self, thePath): print "EditorBase: LoadResource not implemented yet" + # Override this to create a new resource for the editor def NewResource(self): print "EditorBase: NewResource not implemented yet" + # Return a dict that contains the actions def GetActions(self): print "EditorBase: GetActions not implemented yet" return None + # Return a QWidget subclass that will be placed in the toolbox area on the right of the ui def GetToolBox(self): print "EditorBase: GetToolBox not implemented yet" return QtGui.QWidget(self.toolBoxParent) Modified: tools/acme/trunk/libacmegui/editors/genericEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/genericEditor.py 2007-05-23 22:44:58 UTC (rev 7257) +++ tools/acme/trunk/libacmegui/editors/genericEditor.py 2007-05-24 02:24:13 UTC (rev 7258) @@ -32,14 +32,40 @@ def __init__(self, parent, toolboxparent): QtGui.QTextEdit.__init__(self, parent) editorbase.EditorBase.__init__(self, toolboxparent) - + self.theDocument = QtGui.QTextDocument(self) + self.setDocument(self.theDocument) + self.theHighlighter = ResourceHighlighter(self.theDocument) self.theResource = None + QtCore.QObject.connect( self.theDocument, QtCore.SIGNAL("modificationChanged(bool)"), self.modificationChanged) + def LoadResource(self, theResource): self.theResource = theResource - theText = QtGui.QTextDocument(theResource.theDom.toxml(), self) - self.setDocument(theText) + self.theDocument.setPlainText(theResource.theDom.toxml() ) + #self.setDocument(theText) + self.theDocument.setModified(False) + def GetResource(self): + return self.theResource + def HasChanges(self): + return self.theDocument.isModified() + def modificationChanged(self, state): + self.emit( QtCore.SIGNAL("modificationChanged"), state) + +sourceState = { + 'comment': 1, + 'generic': 0, + 'attribute': 2, + 'keyword': 3 +} + +class ResourceHighlighter(QtGui.QSyntaxHighlighter): + '''def __init__(self, parent): + QtGui.QSyntaxHighlighter(parent) + pass + ''' + def highlightBlock(self, text): + pass Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-23 22:44:58 UTC (rev 7257) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-24 02:24:13 UTC (rev 7258) @@ -52,6 +52,11 @@ QtGui.QListWidgetItem.__init__(self, icon, caption, parent) self.panel = panel +def GetSaveFile(): + return str(QtGui.QFileDialog.getSaveFileName(self, "Save As...", + "./", + "Armagetron Advanced Resources (*.xml)") ) + class mainView(QtGui.QWidget): editorList = None @@ -73,18 +78,52 @@ self.splitter1.setStretchFactor(1, 1) self.editorList = {} - - self.NewEditor(genericEditor.genericEditor) self._connectSlots() def _connectSlots(self): QtCore.QObject.connect( self.mainEditor, QtCore.SIGNAL("editorSelected"), self.SelectEditor) + QtCore.QObject.connect( self.mainEditor, QtCore.SIGNAL("editorClose"), self.CloseEditor) + def count(self): + return self.mainEditor.count() + + def ActiveWidgetHasChanges(self): + return self.mainEditor.currentWidget().HasChanges() + def SelectEditor(self, theEditor): self.toolBox.setCurrentWidget( self.editorList[theEditor.idstr()]['toolbox'] ) self.parent().SetEditorActions( self.editorList[theEditor.idstr()]['actions'] ) + self.emit( QtCore.SIGNAL("editorSelected") ) + + def CloseEditor(self, theEditor): + if theEditor.HasChanges(): + theResource = theEditor.GetResource() + theFilename = "<unnamed>" + if theResource is not None: + theFilename = theResource.GetName() + + userWants = QtGui.QMessageBox.warning(self, + theFilename + " has changes", + theFilename + " has changes that have not been saved. Do you want to save them now?", + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | QtGui.QMessageBox.Cancel, + QtGui.QMessageBox.Yes ) + if userWants == QtGui.QMessageBox.Yes: + thePath = "" + if theFilename == "<unnamed>": + thePath = GetSaveFile() + else: + thePath = self.editorList[theEditor.idstr()]['path'] + self.SaveResource(theEditor, thePath) + elif userWants == QtGui.QMessageBox.No: + pass + else: + return + self.toolBox.removeWidget( self.editorList[theEditor.idstr()]['toolbox'] ) + self.parent().RemoveEditorActions() + self.mainEditor.removeTab( self.mainEditor.indexOf(theEditor) ) + def NewEditor(self, editorType): anEditor = editorType(self, self.toolBox) anEditor.NewResource() @@ -98,23 +137,47 @@ self.editorList[anEditor.idstr()] = { 'editor' : anEditor, 'toolbox' : theToolBox, 'actions' : theActionList, - 'resource' : anEditor.GetResource() } + 'resource' : anEditor.GetResource(), + 'path' : None } self.mainEditor.setCurrentWidget(anEditor) QtCore.QObject.connect( anEditor, QtCore.SIGNAL("mouseHover"), self.mouseHover) + QtCore.QObject.connect( anEditor, QtCore.SIGNAL("modificationChanged"), self.ContentsChanged) + self.emit( QtCore.SIGNAL("editorSelected") ) return anEditor - def SaveActiveResource(self, thePath): - anEditor = self.mainEditor.currentWidget() - + def HasAnyChanges(self): + for a in range(self.mainEditor.count() ): + if self.mainEditor.widget(a).HasChanges(): + return True + return False + + def SaveAll(self): + theActiveWidget = self.mainEditor.currentWidget() + for a in range(self.mainEditor.count() ): + self.SaveResource( self.mainEditor.widget(a), self.editorList[anEditor.idstr()]['path'] ) + self.mainEditor.setCurrentWidget(theActiveWidget) + + def SaveResource(self, theEditor, thePath): for a in anEditor.CommitToDom(): print a theResource = anEditor.GetResource() + if thePath is None: + self.mainEditor.setCurrentWidget(theEditor) + thePath = GetSaveFile() if theResource is not None: theResource.SaveFile(thePath) + def SaveActiveResource(self, thePath=None): + anEditor = self.mainEditor.currentWidget() + if thePath is None: + thePath = self.editorList[anEditor.idstr()]['path'] + else: + self.editorList[anEditor.idstr()]['path'] = thePath + self.SaveResource(anEditor, thePath) + def LoadResource(self, theResourcePath): theResource = resource_parser.LoadResource(theResourcePath) if theResource.GetType() == "aamap": @@ -126,7 +189,11 @@ self.editorList[anEditor.idstr()]['path'] = theResourcePath self.mainEditor.setTabText(self.mainEditor.indexOf(anEditor), theResource.GetName() ) - + self.emit( QtCore.SIGNAL("activeContentChanged") ) + + def ContentsChanged(self, state): + self.emit( QtCore.SIGNAL("modificationChanged"), state) + def mouseHover(self, eve): self.emit(QtCore.SIGNAL("mouseHover"), eve) @@ -153,6 +220,9 @@ def _connectSlots(self): QtCore.QObject.connect( self.toolView, QtCore.SIGNAL("mouseHover"), self.mouseHover) + QtCore.QObject.connect( self.toolView, QtCore.SIGNAL("editorSelected"), self.EditorSelected) + QtCore.QObject.connect( self.toolView, QtCore.SIGNAL("activeContentChanged"), self.ActiveContentChanged) + QtCore.QObject.connect( self.toolView, QtCore.SIGNAL("modificationChanged"), self.ContentChanged) def _createFileActions(self): self.fileActions = QtGui.QActionGroup(self) @@ -170,14 +240,22 @@ tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('filesave.png') ) ), "&Save", self.fileActions) QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileSave) + tmpAction.setEnabled(False) self.fileActions.addAction(tmpAction) self.fileActionHash['save'] = tmpAction tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('filesaveas.png') ) ), "Save &As", self.fileActions) QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileSaveAs) self.fileActions.addAction(tmpAction) + tmpAction.setEnabled(False) self.fileActionHash['save_as'] = tmpAction + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('save_all.png') ) ), "Save All", self.fileActions) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.fileSaveAll) + self.fileActions.addAction(tmpAction) + tmpAction.setEnabled(False) + self.fileActionHash['save_all'] = tmpAction + tmpAction = QtGui.QAction(self.fileActions) tmpAction.setSeparator(True) self.fileActions.addAction(tmpAction) @@ -219,6 +297,28 @@ def quit(self): QtGui.QApplication.quit() + def EditorSelected(self): + self.ActiveContentChanged() + + def ActiveContentChanged(self): + if self.toolView.ActiveWidgetHasChanges(): + self.fileActionHash['save'].setEnabled(True) + else: + self.fileActionHash['save'].setEnabled(False) + + if self.toolView.count() > 0: + self.fileActionHash['save_as'].setEnabled(True) + else: + self.fileActionHash['save_as'].setEnabled(False) + + if self.toolView.HasAnyChanges(): + self.fileActionHash['save_all'].setEnabled(True) + else: + self.fileActionHash['save_all'].setEnabled(False) + + def ContentChanged(self): + self.ActiveContentChanged() + def SetEditorActions(self, theActions): if theActions is not None: self.editorToolbar.clear() @@ -227,6 +327,10 @@ else: self.editorToolbar.hide() + def RemoveEditorActions(self): + self.editorToolbar.clear() + self.editorToolbar.hide() + def fileNew(self): pass @@ -239,16 +343,17 @@ self.toolView.LoadResource(str(fileName) ) def fileSave(self): - pass + self.toolView.SaveActiveResource() def fileSaveAs(self): - fileName = str(QtGui.QFileDialog.getSaveFileName(self, "Save As...", - "./", - "Armagetron Advanced Resources (*.xml)") ) + fileName = GetSaveFile() if fileName != "": self.toolView.SaveActiveResource(str(fileName) ) + def fileSaveAll(self): + self.toolView.SaveAll() + def filePackage(self): pass Modified: tools/acme/trunk/libacmegui/toolView.py =================================================================== --- tools/acme/trunk/libacmegui/toolView.py 2007-05-23 22:44:58 UTC (rev 7257) +++ tools/acme/trunk/libacmegui/toolView.py 2007-05-24 02:24:13 UTC (rev 7258) @@ -47,7 +47,7 @@ QtCore.QObject.connect(self, QtCore.SIGNAL("currentChanged(int)"), self.editorChanged) def closeTabClick(self, status): - print "Close tab button clicked" + self.emit( QtCore.SIGNAL("editorClose"), self.currentWidget() ) def editorChanged(self, index): self.emit( QtCore.SIGNAL("editorSelected"), self.widget(index) ) Modified: tools/acme/trunk/resources/icons/fileopen.png =================================================================== (Binary files differ) Modified: tools/acme/trunk/resources/icons/filesave.png =================================================================== (Binary files differ) Modified: tools/acme/trunk/resources/icons/filesaveas.png =================================================================== (Binary files differ) Added: tools/acme/trunk/resources/icons/save_all.png =================================================================== (Binary files differ) Property changes on: tools/acme/trunk/resources/icons/save_all.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2007-05-25 18:43:22
|
Revision: 7263 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7263&view=rev Author: davidfancella Date: 2007-05-25 11:41:58 -0700 (Fri, 25 May 2007) Log Message: ----------- View source? Modified Paths: -------------- tools/acme/trunk/libacme/map.py tools/acme/trunk/libacmegui/editors/editorbase.py tools/acme/trunk/libacmegui/editors/genericEditor.py tools/acme/trunk/libacmegui/editors/mapEditor.py tools/acme/trunk/libacmegui/mainqt.py Added Paths: ----------- tools/acme/trunk/libacmegui/dialogs.py tools/acme/trunk/libacmegui/mainView.py tools/acme/trunk/resources/icons/view_source.png Modified: tools/acme/trunk/libacme/map.py =================================================================== --- tools/acme/trunk/libacme/map.py 2007-05-25 18:28:50 UTC (rev 7262) +++ tools/acme/trunk/libacme/map.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -39,6 +39,7 @@ __mapObjects = None def __init__(self, theResource=None): + resource.Resource.__init__(self, theResource.GetDom() ) self.__mapObjects = [] if theResource is not None: @@ -51,7 +52,13 @@ return [] - def Parse(self, theResource): + def UpdateFromDom(self): + self.__mapObjects = [] + self.Parse() + + def Parse(self, theResource=None): + if theResource is None: + theResource = self.theDom theObjects = theResource.getElementsByTagName("Field")[0].childNodes for a in theObjects: Added: tools/acme/trunk/libacmegui/dialogs.py =================================================================== --- tools/acme/trunk/libacmegui/dialogs.py (rev 0) +++ tools/acme/trunk/libacmegui/dialogs.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' + +from PyQt4 import QtGui, QtCore + +def GetSaveFile(parent): + return str(QtGui.QFileDialog.getSaveFileName(parent, "Save As...", + "./", + "Armagetron Advanced Resources (*.xml)") ) + + + Modified: tools/acme/trunk/libacmegui/editors/editorbase.py =================================================================== --- tools/acme/trunk/libacmegui/editors/editorbase.py 2007-05-25 18:28:50 UTC (rev 7262) +++ tools/acme/trunk/libacmegui/editors/editorbase.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -54,6 +54,12 @@ def CommitToDom(self): print "EditorBase: CommitToDom not implemented yet" return [100] + + # UpdateFromDom is the inverse of committodom and is required for view source to work properly + # and synchronize changes between the two widgets. The expected yield is to be symmetric to CommitToDom + def UpdateFromDom(self): + print "EditorBase: UpdateFromDom no implemented yet" + return [100] # Override this to provide access to the resource object, which must inherit Resource def GetResource(self): Modified: tools/acme/trunk/libacmegui/editors/genericEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/genericEditor.py 2007-05-25 18:28:50 UTC (rev 7262) +++ tools/acme/trunk/libacmegui/editors/genericEditor.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -52,6 +52,11 @@ self.theResource.theDom = minidom.parseString(self.theDocument.toPlainText() ) return [100] + def UpdateFromDom(self): + self.theDocument.setPlainText(self.theResource.theDom.toxml() ) + #self.setDocument(theText) + self.theDocument.setModified(True) + def GetResource(self): return self.theResource Modified: tools/acme/trunk/libacmegui/editors/mapEditor.py =================================================================== --- tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-25 18:28:50 UTC (rev 7262) +++ tools/acme/trunk/libacmegui/editors/mapEditor.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -121,13 +121,17 @@ def LoadResource(self, theMap): self.theMap = map.aaMap(theMap) + + self.UpdateFromDom() - QtCore.QObject.disconnect(self.mapScene, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) + self.scale(1,1) + + def UpdateFromDom(self): + for a in self.mapScene.items(): + self.mapScene.removeItem(a) - self.mapScene = MapScene(self) - self.setScene(self.mapScene) - QtCore.QObject.connect(self.mapScene, QtCore.SIGNAL("changed(const QList<QRectF>&)"), self.updateSceneP) - + self.theMap.UpdateFromDom() + for anObj in self.theMap.GetObjects(): if anObj.objType == "wall": self.mapScene.addItem( wall.Wall(anObj) ) @@ -136,7 +140,7 @@ elif anObj.objType == "zone": self.mapScene.addItem( zone.Zone(anObj) ) - self.scale(1,1) + self.mapScene.update() def mouseMoveEvent(self, e): if self._mode == "translate": Added: tools/acme/trunk/libacmegui/mainView.py =================================================================== --- tools/acme/trunk/libacmegui/mainView.py (rev 0) +++ tools/acme/trunk/libacmegui/mainView.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -0,0 +1,255 @@ +#!/usr/bin/env python + +''' + + @version $Id: __init__.py 7231 2007-05-20 22:53:21Z davidfancella $ + + This file is part of acme. + + acme is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + acme is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with acme; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + acme is copyright 2005, 2007 by David Fancella + +''' + +from PyQt4 import QtGui, QtCore + +from libacme import paths +from libacme import resource_parser + +from libacmegui import toolView +from libacmegui.dialogs import GetSaveFile + +from libacmegui.editors import mapEditor +from libacmegui.editors import genericEditor + +class EditorStack(QtGui.QStackedWidget): + viewer = None + sourcer = None + viewmode = None + + def __init__(self, parent, viewmode="viewer"): + QtGui.QStackedWidget.__init__(self, parent) + self.viewmode = viewmode + + def LoadResource(self, theResource): + if self.sourcer is not None: + self.sourcer.LoadResource(theResource) + if self.viewer is not None: + self.viewer.LoadResource(theResource) + + def HasChanges(self): + return self.currentWidget().HasChanges() + + def SetViewMode(self, viewmode): + self.viewmode = viewmode + + def idstr(self): + if self.viewer is not None: + return self.viewer.idstr() + else: + return self.sourcer.idstr() + + def AddViewWidget(self, viewer): + self.viewer = viewer + self.addWidget(viewer) + + def AddSourceWidget(self, source): + self.sourcer = source + self.addWidget(source) + + def FocusViewer(self, viewMode): + if self.viewer is not None and self.viewmode == "viewer": + if viewMode == "source": + self.viewer.CommitToDom() + self.sourcer.UpdateFromDom() + self.setCurrentWidget(self.sourcer) + self.viewmode = viewMode + else: + self.setCurrentWidget(self.viewer) + elif self.sourcer is not None: + if viewMode == "viewer" and self.viewer is not None: + self.sourcer.CommitToDom() + self.viewer.UpdateFromDom() + self.setCurrentWidget(self.viewer) + self.viewmode = viewMode + else: + self.setCurrentWidget(self.sourcer) + +class mainView(QtGui.QWidget): + editorList = None + + def __init__(self, args): + QtGui.QWidget.__init__(self, args) + + editorLayout = QtGui.QVBoxLayout(self) + + self.splitter1 = QtGui.QSplitter(self) + self.splitter1.setOrientation(QtCore.Qt.Horizontal) + self.splitter1.setContentsMargins(0,0,0,0) + self.mainEditor = toolView.ToolBook(self.splitter1) + + self.toolBox = QtGui.QStackedWidget(self.splitter1) + + editorLayout.addWidget(self.splitter1) + + self.splitter1.setStretchFactor(0, 2) + self.splitter1.setStretchFactor(1, 1) + + self.viewMode = "viewer" + + self.editorList = {} + + self._connectSlots() + + def _connectSlots(self): + QtCore.QObject.connect( self.mainEditor, QtCore.SIGNAL("editorSelected"), self.SelectEditor) + QtCore.QObject.connect( self.mainEditor, QtCore.SIGNAL("editorClose"), self.CloseEditor) + + def count(self): + return self.mainEditor.count() + + def ActiveWidgetHasChanges(self): + return self.mainEditor.currentWidget().HasChanges() + + def SelectEditor(self, theEditor): + self.toolBox.setCurrentWidget( self.editorList[theEditor.idstr()]['toolbox'] ) + self.parent().SetEditorActions( self.editorList[theEditor.idstr()]['actions'] ) + self.mainEditor.currentWidget().FocusViewer() + + self.emit( QtCore.SIGNAL("editorSelected") ) + + def CloseEditor(self, theEditor): + if theEditor.HasChanges(): + theResource = theEditor.GetResource() + theFilename = "<unnamed>" + if theResource is not None: + theFilename = theResource.GetName() + + userWants = QtGui.QMessageBox.warning(self, + theFilename + " has changes", + theFilename + " has changes that have not been saved. Do you want to save them now?", + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | QtGui.QMessageBox.Cancel, + QtGui.QMessageBox.Yes ) + if userWants == QtGui.QMessageBox.Yes: + thePath = "" + if theFilename == "<unnamed>": + thePath = GetSaveFile() + else: + thePath = self.editorList[theEditor.idstr()]['path'] + self.SaveResource(theEditor, thePath) + elif userWants == QtGui.QMessageBox.No: + pass + else: + return + self.toolBox.removeWidget( self.editorList[theEditor.idstr()]['toolbox'] ) + self.parent().RemoveEditorActions() + self.mainEditor.removeTab( self.mainEditor.indexOf(theEditor) ) + + def NewEditor(self, editorType): + if editorType is not None: + anEditor = editorType(self, self.toolBox) + else: + anEditor = genericEditor.genericEditor(self, None) + anEditor.NewResource() + + theStack = EditorStack(self, self.viewMode) + if editorType is not None: + theStack.AddViewWidget(anEditor) + theStack.AddSourceWidget(genericEditor.genericEditor(self, None) ) + else: + theStack.AddSourceWidget(anEditor) + theStack.FocusViewer(self.viewMode) + + self.mainEditor.addTab(theStack, "<unnamed>" ) + + theToolBox = anEditor.GetToolBox() + self.toolBox.addWidget(theToolBox) + + theActionList = anEditor.GetActions() + + self.editorList[anEditor.idstr()] = { 'editor' : anEditor, + 'widgetstack' : theStack, + 'toolbox' : theToolBox, + 'actions' : theActionList, + 'resource' : anEditor.GetResource(), + 'path' : None } + + self.mainEditor.setCurrentWidget(anEditor) + + QtCore.QObject.connect( anEditor, QtCore.SIGNAL("mouseHover"), self.mouseHover) + QtCore.QObject.connect( anEditor, QtCore.SIGNAL("modificationChanged"), self.ContentsChanged) + self.emit( QtCore.SIGNAL("editorSelected") ) + + return theStack + + def HasAnyChanges(self): + for a in range(self.mainEditor.count() ): + if self.mainEditor.widget(a).HasChanges(): + return True + return False + + def SaveAll(self): + theActiveWidget = self.mainEditor.currentWidget() + for a in range(self.mainEditor.count() ): + self.SaveResource( self.mainEditor.widget(a), self.editorList[anEditor.idstr()]['path'] ) + self.mainEditor.setCurrentWidget(theActiveWidget) + + def SaveResource(self, anEditor, thePath): + for a in anEditor.CommitToDom(): + print a + theResource = anEditor.GetResource() + if thePath is None: + self.mainEditor.setCurrentWidget(anEditor) + thePath = GetSaveFile(self) + if theResource is not None: + theResource.SaveFile(thePath) + + def SaveActiveResource(self, thePath=None): + anEditor = self.mainEditor.currentWidget() + if thePath is None: + thePath = self.editorList[anEditor.idstr()]['path'] + print thePath + else: + self.editorList[anEditor.idstr()]['path'] = thePath + self.SaveResource(anEditor, thePath) + + def LoadResource(self, theResourcePath): + theResource = resource_parser.LoadResource(theResourcePath) + if theResource.GetType() == "aamap": + anEditor = self.NewEditor(mapEditor.mapView) + else: + anEditor = self.NewEditor(None) + anEditor.LoadResource(theResource) + + self.editorList[anEditor.idstr()]['path'] = theResourcePath + + self.mainEditor.setTabText(self.mainEditor.indexOf(self.editorList[anEditor.idstr()]['widgetstack']), theResource.GetName() ) + self.emit( QtCore.SIGNAL("activeContentChanged") ) + + def ContentsChanged(self, state): + self.emit( QtCore.SIGNAL("modificationChanged"), state) + + def SetViewSource(self, state): + if state is True: + self.viewMode = "source" + else: + self.viewMode = "viewer" + + self.mainEditor.currentWidget().FocusViewer(self.viewMode) + + def mouseHover(self, eve): + self.emit(QtCore.SIGNAL("mouseHover"), eve) + Modified: tools/acme/trunk/libacmegui/mainqt.py =================================================================== --- tools/acme/trunk/libacmegui/mainqt.py 2007-05-25 18:28:50 UTC (rev 7262) +++ tools/acme/trunk/libacmegui/mainqt.py 2007-05-25 18:41:58 UTC (rev 7263) @@ -29,9 +29,8 @@ from libacme import paths from libacme import resource_parser -from libacmegui import toolView -from libacmegui.editors import mapEditor -from libacmegui.editors import genericEditor +from libacmegui import mainView +from libacmegui.dialogs import GetSaveFile # Set up widgets Ui_acmeMain, throwmeaway = uic.loadUiType( paths.JoinPaths( paths.GetPath('ui'), 'main.ui') ) @@ -45,166 +44,13 @@ self.exec_() -class SelectorIcon(QtGui.QListWidgetItem): - panel = None - - def __init__(self, parent, caption, icon, panel): - QtGui.QListWidgetItem.__init__(self, icon, caption, parent) - self.panel = panel - -def GetSaveFile(parent): - return str(QtGui.QFileDialog.getSaveFileName(parent, "Save As...", - "./", - "Armagetron Advanced Resources (*.xml)") ) - -class mainView(QtGui.QWidget): - editorList = None - - def __init__(self, args): - QtGui.QWidget.__init__(self, args) - - editorLayout = QtGui.QVBoxLayout(self) - - self.splitter1 = QtGui.QSplitter(self) - self.splitter1.setOrientation(QtCore.Qt.Horizontal) - self.splitter1.setContentsMargins(0,0,0,0) - self.mainEditor = toolView.ToolBook(self.splitter1) - - self.toolBox = QtGui.QStackedWidget(self.splitter1) - - editorLayout.addWidget(self.splitter1) - - self.splitter1.setStretchFactor(0, 2) - self.splitter1.setStretchFactor(1, 1) - - self.editorList = {} - - self._connectSlots() - - def _connectSlots(self): - QtCore.QObject.connect( self.mainEditor, QtCore.SIGNAL("editorSelected"), self.SelectEditor) - QtCore.QObject.connect( self.mainEditor, QtCore.SIGNAL("editorClose"), self.CloseEditor) - - def count(self): - return self.mainEditor.count() - - def ActiveWidgetHasChanges(self): - return self.mainEditor.currentWidget().HasChanges() - - def SelectEditor(self, theEditor): - self.toolBox.setCurrentWidget( self.editorList[theEditor.idstr()]['toolbox'] ) - self.parent().SetEditorActions( self.editorList[theEditor.idstr()]['actions'] ) - - self.emit( QtCore.SIGNAL("editorSelected") ) - - def CloseEditor(self, theEditor): - if theEditor.HasChanges(): - theResource = theEditor.GetResource() - theFilename = "<unnamed>" - if theResource is not None: - theFilename = theResource.GetName() - - userWants = QtGui.QMessageBox.warning(self, - theFilename + " has changes", - theFilename + " has changes that have not been saved. Do you want to save them now?", - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No | QtGui.QMessageBox.Cancel, - QtGui.QMessageBox.Yes ) - if userWants == QtGui.QMessageBox.Yes: - thePath = "" - if theFilename == "<unnamed>": - thePath = GetSaveFile() - else: - thePath = self.editorList[theEditor.idstr()]['path'] - self.SaveResource(theEditor, thePath) - elif userWants == QtGui.QMessageBox.No: - pass - else: - return - self.toolBox.removeWidget( self.editorList[theEditor.idstr()]['toolbox'] ) - self.parent().RemoveEditorActions() - self.mainEditor.removeTab( self.mainEditor.indexOf(theEditor) ) - - def NewEditor(self, editorType): - anEditor = editorType(self, self.toolBox) - anEditor.NewResource() - self.mainEditor.addTab(anEditor, "<unnamed>" ) - - theToolBox = anEditor.GetToolBox() - self.toolBox.addWidget(theToolBox) - - theActionList = anEditor.GetActions() - - self.editorList[anEditor.idstr()] = { 'editor' : anEditor, - 'toolbox' : theToolBox, - 'actions' : theActionList, - 'resource' : anEditor.GetResource(), - 'path' : None } - - self.mainEditor.setCurrentWidget(anEditor) - - QtCore.QObject.connect( anEditor, QtCore.SIGNAL("mouseHover"), self.mouseHover) - QtCore.QObject.connect( anEditor, QtCore.SIGNAL("modificationChanged"), self.ContentsChanged) - self.emit( QtCore.SIGNAL("editorSelected") ) - - return anEditor - - def HasAnyChanges(self): - for a in range(self.mainEditor.count() ): - if self.mainEditor.widget(a).HasChanges(): - return True - return False - - def SaveAll(self): - theActiveWidget = self.mainEditor.currentWidget() - for a in range(self.mainEditor.count() ): - self.SaveResource( self.mainEditor.widget(a), self.editorList[anEditor.idstr()]['path'] ) - self.mainEditor.setCurrentWidget(theActiveWidget) - - def SaveResource(self, anEditor, thePath): - for a in anEditor.CommitToDom(): - print a - theResource = anEditor.GetResource() - if thePath is None: - self.mainEditor.setCurrentWidget(theEditor) - thePath = GetSaveFile(self) - if theResource is not None: - theResource.SaveFile(thePath) - - def SaveActiveResource(self, thePath=None): - anEditor = self.mainEditor.currentWidget() - if thePath is None: - thePath = self.editorList[anEditor.idstr()]['path'] - print thePath - else: - self.editorList[anEditor.idstr()]['path'] = thePath - self.SaveResource(anEditor, thePath) - - def LoadResource(self, theResourcePath): - theResource = resource_parser.LoadResource(theResourcePath) - if theResource.GetType() == "aamap": - anEditor = self.NewEditor(mapEditor.mapView) - else: - anEditor = self.NewEditor(genericEditor.genericEditor) - anEditor.LoadResource(theResource) - - self.editorList[anEditor.idstr()]['path'] = theResourcePath - - self.mainEditor.setTabText(self.mainEditor.indexOf(anEditor), theResource.GetName() ) - self.emit( QtCore.SIGNAL("activeContentChanged") ) - - def ContentsChanged(self, state): - self.emit( QtCore.SIGNAL("modificationChanged"), state) - - def mouseHover(self, eve): - self.emit(QtCore.SIGNAL("mouseHover"), eve) - class MainFrame(QtGui.QMainWindow, Ui_acmeMain): def __init__(self, args): QtGui.QMainWindow.__init__(self, args) self.setupUi(self) - self.toolView = mainView(self) + self.toolView = mainView.mainView(self) #self.mapViewer = mapEditor.mapView(self) #self.toolView.setCurrentWidget(self.toolView) @@ -213,6 +59,7 @@ self._connectSlots() self._createFileActions() + self._createViewActions() self._createMenus() self._createToolbars() self._createStatusBar() @@ -265,6 +112,17 @@ QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.filePackage) self.fileActions.addAction(tmpAction) self.fileActionHash['package'] = tmpAction + + def _createViewActions(self): + self.viewActions = QtGui.QActionGroup(self) + self.viewActions.setExclusive(False) + self.viewActionHash = {} + + tmpAction = QtGui.QAction( QtGui.QIcon(QtGui.QPixmap( paths.GetIcon('view_source.png') ) ), "&Source", self.viewActions) + tmpAction.setCheckable(True) + QtCore.QObject.connect(tmpAction, QtCore.SIGNAL("triggered(bool)"), self.viewSource) + self.viewActions.addAction(tmpAction) + self.viewActionHash['source'] = tmpAction # for stuff Qt Designer doesn't handle def _createToolbars(self): @@ -273,6 +131,11 @@ self.theFileToolbar.addActions(self.fileActions.actions() ) self.addToolBar(self.theFileToolbar) + self.theViewToolbar = QtGui.QToolBar() + self.theViewToolbar.setIconSize( QtCore.QSize(32,32) ) + self.theViewToolbar.addActions(self.viewActions.actions() ) + self.addToolBar(self.theViewToolbar) + self.editorToolbar = QtGui.QToolBar() self.editorToolbar.setIconSize( QtCore.QSize(32,32) ) self.addToolBar(self.editorToolbar) @@ -286,6 +149,10 @@ self.theFileMenu.addSeparator() self.theFileMenu.addAction("&Quit", self.quit) self.menubar.addMenu(self.theFileMenu) + + self.theViewMenu = QtGui.QMenu("&View") + self.theViewMenu.addActions(self.viewActions.actions() ) + self.menubar.addMenu(self.theViewMenu) #self.theEditMenu = QtGui.QMenu("&Edit") #self.theEditMenu.addActions(self.editActions.actions() ) @@ -361,5 +228,8 @@ def filePreferences(self): pass + def viewSource(self, toggle): + self.toolView.SetViewSource(toggle) + def mouseHover(self, pos): self.statusText.setText( str(pos.x()) + ", " + str(pos.y() ) ) Added: tools/acme/trunk/resources/icons/view_source.png =================================================================== (Binary files differ) Property changes on: tools/acme/trunk/resources/icons/view_source.png ___________________________________________________________________ Name: svn:mime-type + image/png This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |