def __init__(self, parent, title="اختر التاريخ"): self.parent = parent win = QDialog() layout = QHBoxLayout() cal = QCalendarWidget() cal.setLocale(QLocale("AR")) cal.setGridVisible(True) cal.move(20, 20) cal.clicked[QDate].connect(self.send_to_parent) layout.addWidget(cal) win.setLayout(layout) win.setWindowTitle(title) win.exec_()
class WorkoutPlanner(QWidget): def __init__(self): super().__init__() self.setStyleSheet(""" QWidget{ color:#c7c7c7; font-weight: bold; } QPushButton{ background-color: rgba(0, 0, 0, 0); border: 1px solid; font-size: 18px; font-weight: bold; border-color: #808080; min-height: 28px; white-space:nowrap; text-align: left; padding-left: 5%; font-family: Montserrat; } QPushButton:hover:!pressed{ border: 2px solid; border-color: #747474; } QPushButton:pressed{ border: 2px solid; background-color: #323232; border-color: #6C6C6C; }""") self.db_wrapper = DatabaseWrapper() self.table_name = "Workouts" self.db_wrapper.create_local_table(self.table_name) if self.db_wrapper.local_table_is_empty(self.table_name): self.db_wrapper.insert_default_values(self.table_name) self.fetched_workouts = json.loads( self.db_wrapper.fetch_local_column(self.table_name, "workouts")) self.current_date = datetime.today().strftime("%d/%m/%Y") if not self.current_date in self.fetched_workouts: self.fetched_workouts[self.current_date] = { "Personal Notes": "", "Workout Name": "None" } self.db_wrapper.update_table_column( self.table_name, "workouts", json.dumps(self.fetched_workouts)) self.create_panel() def create_panel(self): self.grid = QGridLayout() self.grid.addWidget(self.create_calendar(), 0, 0, 2, 1) self.grid.addWidget(self.create_stats(), 0, 1, 2, 1) self.grid.addWidget(self.create_left_details(), 2, 0, 2, 1) self.grid.addWidget(self.create_right_details(), 2, 1, 2, 1) self.setLayout(self.grid) def create_calendar(self): frame = QFrame() frame.setFrameStyle(QFrame.StyledPanel) layout = QHBoxLayout() self.calendar = QCalendarWidget(self) self.calendar.setLocale(QLocale(QLocale.English)) self.calendar.setFirstDayOfWeek(Qt.DayOfWeek.Monday) self.calendar.clicked.connect(lambda: self.show_date()) layout.addWidget(self.calendar) frame.setLayout(layout) return frame def create_stats(self): frame = QFrame() frame.setFrameStyle(QFrame.StyledPanel) stats_layout = QVBoxLayout() stats_label = QLabel("Stats") stats_label.setFont(QFont("Ariel", 18, weight=QFont.Bold)) number_of_workouts = QLabel(" ".join([ "Total Number Of Workouts Done:", str(len(self.fetched_workouts)) ])) counter_this_month = 0 for date in self.fetched_workouts: if date.split("/")[1] == self.current_date.split("/")[1]: counter_this_month += 1 workouts_done_this_month = QLabel(" ".join( ["Workouts Done This Month:", str(counter_this_month)])) last_workout = list(self.fetched_workouts.keys())[-1] for date, workout in reversed(list(self.fetched_workouts.items())): if len(workout) > 1: # found workout that is not todays default last_workout = date break last_workout = QLabel(" ".join(["Last Workout:", last_workout])) stats_layout.addWidget(stats_label) stats_layout.addWidget(number_of_workouts) stats_layout.addWidget(workouts_done_this_month) stats_layout.addWidget(last_workout) frame.setLayout(stats_layout) return frame def create_left_details(self): frame = QFrame() frame.setFrameStyle(QFrame.StyledPanel) layout = QVBoxLayout() self.day_label = QLabel(self.current_date) self.day_label.setFont(QFont("Ariel", 18, weight=QFont.Bold)) workout_done_layout = QHBoxLayout() self.workout_done_label = QLabel(" ".join([ "Workout Done:", self.fetched_workouts[self.current_date]["Workout Name"] ])) workout_done_button = QPushButton("Change") workout_done_button.clicked.connect(lambda: self.change_workout_done()) workout_done_layout.addWidget(self.workout_done_label) workout_done_layout.addWidget(workout_done_button) specific_workout_layout = QHBoxLayout() specific_workout_label = QLabel( "Create a workout specific for one day: ") specific_workout_button = QPushButton("1 Time Workout") specific_workout_button.clicked.connect( lambda: self.show_1_time_window()) specific_workout_layout.addWidget(specific_workout_label) specific_workout_layout.addWidget(specific_workout_button) personal_notes_layout = QVBoxLayout() personal_notes_label = QLabel("Personal Notes:") self.text_edit = QTextEdit() self.text_edit.setStyleSheet("color: black;") self.text_edit.setText( self.fetched_workouts[self.current_date]["Personal Notes"]) self.personal_notes_save_button = QPushButton("Save Changes") self.personal_notes_save_button.clicked.connect( lambda: self.update_personal_notes()) personal_notes_layout.addWidget(personal_notes_label) personal_notes_layout.addWidget(self.text_edit) personal_notes_layout.addWidget(self.personal_notes_save_button) layout.addWidget(self.day_label) layout.addLayout(workout_done_layout) layout.addLayout(specific_workout_layout) layout.addLayout(personal_notes_layout) frame.setLayout(layout) return frame def create_right_details(self): frame = QFrame() frame.setFrameStyle(QFrame.StyledPanel) layout = QVBoxLayout() layout.setAlignment(Qt.AlignTop) details_label = QLabel("Workout Details") details_label.setFont(QFont("Ariel", 18, weight=QFont.Bold)) self.grid_layout = QGridLayout() name_label = QLabel("Exercise Name") sets_label = QLabel("Sets") reps_label = QLabel("Reps") rest_label = QLabel("Rest") layout.addWidget(details_label) self.grid_layout.addWidget(name_label, 0, 0) self.grid_layout.addWidget(sets_label, 0, 1) self.grid_layout.addWidget(reps_label, 0, 2) self.grid_layout.addWidget(rest_label, 0, 3) if "Exercises" in self.fetched_workouts[self.current_date]: exercises_count = len( self.fetched_workouts[self.current_date]["Exercises"]) self.number_of_exercises_label = QLabel(" ".join( ["Number of Exercises:", str(exercises_count)])) set_count = 0 for exercise in self.fetched_workouts[ self.current_date]["Exercises"]: set_count += int(self.fetched_workouts[self.current_date] ["Exercises"][exercise]["Sets"]) self.total_set_count_label = QLabel(" ".join( ["Total Set Count:", str(set_count)])) layout.addWidget(self.number_of_exercises_label) layout.addWidget(self.total_set_count_label) names_labels = [None] * len( self.fetched_workouts[self.current_date]["Exercises"].keys()) sets_labels = [None] * len( self.fetched_workouts[self.current_date]["Exercises"].keys()) reps_labels = [None] * len( self.fetched_workouts[self.current_date]["Exercises"].keys()) rest_labels = [None] * len( self.fetched_workouts[self.current_date]["Exercises"].keys()) j = 1 for i, exercise in enumerate(self.fetched_workouts[ self.current_date]["Exercises"].keys()): names_labels[i] = QLabel(exercise) sets_labels[i] = QLabel( str(self.fetched_workouts[self.current_date]["Exercises"] [exercise]["Sets"])) reps_labels[i] = QLabel( str(self.fetched_workouts[self.current_date]["Exercises"] [exercise]["Reps"])) rest_labels[i] = QLabel( str(self.fetched_workouts[self.current_date]["Exercises"] [exercise]["Rest"])) self.grid_layout.addWidget(names_labels[i], j, 0) self.grid_layout.addWidget(sets_labels[i], j, 1) self.grid_layout.addWidget(reps_labels[i], j, 2) self.grid_layout.addWidget(rest_labels[i], j, 3) j += 1 layout.addWidget(QLabel("")) layout.addLayout(self.grid_layout) frame.setLayout(layout) return frame def show_date(self): self.current_date = self.get_calendar_date() if not self.current_date in self.fetched_workouts: self.fetched_workouts[self.current_date] = { "Personal Notes": "", "Workout Name": "None" } self.day_label.setText(self.current_date) self.refresh_workout_done(True, True) self.text_edit.setText( self.fetched_workouts[self.current_date]["Personal Notes"]) def get_calendar_date(self): date = self.calendar.selectedDate() day = str(date.day()) if date.day() > 9 else "0" + str(date.day()) month = str( date.month()) if date.month() > 9 else "0" + str(date.month()) parsed_date = "/".join([day, month, str(date.year())]) return parsed_date def show_1_time_window(self): self.create_workout_window = CreateWorkoutWindow( one_time=True, date=self.get_calendar_date()) if self.db_wrapper.connection_exists: self.create_workout_window.refresh_after_creating_signal.connect( lambda signal: self.refresh_workout_done(signal)) self.create_workout_window.setGeometry(100, 200, 300, 300) self.create_workout_window.show() def update_personal_notes(self): self.fetched_workouts[self.current_date][ "Personal Notes"] = self.text_edit.toPlainText() self.db_wrapper.update_table_column(self.table_name, "workouts", json.dumps(self.fetched_workouts)) def change_workout_done(self): self.select_workout_window = SelectWorkout(self.get_calendar_date()) self.select_workout_window.refresh_workout_done_signal.connect( lambda signal: self.refresh_workout_done(signal)) self.select_workout_window.setGeometry(100, 200, 300, 300) self.select_workout_window.show() @pyqtSlot(bool) def refresh_workout_done(self, signal, date_change=False): if signal: if not date_change: self.fetched_workouts = json.loads( self.db_wrapper.fetch_local_column(self.table_name, "workouts")) self.workout_done_label.setText(" ".join([ "Workout Done:", self.fetched_workouts[self.current_date]["Workout Name"] ])) old_right_details_reference = self.grid.itemAt(3).widget() new_right_details = self.create_right_details() self.grid.replaceWidget(old_right_details_reference, new_right_details) old_right_details_reference.setParent(None)