コード例 #1
0
ファイル: mixer.py プロジェクト: antariandel/eliq
    def _set_fill(self) -> None:
        ''' Only Mixer must call this when toggling the fill. '''

        self.ml_scale.grid_forget()
        self.fill_label.grid(row=self.mixer.get_ingredient_grid_row(self), column=1)
        self.ml_entry.configure(state='readonly')

        try:
            self.ml.trace_vdelete('w', self._ml_traceid)
            del(self._ml_traceid)
        except (AttributeError, tk._tkinter.TclError):
            # not set
            pass

        try:
            self._fill_traceid
        except AttributeError:
            self._fill_traceid = self.ml_max.trace('w', lambda var, idx, op:
                self.ml.set(
                    int((self.mixer.get_bottle_volume() - sum([float_or_zero(ingr.ml.get())
                        for ingr in self.mixer._ingredient_list if ingr != self])) * 10) / 10
                ))
        
        self.mixer.update(self)
        set_icon(self.fill_button, icons['bottle-icon-filled'], compound=tk.NONE)
        self.fill_set = True
コード例 #2
0
 def OnInit(self):
     wx.InitAllImageHandlers()
     _theme()
     frame = dialogs.ImageInspectorFrame(None,
         size=dialogs.imageInspector.SIZE)
     images.set_icon(frame, 'inspector')
     frame.OpenImages(self.paths)
     frame.Show()
     self.SetTopWindow(frame)
     return 1
コード例 #3
0
 def __init__(self, actionlist, *args, **keyw):
     frame.Frame.__init__(self, *args, **keyw)
     _theme()
     self.dlg_library = None
     self.dirty = False
     self.EnableBackgroundPainting(self.empty)
     self._menu()
     self._toolBar()
     self._plugin()
     self.on_menu_file_new()
     images.set_icon(self, 'phatch')
     self._title()
     self._description()
     self._drop()
     self._set_size()
     self._events()
     self._pubsub()
     if actionlist.endswith(ct.EXTENSION):
         self._open(actionlist)
コード例 #4
0
ファイル: mixer.py プロジェクト: antariandel/eliq
    def _unset_fill(self) -> None:
        ''' Only Mixer must call this when toggling the fill. '''

        self.fill_label.grid_forget()
        self.ml_scale.grid(row=self.mixer.get_ingredient_grid_row(self), column=1, sticky=tk.EW)
        self.ml_entry.configure(state='normal')
    
        try:
            self.ml_max.trace_vdelete('w', self._fill_traceid)
            del(self._fill_traceid)
        except (AttributeError, tk._tkinter.TclError):
            # not set
            pass
        
        try:
            self._ml_traceid
        except AttributeError:
            self._ml_traceid = self.ml.trace('w', lambda var, idx, op:
                self.mixer.update(self))
        
        self.mixer.update(self)
        set_icon(self.fill_button, icons['bottle-icon-fill'], compound=tk.NONE)
        self.fill_set = False
