Files
bbbbbs/main.py

246 lines
9.9 KiB
Python
Executable File

#!/usr/bin/python3
import gi
import config
import logging
from datetime import datetime
from random import choice
from string import ascii_lowercase, digits
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
import db
log = logging.getLogger("main")
db.create_transmissions_table()
class MainWindow(Gtk.Window):
def __init__(self):
super().__init__(title="bardzo biedny BBS %s"%config.version)
############################## Boxes #####################################
pad=15
self.main_box = Gtk.Box()
self.main_box.set_orientation(Gtk.Orientation.HORIZONTAL)
# left side
self.left_box = Gtk.Box()
self.left_box.set_orientation(Gtk.Orientation.VERTICAL)
self.left_box.set_spacing(0)
self.left_button_box = Gtk.Box()
self.left_button_box.set_orientation(Gtk.Orientation.HORIZONTAL)
self.left_button_box.set_spacing(pad)
# right side
self.right_box = Gtk.Box()
self.right_box.set_orientation(Gtk.Orientation.VERTICAL)
self.right_box.set_spacing(0)
self.title_author_box = Gtk.Box()
self.title_author_box.set_orientation(Gtk.Orientation.HORIZONTAL)
self.title_author_box.set_spacing(pad)
self.message_box = Gtk.Box()
self.message_box.set_orientation(Gtk.Orientation.VERTICAL)
self.message_box.set_spacing(2)
self.date_time_box = Gtk.Box()
self.date_time_box.set_orientation(Gtk.Orientation.HORIZONTAL)
self.date_time_box.set_spacing(pad)
self.synthesize_listen_box = Gtk.Box()
self.synthesize_listen_box.set_orientation(Gtk.Orientation.HORIZONTAL)
self.synthesize_listen_box.set_spacing(pad)
self.clear_save_box = Gtk.Box()
self.clear_save_box.set_orientation(Gtk.Orientation.HORIZONTAL)
self.clear_save_box.set_spacing(pad)
################################ Widgets ######################################
# left side
self.transmission_list = Gtk.ListBox()
self.transmission_list.connect("row-activated", self.on_picked_transmission)
self.transmissions = []
self.update_transmission_list()
self.add_transmission_button = Gtk.Button(label="Add transmission")
self.add_transmission_button.connect("clicked", self.on_add_transmission)
self.delete_transmission_button = Gtk.Button(label="Delete transmission")
self.delete_transmission_button.connect("clicked", self.on_delete_transmission)
# right side
self.title = Gtk.Entry()
self.title.set_placeholder_text("Title")
self.title.connect("changed", self.update_save_button)
self.author = Gtk.Entry()
self.author.set_placeholder_text("Author")
self.author.connect("changed", self.update_save_button)
self.message_label = Gtk.Label(label="Message")
self.message_scroll_window = Gtk.ScrolledWindow()
self.message = Gtk.TextView()
self.message.get_buffer().connect("changed", self.update_save_button)
self.calendar = Gtk.Calendar()
self.calendar.connect("day-selected", self.on_date_picked)
year, month, day = self.calendar.get_date()
month += 1
month = str(month).rjust(2, '0')
day = str(day).rjust(2, '0')
self.picked_date = "%i-%s-%s"%(year, month, day)
self.timeslots = Gtk.ListBox()
self.timeslot_checkbuttons = []
for i in range(len(config.timeslots)):
slot = config.timeslots[i]
self.timeslot_checkbuttons.append(Gtk.CheckButton())
self.timeslot_checkbuttons[i].connect("toggled", self.update_save_button)
row = Gtk.ListBoxRow()
hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=50)
row.add(hbox)
time_label = Gtk.Label(label=slot, xalign=0)
hbox.pack_start(time_label, True, True, 0)
hbox.pack_start(self.timeslot_checkbuttons[i], False, True, 0)
self.timeslots.add(row)
self.synthesize_button = Gtk.Button(label="synthesize")
self.listen_button = Gtk.Button(label="listen")
self.clear_button = Gtk.Button(label="clear")
self.save_button = Gtk.Button(label="save")
self.save_button.set_sensitive(False)
self.save_button.connect("clicked", self.on_transmission_saved)
# we need to put the buttons in a sizegroup to make the synthesize button the same length as the rest
self.right_sizegroup = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL)
self.right_sizegroup.add_widget(self.synthesize_button)
self.right_sizegroup.add_widget(self.listen_button)
self.right_sizegroup.add_widget(self.clear_button)
self.right_sizegroup.add_widget(self.save_button)
######################### organise objects ###################################
self.add(self.main_box)
self.main_box.pack_start(self.left_box, True, True, pad)
self.main_box.pack_start(self.right_box, True, True, pad)
self.left_box.pack_start(self.transmission_list, True, True, pad)
self.left_box.pack_start(self.left_button_box, False, True, pad)
self.left_button_box.pack_start(self.add_transmission_button, True, True, 0)
self.left_button_box.pack_start(self.delete_transmission_button, True, True, 0)
self.right_box.pack_start(self.title_author_box, False, True, pad)
self.title_author_box.pack_start(self.title, True, True, 0)
self.title_author_box.pack_start(self.author, True, True, 0)
self.right_box.pack_start(self.message_box, True, True, pad)
self.message_box.pack_start(self.message_label, False, True, 0)
self.message_box.pack_start(self.message_scroll_window, True, True, 0)
self.message_scroll_window.add(self.message)
self.right_box.pack_start(self.date_time_box, True, True, pad)
self.date_time_box.pack_start(self.calendar, True, True, 0)
self.date_time_box.pack_start(self.timeslots, True, True, 0)
self.right_box.pack_start(self.synthesize_listen_box, False, True, 0)
self.synthesize_listen_box.pack_start(self.synthesize_button, True, True, 0)
self.synthesize_listen_box.pack_start(self.listen_button, True, True, 0)
self.right_box.pack_start(self.clear_save_box, False, True, pad)
self.clear_save_box.pack_start(self.clear_button, True, True, 0)
self.clear_save_box.pack_start(self.save_button, True, True, 0)
############################## Helper functions #############################
# The save button should be greyed out until all the data is input
def update_save_button(self, user_data):
messageBuffer = self.message.get_buffer()
startIter, endIter = messageBuffer.get_bounds()
message = messageBuffer.get_text(startIter, endIter, False)
if self.author.get_text() != "" and self.title.get_text() != "" and message != "" and self.get_selected_timeslots() != "":
self.save_button.set_sensitive(True)
else:
self.save_button.set_sensitive(False)
def on_date_picked(self, user_data):
year, month, day = self.calendar.get_date()
month += 1
month = str(month).rjust(2, '0')
day = str(day).rjust(2, '0')
self.picked_date = "%i-%s-%s"%(year, month, day)
def get_selected_timeslots(self):
selected = ""
for i in range(len(config.timeslots)):
if self.timeslot_checkbuttons[i].get_active():
selected += "%d " % i
return selected
def update_transmission_list(self):
self.transmissions = db.get_transmissions()
print(self.transmissions)
for child in self.transmission_list.get_children():
self.transmission_list.remove(child)
for i in range(len(self.transmissions)):
trx = self.transmissions[i]
trxID = "%s %s %s" % (trx[0], trx[1], trx[3])
self.transmission_list.insert(Gtk.Label(label=trxID), -1)
self.transmission_list.show_all()
############################ Button functions ###############################
def on_add_transmission(self, user_data):
uid = "".join(choice(ascii_lowercase + digits) for char in range(8))
log.debug(uid)
db.add_transmission(uid)
self.update_transmission_list()
def on_delete_transmission(self, user_data):
uid = self.transmissions[self.transmission_list.get_selected_row().get_index()][0]
log.debug("attempting to delete transmission %s" % uid)
db.delete_transmission(uid)
self.update_transmission_list()
def on_picked_transmission(self, row, user_data):
log.debug("row %i activated" % user_data.get_index())
uid = self.transmissions[self.transmission_list.get_selected_row().get_index()][0]
trxData = db.get_transmission_data(uid)
self.author.set_text(trxData["author"])
self.title.set_text(trxData["title"])
self.message.get_buffer().set_text(trxData["message"])
year, month, date = trxData["date"].split("-")
def on_transmission_saved(self, user_data):
uid = self.transmissions[self.transmission_list.get_selected_row().get_index()][0]
log.debug("saving transmission %s" % uid)
messageBuffer = self.message.get_buffer()
startIter, endIter = messageBuffer.get_bounds()
message = messageBuffer.get_text(startIter, endIter, False)
db.edit_transmission(uid,
self.picked_date,\
self.author.get_buffer().get_text(),\
self.title.get_buffer().get_text(),\
message,
self.get_selected_timeslots(),\
1,\
True)
self.update_transmission_list()
win = MainWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
db.sqliteConnection.close()
log.debug("database connection closed")