2022-12-16 18:40:57 -06:00
|
|
|
from panda3d.core import *
|
2019-12-30 00:07:56 -06:00
|
|
|
from . import ShtikerPage
|
2019-11-02 17:27:54 -05:00
|
|
|
from direct.gui.DirectGui import *
|
2022-12-16 18:40:57 -06:00
|
|
|
from panda3d.core import *
|
2019-11-02 17:27:54 -05:00
|
|
|
from toontown.toonbase import TTLocalizer
|
|
|
|
import os
|
|
|
|
from toontown.toonbase import ToontownGlobals
|
|
|
|
|
|
|
|
class PhotoAlbumPage(ShtikerPage.ShtikerPage):
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
ShtikerPage.ShtikerPage.__init__(self)
|
|
|
|
self.textRolloverColor = Vec4(1, 1, 0, 1)
|
|
|
|
self.textDownColor = Vec4(0.5, 0.9, 1, 1)
|
|
|
|
self.textDisabledColor = Vec4(0.4, 0.8, 0.4, 1)
|
|
|
|
self.photos = {}
|
|
|
|
self.selectedFileName = None
|
|
|
|
self.photoIndex = 0
|
|
|
|
return
|
|
|
|
|
|
|
|
def load(self):
|
|
|
|
self.title = DirectLabel(parent=self, relief=None, text='Photo Album', text_scale=0.1, pos=(0, 0, 0.6))
|
|
|
|
self.pictureImage = loader.loadModel('phase_3.5/models/gui/photo_frame')
|
|
|
|
self.pictureImage.setScale(0.2)
|
|
|
|
self.pictureImage.setPos(0.44, 0, 0.25)
|
|
|
|
self.pictureImage.reparentTo(self)
|
|
|
|
self.pictureFg = self.pictureImage.find('**/fg')
|
|
|
|
self.pictureFg.setColor(1, 1, 1, 0.1)
|
|
|
|
guiButton = loader.loadModel('phase_3/models/gui/quit_button')
|
|
|
|
self.pictureCaption = DirectLabel(parent=self, relief=None, text='Caption', text_scale=0.05, text_wordwrap=10, text_align=TextNode.ACenter, pos=(0.45, 0, -0.22))
|
|
|
|
self.renameButton = DirectButton(parent=self, relief=None, image=(guiButton.find('**/QuitBtn_UP'), guiButton.find('**/QuitBtn_DN'), guiButton.find('**/QuitBtn_RLVR')), image_scale=(1, 1, 1), pos=(0.45, 0, -0.35), text='Caption', text_scale=0.06, text_pos=(0, -0.02), command=self.renameImage, state=DGG.DISABLED)
|
|
|
|
trashcanGui = loader.loadModel('phase_3/models/gui/trashcan_gui')
|
|
|
|
self.deleteButton = DirectButton(parent=self, image=(trashcanGui.find('**/TrashCan_CLSD'), trashcanGui.find('**/TrashCan_OPEN'), trashcanGui.find('**/TrashCan_RLVR')), text=('', 'Delete', 'Delete'), text_fg=(1, 1, 1, 1), text_shadow=(0, 0, 0, 1), text_scale=0.1, text_pos=(0, -0.1), text_font=ToontownGlobals.getInterfaceFont(), textMayChange=0, relief=None, pos=(0.73, 0, -0.33), scale=0.4, state=DGG.DISABLED, command=self.deleteImage)
|
|
|
|
guiButton.removeNode()
|
|
|
|
trashcanGui.removeNode()
|
|
|
|
gui = loader.loadModel('phase_3.5/models/gui/friendslist_gui')
|
|
|
|
self.scrollList = DirectScrolledList(parent=self, relief=None, forceHeight=0.07, pos=(-0.5, 0, 0), incButton_image=(gui.find('**/FndsLst_ScrollUp'),
|
|
|
|
gui.find('**/FndsLst_ScrollDN'),
|
|
|
|
gui.find('**/FndsLst_ScrollUp_Rllvr'),
|
|
|
|
gui.find('**/FndsLst_ScrollUp')), incButton_relief=None, incButton_scale=(1.3, 1.3, -1.3), incButton_pos=(0, 0, -0.51), incButton_image3_color=Vec4(1, 1, 1, 0.2), decButton_image=(gui.find('**/FndsLst_ScrollUp'),
|
|
|
|
gui.find('**/FndsLst_ScrollDN'),
|
|
|
|
gui.find('**/FndsLst_ScrollUp_Rllvr'),
|
|
|
|
gui.find('**/FndsLst_ScrollUp')), decButton_relief=None, decButton_scale=(1.3, 1.3, 1.3), decButton_pos=(0, 0, 0.51), decButton_image3_color=Vec4(1, 1, 1, 0.2), itemFrame_pos=(-0.237, 0, 0.41), itemFrame_scale=1.0, itemFrame_relief=DGG.SUNKEN, itemFrame_frameSize=(-0.05,
|
|
|
|
0.66,
|
|
|
|
-0.88,
|
|
|
|
0.06), itemFrame_frameColor=(0.85, 0.95, 1, 1), itemFrame_borderWidth=(0.01, 0.01), numItemsVisible=13, items=[])
|
|
|
|
self.renamePanel = DirectFrame(parent=self, relief=None, pos=(0.45, 0, -0.45), image=DGG.getDefaultDialogGeom(), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.0, 0.6), text='Caption Photo', text_scale=0.06, text_pos=(0.0, 0.13), sortOrder=NO_FADE_SORT_INDEX)
|
|
|
|
self.renameEntry = DirectEntry(parent=self.renamePanel, relief=DGG.SUNKEN, scale=0.06, pos=(-0.3, 0, 0), borderWidth=(0.1, 0.1), numLines=1, cursorKeys=0, frameColor=(0.8, 0.8, 0.5, 1), frameSize=(-0.2,
|
|
|
|
10,
|
|
|
|
-0.4,
|
|
|
|
1.1), command=self.renameDialog)
|
|
|
|
buttons = loader.loadModel('phase_3/models/gui/dialog_box_buttons_gui')
|
|
|
|
self.bCancel = DirectButton(parent=self.renamePanel, image=(buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')), relief=None, text='Cancel', text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.0, 0.0, -0.1), command=self.renameCancel)
|
|
|
|
self.renamePanel.hide()
|
|
|
|
self.deletePanel = DirectFrame(parent=self, relief=None, pos=(0, 0, 0), image=DGG.getDefaultDialogGeom(), image_color=ToontownGlobals.GlobalDialogColor, image_scale=(1.0, 1.0, 0.6), text='Delete Photo?', text_scale=0.06, text_pos=(0.0, 0.13), sortOrder=NO_FADE_SORT_INDEX)
|
|
|
|
self.dOk = DirectButton(parent=self.deletePanel, image=(buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')), relief=None, text='Ok', text_scale=0.05, text_pos=(0.0, -0.1), pos=(-0.1, 0.0, -0.1), command=self.deleteConfirm)
|
|
|
|
self.dCancel = DirectButton(parent=self.deletePanel, image=(buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')), relief=None, text='Cancel', text_scale=0.05, text_pos=(0.0, -0.1), pos=(0.1, 0.0, -0.1), command=self.deleteCancel)
|
|
|
|
self.deletePanel.hide()
|
|
|
|
self.leftArrow = DirectButton(parent=self, relief=None, image=(gui.find('**/Horiz_Arrow_UP'),
|
|
|
|
gui.find('**/Horiz_Arrow_DN'),
|
|
|
|
gui.find('**/Horiz_Arrow_Rllvr'),
|
|
|
|
gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), scale=(-1.0, 1.0, 1.0), pos=(0.15, 0, -0.21), command=self.prevPhoto)
|
|
|
|
self.rightArrow = DirectButton(parent=self, relief=None, image=(gui.find('**/Horiz_Arrow_UP'),
|
|
|
|
gui.find('**/Horiz_Arrow_DN'),
|
|
|
|
gui.find('**/Horiz_Arrow_Rllvr'),
|
|
|
|
gui.find('**/Horiz_Arrow_UP')), image3_color=Vec4(1, 1, 1, 0.5), pos=(0.75, 0, -0.21), command=self.nextPhoto)
|
|
|
|
gui.removeNode()
|
|
|
|
buttons.removeNode()
|
|
|
|
return
|
|
|
|
|
|
|
|
def unload(self):
|
|
|
|
del self.title
|
|
|
|
del self.scrollList
|
|
|
|
self.pictureImage.removeNode()
|
|
|
|
self.pictureFg.removeNode()
|
|
|
|
del self.pictureCaption
|
|
|
|
del self.deleteButton
|
|
|
|
del self.renameButton
|
|
|
|
del self.renamePanel
|
|
|
|
del self.renameEntry
|
|
|
|
del self.bCancel
|
|
|
|
del self.deletePanel
|
|
|
|
del self.dOk
|
|
|
|
del self.dCancel
|
|
|
|
del self.leftArrow
|
|
|
|
del self.rightArrow
|
|
|
|
ShtikerPage.ShtikerPage.unload(self)
|
|
|
|
|
|
|
|
def renameDialog(self, str):
|
|
|
|
separator = '_'
|
|
|
|
validChars = string.letters + string.digits + ' -'
|
2019-12-30 00:07:56 -06:00
|
|
|
str = [s for s in str if s in validChars]
|
2019-11-02 17:27:54 -05:00
|
|
|
if not str:
|
|
|
|
self.renameCleanup()
|
|
|
|
return 0
|
|
|
|
oldName = self.selectedFileName
|
|
|
|
numUnders = oldName.count(separator)
|
|
|
|
if numUnders == 0:
|
|
|
|
newName = oldName[0:11] + separator + str + separator + oldName[10:]
|
|
|
|
elif numUnders == 2:
|
|
|
|
sp = oldName.split(separator)
|
|
|
|
newName = sp[0] + separator + str + separator + sp[2]
|
|
|
|
else:
|
|
|
|
self.renameCleanup()
|
|
|
|
return 0
|
|
|
|
os.rename(oldName, newName)
|
|
|
|
self.renameCleanup()
|
|
|
|
self.updateScrollList()
|
|
|
|
self.chosePhoto(newName)
|
|
|
|
return 1
|
|
|
|
|
|
|
|
def renameCancel(self):
|
|
|
|
self.renameCleanup()
|
|
|
|
|
|
|
|
def renameCleanup(self):
|
|
|
|
self.renamePanel.hide()
|
|
|
|
chatEntry = base.localAvatar.chatMgr.chatInputNormal.chatEntry
|
|
|
|
chatEntry['backgroundFocus'] = self.oldFocus
|
|
|
|
|
|
|
|
def renameImage(self):
|
|
|
|
self.deleteCleanup()
|
|
|
|
self.renameEntry.set(self.getPhotoName(self.selectedFileName))
|
|
|
|
self.renamePanel.show()
|
|
|
|
chatEntry = base.localAvatar.chatMgr.chatInputNormal.chatEntry
|
|
|
|
chatEntry['backgroundFocus'] = 0
|
|
|
|
self.renameEntry['focus'] = 1
|
2019-12-30 00:07:56 -06:00
|
|
|
print(self.selectedFileName)
|
2019-11-02 17:27:54 -05:00
|
|
|
|
|
|
|
def deleteConfirm(self):
|
|
|
|
os.remove(self.selectedFileName)
|
|
|
|
self.selectedFileName = None
|
|
|
|
self.deleteCleanup()
|
|
|
|
self.updateScrollList()
|
|
|
|
return
|
|
|
|
|
|
|
|
def deleteCancel(self):
|
|
|
|
self.deleteCleanup()
|
|
|
|
|
|
|
|
def deleteCleanup(self):
|
|
|
|
self.deletePanel.hide()
|
|
|
|
|
|
|
|
def deleteImage(self):
|
|
|
|
self.renameCleanup()
|
|
|
|
self.deletePanel['text'] = 'Delete Photo?\n%s' % self.getPhotoName(self.selectedFileName)
|
|
|
|
self.deletePanel.show()
|
|
|
|
|
|
|
|
def makePhotoButton(self, fileName):
|
|
|
|
return DirectButton(relief=None, text=self.getPhotoName(fileName), text_scale=0.06, text_align=TextNode.ALeft, text1_bg=self.textDownColor, text2_bg=self.textRolloverColor, text3_fg=self.textDisabledColor, command=self.chosePhoto, extraArgs=[fileName])
|
|
|
|
|
|
|
|
def getPhotoName(self, fileName):
|
|
|
|
separator = '_'
|
|
|
|
numUnders = fileName.count(separator)
|
|
|
|
if numUnders == 0:
|
|
|
|
return 'noname'
|
|
|
|
elif numUnders == 2:
|
|
|
|
return fileName.split(separator)[1]
|
|
|
|
else:
|
|
|
|
return 'unknown'
|
|
|
|
|
|
|
|
def chosePhoto(self, fileName):
|
|
|
|
if fileName:
|
|
|
|
self.selectedFileName = fileName
|
|
|
|
photoTexture = loader.loadTexture(fileName)
|
|
|
|
photoName = self.getPhotoName(fileName)
|
|
|
|
self.pictureFg.setTexture(photoTexture, 1)
|
|
|
|
self.pictureFg.setColor(1, 1, 1, 1)
|
|
|
|
self.pictureCaption['text'] = photoName
|
|
|
|
self.renameButton['state'] = DGG.NORMAL
|
|
|
|
self.deleteButton['state'] = DGG.NORMAL
|
|
|
|
self.renameEntry.set(photoName)
|
|
|
|
else:
|
|
|
|
self.selectedFileName = None
|
|
|
|
self.pictureFg.clearTexture()
|
|
|
|
self.pictureFg.setColor(1, 1, 1, 0.1)
|
|
|
|
self.pictureCaption['text'] = ''
|
|
|
|
self.renameButton['state'] = DGG.DISABLED
|
|
|
|
self.deleteButton['state'] = DGG.DISABLED
|
|
|
|
self.renameEntry.set('')
|
|
|
|
return
|
|
|
|
|
|
|
|
def getPhotos(self):
|
|
|
|
files = os.listdir('.')
|
|
|
|
photos = []
|
|
|
|
for fileName in files:
|
|
|
|
if fileName[0:10] == 'screenshot' and fileName[-4:] == '.jpg':
|
|
|
|
photos.append(fileName)
|
|
|
|
|
|
|
|
return photos
|
|
|
|
|
|
|
|
def newScreenshot(self, filename):
|
|
|
|
self.updateScrollList()
|
|
|
|
|
|
|
|
def updateScrollList(self):
|
|
|
|
newPhotos = self.getPhotos()
|
2019-12-30 00:07:56 -06:00
|
|
|
for photo in list(self.photos.keys()):
|
2019-11-02 17:27:54 -05:00
|
|
|
if photo not in newPhotos:
|
|
|
|
photoButton = self.photos[photo]
|
|
|
|
self.scrollList.removeItem(photoButton)
|
|
|
|
photoButton.destroy()
|
|
|
|
del self.photos[photo]
|
|
|
|
|
|
|
|
for photo in newPhotos:
|
2019-12-30 00:07:56 -06:00
|
|
|
if photo not in self.photos:
|
2019-11-02 17:27:54 -05:00
|
|
|
photoButton = self.makePhotoButton(photo)
|
|
|
|
self.scrollList.addItem(photoButton)
|
|
|
|
self.photos[photo] = photoButton
|
|
|
|
|
2019-12-30 00:07:56 -06:00
|
|
|
if list(self.photos.keys()):
|
|
|
|
self.chosePhoto(list(self.photos.keys())[0])
|
2019-11-02 17:27:54 -05:00
|
|
|
else:
|
|
|
|
self.chosePhoto(None)
|
|
|
|
return
|
|
|
|
|
|
|
|
def enter(self):
|
|
|
|
self.accept('screenshot', self.newScreenshot)
|
|
|
|
self.updateScrollList()
|
|
|
|
chatEntry = base.localAvatar.chatMgr.chatInputNormal.chatEntry
|
|
|
|
self.oldFocus = chatEntry['backgroundFocus']
|
|
|
|
ShtikerPage.ShtikerPage.enter(self)
|
|
|
|
|
|
|
|
def exit(self):
|
|
|
|
self.ignore('screenshot')
|
|
|
|
self.renameCleanup()
|
|
|
|
self.deleteCleanup()
|
|
|
|
ShtikerPage.ShtikerPage.exit(self)
|
|
|
|
|
|
|
|
def updateArrows(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def prevPhoto(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def nextPhoto(self):
|
|
|
|
pass
|