Skip to content

Commit 5634018

Browse files
committed
added forward and back buttons
1 parent b9b9654 commit 5634018

6 files changed

Lines changed: 117 additions & 50 deletions

File tree

src/core/gui_root.py

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,23 @@ def __init__(self, parent):
2424
# Initialize LogicRoot
2525
self.logic = LogicRoot(self)
2626

27+
# Navigation history
28+
self.history = [] # Stack to store visited pages
29+
self.history_index = -1 # Pointer to the current page in history
30+
31+
# Create container for screens
2732
self.container = tk.Frame(self)
2833
self.container.pack(side="top", fill="both", expand=True)
2934

30-
self.container.grid_rowconfigure(0, weight=1)
31-
self.container.grid_columnconfigure(0, weight=1)
35+
# Create navigation buttons
36+
self.nav_frame = tk.Frame(self)
37+
self.nav_frame.pack(side="top", fill="x")
38+
39+
self.back_button = tk.Button(self.nav_frame, text="←", command=self.go_back, state="disabled")
40+
self.back_button.pack(side="left")
41+
42+
self.forward_button = tk.Button(self.nav_frame, text="→", command=self.go_forward, state="disabled")
43+
self.forward_button.pack(side="left")
3244

3345
self.frames = {}
3446
self.selected_project = None # Store the selected project for navigation
@@ -52,21 +64,50 @@ def init_screens(self):
5264
def show_frame(self, page_name):
5365
frame = self.frames[page_name]
5466
frame.tkraise()
55-
67+
68+
# Check if the page is already the current page
69+
if self.history and self.history[self.history_index] == page_name:
70+
return # Do nothing if the page is already the current page
71+
72+
# If navigating to a new screen, clear forward history
73+
if self.history_index < len(self.history) - 1:
74+
self.history = self.history[:self.history_index + 1]
75+
76+
# Add the new screen to history
77+
self.history.append(page_name)
78+
self.history_index += 1
79+
80+
# Update navigation buttons
81+
self.update_nav_buttons()
82+
5683
# Special handling for ProjectSessionsWindow - load sessions when shown
5784
if page_name == "ProjectSessionsWindow":
5885
frame.load_sessions()
5986
# Special handling for CreateSessionWindow - check for pre-selected project
6087
elif page_name == "CreateSessionWindow":
6188
frame.check_pre_selected_project()
89+
90+
# Ensure navigation buttons are updated after any special handling
91+
self.update_nav_buttons()
6292

63-
def set_selected_project(self, project_name):
64-
"""Set the selected project for navigation between windows"""
65-
self.selected_project = project_name
66-
67-
def get_selected_project(self):
68-
"""Get the currently selected project"""
69-
return self.selected_project
93+
def go_back(self):
94+
"""Navigate to the previous screen."""
95+
if self.history_index > 0:
96+
self.history_index -= 1
97+
self.show_frame(self.history[self.history_index])
98+
self.update_nav_buttons()
99+
100+
def go_forward(self):
101+
"""Navigate to the next screen."""
102+
if self.history_index < len(self.history) - 1:
103+
self.history_index += 1
104+
self.show_frame(self.history[self.history_index])
105+
self.update_nav_buttons()
106+
107+
def update_nav_buttons(self):
108+
"""Enable or disable navigation buttons based on history."""
109+
self.back_button.config(state="normal" if self.history_index > 0 else "disabled")
110+
self.forward_button.config(state="normal" if self.history_index < len(self.history) - 1 else "disabled")
70111

71112
def reset_frames(self):
72113
try:

src/core/logic/project_handler.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ class ProjectHandler:
1212
def __init__(self, parent, logic_controller):
1313
self.parent = parent
1414
self.controller = logic_controller
15+
self.selected_project = None # For navigation between windows
1516
self.current_project = None
1617
self.projects_directory = get_projects_directory()
1718
self.projects_metadata_file = os.path.join(self.projects_directory, "projects_metadata.json")
@@ -145,6 +146,14 @@ def update_project_metadata(self, project_name, session_count=None):
145146
metadata["projects"][project_name]["session_count"] = session_count
146147
self._save_metadata(metadata)
147148

149+
def set_selected_project(self, project_name):
150+
"""Set the selected project for navigation between windows"""
151+
self.selected_project = project_name
152+
153+
def get_selected_project(self):
154+
"""Get the currently selected project"""
155+
return self.selected_project
156+
148157
def get_project_info(self, project_name):
149158
"""Get detailed information about a project"""
150159
metadata = self._load_metadata()

src/core/screens/create_session_window.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def load_projects(self):
9999

100100
def check_pre_selected_project(self):
101101
"""Check if there's a pre-selected project from the controller and set it"""
102-
selected_project = self.controller.get_selected_project()
102+
selected_project = self.logic.project_handler.get_selected_project()
103103
if selected_project:
104104
self.project_var.set(selected_project)
105105
else:

src/core/screens/main_window.py

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,61 @@
11
import tkinter as tk
2-
32
from core.utils.file_utils import sessions_exist, get_projects
43

54
class MainWindow(tk.Frame):
65
def __init__(self, parent, controller, logic_controller):
7-
tk.Frame.__init__(self, parent)
8-
self.controller = controller # GUI controller
9-
self.logic = logic_controller
6+
super().__init__(parent)
7+
self.controller = controller
108
self.logic = logic_controller
119

1210
# Check if we have projects or sessions
1311
_ = get_projects()
1412
_ = sessions_exist()
15-
1613