コード例 #5
0
ファイル: mixer.py プロジェクト: antariandel/eliq
    def __init__(self, mixer: Mixer, liquid: fludo.Liquid, auto_add: bool = True):
        if not isinstance(mixer, Mixer):
            raise Exception('Mixer parameter not instance of Mixer class.')
        if not isinstance(liquid, fludo.Liquid):
            raise Exception('Liquid parameter not instance of fludo.Liquid class.')
        
        self.mixer = mixer
        self.liquid = liquid

        self.ml = tk.StringVar()
        self.ml.set(float(self.liquid.ml))
        self._ml_traceid = self.ml.trace('w', lambda var, idx, op:
            self.mixer.update(self))

        self.name = tk.StringVar()
        self.name.set(self.liquid.name)
        self.name_label = ttk.Label(self.mixer.frame.interior, textvariable=self.name)
        self.name_label_ttip = CreateToolTip(self.name_label,
            '%(pg)dPG/%(vg)dVG, Nic. %(nic).1f' % {
                'pg': self.liquid.pg,
                'vg': self.liquid.vg,
                'nic': self.liquid.nic})

        self.ml_scale = ttk.Scale(self.mixer.frame.interior, orient=tk.HORIZONTAL, length=250,
            to=mixer.get_bottle_volume(),
            variable=self.ml,
            command=lambda value:
                self.ml.set(round_digits(self.ml_scale.get(), 1)))
        self.ml_scale_ttip = CreateToolTip(self.ml_scale, 'Adjust amount')

        self.ml_max = tk.StringVar()
        self.ml_max_label = ttk.Label(self.mixer.frame.interior, textvariable=self.ml_max)
        self.ml_max_label_ttip = CreateToolTip(self.ml_max_label,
            'Max possible amount\nfor the ingredient.')

        self.ml_entry = ttk.Entry(self.mixer.frame.interior, width=7, textvariable=self.ml)
        # FloatValidator
        self.ml_entry_validator = self.ml_entry.register(self.validate_float_entry)

        # This function always returns the max volume possible for the ingredient, so that the
        # validator follows the changes in the max possible volume
        self.get_max_ml = lambda: self.ml_scale.cget('to')

        self.ml_entry.configure(validate='all',
            validatecommand=(self.ml_entry_validator, '%d', '%P', 'ml_entry', 0, 'get_max_ml'))
        
        # Shown instead of the scale if fill is selected for the component
        self.fill_label = ttk.Label(self.mixer.frame.interior, text='(will fill bottle)')

        self.fill_button = ttk.Button(self.mixer.frame.interior, width=32,
            command=lambda: self.mixer.toggle_fill(self))
        set_icon(self.fill_button, icons['bottle-icon-fill'], compound=tk.NONE)
        self.fill_button_ttip = CreateToolTip(self.fill_button, 'Fill bottle')

        self.edit_button = ttk.Button(self.mixer.frame.interior, width=32,
            command=lambda: self.show_editor_dialog())
        set_icon(self.edit_button, icons['edit-2'], compound=tk.NONE)
        self.edit_button_ttip = CreateToolTip(self.edit_button, 'Edit ingredient')

        self.destroy_button = ttk.Button(self.mixer.frame.interior, width=4,
            command=lambda: self.show_remove_dialog())
        set_icon(self.destroy_button, icons['minus'], compound=tk.NONE)
        self.destroy_button_ttip = CreateToolTip(self.destroy_button, 'Remove ingredient')

        grid_row_idx = self.mixer.get_last_grid_row()  # Grid row number within Mixer frame

        self.name_label.grid(
            row=grid_row_idx, column=0, padx=10, sticky=tk.E)
        self.ml_scale.grid(
            row=grid_row_idx, column=1, sticky=tk.EW)
        self.ml_max_label.grid(
            row=grid_row_idx, column=2, padx=17)
        self.fill_button.grid(
            row=grid_row_idx, column=3, padx=5)
        self.ml_entry.grid(
            row=grid_row_idx, column=4, padx=5)
        self.edit_button.grid(
            row=grid_row_idx, column=5, padx=5)
        self.destroy_button.grid(
            row=grid_row_idx, column=6, padx=14)
        
        self.fill_set = False
        self.editor_dialog = None
        self.remove_dialog = None

        # Add self to Mixer if auto_add is True.
        if auto_add:
            self.mixer.add_ingredient(self)
