diff --git a/waypoint_manager/scripts/lib/waypointlib.py b/waypoint_manager/scripts/lib/waypointlib.py index e26c893..94ce65e 100644 --- a/waypoint_manager/scripts/lib/waypointlib.py +++ b/waypoint_manager/scripts/lib/waypointlib.py @@ -42,6 +42,10 @@ def set_waypoint_val(self, id, key, val): self.waypoints[self.get_num(id)-1][key] = val return + + + def delete_waypoint_param(self, id, key): + return self.waypoints[self.get_num(id)-1].pop(key) def get_waypoint(self, id=None, num=None): diff --git a/waypoint_manager/scripts/manager_GUI.py b/waypoint_manager/scripts/manager_GUI.py index 0642163..395af33 100755 --- a/waypoint_manager/scripts/manager_GUI.py +++ b/waypoint_manager/scripts/manager_GUI.py @@ -101,7 +101,7 @@ self.moving_waypoint = False # ウェイポイントをDnDで動かしている最中かどうか self.setting_finish_pose = 0 # finish pose のセット中かどうか self.old_click_point = None # 最後にカーソルのあった座標を保持 - self.wp_info_win = None # ウェイポイント情報を表示するウィンドウ + self.wp_info_win: tk.Toplevel = None # ウェイポイント情報を表示するウィンドウ self.point_rad = 10 # 画像上に示すポイントの半径ピクセル self.footprint = [[0.25, 0.4], [0.25, -0.4], [-0.65, -0.4], [-0.65, 0.4]] self.footprint_id = [] @@ -215,7 +215,7 @@ self.save_waypoints(str(self.waypoints_filepath)) self.message("Saved changes!") title = self.master.title() - if title[0] == "*": self.master.title(title.replace("* ", "")) + if title[0] == "*": self.master.title(str(title).replace("* ", "")) return @@ -239,7 +239,7 @@ self.master.title(current_title.replace(old_filename, self.waypoints_filepath.name)) self.message("Save As" + "\"" + str(new_filepath) + "\"") title = self.master.title() - if title[0] == "*": self.master.title(title.replace("* ", "")) + if title[0] == "*": self.master.title(str(title).replace("* ", "")) return @@ -473,15 +473,14 @@ self.waypoints.set_waypoint_val(self.editing_waypoint_id, "x", x) self.waypoints.set_waypoint_val(self.editing_waypoint_id, "y", y) # 表示中のウェイポイント情報を更新 - txt_box = self.wp_info_win.grid_slaves(column=1, row=0)[0] + txt_box: tk.Entry = self.wp_info_win.grid_slaves(column=1, row=0)[0] txt_box.delete(0, tk.END) txt_box.insert(tk.END, x) txt_box = self.wp_info_win.grid_slaves(column=1, row=1)[0] txt_box.delete(0, tk.END) txt_box.insert(tk.END, y) self.old_click_point = [event.x, event.y] - title = self.master.title() - if title[0] != "*": self.master.title("* "+title) + self.update_title() return @@ -522,10 +521,13 @@ txt_box = tk.Entry(self.wp_info_win, width=20, font=("Consolas", 15)) txt_box.insert(tk.END, str(point[key]).lower()) txt_box.grid(column=1, row=i, padx=2, pady=2, ipady=3, sticky=tk.EW) + del_btn = tk.Button(self.wp_info_win, text="-", width=2, bg="red", fg="white", font=("",13,"bold")) + del_btn["command"] = lambda name=key, val=str(point[key]).lower(): self.del_param_btn_callback(name, val) + del_btn.grid(column=2, row=i, padx=5, pady=5) # New parameter new_param_btn = tk.Button(self.wp_info_win, text="New Parameter", bg="#AFA") new_param_btn["command"] = self.new_param_btn_callback - new_param_btn.grid(column=0, columnspan=2, row=self.wp_info_win.grid_size()[1]) + new_param_btn.grid(column=0, columnspan=2, row=self.wp_info_win.grid_size()[1], pady=10) # Apply, DnD(Drag & Drop), remove ボタン canv = tk.Canvas(self.wp_info_win) canv.grid(column=0, columnspan=2, row=self.wp_info_win.grid_size()[1], sticky=tk.EW, pady=5) @@ -561,8 +563,7 @@ self.waypoints.set_waypoint_val(self.editing_waypoint_id, key, txt_box.get()) self.plot_waypoints(id=self.editing_waypoint_id) self.message("Apply changes of waypoint parameters") - title = self.master.title() - if title[0] != "*": self.master.title("* "+title) + self.update_title() return @@ -594,8 +595,7 @@ self.canvas.delete(self.editing_waypoint_id) # ウェイポイントを示す円を削除 self.close_wp_info() self.message("Removed waypoint") - title = self.master.title() - if title[0] != "*": self.master.title("* "+title) + self.update_title() return @@ -619,9 +619,20 @@ value_entry = tk.Entry(sub_win, font=font, width=15) value_entry.grid(column=2, row=1, padx=10, pady=5) # Buttons - add_btn = tk.Button(sub_win, text="Add", width=5, height=1, font=font, anchor=tk.CENTER) + def add_param(): + name = name_entry.get() + value = value_entry.get() + self.waypoints.set_waypoint_val(self.editing_waypoint_id, key=name, val=value) + sub_win.destroy() + self.wp_info_win.destroy() + self.disp_waypoint_info(self.editing_waypoint_id) + self.update_title() + return + add_btn = tk.Button(sub_win, text="Add", width=5, height=1, font=font, anchor=tk.CENTER, bg="#AFA") + add_btn["command"] = add_param add_btn.grid(column=2, row=2, pady=20) cancel_btn = tk.Button(sub_win, text="Cancel", width=7, height=1, font=font, anchor=tk.CENTER) + cancel_btn["command"] = sub_win.destroy cancel_btn.grid(column=0, row=2, pady=20) # Window position sub_win.update() @@ -631,6 +642,18 @@ y = int((self.canv_h - h) / 2) sub_win.geometry("{}x{}+{}+{}".format(w, h, x, y)) return + + + def del_param_btn_callback(self, name, val): + msg = "Are you sure you want to delete this parameter?\n\n" + msg += str(name) + ": " + str(val) + yn = messagebox.askyesno("Delete parameter", message=msg) + if (yn == True): + self.waypoints.delete_waypoint_param(self.editing_waypoint_id, name) + self.wp_info_win.destroy() + self.disp_waypoint_info(self.editing_waypoint_id) + self.update_title() + return """ @@ -718,8 +741,7 @@ self.editing_waypoint_id = id self.canvas.itemconfig(id, fill='red') self.disp_waypoint_info(id) - title = self.master.title() - if title[0] != "*": self.master.title("* "+title) + self.update_title() return @@ -812,8 +834,7 @@ self.finish_pose.yaw = theta self.setting_finish_pose = 0 self.message("New finish pose is set.") - title = self.master.title() - if title[0] != "*": self.master.title("* "+title) + self.update_title() return @@ -957,6 +978,13 @@ img_x, img_y = self.mymap.real2image(x,y) cx, cy = self.mymap.transform(img_x, img_y) return cx, cy + + + def update_title(self): + title = self.master.title() + if title[0] != "*": + self.master.title("* "+title) +