2
0
mirror of https://github.com/ComradCollective/Comrad synced 2024-11-09 13:10:44 +00:00
Comrad/app/screens/post/post.py

338 lines
12 KiB
Python
Raw Normal View History

2020-08-20 11:48:26 +00:00
from screens.base import ProtectedScreen,BaseScreen
from plyer import filechooser
2020-08-22 00:27:20 +00:00
from kivy.uix.button import Button
2020-08-22 17:51:09 +00:00
from kivymd.uix.button import *
2020-08-12 19:23:23 +00:00
from kivymd.uix.label import MDLabel
from kivymd.uix.textfield import MDTextField
from kivymd.uix.boxlayout import MDBoxLayout
2020-08-21 21:15:20 +00:00
from kivymd.uix.stacklayout import MDStackLayout
from kivymd.uix.button import MDRectangleFlatButton, MDIconButton, MDRaisedButton,MDFillRoundFlatButton,MDRoundFlatIconButton
2020-08-10 20:38:00 +00:00
from kivy.properties import ListProperty,ObjectProperty
from kivy.app import App
2020-08-10 20:38:00 +00:00
from screens.feed.feed import *
2020-08-12 19:23:23 +00:00
import os,time,threading
from threading import Thread
from kivymd.uix.dialog import MDDialog
2020-08-17 20:40:48 +00:00
from kivy.core.image import Image as CoreImage
2020-08-21 21:15:20 +00:00
from kivymd.uix.gridlayout import MDGridLayout
2020-08-20 10:59:53 +00:00
import io,shutil,asyncio
2020-08-21 21:15:20 +00:00
from kivymd.uix.chip import MDChip
from main import rgb,COLOR_TEXT,COLOR_ACCENT,COLOR_CARD,COLOR_INACTIVE,COLOR_ACTIVE
from misc import *
from kivy.animation import Animation
from kivy.lang import Builder
from kivy.metrics import dp
2020-08-22 00:27:20 +00:00
from kivymd.uix.dropdownitem import MDDropDownItem
from kivymd.uix.menu import MDDropdownMenu
2020-08-21 21:15:20 +00:00
from kivy.properties import (
BooleanProperty,
ListProperty,
NumericProperty,
ObjectProperty,
StringProperty,
)
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemableBehavior
from kivymd.uix.button import MDIconButton
from kivymd.uix.stacklayout import MDStackLayout
from main import COLOR_TEXT,rgb,COLOR_ICON,COLOR_ACCENT,COLOR_INACTIVE
2020-08-12 19:23:23 +00:00
2020-08-22 17:51:09 +00:00
def logg(*x):
with open('log.txt','a+') as of: of.write(' '.join(str(y) for y in x)+'\n')
2020-08-12 19:23:23 +00:00
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
2020-08-12 19:23:23 +00:00
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)
2020-08-12 19:23:23 +00:00
class AddPostTextField(MDTextField): pass
class ButtonLayout(MDBoxLayout): pass
class PostButton(MDRectangleFlatButton): pass
class PostStatus(MDRectangleFlatButton): pass
2020-08-21 21:15:20 +00:00
2020-08-17 16:23:40 +00:00
class PostScreen(ProtectedScreen):
2020-08-10 20:38:00 +00:00
post_id = ObjectProperty()
2020-08-12 19:23:23 +00:00
2020-08-22 18:58:11 +00:00
def open_author_option(self):
2020-08-22 19:39:56 +00:00
import kivy
try:
self.post_card.add_widget(self.to_whom_btn,1)
self.to_whom_btn.height='100dp'
self.to_whom_btn.size_hint_y=None
except kivy.uix.widget.WidgetException:
return
2020-08-22 18:58:11 +00:00
def close_author_option(self):
2020-08-22 19:39:56 +00:00
self.post_card.remove_widget(self.to_whom_btn)
2020-08-22 18:58:11 +00:00
self.to_whom_btn.height='0dp'
self.to_whom_btn.size_hint_y=None
2020-08-22 17:51:09 +00:00
2020-08-12 19:23:23 +00:00
def on_pre_enter(self):
2020-08-19 19:33:25 +00:00
super().on_pre_enter()
2020-08-22 00:27:20 +00:00
self.to_channels = {}
2020-08-19 19:33:25 +00:00
2020-08-12 19:23:23 +00:00
# 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()}
2020-08-22 21:33:58 +00:00
keys=[k for k in self.app.keys if k!=self.app.username]
2020-08-23 09:59:52 +00:00
if False: # ??
2020-08-22 21:33:58 +00:00
key=keys[0]
post_json['to_name']=key
self.recipient=key
else:
post_json['to_name']='...'
2020-08-22 17:51:09 +00:00
2020-08-12 19:23:23 +00:00
self.post_card = post = PostCard(post_json)
2020-08-22 00:27:20 +00:00
self.post_card.add_widget(get_separator('15sp'),1)
self.post_card.add_widget(get_separator('15sp'),1)
2020-08-12 19:23:23 +00:00
self.post_textfield = post_TextField = AddPostTextField()
2020-08-20 00:34:14 +00:00
post_TextField.line_color_focus=rgb(*COLOR_TEXT)
post_TextField.line_color_normal=rgb(*COLOR_TEXT)
post_TextField.current_hint_text_color=rgb(*COLOR_TEXT)
2020-08-12 19:23:23 +00:00
post_TextField.font_name='assets/overpass-mono-regular.otf'
post_TextField.hint_text='word?'
2020-08-23 15:04:56 +00:00
post_TextField.font_size='20sp'
2020-08-12 19:23:23 +00:00
2020-08-23 14:40:02 +00:00
self.post_card.to_whom_btn = self.to_whom_btn = DropDownWidget(
pos_hint = {'center_x':0.5,'center_y':0.5},
2020-08-22 18:58:11 +00:00
size_hint = (None, None),
2020-08-23 14:40:02 +00:00
height='200sp',
width='100sp'
2020-08-22 18:58:11 +00:00
)
inp_towhom = self.to_whom_btn.ids.txt_input
inp_towhom.size_hint=(None,None)
2020-08-22 19:39:56 +00:00
inp_towhom.width = '100sp'
inp_towhom.font_name='assets/font.otf'
2020-08-22 18:58:11 +00:00
# inp_towhom.height = '75sp'
2020-08-23 14:40:02 +00:00
2020-08-22 18:58:11 +00:00
inp_towhom.adaptive_height=True
2020-08-23 14:40:02 +00:00
inp_towhom.background_color=rgb(*COLOR_CARD)
inp_towhom.color=rgb(*COLOR_CARD)
inp_towhom.text_color=rgb(*COLOR_CARD)
inp_towhom.theme_text_color='Custom'
2020-08-22 18:58:11 +00:00
# self.post_card.author_section_layout.md_bg_color=1,0,0,1
self.to_whom_layo = MDBoxLayout()
self.to_whom_layo.cols=1
2020-08-22 19:39:56 +00:00
# self.to_whom_layo.size_hint=(None,None)
self.to_whom_layo.width='300sp'
self.to_whom_layo.height='2000sp'
self.to_whom_layo.md_bg_color=1,1,0,1
2020-08-22 18:58:11 +00:00
# self.post_card.author_section_layout.add_widget(MDLabel(text='-->'),1)
2020-08-22 19:39:56 +00:00
# self.post_card.author_section_layout.add_widget(self.to_whom_btn)
# self.to_whom_layo.add_widget(self.to_whom_btn)
2020-08-23 14:40:02 +00:00
# self.tmp_msg = MDLabel(text='to')
# self.post_card.author_section_layout.add_widget(self.tmp_msg,1)
self.post_card.author_section_layout.add_widget(self.to_whom_btn,1)
2020-08-22 19:39:56 +00:00
2020-08-22 18:58:11 +00:00
self.to_whom_btn.ids.txt_input.text = '@'
#self.to_whom_btn.adaptive_height = True
self.to_whom_btn.ids.txt_input.word_list = ['@'+k for k in self.app.keys if k != self.app.username]
self.to_whom_btn.ids.txt_input.starting_no = 1
# self.post_card.author_section_layout.add_widget(get_separator('1sp'))
#self.post_card.author_section_layout.add_widget(self.to_whom_btn,3)
# close for now
2020-08-22 19:39:56 +00:00
# self.close_author_option()
# self.post_card.remove_widget(self.to_whom_btn)
# self.to_whom_btn.height='0dp'
# self.to_whom_btn.size_hint_y=None
2020-08-22 00:27:20 +00:00
2020-08-22 17:51:09 +00:00
# remove content, add text input
2020-08-12 19:53:59 +00:00
post.scroller.remove_widget(post.post_content)
2020-08-22 18:58:11 +00:00
# self.post_card.author_section_layout.add_widget(get_separator('1dp'))
# self.post_card.author_section_layout.add_widget(self.to_whom_layo,1)
2020-08-12 19:53:59 +00:00
post.scroller.add_widget(post_TextField)
post.scroller.size=('300dp','300dp')
2020-08-12 19:23:23 +00:00
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
2020-08-23 14:40:02 +00:00
2020-08-12 19:23:23 +00:00
self.button_layout.add_widget(self.upload_button)
self.button_layout.add_widget(self.post_button)
2020-08-22 19:39:56 +00:00
2020-08-23 14:40:02 +00:00
self.upload_button.font_size='8sp'
self.post_button.font_size='8sp'
2020-08-12 19:23:23 +00:00
2020-08-23 14:40:02 +00:00
self.post_button.md_bg_color=rgb(*COLOR_CARD)
self.upload_button.md_bg_color=rgb(*COLOR_CARD)
2020-08-22 19:39:56 +00:00
self.post_status.md_bg_color=rgb(*COLOR_CARD)
2020-08-12 19:23:23 +00:00
2020-08-23 14:40:02 +00:00
post.add_widget(self.button_layout)
2020-08-12 19:23:23 +00:00
# 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()
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
2020-08-17 20:40:48 +00:00
# self.open_dialog('uploading')
2020-08-12 19:23:23 +00:00
# self.upload()
# self.close_dialog()
2020-08-18 17:25:15 +00:00
#mythread = threading.Thread(target=self.upload)
#mythread.start()
self.upload()
2020-08-12 19:23:23 +00:00
def upload(self):
2020-08-17 20:40:48 +00:00
# get file id
filename=self.orig_img_src[0] if self.orig_img_src and os.path.exists(self.orig_img_src[0]) else ''
if not filename: return
self.img_id = file_id = get_random_id()
self.img_ext = os.path.splitext(filename)[-1][1:]
# cache
tmp_img_fn = 'cache/'+self.img_id[:3]+'/'+self.img_id[3:]+'.'+self.img_ext
2020-08-17 20:40:48 +00:00
tmp_img_dir = os.path.dirname(tmp_img_fn)
if not os.path.exists(tmp_img_dir): os.makedirs(tmp_img_dir)
shutil.copyfile(filename, tmp_img_fn)
# add
2020-08-17 20:40:48 +00:00
self.add_image(tmp_img_fn)
# upload
#def do_upload():
2020-08-20 10:59:53 +00:00
asyncio.create_task(self.app.upload(tmp_img_fn, file_id=file_id))
# Thread(target=do_upload).start()
2020-08-17 20:40:48 +00:00
# self.close_dialog()
def add_image(self,filename):
if hasattr(self,'image_layout'):
self.post_card.remove_widget(self.image_layout)
self.image_layout = image_layout = PostImageLayout()
self.image = image = PostImage(source=filename)
# self.image.texture = img.texture
self.image.height = '300dp'
self.image_layout.add_widget(self.image)
self.image_layout.height='300dp'
self.post_card.add_widget(self.image_layout,index=1)
2020-08-12 19:23:23 +00:00
def post(self):
# check?
2020-08-12 19:53:59 +00:00
maxlen = 500
2020-08-12 19:23:23 +00:00
content = self.post_textfield.text
2020-08-12 19:53:59 +00:00
lencontent = content.strip().replace(' ',' ').count(' ')
# maxlen = int(self.post_textfield.max_text_length)
2020-08-12 19:23:23 +00:00
lendiff = lencontent - maxlen
if lendiff>0:
2020-08-12 19:53:59 +00:00
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})')
2020-08-12 19:23:23 +00:00
return
2020-08-22 19:39:56 +00:00
#channels = [k[1:] for k,v in self.to_channels.items() if v]
2020-08-22 20:11:19 +00:00
recipient = self.to_whom_btn.ids.txt_input.text
self.log('RECIPIENT:',recipient)
if not recipient: ##not hasattr(self,'recipient') or not self.recipient or self.app.username==self.recipient:
2020-08-22 19:39:56 +00:00
self.log('no recipient was selected')
2020-08-22 00:27:20 +00:00
# self.='No place was selected'
return
2020-08-23 14:40:02 +00:00
if recipient.startswith('@'): recipient=recipient[1:]
2020-08-22 20:11:19 +00:00
self.recipient = recipient
channel = recipient
2020-08-22 00:27:20 +00:00
2020-08-12 19:23:23 +00:00
# log('?????????????????'+self.media_uid)
2020-08-17 20:59:53 +00:00
# if not hasattr(self,'img_id') and self.upload_button.selection:
# log('REUPLOADING')
# self.upload()
2020-08-19 14:07:12 +00:00
async def do_post():
file_id = self.img_id if hasattr(self,'img_id') else None
file_ext = self.img_ext if hasattr(self,'img_ext') else None
2020-08-22 20:11:19 +00:00
await self.app.post(content=content, channel = channel, file_id=file_id, file_ext=file_ext)
import time
self.close_dialog()
2020-08-23 14:40:02 +00:00
self.app.change_screen_from_uri('/inbox/'+channel)
2020-08-22 21:20:27 +00:00
# self.open_dialog('')
2020-08-18 17:25:15 +00:00
#Thread(target=do_post).start()
2020-08-19 14:07:12 +00:00
asyncio.create_task(do_post())
2020-08-10 20:38:00 +00:00
2020-08-17 20:40:48 +00:00
def get_random_id():
import uuid
2020-08-22 19:39:56 +00:00
return uuid.uuid4().hex
class MessagePopup(MDDialog): pass