adding post-writing
parent
b9897f6b17
commit
59f4410286
@ -0,0 +1,316 @@
|
||||
#:import get_color_from_hex kivy.utils.get_color_from_hex
|
||||
#:import images_path kivymd.images_path
|
||||
#:import colors kivymd.color_definitions.colors
|
||||
#:import partial functools.partial
|
||||
#:import NoTransition kivy.uix.screenmanager.NoTransition
|
||||
# :import MDCarousel kivymd.uix.carousel.MDCarousel
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## CLASS DEFS
|
||||
|
||||
<MyBoxLayout>:
|
||||
orientation: "vertical"
|
||||
pos_hint: {'center_x':0.5, 'center_y':0.5}
|
||||
size_hint:0.5,0.5
|
||||
padding:'10dp'
|
||||
md_bg_color:0,0,0,1
|
||||
canvas:
|
||||
Color:
|
||||
rgb: 1,0,0,2
|
||||
Line:
|
||||
width: 1
|
||||
rectangle: (self.x, self.y, self.width, self.height)
|
||||
|
||||
|
||||
<MyLabel>:
|
||||
theme_text_color: 'Custom'
|
||||
text_color: (1,0,0,1)
|
||||
pos_hint: {'center_y': 0.5}
|
||||
halign: 'center'
|
||||
height: self.texture_size[1]
|
||||
font_family: 'Courier'
|
||||
|
||||
|
||||
<PostTitle>:
|
||||
id: post_title
|
||||
text: ''
|
||||
size_hint_y: None
|
||||
height: self.texture_size[1]
|
||||
font_style: 'H5'
|
||||
halign: 'center'
|
||||
height: '25'
|
||||
size_hint_y: None
|
||||
|
||||
<PostImage>:
|
||||
# height: '25'
|
||||
size_hint_y: None
|
||||
|
||||
<PostGridLayout>:
|
||||
cols: 1
|
||||
size_hint: (1,None)
|
||||
pos_hint: {'center_x':0.5, 'center_y':0}
|
||||
md_bg_color: 1,1,0,1
|
||||
height: self.minimum_height
|
||||
|
||||
|
||||
<PostAuthorLayout>:
|
||||
cols: 2
|
||||
orientation: 'horizontal'
|
||||
size_hint: (1,None)
|
||||
# size_hint:(None,None)
|
||||
# pos_hint:(None,None)
|
||||
pos_hint: {'center_x':0.5, 'center_y':0}
|
||||
# md_bg_color: 1,1,0,1
|
||||
height: '100dp' #self.minimum_height
|
||||
# radius:[20,]
|
||||
# border_radius:20
|
||||
|
||||
<PostAuthorAvatar>:
|
||||
size_hint:(None,None)
|
||||
pos_hint:{'center_x':1,'x':1}
|
||||
# padding:'10dp'
|
||||
# canvas:
|
||||
# Color:
|
||||
# rgb: 1,0,0,1
|
||||
# Line:
|
||||
# width: 1
|
||||
# rectangle: (self.x, self.y, self.width, self.height)
|
||||
|
||||
<PostAuthorLabel>:
|
||||
id: post_author_label
|
||||
text: ''
|
||||
pos_hint: {'center_y':0.5, 'center_x':0.5}
|
||||
# font_size:'100dp'
|
||||
# font_style:'H5'
|
||||
# font_style: 'custom'
|
||||
#font_name: "Strengthen"
|
||||
# height: '400'
|
||||
size_hint_y: None
|
||||
# size_hint_x: 100
|
||||
text_color:1,0,0,1
|
||||
theme_text_color: 'Custom'
|
||||
halign: 'left'
|
||||
padding: ('10dp','0dp')
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<PostContent>:
|
||||
id: post_content
|
||||
text: ''
|
||||
pos_hint: {'center_y':1}
|
||||
font_size:'58dp'
|
||||
font_style:'H5'
|
||||
#font_name: "Strengthen"
|
||||
# height: '400'
|
||||
size_hint_y: None
|
||||
text_color:1,0,0,1
|
||||
theme_text_color: 'Custom'
|
||||
halign: 'left'
|
||||
|
||||
|
||||
<PostCard>:
|
||||
id: post
|
||||
orientation: "vertical"
|
||||
padding: "20dp"
|
||||
size_hint: (0.9, None)
|
||||
pos_hint: {"center_x": .5, "center_y": .5}
|
||||
md_bg_color: (0,0,0,1)
|
||||
height: self.minimum_height
|
||||
radius:[20,]
|
||||
border_radius:20
|
||||
# canvas:
|
||||
# Color:
|
||||
# rgb: 1,0,0,1
|
||||
# Line:
|
||||
# width: 1
|
||||
# rectangle: (self.x, self.y, self.width, self.height)
|
||||
# # radius:[20,]
|
||||
# # border_radius:20
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### LAYOUT
|
||||
|
||||
MyLayout:
|
||||
scr_mngr: scr_mngr
|
||||
orientation: 'vertical'
|
||||
height: self.minimum_height
|
||||
|
||||
canvas:
|
||||
Color:
|
||||
rgba: 0.925,0.925,0.925,1 #get_color_from_hex(colors['Gray']['900'])
|
||||
|
||||
Rectangle:
|
||||
pos: self.pos
|
||||
size: self.size
|
||||
source: 'assets/komrade2.png'
|
||||
|
||||
|
||||
MDToolbar:
|
||||
id: toolbar
|
||||
title: app.title
|
||||
pos_hint: {'center_x': .5, 'center_y': 0.95}
|
||||
md_bg_color: 0.1,0.1,0.1,1
|
||||
background_palette: 'Red'
|
||||
background_hue: '500'
|
||||
specific_text_color: 1,0,0,1
|
||||
# right_action_items: [['radio-tower', partial(root.change_screen, 'feed')], ['account-group', partial(root.change_screen, 'people')], ['calendar', partial(root.change_screen, 'events')], ['message-processing-outline', partial(root.change_screen, 'messages')], ['bell-outline', partial(root.change_screen, 'notifications')]]
|
||||
right_action_items: [['post-outline', partial(root.change_screen, 'feed')], ['pencil-plus-outline', partial(root.change_screen, 'post')], ['message-processing-outline', partial(root.change_screen, 'messages')], ['bell-outline', partial(root.change_screen, 'notifications')], ['account-circle-outline', partial(root.change_screen, 'notifications')]]
|
||||
#left_action_items: [[f"assets/fist2.png", partial(root.change_screen, 'feed')]]
|
||||
font_context: None
|
||||
font_name: f'assets/Strengthen.ttf'
|
||||
|
||||
|
||||
ScreenManager:
|
||||
id: scr_mngr
|
||||
# transition: NoTransition()
|
||||
|
||||
|
||||
|
||||
|
||||
###
|
||||
# LOGIN SCREEN
|
||||
###
|
||||
|
||||
LoginScreen:
|
||||
name: "login"
|
||||
# text: "Login"
|
||||
# icon: "login"
|
||||
|
||||
MyBoxLayout:
|
||||
id: loginbox
|
||||
size_hint:0.5,0.18
|
||||
|
||||
MDTextField:
|
||||
id: username
|
||||
hint_text: "username"
|
||||
required: True
|
||||
write_tab: False
|
||||
multiline: False
|
||||
helper_text_mode: "on_error"
|
||||
color_mode: 'custom'
|
||||
line_color_focus: 1,0,0,1
|
||||
line_color_normal: 1,0,0,1
|
||||
current_hint_text_color: 1,0,0,1
|
||||
|
||||
MDTextField:
|
||||
id: password
|
||||
password: True
|
||||
hint_text: "password"
|
||||
required: True
|
||||
write_tab: False
|
||||
multiline: False
|
||||
helper_text_mode: "on_error"
|
||||
color_mode: 'custom'
|
||||
line_color_focus: 1,0,0,1
|
||||
line_color_normal: 1,0,0,1
|
||||
current_hint_text_color: 1,0,0,1
|
||||
|
||||
|
||||
MDBoxLayout:
|
||||
id: buttonbox
|
||||
size_hint_y: None
|
||||
adaptive_width: True
|
||||
height: '56dp'
|
||||
spacing: '10dp'
|
||||
pos_hint: {'center_x': .5}
|
||||
|
||||
MDRectangleFlatButton:
|
||||
text: "login"
|
||||
on_release:
|
||||
app.login(username.text, password.text)
|
||||
#app.root.change_screen("welcome")
|
||||
theme_text_color: "Custom"
|
||||
text_color: 1,0,0,1
|
||||
md_bg_color: 0,0,0,1
|
||||
|
||||
|
||||
MDRectangleFlatButton:
|
||||
text: "register"
|
||||
on_release:
|
||||
app.register(username.text, password.text)
|
||||
theme_text_color: "Custom"
|
||||
text_color: 1,0,0,1
|
||||
md_bg_color: 0,0,0,1
|
||||
|
||||
MDLabel:
|
||||
id: login_status
|
||||
text:""
|
||||
theme_text_color: 'Error'
|
||||
pos_hint:{'center_x':.5}
|
||||
|
||||
|
||||
|
||||
WelcomeScreen:
|
||||
name: 'welcome'
|
||||
|
||||
MyBoxLayout:
|
||||
size_hint:0.666,0.666
|
||||
|
||||
#MyLabel:
|
||||
# text: "Welcome!"
|
||||
# font_style: "H3"
|
||||
# pos_hint: {'center_y':0.85}
|
||||
|
||||
MyLabel:
|
||||
text: "\n\nTurning and turning in the widening gyre \nThe falcon cannot hear the falconer;\nThings fall apart; the centre cannot hold;\nMere anarchy is loosed upon the world,\nThe blood-dimmed tide is loosed, and everywhere \nThe ceremony of innocence is drowned;\nThe best lack all conviction, while the worst \nAre full of passionate intensity.\n\nSurely some revelation is at hand..."
|
||||
|
||||
|
||||
PeopleScreen:
|
||||
name: 'people'
|
||||
|
||||
ScrollView:
|
||||
id: scroll
|
||||
size_hint: (1, 1)
|
||||
pos_hint: {'center_x': .5, 'y': 0}
|
||||
do_scroll_x: False
|
||||
bar_width: 0
|
||||
scroll_type: ['content']
|
||||
|
||||
MDList:
|
||||
id: container
|
||||
# size_hint_y: None
|
||||
# height: '100dp'
|
||||
#padding: 0, self._list_vertical_padding
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
FeedScreen:
|
||||
name: 'feed'
|
||||
#MyLabel:
|
||||
# text: "The falcon cannot hear the falconer..."
|
||||
Carousel:
|
||||
id: post_carousel
|
||||
direction: 'right'
|
||||
|
||||
AddPostScreen:
|
||||
name: 'post'
|
||||
|
||||
|
||||
|
||||
EventsScreen:
|
||||
name: 'events'
|
||||
|
||||
MessagesScreen:
|
||||
name: 'messages'
|
||||
|
||||
NotificationsScreen:
|
||||
name: 'notifications'
|
||||
|
@ -0,0 +1,259 @@
|
||||
from kivy.uix.screenmanager import Screen,ScreenManager
|
||||
from kivymd.app import MDApp
|
||||
from kivymd.uix.button import MDFillRoundFlatButton, MDIconButton
|
||||
from kivymd.uix.toolbar import MDToolbar
|
||||
from kivymd.uix.screen import MDScreen
|
||||
from kivy.lang import Builder
|
||||
from kivy.uix.boxlayout import BoxLayout
|
||||
from kivymd.theming import ThemeManager
|
||||
from kivy.properties import ObjectProperty,ListProperty
|
||||
import time
|
||||
from collections import OrderedDict
|
||||
from functools import partial
|
||||
from kivy.uix.screenmanager import NoTransition
|
||||
from kivymd.uix.label import MDLabel
|
||||
from kivy.uix.widget import Widget
|
||||
from kivymd.uix.list import OneLineListItem
|
||||
from kivymd.uix.card import MDCard, MDSeparator
|
||||
from kivymd.uix.boxlayout import MDBoxLayout
|
||||
from kivy.uix.gridlayout import GridLayout
|
||||
from kivy.metrics import dp
|
||||
from kivy.properties import NumericProperty
|
||||
from kivymd.uix.list import * #MDList, ILeftBody, IRightBody, ThreeLineAvatarListItem, TwoLineAvatarListItem, BaseListItem, ImageLeftWidget
|
||||
from kivy.uix.image import Image, AsyncImage
|
||||
import requests,json
|
||||
from kivy.storage.jsonstore import JsonStore
|
||||
from kivy.core.window import Window
|
||||
from kivy.core.text import LabelBase
|
||||
|
||||
Window.size = (640, 1136) #(2.65 * 200, 5.45 * 200)
|
||||
|
||||
|
||||
root = None
|
||||
app = None
|
||||
|
||||
def log(x):
|
||||
with open('log.txt','a+') as of:
|
||||
of.write(str(x)+'\n')
|
||||
|
||||
class MyLayout(MDBoxLayout):
|
||||
scr_mngr = ObjectProperty(None)
|
||||
|
||||
def change_screen(self, screen, *args):
|
||||
self.scr_mngr.current = screen
|
||||
|
||||
|
||||
class MyBoxLayout(MDBoxLayout): pass
|
||||
class MyLabel(MDLabel): pass
|
||||
|
||||
|
||||
### POST CODE
|
||||
class PostTitle(MDLabel): pass
|
||||
class PostGridLayout(GridLayout): pass
|
||||
class PostImage(AsyncImage): pass
|
||||
|
||||
class PostContent(MDLabel):
|
||||
def __init__(self,**kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.bind(width=lambda s, w: s.setter('text_size')(s, (w, None)))
|
||||
self.bind(texture_size=self.setter('size'))
|
||||
self.font_name='assets/overpass-mono-regular.otf'
|
||||
#pass
|
||||
|
||||
class PostAuthorLayout(MDBoxLayout): pass
|
||||
|
||||
class PostAuthorLabel(MDLabel):
|
||||
def __init__(self,**kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.bind(width=lambda s, w: s.setter('text_size')(s, (w, None)))
|
||||
self.bind(texture_size=self.setter('size'))
|
||||
self.font_name='assets/overpass-mono-regular.otf'
|
||||
pass
|
||||
class PostAuthorAvatar(AsyncImage): pass
|
||||
|
||||
class PostCard(MDCard):
|
||||
def __init__(self, author = None, title = None, img_src = None, content = None):
|
||||
super().__init__()
|
||||
self.author = author
|
||||
self.title = title
|
||||
self.img_src = img_src
|
||||
self.content = content
|
||||
self.bind(minimum_height=self.setter('height'))
|
||||
|
||||
# pieces
|
||||
author_section_layout = PostAuthorLayout()
|
||||
author_label = PostAuthorLabel(text=self.author)
|
||||
author_label.font_size = '28dp'
|
||||
author_avatar = PostAuthorAvatar(source=self.img_src)
|
||||
author_section_layout.add_widget(author_avatar)
|
||||
author_section_layout.add_widget(author_label)
|
||||
# author_section_layout.add_widget(author_avatar)
|
||||
self.add_widget(author_section_layout)
|
||||
|
||||
|
||||
title = PostTitle(text=self.title)
|
||||
# image = PostImage(source=self.img_src)
|
||||
content = PostContent(text=self.content)
|
||||
|
||||
#content = PostContent()
|
||||
|
||||
# add to screen
|
||||
self.add_widget(title)
|
||||
# self.add_widget(image)
|
||||
self.add_widget(content)
|
||||
#self.add_widget(layout)
|
||||
|
||||
#####
|
||||
|
||||
|
||||
|
||||
#### LOGIN
|
||||
|
||||
class ProtectedScreen(MDScreen):
|
||||
def on_pre_enter(self):
|
||||
global app
|
||||
if not app.is_logged_in():
|
||||
app.root.change_screen('login')
|
||||
|
||||
|
||||
|
||||
|
||||
class WelcomeScreen(ProtectedScreen): pass
|
||||
class LoginScreen(MDScreen):
|
||||
#def on_pre_enter(self):
|
||||
# global app
|
||||
# if app.is_logged_in():
|
||||
# app.root.change_screen('feed')
|
||||
pass
|
||||
|
||||
class PeopleScreen(ProtectedScreen): pass
|
||||
class AddPostScreen(ProtectedScreen): pass
|
||||
class EventsScreen(ProtectedScreen): pass
|
||||
class MessagesScreen(ProtectedScreen): pass
|
||||
class NotificationsScreen(ProtectedScreen): pass
|
||||
|
||||
|
||||
class FeedScreen(ProtectedScreen):
|
||||
def on_enter(self):
|
||||
i=0
|
||||
lim=5
|
||||
with open('tweets.txt') as f:
|
||||
for ln in f:
|
||||
if ln.startswith('@') or ln.startswith('RT '): continue
|
||||
i+=1
|
||||
if i>lim: break
|
||||
|
||||
#post = Post(title=f'Marx Zuckerberg', content=ln.strip())
|
||||
post = PostCard(
|
||||
author='Marx Zuckerberg',
|
||||
title='',
|
||||
img_src='avatar.jpg',
|
||||
content=ln.strip())
|
||||
print(post)
|
||||
root.ids.post_carousel.add_widget(post)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def get_tor_proxy_session():
|
||||
session = requests.session()
|
||||
# Tor uses the 9050 port as the default socks port
|
||||
session.proxies = {'http': 'socks5://127.0.0.1:9050',
|
||||
'https': 'socks5://127.0.0.1:9050'}
|
||||
return session
|
||||
|
||||
def get_tor_python_session():
|
||||
from torpy.http.requests import TorRequests
|
||||
with TorRequests() as tor_requests:
|
||||
with tor_requests.get_session() as s:
|
||||
return s
|
||||
|
||||
from kivymd.font_definitions import theme_font_styles
|
||||
class MainApp(MDApp):
|
||||
title = 'Komrade'
|
||||
#api = 'http://localhost:5555/api'
|
||||
api = 'http://128.232.229.63:5555/api'
|
||||
#api = 'http://komrades.net:5555/api'
|
||||
logged_in=False
|
||||
store = JsonStore('komrade.json')
|
||||
login_expiry = 60 * 60 * 24 * 7 # once a week
|
||||
#login_expiry = 5 # 5 seconds
|
||||
|
||||
def get_session(self):
|
||||
return get_tor_proxy_session()
|
||||
#return get_tor_python_session()
|
||||
|
||||
def build(self):
|
||||
# bind
|
||||
global app,root
|
||||
app = self
|
||||
self.root = root = Builder.load_file('main.kv')
|
||||
|
||||
# edit logo
|
||||
logo=root.ids.toolbar.ids.label_title
|
||||
logo.font_name='assets/Strengthen.ttf'
|
||||
logo.font_size='58dp'
|
||||
logo.pos_hint={'center_y':0.43}
|
||||
# icons
|
||||
icons=root.ids.toolbar.ids.right_actions.children
|
||||
for icon in icons:
|
||||
#log(dir(icon))
|
||||
#icon.icon='android' #user_font_size='200sp'
|
||||
icon.font_size='58dp'
|
||||
icon.user_font_size='58dp'
|
||||
icon.width='58dp'
|
||||
icon.size_hint=(None,None)
|
||||
icon.height='58dp'
|
||||
|
||||
if not self.is_logged_in():
|
||||
self.root.change_screen('login')
|
||||
else:
|
||||
self.root.change_screen('feed')
|
||||
return self.root
|
||||
|
||||
def is_logged_in(self):
|
||||
if self.logged_in: return True
|
||||
if not self.store.exists('user'): return False
|
||||
if self.store.get('user')['logged_in']:
|
||||
if time.time() - self.store.get('user')['logged_in_when'] < self.login_expiry:
|
||||
self.logged_in=True
|
||||
return True
|
||||
return False
|
||||
|
||||
def do_login(self):
|
||||
self.logged_in=True
|
||||
self.store.put('user',logged_in=True,logged_in_when=time.time())
|
||||
self.root.change_screen('feed')
|
||||
|
||||
|
||||
def login(self,un,pw):
|
||||
url = self.api+'/login'
|
||||
|
||||
with self.get_session() as sess:
|
||||
#res = requests.post(url, json={'name':un, 'passkey':pw})
|
||||
res = sess.post(url, json={'name':un, 'passkey':pw})
|
||||
|
||||
if res.status_code==200:
|
||||
self.do_login()
|
||||
else:
|
||||
self.root.ids.login_status.text=res.text
|
||||
|
||||
def register(self,un,pw):
|
||||
url = self.api+'/register'
|
||||
|
||||
with self.get_session() as sess:
|
||||
#res = requests.post(url, json={'name':un, 'passkey':pw})
|
||||
res = sess.post(url, json={'name':un, 'passkey':pw})
|
||||
if res.status_code==200:
|
||||
self.do_login()
|
||||
else:
|
||||
self.root.ids.login_status.text=res.text
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
App = MainApp()
|
||||
App.run()
|
Loading…
Reference in New Issue