Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a925b0b768 | ||
|
|
64a2fed251 | ||
|
|
26f7e491b3 | ||
|
|
dd5e6d7803 | ||
|
|
ea2b9d67cd | ||
|
|
cf9468e0c5 | ||
|
|
43074d386c | ||
|
|
8186513bf1 | ||
|
|
499651f51b | ||
|
|
0d66a5c424
|
||
|
|
37bbfba299
|
||
|
|
34c5323df3
|
||
|
|
30d63fa193
|
||
|
|
be3fdb0988
|
||
|
|
ba9472d0b1
|
||
|
|
1791b4b05c | ||
|
|
f8d1ba3d4e
|
@@ -21,14 +21,6 @@ test.py
|
||||
test/
|
||||
note.md
|
||||
MCE/config.json
|
||||
resources/
|
||||
locales/
|
||||
*.pak
|
||||
*.dll
|
||||
*.dat
|
||||
v8_context_snapshot.bin
|
||||
snapshot_blob.bin
|
||||
vk_swiftshader_icd.json
|
||||
|
||||
# Created by .ignore support plugin (hsz.mobi)
|
||||
|
||||
|
||||
@@ -1,102 +0,0 @@
|
||||
import customtkinter
|
||||
import json
|
||||
from MCE.custom_widgets.ctk_scrollable_dropdown import CTkScrollableDropdown
|
||||
import os
|
||||
from tkinter import END
|
||||
|
||||
class InputHelper(customtkinter.CTk):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.create_tabview()
|
||||
self.create_invite_student_widgets()
|
||||
self.create_lessons_widgets()
|
||||
|
||||
|
||||
def create_tabview(self):
|
||||
self.tabview = customtkinter.CTkTabview(master=self)
|
||||
self.tabview.grid(row=0, column=0)
|
||||
|
||||
self.cafe_tab = self.tabview.add("Cafe") # add tab at the end
|
||||
self.lessons_tab = self.tabview.add("Lessons") # add tab at the end
|
||||
self.tabview.set("Cafe") # set currently visible
|
||||
|
||||
def create_invite_student_widgets(self):
|
||||
self.invitation_label = customtkinter.CTkLabel(master=self.cafe_tab, text="Copy and paste this in AAS Invitation Settings:")
|
||||
self.invitation_label.grid(row=0, column=0, padx=60)
|
||||
|
||||
self.invitation_entry = customtkinter.CTkEntry(master=self.cafe_tab, width=500)
|
||||
self.invitation_entry.grid(row=1, column=0)
|
||||
|
||||
self.invite_copy_button = customtkinter.CTkButton(master=self.cafe_tab, text="Copy", width=40, command=lambda : self.copy_entry(self.invitation_entry, self.invite_copy_button))
|
||||
self.invite_copy_button.grid(row=1, column=3, padx=5)
|
||||
|
||||
self.invite_clear_button = customtkinter.CTkButton(master=self.cafe_tab, text="Clear", width=40, fg_color="crimson", command=lambda : self.invitation_entry.delete(0, END))
|
||||
self.invite_clear_button.grid(row=1, column=4, padx=5)
|
||||
|
||||
self.invite_frame = customtkinter.CTkFrame(master=self.cafe_tab, fg_color="transparent")
|
||||
self.invite_frame.grid(row=2, column=0, padx=20, pady=20)
|
||||
|
||||
self.server_dropdown = customtkinter.CTkOptionMenu(master=self.invite_frame, values=self.find_json_files("MCE/student_list"), command=self.switch_server, width=40)
|
||||
self.server_dropdown.grid(row=0, column=0)
|
||||
|
||||
self.student_entry = customtkinter.CTkComboBox(master=self.invite_frame, width=300)
|
||||
self.student_entry.grid(row=0, column=1, padx=(50,0))
|
||||
|
||||
self.student_dropdown = CTkScrollableDropdown(self.student_entry, width=300, height=550, autocomplete=True, command=lambda choice: self.insert(choice, self.invitation_entry), values=[""])
|
||||
self.server_dropdown.set("EN")
|
||||
self.switch_server("EN")
|
||||
|
||||
def create_lessons_widgets(self):
|
||||
self.lessons_label = customtkinter.CTkLabel(master=self.lessons_tab, text="Copy and paste this in AAS Lessons Settings:")
|
||||
self.lessons_label.grid(row=0, column=0, padx=60)
|
||||
|
||||
self.lessons_entry = customtkinter.CTkEntry(master=self.lessons_tab, width=500)
|
||||
self.lessons_entry.grid(row=1, column=0)
|
||||
|
||||
self.lessons_copy_button = customtkinter.CTkButton(master=self.lessons_tab, text="Copy", width=40, command=lambda : self.copy_entry(self.lessons_entry, self.lessons_copy_button))
|
||||
self.lessons_copy_button.grid(row=1, column=1, padx=5)
|
||||
|
||||
self.lessons_clear_button = customtkinter.CTkButton(master=self.lessons_tab, text="Clear", width=40, fg_color="crimson", command=lambda : self.lessons_entry.delete(0, END))
|
||||
self.lessons_clear_button.grid(row=1, column=2, padx=5)
|
||||
|
||||
self.lessons_buttons_frame = customtkinter.CTkFrame(master=self.lessons_tab, fg_color="transparent")
|
||||
self.lessons_buttons_frame.grid(row=2, column=0, padx=20, pady=20)
|
||||
|
||||
for i in range(9):
|
||||
self.lesson_button = customtkinter.CTkButton(master=self.lessons_buttons_frame, text=str(i+1), command=lambda choice=str(i+1): self.insert(choice, self.lessons_entry), width=40)
|
||||
self.lesson_button.grid(row=0, column=i, padx=5)
|
||||
|
||||
|
||||
def find_json_files(self,folder_path):
|
||||
json_files = []
|
||||
for root, dirs, files in os.walk(folder_path):
|
||||
for file in files:
|
||||
if file.endswith(".json"):
|
||||
json_files.append(os.path.splitext(file)[0])
|
||||
return json_files
|
||||
|
||||
def switch_server(self, server):
|
||||
with open(f"MCE/student_list/{server}.json", "r") as f:
|
||||
student_list = json.load(f)
|
||||
self.student_dropdown.configure(values=student_list)
|
||||
|
||||
def insert(self, value, entry):
|
||||
entry.insert(index=END, string=value + " > ")
|
||||
|
||||
def copy_entry(self, entry, button):
|
||||
text_to_copy = entry.get()
|
||||
|
||||
# Check if there is text to copy
|
||||
if text_to_copy:
|
||||
# Clear the clipboard and set the new text
|
||||
self.clipboard_clear()
|
||||
self.clipboard_append(text_to_copy)
|
||||
self.update() # This is necessary on some systems to update the clipboard
|
||||
button_color = button.cget("fg_color")
|
||||
button.configure(fg_color="green")
|
||||
self.after(2000, lambda : button.configure(fg_color=['#3B8ED0', '#1F6AA5']))
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = InputHelper()
|
||||
app.title("Input Helper")
|
||||
app.mainloop()
|
||||
@@ -8,7 +8,6 @@ from MCE.custom_widgets.ctk_timeentry import CTkTimeEntry
|
||||
from MCE.custom_widgets.ctk_integerspinbox import CTkIntegerSpinbox
|
||||
from MCE.custom_widgets.ctk_templatedialog import CTkTemplateDialog
|
||||
from MCE.custom_widgets.ctk_notification import CTkNotification
|
||||
from MCE.custom_widgets.ctk_add_button import CTkAddButton
|
||||
from MCE.utils import Linker, Config
|
||||
from filelock import FileLock, Timeout
|
||||
import threading
|
||||
@@ -118,7 +117,7 @@ class MCE_Manager(customtkinter.CTk):
|
||||
|
||||
# Helper method to create Mission Tabview with Template and Queue Tabs
|
||||
def create_mission_tabview(self):
|
||||
self.mission_tabview = customtkinter.CTkTabview(self)
|
||||
self.mission_tabview = customtkinter.CTkTabview(self, height=500)
|
||||
self.mission_tabview.grid(row=17, column=0, columnspan=3, padx=20)
|
||||
|
||||
self.tab_template = self.mission_tabview.add('Template')
|
||||
@@ -135,11 +134,11 @@ class MCE_Manager(customtkinter.CTk):
|
||||
self.template_labels.grid(row=0, column=0, sticky="ew")
|
||||
|
||||
self.mode_label = customtkinter.CTkLabel(self.template_labels, text="Mode:", font=customtkinter.CTkFont(underline=True))
|
||||
self.mode_tooltip = CTkToolTip(self.mode_label, message="N : Mission Normal\nH : Mission Hard\nE : Event Quest\nXP : Commissions EXP\nCR : Commissions Credits\n", justify=tk.LEFT)
|
||||
self.mode_tooltip = CTkToolTip(self.mode_label, message="N:Mission Normal\nH:Mission Hard\nE:Event Quest\nBD:Commissions EXP\nIR:Commissions Credits\n")
|
||||
self.mode_label.grid(row=1, column=0, padx=(130, 0), pady=5)
|
||||
|
||||
self.stage_label = customtkinter.CTkLabel(self.template_labels, text="Stage:", font=customtkinter.CTkFont(underline=True))
|
||||
self.stage_tooltip = CTkToolTip(self.stage_label, message="Valid format\nMission: 1-1, 3-A\nCommissions & Event: 01", justify=tk.LEFT)
|
||||
self.stage_tooltip = CTkToolTip(self.stage_label, message="Valid format for Mission: 1-1\nValid format for Commissions/Event: 01")
|
||||
self.stage_label.grid(row=1, column=1, padx=(40, 20), pady=5)
|
||||
|
||||
self.run_times_label = customtkinter.CTkLabel(self.template_labels, text="Number of Sweeps:", font=customtkinter.CTkFont(underline=True))
|
||||
@@ -152,8 +151,7 @@ class MCE_Manager(customtkinter.CTk):
|
||||
self.highlight_label = customtkinter.CTkLabel(self.template_buttons_frame, text="*You can double click an entry and press up or down arrow to change its position", font=customtkinter.CTkFont(family="Inter", size=12))
|
||||
self.highlight_label.grid(row=0, column=0, columnspan=3)
|
||||
|
||||
self.add_button = CTkAddButton(master=self.template_buttons_frame)
|
||||
self.add_button.button.configure(command=lambda queue=queue, button=self.add_button.button: self.add_frame(queue=queue, button=button))
|
||||
self.add_button = customtkinter.CTkButton(self.template_buttons_frame , text="Add", command=lambda queue=queue: self.add_frame(queue=queue))
|
||||
self.add_button.grid(row=1, column=0, padx=5, pady=5)
|
||||
|
||||
# Clear button to clear all frames
|
||||
@@ -168,10 +166,10 @@ class MCE_Manager(customtkinter.CTk):
|
||||
|
||||
# Helper method to create Template Frame and Queue Frame
|
||||
def create_template_and_queue_frames(self):
|
||||
self.template_frame = customtkinter.CTkScrollableFrame(self.tab_template, width=435, height=350)
|
||||
self.template_frame = customtkinter.CTkScrollableFrame(self.tab_template, width=400, height=350)
|
||||
self.template_frame.grid(row=1, column=0, sticky="nsew")
|
||||
|
||||
self.queue_frame = customtkinter.CTkScrollableFrame(self.tab_queue, width=435, height=350)
|
||||
self.queue_frame = customtkinter.CTkScrollableFrame(self.tab_queue, width=400, height=350)
|
||||
self.queue_frame.grid(row=1, column=0, sticky="nsew")
|
||||
|
||||
# Helper method to create Lists to Store Frame Widgets
|
||||
@@ -213,7 +211,7 @@ class MCE_Manager(customtkinter.CTk):
|
||||
self.template_optionmenu.set(self.previous_selected)
|
||||
return
|
||||
elif template_name in self.templates_list:
|
||||
CTkMessagebox(title="Error", message="Name is invalid.", icon="MCE\icons\cancel.png")
|
||||
CTkMessagebox(title="Error", message="Name is invalid.", icon="cancel")
|
||||
self.template_optionmenu.set(self.previous_selected)
|
||||
return
|
||||
else:
|
||||
@@ -234,7 +232,7 @@ class MCE_Manager(customtkinter.CTk):
|
||||
|
||||
def delete_template(self):
|
||||
msg = CTkMessagebox(title="Template Deletetion", message=f"Are you sure you want to delete Template {self.previous_selected}?",
|
||||
icon="MCE\icons\question.png", option_1="No", option_2="Yes")
|
||||
icon="question", option_1="No", option_2="Yes")
|
||||
response = msg.get()
|
||||
if response=="Yes":
|
||||
if len(self.templates) != 1:
|
||||
@@ -252,19 +250,18 @@ class MCE_Manager(customtkinter.CTk):
|
||||
self.template_optionmenu.configure(values=self.templates_list)
|
||||
self.template_optionmenu.set(self.preferred_template)
|
||||
else:
|
||||
CTkMessagebox(title="Error", message="At least one template must exist!!!", icon="MCE\icons\cancel.png")
|
||||
CTkMessagebox(title="Error", message="At least one template must exist!!!", icon="cancel")
|
||||
return
|
||||
|
||||
# Function to add a frame with widgets
|
||||
def add_frame(self, inner_list=None, queue=False, state="normal", button=None):
|
||||
position = button.cget("text") if button else "Add Down"
|
||||
def add_frame(self, inner_list=None, queue=False, state="normal"):
|
||||
frames = self.queue_frames if queue else self.template_frames
|
||||
parent_frame = self.queue_frame if queue else self.template_frame
|
||||
row_index = len(frames) + 1 # Calculate the row for the new frame
|
||||
# Create a frame
|
||||
frame = tk.Frame(parent_frame, bg="gray17")
|
||||
frame.grid(row=row_index, column=0, columnspan=4, padx=10, pady=10, sticky="w")
|
||||
frames.append(frame) if position == "Add Down" else frames.insert(0, frame)
|
||||
frames.append(frame)
|
||||
# "Up" button to move the frame up
|
||||
up_button = customtkinter.CTkButton(frame, text="Up", width=5, command=lambda f=frame, queue=queue: self.move_frame_up(f, queue), state=state)
|
||||
up_button.grid(row=0, column=0, padx=5, pady=5, sticky="w")
|
||||
@@ -272,7 +269,7 @@ class MCE_Manager(customtkinter.CTk):
|
||||
down_button = customtkinter.CTkButton(frame, text="Down", width=5, command=lambda f=frame, queue=queue: self.move_frame_down(f, queue), state=state)
|
||||
down_button.grid(row=0, column=1, padx=5, pady=5, sticky="w")
|
||||
# Dropdown menu for mode
|
||||
mode_optionmenu = customtkinter.CTkOptionMenu(frame, width=60, values=["N", "H", "E", "XP", "CR"], state=state)
|
||||
mode_optionmenu = customtkinter.CTkOptionMenu(frame, width=60, values=["N", "H", "E", "BD", "IR"], state=state)
|
||||
mode_optionmenu.set(inner_list[0] if inner_list else "N")
|
||||
mode_optionmenu.grid(row=0, column=2, padx=5, pady=5, sticky="w")
|
||||
# Entry widget for stage
|
||||
@@ -292,8 +289,6 @@ class MCE_Manager(customtkinter.CTk):
|
||||
delete_button.grid(row=0, column=5, padx=5, pady=5, sticky="w")
|
||||
|
||||
frame.bind("<Double-Button-1>", lambda event, f=frame: self.highlight_frame(f))
|
||||
if position == "Add Up":
|
||||
self.update_frame_positions(queue=queue)
|
||||
|
||||
# Function to clear all frames
|
||||
def clear_frames(self, queue=False):
|
||||
@@ -311,7 +306,7 @@ class MCE_Manager(customtkinter.CTk):
|
||||
mode_optionmenu = frame.winfo_children()[2]
|
||||
stage_entry = frame.winfo_children()[3]
|
||||
if not self.check_entry(mode_optionmenu, stage_entry):
|
||||
CTkMessagebox(title="Error", message="Configuration not saved. Some entries are incomplete or have incorect input.", icon="MCE\icons\cancel.png")
|
||||
CTkMessagebox(title="Error", message="Configuration not saved. Some entries are incomplete or have incorect input.", icon="cancel")
|
||||
return
|
||||
mode = frame.winfo_children()[2].get()
|
||||
stage = frame.winfo_children()[3].get().strip()
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
import customtkinter
|
||||
|
||||
class CTkAddButton(customtkinter.CTkFrame):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.button = customtkinter.CTkButton(self, text="Add Down", corner_radius=0, width=120)
|
||||
self.button.grid(row=0, column=0)
|
||||
self.option_menu = customtkinter.CTkOptionMenu(
|
||||
self, values= ["Add Up", "Add Down"], width=10, command=self.set_button, corner_radius=0
|
||||
)
|
||||
self.option_menu.set("")
|
||||
self.option_menu.grid(row=0, column=1)
|
||||
|
||||
def set_button(self, value):
|
||||
self.option_menu.set("")
|
||||
self.button.configure(text=value)
|
||||
|
||||
def configure(self, *args, **kwargs):
|
||||
self.button.configure(*args, **kwargs)
|
||||
@@ -1,337 +0,0 @@
|
||||
'''
|
||||
Advanced Scrollable Dropdown class for customtkinter widgets
|
||||
Author: Akash Bora
|
||||
'''
|
||||
|
||||
import customtkinter
|
||||
import sys
|
||||
import time
|
||||
import difflib
|
||||
|
||||
class CTkScrollableDropdown(customtkinter.CTkToplevel):
|
||||
|
||||
def __init__(self, attach, x=None, y=None, button_color=None, height: int = 200, width: int = None,
|
||||
fg_color=None, button_height: int = 20, justify="center", scrollbar_button_color=None,
|
||||
scrollbar=True, scrollbar_button_hover_color=None, frame_border_width=2, values=[],
|
||||
command=None, image_values=[], alpha: float = 0.97, frame_corner_radius=20, double_click=False,
|
||||
resize=True, frame_border_color=None, text_color=None, autocomplete=False, **button_kwargs):
|
||||
|
||||
super().__init__(takefocus=1)
|
||||
|
||||
self.focus()
|
||||
self.lift()
|
||||
self.alpha = alpha
|
||||
self.attach = attach
|
||||
self.corner = frame_corner_radius
|
||||
self.padding = 0
|
||||
self.focus_something = False
|
||||
self.disable = True
|
||||
self.update()
|
||||
|
||||
if sys.platform.startswith("win"):
|
||||
self.after(100, lambda: self.overrideredirect(True))
|
||||
self.transparent_color = self._apply_appearance_mode(self._fg_color)
|
||||
self.attributes("-transparentcolor", self.transparent_color)
|
||||
elif sys.platform.startswith("darwin"):
|
||||
self.overrideredirect(True)
|
||||
self.transparent_color = 'systemTransparent'
|
||||
self.attributes("-transparent", True)
|
||||
self.focus_something = True
|
||||
else:
|
||||
self.overrideredirect(True)
|
||||
self.transparent_color = '#000001'
|
||||
self.corner = 0
|
||||
self.padding = 18
|
||||
self.withdraw()
|
||||
|
||||
self.hide = True
|
||||
self.attach.bind('<Configure>', lambda e: self._withdraw() if not self.disable else None, add="+")
|
||||
self.attach.winfo_toplevel().bind('<Configure>', lambda e: self._withdraw() if not self.disable else None, add="+")
|
||||
self.attach.winfo_toplevel().bind("<ButtonPress>", lambda e: self._withdraw() if not self.disable else None, add="+")
|
||||
|
||||
|
||||
self.attributes('-alpha', 0)
|
||||
self.disable = False
|
||||
self.fg_color = customtkinter.ThemeManager.theme["CTkFrame"]["fg_color"] if fg_color is None else fg_color
|
||||
self.scroll_button_color = customtkinter.ThemeManager.theme["CTkScrollbar"]["button_color"] if scrollbar_button_color is None else scrollbar_button_color
|
||||
self.scroll_hover_color = customtkinter.ThemeManager.theme["CTkScrollbar"]["button_hover_color"] if scrollbar_button_hover_color is None else scrollbar_button_hover_color
|
||||
self.frame_border_color = customtkinter.ThemeManager.theme["CTkFrame"]["border_color"] if frame_border_color is None else frame_border_color
|
||||
self.button_color = customtkinter.ThemeManager.theme["CTkFrame"]["top_fg_color"] if button_color is None else button_color
|
||||
self.text_color = customtkinter.ThemeManager.theme["CTkLabel"]["text_color"] if text_color is None else text_color
|
||||
|
||||
if scrollbar is False:
|
||||
self.scroll_button_color = self.fg_color
|
||||
self.scroll_hover_color = self.fg_color
|
||||
|
||||
self.frame = customtkinter.CTkScrollableFrame(self, bg_color=self.transparent_color, fg_color=self.fg_color,
|
||||
scrollbar_button_hover_color=self.scroll_hover_color,
|
||||
corner_radius=self.corner, border_width=frame_border_width,
|
||||
scrollbar_button_color=self.scroll_button_color,
|
||||
border_color=self.frame_border_color)
|
||||
self.frame._scrollbar.grid_configure(padx=3)
|
||||
self.frame.pack(expand=True, fill="both")
|
||||
self.dummy_entry = customtkinter.CTkEntry(self.frame, fg_color="transparent", border_width=0, height=1, width=1)
|
||||
self.no_match = customtkinter.CTkLabel(self.frame, text="No Match")
|
||||
self.height = height
|
||||
self.height_new = height
|
||||
self.width = width
|
||||
self.command = command
|
||||
self.fade = False
|
||||
self.resize = resize
|
||||
self.autocomplete = autocomplete
|
||||
self.var_update = customtkinter.StringVar()
|
||||
self.appear = False
|
||||
|
||||
if justify.lower()=="left":
|
||||
self.justify = "w"
|
||||
elif justify.lower()=="right":
|
||||
self.justify = "e"
|
||||
else:
|
||||
self.justify = "c"
|
||||
|
||||
self.button_height = button_height
|
||||
self.values = values
|
||||
self.button_num = len(self.values)
|
||||
self.image_values = None if len(image_values)!=len(self.values) else image_values
|
||||
|
||||
self.resizable(width=False, height=False)
|
||||
self.transient(self.master)
|
||||
self._init_buttons(**button_kwargs)
|
||||
|
||||
# Add binding for different ctk widgets
|
||||
if double_click or self.attach.winfo_name().startswith("!ctkentry") or self.attach.winfo_name().startswith("!ctkcombobox"):
|
||||
self.attach.bind('<Double-Button-1>', lambda e: self._iconify(), add="+")
|
||||
else:
|
||||
self.attach.bind('<Button-1>', lambda e: self._iconify(), add="+")
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkcombobox"):
|
||||
self.attach._canvas.tag_bind("right_parts", "<Button-1>", lambda e: self._iconify())
|
||||
self.attach._canvas.tag_bind("dropdown_arrow", "<Button-1>", lambda e: self._iconify())
|
||||
if self.command is None:
|
||||
self.command = self.attach.set
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkoptionmenu"):
|
||||
self.attach._canvas.bind("<Button-1>", lambda e: self._iconify())
|
||||
self.attach._text_label.bind("<Button-1>", lambda e: self._iconify())
|
||||
if self.command is None:
|
||||
self.command = self.attach.set
|
||||
|
||||
self.attach.bind("<Destroy>", lambda _: self._destroy(), add="+")
|
||||
|
||||
self.update_idletasks()
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
if self.autocomplete:
|
||||
self.bind_autocomplete()
|
||||
|
||||
self.deiconify()
|
||||
self.withdraw()
|
||||
|
||||
self.attributes("-alpha", self.alpha)
|
||||
|
||||
def _destroy(self):
|
||||
self.after(500, self.destroy_popup)
|
||||
|
||||
def _withdraw(self):
|
||||
if self.winfo_viewable() and self.hide:
|
||||
self.withdraw()
|
||||
|
||||
self.event_generate("<<Closed>>")
|
||||
self.hide = True
|
||||
|
||||
def _update(self, a, b, c):
|
||||
self.live_update(self.attach._entry.get())
|
||||
|
||||
def bind_autocomplete(self, ):
|
||||
def appear(x):
|
||||
self.appear = True
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkcombobox"):
|
||||
self.attach._entry.configure(textvariable=self.var_update)
|
||||
self.attach._entry.bind("<Key>", appear)
|
||||
self.attach.set(self.values[0])
|
||||
self.var_update.trace_add('write', self._update)
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkentry"):
|
||||
self.attach.configure(textvariable=self.var_update)
|
||||
self.attach.bind("<Key>", appear)
|
||||
self.var_update.trace_add('write', self._update)
|
||||
|
||||
def fade_out(self):
|
||||
for i in range(100,0,-10):
|
||||
if not self.winfo_exists():
|
||||
break
|
||||
self.attributes("-alpha", i/100)
|
||||
self.update()
|
||||
time.sleep(1/100)
|
||||
|
||||
def fade_in(self):
|
||||
for i in range(0,100,10):
|
||||
if not self.winfo_exists():
|
||||
break
|
||||
self.attributes("-alpha", i/100)
|
||||
self.update()
|
||||
time.sleep(1/100)
|
||||
|
||||
def _init_buttons(self, **button_kwargs):
|
||||
self.i = 0
|
||||
self.widgets = {}
|
||||
for row in self.values:
|
||||
self.widgets[self.i] = customtkinter.CTkButton(self.frame,
|
||||
text=row,
|
||||
height=self.button_height,
|
||||
fg_color=self.button_color,
|
||||
text_color=self.text_color,
|
||||
image=self.image_values[i] if self.image_values is not None else None,
|
||||
anchor=self.justify,
|
||||
command=lambda k=row: self._attach_key_press(k), **button_kwargs)
|
||||
self.widgets[self.i].pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
self.i+=1
|
||||
|
||||
self.hide = False
|
||||
|
||||
def destroy_popup(self):
|
||||
self.destroy()
|
||||
self.disable = True
|
||||
|
||||
def place_dropdown(self):
|
||||
self.x_pos = self.attach.winfo_rootx() if self.x is None else self.x + self.attach.winfo_rootx()
|
||||
self.y_pos = self.attach.winfo_rooty() + self.attach.winfo_reqheight() + 5 if self.y is None else self.y + self.attach.winfo_rooty()
|
||||
self.width_new = self.attach.winfo_width() if self.width is None else self.width
|
||||
|
||||
if self.resize:
|
||||
if self.button_num<=5:
|
||||
self.height_new = self.button_height * self.button_num + 55
|
||||
else:
|
||||
self.height_new = self.button_height * self.button_num + 35
|
||||
if self.height_new>self.height:
|
||||
self.height_new = self.height
|
||||
|
||||
self.geometry('{}x{}+{}+{}'.format(self.width_new, self.height_new,
|
||||
self.x_pos, self.y_pos))
|
||||
self.fade_in()
|
||||
self.attributes('-alpha', self.alpha)
|
||||
self.attach.focus()
|
||||
|
||||
def _iconify(self):
|
||||
if self.disable: return
|
||||
if self.hide:
|
||||
self.event_generate("<<Opened>>")
|
||||
self._deiconify()
|
||||
self.focus()
|
||||
self.hide = False
|
||||
self.place_dropdown()
|
||||
if self.focus_something:
|
||||
self.dummy_entry.pack()
|
||||
self.dummy_entry.focus_set()
|
||||
self.after(100, self.dummy_entry.pack_forget)
|
||||
else:
|
||||
self.withdraw()
|
||||
self.hide = True
|
||||
|
||||
def _attach_key_press(self, k):
|
||||
self.event_generate("<<Selected>>")
|
||||
self.fade = True
|
||||
if self.command:
|
||||
self.command(k)
|
||||
self.fade = False
|
||||
self.fade_out()
|
||||
self.withdraw()
|
||||
self.hide = True
|
||||
|
||||
def live_update(self, string=None):
|
||||
if not self.appear: return
|
||||
if self.disable: return
|
||||
if self.fade: return
|
||||
if string:
|
||||
string = string.lower()
|
||||
self._deiconify()
|
||||
i=1
|
||||
for key in self.widgets.keys():
|
||||
s = self.widgets[key].cget("text").lower()
|
||||
text_similarity = difflib.SequenceMatcher(None, s[0:len(string)], string).ratio()
|
||||
similar = s.startswith(string) or text_similarity > 0.75
|
||||
if not similar:
|
||||
self.widgets[key].pack_forget()
|
||||
else:
|
||||
self.widgets[key].pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
i+=1
|
||||
|
||||
if i==1:
|
||||
self.no_match.pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
else:
|
||||
self.no_match.pack_forget()
|
||||
self.button_num = i
|
||||
self.place_dropdown()
|
||||
|
||||
else:
|
||||
self.no_match.pack_forget()
|
||||
self.button_num = len(self.values)
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].destroy()
|
||||
self._init_buttons()
|
||||
self.place_dropdown()
|
||||
|
||||
self.frame._parent_canvas.yview_moveto(0.0)
|
||||
self.appear = False
|
||||
|
||||
def insert(self, value, **kwargs):
|
||||
self.widgets[self.i] = customtkinter.CTkButton(self.frame,
|
||||
text=value,
|
||||
height=self.button_height,
|
||||
fg_color=self.button_color,
|
||||
text_color=self.text_color,
|
||||
anchor=self.justify,
|
||||
command=lambda k=value: self._attach_key_press(k), **kwargs)
|
||||
self.widgets[self.i].pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
self.i+=1
|
||||
self.values.append(value)
|
||||
|
||||
def _deiconify(self):
|
||||
if len(self.values)>0:
|
||||
self.deiconify()
|
||||
|
||||
def popup(self, x=None, y=None):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.hide = True
|
||||
self._iconify()
|
||||
|
||||
def configure(self, **kwargs):
|
||||
if "height" in kwargs:
|
||||
self.height = kwargs.pop("height")
|
||||
self.height_new = self.height
|
||||
|
||||
if "alpha" in kwargs:
|
||||
self.alpha = kwargs.pop("alpha")
|
||||
|
||||
if "width" in kwargs:
|
||||
self.width = kwargs.pop("width")
|
||||
|
||||
if "fg_color" in kwargs:
|
||||
self.frame.configure(fg_color=kwargs.pop("fg_color"))
|
||||
|
||||
if "values" in kwargs:
|
||||
self.values = kwargs.pop("values")
|
||||
self.image_values = None
|
||||
self.button_num = len(self.values)
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].destroy()
|
||||
self._init_buttons()
|
||||
|
||||
if "image_values" in kwargs:
|
||||
self.image_values = kwargs.pop("image_values")
|
||||
self.image_values = None if len(self.image_values)!=len(self.values) else self.image_values
|
||||
if self.image_values is not None:
|
||||
i=0
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].configure(image=self.image_values[i])
|
||||
i+=1
|
||||
|
||||
if "button_color" in kwargs:
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].configure(fg_color=kwargs.pop("button_color"))
|
||||
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].configure(**kwargs)
|
||||
@@ -1,291 +0,0 @@
|
||||
'''
|
||||
Advanced Scrollable Dropdown Frame class for customtkinter widgets
|
||||
Author: Akash Bora
|
||||
'''
|
||||
|
||||
import customtkinter
|
||||
import sys
|
||||
import difflib
|
||||
|
||||
class CTkScrollableDropdownFrame(customtkinter.CTkFrame):
|
||||
|
||||
def __init__(self, attach, x=None, y=None, button_color=None, height: int = 200, width: int = None,
|
||||
fg_color=None, button_height: int = 20, justify="center", scrollbar_button_color=None,
|
||||
scrollbar=True, scrollbar_button_hover_color=None, frame_border_width=2, values=[],
|
||||
command=None, image_values=[], double_click=False, frame_corner_radius=True, resize=True, frame_border_color=None,
|
||||
text_color=None, autocomplete=False, **button_kwargs):
|
||||
|
||||
super().__init__(master=attach.winfo_toplevel(), bg_color=attach.cget("bg_color"))
|
||||
|
||||
self.attach = attach
|
||||
self.corner = 11 if frame_corner_radius else 0
|
||||
self.padding = 0
|
||||
self.disable = True
|
||||
|
||||
self.hide = True
|
||||
self.attach.bind('<Configure>', lambda e: self._withdraw() if not self.disable else None, add="+")
|
||||
self.attach.winfo_toplevel().bind("<ButtonPress>", lambda e: self._withdraw() if not self.disable else None, add="+")
|
||||
|
||||
self.disable = False
|
||||
self.fg_color = customtkinter.ThemeManager.theme["CTkFrame"]["fg_color"] if fg_color is None else fg_color
|
||||
self.scroll_button_color = customtkinter.ThemeManager.theme["CTkScrollbar"]["button_color"] if scrollbar_button_color is None else scrollbar_button_color
|
||||
self.scroll_hover_color = customtkinter.ThemeManager.theme["CTkScrollbar"]["button_hover_color"] if scrollbar_button_hover_color is None else scrollbar_button_hover_color
|
||||
self.frame_border_color = customtkinter.ThemeManager.theme["CTkFrame"]["border_color"] if frame_border_color is None else frame_border_color
|
||||
self.button_color = customtkinter.ThemeManager.theme["CTkFrame"]["top_fg_color"] if button_color is None else button_color
|
||||
self.text_color = customtkinter.ThemeManager.theme["CTkLabel"]["text_color"] if text_color is None else text_color
|
||||
|
||||
if scrollbar is False:
|
||||
self.scroll_button_color = self.fg_color
|
||||
self.scroll_hover_color = self.fg_color
|
||||
|
||||
self.frame = customtkinter.CTkScrollableFrame(self, fg_color=self.fg_color, bg_color=attach.cget("bg_color"),
|
||||
scrollbar_button_hover_color=self.scroll_hover_color,
|
||||
corner_radius=self.corner, border_width=frame_border_width,
|
||||
scrollbar_button_color=self.scroll_button_color,
|
||||
border_color=self.frame_border_color)
|
||||
self.frame._scrollbar.grid_configure(padx=3)
|
||||
self.frame.pack(expand=True, fill="both")
|
||||
|
||||
if self.corner==0:
|
||||
self.corner = 21
|
||||
|
||||
self.dummy_entry = customtkinter.CTkEntry(self.frame, fg_color="transparent", border_width=0, height=1, width=1)
|
||||
self.no_match = customtkinter.CTkLabel(self.frame, text="No Match")
|
||||
self.height = height
|
||||
self.height_new = height
|
||||
self.width = width
|
||||
self.command = command
|
||||
self.fade = False
|
||||
self.resize = resize
|
||||
self.autocomplete = autocomplete
|
||||
self.var_update = customtkinter.StringVar()
|
||||
self.appear = False
|
||||
|
||||
if justify.lower()=="left":
|
||||
self.justify = "w"
|
||||
elif justify.lower()=="right":
|
||||
self.justify = "e"
|
||||
else:
|
||||
self.justify = "c"
|
||||
|
||||
self.button_height = button_height
|
||||
self.values = values
|
||||
self.button_num = len(self.values)
|
||||
self.image_values = None if len(image_values)!=len(self.values) else image_values
|
||||
|
||||
self._init_buttons(**button_kwargs)
|
||||
|
||||
# Add binding for different ctk widgets
|
||||
if double_click or self.attach.winfo_name().startswith("!ctkentry") or self.attach.winfo_name().startswith("!ctkcombobox"):
|
||||
self.attach.bind('<Double-Button-1>', lambda e: self._iconify(), add="+")
|
||||
self.attach._entry.bind('<FocusOut>', lambda e: self._withdraw() if not self.disable else None, add="+")
|
||||
else:
|
||||
self.attach.bind('<Button-1>', lambda e: self._iconify(), add="+")
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkcombobox"):
|
||||
self.attach._canvas.tag_bind("right_parts", "<Button-1>", lambda e: self._iconify())
|
||||
self.attach._canvas.tag_bind("dropdown_arrow", "<Button-1>", lambda e: self._iconify())
|
||||
|
||||
if self.command is None:
|
||||
self.command = self.attach.set
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkoptionmenu"):
|
||||
self.attach._canvas.bind("<Button-1>", lambda e: self._iconify())
|
||||
self.attach._text_label.bind("<Button-1>", lambda e: self._iconify())
|
||||
if self.command is None:
|
||||
self.command = self.attach.set
|
||||
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
self.attach.bind("<Destroy>", lambda _: self._destroy(), add="+")
|
||||
|
||||
if self.autocomplete:
|
||||
self.bind_autocomplete()
|
||||
|
||||
def _destroy(self):
|
||||
self.after(500, self.destroy_popup)
|
||||
|
||||
def _withdraw(self):
|
||||
if self.winfo_viewable() and self.hide:
|
||||
self.place_forget()
|
||||
|
||||
self.event_generate("<<Closed>>")
|
||||
self.hide = True
|
||||
|
||||
def _update(self, a, b, c):
|
||||
self.live_update(self.attach._entry.get())
|
||||
|
||||
def bind_autocomplete(self, ):
|
||||
def appear(x):
|
||||
self.appear = True
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkcombobox"):
|
||||
self.attach._entry.configure(textvariable=self.var_update)
|
||||
self.attach.set(self.values[0])
|
||||
self.attach._entry.bind("<Key>", appear)
|
||||
self.var_update.trace_add('write', self._update)
|
||||
|
||||
if self.attach.winfo_name().startswith("!ctkentry"):
|
||||
self.attach.configure(textvariable=self.var_update)
|
||||
self.attach.bind("<Key>", appear)
|
||||
self.var_update.trace_add('write', self._update)
|
||||
|
||||
def _init_buttons(self, **button_kwargs):
|
||||
self.i = 0
|
||||
self.widgets = {}
|
||||
for row in self.values:
|
||||
self.widgets[self.i] = customtkinter.CTkButton(self.frame,
|
||||
text=row,
|
||||
height=self.button_height,
|
||||
fg_color=self.button_color,
|
||||
text_color=self.text_color,
|
||||
image=self.image_values[i] if self.image_values is not None else None,
|
||||
anchor=self.justify,
|
||||
command=lambda k=row: self._attach_key_press(k), **button_kwargs)
|
||||
self.widgets[self.i].pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
self.i+=1
|
||||
|
||||
self.hide = False
|
||||
|
||||
def destroy_popup(self):
|
||||
self.destroy()
|
||||
self.disable = True
|
||||
|
||||
def place_dropdown(self):
|
||||
self.x_pos = self.attach.winfo_x() if self.x is None else self.x + self.attach.winfo_rootx()
|
||||
self.y_pos = self.attach.winfo_y() + self.attach.winfo_reqheight() + 5 if self.y is None else self.y + self.attach.winfo_rooty()
|
||||
self.width_new = self.attach.winfo_width()-45+self.corner if self.width is None else self.width
|
||||
|
||||
if self.resize:
|
||||
if self.button_num<=5:
|
||||
self.height_new = self.button_height * self.button_num + 55
|
||||
else:
|
||||
self.height_new = self.button_height * self.button_num + 35
|
||||
if self.height_new>self.height:
|
||||
self.height_new = self.height
|
||||
|
||||
self.frame.configure(width=self.width_new, height=self.height_new)
|
||||
self.place(x=self.x_pos, y=self.y_pos)
|
||||
|
||||
if sys.platform.startswith("darwin"):
|
||||
self.dummy_entry.pack()
|
||||
self.after(100, self.dummy_entry.pack_forget())
|
||||
|
||||
self.lift()
|
||||
self.attach.focus()
|
||||
|
||||
def _iconify(self):
|
||||
if self.disable: return
|
||||
if self.hide:
|
||||
self.event_generate("<<Opened>>")
|
||||
self.hide = False
|
||||
self.place_dropdown()
|
||||
else:
|
||||
self.place_forget()
|
||||
self.hide = True
|
||||
|
||||
def _attach_key_press(self, k):
|
||||
self.event_generate("<<Selected>>")
|
||||
self.fade = True
|
||||
if self.command:
|
||||
self.command(k)
|
||||
self.fade = False
|
||||
self.place_forget()
|
||||
self.hide = True
|
||||
|
||||
def live_update(self, string=None):
|
||||
if not self.appear: return
|
||||
if self.disable: return
|
||||
if self.fade: return
|
||||
if string:
|
||||
string = string.lower()
|
||||
self._deiconify()
|
||||
i=1
|
||||
for key in self.widgets.keys():
|
||||
s = self.widgets[key].cget("text").lower()
|
||||
text_similarity = difflib.SequenceMatcher(None, s[0:len(string)], string).ratio()
|
||||
similar = s.startswith(string) or text_similarity > 0.75
|
||||
if not similar:
|
||||
self.widgets[key].pack_forget()
|
||||
else:
|
||||
self.widgets[key].pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
i+=1
|
||||
|
||||
if i==1:
|
||||
self.no_match.pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
else:
|
||||
self.no_match.pack_forget()
|
||||
self.button_num = i
|
||||
self.place_dropdown()
|
||||
|
||||
else:
|
||||
self.no_match.pack_forget()
|
||||
self.button_num = len(self.values)
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].destroy()
|
||||
self._init_buttons()
|
||||
self.place_dropdown()
|
||||
|
||||
self.frame._parent_canvas.yview_moveto(0.0)
|
||||
self.appear = False
|
||||
|
||||
def insert(self, value, **kwargs):
|
||||
self.widgets[self.i] = customtkinter.CTkButton(self.frame,
|
||||
text=value,
|
||||
height=self.button_height,
|
||||
fg_color=self.button_color,
|
||||
text_color=self.text_color,
|
||||
anchor=self.justify,
|
||||
command=lambda k=value: self._attach_key_press(k), **kwargs)
|
||||
self.widgets[self.i].pack(fill="x", pady=2, padx=(self.padding, 0))
|
||||
self.i+=1
|
||||
self.values.append(value)
|
||||
|
||||
def _deiconify(self):
|
||||
if len(self.values)>0:
|
||||
self.pack_forget()
|
||||
|
||||
def popup(self, x=None, y=None):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.hide = True
|
||||
self._iconify()
|
||||
|
||||
def configure(self, **kwargs):
|
||||
if "height" in kwargs:
|
||||
self.height = kwargs.pop("height")
|
||||
self.height_new = self.height
|
||||
|
||||
if "alpha" in kwargs:
|
||||
self.alpha = kwargs.pop("alpha")
|
||||
|
||||
if "width" in kwargs:
|
||||
self.width = kwargs.pop("width")
|
||||
|
||||
if "fg_color" in kwargs:
|
||||
self.frame.configure(fg_color=kwargs.pop("fg_color"))
|
||||
|
||||
if "values" in kwargs:
|
||||
self.values = kwargs.pop("values")
|
||||
self.image_values = None
|
||||
self.button_num = len(self.values)
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].destroy()
|
||||
self._init_buttons()
|
||||
|
||||
if "image_values" in kwargs:
|
||||
self.image_values = kwargs.pop("image_values")
|
||||
self.image_values = None if len(self.image_values)!=len(self.values) else self.image_values
|
||||
if self.image_values is not None:
|
||||
i=0
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].configure(image=self.image_values[i])
|
||||
i+=1
|
||||
|
||||
if "button_color" in kwargs:
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].configure(fg_color=kwargs.pop("button_color"))
|
||||
|
||||
for key in self.widgets.keys():
|
||||
self.widgets[key].configure(**kwargs)
|
||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
@@ -1,158 +0,0 @@
|
||||
[
|
||||
"Airi",
|
||||
"Akane",
|
||||
"Akane (Bunny Girl)",
|
||||
"Akari",
|
||||
"Ako",
|
||||
"Arisu",
|
||||
"Arisu (Maid)",
|
||||
"Aru",
|
||||
"Aru (New Year)",
|
||||
"Asuna",
|
||||
"Asuna (Bunny Girl)",
|
||||
"Atsuko",
|
||||
"Ayane",
|
||||
"Ayane (Swimsuit)",
|
||||
"Azusa",
|
||||
"Azusa (Swimsuit)",
|
||||
"Cherino",
|
||||
"Cherino (Hot Spring)",
|
||||
"Chihiro",
|
||||
"Chinatsu",
|
||||
"Chinatsu (Hot Spring)",
|
||||
"Chise",
|
||||
"Chise (Swimsuit)",
|
||||
"Eimi",
|
||||
"Fubuki",
|
||||
"Fuuka",
|
||||
"Fuuka (New Year)",
|
||||
"Hanae",
|
||||
"Hanae (Christmas)",
|
||||
"Hanako",
|
||||
"Hanako (Swimsuit)",
|
||||
"Hare",
|
||||
"Haruka",
|
||||
"Haruka (New Year)",
|
||||
"Haruna",
|
||||
"Haruna (New Year)",
|
||||
"Haruna (Sportswear)",
|
||||
"Hasumi",
|
||||
"Hasumi (Sportswear)",
|
||||
"Hatsune Miku",
|
||||
"Hibiki",
|
||||
"Hibiki (Cheerleader)",
|
||||
"Hifumi",
|
||||
"Hifumi (Swimsuit)",
|
||||
"Himari",
|
||||
"Hina",
|
||||
"Hina (Swimsuit)",
|
||||
"Hinata",
|
||||
"Hinata (Swimsuit)",
|
||||
"Hiyori",
|
||||
"Hoshino",
|
||||
"Hoshino (Swimsuit)",
|
||||
"Iori",
|
||||
"Iori (Swimsuit)",
|
||||
"Iroha",
|
||||
"Izumi",
|
||||
"Izumi (Swimsuit)",
|
||||
"Izuna",
|
||||
"Izuna (Swimsuit)",
|
||||
"Junko",
|
||||
"Junko (New Year)",
|
||||
"Juri",
|
||||
"Kaede",
|
||||
"Kaho",
|
||||
"Kanna",
|
||||
"Karin",
|
||||
"Karin (Bunny Girl)",
|
||||
"Kayoko",
|
||||
"Kayoko (New Year)",
|
||||
"Kazusa",
|
||||
"Kirino",
|
||||
"Koharu",
|
||||
"Koharu (Swimsuit)",
|
||||
"Kokona",
|
||||
"Kotama",
|
||||
"Kotori",
|
||||
"Kotori (Cheerleader)",
|
||||
"Koyuki",
|
||||
"Maki",
|
||||
"Mari",
|
||||
"Mari (Sportswear)",
|
||||
"Marina",
|
||||
"Mashiro",
|
||||
"Mashiro (Swimsuit)",
|
||||
"Megu",
|
||||
"Meru",
|
||||
"Michiru",
|
||||
"Midori",
|
||||
"Mika",
|
||||
"Mimori",
|
||||
"Mimori (Swimsuit)",
|
||||
"Mina",
|
||||
"Mine",
|
||||
"Minori",
|
||||
"Misaki",
|
||||
"Miyako",
|
||||
"Miyako (Swimsuit)",
|
||||
"Miyu",
|
||||
"Miyu (Swimsuit)",
|
||||
"Moe",
|
||||
"Momiji",
|
||||
"Momoi",
|
||||
"Mutsuki",
|
||||
"Mutsuki (New Year)",
|
||||
"Nagisa",
|
||||
"Natsu",
|
||||
"Neru",
|
||||
"Neru (Bunny Girl)",
|
||||
"Noa",
|
||||
"Nodoka",
|
||||
"Nodoka (Hot Spring)",
|
||||
"Nonomi",
|
||||
"Nonomi (Swimsuit)",
|
||||
"Pina",
|
||||
"Reisa",
|
||||
"Rumi",
|
||||
"Saki",
|
||||
"Saki (Swimsuit)",
|
||||
"Sakurako",
|
||||
"Saori",
|
||||
"Saya",
|
||||
"Saya (Casual)",
|
||||
"Sena",
|
||||
"Serika",
|
||||
"Serika (New Year)",
|
||||
"Serina",
|
||||
"Serina (Christmas)",
|
||||
"Shigure",
|
||||
"Shimiko",
|
||||
"Shiroko",
|
||||
"Shiroko (Riding)",
|
||||
"Shiroko (Swimsuit)",
|
||||
"Shizuko",
|
||||
"Shizuko (Swimsuit)",
|
||||
"Shun",
|
||||
"Shun (Kid)",
|
||||
"Sumire",
|
||||
"Suzumi",
|
||||
"Toki",
|
||||
"Toki (Bunny Girl)",
|
||||
"Tomoe",
|
||||
"Tsubaki",
|
||||
"Tsukuyo",
|
||||
"Tsurugi",
|
||||
"Tsurugi (Swimsuit)",
|
||||
"Ui",
|
||||
"Ui (Swimsuit)",
|
||||
"Utaha",
|
||||
"Utaha (Cheerleader)",
|
||||
"Wakamo",
|
||||
"Wakamo (Swimsuit)",
|
||||
"Yoshimi",
|
||||
"Yuuka",
|
||||
"Yuuka (Sportswear)",
|
||||
"Yuzu",
|
||||
"Yuzu (Maid)"
|
||||
]
|
||||
@@ -1,168 +0,0 @@
|
||||
[
|
||||
"\u30a2\u30a4\u30ea",
|
||||
"\u30a2\u30ab\u30cd",
|
||||
"\u30a2\u30ab\u30cd\n\uff08\u30d0\u30cb\u30fc\u30ac\u30fc\u30eb\uff09",
|
||||
"\u30a2\u30ab\u30ea",
|
||||
"\u30a2\u30b3",
|
||||
"\u30a2\u30b9\u30ca",
|
||||
"\u30a2\u30b9\u30ca\n\uff08\u30d0\u30cb\u30fc\u30ac\u30fc\u30eb\uff09",
|
||||
"\u30a2\u30ba\u30b5",
|
||||
"\u30a2\u30ba\u30b5\uff08\u6c34\u7740\uff09",
|
||||
"\u30a2\u30c4\u30b3",
|
||||
"\u30a2\u30e4\u30cd",
|
||||
"\u30a2\u30e4\u30cd\uff08\u6c34\u7740\uff09",
|
||||
"\u30a2\u30ea\u30b9",
|
||||
"\u30a2\u30ea\u30b9\uff08\u30e1\u30a4\u30c9\uff09",
|
||||
"\u30a2\u30eb",
|
||||
"\u30a2\u30eb\uff08\u6b63\u6708\uff09",
|
||||
"\u30a4\u30aa\u30ea",
|
||||
"\u30a4\u30aa\u30ea\uff08\u6c34\u7740\uff09",
|
||||
"\u30a4\u30ba\u30ca",
|
||||
"\u30a4\u30ba\u30ca\uff08\u6c34\u7740\uff09",
|
||||
"\u30a4\u30ba\u30df",
|
||||
"\u30a4\u30ba\u30df\uff08\u6c34\u7740\uff09",
|
||||
"\u30a4\u30c1\u30ab",
|
||||
"\u30a4\u30ed\u30cf",
|
||||
"\u30a6\u30a4",
|
||||
"\u30a6\u30a4\uff08\u6c34\u7740\uff09",
|
||||
"\u30a6\u30bf\u30cf",
|
||||
"\u30a6\u30bf\u30cf\uff08\u5fdc\u63f4\u56e3\uff09",
|
||||
"\u30a8\u30a4\u30df",
|
||||
"\u30a8\u30a4\u30df\uff08\u6c34\u7740\uff09",
|
||||
"\u30ab\u30a8\u30c7",
|
||||
"\u30ab\u30b9\u30df",
|
||||
"\u30ab\u30ba\u30b5",
|
||||
"\u30ab\u30db",
|
||||
"\u30ab\u30e8\u30b3",
|
||||
"\u30ab\u30e8\u30b3\uff08\u6b63\u6708\uff09",
|
||||
"\u30ab\u30ea\u30f3",
|
||||
"\u30ab\u30ea\u30f3\n\uff08\u30d0\u30cb\u30fc\u30ac\u30fc\u30eb\uff09",
|
||||
"\u30ab\u30f3\u30ca",
|
||||
"\u30ad\u30ad\u30e7\u30a6",
|
||||
"\u30ad\u30ea\u30ce",
|
||||
"\u30b3\u30b3\u30ca",
|
||||
"\u30b3\u30bf\u30de",
|
||||
"\u30b3\u30c8\u30ea",
|
||||
"\u30b3\u30c8\u30ea\uff08\u5fdc\u63f4\u56e3\uff09",
|
||||
"\u30b3\u30cf\u30eb",
|
||||
"\u30b3\u30cf\u30eb\uff08\u6c34\u7740\uff09",
|
||||
"\u30b3\u30e6\u30ad",
|
||||
"\u30b5\u30aa\u30ea",
|
||||
"\u30b5\u30ad",
|
||||
"\u30b5\u30ad\uff08\u6c34\u7740\uff09",
|
||||
"\u30b5\u30af\u30e9\u30b3",
|
||||
"\u30b5\u30e4",
|
||||
"\u30b5\u30e4\uff08\u79c1\u670d\uff09",
|
||||
"\u30b7\u30b0\u30ec",
|
||||
"\u30b7\u30b0\u30ec\uff08\u6e29\u6cc9\uff09",
|
||||
"\u30b7\u30ba\u30b3",
|
||||
"\u30b7\u30ba\u30b3\uff08\u6c34\u7740\uff09",
|
||||
"\u30b7\u30df\u30b3",
|
||||
"\u30b7\u30e5\u30f3",
|
||||
"\u30b7\u30e5\u30f3\uff08\u5e7c\u5973\uff09",
|
||||
"\u30b7\u30ed\u30b3",
|
||||
"\u30b7\u30ed\u30b3\n\uff08\u30e9\u30a4\u30c7\u30a3\u30f3\u30b0\uff09",
|
||||
"\u30b7\u30ed\u30b3\uff08\u6c34\u7740\uff09",
|
||||
"\u30b8\u30e5\u30ea",
|
||||
"\u30b8\u30e5\u30f3\u30b3",
|
||||
"\u30b8\u30e5\u30f3\u30b3\uff08\u6b63\u6708\uff09",
|
||||
"\u30b9\u30ba\u30df",
|
||||
"\u30b9\u30df\u30ec",
|
||||
"\u30bb\u30ca",
|
||||
"\u30bb\u30ea\u30ab",
|
||||
"\u30bb\u30ea\u30ab\uff08\u6b63\u6708\uff09",
|
||||
"\u30bb\u30ea\u30ca",
|
||||
"\u30bb\u30ea\u30ca\n\uff08\u30af\u30ea\u30b9\u30de\u30b9\uff09",
|
||||
"\u30c1\u30a7\u30ea\u30ce",
|
||||
"\u30c1\u30a7\u30ea\u30ce\uff08\u6e29\u6cc9\uff09",
|
||||
"\u30c1\u30bb",
|
||||
"\u30c1\u30bb\uff08\u6c34\u7740\uff09",
|
||||
"\u30c1\u30ca\u30c4",
|
||||
"\u30c1\u30ca\u30c4\uff08\u6e29\u6cc9\uff09",
|
||||
"\u30c1\u30d2\u30ed",
|
||||
"\u30c4\u30af\u30e8",
|
||||
"\u30c4\u30d0\u30ad",
|
||||
"\u30c4\u30eb\u30ae",
|
||||
"\u30c4\u30eb\u30ae\uff08\u6c34\u7740\uff09",
|
||||
"\u30c8\u30ad",
|
||||
"\u30c8\u30ad\n\uff08\u30d0\u30cb\u30fc\u30ac\u30fc\u30eb\uff09",
|
||||
"\u30c8\u30e2\u30a8",
|
||||
"\u30ca\u30ae\u30b5",
|
||||
"\u30ca\u30c4",
|
||||
"\u30cd\u30eb",
|
||||
"\u30cd\u30eb\n\uff08\u30d0\u30cb\u30fc\u30ac\u30fc\u30eb\uff09",
|
||||
"\u30ce\u30a2",
|
||||
"\u30ce\u30c9\u30ab",
|
||||
"\u30ce\u30c9\u30ab\uff08\u6e29\u6cc9\uff09",
|
||||
"\u30ce\u30ce\u30df",
|
||||
"\u30ce\u30ce\u30df\uff08\u6c34\u7740\uff09",
|
||||
"\u30cf\u30b9\u30df",
|
||||
"\u30cf\u30b9\u30df\uff08\u4f53\u64cd\u670d\uff09",
|
||||
"\u30cf\u30ca\u30a8",
|
||||
"\u30cf\u30ca\u30a8\n\uff08\u30af\u30ea\u30b9\u30de\u30b9\uff09",
|
||||
"\u30cf\u30ca\u30b3",
|
||||
"\u30cf\u30ca\u30b3\uff08\u6c34\u7740\uff09",
|
||||
"\u30cf\u30eb\u30ab",
|
||||
"\u30cf\u30eb\u30ab\uff08\u6b63\u6708\uff09",
|
||||
"\u30cf\u30eb\u30ca",
|
||||
"\u30cf\u30eb\u30ca\uff08\u4f53\u64cd\u670d\uff09",
|
||||
"\u30cf\u30eb\u30ca\uff08\u6b63\u6708\uff09",
|
||||
"\u30cf\u30ec",
|
||||
"\u30d2\u30ca",
|
||||
"\u30d2\u30ca\u30bf",
|
||||
"\u30d2\u30ca\u30bf\uff08\u6c34\u7740\uff09",
|
||||
"\u30d2\u30ca\uff08\u6c34\u7740\uff09",
|
||||
"\u30d2\u30d3\u30ad",
|
||||
"\u30d2\u30d3\u30ad\uff08\u5fdc\u63f4\u56e3\uff09",
|
||||
"\u30d2\u30d5\u30df",
|
||||
"\u30d2\u30d5\u30df\uff08\u6c34\u7740\uff09",
|
||||
"\u30d2\u30de\u30ea",
|
||||
"\u30d2\u30e8\u30ea",
|
||||
"\u30d5\u30a3\u30fc\u30ca",
|
||||
"\u30d5\u30a6\u30ab",
|
||||
"\u30d5\u30a6\u30ab\uff08\u6b63\u6708\uff09",
|
||||
"\u30d5\u30d6\u30ad",
|
||||
"\u30db\u30b7\u30ce",
|
||||
"\u30db\u30b7\u30ce\uff08\u6c34\u7740\uff09",
|
||||
"\u30de\u30ad",
|
||||
"\u30de\u30b7\u30ed",
|
||||
"\u30de\u30b7\u30ed\uff08\u6c34\u7740\uff09",
|
||||
"\u30de\u30ea\u30ca",
|
||||
"\u30de\u30ea\u30fc",
|
||||
"\u30de\u30ea\u30fc\uff08\u4f53\u64cd\u670d\uff09",
|
||||
"\u30df\u30ab",
|
||||
"\u30df\u30b5\u30ad",
|
||||
"\u30df\u30c1\u30eb",
|
||||
"\u30df\u30c9\u30ea",
|
||||
"\u30df\u30ca",
|
||||
"\u30df\u30cd",
|
||||
"\u30df\u30ce\u30ea",
|
||||
"\u30df\u30e2\u30ea",
|
||||
"\u30df\u30e2\u30ea\uff08\u6c34\u7740\uff09",
|
||||
"\u30df\u30e4\u30b3",
|
||||
"\u30df\u30e4\u30b3\uff08\u6c34\u7740\uff09",
|
||||
"\u30df\u30e6",
|
||||
"\u30df\u30e6\uff08\u6c34\u7740\uff09",
|
||||
"\u30e0\u30c4\u30ad",
|
||||
"\u30e0\u30c4\u30ad\uff08\u6b63\u6708\uff09",
|
||||
"\u30e1\u30b0",
|
||||
"\u30e1\u30eb",
|
||||
"\u30e2\u30a8",
|
||||
"\u30e2\u30df\u30b8",
|
||||
"\u30e2\u30e2\u30a4",
|
||||
"\u30e6\u30a6\u30ab",
|
||||
"\u30e6\u30a6\u30ab\uff08\u4f53\u64cd\u670d\uff09",
|
||||
"\u30e6\u30ab\u30ea",
|
||||
"\u30e6\u30ba",
|
||||
"\u30e6\u30ba\uff08\u30e1\u30a4\u30c9\uff09",
|
||||
"\u30e8\u30b7\u30df",
|
||||
"\u30eb\u30df",
|
||||
"\u30ec\u30a4\u30b5",
|
||||
"\u30ec\u30f3\u30b2",
|
||||
"\u30ef\u30ab\u30e2",
|
||||
"\u30ef\u30ab\u30e2\uff08\u6c34\u7740\uff09",
|
||||
"\u4f50\u5929\u6d99\u5b50",
|
||||
"\u521d\u97f3\u30df\u30af",
|
||||
"\u5fa1\u5742\u7f8e\u7434",
|
||||
"\u98df\u8702\u64cd\u7948"
|
||||
]
|
||||
@@ -11,10 +11,6 @@ class ArisuAutoSweeper(AzurLaneAutoScript):
|
||||
from tasks.login.login import Login
|
||||
Login(self.config, device=self.device).app_start()
|
||||
|
||||
def stop(self):
|
||||
from tasks.login.login import Login
|
||||
Login(self.config, device=self.device).app_stop()
|
||||
|
||||
def goto_main(self):
|
||||
from tasks.login.login import Login
|
||||
from tasks.base.ui import UI
|
||||
@@ -60,24 +56,16 @@ class ArisuAutoSweeper(AzurLaneAutoScript):
|
||||
|
||||
def momotalk(self):
|
||||
from tasks.momotalk.momotalk import MomoTalk
|
||||
MomoTalk(config=self.config, device=self.device, task="Momotalk").run()
|
||||
MomoTalk(config=self.config, device=self.device).run()
|
||||
|
||||
def mission(self):
|
||||
from tasks.mission.mission import Mission
|
||||
Mission(config=self.config, device=self.device).run()
|
||||
|
||||
def schedule(self):
|
||||
from tasks.schedule.schedule import Schedule
|
||||
Schedule(config=self.config, device=self.device).run()
|
||||
|
||||
def data_update(self):
|
||||
from tasks.item.data_update import DataUpdate
|
||||
DataUpdate(config=self.config, device=self.device).run()
|
||||
|
||||
def benchmark(self):
|
||||
from module.daemon.benchmark import run_benchmark
|
||||
run_benchmark(config=self.config)
|
||||
|
||||
if __name__ == '__main__':
|
||||
aas = ArisuAutoSweeper('aas')
|
||||
aas.loop()
|
||||
|
||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.7 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
@@ -315,16 +315,6 @@ pre.rich-traceback-code {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.anim-rotate {
|
||||
animation: rotate-keyframes 0.4s linear infinite
|
||||
}
|
||||
|
||||
@keyframes rotate-keyframes {
|
||||
100% {
|
||||
transform: rotate(360deg)
|
||||
}
|
||||
}
|
||||
|
||||
#pywebio-scope-contents {
|
||||
margin-top: 0;
|
||||
overflow-y: auto;
|
||||
@@ -387,7 +377,6 @@ pre.rich-traceback-code {
|
||||
#pywebio-scope-scheduler-bar,
|
||||
#pywebio-scope-log-bar,
|
||||
#pywebio-scope-log,
|
||||
#pywebio-scope-daemon-log-bar,
|
||||
#pywebio-scope-daemon-overview #pywebio-scope-groups {
|
||||
font-weight: 500;
|
||||
margin: 0.3125rem;
|
||||
@@ -418,13 +407,13 @@ pre.rich-traceback-code {
|
||||
#pywebio-scope-dashboard > i {
|
||||
flex-grow: 1;
|
||||
align-self: flex-end;
|
||||
width: 9.5rem;
|
||||
width: 10rem;
|
||||
}
|
||||
|
||||
[id^="pywebio-scope-dashboard-row-"] {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
width: 9.5rem;
|
||||
width: 10rem;
|
||||
}
|
||||
|
||||
.dashboard-icon {
|
||||
@@ -446,26 +435,16 @@ pre.rich-traceback-code {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
*[style*="--dashboard-bold--"] {
|
||||
font-size: 1rem;
|
||||
font-weight: bold;
|
||||
color: #7a77bb;
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
[id^="pywebio-scope-dashboard-row-"] p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
[id^="pywebio-scope-dashboard-value-"] {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
align-items: flex-end;
|
||||
height: 1.5rem;
|
||||
}
|
||||
|
||||
[id^="pywebio-scope-arg_stored-stored-value-"] p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#pywebio-scope-log {
|
||||
line-height: 1.2;
|
||||
@@ -570,19 +549,19 @@ pre.rich-traceback-code {
|
||||
padding-right: .25rem;
|
||||
}
|
||||
|
||||
*[style*="--loading-grow--"] > div {
|
||||
*[style*="--loading-grow--"] {
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
}
|
||||
|
||||
*[style*="--loading-border--"] > div {
|
||||
*[style*="--loading-border--"] {
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
border: .2em solid currentColor;
|
||||
border-right-color: transparent;
|
||||
}
|
||||
|
||||
*[style*="--loading-border-fill--"] > div {
|
||||
*[style*="--loading-border-fill--"] {
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
border: .2em solid currentColor;
|
||||
|
||||
@@ -63,18 +63,18 @@ select {
|
||||
background-image: url("data:image/png;base64,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");
|
||||
}
|
||||
|
||||
select.state {
|
||||
.state > select {
|
||||
border-bottom: 0;
|
||||
background-image: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
select.state-bold {
|
||||
.state-bold > select {
|
||||
font-weight: bold;
|
||||
color: #7a77bb;
|
||||
}
|
||||
|
||||
select.state-light {
|
||||
.state-light > select {
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
@@ -133,13 +133,12 @@ pre.rich-traceback-code {
|
||||
color: #c9d1d9;
|
||||
}
|
||||
|
||||
#pywebio-scope-running,
|
||||
#pywebio-scope-pending,
|
||||
#pywebio-scope-waiting,
|
||||
#pywebio-scope-scheduler-bar,
|
||||
#pywebio-scope-log-bar,
|
||||
#pywebio-scope-log,
|
||||
#pywebio-scope-daemon-log-bar,
|
||||
#pywebio-scope-running,
|
||||
#pywebio-scope-pending,
|
||||
#pywebio-scope-waiting,
|
||||
#pywebio-scope-daemon-overview #pywebio-scope-groups {
|
||||
background-color: #2f3136;
|
||||
border: 1px solid #21262d;
|
||||
|
||||
@@ -64,18 +64,18 @@ select {
|
||||
background-image: url("data:image/png;base64,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");
|
||||
}
|
||||
|
||||
select.state {
|
||||
.state > select {
|
||||
border-bottom: 0;
|
||||
background-image: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
select.state-bold {
|
||||
.state-bold > select {
|
||||
font-weight: bold;
|
||||
color: #7a77bb;
|
||||
}
|
||||
|
||||
select.state-light {
|
||||
.state-light > select {
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
@@ -133,13 +133,12 @@ pre.rich-traceback-code {
|
||||
border: 1px solid lightgrey;
|
||||
}
|
||||
|
||||
#pywebio-scope-running,
|
||||
#pywebio-scope-pending,
|
||||
#pywebio-scope-waiting,
|
||||
#pywebio-scope-scheduler-bar,
|
||||
#pywebio-scope-log-bar,
|
||||
#pywebio-scope-log,
|
||||
#pywebio-scope-daemon-log-bar,
|
||||
#pywebio-scope-running,
|
||||
#pywebio-scope-pending,
|
||||
#pywebio-scope-waiting,
|
||||
#pywebio-scope-daemon-overview #pywebio-scope-groups {
|
||||
background-color: white;
|
||||
border: 1px solid lightgrey;
|
||||
|
||||
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 12 KiB |