2
0
mirror of https://github.com/ComradCollective/Comrad synced 2024-11-05 21:20:51 +00:00
Comrad/client/screens/post/post.py
2020-08-12 20:53:59 +01:00

220 lines
7.1 KiB
Python

from screens.base import ProtectedScreen
from plyer import filechooser
from kivymd.uix.label import MDLabel
from kivymd.uix.textfield import MDTextField
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDRectangleFlatButton, MDIconButton, MDRaisedButton
from kivy.properties import ListProperty,ObjectProperty
from kivy.app import App
from main import log
from screens.feed.feed import *
import os,time,threading
from threading import Thread
from kivymd.uix.dialog import MDDialog
# # Progress bar code
# class ProgressPopup(MDDialog):
# def __init__(self, *args, **kwargs):
# super().__init__(*args, **kwargs)
# content = MDLabel(font_style='Body1',
# theme_text_color='Secondary',
# text=kwargs.get('text',''),
# size_hint_y=None,
# valign='top')
# content.bind(texture_size=content.setter('size'))
# self.dialog = MDDialog(title="Close",
# content=content,
# size_hint=(.3, None),
# height='200dp')
# self.dialog.add_action_button("Close me!",
# action=lambda *x: self.dismiss_callback())
# self.dialog.open()
class ProgressPopup(MDDialog): pass
class MessagePopup(MDDialog): pass
class UploadButton(MDRectangleFlatButton):
'''
Button that triggers 'filechooser.open_file()' and processes
the data response from filechooser Activity.
'''
selection = ListProperty([])
def choose(self):
'''
Call plyer filechooser API to run a filechooser Activity.
'''
filechooser.open_file(on_selection=self.handle_selection)
def handle_selection(self, selection):
'''
Callback function for handling the selection response from Activity.
'''
self.selection = selection
def on_selection(self, *a, **k):
'''
Update TextInput.text after FileChoose.selection is changed
via FileChoose.handle_selection.
'''
pass
#App.get_running_app().root.ids.result.text = str(self.selection)
class AddPostTextField(MDTextField): pass
class ButtonLayout(MDBoxLayout): pass
class PostButton(MDRectangleFlatButton): pass
class PostStatus(MDRectangleFlatButton): pass
class AddPostScreen(ProtectedScreen):
post_id = ObjectProperty()
def on_pre_enter(self):
# clear
if hasattr(self,'post_status'): self.remove_widget(self.post_status)
if hasattr(self,'post_textfield'): self.post_textfield.text=''
post_json = {'author':self.app.username, 'timestamp':time.time()}
self.post_card = post = PostCard(post_json)
self.post_textfield = post_TextField = AddPostTextField()
post_TextField.line_color_focus=(1,0,0,1)
post_TextField.line_color_normal=(1,0,0,1)
post_TextField.current_hint_text_color=(1,0,0,1)
post_TextField.font_name='assets/overpass-mono-regular.otf'
post_TextField.hint_text='word?'
# post.remove_widget(post.scroller)
post.scroller.remove_widget(post.post_content)
post.scroller.add_widget(post_TextField)
post.scroller.size=('300dp','300dp')
self.add_widget(post)
self.button_layout = ButtonLayout()
self.upload_button = UploadButton()
self.upload_button.screen = self
self.post_button = PostButton()
self.post_button.screen = self
self.post_status = PostStatus()
self.post_status_added = False
self.button_layout.add_widget(self.upload_button)
self.button_layout.add_widget(self.post_button)
self.post_button.md_bg_color=(0,0,0,1)
self.upload_button.md_bg_color=(0,0,0,1)
self.post_status.md_bg_color=(0,0,0,1)
self.add_widget(self.button_layout)
# self.add_widget(self.post_status)
def write_post_status(self,x):
self.post_status.text=str(x)
if not self.post_status_added:
self.add_widget(self.post_status)
self.post_status_added=True
def open_dialog(self,msg):
if not hasattr(self,'dialog') or not self.dialog:
self.dialog = ProgressPopup()
log(self.dialog.ids.keys())
self.dialog.ids.progress_label.text=msg
self.dialog.open()
def open_msg_dialog(self,msg):
if not hasattr(self,'msg_dialog') or not self.msg_dialog:
self.msg_dialog = MessagePopup()
self.msg_dialog.ids.msg_label.text=msg
self.msg_dialog.open()
def close_dialog(self):
if hasattr(self,'dialog'):
self.dialog.dismiss()
def close_msg_dialog(self):
if hasattr(self,'msg_dialog'):
self.msg_dialog.dismiss()
def choose(self):
# time.sleep(5)
self.upload_button.choose()
self.orig_img_src = self.upload_button.selection
self.open_dialog('uploading')
# self.upload()
# self.close_dialog()
mythread = threading.Thread(target=self.upload)
mythread.start()
def upload(self):
rdata = self.app.upload(self.orig_img_src)
for k,v in rdata.items():
log('data!!!' + str(k) +':'+str(v))
setattr(self,k,v)
self.add_image()
self.close_dialog()
def add_image(self):
if hasattr(self,'image'):
self.image.source=self.cache_filename
else:
self.image_layout = image_layout = PostImageLayout()
self.image = image = PostImage(source=self.cache_filename)
image.height = '300dp'
image_layout.add_widget(image)
image_layout.height='300dp'
self.post_card.add_widget(image_layout,index=1)
def post(self):
# check?
maxlen = 500
content = self.post_textfield.text
lencontent = content.strip().replace(' ',' ').count(' ')
# maxlen = int(self.post_textfield.max_text_length)
lendiff = lencontent - maxlen
if lendiff>0:
self.open_msg_dialog(f'Text is currently {lencontent} words long, which is {lendiff} over the maximum text length of {maxlen} words.\n\n({lencontent}/{maxlen})')
return
# log('?????????????????'+self.media_uid)
if not hasattr(self,'media_uid') and self.upload_button.selection:
log('REUPLOADING')
self.upload()
def do_post():
media_uid = self.media_uid if hasattr(self,'media_uid') else None
self.app.post(content=content, media_uid=media_uid) #, logger=logger)
self.close_dialog()
self.open_dialog('posting')
Thread(target=do_post).start()
class ViewPostScreen(ProtectedScreen):
post_id = ObjectProperty()
def on_pre_enter(self):
for child in self.children:
log('child: '+str(child))
self.remove_widget(child)
post_json = self.app.get_post(self.root.post_id)
post = PostCard(post_json)
self.add_widget(post)
def on_enter(self):
for child in self.children: child.load_image()
pass