Moving from Dooit V2 to V3
First of all, thanks you so much if you've been using dooit already. Really means a lot to me!
How to migrate?
Since I've rewrote the app from scratch, every single thing is pretty much changed but in a good way.
You still have almost everything (dont worry, the replacements are sane) from v2 + extra on top of that ⭐
There are two steps to migrate from v2:
Migrating Data
Run this in the terminal and it should be taken care of:
You'll also be prompted for this if not already done
dooit migrate
Migrating Config
This requires a bit more work but completly an easy process.
Below, I'll split parts of it and provide you with newer format
Let's start
Colors
💡 TIP
Check out Theme
for more info
Old
dark_black = "#252a34"
black = "#2e3440"
white = "#e5e9f0"
grey = "#d8dee9"
red = "#bf616a"
frost_green = "#8fbcbb"
cyan = "#88c0d0"
green = "#a3be8c"
yellow = "#ebcb8b"
blue = "#81a1c1"
magenta = "#b48ead"
orange = "#d08770"
New
Dooit now has a dedicated theme api for colors so that the colors will match properly with everything
from dooit.ui.api import DooitAPI, subscribe
from dooit.ui.api.events import Startup
@subscribe(Startup)
def foo(api: DooitAPI, _):
theme = api.vars.theme
Dashboard
💡 TIP
Check out Dashboard
for more info
❕ NOTE
I have removed the ascii dashboard section from old config since it takes too much lines of code For that please check out Dashboard
section and Sample configs from Dooit Extras
Dashboard hasn't changed much, just that you call a different function to set it + now you have better color support
Old
ART = "some ascii art"
NL = " \n"
SEP = colored("─" * 60, "d " + grey) # some function to color
help_message = f"Press {colored('?', magenta)} to spawn help menu"
DASHBOARD = [ART, NL, SEP, NL, NL, NL, help_message]
New
from dooit.ui.api import DooitAPI, subscribe
from dooit.ui.api.events import Startup
from rich.text import Text
@subscribe(Startup)
def dashboard_setup(api: DooitAPI, _):
def colored(text, color):
return Text(text, style = color).markup
theme = api.vars.theme
ART = "some ascii art"
NL = " \n"
SEP = Text("─" * 60, "d " + theme.background3)
help_message = f"Press {colored('?', magenta)} to spawn help menu"
DASHBOARD = [ART, NL, SEP, NL, NL, NL, help_message]
api.dashboard.set(DASHBOARD)
Bar
💡 TIP
Check out Bar
for more info
❕ NOTE
The function get_message
is now of no use hence removed.
Dooit will now flash any kind of messages covering the whole bar
Old
def get_status(status):
return colored(f" {status} ", "r " + blue)
def get_message(message):
return " " + message
def get_clock() -> Text:
return Text(f"{datetime.now().time().strftime(' %X ')}", "r " + cyan)
def get_username():
try:
username = os.getlogin()
except OSError:
uid = os.getuid()
import pwd
username = pwd.getpwuid(uid).pw_name
return Text(f" {username} ", "r " + blue)
bar = {
"A": [(get_status, 0.1)],
"C": [(get_clock, 1), (get_username)],
}
New
Most of the common widgets that you might wanna have should already be in dooit-extras
If you still want to have custom functions, check out Custom
widget and use the above functions like that
from dooit_extras.bar_widgets import Mode, Spacer, Clock, Date
from dooit.ui.api.events import subscribe, Startup
from dooit.ui.api import DooitAPI, subscribe
@subscribe(Startup)
def setup(api: DooitAPI, _):
theme = api.vars.theme
api.bar.set(
[
Mode(api),
Spacer(api, width = 0),
Clock(api, fmt=" {} ", bg=theme.yellow),
Spacer(api, width = 1),
Date(api, fmt = " {} ")
]
)
Layout
💡 TIP
Check out Layouts
for more info
Dooit now provides a layout api to order your columns
Old
COLUMN_ORDER = ["description", "due", "urgency"] # order of columns
New
from dooit.ui.api.widgets import TodoWidget, WorkspaceWidget
@subscribe(Startup)
def layout_setup(api: DooitAPI, _):
api.layouts.workspace_layout = [WorkspaceWidget.description]
api.layouts.todo_layout = [
TodoWidget.status,
TodoWidget.description,
TodoWidget.recurrence,
TodoWidget.due,
TodoWidget.urgency,
]
Formatting
💡 TIP
Check out Formatters
for more info
Formatting for workspaces and todos is now even more customizable!
You can use dooit formatters to custom format your items 😄
Plus, some general settings from the old config as well
Old
#################################
# WORKSPACE #
#################################
WORKSPACE = {
"editing": cyan,
"pointer": ">",
"children_hint": "+", # "[{count}]", # vars: count
"start_expanded": False,
}
COLUMN_ORDER = ["description", "due", "urgency"] # order of columns
TODO = {
"color_todos": False,
"editing": cyan,
"pointer": ">",
"children_hint": colored(
" ({done}/{total})", green
), # vars: remaining, done, total
# "children_hint": "[b magenta]({remaining}!)[/b magenta]",
"due_icon": "? ",
"effort_icon": "+",
"effort_color": yellow,
"recurrence_icon": "!",
"recurrence_color": blue,
"tags_color": red,
"completed_icon": "x",
"pending_icon": "o",
"overdue_icon": "!",
"urgency1_icon": "A",
"urgency2_icon": "B",
"urgency3_icon": "C",
"urgency4_icon": "D",
"start_expanded": False,
"initial_urgency": 1,
"urgency1_color": "green",
"urgency2_color": "yellow",
"urgency3_color": "orange",
"urgency4_color": "red",
}
Keybindings
💡 TIP
Check out Keys
for more info
Keybidings now are much more easier to understand and implement + now you get support for custom keybindings executing some custom code
You can get a full list of available api functions here
Old
keybindings = {
"switch pane": "<tab>",
"sort menu toggle": "<ctrl+s>",
"start search": ["/", "S"],
"remove item": "xx",
"edit effort": "e",
"edit recurrence": "r",
}
New
@subscribe(Startup)
def key_setup(api: DooitAPI, _):
api.keys.set("j", api.move_down)
api.keys.set("k", api.move_up)
api.keys.set("i", api.edit_description)
api.keys.set("d", api.edit_due)
api.keys.set("r", api.edit_recurrence)
api.keys.set("a", api.add_sibling)
api.keys.set("z", api.toggle_expand)
api.keys.set("Z", api.toggle_expand_parent)
api.keys.set("gg", api.go_to_top)
api.keys.set("G", api.go_to_bottom)
api.keys.set("A", api.add_child_node)
api.keys.set("J", api.shift_down)
api.keys.set("K", api.shift_up)
api.keys.set("xx", api.remove_node)
api.keys.set("c", api.toggle_complete)
api.keys.set("=,+", api.increase_urgency)
api.keys.set("-,_", api.decrease_urgency)
api.keys.set("/", api.start_search)
api.keys.set("<ctrl+s>", api.start_sort)