コード例 #6
0
ファイル: mixer.py プロジェクト: antariandel/eliq
    def __init__(self, parent: tk.Widget = None, mixture_name: str = DEFAULT_MIXTURE_NAME,
            save_callback: types.FunctionType = None, save_callback_args: list = [],
            discard_callback: types.FunctionType = None, discard_callback_args: list = []):

        if parent is None:
            # assume that we need to be Tk root
            self.parent = None
            self.toplevel = tk.Tk()
        else:
            self.parent = parent
            self.toplevel = tk.Toplevel(self.parent)
        self.root = self.toplevel.nametowidget('.')

        self.toplevel.withdraw()
        
        self.name = tk.StringVar()
        self.name.set(mixture_name)

        self.toplevel.title('Eliq | Liquid Mixer')
        self.toplevel.iconbitmap(icons['titlebar'])
        self.toplevel.minsize(0, 280)
        self.toplevel.resizable(False, True)
        self.toplevel.grid_columnconfigure(0, weight=1)
        self.toplevel.grid_rowconfigure(3, weight=1)

        self.name_frame = ttk.Frame(self.toplevel)
        self.name_entry = ttk.Entry(self.name_frame, textvariable=self.name)
        self.name_entry.configure(font=('Arial', 19))
        self._name_entry_validator = self.name_entry.register(self.validate_name_entry)
        self.name_entry.configure(validate='all',
            validatecommand=(self._name_entry_validator, '%d', '%P'))
        self.name_entry.grid(row=0, column=0, padx=10, sticky=tk.EW)
        self.name_frame.grid_columnconfigure(0, weight=1)
        self.name_frame.grid(row=1, column=0, padx=10, pady=10, sticky=tk.EW)

        self.frame = VerticalScrolledFrame(self.toplevel)
        self.frame.interior.grid_columnconfigure(1, weight=1)
        self.frame.interior.grid_columnconfigure(2, minsize=80)
        self.frame.grid(row=3, column=0, sticky=tk.EW + tk.NS)

        self.labels_frame = ttk.Frame(self.toplevel)

        self.max_label = ttk.Label(self.labels_frame, text='Max. (ml)')
        self.max_label.grid(row=0, column=0, padx=5)
        self.labels_frame.columnconfigure(1, minsize=45)

        self.ml_label = ttk.Label(self.labels_frame, text='Vol. (ml)')
        self.ml_label.grid(row=0, column=2, padx=5)
        self.labels_frame.columnconfigure(3, minsize=118)

        self.statusbar_frame = ttk.Frame(self.toplevel)
        self.statusbar_frame.grid(row=999, column=0, sticky=tk.EW)
        self.statusbar_frame.grid_columnconfigure(2, weight=1)
        
        self.liquid_volume = tk.StringVar()
        self.total_label = ttk.Label(self.statusbar_frame, textvariable=self.liquid_volume)
        self.total_label.configure(font=('Arial', 11))
        self.total_label.grid(row=0, column=1, pady=2, sticky=tk.W)

        self.mixture_description = tk.StringVar()
        self.mixture_description_label = ttk.Label(self.statusbar_frame,
            textvariable=self.mixture_description)
        self.mixture_description_label.configure(font=('Arial', 11, 'bold'))
        self.mixture_description_label.grid(row=0, column=0, pady=3, padx=5, sticky=tk.W)

        self.start_label = ttk.Label(self.frame.interior,
            text='Add some ingredients to your mixture:')
        self.start_label.grid(row=998, column=0, columnspan=6, sticky=tk.E)

        self.add_button = ttk.Button(self.frame.interior, text='', width=4,
            command=self.show_add_ingredient_dialog)
        self.add_button_ttip = CreateToolTip(self.add_button, 'Add new ingredient to the mixture.')
        set_icon(self.add_button, icons['plus'], compound=tk.NONE)
        self.add_button.grid(row=998, column=6, padx=14, pady=3)
        self.toplevel.bind('<Control-Shift-A>', lambda event: self.show_add_ingredient_dialog())
        self.toplevel.bind('<Control-Shift-a>', lambda event: self.show_add_ingredient_dialog())

        self.button_frame = ttk.Frame(self.toplevel)
        self.button_frame.grid(row=0, column=0, columnspan=2, sticky=tk.EW)

        self.change_bottle_button = ttk.Button(self.button_frame, text='Resize Bottle',
            width=22, command=self.show_change_bottle_dialog)
        self.change_bottle_button_ttip = CreateToolTip(self.change_bottle_button,
            'Resize the bottle preserving ingredient proportions.')
        set_icon(self.change_bottle_button, icons['bottle-icon-resize'])
        self.change_bottle_button.grid(row=0, column=0)

        self.view_bottle_button = ttk.Button(self.button_frame, text='View Bottle', width=22,
            command=self.show_bottle_viewer)
        set_icon(self.view_bottle_button, icons['bottle-icon'])
        self.view_bottle_button.grid(row=0, column=1)
        
        self.add_notes_button = ttk.Button(self.button_frame, text='Add Notes', width=22,
            command=self.show_add_notes_dialog)
        set_icon(self.add_notes_button, icons['file'])
        self.add_notes_button.grid(row=0, column=2)

        self.save_button = ttk.Button(self.button_frame, text='Save & Close', width=22,
            command=lambda: self.close(True))
        set_icon(self.save_button, icons['save'])
        self.save_button.grid(row=0, column=3)

        self.discard_button = ttk.Button(self.button_frame, text='Discard & Close', width=22,
            command=self.show_discard_dialog)
        set_icon(self.discard_button, icons['x-square'])
        self.discard_button.grid(row=0, column=4)
 
        self.fill_set = False

        self._labels_shown = False
        self._ingredient_list = []
        self._bottle_vol = 100  # Default to 100ml
        self.total_cost = 0
        self.notes = DEFAULT_NOTES_CONTENT
        self.save_callback = save_callback
        self.save_callback_args = save_callback_args
        self.discard_callback = discard_callback
        self.discard_callback_args = discard_callback_args

        self.new_ingredient_dialog = None
        self.change_bottle_dialog = None
        self.add_notes_dialog = None
        self.discard_dialog = None

        self.bottle_viewer = None

        # center_toplevel(self.toplevel)
        # self.toplevel.lift()
        self.toplevel.deiconify()