14+
# Title Label
1715
label_text = "Track app usage in a project or standalone session."
18-
19-
label = tk.Label(self, text=label_text)
20-
label.pack(side="top", fill="x", pady=10)
21-
22-
# Start new session button
23-
button1 = tk.Button(self, text="Start new session",
24-
command=lambda: self.controller.show_frame("CreateSessionWindow"), width=25)
25-
button1.pack(pady=3)
26-
27-
# Project management button
28-
button_projects = tk.Button(self, text="Projects",
29-
command=lambda: self.controller.show_frame("ProjectsWindow"), width=25)
30-
button_projects.pack(pady=3)
31-
32-
# Sessions button (always show)
33-
button2 = tk.Button(self, text="Sessions",
34-
command=lambda: [self.controller.show_frame("SessionsWindow"), self.logic.app_tracker.start_filter_reset(refresh=True)], width=25)
35-
button2.pack(pady=3)
36-
37-
# Configure custom rules button
38-
button3 = tk.Button(self, text="Configure custom rules",
39-
command=lambda: self.controller.show_frame("TrackerSettingsWindow"),
40-
width=25)
41-
button3.pack(pady=3)
42-
43-
exit_button = tk.Button(self, text=" Exit ", command=lambda: self.controller.on_close())
44-
exit_button.pack(pady=10, side='bottom')
16+
label = tk.Label(self, text=label_text, font=("Arial", 14, "bold"))
17+
label.pack(side="top", pady=(15, 20))
18+
19+
# Button Container
20+
button_frame = tk.Frame(self)
21+
button_frame.pack(pady=10)
22+
23+
# Row 1: Sessions + Projects
24+
btn_session = tk.Button(
25+
button_frame, text="Start New Session",
26+
command=lambda: self.controller.show_frame("CreateSessionWindow"),
27+
width=20, height=2
28+
)
29+
btn_session.grid(row=0, column=0, padx=10, pady=10)
30+
31+
btn_projects = tk.Button(
32+
button_frame, text="Projects",
33+
command=lambda: self.controller.show_frame("ProjectsWindow"),
34+
width=20, height=2
35+
)
36+
btn_projects.grid(row=0, column=1, padx=10, pady=10)
37+
38+
# Row 2: Sessions list + Rules
39+
btn_sessions = tk.Button(
40+
button_frame, text="View Sessions",
41+
command=lambda: [
42+
self.controller.show_frame("SessionsWindow"),
43+
self.logic.app_tracker.start_filter_reset(refresh=True)
44+
],
45+
width=20, height=2
46+
)
47+
btn_sessions.grid(row=1, column=0, padx=10, pady=10)
48+
49+
btn_rules = tk.Button(
50+
button_frame, text="Custom Rules",
51+
command=lambda: self.controller.show_frame("TrackerSettingsWindow"),
52+
width=20, height=2
53+
)
54+
btn_rules.grid(row=1, column=1, padx=10, pady=10)
55+
56+
# Exit Button at Bottom
57+
exit_button = tk.Button(
58+
self, text="Exit", command=self.controller.on_close,
59+
width=10, height=1, bg="#d9534f", fg="white"
60+
)
61+
exit_button.pack(side="bottom", pady=15)

src/core/screens/project_sessions_window.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def load_sessions(self):
7272
self.session_listbox.delete(0, tk.END)
7373

7474
# Get selected project from controller
75-
selected_project = self.controller.get_selected_project()
75+
selected_project = self.logic.project_handler.get_selected_project()
7676

7777
if selected_project:
7878
self.title_label.config(text=f'"{selected_project}" sessions')
@@ -138,14 +138,14 @@ def get_session_text(self):
138138

139139
def create_new_session(self):
140140
"""Create a new session for the current project"""
141-
selected_project = self.controller.get_selected_project()
141+
selected_project = self.logic.project_handler.get_selected_project()
142142

143143
if not selected_project:
144144
messagebox.showerror("Error", "No project selected")
145145
return
146146

147147
# Set the project context for the CreateSessionWindow
148-
self.controller.set_selected_project(selected_project)
148+
self.logic.project_handler.set_selected_project(selected_project)
149149

150150
# Navigate to CreateSessionWindow with project pre-selected
151151
self.controller.show_frame("CreateSessionWindow")
@@ -168,7 +168,7 @@ def continue_session(self):
168168
self.logic.file_handler.set_continuing_session(True)
169169

170170
# Load selected session data into the file handler
171-
selected_project = self.controller.get_selected_project()
171+
selected_project = self.logic.project_handler.get_selected_project()
172172
self.logic.file_handler.load_session_data(selected_session_name, selected_project)
173173

174174
# Start/reset tracking threads
@@ -195,7 +195,7 @@ def analyze_session(self):
195195
selected_session_name = session_text.split(": ")[0]
196196

197197
# Load the session data
198-
selected_project = self.controller.get_selected_project()
198+
selected_project = self.logic.project_handler.get_selected_project()
199199
self.logic.file_handler.load_session_data(selected_session_name, selected_project)
200200

201201
# Start session total window
@@ -220,7 +220,7 @@ def delete_session(self):
220220
f"Are you sure you want to delete the session '{selected_session_name}'?\n"
221221
f"This action cannot be undone.")
222222
if confirm:
223-
selected_project = self.controller.get_selected_project()
223+
selected_project = self.logic.project_handler.get_selected_project()
224224
self.logic.file_handler.delete_session(selected_session_name, selected_project)
225225

226226
# Remove from listbox

src/core/screens/projects_window.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def view_sessions(self):
134134
project_name = self.extract_project_name(selected_text)
135135

136136
# Set the selected project in the controller and navigate to sessions
137-
self.controller.set_selected_project(project_name)
137+
self.logic.project_handler.set_selected_project(project_name)
138138
self.controller.show_frame("ProjectSessionsWindow")
139139

140140
def delete_project(self):

0 commit comments

Comments
 (0)